Vim技能修炼教程(5) - 操作符实务

操作符实务

操作符复习

上次我们讲了操作符与文本对象的组合这样一个vim的强大功能。但是上节的知识点过于密集,可读性可能差了一点。不过没关系,重要的知识点在后面用到的时候我们可以先复习一下。

我们还是先复习操作符。上节说过了,vi的方式是{操作符}{次数}{移动命令},代表例子就是d2w,删除两个单词。
vim将其扩展成了文本对象,有aw, iw, as, is, ap, ip, a], a[, i[, i]等一系列。

我们举几个小例子说明文本对象的用法:
比如有这样一段代码:

void main(int argc,char* agrv[])

光标在括号内,我们输入"yi(",得到的是"int argc,char* agrv[]", 如果是"ya(",复制的将是"(int argc,char* agrv[])"
"i("与"a("的区别是,"a("会包含括号本身,而"i("不含括号内容。

再举个例子,我们用下搜索来定位:

    return 0;

我们要复制不带分号的"return 0",可以这么写『^yt;』

定制操作符

既然操作符这么有用,我们可以尝试来定制它。这个定制功能,叫做Operator-pending mapping.

首先我们可以定制文本对象,也就是移动的命令。

我们看一个简单的例子,比如用p来代表刚才我们用的"i(",因为"i("是两个字符,而且括号还是个组合键。

:onoremap p i(

使用onoremap而不是omap的原因,是为了防止map产生递归定义。

我们看一下官方文档中的例子:

onoremap <silent> F :<C-U>normal! 0f(hviw<CR>

<silent> F是按键。我们可以将其换成<leader> F或者直接是"ah("之类的。
<C-U>我们照抄就好,是为了防止Vim自动给我们自动添加些私货。
normal!后面我们还会学习,它是用于执行正常模式下的命令。

前面的都是例行公事,后面才是真正需要我们开发的命令组合:0f(hviw<CR>
0是移动到行首,还记得吧,如果要是移到行首非空字符是^。
"f("是向后搜索到第一个左括号,h是左移一个字符,viw是在visual模式下选中一个单词,<CR>会退出visual模式

综上,上面的命令就是选中一个左括号左边的一个完整单词。

但是,还有一个问题,normal!命令没法处理转义字符和特殊字符。如果遇到这种情况,我们需要用execute命令再把normal包装一下。
最简单的情况就是对于<cr>的处理。在搜索中,<cr>是经常需要的输入。但是,在normal命令中是不会处理<cr>为回车的,而是当成四个字符。
我们只好再加点料,把特殊字符字符串先传给execute命令:

onoremap <silent> F :<C-U>execute "normal! 0f(hviw<CR>"

execute命令是会处理特殊字符和转义的,当它执行 normal!的时候,后面的<cr>已经正确转义了。normal!就可以正确运行了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,273评论 19 139
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 100,268评论 9 468
  • 楊孜 我也许会醒过来 也许会一直睡下去 活着是为了等你 死亡也是为了等你 二零一六年七月十三日 山顶教堂
    楊孜阅读 1,576评论 0 0
  • 未来会怎样 你独自一人早已踏上行程 你微笑着告别我们 尽管满腹的辛酸与无奈 尽管我们无助地挽留和惊诧 不是说好了 ...
    安小左阅读 1,589评论 0 3
  • 每年十一月,就是美丽的云南普洱咖啡收获的季节。 今年,我们与云南欧密麦庄园合作,开展一期深入原产地的梦幻咖啡之旅。...
    Hilwe阅读 3,093评论 0 0

友情链接更多精彩内容