记录一下学习 vim 的过程,加深每个命令的记忆,也方便以后查看。
顺便也熟悉一下 minila。 :)
特别注意,vim 中的操作符是区分大小写的
基础教程
第一讲
光标移动
vim 的光标移动使用的是 hjkl 四个键,分别对应 左下上右 四个方向。
具体对应关系:
1 | h(左移) |
个人体验下来,右手食指按照正常指法,应该放在j上,最开始使用光标移动的时候,我会把右手向左平移一个键位,这样右手四指依次放在了
hjkl上,本以为这样能最快的控制四个方向的按键。但是实际体验中发现了问题,频繁的改变指法,其实会导致指法的混乱,很多时候大脑反应不过来究竟应该把食指放在j上还是h上,这样其实也很没有效率。所以我觉得不应该改变指法,而是用食指记住hj两个按键的功能,这样在不改变指法的前提下,也可以实现有效的按键控制。
进入及退出
进入 vim 编辑器:
1 | vim <文件名> |
退出 vim 编辑器:
1 | :q! // 放弃所有改动强制退出 |
删除和插入
- 删除光标所在位置的字符:
x - 插入文本:
i - 添加文本:
A
注意,插入命令
i是在光标位置的前一个位置插入文本。而添加命令A是在该行最后一个字符后添加文本,无论光标处于该行什么位置,都可以使用A命令在该行最后添加文本。
第二讲
命令和对象
一个 vim 命令是由命令和对象两个部分组成的
1 | operator [motion] |
其中 operator 是命令, motion 是动作对象。
下面列出的是一个简短的动作列表
w: 从光标的当前位置,直到下一个单词起始处,不包括它的第一个字符;e: 从光标的当前位置,直到该单词的末尾,包括最后一个字符;$: 从光标的当前位置,直到当前行的末尾。
实际上,上面的三个动作也可以当作命令使用,单独使用
w,光标就将跳到下一个单词的第一个字符上,其他的命令也会产生相应的动作。
删除命令
删除命令是字符 d,如果和上面的三个命令组合使用,效果如下:
dw: 从光标的当前位置,删除至下一个单词的起始位置;de: 从光标的当前位置,删除至本单词的末尾;d$: 从光标的当前位置,删除至当前行的末尾。
在某些场景下,删除一整行是一个常用命令,vim对删除整行的操作做了优化,使用 dd 命令,无论光标处于一行的什么位置,都可以快速删除该行。
计数动作
将动作命令和数字组合使用,可以实现更加快速的操作效果,比如 2w 会跳过两个单词,3dd 则会删除三行文本,直观上理解的话,计数动作就是给一个动作做了乘法。
加入计数动作后,命令的语法如下:
1 | <number> operator [motion] |
注意,计数命令有一个比较特殊的命令字符 0,使用该命令会使光标回到行首,它与命令 $ 相对应,是一个快速操作的较常用命令
撤销命令
- 撤销单次操作的命令是字符
u,并且该命令可以多次使用直到之前所有的操作都被撤销; - 如果希望一次命令就撤销单行内的所有之前的操作,那么使用字符
U即可; - 命令
ctrl-r的作用是撤销之前的撤销命令,听上去比较晦涩和拗口,实际体验就知道是什么效果了。
第三讲
置入类命令
命令 p 的作用是将最近一次使用删除命令删除的文本(dw dd 等命令均可使用)置入到指定位置,根据实际使用测试,置入的位置遵循以下原则:
- 如果删除的文本是一个或几个单词(非整行),那么置入位置为光标所在位置的后边;
- 如果删除的文本是一整行(
dd命令),那么置入位置为光标所在行的下一行(无论光标在该行的哪一个位置)。
替换类命令
命令 r 的作用是将光标所在位置的字符替换成输入的字符。具体的使用流程如下:
- 正常模式下在需要修改的字符处按
r; - 此时编辑器切换到输入模式,输入想要更改的字符,光标位置的字符即替换完成。
更改类命令
该命令的核心字符是 c,组合动作可以是 w e $中的任意一个。
cw和ce的命令动作比较类似,都是从光标处开始删除该单词后面的部分字符(包括光标位置的字符),并转换到插入模式,然后手动输入想要更改的字符,按ESC退回到正常模式,本次命令动作完成。c$命令就是从光标处开始一直删除到本行末尾(包括光标处字符),让后转换到插入模式开始输入。c命令也可以组合数字使用,如2cw4ce等。
第四讲
定位
定位命令字符是 g,其中:
- 输入
G会跳转到文本的最后一行; - 输入
gg会跳转到文本的第一行; - 输入
<number> G会跳转的指定行。
另外,ctrl-g 命令可以查看光标当前所在行的行数,方便定位。
搜索
向后搜索命令字符是 /,向前搜索命令字符是 ?。
以 / 命令为例:
- 按下
/键,编辑器由正常模式切换到输入模式; - 输入想要查找的字符串,按下回车,找到需要的文本;
- 想要继续向后查找同一个字符串,按下命令字符
n,想要反方向查找统一字符串,按下命令字符N; - 想要回到之前查找到的位置可以使用命令
ctrl-o,该命令可重复多次; - 想要回到较新的位置,可以使用命令
ctrl-i。
括号配对
匹配括号的命令是 %,该命令会匹配 () [] {} 所有的括号对,即使多层括号嵌套,也可以正确匹配到配对的括号。只需在一个左括号或右括号上按下 % 即可。
替换
基本的替换操作命令如下所示:
1 | :s/old/new/g |
其中:
:s是替换操作的操作命令;old是目标字符;new是替换字符;/g是全部替换命令,这是一个可选项。
注意,该命令仅限光标当前所在行的行内替换,如需多行替换,则如下操作:
1 | :#,#s/old/new/g // 其中 #,# 代表需要进行替换操作的首位两行的行号。 |
第五讲
在 vim 内执行外部命令
: 命令会将光标移到屏幕最下方,使 vim 进入命令模式; ! 命令允许使用外部命令。
在正常模式下输入 :! 让后紧跟一个外部命令即可执行该命令。
比如:
1 | :!ls |
这个命令和在终端中执行 ls rm 命令的效果相同。
所有命令都可以用这种方法执行,包括带有参数的命令。
更多的保存文件的信息
使用 :w <FileName> 命令可以将文件保存到一个名为 FileName 的文件中。
可视模式
命令 v 会使 vim 进入可视模式,当进入该模式时,可使用方向命令选中任意多的内容。
命令 V 将进入可视行模式,在该模式中,只可选中整行内容。
可视模式命令可以和其他命令配合完成高效操作。比如用可视模式选中一个文件中的某一段文本,并将这段文本保存到新的文件中,可按如下方式操作:
- 按下
v进入可视模式,选择需要的文本; - 选择完毕后输入
:命令,屏幕底部会出现:'<,'>; - 在
:'<,'>后输入w <NewFileName>,操作完成,新文件中将包含选中的文本。
对于可视模式中选中的字符,按一次 d 命令即可删除。
提取和合并文件
命令 :r <FileName> 可以将名为 FileName 的文件中的字符插入到当前文件中,插入位置就是光标所在位置。
该命令还可以读取外部命令的输出并插入,如 :r !ls。
第六讲
打开新的一行并插入
输入命令 o 可以在光标所在行的下一行建立一个新行并切换到插入模式,用于输入新的文字。
命令 O 则是在光标所在行的上一行产生效果。
在光标后插入
输入命令 a 会将编辑器切换的插入模式,文字将被插入到光标之后,和命令 i 的插入位置不同。
稍作延展,命令
A将在行末插入文字,而命令I则是在行首插入文字。
另一个替换类命令
在第三讲中,我们讲解过一个替换命令 r,该命令的大写命令 R 也具有相似的效果,不同的地方在于:
- 命令
R在退回到正常模式前会一直处于替换模式,输入的字符将替换光标处的字符,所以该命令用于多字符的替换操作,而r命令用于单字符的替换; - 命令
R在替换过程中使用回退健并不会删除字符,而是将该位置的字符会退到替换之前的状态。
复制粘贴
命令 y 用于复制字符,或者换一种说法叫“把字符抽取出来”。该命令有以下几种常见用法:
- 与可视模式搭配使用;
- 与
w等命令搭配使用(yw); - 与行首行末操作符搭配使用(
y$)。
命令 p 用于把命令 y 复制出来的字符粘贴到光标所在处。
设置类命令的选项
输入 set:xxx 可以设置 xxx 选项,下面以搜索命令为例展示几个有用的命令。
ic:ignorecase,在搜索时忽略字母大小写;is:incsearch,查找短语时显示部分匹配的项;hls:highlightsearch,高亮显示匹配短语。
如果想要关闭某个选项,只需要输入 set:noxxx 即可。
更多的选项类命令未来接触到再详细说明。