本着学习apue想练习下Vim的使用方法,越学越怀疑自己是不是走偏了.
这本书确实是手把手教你但是,技巧实在太多了,现在自己用起Vim的心理负担越来越重,很多技巧看过不重复练习真的用不上.
所以我就看了前五章,实在是学不下去了…
Vim实用技巧
Vim的配置文件
系统级配置文件目录:/etc/vim/vimrc
用户级配置文件目录:~/.vim/vimrc
Vim分屏
1 | 命令模式下 |
第一章 Vim解决问题的方式
Vim对重复性的操作进行了优化.它之所以能高效地重复,是因为它会记录我们最近的操作,让我们用一次按键就能重复上次的修改.
技巧1 . 命令
. 命令可以让我们重复上次的修改(一次修改的单位可以是字符、整行,甚至是整个文件)
>G 命令会增加当前行到文档末尾处的缩进层级,如果我们在此命令后使用 . 命令,那么”重复上次修改”会让VIM增加当前行到文档末尾的缩进层级.
.命令是一个微型的宏
技巧2 减少无关操作
1 | Line one |
我们想在每行的结尾添加一个分号.先将光标移动到行位,然后切换插入模式进行修改.
$ 命令可以完成光标的移动操作
a 切换至插入模式,键入 ;
由于 . 命令可以重复上次的修改,我们只需要执行 j$.
. 命令在这里相当于(a;
a 命令是在当前光标之后添加内容,而 A 命令则是在当前行的结尾添加内容.换句话说就是把 $a封装成了一键操作.这样我们就通过 A 来代替 $a 大大提升了 . 效率.
技巧3 以退为进
1 | var foo = "method("+argument1+","+argument2+")"; |
这样变量名之间没有空格看起来并不美观,我们可以在”+”前后各添加一个空格,让肉眼更容易识别:
1 | var foo = "method(" + argument1 + ","+argument2+ ")"; |
s 命令把删除光标下的字符和进入插入模式合二为一.
; 命令会重复查找上次f命令所查找的字符
技巧4 执行、重复、回退
@: 可以用来重复任意Ex命令
& 来重复 substitute命令
对于 . 命令而言,我们可以按 u 键撤销上次的修改.
若使用f{cahr},不小心多按了 ; 键,我们可以按,撤回
技巧5 查找并手动替换
1 | ...We're waiting for content before the site can go live... |
若我们想将”copy”替换成”content”,
可以使用==>:%s /conten/copy/g
全部替换成copy
单我们想单一的修改呢?
我们可以把光标移动到待选的单词上,然后按 * 键.
星号 * 命令有两个功能:1.光标会调到下一个匹配项上 2.所有出现这个词的地方都会被高亮显示出来
n键可以跳到下一个匹配项
cw命令会删除从光标位置到单词结尾间的字符,并进入插入模式
取消高亮部分可以使用==>:noh
技巧6 结识 . 的范式 (略)
第一部分 模式
第二章 普通模式
技巧7 停顿时请移开画笔 (略)
技巧8 把撤销单元切成块
u 键会触发撤销命令,它会撤销最新的修改.
在Vim中,我们自己可以控制撤销命令的粒度.从进入插入模式开始,知道返回普通模式为止,在此期间输入或删除的任何内容都被当成一次修改.
技巧9 构造可重复的修改
删除单词nigh
1 | The end is nigh |
aw 文本对象
*daw 命令可以解毒为”delete a word”
这个操作不仅仅删除了该单词,而且它还会删除一个空格.
*daw 可以发挥 . 命令的最大威力
技巧10 用次数做简单的算术运算
在不带次数执行时,它们会逐个的加减
但如果带一个次数前缀,那么就可以用它们加减任意整数
10
技巧11 能够重复,就别用次数
1 | Delete more than one word |
将这段文字改为”Delete one word”,也就是要删除两个单词
先输入 fm ,光标找到m
然后 d2w 和 2dw 都可以
使用 d2w ,我们先调用删除命令,然后以 2w 作为动作命令,我们可以把它解读为”删除两个单词”;然而 2dw
做的相反,”做两次删除单词的操作”
技巧12 双剑合璧,天下无敌
Vim的强大在很大程度上源自于操作符与动作命令相结合.
操作符 + 动作命令 = 操作
d{motion} 命令
dl 对一个字符
daw 对一个完整的单词
dap 对一个完整的段落
g~ gu 和 gU 命令要用两次按键来调用,可以把上述命令中的 g 当做是一个前缀字符,用来改变其后面的按键行为.
gUaw 可以把当前单词转化为大写形式.
guaw 可以把当前单词转化为小写形式.
作用于段落的 ap 动作命令
用 dap 删除整个段落,用 gUap 把整段文字转化成大写.
Vim的语法只有一条额外的规则,即当一个操作符命令被连续调用两次时,它会作用于当前行.
所以 dd 删除当前行, >>缩进当前行
第三章 插入模式
大部分的Vim命令都在非插入模式中执行,不过有些功能在插入模式中会更好实现些.
技巧13 在插入模式中可即时更正错误
如果在插入模式下撰写文本时出错,我们立刻对它进行更正,而无需切换模式.要迅速更正错误,除了用退格键外,我们还可以用插入模式中的其他一些命令.
在输入错误时,我们可以用退格键删除错误的文本,然后再输入正确的内容.如果出错的地方靠近单词结尾,这或许是最快的修正方式.但是如果出错的位置在单词开头呢?
按键操作 | 用途 |
---|---|
< C-h > | 删除前一个字符(同退格键) |
< C-w > | 删除前一个单词 |
< C-u > | 删至行首 |
技巧14 返回普通模式
插入模式只专注于做一件事,那就是输入文字,而普通模式确实我们大部分时间所所用的模式,因此能在两种模式间切换是很重要的.
切换回到普通模式的经典方式是使用
按键操作 | 用途 |
---|---|
< Esc > | 切换到普通模式 |
< C-[ > | 切换到普通模式 |
< C-o > | 切换到插入-普通模式 |
插入-普通模式是普通模式的一个特例,它能让我们执行一次普通模式命令.在此模式中,我们可以执行一个普通模式命令,执行完后,马上又返回到插入模式.
技巧15 不离开插入模式,粘贴寄存器中的文本
Vim的复制和粘贴操作一般都在普通模式中执行,不过有时我们也许想不离开插入模式,就能往文档里粘贴文本.
(个人感觉不太好用….)
随时随地做运算
表达式寄存器允许我们做一些运算,并把运算结果直接插入到文档中.
我们可以用 = 指明使用表达式寄存器.在插入模式中输入
技巧17 用字符编码插入非常用字符
只要知道某个字符的编码就可以让Vim插入该字符,我们可以用这种方式插入任意字符.只需在插入模式中输入
例如我们想插入 “A” , 我们只需要输入 {C-v}065
按键操作 | 用途 |
---|---|
< C-v >{123} | 以十进制字符编码插入字符 |
< C-v >u{1234} | 以十六进制字符编码插入字符 |
< C-v >{nondigit} | 按原意插入非数字字符 |
< c-k >{char1}{char2} | 插入以二合{char1}{char2}表示的字符 |
技巧18 用二合字母插入非常用字符
(略)
技巧19 用替换模式替换已有文本
1 | Typing in Insert mode extends the line.But in Replace mode the line length doesn't change. |
把这两个单独的句子合并成一句话,为此,需要把句号改为逗号,并将单词”But”中的”B”改为小写.
用 R 命令可以有普通模式进入替换模式
第四章 可视模式
Vim具有3中不同的可视模式,分别用于操作字符文本、行文本或块文本。
技巧20 深入理解可视模式
可视模式允许我们选中一个文本区域并在其上操作.
某些可视模式命令执行的基本功能与普通模式相同,但操作上有些细微的变化。例如,这两种模式中, c 命令的功能是一样的,都是删除指定的文本并切换到插入模式.
例如把单词”March”修改为”April”.我们先把光标移动到”March”的某个位置,然后执行 viw 来高亮选择这个词,选择用 c 命令修改所选的内容,把这个单词删掉并进入插入模式,最后就可以输入完整的”April”了.
技巧21 选择高亮选区
v 键是通往可视模式的大门.
在普通模式下,按 v 可激活面向字符的可视模式,按 V 可激活面向行的可视模式,而按 C-v 则可激活面向列块的可视模式.
命令 | 用途 |
---|---|
v | 激活面向字符的可视模式 |
V | 激活面向行的可视模式 |
< C-v > | 激活面向列块的可视模式 |
gv | 重选上次的高亮选区 |
按键操作 | 用途 |
---|---|
< Esc > / <C-[> | 回到普通模式 |
v / V / < C-v > | 切换到普通模式(在对应的面向字符(行,块)中使用) |
v | 切换到面向字符的可视模式 |
V | 切换到面向行的可视模式 |
< C-v > | 切换到面向列块的可视模式 |
o | 切换高亮选区的活动端 |
高亮选区的范围是由其两个端点界定.其中一端固定,而另一段可随着光标自由移动,我们可以用 o 键来切换其活动的端点.在定义选区时,如果定义到一半时,才发现选区开始的位置不对,我们不用退出可视模式再从头开始,只需要 o ,然后重新调整选区的边界即可.
技巧22 重复执行面向行的可视命令
在可视模式中执行完一条命令后,我们就会返回到普通模式,并且在可视模式里所选中的文本范围也不再高亮显示了.
假设这段Python代码缩进有问题
1 | def fib(n): |
这段缩进错误的Python代码中,while关键字下面的两行应该多缩进两级,我们可以高亮选择这两行,然后用 > 命令对它进行缩进,以修正其缩进的错误.
要解决此问题,一个办法是使用 gv 命令重选相同的文本,然后再次调用缩进命令 .
技巧23 只要可能,最好用操作符命令,而不是可视命令
(略)
技巧24 用面向列快的可视模式编辑表格数据
(略)
技巧25 修改列文本
(略)
技巧26 在长短不一的高亮块后添加文本
1 | var foo = 1 |
这段代码有连续的3行,每行的长度各不相同,而我们想在每行结尾加一个分号.
我们可以进进入列块模式后,按 $ 键把选区扩大到每行的行尾.
确定好选区后,用 A 就可以在结尾添加内容了.
第五章 命令行模式
技巧27 结实Vim的命令行模式
出于历史原因,在命令模式中执行的命令又被称为做是Ex命令,Vim为几乎所有功能都提供了相应的Ex命令.(参见:h ex-cmd-index)
我们可以利用Ex命令:
读写文件( :edit 和 :write )
创建新的标签页( :tabnew )
分割窗口( :split )
操作参数列表( :prev/:next )
缓冲区列表( :bprev/:bnext )
操作缓冲区文本的Ex命令
| 命令 | 用途 |
| :———————————————- | :—————————————————— |
| :[range]delete[x] | 删除指定范围内的行[到寄存器x中] |
| :[range]yank[x] | 复制指定范围的行[到寄存器x中] |
| :[line]put[x] | 在指定行后粘贴寄存器x中的内容 |
| :[range]copy{address} | 把指定范围内的行拷贝至{address}所指定的行之下 |
| :[range]move{address} | 把指定范围内的行移动到{address}所指定的行之下 |
| :[range]join | 连接指定范围内的行 |
| :[range]normal{commands} | 对指定范围内的每一行执行普通模式命令{commands} |
| : [range]substitute/{pattern}/{string}/[flags] | 把指定范围内出现{pattern}的地方替换为{string} |
| :[range]glpbal/{pattern}/[cmd] | 对指定范围内匹配{pattern}的所有行,在其上执行Ex命令{cmd} |
技巧28 在一行或多个连续行上执行命令
很多Ex命令可以用[range]指定要操作的范围.
1 | 1 #include "apue.h" |
用行号作为地址
如果输入一条值包含数字的Ex命令,那么Vim会把这个数字解析成一个地址,并把光标移动到该数字所指定的行上.
=>:1
=>:print
《1 #include “apue.h”
:p 是 :print 的简写,可以组合使用 =>:1p
用地址指定一个范围
=>:6,16p
会打印第6行至第16行之间的每一行的内容.并且将光标停留在16行
技巧29 使用 ‘:t’ 和 ‘:m’ 命令复制和移动行
略
技巧30 自动补全Ex命令
如同在shell中一样,在命令行上也可以使用
例如这样输入:
=>:col
《colder colorscheme
技巧31 把当前单词插入到命令行
(略)
技巧35 运行shell命令
(略)