Vim常见指令与问题总结
1. 常用指令
键盘练习:anobvcjklxmdghuwipyqefrstz 4892710536 4892710536`-[#~=)?]^\"<!+'_>{&:,$./@}|%*(;
[存活]
指令名称 |
指令说明 |
i |
Insert模式,按ESC/[Ctrl+C]回到Normal模式 |
x |
删当前光标所在的一个字符 |
:wq |
|
dd |
|
p |
粘贴剪贴板 |
推荐:
hjkl (强例推荐使用其移动光标,但不必需) →你也可以使用光标键 (←↓↑→).注: j 就像下箭头。
:help<command> → 显示相关命令的帮助。你也可以就输入:help而不跟命令。(注:退出帮助需要输入:q)
[感觉良好]
(1)各种插入模式
i |
在光标前插入 |
a |
在光标后插入 |
o |
在当前行后插入一个新行 |
J |
将下一行拼接到当前行尾 |
(2)简单的移动光标
O |
数字零,到行头 |
$ |
到本行行尾 |
cw |
替换从光标所在位置后到一个单词结尾的字符 |
d{motion} |
和上面差不多,但是不进入插入模式 |
(3)拷贝/粘贴
p/P |
粘贴,p表示在当前位置之后,P表示在当前位置前 |
yy |
拷贝当前行,相当于【ddP】 |
(4)Undo/Redo
u |
undo |
<C-r> |
redo【Ctrl+r】 |
:e<path/to/file> |
打开一个文件,不存在就新建 |
:saveas<path/to/file> |
另存为<path/to/file> |
:q! |
|
:%!xxd or :%!xxd -r 以十六进制打开文件 or 返回二进制打开
(6)搜索/替换
/ |
|
?pattern |
向上搜索 |
:#,#s/old/new/g |
替换两行之间的所有old |
:%s/old/new/gc |
:lvimgrep /patten/ % | lopen 查找结果全部列出
(7)查找
*/# |
查找当前光标所在单词的下一个/上一个 |
(8)取代及还原
r |
取代单个字符 |
cc/S |
取代整行内容 |
~ |
光标所在字符大小写互换 |
c0/c^ |
取代至行首 |
(9)文件刷新
:set autoread |
|
[更好,更强,更快]
(1)重复
. |
可以重复上一次的命令 |
2dd |
删除2行 |
10iseu [ESC] |
会写下 “seu seu seu seu seu seu seu seu seu seu seu” |
(2)行内移动
0/$ |
移动光标到当前行首/行尾 |
w/b |
到下一个单词的开头(b反向) |
fx/Fx |
移动光标到当前行的下一个 x字母处。可以使用; 来重复你的上一个 f 命令。 Fx和 fx类似,不过是往回找。 |
n| |
移动到第n个字符 |
(3)行间匹配移动
% |
匹配括号移动,包括(,{,[.(注:你需要把光标先移到括号上) |
# |
匹配光标当前所在的单词,移动光标到上一个匹配单词 |
{/} |
移动光标到下一个/上一个段落(paragraph) sentence 是以 . ! ?為區格。 paragraph 是以空白行為區格。 |
(4)文件内移动
NG |
到第 N行(注:注意命令中的G是大写的,另我一般使用 : N到第N行,如 :137到第137行) |
G |
到最后一行 |
Ctrl+f/b |
向下/上移动一屏(PageDown/ PageUp)(可视模式下不可用) |
(5)更快
<startposition><command><end position>,如0y$表示先移动到行首位置,从这里拷贝,拷贝到行尾最后一个字符。
v |
可视化的选择 |
gu |
变小写 |
(6)跳转
指令说明 |
||
m{a-zA-Z} |
||
`. |
|
|
[组合指令]
dG/dgg |
删除光标当前行到最后行/第一行 |
dt" |
[程序常用命令]
(1)分屏及屏幕跳转
:split/vsplit (:sv /vs) |
创建水平/垂直分屏) |
<C-w>_ (或<C-w>|) |
最大化尺寸 (<C-w>|垂直分屏) |
ctrl-w w |
跳到下一个窗口 |
ctrl-w l |
跳到右侧窗口 |
ctrl-w k |
跳到上方的窗口 |
:q或ZZ |
关闭某个屏幕 |
(2)打开2个文件并比较
vim –d file1 file2 |
使用vim的比较模式打开两个文件 |
:vert diffsplit file2 |
如果已经打开了文件file1,再打开另一个文件file2进行比较;如果没有用vert命令,diffsplit则会分上下两个窗口 |
diffupdate |
(3)定位不同之处
[c |
跳到前一个不同点 |
(4)合并文档
dp |
将差异点的当前文档内容应用到另一文档(diff put) |
(5)上下文的展开和查看
:set diffopt=context:3 |
比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff缺省是会把不同之处上下各 6行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数为3行,可以这样设置 |
(6)折叠/展开(normal 模式)
zf |
创建折叠(使用数字表示创建有当前行到下多少行的折叠,比如3j就创建包括4行的折叠) |
zc |
关闭当前折叠 |
zr |
打开所有折叠 |
zd |
删除当前折叠 |
zj |
到下一折叠的开始处 |
zR |
折叠 |
Space |
折叠/展开 |
[Vim的超能力]
(1)块操作:<C-v>
典型的块操作: 0 <C-v><C-d>I-- [ESC]
^ |
到行头 |
<C-d> |
向下移动 (你也可以使用hjkl来移动光标,或是使用%,或是别的) |
在 Insert模式下,你可以输入一个词的开头,然后按<C-p>或是<C-n>,自动补齐功能就出现了。
<C-p> |
自动补齐,向上选择 |
(3)可视化选择:v,V,<C-v>
我们看到了<C-q>的示例(在Linux下应该是<C-v>),我们可以使用q和Q。一但被选好了,你可以做下面的事:
v |
按字符选择 |
J |
把所有的行连接起来(变成一行) |
= |
(4)在可视选择模式下剪切和拷贝
d |
剪贴选择的内容到剪贴板 |
c |
剪贴选择的内容到剪贴板并且进入插入模式 |
(5)区域选择<action>a<object>或<action>i<object>
<action> |
可以是任何的命令,如d (删除),y (拷贝),v (可以视模式选择) |
|
|
假设你有一个字符串(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 |
显示行号 |
Syntax enable |
打开了语法高亮功能 |
set fencs=gbk 注:cp936相当于GBK,cp65001相当于utf-8 |
|
[编码设置]
enc(encoding) |
vim内部使用的编码。如vim打开的文本编码方式与内部不一致,就转换为内部编码方式,用命令【:set enc】 |
fencs(fileencodings) |
字符编码的列表,编码的自动识别就是通过设置fencs实现的。打开一个文件就是安装fencs中的编码顺序进行解码的。一般设置顺序为: set fileencodings= ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 |
这里对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=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 |
手工输入 |
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——依次向后切换到下一个窗格中