VIM使用系列:缩进调整、自动补全、折叠、跳转

柔情痞子 提交于 2019-12-11 20:00:29

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

缩进调整、自动补全、折叠、跳转这些vim操作都是一开始我也不会,在项目开发过程中熟悉掌握的,本文主要记录一下这些操作的命令,以及查找帮助,为分享也为备忘。

缩进调整

缩进调整的帮助查找命令: :help shift-left-right,或者直接help下面缩进调整的任意一个命令。缩进调整操作的执行与vim中的shiftwidth参数的值有关系,在前文的vimrc配置文件中,已经将shiftwidth设置为4,表示每一次缩进的宽度均为4个空格长,可以参照进行修改。

以下为常用的缩进快捷操作和命令:

  • 当前行向右缩进一次:操作 >> 或者输入命令 :>
  • 当前行向左缩进一次:操作 << 或者输入命令 :<
  • 从第m行起,到第n行止向右缩进一次: 输入命令 :m,n> 等价于命令 :m>(n-m+1)
  • 从第m行起,到第n行止向左缩进一次: 输入命令 :m,n< 等价于命令 :m<(n-m+1)
  • 从第m行起共n行向右缩进一次: 输入命令 :m>n 等价于命令 :m,m+n-1>
  • 从第m行起共n行向左缩进一次: 输入命令 :m<n 等价于命令 :m,m+n-1<

自动补全

在windows中使用SourceInsight工具编辑代码时,函数、变量的自动补全功能是很强大、很受欢迎的,可以大大地提高工作效率。在vim中也有一样的功能,也许没有那么方便,稍微需要增加一些按键(可能需要自己进行一点复杂的设置也可以实现SourceInsight的自动弹出),但是也足够使用了。

自动补全可以简单地分为两块:单词的自动补全 和 程序代码中符号、函数的自动补全,从本质上来说都是基于单词的补全,但是代码中的补全有其特殊性,主要是结构成员的补全这里。因此两者的操作命令也就稍有不同。

  • 单词自动补全:在inset模式下按如下组合键,ctrl+x ctrl+n 或者 ctrl+x ctrl+p

    或者直接按组合键ctrl+n 或 ctrl+p,前者将列出当前缓冲中符合的条件的词,而后者还将包括字典中的符合条件的词。查看详细帮助::help ^x^n

  • 代码自动补全:在inset模式下按如下组合键,ctrl+x ctrl+o,查看详细帮助: :help ^x^o

    代码的自动补全环境要求稍微复杂一点。

    首先,它使用的补全叫Omni Completion, 这里涉及到vim中变量omnifunc的设置,这进一步就涉及到文件类型的识别、关联。因此第一步是需要打开vim中的文件类型自动检测,在前面的vimrc配置文件中已经设置了,即: filetype on。vim中默认可以识别不少文件类型,如:C语言的源文件、java程序文件、html程序文件等等,也就会自动根据文件类型设置omnifunc的值。

    其次,omni补全需要使用tags文件中的信息来实现,而且最好是Exuberant Ctags工具(第一文中的ctags工具)生成的tags文件,因此第二步就是安装该工具,并使用它生成项目的tags文件(参考第二文中的项目脚本内容)。

    最后,omni补全因为使用tags中的信息实现,因此只能对代码中的全局变量、全局类型、函数、结构成员、类成员进行补全,而不能对代码中的局部变量进行补全,局部变量的补全使用上面的单词补全方式实现。

    补充:项目开发中都会使用很多的C标准函数、系统调用等,而包含这些函数的头文件并没有被包含在tags文件中,也就不会提示自动补全,为了提高效率实现更全面的自动补全,可以把标准函数、系统函数的tags补充到vim中,方法是先建立系统头文件的tags文件,然后添加到vimrc配置文件中,如下:

     <!-- lang: shell -->
     ctags -R -f ~/.vim/systags /usr/include /usr/local/include
    

    然后将 set tags+=~/.vim/systags 设置添加到第二文中的.vimrc配置文件中。这样不仅是补全更高效,而且也是跳转更全面。

  • 从补全列表中选择,向下移动:ctrl+n ,向上移动:ctrl+p,然后按任意键结束补全,注意这个键还是会被输入,所以好的选择是按空格键。

如果补全处于激活状态,可以用”CTRL-E“停止补全并回到原来录入的文字;用”CTRL-Y“可以停止补全,并接受当前所选的项目。

折叠

代码的折叠,可以方便掌控程序的主要逻辑,也便于代码的阅读、查找。使用折叠,首先要设置折叠方式,即设置vim中fdm(foldmethod的缩写)的值,在系列第二文的配置文件中已经将fdm设置为indent,即依据代码的缩进进行自动折叠。vim中有六种fdm可以设置,参考详细帮助: :help fold。常用的折叠打开、关闭操作如下:

  • 折叠代码: 快捷按键 zc
  • 递归折叠代码: 快捷按键 zC
  • 取消代码折叠: 快捷按键 zo
  • 递归取消折叠代码: 快捷按键 zO
  • 折叠文件中的所有代码: 快捷按键 zM
  • 取消文件中所有代码的折叠: 快捷按键 zR
  • 对第m行到第n行进行折叠: 打开折叠,使用命令: :m,nfoldopen, 关闭折叠,使用命令: :m,nfoldclose
  • 在折叠代码中的上下移动: 在打开的折叠中:[z ]z 在关闭的折叠中:zj zk (一试便知)

跳转

在SourceInsight中想要跳转到某个函数,只需要按住shift键,然后点击鼠标左键就可以了,在vim中同样很简单快速,直接按组合键ctrl_]就可以了,当然前提条件是已经生成了tags文件,并设置好了。查看详细的帮助::help ^]。

  • 跳转到函数、全局结构、全局变量等tag: 组合键 ctrl_]
  • 从tag处返回跳转的位置:组合键 ctrl_t
  • 跳转到全局变量处: 快捷键 gD
  • 跳转到局部变量处: 快捷键 gd
  • 返回到上一个操作位置(上一次光标位置): 组合键 ctrl_o
  • 返回到下一个操作位置(更新的光标位置): 组合键 ctrl_i

本来打算把quickfix的操作也放到本文的,但是写本文已经花了将近一个半小时了,那就放到系列的下一篇文章来写吧,刚好quickfix也是vim中与文本编辑、代码编辑关系不大的一部分,主要是涉及到代码的编译、调试,大大提高编译-改错-编译流程的效率,也算是vim的一大特色功能,所谓的剑不离手,我一直觉得在SourceInsight中不能直接进行编译是一大遗憾,这个遗憾在vim中得到了弥补,哈哈。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!