Vim使用小记(一)常用操作
By francis_hao Sep 22,2016
vim的功能自然不止如此,这里只是把日常使用频率较高的记录下来,若想了解vim的全部功能可查阅其帮助手册:help,或者查询指定命令的用法:help xx
选项
选项 | 说明 |
+[num] | 对第一个文件,在打开后,光标将会定位在第num行,如果num没有指定,光标将会定位在最后一行 |
+/<pat> | 对第一个文件,光标将会定位在第一次出现pat的地方,查看":help search-pattern" 了解可用的搜索模式 |
-o[N] | 以横向方式同时打开N个窗口,如果没有指定N,就为每个文件打开一个窗口 |
-O[N] | 以纵向方式同时打开N个窗口,如果没有指定N,就为每个文件打开一个窗口 |
基本用法
进入插入模式命令
i | 在光标前开始插入文本 |
a | 在光标后开始插入文本 |
o | 在当前行之下新开一行 |
O | 在当前行之上新开一行 |
光标移动命令
gg, :0 | 光标转到首行行首 |
G, :$ | 光标转到末行行首 |
0 | 光标移到本行行首 |
$ | 光标移到本行行尾 |
n+ | 光标下移n行 |
n- | 光标上移n行 |
nG, :n | 光标移至n行行首 |
Ctrl+u | 上翻半屏(up) |
Ctrl+d | 下翻半屏(down) |
Ctrl+b | 上翻一屏(backwards) |
Ctrl+f | 下翻一屏(forward) |
() | 句子移动 |
{} | 段落移动 |
H | 光标定位到屏幕顶部 |
M | 光标定位到屏幕中间 |
L | 光标定位到屏幕底部 |
w | 光标向前移动一个单词(word) |
b | 光标向后移动一个单词(back) |
e | 光标移动到当前单词的结尾(end) |
zt | 将当前行变为屏幕第一行(top) |
zz | 将当前行变为屏幕中间行 |
zb | 将当前行变为屏幕尾行 |
Ctrl+e | 屏幕上移一行但光标位置不变 |
Ctrl+y | 屏幕下移一行但光标不变 |
删除复制和替换
dd | 删除整行 |
d0 | 从当前位置删至行首 |
d$, D | 从当前位置删至行尾 |
ndd | 删除n行 |
dl | 删除光标位置一个字符 |
dw | 删除当前位置至单词结尾 |
cc | 删除当前行并进入插入模式,cl,cw类似d |
yy | 复制当前行,yl,yw类似d |
p | 粘贴 |
r | 修改光标所在位置字符 |
s | 删除光标所在位置字符并进入插入模式 |
u | 撤销上一次的操作 |
Ctrl+r | 恢复上一次的操作 |
查找和替换
/pattern | 从光标处开始向文件尾搜索pattern,在pattern后加\c可以不区分大小写 |
?patern | 从光标处开始向文件首搜索pattern |
n | 在同一方向重复上一次搜索命令 |
N | 在反方向重复上一次搜索命令 |
: nohlsearch (noh) | 取消搜索结果的高亮显示 |
:s/p1/p2/g | 将当前行中所有p1用p2替代 |
:n1,n2s/p1/p2/g | 将第n1至n2行中所有p1均用p2替代 :1,$从第一行到末行=% |
* | 向文件尾搜索匹配光标所在字 |
# | 向文件首匹配光标所在字 |
寄存器说明
vim里有许多寄存器,暂时只记录平时有用过的。
"" | 默认寄存器,文本来源命令d/c/s/x/y |
"0 | 复制缓存,来源为yy命令 |
"1-"9 | 删除缓存,来源为dd命令 |
"a-"z | 自定义的寄存器,不会被系统自动冲刷,总是存储最后一次使用的值。 "A-"Z : 向"a-"z寄存器中追加新内容而不是覆盖,虽然"A-"Z本身不是寄存器,但是却可以引用。 |
"ayy | 复制当前行并将其存放在"a寄存器中 |
"_ | 黑洞寄存器,只进不出 |
:reg | 查看寄存器里的值(全名为:registers) |
eg:
下图左侧是vi中的文字,1yy表示第一次执行yy命令,以下以此类推,右侧为执行后的寄存器中的值
扩展部分
杂项
v | 可视行 |
Ctrl+v | 可视列 |
Ctrl+g | 查看当前文件信息(文件名和行数) |
:!command | 暂时退出vi,执行command命令并输出结果 |
!!command | 执行command命令并将执行结果输出到当前行(覆盖方式) |
!}command | 执行command命令并将执行结果输出到当前行和之后的行中(覆盖方式) |
:r hello | 将hello文件读入当前文件中 |
:n1,n2 w>>fox | 将n1至n2追加到fox文件中 |
:Ex | (:Explore)开启目录浏览,可以浏览当前目录下的所有文件,可以选择 |
:Sex | (:Sexplore)水平分割当前窗口,并在一个窗口中开启目录浏览器 |
:shell | 不关闭vi切换到shell命令行,退回到vi使用:exit |
. | 重复上一个操作 |
多文件编辑
$vi f1 f2 f3 | 同时打开f1 f2 f3 |
:n | 切换到下一个文件(:next) |
:bn | 切换到下一个文件(:bnext) |
:prev | 切换到上一个文件(:previous) |
:bp | 切换到上一个文件(:bprevious) |
:n# |
切换最近两个文件 |
:e# | |
Ctrl+6 | |
:buffers | 显示缓冲区的文件列表 |
:ls | |
:b buffnum | 切换到buffnum的文件,buffnum是缓冲文件列表的值 |
:bd buffnum | 关闭buffnum的文件(:bdelete ) |
:rewind | 切换到第一个文件 |
:e f4 | 在缓冲区添加新的文件,和之前打开的文件属于并列关系 |
:e! | 重新载入当前文件,用在撤销当前所有做过的修改 |
:mksession! [name.vim] | 保存多文件会话状态 |
$vim –S name.vim | vim重载之前的多文件会话状态 |
:source name.vim | 手动重载之前会话 |
多标签
$vim –p f1 f2 f3 | 以多标签的方式打开多个文件 |
gt | 向右切换标签 |
gT | 向左切换标签 |
:tabnew filename | 添加一个新标签 |
:tabc | 关闭当前的tab |
:tabo | 关闭其他的tab只留当前一个 |
:tabs | 查看所有打开的tab |
:tabp | 前一个 |
:tabn | 后一个 |
set
vimrc | 系统 vimrc 文件: "/etc/vimrc"(优先级低) 用户 vimrc 文件: "$HOME/.vimrc" 第二用户 vimrc 文件: "~/.vim/vimrc" 用户 exrc 文件: "$HOME/.exrc"
vim的配置文件,一些配置信息可写入此文件中,但也可以在打开的文件中使用:set以实现一次性的功能 |
:version | 查看vim版本信息 |
" | .vimrc文件中的注释行 |
:set paste | 设置为粘贴模式,所见即所得,不会因为注释乱了格式 |
:set | 显示常用的设置值 |
:set list | 显示不可见字符 |
vi编码
set encoding=utf-8
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
程序员专用
杂项
K | 跳转到光标所在函数或命令的man手册 |
J | 将当前行的下一行合并到当前行 |
% | 跳转到匹配"{"对应的"}"的位置 |
gd | 跳到局部的变量定义处,不能跨文件 |
gf | 打开光标所在位置的文件名,一般是头文件 ctrl+w f分屏打开文件 |
> | 缩进,<:反缩进 |
Ctrl+o | 跳转到上一视图,可用于搜索后、使用gg|G跳转或tag跳转的返回 |
''(两个单引号) | 在上一视图和本视图之间切换 |
ma | 设置标签a,之后可以通过`a跳转到设置的标签a处,类似的标签:a-z |
~ | 可转换光标所在位置的字母大小写 |
gg=G | 整个文件重置缩进 |
2G=15G | 第二行至第15行重置缩进 |
:set ft=c | 设置文件类型是c (filetype) |
:filetype | 显示当前文件类型相关的设置 |
文件比较
$vimdiff f1 f2 | 直观的比较f1和f2的不同(vimdiff是shell下一个链接命令,指向vim) |
:vertical diffsplit xxx | 垂直方式比较当前文件和xxx文件 |
zo | 打开光标下面的一个折叠(open) |
zO | 打开光标下面的所有折叠 |
zc | 关闭光标下面的一个折叠(close) |
zC | 关闭光标下面的所有折叠 |
:set noscrollbind | 取消文件比较中的同步滚屏功能 |
]c | 跳到下一个修改点 |
[c | 跳到上一个修改点 |
:diffupdate | 在比较过程中,修改过一个文件后更新比较状态 |
dp | 把光标所在窗口的差异改到另一个窗口(:diffput) |
do | 把光标所在窗口的差异改为另一个窗口的(:diffget) o=obtain |
:diffoff! | 强制关闭比较模式 |
窗口分割
:split xxx | 打开xxx并与当前文件水平排列 |
:vsplit xxx | 打开xxx并与当前文件垂直排列, |
:15split xxx | 以占据15行的窗口打开文件xxx |
:new [xxx] | 新建(打开)一个与当前文件水平排列的文件 |
:vnew [xxx] | 新建(打开)一个与当前文件垂直排列的文件 |
ctrl+w w | 在打开的文件中跳转 |
Ctrl+w [hjkl] | 跳转到[左下上右]的窗口 |
Ctrl+w [tb] | 跳转到最上/最下的窗口 |
Ctrl+w [HJKL] | 把当前窗口移动到最[左下上右]边 |
Ctrl+w + | 扩大窗口(默认一行),5ctrl+w +(扩大5行) |
Ctrl+w = | 平分窗口 |
Ctrl+w _ | 扩大窗口到最大,带参数{height}ctrl+w _ |
:res(ize) num | 窗口大小调整为num行 |
:res(ize) +num | 窗口大小增加num行 |
:vertical res(ize) num | 窗口大小调整为num列 |
:close | 关闭当前的(不能是最后一个)的窗口 |
Ctrl+w c | |
:only | 关闭除当前窗口外的所有窗口 |
:qall | 关闭所有打开的窗口 |
:wall | 保存所有的打开的窗口文件 |
:wqall | 保存并退出 |
$vim –o f1 f2 f3 | 以水平排列方式打开三个文件 |
$vim –O f1 f2 f3 | 以垂直排列方式打开三个文件 |
:all | 将已经打开的多个文件分配水平的窗口 |
:vertical all | 将已经打开的多个文件分配垂直的窗口 |
Ctrl+w o | 只显示当前窗口, |
ctags
$ctags --list-languages | 显示ctags支持的语言 |
$ctags --list-maps | 默认支持的文件扩展名 |
$ctags -R | 给当前文件夹下的所有文件建立tags |
~set tags=/tags | 在.vimrc文件中设置tags的路径,如果有多个tags可以用","分割,或者set tags+=/tags进行添加。 |
:tag main | 可以从打开的文件中跳到main函数处,即使打开的文件中没有main函数(在别的文件中也可以跳过去) |
Ctrl+] | 以光标所在位置的单词为tag跳转 |
Ctrl+t | 跳回到之前的位置,可以在前面加上跳转的深度,3ctrl+t:跳回之前三层之上的位置 |
:tags | 列出已经跳转到过哪些tag了 |
:tag /^block<tab> | 查找以block开头的可能的tag |
Ctrl+w+] | 分割当前窗口并跳转到光标所在位置的tag处 |
:stag xxx | |
$vim –t tag | 找到tag(函数,结构体等)所在文件并打开 |
:tn | 多个匹配tags时跳转下一个(:tnext) |
:tp | 多个匹配tags时跳转上一个(:tprevious) |
本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/6517071.html
参考
【1】VIM使用系列:寄存器与复制粘贴缓冲区:https://my.oschina.net/shelllife/blog/144357
【2】VIM字符编码设置:http://www.cnblogs.com/freewater/archive/2011/08/26/2154602.html
【3】linux下vim中文乱码的解决方法:http://www.cnblogs.com/joeyupdo/archive/2013/03/03/2941737.html
【4】VIM技巧之分隔窗口:http://blog.chinaunix.net/uid-24673811-id-1994607.html
【5】vim中多标签和多窗口的使用:https://my.oschina.net/kutengshe/blog/464602
【6】开启文件类型检测:http://easwy.com/blog/archives/advanced-vim-skills-filetype-on/
【7】man vim