网友Karl问:
有时,我在VIM中想把一个单词替换成另一个单词,用yw,然后到要被替换的单词那里:dw 然后”0P,很多个步骤。yw,dw,”0P,这样子感觉按键多而且不顺手,请问你是怎么替换的?(:s/a/b这种要敲两个单词速度也不快)
我的回答见这个链接:https://blog.easwy.com/archives/an-article-about-how-to-write-vim-script/#comment-947。
Karl说用替换的方式,要敲两个单词,速度不会很快。其实,如果掌握了命令行补全功能,用替换命令的速度也不会慢。
例如,我们可以这样操作,首先移到到第一个单词处,使用“ayw把这个单词拷贝到a寄存区,然后把光标移动到第二个单词下,接着输入下面的命令:
:%s/<C-R>a/<C-R><C-W>/g
上面的命令使用了两个命令行补全功能,其中<C-R>a需要按住<CTRL>-R键,这时光标处会显示一个”,接下来再按a键,这个按键序列的功能是插入a寄存区所保存的内容,在我们的例子里,就是插入第一个单词;后面的<C-R><C-W>则是在命令行插入编辑区中光标下的单词,在我们的例子里,编辑区光标下的单词就是第二个单词。
如果要替换的个数比较多,使用上面的办法就比较好,可以用较少的按键完成替换功能,而且还不用担心输错单词。
命令行补全的帮助手册为:c_CTRL-R和c_CTRL-R_CTRL-W,我们可以看到,使用<C-R>系列命令,不仅可以插入各个暂存区中的内容、光标下的内容,你甚至可以使用一个表达式,来完成更复杂的工具,事实上,很多脚本中就在这样使用。
谢谢大哥回复,我跑去vim-user邮件列表里问里一把,一个老外说这样设置
set completeopt=longest,menuone
主要是menuone,然后就可以支持C语言了
@xyf
我所用的OmniCppComplete插件能够支持你所说的功能,不过我只用c++代码做了测试,不知道对c代码适不适用。
你看看我的这篇文章试验一下:
http://easwy.com/blog/archives/advanced-vim-skills-omin-complete/
请问大哥omni compete是对于C语言复杂的结构体不起作用如何处理?
比如我对于一个结构体指针变量后面输入->后按下CTRL+X CTRL+O弹出来一级成员,
成员里有其他结构体变量,选中结构体变量后在该变量名字后面的.再按CTRL+X CTRL+O,
这时弹出来的补全选择依然是前面结构体指针变量结构的一级成员列表。
这样就可以了:
map gw diw”0P