前言
vim文本编辑器,是由 vi 发展演变过来的文本编辑器,使用简单、功能强大、是 Linux众多发行版的默认文本编辑器。本文主要列举了常用的命令,提供文本写作生产力。
基于单词的移动
命令 | 光标动作 |
---|---|
w | 正向移动到下一个单词的开头 |
b | 反向移动到当前单词/上一个单词的开头 |
e | 正向移到当前单词/下一个单词的结尾 |
ge | 反向移到上一个单纯的结尾 |
基于字符查找移动
行内搜索
命令 | 描述 |
---|---|
f{char} | 正向移动到下一个{char}所在之处 |
F{char} | 反向移动到下一个{char}所在之处 |
t{char} | 正向移动到下一个{char}所在之处的前一个字符上 |
T{char} | 正向移动到下一个{char}所在之处的前一个字符上 |
命令 | 描述 |
---|---|
; | 重复上次字符查找的命令 |
, | 反转方向查找上次字符的查找命令 |
文件中搜索
命令 | 描述 |
---|---|
/{pattern} | 跳转到文中下一个pattern出现的地方 |
?{pattern} | 跳转到本文件中上一个pattern出现的地方 |
pattern | 可以是正则表达式 |
* | 等价于/{pattern},pattern是当前光标下的单词 |
nN | 快速重复/查找 |
文本对象与选择区
先按v进入visual模式,再再命令键进行选中
-
a: around 周边
-
i:input 里边
分割符文本对象
命令 | 文本选择区域 |
---|---|
a)或ab | 一对圆括号(parentheses)(v+a+b同时按住) |
i)或ib | 圆括号内部 |
a}或aB | 一对花括号{braces} |
i}或iB | 花括号内部 |
a] | 一对方括号[brackets] |
i] | 方括号内部 |
a> | 一对尖括号 |
i> | 尖括号内部 |
a' | 一对单引号'single quotes' |
i‘ | 单引号内部 |
a" | 双引号“double qoutes” |
at | 一对XML标签 tags |
it | XML标签内部 |
氛围文本对象
命令 | 描述 |
---|---|
iw | 当前单词 |
aw | 当前单词及一个空格 |
iW | 当前字串 |
aW | 当前字串及一个空格 |
is | 当前句子 |
as | 当前句子及一个空格 |
ip | 当前段落 |
ap | 当前段落及一个空行 |
操作符待决模式(motion)
motion 指:分隔符文本对象和范围文本对象
模式 | 描述 | 命令示例 |
---|---|---|
d{mition} | 删除模式(delete) | diw :删除选中的当前单词 |
c{motion} | 修改模式(change) | ciw :修改选中的当前单词 |
y{motion} | 复制模式 (yank) | yiw :复制选中的当前的单词 |
v{motion} | 可视模式 (visual) | viw |
dd | 删除一行 | |
cc | 修改一行 | |
yy | 复制一行 |
示例
命令 | 描述 |
---|---|
dgg | 删除到第一行(从当前光标所在的行开始删除) |
ye | 复制到单词结尾 |
d$ | 删除到行尾 |
dt | 删除知道分号为止的内容 |
寄存器与宏
寄存器
vim提供了很多寄存器用于存放内容,可以理解为剪切板,一个字符对应一个寄存器(如a-z,0-9)。通过:reg {register}查看对应寄存器的内容
特别的寄存器:
-
“ :默认寄存器,平时复制、删除的内容都存放在里面
-
% :当前文件名
-
. :上一次插入的内容
-
: :上一次执行的命令
指定寄存器
在复制/删除/粘贴等操作前加上"{register}就可以指定本次操作所用的寄存器。常见用途:将想要持久保存的文档放到特定的寄存器中,随时进行粘贴,避免覆盖。
命令 | 描述 |
---|---|
"ayy | 将这一行复制到a寄存器中 |
"bdiw | 将单词删除,保存到b寄存器中 |
"cp | 将c寄存器中保存的内容粘贴出来 |
宏
宏(MACRO)录制一些列键盘操作,并允许我们重放这些操作,操作序列存放在指定的寄存器中
- q{register} :开始录制宏,存放在寄存器{register}中
- 录制过程中按q推出录制
- @{register}:重放寄存器register中的操作
- @@:重放上一次宏操作
建议:让你的宏对连续重放友好
- 让你的光标移动更加general
- 假设你要在多个特定的位置进行特定的操作,一个好的习惯是在宏录制的最后,跳转到下一个需要编辑的位置。即,宏包括【编辑动作】+【跳转到下一个需要编辑的位置】这样一来,连续重放就可以实现对所有需要编辑的位置进行编辑操作通过大写的寄存器,在宏的后面添加命令。如果宏是重放友好的,允许我们使用[count]@{reg1ster}直接重放count次。
批量操作
命令格式:{count} {action } :数字加动作,重复count次action动作,动作可以是移动动作或编辑动作。
命令 | 描述 |
---|---|
4j | 向下移动4行 |
3dw | 连续删除本行3个单词 |
2yy | 连续复制两行 |
4p | 粘贴4次 |
跳转
普通跳转
命令 | 描述 |
---|---|
^ | 跳转到本行的开始 |
$ | 跳转到本行的结束 |
% | 跳转到匹配的配对符(括号等)处 |
gg | 跳转到文件的行首 |
G | 跳转到文件的行尾 |
基于标记的跳转
常用场景:当前需要临时离开光标处,做一些事情后再迅速地回来。mark是a-z的字符
- m{mark}:把当前位置标记为mark
- `{mark}:跳转到名为make的标记位置
内置标记:
- `` :返回跳转前的位置
- `. :上次修改的位置
- `^ :上次插入的位置
撤销与重复
命令 | 描述 |
---|---|
u | 撤销上一次操作 |
ctrl + r | 撤销撤销的更改(重做) |
. | 重复上一次的命令或修改,适用于重复某一个动作的修改 |
技巧
命令 | 描述 |
---|---|
:set relatetivenumber | 开启相对行号功能 |
:set norelativenumber | 关闭相对行号功能 |
命令模式
命令模式以行为单位进行处理,通过:进入命令模式
命令格式
:[range] {excommand} [args]
参数说明
- range: 作用的范围,不给的情况下默认为本行
- excommand: 特殊命令,适用于Command模式
- args:后续的参数,视命令而定
命令示例
- :[range] delete [x] 删除range中的行并将删除的内容保存到寄存器x中,delete简写为d。
- :[range] yank [x] 复制range中的行到寄存器x中,yank可简写为y
- :[range] print 将range中的行打印出来,print可简写为p
作用范围指定
命令 | 描述 | 示例 |
---|---|---|
1,3 | 文件的1~3行 | :1,3 delete (删除文件的1到3行) |
. , .+4 | 当前-当前往下4行 | : . , .+4 yank (复制当前往下4行) |
$-3, $ | 文件的最后4行 | :$-3,$ p (打印文件最后4行) |
% | 代表文件所有行 | :% d (删除文件所有内容) |
复制、移动、粘贴
说明:0作为虚拟行的address,可以用来将内容插入第一行
命令 | 描述 |
---|---|
:[range] copy {address} | 把range范围的行内容复制到address后面 |
:[range] move {address} | 把range范围的行内容移动到address后面 |
:[address] put [x] | 把寄存器x的内容招贴到address后面 |
批量操作
normal 命令
命令格式::[range] normal {commands}
命令解释:对range范围中的所有行执行normal模式下的命令 commands
几点说明:
- 将range设置为%,可以对整个文件的所有的行执行操作
- :[range] normal . ,配合.命令效果出色,常用做法是:先做一次修改,再用normal命令在指定的行伤完成相同操作
- .命令只能记录一次修改,用宏可以实现多个记录操作。即::[range] normal @{register}
命令示例:
命令 | 描述 |
---|---|
:1,4 normal I## | 在1到4行前插入## |
global 命令
命令格式::[range] global /{pattern}/[cmd]
命令解释:对range中包含pattern的所有执行command模式下的Ex命令
几点说明:
- [cmd]:Ex命令,不给的话默认打印print
- normal命令也是Ex命令。:[range] global /pattern/normal {commands}
命令示例:
命令 | 描述 |
---|---|
:% global /TODO/delete | 删除所有带TODO的行 |
:% global /api/nomal O//TODO:update | 在所有带api字符的行上面插入// TODO:update |
替换命令
命令格式::[range]s/{pattern}/{string}/[flags]
命令解释:将range范围中所有的pattern替换为string
flags参数说明:
- g:替换每一行的所有匹配
- i:忽视大小写
- c:替换前进行确认
- n:计数而不是替换
:%s/vim//gn :统计文件中所有vim出现的次数
命令示例
命令 | 描述 |
---|---|
:%s/int/char/g | 将文件中所有行中的int替换为char |
:%s/flags//gn | 统计文件中flags单词出现的次数 |