Vim
vim
适用于:纯文本文件编辑(代码、markdown文件、LaTeX源码)
优势:
- 高效的移动
- 高效的编辑
主要4种模式:
- Normal模式:默认模式,也是最常用的模式
- Insert模式:插入模式,像正常的文本编辑器一样输入
- Command模式:命里模式,在底部输入命令
- Visual模式:可视模式,对文本进行选择
Normal模式
基本移动
hjkl:上下左右gg:跳到第一行(类似Home键)G:跳到最后一行(类似End键)Ctrl-u/Ctrl-b:往上翻半页/一页(类似键PageUp)Ctrl-d/Ctrl-f:往下翻半页/一页(类似键PageDown){lineno}gg:跳到第lineno行zz/zt/zb:光标行设置为屏幕居中/屏幕第一行/屏幕最后一行
Insert模式
i:代表"insert",当前光标之前开始输入a:代表"append",当前光标之后开始输入I:在本行的开头开始输入A:在本行的末尾开始输入o:下方插入新的一行,然后开始输入s:删除当前光标的字符,然后开始输入O:上方插入新的一行,然后开始输入S:删除当前行,然后开始输入
进入Command模式
Normal模式下输入:进入Command模式
:w:保存当前文件:q:退出:q!:放弃当前更改,然后退出:wq:保持当前更改,然后退出:x:类似于:wq,保持并退出:h{command}:显示关于命里的帮助<Esc:回到Normal模式
进入Visual模式
v:Normal模式下进入可视模式,选择字符V:Normal模式下进入可视模式,选择行x/y:剪切/复制
基于单词的移动
简单的hjkl显然无法满足我们的需求
w:代表"word",跳转到下一处单词的开头b:代表"back",跳转到下一处单词的开头e:代表"end",跳转到下一处单词的结尾ge:e的反向版本,跳转到下一个单词的结尾
wbe大写版本WBE对应的单词是连续的非空字符
基于搜索的移动
(1) 行内搜索:
f{char}/t{char}:跳转到本行下一个char字符出现处/出现前;/,:快速向后/向前重复ft查找F{char}/T{char}:往前搜索而非往后
(2) 文件中搜索:
/{pattern}:跳转到本文件中下一个pattern出现的地方?{pattern}:跳转到本文件中上一个pattern出现的地方pattern:可以是正则表达式*:等价于/{pattern},pattern是当前光标下的单词nN:快速重复/查找
(3) 基于标记的移动
m{mark}:把当前位置标记为mark- ``{mark}
:跳转到名为mark` 的标记位置 mark:为a-z的字符
常用场景:当需要临时离开当前光标处,做一些事情后再快速地回来
内置标记:
- `` :上次跳转前的位置
- `. :上次修改的地方
- `^:上次插入的位置
(4) 其它实用的跳转
^/$:跳转到本行的开始/结尾%:跳到匹配的配对符(括号等)处
编辑
{operator}{motion}:一次编辑动作"操作符 + 移动" 是非常重要的操作逻辑,它运行你组合处各种动作
常见操作符:
c:代表"change",修改,删除内容并进入插入模式d:代表"delete",删除y:代表"yank",复制v:代表"visual",选中文本,进入可视模式r:代表"replace",替换光标所在的字符(r替换单个字符)R:替换多个字符,ESC退出。p:粘贴x:剪切光标所在字符
例子:
dgg:删除到第一行ye:复制到单词结尾d$:删除到行尾dt;:删除直到分号为止的内容
重复操作:. 命令
.:重复上一次修改u:撤销上一次修改<Ctrl-r>:重做上一次修改
.命令非常适合用于需要多次重复某一个修改动作的场景,省去了重复输入命令,大大提高了效率。
批量操作:数字+动作
{count}{action}:重复count次action动作动作可以是移动动作或者编辑动作
4j:向下移动4行3dw:删除3个单词2yy:复制2行4p:粘贴4次
数字+动作,是一种重要的批量操作方式,命里直观,语义明确
.命令可以直观地看到每一次的变化,在合适的时候停止- 数字+动作则需要预先知道都做的次数
技巧:使用相对行号确定移动范围
当涉及行操作时,使用相对行号能够更直观地确定范围
:set relativenumber:开启
:set norelativenumber:关闭
文本对象操作
textobjects:语义化的文本片段
格式:i / a + 对象
常见的对象:
w/W,s,p:单词、句子、段落(/),[/],{/},</>,'/":配对符定义的对象
i :代表"inner",内部;
a:代表"a",额外包括周围的空格或配对符
操作符与命令补充
gu/gU/g~:操作符,转小写/转大写/翻转大小写J:join,连接两行<Ctrl-a>/Ctrl-x:增加数字/减少数字g<Ctrl-A>:创建递增序列</>:左/右缩进
寄存器与宏
寄存器
Vim提供了许多寄存器用于存放内容,可以理解为剪切板,一个字符对应一个寄存器(如
a-z,0-9)特别的寄存器:
":默认寄存器,平时复制、删除的内容都放在里面%:当前文件名.:上次插入的内容::上次执行的命令通过
:reg {register}查看对应寄存器的内容
指定寄存器
在复制/删除/粘贴等操作前加上
{register}就可以指定本次操作所用的寄存器只要涉及寄存器操作的都可以这样指定
"ayy:将这一行复制到a寄存器中"bdiw:将单词删除,保存到b寄存器中"cp:将c寄存器中的内容粘贴出来常见用途:将想要持久保持的文本放到制定寄存器里,随时进行粘贴,避免被覆盖
寄存器字符大写:添加(append)而并非覆盖
宏
宏(Macro):录制一系列键盘操作,并允许我们重放这些操作
操作序列存储在指定的寄存器中
q{register}:开始录制宏,存在寄存器register中录制过程中按
q退出录制
@{register}:重放寄存器register中的操作
@@:重放上一次宏操作常见用法:
q{register}录制一段操作,@{register}重复,然后一直@@重放注意:
.命令对宏不生效,.命令只记录上一次修改,而宏可能包含多次修改
命令模式
命令模式的操作对象以"行"为基本单位
normal和global命令提供了强大的批量行操作
Ex命令格式
:[range] {excommand} [args]
range:作用的范围,不给的话默认是本行excommand:特殊的命令,适用于Command模式arg:后续的参数,视命令而定一些Ex Command(
[x]为寄存器,是可选项):
:[range] delete [x]:删除range中的行(到寄存器x),delete可简写为d:[range] yank [x]:复制range中的行(到寄存器x),yank可简写为y:[range] print:将range中的行打印出来,p
range与addres:指定范围
range由一个或两个address构成,即{address} 或 {address},{address}
addres可以是:
{lineno}:行号,如3代表第三行(0代表第一行上面的虚拟行)$:最后一行.:光标所在行/{pattern}:下一个pattern所在的行
address可以做加减法,.+3代表光标下第三行,$-3代表倒数第 4 行
行的复制、移动、粘贴
:[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}常用做法:先把想要的操作录制成宏,再用normal命令在指定的行上重放宏
global命令
格式::[range] global/{pattern}/[cmd]
含义:对range中包含pattern的所有行执行Command模式下的Ex命令
[cmd]:Ex命令,不给的话默认打印(print)
注意,normal命令也是Ex命令!
例子:
:% global /TODO/delete
替换命令
格式::[range]s/{pattern}/{string}/[flags]
含义:将pattern替换为string
flags:
g:替换每一行的所有匹配i:忽视大小写c:替换前进行确认n:计数而不是替换
例子:
:%s/Vim//gn:统计文件中所以Vim出现的次数(此时替换为什么无所谓,加了n就不会执行替换操作)

浙公网安备 33010602011771号