首先明确一些环境和一些术语说明:
我所使用的是Debian Linux上的vim7.3版本;
下面的配置中,<C
表示Ctrl
键,比如<C-v>
表示按住Ctrl
后按v
键;
下面的配置中,<M
表示Alt
键,比如<M-t>
表示按住Alt
后按t
键;
我在说明中提到的“前”,一般的意思是“右或者下”,“后”的意思一般是“左或者上”;
我提到的“字”一般表示一个英文字母或者一个汉字;
我提到的“词”表示一个英文单词,对于中文的话,被英文/标点符号等隔开的就算一个词而不是逻辑上的一个词语。
一、基本操作篇
这部分的内容,不需要使用额外的外挂和配置文件,事实上我觉得这也是使用Vim首先必须熟悉掌握的一些操作。
1.切换模式
1
| |
这些是切换模式的键,可以从在Linux的各种模式之间切换。
-
Esc C-c C-[
是从其他模式回到普通模式的操作,个人倾向Esc
,因为左手小拇指力量太小,总觉得不舒服,因人而异了 -
i/a
:在当前提示符前/后插入 -
I/A
:在vim中,大写的命令其实可以分为对相应的小写字母代表的命令的作用进行反向或者对整行作用,这里的I/A命令,就是作用与整行,也就是在行首/末插入 -
o/O
:在当前行下/上行插入 -
v/V/<C-v>
是进入可视模式的命令,大写V代表行选择,代表块选择
2.重复命令
1
| |
这两个是非常重要的命令.
-
.
是重复执行上一次的动作,[N]
代表一个数字,跟移动、编辑、选择命令一起使用,可以更加快速的进行以上操作。
3.移动命令
1
| |
这些是Vim中的移动命令,就是在Normal模式下定位光标位置。
-
j/ENTER
:移动到下一行,需要移动到下N行的话,参考下面的[N]
这一段。 -
k
:上一行 -
h/l
:左/右移一个字符
ps: 这里其实ENTER
命令基本不用,上下左右移动就用hjkl
即可,很多人刚开始用vim就是被这几个“别扭”的键操作给吓住,觉得很不适应,经常使用习惯之后,你就会觉得这样的设计是多么的优秀了,为了帮助新手抛弃方向键(就是画箭头的那四个键),我在下面的配置文件中进行了一点简单的配置禁用了方向键,这样可以加快新手熟悉Vim基本的键盘操作,但是这里先不提配置文件,在下面介绍到的时候,我会进行说明。 -
0 ^
, 这两个命令都是把光标移动到行首,有一点区别,^
是移动到本行的第一个可见字符,而0
是移到整行的行首。 -
$
:定位到行末 -
e/b
往前/后移一个词,e
命令移到到下个单词后会定位到单词的最后一个字符。 -
w
同样往前移到一个单词,移到到下个单词的第一个字符 -
f/F
是快速的移动,f我这里理解成find的意思,比如在this is a text line.
这样的一行文本中,假设现在光标所处的位置是a,那么我fn
,就会定位到line这个单词的n字符处,同理,F
就是逆向查找的意思了。 -
t
命令和f
差不多,不过上还是上个例子,如果用tn
的话,就会定位到line这个单词的i字母处,也就是需要查找的前一个字符处。 -
;
使用在上面的f/t
命令后,如果需要查找下一个字符,就使用;
。 -
gg/G
:跳到文件开始/末尾。 -
H/M/L
:跳到当前屏幕的顶部/中间/底部。 -
[[/]]
:移动到上/下一个段落,在C程序中,一般是上/下一个函数。 -
%
:用来跳到匹配的括号/引号等,甚至可以在对应的条件编译#if,#endif之间跳转。 -
:[N]
:跳到指定行号N的行。比如:67
就会跳到第67行。
移动命令中当然还要提到跳转命令m '
,其实也是移动命令
这两个命令是配合使用的,跳转命令,也可以叫做marks命令,就是在文件的某些位置做上标记然后方便以后回到这个位置继续编辑, 比如在文件的某个位置使用ma
, 然后在文件的另一个位置'a
之后就跳当刚才使用ma
记录的位置。
然而,最常使用的跳转命令是: -
‘[
跳到上一次被改变的文本的第一个字符 -
'.
跳到上一次文本被修改的地方 -
''
跳回上一次跳转的地方 -
'^
跳到插入模式最后一次结束的地方
这里提到的移动命令,很多可以和前面提到的重复命令[N]
一起使用,比如5j
表示向下移动5行,5w
表示向前移动5个单词等等。
4.编辑命令
1
| |
-
x/X
是删除当前光标下/光标前的一个字符。 -
d/c/y
是删除/修改/复制命令,之所以把这三个命令放在一组介绍是以为这三个命令都可以和前面介绍的移动跳转等命令一起使用,比如dd/yy
表示删除/复制一行,dw/cw/yw
是删除/修改/复制一个单词,d$/c$/y$
表示删除/修改/复制到行末,d^/y^
表示删除/复制到行首,当然,这些命令还可以和重复命令组合,比如5dd
表示删除5行,d/c/yfx
就是删除/修改/复制到字符x,以此类推,还可以这样使用的命令还有下面提到的v
命令。
灵活的组合前面介绍的这几个命令,在写代码的过程中使用起来非常方便,比如: -
df), yf), cf), vf)
从当前字符开始删除(复制,改变,选中),直到遇到=之后 -
di), yi), ci), vi)
删除(复制,修改,选择)括号内的内容 -
dt”, yt”, ct”, vt”
从当前字符开始删除(复制,改变,选中),直到遇到”之前 -
diw, yiw, ciw, viw
删除(复制,改变,选中)光标所在单词 -
da”, ya”, ca”, va”
删除(复制,改变,选中)””号内所有文本,包括引号本身
事实上删除命令,在vim中就是剪切命令的意思。 -
p/P
命令,这两个命令是粘贴的意思,分别表示在当前字符的前/后粘帖前面使用y/d复制或者剪切的内容。
当然,我们在使用的过程中,会遇到这样的问题,分别在两个地方删除内容,然后需要分别粘贴,这样的情况就需要用到"ayy "ap
这样的命令了,"ayy
是把当前行复制到名字为a的寄存器中,"ap
就是在这里粘帖a寄存器中的内容。
5.查找/替换
从这里开始,就要介绍一种Vim中的另一种模式:命令模式,在Normal模式下输入:
就可以进入命令模式,Esc
返回普通模式。
-
/
向前查找 -
?
向后查找 -
n
重做最后一次/或? -
N
反方向重做最后一次/或? -
\c
查找时忽略大小写 -
\C
查找时大小写相关 -
*
向前查找当前光标下的单词 -
#
反方向查找当前光标下的单词
这里,查找和替换都可以配合正则表达式来使用。
6.记录
1
| |
我理解的记录,也就是宏的意思。 q命令在使用过程中需要使用两次: 第一次表示开 始记录,第一次按下q之后还需要输入一个字符表示要把记录的宏存到哪个位置,第二次表示记录的结束。 q需要@配合使用。 @是读取指定寄存器中的操作记录,并将这些操作顺序 地重新执行一遍, 这里举一个例子说明,输入1到100的数:
1 2 3 4 5 6 7 8 | |
7.多标签
在编辑多个文件的时候,使用多标签可以方便的在不同文件之间切换。
-
:tabnew
新建tab -
:tabclose
关闭tab -
:tabedit {file}
新建tab,并在新创建的tab打开file -
gt
下一tab -
gT
上一tab
8.多窗口
如果屏幕够大的话,使用多个窗口来编辑文件要比多标签更舒服,比如我可以在写.c文件的时候在旁边用个窗口显示对应的.h文件的内容。
-
:sp {file}
横向切割窗口,并在新窗口打开file -
:vsp {file}
竖向切割窗口,并在新窗口打开file -
C-w w
命令在不同窗口之间切换,在后面的配置文件中,我会提到通过定义配置文件来更加方便的在多个窗口之间进行切换。
二、配置文件篇
这部分,是通过配置文件,对vim进行定制使得更加符合自己的编辑习惯,我的完整配置文件在这里,这里对其中的部分进行说明。
关于备份文件的配置
1 2 3 4 | |
搜索模式里面的一些配置
1 2 3 4 5 | |
有用的键盘绑定
关于多标签和多窗口编辑的键绑定
1 2 3 4 5 6 7 8 9 10 | |
F[N]键的绑定:
1 2 3 4 5 6 7 8 9 10 11 | |
禁用了方向键:
1 2 3 4 5 6 7 8 | |
autocmd
autocmd,就是vim根据判断文件格式自动执行的一些命令,具体关于autocmd的配置,可以参考我的完整配置文件,在配置文件中,对所有的配置都进行了注释,有了前面这些命令和配置介绍的基础,应该可以看明白并且根据自己的需要进行修改。
三、插件介绍篇
使用vim,就免不了用到一些外挂来增强功能,我使用vim主要是在Linux下编辑C、Makefile、Markdown等文件,因此我用到的插件列表是这些 这里对其中的部分插件进行介绍
1.Vundle
首先必须介绍的是Vundle插件,没有用这个插件之前,管理vim的插件是一件很头疼的事情,特别是安装了某个插件但是试用后觉得不好用然后要删除那个插件的时候,总是很麻烦,经过搜索,终于让我找到了Vundle(Google又立功了), 当然使用vundle插件你的系统中必须有git环境,关于git我打算改天写篇专门的笔记来记录学习Git进行版本控制时总结的一些知识,事实上关于Git,网络上已经有很多很好的资料介绍了。
安装&配置:
1
| |
然后在vimrc中添加如下内容:
1 2 3 4 5 | |
使用:
先在vimrc
中添加需要安装的插件比如:Bundle 'a.vim'
, 然后:BundleInstall
就可以安装插件。
在vimrc
中移除添加的插件,然后:BundleClean
就可以删除对应的插件,下面介绍到的插件都使用这种方式安装。
2.SnipMate&SuperTab-continued
这组插件用来自动补全一些内容,在写代码的时候非常方便使用。 使用:输入某些文本(在snipmate插件中进行定义)内容后,按tab
就可以补全,比如在C语言代码文件中可以补全的有main, if, inc, Inc, for等等。
3.DoxygenToolkit&The-NERD-Commenter
这一组插件来给代码文件添加注释。
配置:
1 2 3 4 5 6 7 8 9 10 | |
使用:
在函数名称上面,df
为改函数添加函数头注释
,da
可以添加文件头,其中的信息在上面的配置文件中修改
,cc
注释当前行
,cs
更性感的方式注释代码区域
,cu
取消注释
,cA
在不同的注释风格之间切换
4.repeat.vim&surround.vim
这一组插件用来重复一些操作,是.
命令的加强版,具体的使用可以查看各自插件的文档,都有很详细的例子。
5.vim-powerline
非常漂亮的状态栏定制插件,安装即可.
6.transpose-words
可以实现类似Emacs中M-t
那样交换单词的插件。
使用方法:比如在类似a = b
这样的文本的任意位置按M-t
就可以修改为b = a
.
上面这些配置和插件,是我在使用Vim过程中总结的一点知识,记录在这里方便遗忘的时候查阅也供同样跟我一样刚开始学习Vim的朋友们参考。
ctags插件:转载自http://www.vimer.cn/2009/10/%E5%9C%A8vim%E4%B8%AD%E4%BD%BF%E7%94%A8ctags.html
如何在Vim中使用ctags?之前在《把Vim打造成真正的IDE》系列里已经讲过大致的ctags在vim中的使用,这篇文章我们就详细的讲一下。
首先要明白,ctags是什么?
官方的解释是:
产生标记文件以帮助在源文件中定位对象。
其生成的标记文件tags中包括这些对象的列表:
用#define定义的宏
枚举型变量的值
函数的定义、原型和声明
名字空间(namespace)
类型定义(typedefs)
变量(包括定义和声明)
类(class)、结构(struct)、枚举类型(enum)和联合(union)
类、结构和联合中成员变量或函数
那么我们用怎样的参数来使ctags正常的生成我们需要的tags文件呢?在这里我们就不去挨个学习那些枯燥的参数了,直接参看 omnicppcomplete 提供的ctags生成语句:
ctags -R –c++-kinds=+px –fields=+iaS –extra=+q .
每个参数解释如下:
-R:ctags循环生成子目录的tags
–c++-kinds=+px :ctags记录c++文件中的函数声明和各种外部和前向声明
–fields=+iaS :ctags要求描述的信息,其中i表示如果有继承,则标识出父类;a表示如果元素是类成员的话,要标明其调用权限(即是public还是private);S表示如果是函数,则标识函数的signature。
–extra=+q:强制要求ctags做如下操作—如果某个语法元素是类的一个成员,ctags默认会给其记录一行,可以要求ctags对同一个语法元素再记一行,这样可以保证在VIM中多个同名函数可以通过路径不同来区分。
OK,那么tags文件就生成好啦,利用这个文件我们可以做很多强大的事情,包括前面用过的插件,omnicppcomplete、taglist、showfunc之类的,都是依赖于它的。
那么除了插件上的作用外,我们用户在vim里面怎么使用他呢?
其实最简单的就是:
把光标移动到某个元素上,CTRL+],就会跳转到对应的定义啦。CTRL+o可以回退到原来的地方。
还有一个操作经常被人忽略,就是,如果当前光标下是个局部变量,在VIM里输入gd的话,就会跳到这个局部变量的定义处,也是非常方便滴~~
另外,tags必须在vim运行的当前目录,才能在vim里面正确跳转,当然也不是没有办法解决:
set tags+=tags的文件路径
不过如果像我前面文章说的那样定义了F12来快速生成tags的话( 快速连接 ),也不会经常用到更改路径吧,哈哈。
顺便说一句,tags生成路径最好不要包含中文哦~~
OK,在Vim中使用ctags就到这里,下次我们会一起看看据说ctags的升级替代品,cscope~
另附 ctags官方下载地址 ,目前最新版本为5.8
后记:
在用-R直接生成的tags的时候,如果无关的文件太多,tags生成的会非常而且慢,比如cocos2d-x的项目。
解决的方法比较简单,参考了cscope生成 cscope.files的思路:
这样生成的速度就会快很多啦