vim使用技巧
移动光标
- 单行移动
w | 移动光标到下一个单词开头 |
---|---|
W | 移动光标到下一个单词开头,长跳.比如/etc/letsencryt 被认为是一个单词 |
e | 移动光标到下一个单词结尾 |
E | 移动光标到下一个单词结尾,长跳 |
b | 移动光标到上一个单词 |
B | 移动光标到上一个单词,长跳 |
nw | n代表数字,比如移动到下5个单词的头部,5w |
ne | n代表数字,比如移动到下5个单词的尾部,5e |
- 行首行尾移动
0 | 数字0,表示移动到本行最开头,不管有没有缩进都跳到最开头,作用等用于Home键 |
---|---|
^ | 移动光标到本行最开头的字符处 |
$ | 移动到本行结尾处.作用等同于End键 |
- 屏幕中移动
H | 移动光标到屏幕的首行.注意是当前屏幕窗口,而不是整个文件. |
---|---|
M | 移动光标到屏幕的中间一行. |
L | 移动光标到屏幕的尾行. |
- 文件范围移动
gg | 移动光标到文件首行.这个是移动到整个文件的第一行 |
---|---|
G | 移动光标到文件的最后一行. 这个是移动到整个文件的最后一行 |
:n | 跳到第n行.比如跳到第5行,可以输入:5 |
nG或ngg | 也是跳到n行,比如跳到第10行,输入10G,或者10gg |
:n | n代表数字,比如移动到100行,输入:100 |
- 翻页
ctrl+f | 向下翻页,等同于page down |
---|---|
ctrl+b | 向上翻页,等同于page up |
ctrl+d | 向下翻半页 |
ctrl+u | 向上翻半页 |
- 特殊移动技巧
{ | 跳到上一个空行 |
---|---|
} | 跳到下一个空行 |
* | 将光标停留在某个单词上,按下*键,会搜索该单词,并跳到下一个这个单词处 |
# | 将光标停留在某个单词上,按下#键,会搜索该单词,并跳到上一个这个单词处 |
‘’ | 两个单引号,移动光标到上一个标记处.比如跳转到他处后,输入此命令回到上一次光标停留的位置 |
‘. | 一个单引号一个点,移动光标到上一次的修改行 |
`. | 一个倒引号一个点.移动光标到上一次的修改点 |
删除复制—结合光标
在vim中,y表示拷贝,d表示删除,p表示粘贴.其中拷贝和删除和光标移动命令可以结合使用
- 删除
dw | w是移动到下一个单词开头.dw表示删除从当前光标到光标所在单词结尾的内容 |
---|---|
dW | 同上,不过是长删除, /etc/letsencrypt被认为是一个单词 |
daw | 删除光标所在的单词,无论光标是停留在哪里.例如/etc/letsencrypt/.如果光标停留在letsencrypt中的t字母上,则会删除letsencrypt这个单词.如果是dw则只删除tsencrypt,保留le |
daW | 同上,长删除 |
d0 | 数字0,删除从当前光标到光标所在行首的内容 |
d$或dD | 删除从当前光标到光标所在行尾的内容 |
- 复制
yw | 同理,复制从光标所在字母到单词结尾的内容 |
---|---|
yW | 同上,长复制 |
yaw/yaW | 同理,复制单词,无论光标停留在单词的哪个字母 |
y0 | 拷贝从当前光标到光标所在行首的内容,如果该行缩进,那么连行首的空格也一起复制 |
y^ | 拷贝从当前光标到光标所在行首的内容,如果该行缩进,不包括行首空格, |
y$ | 拷贝从当前光标到光标所在行尾的内容 |
- 整行复制删除
yy | 复制光标所在整行内容 |
---|---|
dd | 删除光标所在整行内容 |
D | 删除从当前光标到光标所在行尾的内容 |
J | 表示光标所在行和下一行合并 |
:.,$d | 删除当前行到文件末尾, |
dG | 删除当前行到文件末尾, |
:/str1/,/str2/d | 删除从字符串str1到str2的所有行 |
删除复制—结合数字
5yy或者y5y | 拷贝光标以下5行,包含光标所在行本身 |
---|---|
:n1,n2y | n表示数字,例如:12,24y表示拷贝第12行到第24行的内容. |
:n,y | n表示数字,例如:12,y表示拷贝第12行到光标所在行之间的内容. |
:,ny | n表示数字,例如:,24y表示拷贝光标所在行到第24行之间的内容. |
5dd或者d5d | 删除光标以下5行,包含光标所在行本身 |
---|---|
:n1,n2d | n表示数字,例如:12,24d表示删除第12行到第24行的内容. |
:n,d | n表示数字,例如:12,d表示删除第12行到光标所在行之间的内容. |
:,nd | n表示数字,例如:,24d表示删除光标所在行到第24行之间的内容. |
:nd | n表示数字,例如:3d表示删除3行.注意和上个命令区分 |
查找
/xxx或者?xxx | 在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示向上查找.支持正则表达式.输入 n 查找下一个匹配处, 输入 N 反方向查找.注意查找字符串默认区分大小写 |
---|---|
*或者# | 光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的下(上)一个单词,同样,输入n查找下一个匹配,输入N反方向查找 |
g*或者g# | 和上条相似,但是这个命令不完全匹配光标所在处的单词,而是匹配包含该单词的所有字符串 |
gd | 查找与光标所在单词相匹配的单词, 并将光标停留在文档的非注释段中第一次出现这个单词的地方. 用于查找局部变量等 |
% | 查找与光标所在处相匹配的反括号, 包括 () [] { } |
替换
一般结合s和g命令进行替换.一般格式为:
:%s/匹配模式/替换后的字符串/g.其中模式可以是正则表达式,以下是几个例子
:s/aa/bb/g | 将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb.注意是光标所在行,不是全文件 |
---|---|
:%s/aa/bb/g | 将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb.文件全局生效 |
:12,23s/aa/bb/g | 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb |
:12,23s/^/#/ | 将从12行到23行的行首加入 # 字符 |
:s/^/#/g | 全局所有行首插入#字符 |
还有一个方法可以批量在行首插入字符:
1.ctrl+v批量选中要插入的行
2.按大写字母I,输入要插入的字符
3.连续按两次ESC键
:%s/\s+$// | 将所有行尾多余的空格删除.等同于”:%s= *$==” |
---|---|
:g/^\s*$/d | 将所有空行删除 |
:g/^\/\//d | 将所有//开头的行整行删除.(不仅仅是删除//) |
s配合g一般用来做替换,g单独使用一般用来删除匹配的行
编辑
cc | 删除当前行并进入编辑模式 |
---|---|
cw | 删除当前字,并进入编辑模式 |
c$ | 擦除从当前位置至行末的内容,并进入编辑模式 |
S | 删除光标所在行并进入编辑模式 |
s | 删除当前字符并进入编辑模式 |
u | 撤销 |
ctrl+r | 撤销上一个撤销. |
~ | 将光标当前选中的字符切换大小写 |
>> | 当前行右移一个tab |
<< | 当前行左移一个 tab |
5>> | 当前光标后5 行向右移动一个 tab. |
:12,24> | 将12行到14行的数据都向右移动一个 tab |
:12,24>> | 将12行到14行的数据都向右移动两个 tab |
:w filename | 将当前文件所有内容写入新文件 |
:5w filenmame | 将当前文件第5行内容写入新文件 |
:1,10w filename | 将当前文件第1到第10行内容写入新文件 |
:f filename | 将当前文件重命名为新文件 |
多文件编辑
vim file1 file2 … | 同时打开多个文件进行编辑 | |
---|---|---|
:n\:N (等同于:next\:prev) | 进入下一个文件(上一个文件)编辑.这个命令要求先保存当前编辑文件 | |
:n!\:N! | 不保存当前编辑文件,并且切换到下(上)文件编辑. | |
:wn\wN | 保存当前编辑文件,并且切换到下(上)文件编辑 | |
ctrl+^ | 在最近打开的2个文件之间快速切换 | |
:e 文件名 | 指定对某个文件进行编辑 | |
:sp [file] | 把当前文件或者指定文件水平分隔 | |
:vsp [file] | 把当前文件或者指定文件垂直分隔 | |
:q\:close | 关闭当前文件窗口 | |
:only | 只保留当前文件窗口,关闭其他所有窗口 | |
:[q\ | wq]all | 对所有窗口执行q或者wq操作 |
:[q\ | wq]all! | 对所有窗口执行q!或者wq!操作 |
:vertical all | 打开所有窗口,垂直打开 | |
ctrl+w w | vim分隔了多个窗口后,光标循环定位到各个窗口中 | |
ctrl+w h/i | vim分隔了多个窗口后,光标跳转到左边(右边)的窗口 | |
ctrl+w j/k | vim分隔了多个窗口后,光标跳转到上边(下边)的窗口 | |
ctrl+W = | 让所有vim分隔后的多个窗口高度保持一样 | |
ctrl+W +/- | 增加/减少vim当前窗口高度 |
执行外部shell命令
:! command | 这是比较常用的执行命令方式,比如 :!ls 显示当前目录下的文件.执行完命令后按回车返回vim编辑窗口 |
---|---|
:r! command | 比如:r!ls.和上面的命令类似,但是执行完的结果会保存在vim的缓存中,一直显示在当前vim编辑窗口 |
常用功能选项
在启动的时候vim会读取 /etc/vimrc 和 ~/.vimrc ( 全局设置的vimrc 和用户设置).下面这些常见的功能选项可以直接定义在vimrc文件里,也可以在vim编辑窗口中输入: set xxx执行.
常见的功能选项有:
:set nu/:set nonu | 显示/取消行号.nu是number的缩写 |
---|---|
:set ic/set noic | 显示/忽略大小写.ic是ignorecace的缩写 |
:set ai/set noai | 自动/不自动缩进.ai是aotuindent缩写 |
:set hlsearch/:set nohlsearch | 显示/不显示高亮. |
:syntax on / :syntax off | 语法高亮/关闭语法高亮 |
set tabstop=4 | 设置tab键为4个空格 |
set ruler | 在右下角显示光标位置的状态行 |
set incsearch | 查询的时候非常方便.比如搜索book单词.输入/bo时,就已经自动开始查找. |
set noswapfile | 不要交换文件 |
粘贴避免缩进
1.在粘贴之前,vim窗口中输入:set paste #vim就不会自动缩进,而是纯拷贝粘贴
2.在粘贴之后,vim窗口中输入:set nopaste #关闭paste
还有一种方法是,即使粘贴后代码格式变的非常慢,只要执行gg=G就能自动编排格式.