Vim常见指令与问题总结
1. 常用指令
键盘练习:anobvcjklxmdghuwipyqefrstz 4892710536 4892710536`-[#~=)?]^\"<!+'_>{&:,$./@}|%*(;
[存活]
指令名称 |
指令说明 |
i |
Insert模式,按ESC/[Ctrl+C]回到Normal模式 |
x |
删当前光标所在的一个字符 |
:wq |
|
dd |
|
p |
粘贴剪贴板 |
推荐:
hjkl (强例推荐使用其移动光标,但不必需) →你也可以使用光标键 (←↓↑→).注: j 就像下箭头。
:help<command> → 显示相关命令的帮助。你也可以就输入:help而不跟命令。(注:退出帮助需要输入:q)
[感觉良好]
(1)各种插入模式
指令名称 |
指令说明 |
i |
在光标前插入 |
I |
在行首插入 |
a |
在光标后插入 |
A |
在行尾插入 |
o |
在当前行后插入一个新行 |
O |
在当前行前插入一个新行 |
J |
将下一行拼接到当前行尾 |
(2)简单的移动光标
指令名称 |
指令说明 |
O |
数字零,到行头 |
^ |
到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等) |
$ |
到本行行尾 |
g_ |
到本行最后一个不是blank字符的位置 |
cw |
替换从光标所在位置后到一个单词结尾的字符 |
c{motion} |
删除 motion命令跨过的字符,并且进入插入模式。比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,这会删除从光标位置到下一个叹号(但不包括),然后进入插入模式。被删除的字符被存在了剪贴板里面,并且可以再粘贴出来 |
d{motion} |
和上面差不多,但是不进入插入模式 |
(3)拷贝/粘贴
指令名称 |
指令说明 |
p/P |
粘贴,p表示在当前位置之后,P表示在当前位置前 |
y |
拷贝,但要指明结束位置,如:y$表示拷贝当前位置到本行最后位置 |
yy |
拷贝当前行,相当于【ddP】 |
完整的拷贝操作 |
按v进入可视模式,移动光标选中要复制的文本,按y激活复制命令,在其他地方按p进行粘贴 |
(4)Undo/Redo
指令名称 |
指令说明 |
u |
undo |
U |
恢复整行的操作 |
<C-r> |
redo【Ctrl+r】 |
指令名称 |
指令说明 |
:e<path/to/file> |
打开一个文件,不存在就新建 |
:w |
存盘 |
:saveas<path/to/file> |
另存为<path/to/file> |
:x/ZZ/:wq |
保存并退出 (:x表示仅在需要时保存,ZZ不需要输入冒号并回车) |
:q! |
|
:bn/:bp |
:%!xxd or :%!xxd -r 以十六进制打开文件 or 返回二进制打开
(6)搜索/替换
指令名称 |
指令说明 |
/ |
|
/pattern |
向下搜索pattern的字符串 |
?pattern |
向上搜索 |
:s/old/new/g |
替换光标所在行的所有old |
:#,#s/old/new/g |
替换两行之间的所有old |
:%s/old/new/g |
替换整个文件所有old |
:%s/old/new/gc |
:lvimgrep /patten/ % | lopen 查找结果全部列出
(7)查找
指令名称 |
指令说明 |
*/# |
查找当前光标所在单词的下一个/上一个 |
|
|
(8)取代及还原
指令名称 |
指令说明 |
r |
取代单个字符 |
R |
取代整行直到按下ESC |
cc/S |
取代整行内容 |
cw |
替换英文单词 |
~ |
光标所在字符大小写互换 |
C/c$ |
取代至行尾 |
c0/c^ |
取代至行首 |
s |
替换一个字符为所输入的字符串,与R不同 |
(9)文件刷新
指令名称 |
指令说明 |
:set autoread |
|
:e/:e! |
刷新文件 |
[更好,更强,更快]
(1)重复
指令名称 |
指令说明 |
. |
可以重复上一次的命令 |
N<command> |
N是个数字,表示重复<command>命令N次 |
2dd |
删除2行 |
3p |
粘贴文本3次 |
10iseu [ESC] |
会写下 “seu seu seu seu seu seu seu seu seu seu seu” |
(2)行内移动
指令名称 |
指令说明 |
0/$ |
移动光标到当前行首/行尾 |
^/g_ |
移动光标到本行第一个/最后一个,不是blank字符的位置 (所谓blank字符就是空格,tab,换行,回车等) |
w/b |
到下一个单词的开头(b反向) |
e/ge |
到下一个单词的结尾(ge反向) |
fx/Fx |
移动光标到当前行的下一个 x字母处。可以使用; 来重复你的上一个 f 命令。 Fx和 fx类似,不过是往回找。 |
tx/Tx |
和上面的命令类似,但是是移动到 x的左边一个位置。(这真的很有用)。 和 tx类似,不过是往回移动到 x的右边一个位置 |
n| |
移动到第n个字符 |
(3)行间匹配移动
指令名称 |
指令说明 |
% |
匹配括号移动,包括(,{,[.(注:你需要把光标先移到括号上) |
* |
匹配光标当前所在的单词,移动光标到下一个匹配单词 |
# |
匹配光标当前所在的单词,移动光标到上一个匹配单词 |
( / ) |
移动光标到下一个/上一个句子(sentence) |
{/} |
移动光标到下一个/上一个段落(paragraph) sentence 是以 . ! ?為區格。 paragraph 是以空白行為區格。 |
(4)文件内移动
指令名称 |
指令说明 |
NG |
到第 N行(注:注意命令中的G是大写的,另我一般使用 : N到第N行,如 :137到第137行) |
gg |
到第一行(注:相当于1G,或 :1) |
G |
到最后一行 |
H/M/L |
移动光标到屏幕上面/中间/下面 |
Ctrl+f/b |
向下/上移动一屏(PageDown/ PageUp)(可视模式下不可用) |
Ctrl+d/u |
向下/上移动半屏 |
(5)更快
<startposition><command><end position>,如0y$表示先移动到行首位置,从这里拷贝,拷贝到行尾最后一个字符。
指令名称 |
指令说明 |
v |
可视化的选择 |
gU |
变大写 |
gu |
变小写 |
(6)跳转
指令名称 |
指令说明 |
|
m{a-zA-Z} |
||
`a |
到书签 a处。注意这个不是单引号,它一般位于大部分键盘的 1的左边 |
|
`. |
|
|
Ctrl+i/Ctrl+o |
[组合指令]
指令名称 |
指令说明 |
dG/dgg |
删除光标当前行到最后行/第一行 |
3fa |
在当前行查找第三个出现的a |
dt" |
[程序常用命令]
(1)分屏及屏幕跳转
指令名称 |
指令说明 |
:split/vsplit (:sv /vs) |
创建水平/垂直分屏) |
<C-w><dir> |
dir就是方向,可以是hjkl或是 ←↓↑→ 中的一个, 其用来切换分屏 |
<C-w>_ (或<C-w>|) |
最大化尺寸 (<C-w>|垂直分屏) |
<C-w>+ (或<C-w>-) |
增加尺寸 |
ctrl-w w |
跳到下一个窗口 |
ctrl-w h |
跳到左侧窗口 |
ctrl-w l |
跳到右侧窗口 |
ctrl-w j |
跳到下方的窗口 |
ctrl-w k |
跳到上方的窗口 |
ctrl + w + r |
向右或向下方交换窗口 |
:q或ZZ |
关闭某个屏幕 |
(2)打开2个文件并比较
指令名称 |
指令说明 |
vim –d file1 file2 |
使用vim的比较模式打开两个文件 |
vimdiff file1 file2 |
|
:vert diffsplit file2 |
如果已经打开了文件file1,再打开另一个文件file2进行比较;如果没有用vert命令,diffsplit则会分上下两个窗口 |
:diffthis |
如果已经用split方式打开了两个文件file1,file2,又想比较两文件的不同。分别在两个窗口里面输入命令:diffthis |
diffupdate |
(3)定位不同之处
指令名称 |
指令说明 |
[c |
跳到前一个不同点 |
]c |
跳到后一个不同点 |
(4)合并文档
指令名称 |
指令说明 |
dp |
将差异点的当前文档内容应用到另一文档(diff put) |
do |
将差异点的另一文档的内容拷贝到当前文档(diff get) |
(5)上下文的展开和查看
指令名称 |
指令说明 |
:set diffopt=context:3 |
比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff缺省是会把不同之处上下各 6行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数为3行,可以这样设置 |
|
|
(6)折叠/展开(normal 模式)
指令名称 |
指令说明 |
zf |
创建折叠(使用数字表示创建有当前行到下多少行的折叠,比如3j就创建包括4行的折叠) |
zo |
打开折叠(l也可以打开折叠) |
zc |
关闭当前折叠 |
zm |
关闭所有折叠 |
zr |
打开所有折叠 |
zE |
删除所有折叠 |
zd |
删除当前折叠 |
za |
|
zj |
到下一折叠的开始处 |
zk |
到上一折叠的末尾 |
zR |
折叠 |
zM |
展开 |
Space |
折叠/展开 |
tl/tb |
开启右侧窗口 |
[Vim的超能力]
(1)块操作:<C-v>
典型的块操作: 0 <C-v><C-d>I-- [ESC]
操作分解 |
指令说明 |
^ |
到行头 |
<C-q> |
开始块操作(注:linux用<C-v>) |
<C-d> |
向下移动 (你也可以使用hjkl来移动光标,或是使用%,或是别的) |
I-- [ESC] |
I是插入,插入“--”,按ESC键来为每一行生效 |
在 Insert模式下,你可以输入一个词的开头,然后按<C-p>或是<C-n>,自动补齐功能就出现了。
指令名称 |
指令说明 |
<C-p> |
自动补齐,向上选择 |
<C-n> |
自动补齐,向下选择 |
(3)可视化选择:v,V,<C-v>
我们看到了<C-q>的示例(在Linux下应该是<C-v>),我们可以使用q和Q。一但被选好了,你可以做下面的事:
指令名称 |
指令说明 |
v |
按字符选择 |
V |
按行选择 |
J |
把所有的行连接起来(变成一行) |
<或> |
左右缩进 |
= |
(4)在可视选择模式下剪切和拷贝
指令名称 |
指令说明 |
d |
剪贴选择的内容到剪贴板 |
y |
拷贝选择的内容到剪贴板 |
c |
剪贴选择的内容到剪贴板并且进入插入模式 |
<</>> |
缩进 |
(5)区域选择<action>a<object>或<action>i<object>
指令名称 |
指令说明 |
<action> |
可以是任何的命令,如d (删除),y (拷贝),v (可以视模式选择) |
<object> |
可能是:w一个单词,W 一个以空格为分隔的单词,s 一个句字,p 一个段落。也可以是一个特别的字符:"、'、)、}、] |
|
|
假设你有一个字符串(map (+) ("foo")),而光标键在第一个o的位置。
vi" → 会选择foo.
va" → 会选择"foo".
vi) → 会选择"foo".
va) → 会选择("foo").
v2i) → 会选择map (+) ("foo")
v2a) → 会选择(map (+) ("foo"))
(6)宏录制:qa操作序列q,@a,@@【未实现】
l qa把你的操作记录在寄存器a。
l 于是@a会replay被录制的宏。
l @@是一个快捷键用来replay最新录制的宏。
示例
在一个只有一行且这一行只有“1”的文本中,键入如下命令:
l qaYp<C-a>q→
Øqa开始录制
ØYp 复制行.
Ø<C-a>增加1.
Øq 停止录制.
l @a → 在1下面写下 2
l @@ → 在2正面写下3
l 现在做100@@会创建新的100行,并把数据增加到 103.
结束语
上面是作者最常用的90%的命令。我建议你每天都学1到2个新的命令。在两到三周后,你会感到vim的强大的。有时候,学习VIM就像是在死背一些东西。幸运的是,vim有很多很不错的工具和优秀的文档。运行vimtutor直到你熟悉了那些基本命令。其在线帮助文档中你应该要仔细阅读的是:helpusr_02.txt.你会学习到诸如!,目录,寄存器,插件等很多其它的功能。学习vim就像学弹钢琴一样,一旦学会,受益无穷。
2. 配置文件
[_vimrc文件]在/etc目录下
指令名称 |
指令说明 |
set nu |
显示行号 |
colorscheme desert |
使用了desert配色方案 |
Syntax enable |
打开了语法高亮功能 |
Syntax on |
|
set fencs=gbk 注:cp936相当于GBK,cp65001相当于utf-8 |
|
:set smartindent shiftwidth=4 |
C语言自动缩进,缩进值为4个字符宽度 |
[编码设置]
编码方式 |
说明 |
enc(encoding) |
vim内部使用的编码。如vim打开的文本编码方式与内部不一致,就转换为内部编码方式,用命令【:set enc】 |
fenc(fileencoding) |
当前打开的文本的编码。用命令【:set fenc】 |
fencs(fileencodings) |
字符编码的列表,编码的自动识别就是通过设置fencs实现的。打开一个文件就是安装fencs中的编码顺序进行解码的。一般设置顺序为: set fileencodings= ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 |
tenc(termencoding) |
终端使用文本编码或vim用于屏幕显示时的编码,显示的时候vim会把内部编码转换为屏幕编码再输出,默认为enc,windows平台忽略。 |
这里对C、C++的代码进行配置:在D:\Program Files\Vim\vim74\Syntax下找到 c.vim 和 cpp.vim,分别添加以下内容:
syn matchcFunction"\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
syn match cFunction"\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1
hi cFunction gui=NONE guifg=#B5A1FF
[系统文件格式转换]
文件格式 |
说明 |
set ff? 【ff=fileformat】 |
|
set ff=unix |
设置成unix格式 |
set ff=dos |
3. 插件
1.下载GitHub:https://git-scm.com/downloads;
2.加入环境变量:e:\Program Files\Git\mingw32\bin;验证:git--version
3.配置Curl脚本;验证:curl--version;
4.安装Vundle:git clonehttps://github.com/gmarik/vundle D:\Vim\vimfiles\bundle\vundle;
5.配置Vundle:参考_vimrc
1.第1种解压为*.exe的插件如ctags插件。将ctags.exe拷贝到 vim74目录下;
2.第2种解压为*.vim的插件,将解压的所有文件夹复制到vimfile下(如taglist插件。将taglist.vim、taglist.txt分别拷贝到vimfile下plugin和doc文件夹下);
3.第3种解压为*.vmb的插件如mark插件,将mark-2.8.5.vmb、supertab.vmb用gvim打开,并执行命令【:so %】进行安装。
[Mark插件]
http://www.vim.org/scripts/download_script.PHP?src_id=22582
命令 |
说明 |
\r |
手工输入 |
【^\d\{4}/\d\{2}/\d\{2}.*$】 |
设置日期 |
MarkSave |
保存配置 |
set viminfo+=! " 保存全局变量
letg:mwAutoSaveMarks = 1
letg:mwAutoLoadMarks = 1
nmap <F3> \*
[winmanager插件]
http://www.vim.org/scripts/script.php?script_id=95
将winmanager.zip解压和拷贝,解压后包含一个doc文件夹和一个plugin文件夹,将其中内容分别复制到d:\ProgramFiles\Vim\vimfiles下的doc及plugin中
letg:winManagerWindowLayout='FileExplorer|TagList'
nmap mm :WMToggle<cr>
[taglist插件]
http://www.vim.org/scripts/script.php?script_id=273
将taglist.zip解压和拷贝,解压后包含一个doc文件夹和一个plugin文件夹,将其中内容分别复制到d:\ProgramFiles\Vim\vimfiles下的doc及plugin中
nmap tl:Tlist<CR>
let Tlist_Show_One_File=1"只显示当前文件的tags
" letTlist_Enable_Fold_Column=0"使taglist插件不显示左边的折叠行
letTlist_Exit_OnlyWindow=1"如果Taglist窗口是最后一个窗口则退出Vim
letTlist_File_Fold_Auto_Close=1"自动折叠
let Tlist_WinWidth=30"设置窗口宽度
letTlist_Use_Right_Window=1"在右侧窗口中显示
[tagbar插件代替taglist]
letg:tagbar_ctags_bin='ctags' "ctags程序的路径
letg:tagbar_width=30 "窗口宽度的设置
nmap tl:Tagbar<CR>
将ec57w32.zip解压,在解压后将文件夹中的ctags.exe复制到D:\ProgramFiles\Vim\vim74下,并编辑_vimrc文件,添加以下内容:
settags=tags;
set autochdir
然后将D:\ProgramFiles\Vim\vim73加到环境变量的path中。在需要查看的源代码目录下执行命令ctags -R;然后再用gvim打开源代码文件:
操作:按住“CTRL”键,点击对应的函数名或“CTRL+]”,会自动跳转到函数的定义部分,“CTRL+T”则返回;
[h\c切换插件]
h\c切换(针对C、C++)
下载插件:a.vim地址http://www.vim.org/scripts/download_script.php?src_id=7218
将a.vim复制到d:\ProgramFiles\Vim\vim73\plugin,在_vimrc中添加:
nnoremap<silent><F12> :A<CR>
用gvim打开源码文件后,按F12即可以在c/h文件中切换,也可以通过输入:A实现。
minibufexpl.vim地址http://www.vim.org/scripts/download_script.php?src_id=3640
解压后将将minibufexpl.vim复制到d:\ProgramFiles\Vim\vim73\plugin,在_vimrc中添加:
Letg:miniBufExplMapCTabSwitchBufs=1
let g:miniBufExplMapWindowsNavVim=1
letg:miniBufExplMapWindowNavArrows=1
ctrl+Tab,切换到前一个buffer,并在当前窗口打开文件;
ctrl+shift+Tab,切换到后一个buffer,并在当前窗口打开文件;
ctrl+箭头键,可以切换到上下左右窗口中;
ctrl+h,j,k,l,切换到上下左右的窗口中。
[a.vim 插件]
nnoremap <silent><F12>:A<CR>
[visualmark高亮书签插件]
高亮书签
下载插件:visualmark.vim地址http://www.vim.org/scripts/download_script.php?src_id=4700
将visualmark.vim复制到d:\ProgramFiles\Vim\vim73\plugin。
用gvim打开源码文件,将光标定位在需要添加书签的地方,按下ctrl+F2,即添加了书签。
使用F2在书签之间正向切换,shift+F2反向切换。
[grep工程查找插件]
在工程中快速查找。
地址http://www.vim.org/scripts/download_script.php?src_id=7645
将grep.vim复制到C:\ProgramFiles\Vim\vim72\plugin,在_vimrc中添加:
nnoremap<silent><F3>:Grep<CR>
用gvim打开源码文件,并将光标定位到要查找的内容上,按下F3,确定要查找的内容和搜索范围,gvim会在弹出的QuickFix窗口中列出所有符合条件的搜索结果。确定查找内容时,支持正则表达式。
https://github.com/scrooloose/nerdcommenter
操作:(<leader>为;)
<leader>cc,注释当前选中文本,如果选中的是整行则在每行首添加 //,如果选中一行的部分内容则在选中部分前后添加分别 /、/;
<leader>cu/c+空格,取消选中文本块的注释。
[NERD_tree插件]
http://www.vim.org/scripts/download_script.php?src_id=23731
[*插件]
4. 常见问题
Q:编辑模式下如何删除光标后面的字符?
A:
A:
打开多个文件:
1.vim还没有启动的时候:
在终端里输入
vim file1 file2 ... filen便可以打开所有想要打开的文件
2.vim已经启动
输入
:open file
可以再打开一个文件,并且此时vim里会显示出file文件的内容。
同时显示多个文件:
:split
:vsplit
在文件之间切换:
1.文件间切换
Ctrl+6—下一个文件
:bn—下一个文件
:bp—上一个文件
对于用(v)split在多个窗格中打开的文件,这种方法只会在当前窗格中切换不同的文件。
2.在窗格间切换的方法
Ctrl+w+方向键——切换到前/下/上/后一个窗格
Ctrl+w+h/j/k/l ——同上
Ctrl+ww——依次向后切换到下一个窗格中