Vim编辑器

688 查看

什么是Vim

Vim是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs(夸张的说法是伪装成编辑器的操作系统)并列成为类Unix系统用户最喜欢的文本编辑器。Bram Moolenaar 从一个开源的vi开发了1.0的Vim,并且在1992 年 1.22 版本的 Vim 被移植到了 UNIX 和MS-DOS上。自vim发布有很多程序员使用,到2010年vim发布7.3版本,目前最新的一个版本。

安装Vim

Mac下可以直接使用brew安装:

brew install macvim

其他系统下的安装可查看官方网站http://www.vim.org/download.php#pc

基本概念

普通( Normal )模式

当我们通过vim 文件或文件夹进入编辑器时,默认的就是普通模式,或者叫做命令模式,在这种模式下,键盘上的大部分输入会被认作是快捷键。普通模式也是vim使用中最多使用的模式,能很大的提高编辑效率。
命令解释中的参数:

CHAR 任何非空白字符
WORD 非空白字符的序列 (字串)
N 命令前输入的数值
{motion} 光标移动命令
Nmove {motion} 移动经过的文本

当进入普通模式时左下角显示--INSERT--,下面介绍一些常用的快捷键:

1.模式转换

基本的模式转换快捷键,对于进入编辑模式,下面还有其他快捷键在完成后也会进入编辑模式。
普通模式进入编辑模式

i 在当前位置生前插入N次     
I 在当前行首插入N次
a 在当前位置后插入N次       
A 在当前行尾插入N次
o 在当前行之后插入一行N次    
O 在当前行之前插入一行N次

普通模式进入可视化模式

v 开始面向字符的可视 (Visual) 模式
V 进入面向行的可视 (Visual) 模式
CTRL+v 进入面向列的可视 (Visual) 模式

2.光标移动及屏幕调整

通过快捷键我们可以完成光标的快速移动.

h 光标左移 N 个字符
l 光标右移 N 个字符,这个命令很少用,一般用w代替。
k 光标上移 N 行
j 光标下移 N 行

w 光标向前移动 N 个 WORD,停留在该 WORD 的第一个字符,当到达该行行尾时,会自动换行。
e 光标向前移动 N 个 WORD,停留在该 WORD 的最后一个字符,当到达该行行尾时,会自动换行。
b 光标向后移动 N 个 WORD,停留在该 WORD 的第一个字符,当到达该行行首时,会自动换行。
W,E,B 与w,e,b 功能是一致的,但是在区分 WORD 上是不同的,对于parent.child这种,大写的快捷键会忽略标点符号。

^ 移动到本行第一个非空白字符上。
0(数字0)移动到本行第一个字符上,HOME键也可。
$ 移动到当前行,下 N 行行尾。
| 移到当前行的第 N 个字符。
gg 移动到文件的第一行,同 [[。
G  移动到文件的最后一行,同 ]]。(NG会移动到第 N 行)
f 也可用于移动光标,fx会查找光标后的字符x,3fx会查找光标后的第三个字符x。但f只局限与当前行不会跨行。
F 同f,反向查找。
; 重复前面的f、F、t或T查找命令。
, 以相反的方向重复前面的f、F、t或T查找命令。

z<return> 将当前行下的第 N 行置为屏幕的顶行(即z+ENTER) 或者zt
z. 将当前行上的第 N 行置为屏幕的中央 或者zz
z- 将当前行上的第 N 行置为屏幕的底行 或者zb

H 移动到当前屏幕的开头下 N 行。
M 移动到当前屏幕的中间。
L 移动到当前屏幕的结尾上 N 行。
gm 移动到屏幕中间
+ 移动到下一行的第一个非空字符
- 移动到上一行的第一个非空字符
% 光标会移动后面的第一个小括号中括号大括号 ,所匹配的小括号中括号大括号,即成对出现的符号。

书签

m[a-zA-Z] 在光标所在行定义书签,使用'+书签名 跳转。例如 ma,'a。

组合键

Ctrl + e 向下滚动一行
Ctrl + y 向上滚动一行
Ctrl + d 向下滚动半屏
Ctrl + u 向上滚动半屏
Ctrl + f 向下滚动一屏,同 PAGEDOWN。
Ctrl + b 向上滚动一屏,同 PAGEUP。
Ctrl + o 依次沿着你的跳转记录向回跳
Ctrl + i 依次沿着你的跳转记录向前跳

EX命令 当输入: / ? 会进入命令行编辑,在编辑器的最下边,出现 : / ? ,其中: + 命令 被称作EX命令。

:+行号 可以直接跳到该行 ,当输入行号大于最大行号时,会跳到最后一行。在便器展示行号的情况下,这个命令被经常使用。
:ju 列出跳转历史。

3.查找及替换

查找,vim中可以通过EX命令 :set + 选项 ,去设置一些选项来影响查找。输入/ ? 时,会在底行出现该命令,然后可以输入字符,输入ENTER开始查找,支持正则表达式,并且支持历史操作。

/{查找的内容}[/偏移量] 光标处向下查找指定内容 
?{查找的内容}[/偏移量] 光标处向上查找指定内容
/和? 在开始查找时可使用n或者N在找到的内容之间跳转。
n 重复前一个查找的动作
N 与 n 刚好相反,反向进行前一个查找动作
:set ignorecase  忽略大小写的查找
:set noignorecase  不忽略大小写的查找
:set hlsearch  高亮搜索结果,所有结果都高亮显示,而不是只显示一个匹配。
:set nohlsearch  关闭高亮搜索显示
:nohlsearch  关闭当前的高亮显示,如果再次搜索或者按下n或N键,则会再次高亮。
:set incsearch  逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成。
:set wrapscan  重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。
*或者# 会选中光标处的WORD,然后 直接输入N/n,开始查找。

替换,替换操作可以实现缩进,注释。

r{CHAR} 替换光标处的字符。
R{WORD} 替换光标处的字符,直到输入<ESC>或者CTRL+[为止。
:s/old/new/ 用old替换new,替换当前行的第一个匹配
:s/old/new/c 用old替换new,替换当前行的第一个匹配 带确认选项的删除(选项y[es] ,n[o] ,a[ll] ,q[uit],l[ast]替换完当前退出,Ctrl+e ,Ctrl+y)
:%s/\s\+$// 删除行尾空格
:s/old/new/g 用old替换new,替换当前行的所有匹配
:%s/old/new/ 用old替换new,替换所有行的第一个匹配
:%s/old/new/g 用old替换new,替换所有行的所有匹配
:%s/\([^,]*\), \(.*\)/\2 \1/
:n,m s/old/new/g 在第n行到第m行之间,用old替换new,替换所有匹配。
& 重复最后的:s命令
:10,20 s/^/    /g 在第10行知第20行每行前面加四个空格,用于缩进。
:起始行号,结束行号s/^/注释符/g
:起始行号,结束行号s/^注释符//g

查找并执行命令

:g/text1/s/text2/text3 查找包含text1的行,用text3替换text2
:g/text/command 在所有包含text的行运行command所表示的命令 :g/^/m 0
:v/text/command 在所有不包含text的行运行command所表示的命令

4.删除 剪切 拷贝 粘贴

vim是不支持系统的剪切板,linux中,通常通过vim的寄存器来实现,"+y 复制到系统剪切板 ,"+p 把系统粘贴板里的内容粘贴到vim,对于mac,macvim是command+c 和command+v

x 删除光标后 N 个字符
d{motion} 删除移动命令经过的字符,例如 dj 删除当前行及下面一行。
dd 删除当前行
d$ 删除光标到行尾的内容 同D。
Ndd 删除当前行开始的N行。
dG 删除当前行之后所有行
dgg 删除当前行之前所有行
:1,10d 删除1-10行
:11,$d 删除11行及以后所有的行
:1,$d 删除所有行
J 合并当前行及下面 N 行。即删除空格。
s 删除光标处的 N 个字符并进入插入模式
S 删除光标下的 N 行并进入插入模式
c{motion} 改变移动命令经过的字符,同d 命令,并进入插入模式。
y  拷贝当前光标选中部分,常在可视模式中使用。
yy 拷贝当前行下 N 行
:1,10y 复制1-10行
:,10y  复制光标所在行到10行
p  在当前光标后粘贴 N 次,如果之前使用了yy命令来复制一行,那么就在当前行的下一行粘贴。
P  在当前行前粘贴 N 次
:1,n co m 将1-n行插入到第m行之后。
:1,$ co $ 将整个文件复制一份并添加到文件尾部。

5.撤销 重复

u 撤销(Undo)
U 撤销对整行的操作
Ctrl + r ,即撤销的撤销。
. 重复上次修改,包含你在插入模式的插入。许多如果想多次使用的修改命令,可以它代替。

6.EX命令

当输入:会在底行出现:,再次输入的内容都会出现在:之后,这些输入的内容,会被认作EX命令。
通过EX命令设置的vim选项,都只在当前编辑窗中有效,退出后,则消失,如需永久有效,需修改vim的配置文件.vimrc。
常使用的EX命令:

:q 退出文件
:w 保存文件 (或者+ filename 另存为)
:wq 保存退出文件(也可在普通模式下使用 ZZ 快捷键)
:x 保存退出 与wq的区别是保存退出时,如果该文件没有修改,则不会修改文件的时间戳,wq则一定会。
:q! 强制退出
:help+命令 查看帮助
:e 后接文件名,打开文件,支持ftp,不接文件名时,直接刷新当前文件。
:e!放弃所有修改,重新打开文件。
:open+<file> 打开file
#可通过:files或者:ls或者:buffers,来查看vim缓冲区,即可跳转文件。
:bn 切换到下一个文件 
:n   编辑下一个文件
:bp 切换到上一个文件
:new 打开个新窗口或者在新窗口打开文件
:split 打开个新窗口或者在新窗口打开文件(vsplit也可以,split打开的窗口都是横向的,使用vsplit可以纵向打开窗口。)
:!command  在当前目录下执行shell命令。
:sh 打开子shell,ctrl+d或者exit退出 (或者使用Ctrl+z 挂起 ,fg返回)
:r 文件名   在光标所在处插入一个文件的内容。
:10r 文件名   将文件插入至 10 行之后。
:r! {command} 将命令 {command} 的标准输出插入到光标之下
:10,29write [!或者>>]name   将10-29 行的内容保存到文件name中。!表示强制 >> 表示追加 
:f 显示文件名、当前的行号、文件的总行数和文件位置的百分比,是否修改。
:f+<filename> 改变编辑中的文件名。
:iab[breviate] re React 定义插入模式下缩写。
:abclear
#set 选项
:set+<option> ,设置当前打开的vim 编辑器的选项,例如是否展示行号,自动缩进等。
:set all ,查看所有选项。
:set shiftwidth=4 ,设置自动缩进 4 个空格, 当然要设自动缩进先。
:set tabstop=4 ,   实际的 tab 即为 4 个空格。
:set nonumber ,   设置不展示行号。
:set number ,   设置展示行号。
:set numberwidth=4 ,设置行号所占宽度
:set ai ,          设置自动缩进
:map ,查看定义的所有映射,(映射?例如a映射ab,则a与ab 相同作用。在一些插件中都会使用映射)

7.其他

:ls 查看缓存区
q: 查看命令窗口
:reg 查看寄存器
:marks 查看书签
:delm[ark] + 书签名  删除书签。
<{motion} 将动作 {motion} 覆盖的所有行向左移动 1个移位宽度
>{motion} 将动作 {motion} 覆盖的所有行向右移动 1个移位宽度
>> 向右移动一个移位宽度
<< 向左移动一个移位宽度
:n,m>> ,n到m行右移一个移位宽度
CTRL+g 显示文件名、当前的行号、文件的总行数和文件位置的百分比,是否修改。
:= 打印文件中的行数
gf 打开光标处文件,文件要在当前目录内。
gd 到达光标所在处函数或者变量的定义处。
:'.   它移动光标到上一次的修改行
K  看光标所指标识符的 man 帮助页
~ 大小写替换,同时光标前移
gu{motion} 经过的位置内容小写(guu 当前行)
gU{motion} 经过的位置内容大写(gUU 当前行)
g~{motion} 经过的位置内容大小写互换。
zfap 按段落折叠
zo 打开折叠

插入模式

只有在插入模式下,才可以做文字输入,不会被认为是快捷键,在普通模式下可以通过i进入插入模式。

CTRL+c 同<ESC>离开插入模式
CTRL+o {command}短暂离开插入模式,执行命令command后回到插入。

可视模式

可视模式下可以使用普通模式的大部分快捷键,当进入可视模式时左下角显示--VISUAL--,具体细节可查看vim的文档
可视模式主要是做选择操作,此时移动光标的操作都会把光标经过的部分选中。

CTRL+c 同<ESC>离开可视模式
ab 选择 "一个块" (从 "[(" 至 "])") (block)
ib 选择 "内含块" (从 "[(" 到 "])")
aB 选择 "一个大块" (从 "[{" 到 "]}") (Block)
iB 选择 "内含大块" (从 "[{" 到 "]}")
U 选中部分大写
u 选中部分小写

常用插件

NERDTree

NERDTree最常用的插件之一,以树形结构展示文件夹,实现我们在IDE的项目视图。可以去官方网站https://github.com/scrooloose/nerdtree查看如何下载安装。
主要快捷键:

ctrl + w + h    工作窗口左移
ctrl + w + l    工作窗口右移
ctrl + w + w    光标自动在左右侧窗口切换
ctrl + w + r    移动当前窗口的布局位置
o       在已有窗口中打开文件、目录或书签,并跳到该窗口
go      在已有窗口 中打开文件、目录或书签,但不跳到该窗口
t       在新 Tab 中打开选中文件/书签,并跳到新 Tab
T       在新 Tab 中打开选中文件/书签,但不跳到新 Tab
i       split 一个新窗口打开选中文件,并跳到该窗口
gi      split 一个新窗口打开选中文件,但不跳到该窗口
s       vsplit 一个新窗口打开选中文件,并跳到该窗口
gs      vsplit 一个新 窗口打开选中文件,但不跳到该窗口
!       执行当前文件
O       递归打开选中 结点下的所有目录
x       合拢选中结点的父目录
X       递归 合拢选中结点下的所有目录
e       Edit the current dif
双击    相当于 NERDTree-o
中键    对文件相当于 NERDTree-i,对目录相当于 NERDTree-e
D       删除当前书签
P       跳到根结点
p       跳到父结点
K       跳到当前目录下同级的第一个结点
J       跳到当前目录下同级的最后一个结点
k       跳到当前目录下同级的前一个结点
j       跳到当前目录下同级的后一个结点
C       将选中目录或选中文件的父目录设为根结点
u       将当前根结点的父目录设为根目录,并变成合拢原根结点
U       将当前根结点的父目录设为根目录,但保持展开原根结点
r       递归刷新选中目录
R       递归刷新根结点
m       显示文件系统菜单
cd      将 CWD 设为选中目录
I       切换是否显示隐藏文件
f       切换是否使用文件过滤器
F       切换是否显示文件
B       切换是否显示书签
q       关闭 NerdTree 窗口
?       切换是否显示 Quick Help
#切换标签页
:tabnew [++opt选项] [+cmd] 文件 建立对指定文件新的tab
:tabc   关闭当前的 tab
:tabo   关闭所有其他的 tab
:tabs   查看所有打开的 tab
:tabp   前一个 tab
:tabn   后一个 tab

pathogen

插件管理工具,vim有很多插件可供我们使用,当插件数量大的时候就需要一个专门的工具去管理,pathogen就是实现功能,下载安装https://github.com/tpope/vim-pathogen

其他

vim 有很多有用的插件,像ctags、taglist、foldmethod、xmledit、visualmark、vim-markdown等。当然也有一些人把一些好的配置分享出来,比较受欢迎的有:
https://github.com/spf13/spf13-vim
https://github.com/carlhuda/janus