工欲善其事必先利其器,最近常常进行远程开发,vim就是手里的镰刀了,整理和熟悉了vim的一些便捷方法,磨刀霍霍向Code。
简介
vi编辑器是所有Unix及Linux系统下标准的编辑器,就相当于windows系统中的记事本一样,但它的强大不逊色于任何最新的文本编辑器。
vim编辑器是在vi的基础上改进的版本,支持语法颜色、正则表达式、多文件编辑、视图模式等等。
打开文件
命令 | 说明 |
---|---|
vim [filename] |
打开/创建文件,如果文件存在则打开,不存在则会创建 |
vim +n [filename] |
打开文件,并将光标置于第n行首 |
vim +/pattern [filename] |
打开文件,并将光标置于第一个与pattern匹配的串处 |
vim -c "e ++enc=[fileencoding]" [filename] |
以指定编码打开/创建文件 |
vim -r [filename] |
上次未保存,恢复文件并编辑 |
vim -b [filename] |
以二进制打开文件,在命令行模式下, 输入:%!xxd 可以以16进制格式显示 |
模式介绍及切换
0.Vim所有模式
- 正常模式(normal-mode)
- 插入模式(insert-mode)
- 可视模式(visual-mode)
- 命令模式(command-mode)
1.正常模式
一般情况下,打开Vim首先都是处于正常模式。
正常模式主要用来浏览和修改文本内容的,正常模式的修改和编辑文本不同,正常模式下只能使用对应的快捷按钮来执行特定的修改。
在任何模式下,只要按下 Esc 键就可以返回正常模式。
2.插入模式
插入模式用来编辑文本,在正常模式键入以下字符则进入插入模式。
字符 | 说明 |
---|---|
i | 插入光标所在字符前 |
I | 插入此行第一个非空白字符处 |
a | 插入光标所在字符后 |
A | 插入行尾 |
s | 删除光标所在的字符并进入插入模式 |
S | 删除光标所在行并进入插入模式 |
o | 在光标所在行的下面插入一新行 |
O | 在光标所在行的上面一新行 |
3.可视模式
可视模式相当于高亮选取文本后的普通模式。
可视模式具有两个子模式,以行为单位进行选取的可视行模式,使用“V”键进入(也就是SHIFT-v
);和以块为单位进行选取的可视块模式,使用CTRL-v
键进入。
4.命令模式
命令模式则多用于操作文本文件(而不是操作文本文件的内容),例如保存文件;或者用来改变编辑器本身的状态,例如设定多栏窗口、标签或者退出编辑器等等。
在正常模式或可视模式下,输入冒号(:)、反斜杠(/)、问号(?)进入命令模式。
正常模式
快捷命令:
按键 | 说明 |
---|---|
[N]h |
向左 |
[N]j |
向下 |
[N]k |
向上 |
[N]l |
向右 |
CTRL-D |
向下滚动半屏 |
CTRL-U |
向上滚动半屏 |
CTRL-F |
向下滚动一屏 |
CTRL-B |
向上滚动一屏 |
[N]x |
删除当前字符,前面加数字,删除N个字符 |
[N]dd |
删除行,前面加数字,删除N行,删除的内容自动添加到剪切板 |
[N]yy |
复制行,前面加数字,复制N行 |
yw |
从光标处复制至一个单子/单词的末尾,包括空格(同vey ) |
ye |
从光标处复制至一个单子/单词的末尾,不包括空格 |
y$ |
从当前光标复制到行末 |
y0 |
从当前光标位置(不包括光标位置)复制之行首 |
[N]p |
粘贴剪切板中的内容到当前行之后 |
[N]u |
撤销上一次操作 |
CTRL-R |
重做(反向撤销) |
[N]$ |
移动到当前行行尾,前面加数字,移动到当前行的第N行行尾,1表示当前行 |
^ |
移动到当前行的第一个非空白字符 |
0 |
移动到当前行的第一个字符 |
[N]fx/[N]Fx |
向下/向上查找当前行的下一个字符x,前面加数字,移动到第N个x(分号(;)/逗号(,)重复向右/向左查找) |
% |
跳转匹配的括号、方括号、花括号,如果当前位置不处在任何可用的括号上,会自动向下找到第一个括号 |
J |
删除当前行的末尾换行符 |
gg |
跳转到第一行 |
[N]G |
跳转到第N行,不带N,则跳转到最后一行 |
gd |
在当前函数内查找当前光标下的单词,如果找到,就跳转到该单词在函数内第一次出现的地方。对局部变量来说,也就是跳转到变量定义处。 |
gD |
在当前文件内查找当前光标下的单词,如果找到,就跳转到该单词在文件内第一次出现的地方。对全局变量来说,也就是跳转到全局变量定义处。对局部变量来说,也能跳转到局部变量定义处。 |
[m |
跳转到当前光标往上的最近一个函数开头 |
]M |
跳转到当前函数末尾 |
[M |
跳转到上一函数的末尾 |
]m |
跳转到下一函数的开头 |
[N]% |
跳转到当前文档的N% |
H/M/L |
跳转到当前屏幕的头/中/尾段 |
CTRL-G |
显示当前行在文本中的位置(文件名、行数、百分比) |
zz |
将当前位置移动到屏幕正中央 |
zt |
将当前位置移动到屏幕顶端 |
zb |
将当前位置移动到屏幕底端 |
ZZ |
保存并退出 |
可视模式
在此模式下你可以选择一个矩形的文本块. Vim提供了一些特别的命令来操纵这个文本块:
命令 | 说明 |
---|---|
y | 复制 |
x/d | 删除 |
$ | 会让每一行的被选择区域扩展到该行的末尾, 不管这些行的长短是否参差不齐. 这种选择状态持续到你发出下一个改变水平选择域的命令. 所以使用命令”j”会保持这种状态,而”h”命令则会停止它. |
~ | 交换大小写 |
U | 将小写变大写 |
u | 将大写变小写 |
r | 使整个文本块的内容全部以一个字符来填充,如rx |
[N]> | 文本块向右移动N个”shift 单位” |
[N]< | 文本块向左移动N个”shift 单位” |
J | 使文本块纵跨的所有文本行被连接为一行 |
gJ | 如果你想保留那些前导空白和后辍空白, 用”gJ”命令来代替”J” |
命令模式
保存文件
命令 | 说明 |
---|---|
:w |
保存文件 |
:w newfile |
另存为,把当前文档保存到指定的newfile中,原有文档保持不变 |
:wq |
保存并退出 |
:q |
强制退出 |
! |
在命令后加感叹号,表示强制执行 |
:e! |
放弃所有修改并重新载入原始内容 |
搜索
命令 | 说明 |
---|---|
/[string] |
搜索字符串,找到之后按n重复搜索 |
?[string] |
反向搜索(打出?或者/之后,按上下键可以切换历史搜索) |
[N]* |
正常模式中,*号会选取当前光标所在的单词并将它作为目标字符串向下搜索 |
[N]# |
同上,向上搜索 |
替换
命令::[range]substitute/from/to/[flags]
说明:[range]指定的行中的字符串”from”替换为”to”(substitute可缩写为s),例如::%s/from/to/g
,将所有”from”替换为”to”。
range:
range | 说明 |
---|---|
1 | 第一行 |
1,5 | 第1行至第5行(包括第1行和第5行) |
5,$ | 第5行至最后一行 |
5,$-2 | 第5行至最倒数第3行 |
% | 所有行 |
.,.+4 | 按下“5:”,会自动显示,它将作用的范围是”.”(当前行)到”.+4”(当前行到向下4行) |
‘<,’> | 在视图模式选定了文本后按下”:”,会自动显示,代表选定的文本所在的范围 |
flags:
flags | 说明 |
---|---|
g | 改变一行中所有符合的目标字符串,否则只替换一行中第一次发现的字符串 |
c | 在执行每个替换前要求用户确认 |
p | 列出每个被它改变的行 |
flags-c
vim会在找到第一个目标字符(“xx”)后显示下面信息并要求你回答:
replace with xx (y/n/a/q/l/^E/^Y)?
此时, 你可以有几种答案 :
字符 | 说明 |
---|---|
y | 替换 |
n | 不,先留着 |
a | 全部替换 |
q | 退出 |
l | 替换当前退出 |
CTRL-E | 向上滚屏一行 |
CTRL-Y | 向下滚屏一行 |
设置
命令 | 说明 |
---|---|
:set [option]? |
显示option的值 |
:set [no]number |
显示/关闭每行的行号 |
:set [no]ignorecase |
设置/关闭搜索时忽略大小写 |
:set [no]wrap |
打开/关闭自动换行 |
:set list |
将TAB符号以^I显示,行尾显示$字符 |
:set tabstop=4 |
设置读取到的tab制表符的显示宽度 |
:set shiftwidth=4 |
设置tab制表符宽度 |
:set expandtab |
将tab转成space,实际存储也是space |
:retab! |
将既有的tab转成space,可在上一条命名后调用 |
:set listchars=tab:>-,trail:- |
TAB显示为”>—-“,行尾空格显示为”-“(tab:后可设置任意两个字符,trail:后可设置任意一个字符) |
:set filetype |
设置文件类型,vim会根据文件类型进行着色 |
:set syntax=ON |
打开语法高亮 |
:set ruler |
这会在Vim窗口的右下角显示当前光标位置 |
:set hlsearch |
设置查找字符高亮显示 |
:set history=50 |
设置冒号命令和搜索命令的命令历史列表的长度 |
:set [no]autowrite |
打开/关闭自动保存 |
多文件编辑
命令 | 说明 |
---|---|
:help {subject} |
显示帮助信息,带有子主题则直接进入子主题的Help页面,也可以使用vim turot 直接进入指南 |
:open [file_name] |
(:e)打开一个文件,在当前窗口(也可使用vim file1 file2 直接打开多个文件) |
:Sex |
水平分割当前窗口,并在一个窗口中开启目录浏览器 |
:all |
同一窗口的多个文件,上下新建窗口展开(也可使用vim -o file1 file2 ) |
:vertical all |
左右新建窗口展开(也可使用vim -O file1 file2 ) |
:[N]new [file_name] |
打开一个文件,并新开一个窗口,上下分屏(前面加一个数字表示打开一个N行高的窗口) |
:[N]vnew [file_name] |
左右分屏 |
:[N]split [file_name] |
(:sp)打开一个文件,并新开一个窗口,默认上下分屏 |
:[N]vsplit [file_name] |
(:vs)打开一个文件,并新开一个窗口,左右分屏 |
CTRL-6 |
两个文件间切换 |
:bn |
下一文件,同一窗口下不同文件间切换 |
:bp |
上一文件,同一窗口下不同文件间切换 |
:ls |
列出所有已打开的文件 |
:b[N] |
切换到第N个文件 |
CTRL-w-w |
依次切换窗口 |
CTRL-w-h/j/k/l/t/b |
窗口间跳转(左/下/上/右/顶部/底部),h/j/k/l 也可用方向键代替 |
CTRL-w-r/R |
向右或向下方交换窗口,r和R方向相反 |
CTRL-w-x/X |
交换同列或同行的窗口的位置。默认与它下一个窗口的位置交换,如果下方没有窗口,则试着与上一个窗口交换位置 |
:only |
保留当前窗口,关闭其他窗口 |
:ctrl-w-+ |
窗口大小调整,显示行数增加 |
:ctrl-w-- |
窗口大小调整,显示行数减小 |
:res(ize) [N] |
显示窗口调整为N行 |
:res(ize) [+/-][N] |
显示窗口+/-N行 |
:vertical res(ize) [N] |
显示窗口调整为N列 |
:vertical res(ize) [+/-][N] |
显示窗口+/-N列 |
高级功能
系统/换行符格式转换
有的脚本文件如果在Windows上编辑,传到Uinx下会出现格式问题而无法执行。
在vim中使用以下命令,将dos文件格式转换为unix格式:
:set fileformat=unix
fileformat 有三种格式可选:
格式 | 换行符 |
---|---|
dos | |
unix | |
mac |
查看当前文件系统格式:
:set fileformat?
编码格式转换
查看当前文件编码格式:
set fileencoding?
转换编码格式:
:set fileencoding=xx
配置
vim 支持将配置保存,在启动的时候vim会加载这个配置文件。
Unix和Macintosh的位置:~/.vimrc
,Windows的位置在:$HOME/_vimrc
或者$VIM/_vimrc
。
vimrc示例:Example vimrc,网上也有很多酷炫的配置,可以根据自己的需要和喜好找找。
SSH时从系统复制到vim
使用XShell以SSH远程编辑服务器的文件时,怎么从系统直接复制粘贴到vim中。
系统复制到剪切板,vim进入插入模式,快捷键shift + insert
粘贴到vim。
自动对齐
在命令模式下(即非“插入”等编辑模式),先输入gg,这时候光标会移动到第一行第一个字符,然后按 “=” 号之后切换成大写,再按一下G,这时候光标会移到最后一行的第一个字符,这时候就可以看到代码被排得整整齐齐了!
“gg”将光标移动到代码首部,”=”表示对齐指令,”G”表示代码尾部,所以执行”gg=G”后,该文件的所有代码都将对齐。
如果只需要将一部分代码对齐,可以先用”v”选中要对齐的代码块,然后按”=”进行对齐。或者使用mG=nG
,例如:从80行缩进直到100行,你可以用 80G=100G
vim和shell切换
方法1:
vim->shell: ctrl-z
(挂起vim进程,相当于图形界面中的最小化)
shell->vim:fg
(foreground)
方法2:
vim->shell: vim下执行:shell”
(创建一个新的shell)
shell->vim: shell下执行exit
(退出创建的shell)
颜色有误
Vim处理颜色时并不是通读整个文件进行解析.。它从你浏览的地方开始解析,这样会节省很多时间,但是有时候颜色就会弄错。
一个简单的办法是用CTRL-L
。或者稍往回滚动几行。
shell翻页
在shell中操作时不想插鼠标,那怎么上下页呢,键盘命令操作滚动条命令:Shift + PageUp/PageDown
图像编辑器常用功能
功能 | 命令 |
---|---|
多行调整缩进 | (命令模式):n1,n2> / :n1,n2< |
(可视模式)选中多行,shift+> / shift+< |
|
返回上一编辑位置 | 上一位置:CTRL-o /下一位置:CTRL-i |
转到函数/变量定义 | gD |
复制某个单词 | yiw |
选中某个单词 | viw ,d、y、v分别是删除、复制、选中的意思,它们后面可跟a、i,效果是包括、不包括空格,再在后面跟w、s、p、t,分别代表word、sentence、paragraph、tag |
查找某个单词 | * ,向下查找当前单词 |
自动补全
Inset模式中,使用Ctrl-N
或Ctrl-P
键,将按照‘complete’选项指定的范围来搜索匹配的关键字。其默认值为:
1 | :set complete=.,w,b,u,t,i |
也就是说,默认将在以下来源中查找关键字:
- 在当前缓冲区中进行查找;
- 在其他窗口中进行查找;
- 在其他已载入的缓冲区中进行查找;
- 在没有载入缓冲区的文件中进行查找;
- 在当前的标签(tags)列表进行查找;
- 在由当前文件(如#include)包含进来的头文件中进行查找。
^X模式(Ctrl-X Mode)
在插入模式下,输入Ctrl-X
将进入^X模式(插入和替换模式的一个子模式)。屏幕底部将显示以下提示信息:
1 | -- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y) |
您可以选择以下自动补全方式:
- Ctrl-] ,标签(tags)补全
- Ctrl-D ,定义补全
- Ctrl-E ,向上滚动文本
- Ctrl-F ,文件名补全
- Ctrl-I ,当前文件以及包含进来的文件补全
- Ctrl-K ,字典补全
- Ctrl-L ,整行补全
- Ctrl-N ,当前文件内的关键字补全,向下选择匹配项
- Ctrl-O ,全能补全
- Ctrl-P ,当前文件内的关键字补全,向上选择匹配项
- Ctrl-S ,拼写建议补全
- Ctrl-U ,用户自定义补全
- Ctrl-V ,Vim命令补全
- Ctrl-Y ,向下滚动文本
假设在编辑文件时,想要查找一个宏定义,那么首先按下Ctrl-X
键进入^X模式,然后再按下Ctrl-D
键,这时就会在弹出菜单中显示匹配项。
补全弹出菜单
随着弹出菜单的显示,将会自动应用第一个匹配项。
使用以下快捷键,可以在弹出菜单中移动和选择匹配项:
- 使用Ctrl-N和Ctrl-P上下移动时,输入的文本也会随之变化。
- 使用Up和Down上下移动时,输入的文字并不会变化。
- 使用PageUp和PageDown键,可以在菜单中翻页。
- 使用Ctrl-Y或Enter回车键,将使用当前匹配项完成补全。
- 使用Ctrl-E键,将关闭菜单并退回到文字输入的原始状态。
- 使用Esc键,将关闭弹出菜单,但会保留之前应用的匹配项。