- Mac OSX 下安装 gvim
- 基本设置
- vim 对单个字符的操作
- vim 对单字的操作
- vim 对整行的操作
- vim 对单个文件的浏览
- vim 替换文本
- vim 对多个文件的操作
- vim 寄存器
- vim 分屏功能
- vim 插件安装
- vim 浏览代码
Vim
是一个学习成本比较高的编辑器。本文主要记录对于编辑浏览代码时,如何配置vim
才能更高效的编辑、浏览代码。
Mac OSX 下安装 gvim
1
|
|
基本设置
配置信息都放到了~/.vimrc
文件中:
显示行号,在.vimrc
中添加set nu
开启文件类型侦测, filetype on
根据侦测到的不同类型加载对应的插件, filetype plugin on
开启实时搜索功能,
vim 对单个字符的操作
To err is human. To really foul up you need a computer.
删除某个字符
删除字符命令非常简单,就是单个字符x
,例如上面的一行code,如果将光标至于really
的r
处执行x
命令,就会将 r
删除。
替换某个字符
替换字符的命令rx
将光标下的字符 replace 成字符x
。如果发现连个相邻的字符颠倒了,可以直接在前一个字符处执行xp
命令即可,其中的x
时删除光标下的字符,p
时黏贴。
移动到某个字符
fx
命令在一行中向前搜索单个字符x
。速记:f
此处是Find
的简写。
例如,你现在处于上面 code 的开头处,假设你想将光标移动到human
中的h
字符处。此时你只需要简单的执行fh
,光标将会跳转到h
:
To err is human. To really foul up you need a computer. ~
---------->--------------->
fh fy
上面命令也显示了fy
移动光标到really
的y
处。当然,此时你也可以在命令前添加执行次数,可以用3fl
命令跳转光标到foult
的l
处:
To err is human. To really foul up you need a computer. ~
--------------------->
3fl
与f
相对应的F
命令会向左搜索:
To err is human. To really foul up you need a computer. ~
<---------------------
Fh
除了fx
命令用于搜索一行中的某个特定字符外,还有tx
命令,tx
命令会停在搜索的字符x
前。速记:t
时To
的简写。与Fx
相对应的是Tx
。
To err is human. To really foul up you need a computer. ~
<------------ ------------->
Th tn
fx
Fx
tx
Tx
这四个命令可以用;
命令重复,,
向相反的方向执行。
上面的移动命令虽然很好用,但有如果一行中存在多个我们想要查找的字符,我们要么人肉看一下搜索的字符位于第几个位置,要么要一直重复执行相同的移动命令。非常影响思维连贯性。例如想要从上面一行的开头找到computer
中的o
。
此时我们可以借助插件来完成,easymotion
即可帮助我们,它会把所有满足条件的位置用[A-Za-z]间的标签字符标出来,找到你想要去的位置再键入对应标签字符即可快速到达。
比如,上面的例子,假设关闭在行首,我只需要键入
vim 对单字的操作
删除某个单字
删除某个单字非常简单,只需要在单字的开始执行dw
即可。速记:d
是deleate
的简写。
修改某个单字
修改某个单字时,只需要在单字的开始执行cxxxxx
即可,c
是change
的简写,xxxxx
即代表要修改的单字。
移动到某个单字
想要移动光标大下一个单字,使用w
命令。跟很多vim
命令一样,可以在命令前添加一个执行次数。比如,3w
就是移动 3 个单字。下面展示它是如何工作的:
This is a line with example text ~
--->-->->----------------->
w w w 3w
注意,w
命令会移动到下一个单字的起始处。
b
命令向前移动到前一个单字的起始处。
This is a line with example text ~
<----<--<-<---------<---
b b b 2b b
与w
b
对应的有e
和ge
命令分别向后和向前移动到单字的末尾:
This is a line with example text ~
<- <--- -----> ---->
ge ge e e
如果光标位于一行的最后一个单字,w
命令会带你到下一行的第一个单字处。因此你可以使用w
命令来在一行中移动。
vim 对整行的操作
移动到行首或行尾
$
命令移动光标到一行的结尾,与<End>
键作用相同。^
命令移动到一行的第一个非空白字符处。0
命令移动到一行的最前面第一个字符处,与<Home>
键作用相同。
^
<------------
.....This is a line with example text ~
<----------------- --------------->
0 $
(….指空白符)
移动到指定行
C/C++ 程序员应该经常能遇到程序出错时,会有类似如下的提示信息:
prog.c:33: j undeclared (first use in this function) ~
这就提示我们该跳转到 33 行 fix 掉错误,此时可以使用G
命令:33G
即可跳转到 33 行。
另一种方法是在shell
命令行下执行:33<Enter>
。
上面的两种方法都是假设你想要移动到某个特定的行,而不管该行是否可见。假如你想要移动到屏幕的中间或者起始行时,该如何操作呢?
+---------------------------+
H --> | text sample text |
| sample text |
| text sample text |
| sample text |
M --> | text sample text |
| sample text |
| text sample text |
| sample text |
L --> | text sample text |
+---------------------------+
速记:H
是Home
的简写,M
是Middle
的简写,L
是Last
的简写。
使用标签记录并跳转到某行
在介绍标签之前,先了解另外两个命令CTRL-O
和CTRL-I
,其中CTRL-O
是回到之前的位置,CTRL-I
是回到下一个位置。例如:
| example text ^ |
33G | example text | CTRL-O | CTRL-I
| example text | |
V line 33 text ^ V
| example text | |
/^The | example text | CTRL-O | CTRL-I
V There you are | V
example text
注意:CTRL-I 是和
vim
可以使你定义自己的标签。命令ma
标记当前光标所在的位置。`{mark} 和 ‘{mark}都可以跳回到标签处。不同的是`{mark} 跳回的是光标所在行的原来那一列,’{mark}跳回的是光标所在哪一行的起始位置。
vim 对单个文件的浏览
vim 滚动屏幕命令
CTRL-U
和CTRL-D
命令向上或向下滚动半个屏幕。
CTRL-E
和CTRL-Y
分别向上和向下滚动一行。
CTRL-F
和CTRL-B
分别向前和向后滚动整个屏幕。
有时当执行多个j
命令时,光标会在屏幕的最底部,此时如果想让光标所在行位于中间位置,可以使用zz
命令,zt
命令将光标所在行至于顶部,zb
命令将光标所在行至于底部。
vim 切分窗口
切分新窗口最简单的命令是:split
,该命令可以使我们在两个窗口中查看同一个文件,比如可以使用第一个窗口显示变量声明,另一个窗口展示该变量的使用。
CTRL-W w
命令可用于两个窗口间的跳转。垂直切分窗口命令是:vsplitw
。窗口直接的切换命令如下:
CTRL-W h move to the window on the left
CTRL-W j move to the window below
CTRL-W k move to the window above
CTRL-W l move to the window on the right
CTRL-W t move to the TOP window
CTRL-W b move to the BOTTOM window
vim 替换文本
简单替换表达式:[range]s/from/to/[flags]
- range:搜索范围,如果没有指定范围,则作用于当前行。
:1,10s/from/to/
表示在第 1 到第 10 行(包含第 1,第 10 行)之间搜索替换。:10s/from/to/
表示只在第 10 行搜索替换。:%s/from/to/
表示在所有行中搜索替换。1,$s/from/to/
同上。
flags
有如下四个选项:
c
confirm,每次替换前询问。e
error,不显示错误。g
globe,不询问,整行替换。如果不加g
选项,则只替换每行的第一个匹配到的字符串。i
ignore,忽略大小写。
这些选项可以合并使用,如cgi
表示不区分大小写,整行替换,替换前询问。
vim 对多个文件的操作
工程文件浏览
在项目工程中,经常要用到插件,此处介绍一个插件NERDTree
,通过NERDtree
插件可以查看文件列表,要打开哪个文件,
光标选中后回车即可在新buffer
中打开。
常用操作:回车,打开选中文件;r
刷新工程目录文件列表;I
显示/影藏文件;m
出现创建/删除/剪切/拷贝操作列表。键入
多文档编辑
vim
的多文档编辑涉及三个概念:buffer、window、tab。vim把加载进内存的文件叫做buffer,buffer不一定可见;
若要buffer可见,则必须通过window作为载体呈现;同个看面上的多个window组合成一个tab。
vim中每打开一个文件,vim就对应的创建一个buffer,多个文件就有多个 buffer, 但默认你只能看到最后buffer对应
window,通过插件MiniBufExplorer
可以把所有 buffer 罗列出来,并且可以显示多个 buffer 对应的Window。
vim 寄存器
使用 vim 时,不管是复制、删除或粘贴,在 vim 中都是借助 register 实现的,vim 共有 9 类寄存器。
寄存器种类 | 寄存器 | 寄存器描述 |
---|---|---|
无名寄存器 | ”” | 缓存最后一个操作内容 |
数字寄存器 | “0~”9 | 缓存最近操作内容 |
行内寄存器 | ”- | 缓存行内删除内容 |
具名寄存器 | “a~”z或”A~”Z | 指定时可用 |
只读寄存器 | ”:,”.,”%,”# | 分别缓存最近命令,最近插入文本,当前文件名,当前交替文件名 |
表达式寄存器 | ”= | 只读,用于执行表达式命令 |
选择及拖拽寄存器 | “*,”+,”~ | 存取GUI选择文本 |
黑洞寄存器 | “_ | 不缓存操作内容 |
模式寄存器 | ”/ | 缓存最近的搜索模式 |
vim 分屏功能
vim
同时打开多个文件。
1 2 |
|
vim
在多窗口打开。
1 2 |
|
多窗口间切换的3方法Ctrl+w+方向键
或Ctrl+w+h/j/k/l
或Ctrl+ww
。
移动分屏的方法:Ctrl+w L
向右移动分屏;Ctrl+w H
向左移动分屏;Ctrl+w K
向上移动分屏;Ctrl+w J
向下移动分屏。
vim 插件安装
vundle 插件管理插件
vim 默认的安装需要将插件的帮助文档和插件脚本文件分别放到.vim
目录下的doc
和plugin
子目录下面,当要安装的插件较多时会非常繁琐并且
相似功能的插件名称可能相同,导致插件安装难以处理,为此我们找到了专门用于管理插件的插件vundle
,它会自动的将插件以插件名的形式安装到.vim/bundle
子目录下面,
如果想要删除或者升级某个插件,只需要使用一个命令即可完成,不需手动删除重装。
首先安装插件管理插件
1
|
|
其次在.vimrc
下增加配置信息如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
使用方法非常简单,只需在vundle#begin()
和vundle#end()
中间,加入需要安装的插件名称,进入~/.vimrc
执行
1
|
|
即可完成插件的安装。执行
1
|
|
即可完成插件的升级。想要卸载某个插件,只需要先在.vimrc
中注释或删除对应插件的配置信息,然后执行
1
|
|
即可完成。
solarized/molokai/phd 主题风格插件
素雅的solarized、多彩的molokai、复古的phd,这三种
vim 主题风格是比较流行的三种,插件完成后,可以在.vimrc
中选用某个主题,每个主题又有亮色系和暗色系两种,具体设置如下:
1 2 3 4 5 6 |
|
Powerline 状态栏插件
Powerline插件主要用于美化状态栏,需要在.vimrc
中设定状态栏主题风格:
1 2 |
|
增添后的状态栏,不仅界面漂亮多了,而且多了好多辅助信息(所在函数名、文件编码格式、文件类型)。
vim-cpp-enhanced-highlight 代码高亮插件
vim-cpp-enhanced-highlight主要是对 C++ 语法高亮进行增强。vim-cpp-enhanced-highlight
主要通过.vim/bundle/vim-cpp-enhanced-highlight/after/syntax/cpp.vim
控制高亮关键字及规则,所以,当发现某个 STL 容器类型未高亮,那么将该类型追加进cpp.vim
即可。如initializer_list
默认并不高亮,需要添加
1
|
|
NERD Commenter 快速开发注释
NERD Commenter插件会根据编辑文档的扩展名自适应采用何种注释风格,如文档*.cpp
采用
//
注释风格,而*.c
则是/**/
注释风格。此外,如果选中的代码并非整行,则该插件将用/**/
只注释选中部分。
常用操作:
-
cc,注释当前选中文本,如果选中的是整行则在每行首添加// -
cu,取消选中文本块的注释
YouCompleteMe 智能补全插件
YouCompleteMe插件是一个随键而全的、支持模糊搜索的、高速补全的插件。
(未完待续)
vim-fswitch(接口与实现快速切换)插件
vim-fswitch 插件可以实现接口文件(.h)和实现文件(.cpp)中来回切换的操作,安装完该插件后,还需要增加配置信息:
1 2 |
|
此时只要键入;sw
就可实现文件和接口文件间切换。
vim-protodef(接口快速生成实现)插件
在 *.h 中写成语函数的声明后,然后手动在 *.cpp 中写成员函数的定义,效率非常低。vim-protodef 可以快速完成此功能,即它可以根据类声明自动生成类实现的代码框架。注意该插件会依赖FSwitch
,需要一起安装。安装完后,需要设置如下信息:
1 2 3 4 |
|
pullproto.pl
是 protodef 自带的 perl 脚本。它的使用方法有下面两种:
1 2 |
|
nerdtree 工程文件浏览插件
当我们在用 vim 浏览工程时,可以通过NERDtree插件查看文件列表,打开要查看的文件,在新 buffer 中打开。
安装完 NERDtree
后,只需要在.vimrc
中添加如下信息即可:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
常用操作:
- 回车:打开选中文件
- r: 刷新工程目录文件列表
- I(大写):显示/隐藏文件
- m:出现创建/删除/剪切/拷贝操作列表
-
fl:右边子窗口为工程师项目文件列表。
MiniBufExplorer 多文档编辑插件
MiniBufExplorer主要用于同时编辑多个文档时会用到,它会涉及三个概念buffer
、window
、tab
,其中buffer
可以理解为每打开一个文件,就创建一个buffer
。
buffer
的呈现要以window
作为载体,而多个window
组合成一个tab
。
安装完成MiniBufExplorer
后,只需要在.vimrc
中配置如下信息即可:
1 2 3 4 5 |
|
默认时,打开的 window 占据几乎整个 vim 编辑区域,如果你想把多个 window 平铺成多个子窗口可以使用 MiniBufExplorer 的 s 和 v 命令:在某个 buffer 上键入 s 将该 buffer 对应 window 与先前 window 上下排列,键入 v 则左右排列(光标必须在 buffer 列表子窗口内)。
通过 vim 自身的 f 名字查找 buffer 序号可快速选择需要的 buffer。
vim 浏览代码
vim 浏览代码一般会与 catgs
cscope
taglist
等一起使用。
多窗口间切换的3方法:Ctrl+w+方向键
Ctrl+w+h/j/k/l
Ctrl+ww
。