加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

vim快捷键

发布时间:2020-12-15 17:07:37 所属栏目:安全 来源:网络整理
导读:vim快捷键 vim模式 正常模式: 可以使用快捷键命令,或按:输入命令行。 插入模式: 可以输入文本,在正常模式下,按i、a、o等都可以进入插入模式。 可视模式 正常模式下按v可以进入可视模式,在可视模式下,移动光标可以选择文本。按V进入可视行模式,总是整

vim快捷键

vim模式

  1. 正常模式:

    可以使用快捷键命令,或按:输入命令行。
  2. 插入模式:

    可以输入文本,在正常模式下,按i、a、o等都可以进入插入模式。
  3. 可视模式

    正常模式下按v可以进入可视模式,在可视模式下,移动光标可以选择文本。按V进入可视行模式,总是整行整行的选中。ctrl+v进入可视块模式。
  4. 替换模式

    正常模式下,按R进入。

启动vim

vim-ccmdfile在打开文件前,先执行指定的命令
vim-rfile恢复上次异常退出的文件
vim-Rfile以只读的方式打开文件,但可以强制保存
vim-Mfile以只读的方式打开文件,不可以强制保存
vim-ynumfile将编辑窗口的大小设为num行
vim+file从文件的末尾开始
vim+numfile从第num行开始
vim+/stringfile打开file,并将光标停留在第一个找到的string上
vim--remotefile用已有的vim进程打开指定的文件。如果你不想启用多个vim会话,这个很有用。但要注意,如果你用vim,会寻找名叫VIM的服务器;如果你已经有一个gvim在运行了,你可以用gvim--remotefile在已有的gvim中打开文件

文档操作

:efile关闭当前编辑的文件,并开启新的文件如果对当前文件的修改未保存,vi会警告
:e!file放弃对当前文件的修改,编辑新的文件
:e+file开始新的文件,并从文件尾开始编辑
:e+nfile开始新的文件,并从第n行开始编辑
:enew编译一个未命名的新文档。(CTRL-Wn)
:e重新加载当前文档
:e!重新加载当前文档,并丢弃已做的改动
:e#或ctrl+^回到刚才编辑的文件,很实用
:f或ctrl+g显示文档名,是否修改,和光标位置
:ffilename改变编辑的文件名,这时再保存相当于另存为。
gf打开以光标所在字符串为文件名的文件。
:w保存修改
:n1,n2wfilename选择性保存从某n1行到另n2行的内容
:wq保存并退出
ZZ保存并退出
:x保存并退出
:q[uit]退出当前窗口(CTRL-Wq或CTRL-WCTRL-Q)
:saveasnewfilename另存为
:Sex水平分割一个窗口,浏览文件系统
:Vex垂直分割一个窗口,浏览文件系统

光标的移动

基本移动

在normal模式下

h或退格左移一个字符
l或空格右移一个字符
j下移一行
k上移一行
gj移动到一段内的下一行
gk移动到一段内的上一行
+或Enter把光标移至下一行第一个非空白字符
-把光标移至上一行第一个非空白字符
w前移一个单词,光标停在下一个单词开头
W移动下一个单词开头,但忽略一些标点
e前移一个单词,光标停在下一个单词末尾
E移动到下一个单词末尾,如果词尾有标点,则移动到标点
b后移一个单词,光标停在上一个单词开头
B移动到上一个单词开头,忽略一些标点
ge后移一个单词,光标停在上一个单词末尾
gE同ge,不过‘单词’包含单词相邻的标点
(前移1句
)后移1句
{前移1段
}后移1段
fc把光标移到同一行的下一个c字符处
Fc把光标移到同一行的上一个c字符处
tc把光标移到同一行的下一个c字符前
Tc把光标移到同一行的上一个c字符后
;配合f&t使用,重复一次,配合f&t使用,反向重复一次
0移动到行首
g0移到光标所在屏幕行行首
^移动到本行第一个非空白字符
g^同^,但是移动到当前屏幕行第一个非空字符处
$移动到行尾
g$移动光标所在屏幕行行尾
n|把光标移到递n列上
nG到文件第n行
:n<cr>移动到第n行
:$<cr>移动到最后一行
H把光标移到屏幕最顶端一行
M把光标移到屏幕中间一行
L把光标移到屏幕最底端一行
gg到文件头部
G到文件尾部

翻屏操作

ctrl+f下翻一屏
ctrl+b上翻一屏
ctrl+d下翻半屏
ctrl+u上翻半屏
ctrl+e向下滚动一行
ctrl+y向上滚动一行
n%到文件n%的位置
zz将当前行移动到屏幕中央
zt将当前行移动到屏幕顶端
zb将当前行移动到屏幕底端

标记

m{a-z}标记光标所在位置,局部标记,只用于当前文件
m{A-Z}标记光标所在位置,全局标记。标记之后,退出Vim,重新启动,标记仍然有效
`{a-z}移动到标记位置
'{a-z}移动到标记行的行首
`{0-9}回到上[2-10]次关闭vim时最后离开的位置
``移动到上次编辑的位置。''也可以,不过``精确到列,而''精确到行。如果想跳转到更老的位置,可以按C-o,跳转到更新的位置用C-i
`"移动到上次离开的地方
`.移动到最后改动的地方
:marks显示所有标记
:delmarksab删除标记a和b
:delmarksa-c删除标记a、b和c
:delmarksac-f删除标记a、c、d、e、f
:delmarks!删除当前缓冲区的所有标记
:helpmark-motions查看更多关于mark的知识

插入文本

基本插入

i在光标前插入;一个小技巧:按8,再按i,进入插入模式,输入=,按esc进入命令模式,就会出现8个=。这在插入分割线时非常有用,如30i+<esc>就插入了36个+组成的分割线
I在当前行第一个非空字符前插入
gI在当前行第一列插入
a在光标后插入
A在当前行最后插入
o在下面新建一行插入
O在上面新建一行插入
:rfilename在当前位置插入另一个文件的内容
:[n]rfilename在第n行插入另一个文件的内容
:r!date在光标处插入当前日期与时间。同理,:r!command可以将其它shell命令的输出插入当前文档

改写插入

c[n]w改写光标后1(n)个词。
c[n]l改写光标后n个字母。
c[n]h改写光标前n个字母。
[n]cc修改当前[n]行。
[n]s以输入的文本替代光标之后1(n)个字符,相当于c[n]l。
[n]S删除指定数目的行,并以所输入文本代替之。

剪切复制和寄存器

剪切和复制、粘贴

[n]x剪切光标右边n个字符,相当于d[n]l
[n]X剪切光标左边n个字符,相当于d[n]h
y复制在可视模式下选中的文本
yyorY复制整行文本
y[n]w复制一(n)个词
y[n]l复制光标右边1(n)个字符
y[n]h复制光标左边1(n)个字符
y$从光标当前位置复制到行尾
y0从光标当前位置复制到行首
:m,ny<cr>复制m行到n行的内容
y1G或ygg复制光标以上的所有行
yG复制光标以下的所有行
yaw和yas复制一个词和复制一个句子,即使光标不在词首和句首也没关系
d删除(剪切)在可视模式下选中的文本
d$orD删除(剪切)当前位置到行尾的内容
d[n]w删除(剪切)1(n)个单词
d[n]l删除(剪切)光标右边1(n)个字符
d[n]h删除(剪切)光标左边1(n)个字符
d0删除(剪切)当前位置到行首的内容
[n]dd删除(剪切)1(n)行
:m,nd<cr>剪切m行到n行的内容
d1G或dgg剪切光标以上的所有行
dG剪切光标以下的所有行
daw和das剪切一个词和剪切一个句子,即使光标不在词首和句首也没关系
d/f<cr>这是一个比较高级的组合命令,它将删除当前位置到下一个f之间的内容
p在光标之后粘贴
P在光标之前粘贴

文本对象

aw一个词
as一句
ap一段
ab一块(包含在圆括号中的)

寄存器

a-z都可以用作寄存器名。"ayy把当前行的内容放入a寄存器
A-Z用大写字母索引寄存器,可以在寄存器中追加内容。如"Ayy把当前行的内容追加到a寄存器中
:reg显示所有寄存器的内容
""不加寄存器索引时,默认使用的寄存器
"*当前选择缓冲区,"*yy把当前行的内容放入当前选择缓冲区
"+系统剪贴板。"+yy把当前行的内容放入系统剪贴板

查找和替换

查找

/something在后面的文本中查找something
?something在前面的文本中查找something
/pattern/+number将光标停在包含pattern的行后面第number行上
/pattern/-number将光标停在包含pattern的行前面第number行上
n向后查找下一个
N向前查找下一个

替换

:s/old/new用new替换当前行第一个old
:s/old/new/g用new替换当前行所有的old
:n1,n2s/old/new/g用new替换文件n1行到n2行所有的old
:%s/old/new/g用new替换文件中所有的old
:%s/^/xxx/g在每一行的行首插入xxx,^表示行首
:%s/$/xxx/g在每一行的行尾插入xxx,$表示行尾所有替换命令末尾加上c,每个替换都将需要用户确认。如:%s/old/new/gc,加上i则忽略大小写(ignore)如果不指定range,则表示当前行。
m,n从m行到n行。
0最开始一行(可能是这样)。
$最后一行
.当前行
%所有行

正则表达式

d表示十进制数
s表示空格
S非空字符
a英文字母
|表示或
.表示.
{m,n}表示m到n个字符。这要和s与a等连用,如a{m,n}表示m到n个英文字母
{m,}表示m到无限多个字符
**当前目录下的所有子目录
:helppattern得到更多帮助

排版

基本排版

<<向左缩进一个shiftwidth
>>向右缩进一个shiftwidth
:ce(nter)本行文字居中
:le(ft)本行文字靠左
:ri(ght)本行文字靠右
gq对选中的文字重排,即对过长的文字进行断行
gqq重排当前行
gqnq重排n行
gqap重排当前段
gqnap重排n段
gqnj重排当前行和下面n行
gqQ重排当前段对文章末尾
J拼接当前行和下一行
gJ同J,不过合并后不留空格

拼写检查

:setspell开启拼写检查功能
:setnospell关闭拼写检查功能
]s移到下一个拼写错误的单词
[s作用与上一命令类似,但它是从相反方向进行搜索
z=显示一个有关拼写错误单词的列表,可从中选择
zg告诉拼写检查器该单词是拼写正确的
zw与上一命令相反,告诉拼写检查器该单词是拼写错误的

编辑多个文件

一次编辑多个文件

使用:next(:n)编辑下一个文件
:2n编辑下2个文件
使用:previous或:N编辑上一个文件
使用:wnext,保存当前文件,并编辑下一个文件
使用:wprevious,保存当前文件,并编辑上一个文件
使用:args显示文件列表
:nfilenames或:argsfilenames指定新的文件列表
vi-ofilenames在水平分割的多个窗口中编辑多个文件
vi-Ofilenames在垂直分割的多个窗口中编辑多个文件

多标签编辑

vim-pfiles打开多个文件,每个文件占用一个标签页
:tabe,tabnew如果加文件名,就在新的标签中打开这个文件,否则打开一个空缓冲区
^wgf在新的标签页里打开光标下路径指定的文件
:tabn切换到下一个标签。Control+PageDown,也可以
:tabp切换到上一个标签。Control+PageUp,也可以
[n]gt切换到下一个标签。如果前面加了n,就切换到第n个标签。第一个标签的序号就是1
:tabsplit将当前缓冲区的内容在新页签中打开
:tabc[lose]关闭当前的标签页
:tabo[nly]关闭其它的标签页
:tabs列出所有的标签页和它们包含的窗口
:tabm[ove][N]移动标签页,移动到第N个标签页之后。如tabm0当前标签页,就会变成第一个标签页

缓冲区

:buffers或:ls或:files显示缓冲区列表
ctrl+^在最近两个缓冲区间切换
:bn下一个缓冲区
:bp上一个缓冲区
:bl最后一个缓冲区
:b[n]或:[n]b切换到第n个缓冲区
:nbw(ipeout)彻底删除第n个缓冲区
:nbd(elete)删除第n个缓冲区,并未真正删除,还在unlisted列表中
:ba[ll]把所有的缓冲区在当前页中打开,每个缓冲区占一个窗口

分屏编辑

vim-ofile1file2水平分割窗口,同时打开file1和file2
vim-Ofile1file2垂直分割窗口,同时打开file1和file2

水平分割

:split(:sp)把当前窗水平分割成两个窗口。(CTRL-Ws或CTRL-WCTRL-S)注意如果在终端下,CTRL-S可能会冻结终端,请按CTRL-Q继续
:splitfilename水平分割窗口,并在新窗口中显示另一个文件
:nsplit(:nsp)水平分割出一个n行高的窗口
:[N]new水平分割出一个N行高的窗口,并编辑一个新文件。(CTRL-Wn或CTRL-WCTRL-N)
ctrl+wf水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件
C-wC-^水平分割一个窗口,打开刚才编辑的文件

垂直分割

:vsplit(:vsp)把当前窗口分割成水平分布的两个窗口(CTRL-Wv或CTRLCTRL-V)
:[N]vne[w]垂直分割出一个新窗口
:vertical水平分割的命令:相应的垂直分割

关闭子窗口

:qall关闭所有窗口,退出vim
:wall保存所有修改过的窗口
:only只保留当前窗口,关闭其它窗口(CTRL-Wo)
:close关闭当前窗口,CTRL-Wc能实现同样的功能(象:q:x同样工作)

调整窗口大小

ctrl+w+当前窗口增高一行。也可以用n增高n行
ctrl+w-当前窗口减小一行。也可以用n减小n行
ctrl+w_当前窗口扩展到尽可能的大。也可以用n设定行数
:resizen当前窗口n行高
ctrl+w=所有窗口同样高度
nctrl+w_当前窗口的高度设定为n行
ctrl+w<当前窗口减少一列。也可以用n减少n列
ctrl+w>当前窗口增宽一列。也可以用n增宽n列
ctrl+w|当前窗口尽可能的宽。也可以用n设定列数

切换和移动窗口

ctrl+wctrl+w切换到下一个窗口或者是ctrl+ww
ctrl+wp切换到前一个窗口
ctrl+wh(l,j,k)切换到左(右,下,上)的窗口
ctrl+wt(b)切换到最上(下)面的窗口<BR>
ctrl+wH(L,K,J)将当前窗口移动到最左(右、上、下)面
ctrl+wr旋转窗口的位置
ctrl+wT将当前的窗口移动到新的标签页上

快速编辑

改变大小写

~反转光标所在字符的大小写
可视模式下的U或u把选中的文本变为大写或小写
gu(U)接范围(如$,或G),可以把从光标当前位置到指定位置之间字母全部转换成小写或大写。如ggguG,就是把开头到最后一行之间的字母全部变为小写。再如gu5j,把当前行和下面四行全部变成小写

替换 (normal模式)

r替换光标处的字符,同样支持汉字
R进入替换模式,按esc回到正常模式

撤销与重做(normal模式)

[n]u取消一(n)个改动。
:undo5撤销5个改变。
:undolist你的撤销历史。
ctrl+r重做最后的改动。
U取消当前行中所有的改动。
:earlier4m回到4分钟前
:later55s前进55秒

.重复上一个编辑动作
qa开始录制宏a(键盘操作记录)
q停止录制
@a播放宏a

编辑特殊文件

文件加密

vim-xfile开始编辑一个加密的文件
:X为当前文件设置密码
:setkey=去除文件的密码

文件的编码

:e++enc=utf8filename让vim用utf-8的编码打开这个文件
:w++enc=gbk不管当前文件什么编码,把它转存成gbk编码
:setfenc或:setfileencoding查看当前文件的编码
fileencoding=ucs-bom,utf-8,cp936vim会根据要打开的文件选择合适的编码。注意:编码之间不要留空格。cp936对应于gbk编码。ucs-bom对应于windows下的文件格式

文件格式

大致有三种文件格式:unix,dos,mac. 三种格式的区别主要在于回车键的编码:dos 下是回车加换行,unix 下只有 换行符,mac 下只有回车符。

:e++ff=dosfilename让vim用dos格式打开这个文件
:w++ff=macfilename以mac格式存储这个文件
:setff显示当前文件的格式
在vimrc中添加setfileformats=unix,mac,让vim自动识别文件格式

编辑辅助

按键

gd跳转到局部变量的定义处
gD跳转到全局变量的定义处,从当前文件开头开始搜索
g;上一个修改过的地方
g,下一个修改过的地方
[[跳转到上一个函数块开始,需要有单独一行的{
]]跳转到下一个函数块开始,需要有单独一行的{
[]跳转到上一个函数块结束,需要有单独一行的}
][跳转到下一个函数块结束,需要有单独一行的}
[{跳转到当前块开始处
]}跳转到当前块结束处
[/跳转到当前注释块开始处
]/跳转到当前注释块结束处
%不仅能移动到匹配的(),{}或[]上,而且能在#if,#else,#endif之间跳跃
ci',di',yi'修改、剪切或复制'之间的内容
ca',da',ya'修改、剪切或复制'之间的内容,包含'
ci",di",yi"修改、剪切或复制"之间的内容
ca",da",ya"修改、剪切或复制"之间的内容,包含"
ci(,di(,yi(修改、剪切或复制()之间的内容
ca(,da(,ya(修改、剪切或复制()之间的内容,包含()
ci[,di[,yi[修改、剪切或复制[]之间的内容
ca[,da[,ya[修改、剪切或复制[]之间的内容,包含[]
ci{,di{,yi{修改、剪切或复制{}之间的内容
ca{,da{,ya{修改、剪切或复制{}之间的内容,包含{}
ci<,di<,yi<修改、剪切或复制<>之间的内容
ca<,da<,ya<修改、剪切或复制<>之间的内容,包含<>

ctags

ctags-R生成tag文件,-R表示也为子目录中的文件生成tags
:settags=path/tags告诉ctags使用哪个tag文件
:tagxyz跳到xyz的定义处,或者将光标放在xyz上按C-],返回用C-t
:stagxyz用分割的窗口显示xyz的定义,或者C-w],如果用C-wn],就会打开一个n行高的窗口
:ptagxyz在预览窗口中打开xyz的定义,热键是C-w}
:pclose关闭预览窗口。热键是C-wz
:peditabc.h在预览窗口中编辑abc.h
:psearchabc搜索当前文件和当前文件include的文件,显示包含abc的行
:[n]tnext下一[n]个匹配
:[n]tprev上一[n]个匹配
:tfirst第一个匹配
:tlast最后一个匹配
:tselecttagname打开选择列表
:tagxyz<tab>补齐以xyz开头的tag名,继续按tab键,会显示其他的
:tag/xyz<tab>会用名字中含有xyz的tag名补全

cscope

cscope-Rbq生成cscope.out文件
csadd/path/to/cscope.out/your/work/dir
:csfindcfunc查找func在哪些地方被调用
:cw打开quickfix窗口查看结果

gtags

Gtags综合了ctags和cscope的功能。 使用Gtags之前,你需要安装GNU Gtags。 然后在工程目录运行 gtags 。

:Gtagsfuncname定位到funcname的定义处
:Gtags-rfuncname查询funcname被引用的地方
:Gtags-ssymbol定位symbol出现的地方
:Gtags-gstringGotostring出现的地方。:Gtags-gistring忽略大小写
:Gtags-ffilename显示filename中的函数列表。你可以用:Gtags-f%显示当前文件
:Gtags-Ppattern显示路径中包含特定模式的文件。如:Gtags-P.h$显示所有头文件,:Gtags-P/vm/显示vm目录下的文件

快速修改窗口

:copen打开快速修改窗口
:cclose关闭快速修改窗口

快速修改窗口在make程序时非常有用,当make之后:

:cl在快速修改窗口中列出错误
:cn定位到下一个错误
:cp定位到上一个错误
:cr定位到第一个错误

自动补全

C-xC-s拼写建议
C-xC-v补全vim选项和命令
C-xC-l整行补全
C-xC-f自动补全文件路径。弹出菜单后,按C-f循环选择,当然也可以按C-n和C-p
C-xC-p和C-xC-n用文档中出现过的单词补全当前的词。直接按C-p和C-n也可以
C-xC-o编程时可以补全关键字和函数名啊
C-xC-i根据头文件内关键字补全
C-xC-d补全宏定义
C-xC-n按缓冲区中出现过的关键字补全。直接按C-n或C-p即可

当弹出补全菜单后:

C-p向前切换成员
C-n向后切换成员
C-e退出下拉菜单,并退回到原来录入的文字
C-y退出下拉菜单,并接受当前选项

多行缩进缩出

正常模式下,按两下>;光标所在行会缩进
如果先按了n,再按两下>;,光标以下的n行会缩进
对应的,按两下<;,光标所在行会缩出
如果在编辑代码文件,可以用=进行调整
在可视模式下,选择要调整的代码块,按=,代码会按书写规则缩排好
或者n=,调整n行代码的缩排

折叠

zf创建折叠的命令,可以在一个可视区域上使用该命令
zd删除当前行的折叠
zD删除当前行的折叠
zfap折叠光标所在的段
zo打开折叠的文本
zc收起折叠
za打开/关闭当前折叠
zr打开嵌套的折行
zm收起嵌套的折行
zR(zO)打开所有折行
zM(zC)收起所有折行
zj跳到下一个折叠处
zk跳到上一个折叠处
zienable/disablefold

命令行

命令行模式下快捷键

上下方向键上一条或者下一条命令。如果已经输入了部分命令,则找上一条或者下一条匹配的命令
左右方向键左/右移一个字符
C-w向前删除一个单词
-h向前删除一个字符,等同于Backspace
C-u从当前位置移动到命令行开头
C-b移动到命令行开头
C-e移动到命令行末尾
Shift-Left左移一个单词
Shift-Right右移一个单词
@重复上一次的冒号命令
q正常模式下,q然后按':',打开命令行历史缓冲区,可以像编辑文件一样编辑命令
q/和q?可以打开查找历史记录

执行外部命令

:!cmd执行外部命令
:!!执行上一次的外部命令
:sh调用shell,用exit返回vim
:r!cmd将命令的返回结果插入文件当前位置
:m,nw!cmd将文件的m行到n行之间的内容做为命令输入执行命令

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读