前言及第一章
该专栏文章用于对Drew Neil(作者)的书籍《Vim使用技巧》的总结记录
在第一章开始前首先要了解vim编辑器的几个模式(后面会详细展开):
- 普通模式
vim刚进入时就是普通模式(这点和其他编辑器都不同),这意味着你此时无法对文本直接通过输入单词,文字等来进行编辑,不过可以使用换行(j等)、重复(.)、编辑(i、a)、行末编辑(A)等命令来进行操作 - 插入模式
在这个模式下就和其他编辑器中的操作类似,可以直接输入单词、文字等,在普通模式下输入i、a、A等就能进入编辑模式,而按<Esc>则退回普通模式。 - 可视模式
这个模式前面暂且用不到,等后面再具体展开 - 命令行模式(Ex模式)
在该模式下可以执行类似正向查找、退出编辑器等命令。在普通模式下按下:键即进入Ex模式。
当前具体处于什么模式在编辑器左下角会有显示。
1、写作体例说明
- 主旋律
在钢琴演奏中主旋律一般由一个接一个的音符构成,而在vim编辑器中的普通模式下,也有由按次序输入一个或多个按键组成的命令,例如:
标记 | 含义 |
---|---|
x | 按一次x |
dw | 依次按d、w |
dap | 依次按d、a、p |
- 演奏和弦
指同时按下几个按键的命令例如:<C-p>标记意味着同时按下和p按键
标记 | 含义 |
---|---|
<C-n> | 同时按<Ctrl>和n |
g<C-]> | 先按g,然后同时按<Ctrl>和] |
<C-r>0 | 先同时按<Ctrl>和r,然后按0 |
<C-w><C-=> | 先同时按<Ctrl>和w,然后同时按<Ctrl>和= |
- 占位符
有些命令后面必须跟某种特定类型的按键,这些特定类型的按键可以放在占位符中例如:
标记 | 含义 |
---|---|
f{char} | 先按f后面接任意字符 |
'{a-z} | 先按’,后面按任意小写字母 |
m{a-zA-Z} | 先按m,后面跟任意小写或大写字母 |
d{motion} | 先按d,后面跟任意动作命令 |
<C-r>{register} | 同时按<Ctrl>和r,后面跟一个寄存器地址 |
- 特殊按键
标记 | 含义 |
---|---|
<Esc> | 退出按键 |
<CR> | 回车键,也写作<Enter> |
<Ctrl> | 按控制键 |
<Tab> | 按制表键 |
<Shift> | 按切换键 |
<S-Tab> | 同时按<Shift>和 |
<Up> | 按上光标键 |
<Down> | 按下光标键 |
␣ | 按空格键 |
- 提示符
提示符 | 含义 |
---|---|
$ | 在外部shell中执行命令行命令 |
: | 用命令行模式执行一条Ex命令 |
/ | 用命令行模式执行正向查找 |
? | 用命令行模式执行反向查找 |
= | 用命令行模式对一个vim脚本表达式求值 |
任何时候看到Ex命令,比如:write,都默认输完命令按下回车键来执行,而其他的命令例如/pattern<CR>,都只在标出了回车键后才按回车,而不是输完就立即按回车键。
2、第一章 vim解决问题的方式
- . 命令重复修改
在vim编辑器中的普通模式下使用. 命令(直接按. )可以重复上一次的修改。在这里首先要理解一个概念:什么是修改?
例如:
-
x命令会删除光标下的字符
也就是说如果你在普通模式下使用了x命令删除了一个字符那么接着按.则会重复一次x命令 -
dd命令可以删除整行
-
>G命令可以增加从当前行到文档末尾处的缩进层级
-
!!!每次进入插入模式时也会形成一次修改,但是如果进入插入模式什么也没干那么.命令重复的还是进入前的修改,也就是说不会重置修改状态。
-
在插入模式中移动光标会重置修改状态。
-
u 命令则是与. 命令相反的命令,可以撤销上次修改
-
j向下换行,k向上换行
- a从光标进入编辑模式
- $将光标移动到末尾
复合命令 | 等效的长命令 | 作用 |
---|---|---|
C | c$ | 删除光标到结尾的字符(包括光标字符)并进入插入模式 |
s | cl | 删除光标字符并进入插入模式 |
S | ^C | 删除整行并进入插入模式 |
I | ^i | 回到行首并进入插入模式 |
A | $a | 回到行末尾并进入插入模式 |
o | <ESC>a | 在下面开一条新行并进入插入模式 |
O | ko | 在这行上面开一条新行并进入插入模式 |
-
f{char}命令可以让vim查找下一处指定字符出现的位置
-
;命令重复上一次查找
也就是说如果要重复查找同一个字符或字符串,可以先用f{char}后面直接按;即可
例如这样一段文本:
var foo = “method(”+argument+“,”+argument2+“)”;
如果想要将其中的所有“+”号左右加上空格可以按下面的步骤:
‘’’
f+ #(注释不要输入进去)找到+号位置
s␣+␣ #删除加号后重新输入“空格”“+”“空格”(这里是为了后面可以直接用.命令重复,直接在“+”号两边加空格无法使用.重复,因为这需要不止一次修改(移动光标会重置修改状态))
; #重复上一次查找,来到第二个“+”号的位置
. #重复上一次修改,将“+”替换成"空格+空格"
;.
;.
- 可重复操作及如何回退
目的 | 操作 | 重复 | 回退 |
---|---|---|---|
做出一个修改 | {edit} | . | u |
在行内查找下一指定字符 | f{char}/t{char} | ; | , |
在行内查找上一指定字符 | F{char}/T{char} | ; | , |
在文档中查找下一处匹配项 | /pattern | n | N |
在文档中查找上一处匹配项 | ?pattern | n | N |
执行替换 | 😒/target/replacement | & | u |
执行一系列修改 | qx{changes}q | @x | u |
- 注意一点:查找匹配项用n N 查找指定字符用 ; ,
-
*命令查找光标所处的单词,可以使光标跳到下一匹配项,并使所有出现这个词的地方都被高亮显示
-
cw命令删除光标位置到单词结尾间的字符并进入插入模式
-
有下面这一段文本:
‘’’
...We're waiting for content before the site can go live...
...If you are content with this, let's go ahead with it...
...We'll launch as soon as we have the content...
要求:将一三段的content替换成copy。操作如下:
‘’’
{start} #移动光标到content的位置
\* #匹配光标所在单词
cwcopy\<Esc> #删除content并添加copy然后退出插入模式
n #移到下一个content
. #重复上一次修改(先删除光标到词尾字符然后添加copy)
-
.范式
-
对于要多次的重复修改问题,要想办法用最少的键来完成修改,而理想模式则是:一键移动,另一键执行,也就是说通过一次按键就能把光标移到下一个目标上,再用一次按键执行修改。