My note
基本上是对 vim 使用技巧 的总结。
模式
普通模式(normal)
普通模式一般是我们用的最多的模式,我们用到的点范式,操作符等等都是在普通模式中进行了。操作时,要有意识的记着 “执行,回退,重复”,
有助于我们提高效率,比如说在选择命令或范围时,我们选择具有可重复性的。这里回退可以按 u 撤销,<C-r> 撤销刚撤销的。
.- NUM+命令 重复某个命令多少次
- 操作符+动作命令(决定范围)
文本对象(可以在上面第三条命令中用到)
- 分隔符文本对象: 如
i) i" it - 范围文本对象: 如
iw is ip
对于分隔符,i 选择的不包括分隔符,a 包括分隔符;
对于文本块(单词,句子和段落),i 表示仅仅该文本块,a 表示文本块加空格或空行
插入模式(insert)
插入模式的主要用途就是我们写东西嘛,
-
撤销
- <C-h> 删除前一个字符
- <C-w> 删除前一个单词
- <C-u> 删至行首
-
返回普通模式
- <Esc>
- <C-[>
- <C-o> 暂时切换到普通模式,执行玩一次动作命令后回到插入模式
可视模式(visual)
可以让我们选中某一块区域进行某项操作。
v:面向字符的可视模式V:面向行<C-v>:面向块o:切换高亮选取的活动端
命令行模式
- 执行
Ex 命令可在任意位置上执行命令,且可以在多行上执行某一命令。
Ex 命令的一般的样子 范围 具体操作命令 [结果到那里去]
范围就是一般的范围,和 substitute 中一样,模板是这样{start}, {end}, 可以是具体数字指定行,
也可以是特殊含义的(. 0 G %),还可以使用高亮选择和用模式查找指定。
命令操作有很多,比如 delete yank put copy move join global substitute
最后一个看具体命令,比如delete yank 什么的,我们可以指定到某一行或寄存器
-
重复
{range}normal 操作@:, 是的,因为:寄存器保存最后执行的命令行命令
-
回溯
- 通过方向键向上或向下向前向后遍历 Ex 命令
- 通过命令行窗口来看,
q:,
-
运行 shell 命令
:!{cmd}: 一次性 shell 命令:shell: 执行多条
vim 允许我们在不退出 vim 的情况下运行 shell 命令
我们还可以使用 :read !{cmd} 把 {cmd} 输出重定向到当前缓冲区,使用 :write !{cmd} 把缓冲区的内容作为 {cmd}
的标准输入。注意,当我们对 :!{cmd} 指定了范围时(:[range]!{cmd}),情况有所不同,将会把范围的内容作为标准输入传给{cmd},
然后把其标准输出覆盖原来的范围内的内容。
移动
行内移动
h l0 $^ g_b eB Ege wgE Wf{char} F{char};重复上一次查找,回退上一次查找t{char} T{char}%
行间移动
j kgg GNUM G 或者 :NUM<CR>H L
通过查找来移动
* #正向查找光标下的单词和反向查找- 通过查找
查找
\ ?正向查找和反向查找n N正向下一个和反向上一个- 开始
incsearch可能会使结果更加直观实时, 使用:nol(nohlsearch) 暂时
关闭高亮查找功能
模式
\vvery magic 搜索模式,假定除_大小写字母及数字之外的所有字符具有特殊含义\Vvery nomagic 搜索模式,原义开关,使用原本的意思\c \C忽略大小写和区分大小写,会覆盖缺省的大小写敏感设置smartcase使用ignorecase可能会影响 vim 关键字自动补全,使用 smartcase
时模式中只有小写则忽略大小写,一旦有一个大写字母,则会区分大小写- 使用
<> zs ze \w \W来界定单词边界(<>是零宽度元字符,本身不匹配任何字符,
仅表示单词与围绕此单词的空白字符或标点符号之间的边界。元字符\zs标志着一个匹配的开始,
\ze界定结束。可以用\W\ze\w来模拟<)
替换
:[range]s[ubstitute]/{pattern}/{string}/[flags]
- range: 什么都不加默认是当前行,
%是全部,'<,'>是可视选择的范围 - {pattern}: 省略则默认是上次的查找内容,这使得我们可以把查找和替换字符串分开,
在复杂的场景下可能会有帮助,减小任务耦合性,但这样会导致历史记录中留下不完整的记录,
所以你可以使用<C-r>/把上次的查找内容粘贴过来 - 使用
~表示上次的替换内容,我们当然可以使用寄存器,但是粘贴过来的字符还是要注意转义,
我们可以简单地引用某个寄存器来避免这个问题\=@{register} - flags:
- g:一行内所有的匹配向
- c:修改前确认
- n:不执行替换而报告 substitute 命令匹配的个数
- e:屏蔽错误
- &:重用上次的标志位
我们可以指定一个范围,重新执行替换操作,使用 :[range]&& 就可以了, 注意 g& 是 :%&& 的快捷方式。
在多个文件中执行查找与替换时,首先当然是把文件加入参数列表啦 (比如 :args **/*.txt), 我们可以设置 :set hidden
使得我们在不保存当前文件的情况下跳至下一文件,还可以使用 e 标志位屏蔽错误消息。
宏
定义
q{register}{your defination}q 按 q 开始,指定一个寄存器,开始录制一个宏, 再一次按 q 结束
运行宏
- 一次:
@{register}或者使用@@来调用最近用过的宏。 -
多次:
-
在当前文件中:
- 串行:
NUM@{register} - 并行:可视选中要执行的范围,运行
:'<,'> normal @{register}
串行的话,遇到错误或异常就会立即停止,不再执行;并行的话,某一行失败不会影响其他。
- 串行:
-
多个已经打开的文件
- 串行:录制结束末尾加上
:next来跳转到下一个文件,运行时使用NUM@{register} - 并行:
:argdo normal @{register}
- 串行:录制结束末尾加上
-
运改宏
首先说说如何查看自己定义的宏,:reg {register} 就可以啦
如果想要对现有宏进行修改,使用 qA 即可在末尾追加命令。
或者直接拷贝到当前文档再慢慢修改嘛,那么使用 :put {register} 会把指定宏的内容粘贴到当前行的下方,
修改好了之后呢,再扔回去嘛,比如说 "{register}y$"