知识源于不断实践与训练,认知源于认真阅读,知识应该是衡量一个人的重要标准。
掌握一项技能对一个人的改变的多少取决于获得这项技能所花费的时间,这就是我下定决心要学习 Vim 的原因。
《Vim 实用技巧》是一本学习 Vim 非常高效的书,以下为阅读此书中摘录和总结的一些技能,以便后续查阅。
使用 * 对光标下的单词进行搜索
使用 . 重复上一次的修改
在如下代码种每行末尾添加 ”;“
1
2
3var foo = 1
var bar = 'a'
var foobar = foo + bar方法一、 $a; 然后 j$.
方法二、 $A; 然后 j.
方法三、 $A; 然后 SHIFT-V 选择两行,:<’,’> nomarl .注:以下命令为等效命令,并且都是从普通模式切换到插入模式
A <==> $a C <==> c$ s <==> cl S <==> ^c 删除整行从头插入 I <==> ^i o <==> A<CR> O <==> ko
以退为进—— 给以下代码种 + 号前后添加空格
1
var foo = "method("+argument1+","+argument2+")";
使用 f+ 找到 + 号,然后 s 先删除 + 在写入
+ 重复 3 次 ;.
注:使用 :s/target/replacement 执行替换的时候 & 重复下一个替换,u 撤销替换
使用 * 查找光标下的单词
插入分块,使得撤销拥有粒度,比如在插入模式种使用
o 另起一行,而不是直接 构造可重复性修改,如下假设光标位于 h 字符上,要删除整个单词
1
The end is nigh
方法一、dbx
方法二、bdw
方法三、daw大小写转换
1
2
3
4this is a HTML doc!
g~
gu
gU插入模式删除操作
相当于 Backspace
删除前一个单词
删除至行首
这些命令在 shell 下也有效插入模式切换到普通模式
<C-[> 等效与插入模式切换到普通模式执行一次命令后再次回到插入模式 在插入模式种使用
{register} 将寄存器种的内容粘贴到光标后面。使用 :reg 查看寄存器及寄存器种的内容,其中 + 为系统剪切板。需要注意的是如果开启 textwidth 和 autoindent 选项时粘贴文本可能会发生不必要的缩进,发生格式错乱。这时,可以使用 {reg} 按原意插入文本并修正不必要的缩进,也可以退回到普通模式种对文本进行粘贴。 使用=寄存器做运算,在插入模式下
={算术表达式} {字符编码} 插入非常用字符,如果 后面的表达式是一个非数字键,则会插入这个非数字键本身所代表的字符。例如在 expandtab 选项开启的情况下, 键会插入与其等宽的多个空格,但是使用 会插入其本身字符,不管 expandtab 选项是否开启。 二合字母在插入模式下使用
{char1}{char2} 可输入二合字母,如 ¼ 14,使用 :h digrah-table 可以查看二合字母列表 使用
键或者 R 切换到替换模式,r 替换当前字符,使用 tabstop 设置 键占宽度,这导致 在替换模式下会出现位置错乱,因此可以使用 gR 触发虚拟替换模式,虚拟替换模式是按屏幕实际显示的宽度来替换字符的。 可视模式
面向字符的可视模式 v 普通模式与此模式之间切换
面向整行的可视模式 V 普通模式与此模式之间切换
面向列块的可视模式普通模式与此模式之间切换 注:
gv 用于重选上一次由可视模式所选择的文本范围
可视模式下 o 用于切换选择文本的活动段选择模式
可以在可视模式与选择模式之间切换,选择模式中输入字符会替换选中内容。 在可视模式下,. 模式容易出现意想不到的问题,因此在面对重复修改时应尽量选操作命令而不是可视化命令。
命令行模式 Ex 命令
:edit 编辑
:write 保存
:read 读取文件内容粘贴到光标所在位置
:split 分割窗口 sp/vs操作缓冲区文本的 Ex 的命令
:[range]delete [x] 删除指定范围内的行[到寄存器x种]
:[range]yank [x] 复制指定范围的行[到寄存器x种]
:[range]put [x] 粘贴 x 寄存器内容
:[range]copy {address} 拷贝指定行内容到 {address} 下,:copy 缩写为 :t 或 :co
:[range]move {address} 移动,:move 缩写为 :m
:[range]jion 连接指定行
:[range]normal {commands} 对指定范围内所有行执行命令
:[range]substitute/{pattern}/{string}/flag 替换
:[range]global/{pattern}/[cmd] 对所有匹配到的所有行都执行Ex 命令[cmd]
命令模式下范围语法
1 文件第一行
$ 文件最后一行
0 虚拟行,位于第一行前
. 光标所在行
‘m 包行位置标记 m 的行
‘< 高亮选区的起始行
‘> 高亮选区的结束行
% 整个文件,:1,$ 等效在命令模式下,使用 @: 重复上次的 Ex 命令,相当于普通模式下的 . 使用
不全 Ex 命令, 列出不全列表, 补全行为可以通过 wildmode 选项设置,默认补全行为是 full,设置 set wildmode=longest,list 即和 bash shell 下的补全方式相同。 在命令模式下使用
将光标下的单词输入到命令行中,使用 可以回溯历史命令,默认历史命令保留 20 条,使用 history 参数可以设定保留的历史命令条目数。 set history = 500。也可以使用 和 组合键来反向或正向遍历历史命令,但 和 命令有个缺点,它们不会像 和 那样对历史命令进行过滤。
通过创建下面的自定义映射项,我们可以把二者的优点结合到一起:1
2cnoremap <C-p> <Up>
cnoremap <C-n> <Down>使用 q: 调出历史命令列表
命令模式中运行 Shell 命令 :! [shellcmd],% 代表当前编辑的文件名,如果向在命令模式下连续执行几条命令,可以使用 :shell 开启一个交互的 shell 会话,exit 退出 shell 会话,可以使用 :read !{cmd} 将 shell 命令的输出读入当前缓冲区
:[range]write !{cmd} 在 shell 中执行 {cmd} ,以 [range] 作为其标准输入
:[range]!{filter} 使用外部程序 {filter} 过滤指定的 [range]
未完待续 ……