Back
Featured image of post vim命令笔记

vim命令笔记

传说中的屠龙神器

命令描述
ga查看当前的ascii值,并且打印八进制十进制十六进制的值

符号匹配

符号作用
\s表示匹配任意空白字符,包括空格,制表符,换页符
\_s

* 符号用于匹配0个或多个字符(:h wildcard)

** 符号也用于匹配0个或多个字符,但它可以递归进入指定目录的子目录 (:h starstar-wildcard)

技巧37 用缓冲区列表管理打开的文件

缓冲区列表命令

命令功能
Ctrl+^在列表中互相切换
:bprev在列表反向移动,每次移动一项
:bnext在列表正向移动,每次移动一项
:bnext !强制移动
:edit!从磁盘重新读取文件(会覆写缓冲区的内容)
:bfirst跳转到列表的开头
:blast跳转到列表的结尾
:buffer N通过:ls显示的数字来进行切换
:bufdo在:ls列出的所有缓冲区上执行Ex命令
:bdelete N删除缓冲区

技巧38 用参数列表将缓冲区分组

参数列表

参数列表易于管理,适用于对一批文件进行分组,使其更容易访问

命令功能
:argdo在参数列表中的每个文件执行一条Ex命令
:args查看参数列表
:args {arglist}arglist可以包括文件名通配符,shell的输出结果,要用反撇号`,如`cat test.txt`,同样可以包含glob模式,如**.*.js表示在列表中加入当前目录和子目录下所有的以js文件结尾的文件在列表中增加几个文件
:next向前遍历参数列表中的文件
:prev向后遍历参数列表中的文件

技巧39 管理隐藏缓冲区

在退出时处理隐藏缓冲区的方式

命令用途
:w[rite]把缓冲区内容写入磁盘
:e[dit]!把磁盘文件内容读入缓冲区(即回滚所做修改)
:qa[ll]!关闭所有窗口,摒弃修改而无需警告
:wa[ll]!把所有改变的缓冲区写入磁盘

技巧40 将工作区切分成窗口

:h window

命令功能
Ctrl+w+s水平切分当前窗口,新窗口仍显示当前缓冲区
Ctrl+w+v垂直切分当前窗口,新窗口仍显示当前缓冲区
:sp[lit] {file}水平切分当前窗口【并在新窗口中载入{file}】
:vsp[lit] {file}水平切分当前窗口【并在新窗口中载入{file}】
Ctrl+w+w在窗口间循环切换
Ctrl+w+j|k切换到上|下的窗口
Ctrl+w+h|l切换到左|右的窗口

实际上,<C-w><C-w>完成的功能和<C-w>w相同,就是说可以一直按住<Ctrl>键,然后输入ww(或wj,或上表中的其他命令)来切换活动窗口。<C-w><C-w>要比<C-w>w更容易按一些。

关闭窗口

ex命令普通模式命令用途
:clo[se]<C-w>c关闭活动窗口
:on[ly]<C-w>o只保留活动窗口,关闭其他所有窗口

改变窗口大小及重新排列窗口

命令用途
Ctrl+W+=使所有窗口等宽等高
Ctrl+w+_最大化活动窗口的高度
Ctrl+w+|最大化活动窗口的宽度
[N]Ctrl+w+_把活动窗口的高度设为[N]行
[N]Ctrl+w+|把活动窗口的宽度设为[N]列

技巧41 用标签页将窗口分组

命令功能
:lcd {path}设置当前窗口的本地工作目录只影响当前窗口,而非当前标签页。如果一个标签页包含了两个或更多的窗口,可以用:windo lcd {path}命令为所有这些窗口设置本地工作目录。
:tabedit {filename}打开一个新的标签页,如果省略了{filename}参数,那么 Vim 会创建一个新标签页,里面包含一个空缓冲区
:close如果活动标签页中只包含一个窗口,那么:close命令将关闭此窗口以及包含此窗口的标签页。
:tabe[dit] {filename}在新标签页中打开 {filename}
<C-w>T把当前窗口移到一个新标签页
:tabc[lose]关闭当前标签页及其中的所有窗口
:tabo[nly]只保留活动标签页,关闭所有其他标签页

在标签页间切换

ex命令普通模式命令功能
:tabn[ext] {N}{N}gt切换到编号为 {N} 的标签页
:tabn[ext]gt切换到下一标签页
:tabp[revious]gT切换到上一标签页

重排标签页

:tabmove [N]

  • 当 [N] 为0时,当前标签页会被移到开头
  • 如果省略了[N],当前标签页会被移到结尾。

基础命令

  • <C-a> 代表Ctrl + a,其他同理

  • A 在光标所在行末尾添加内容

  • a 在光标之后添加内容

  • aw是指一个文本如一个词

  • ^ 快速移动到行首

  • $快速移动到行尾

  • db删除从光标其实位置到单词开头的内容

  • <C-a><C-x>分别对数字执行加和减操作,如光标在字符 5 上面执行10<C-a>就会把它变成 15, 如果 5 的前方或者当前位置处运行10<C-a>就会把它变成 6

  • 在 Vim 中如果遇到 0 开头的数字比如 007 就会被认为是八进制的数字,如果想要修改这个可以在 vimrc 中添加

    set nrformats=
    
  • <C-o> 进入插入-普通模式, 可以执行一遍普通模式后进入插入模式

  • zz重绘屏幕,便且吧当前行显示在窗口正中

  • <Esc>, <C-[>切换到普通模式

  • 在插入模式下<C-h>为删除前一个字符(同退格键)

  • 在插入模式下<C-w>为删除前一个单词

  • 在插入模式下<C-u>为删除到行首

  • c修改

  • d删除

  • y复制到寄存器

  • g~反转大小写

  • gu反转为小写

  • gU反转为大写

  • >增加缩进

  • <减小缩进

  • = 自动缩进

  • !使用外部程序过滤{motion}所跨越的行

  • Vim 的语法大部分当一个操作符连续调用两次时,它会作用于当前行

  • dap删除一个段落

  • daB删除一个{}块

  • :%s/content/copy/g 替换所有 5

第一章: Vim 解决问题的方式

技巧 1: 结识 . 命令

  1. x 命令会删除光标下的字符
  2. >G 会增加缩进等级

技巧 2: 不要自我重复

  1. C 删除从光标所在处往后的行并且进入插入模式 = c$.
  2. s 删除光标后面的字符并且进入插入模式 = cl.
  3. S 删除光标所在行并且在删除行进入插入模式.
  4. I 跳转到行首然后进行插入.
  5. A 跳转到行尾然后进行插入.

技巧 3: 以退为进

技巧 4: 执行, 重复, 回退

  1. ; 重复查找上次 f 命令所查找的字符.
  2. @ 用来重复任意的 Ex 命令.%%%%%%%%%%%%
    目的操作重复回退
    做出一个修改{edit}.u
    在行内查找下一指定字符f{char}/t{char};,
    在行内查找上一指定字符F{char}/T{char};,
    在文档中查找下一处匹配项/pattern<CR>nN
    在文档中查找上一处匹配项?pattern<CR>nN
    执行替换:s/target/replacement&u
    执行一系列修改%%%%%%%qx{change}q@xu

技巧 5: 查找并手动替换

  1. * 查找当前光标下的单词.
  2. w 当前光标位置到单词末尾.
  3. cw 删除从光标位置到单词结尾的字符并且进入插入模式.

技巧 6: 结识 . 范式

第一部分 模式

第二章: 普通模式

技巧 7: 停顿时请移开画笔

技巧 8: 把撤销单元切成块

技巧 9: 构造可重复的修改

  1. b 跳转到单词的开头.
  2. db 删除从光标起始位置到单词开头的内容.
  3. dw 删除从光标起始位置到单词结尾的内容.
  4. aw 文本对象(text object).
  5. daw 删除所在光标位置的单词.

技巧 10: 用次数做简单的算术运算

  1. <C-a> 对光标所在位置的数字进行加.
  2. <C-x> 对光标所在位置的数字进行减.
  3. 注意如果前面是以 0 开头的, 会被认为成八进制.

技巧 11: 能够重复, 就别用次数

技巧 12: 双剑合璧, 天下无敌

  1. g 在这里可以当中前缀字符,足以该表其后面的按键行为.

  2. g~ 反转大小写.

  3. gu 转换为小写.

  4. gU 转换为大写.

  5. y 复制到寄存器.

  6. Vim 中一条额外规则, 当一个操作符命令被连续调用两次时, 它可以作用于当前行,dd删除当前行,>>缩进当前行,而gU是一种特殊情况, 我们既可以用gUgU,也可gUU.

  7. > 增加缩进.

  8. < 减少缩进.

  9. = 自动缩进.%%%%%%%%%%%%%

  10. ! 使用外部程序过滤{motion}所跨越的行.

  11. 自定义操作符.

第三章: 插入模式

技巧 13: 在插入模式中即可即时更正错误

以下是在插入模式下, 且不是 Vim 首创,在 bash shell 也可以使用它们.

  1. <C-h> 删除前一个字符.
  2. <C-w> 删除前一个单词.%%%%%%%%%%%有问题不能复现
  3. <C-u> 删除到行首.

技巧 14: 返回普通模式

  1. <Esc>, <C-[> 从插入模式切换回普通模式
  2. <C-o> 从插入模式切换到插入普通模式, 是普通模式的一个特例, 它能执行一个普通模式命令, 执行完后就返回到插入模式.

技巧 15: 不离开插入模式, 粘贴寄存器中的文本

  1. yt 是复制到专用寄存器中.%%%%%%%%%%%
  2. <C-r>0 把复制到的文本粘贴到光标所在位置. 它的一般格式是<C-r>{register},其中{register}是我们想要插入的寄存器的名字.%%%%%%%%

技巧 16: 随时随地做运算

  1. ???????????

技巧 17: 用字符编码插入非常用字符

  1. <C-v>{code} 用字符编码插入非常用字符,如<C-v>u00bf输入¿,u 的意思是用十六进制.
  2. ga 限速当前光标下的编码,分别以十进制和十六进制的形式限速.

技巧 18: 用二合字母插入非常用字符

  1. <C-k>{char1}{char2} 用二合字母插入非常用字符,如<C-k>?I输入¿,详细用法:h digraphs-default,查看可以用的二合字母列表:digraphs或者是:h digraphs-table.

技巧 19: 用替换模式替换已有文本

  1. <Insert> 按键,可以在插入和替换模式下进行切换, 同R.
  2. R 命令进入的是替换模式, 这个模式下某些字符回变得复杂化, 如制表符,它在文件中以单个字符表示, 但是在屏幕中却会占用若干列的宽度, 此宽度由tabstop设置. 如果把光标移动倒制表符上,然后进入替换模式, 那么我们所输入的下一个字符将会替换制表符, 假设tabstop设为 8(缺省值), 那么该操作就是把 8 个字符替换成了一个字符. 而 Vim 还有另一种虚拟替换模式,由gR触发, 它会把制表符当成一组空格进行处理. 假设把光标移动倒制表符上,然后进入虚拟替换模式, 在输入前 7 个字符时, 每个字符都会被插入到制表符之前, 最后, 当输入了第 8 个字符时, 该字符将会替换制表符.

第四章

技巧 20: 深入理解可视模式

技巧 21: 选择高亮选区

  1. 激活可视模式
命令用途
v激活面向字符的可视模式
V激活面向行的可视模式
<C-v>激活面向列块的可视模式
gv重选上次的高亮选区
  1. 在可视模式之间进行切换
按键操作用途
<Esc> | <C-[>回到可视模式
v | V | <C-v>切换到普通模式, 分别对应面向字符可视模式, 面向行的可视模式, 面向列块的可视模式
v切换到面向字符的可视模式
V切换到面向行的可视模式
<C-v>切换到面向列块的可视模式
o重选高亮选区的活动端
  1. e 向后到单词的末尾.

技巧 22: 重复执行面向行的可视命令

技巧 23: 只要可能, 最好用操作符命令

  1. it 是一种文本对象(text object).
  2. vit 选择标签内的内容. 如<a href="#">one</a>,使用vit就会高亮 one.

技巧 24: 用面向列块的可视模式编辑表格数据

技巧 25: 修改列文本

  1. 在插入时只影响顶行, 但是按下Esc后将会正常插入所选的区域 ????自己的总结

技巧 26: 在长短不一的高亮块后添加文本

第五章 命令行模式

技巧 27: 结识命令行模式

  1. 读写文件 :edit.

  2. 创建及销毁新标签页 :tabnew,:tabclose.

  3. 分割窗口 :split :sp.

    1. <C-w> k|j|h|l 移动光标到上下左右.
    2. <C-w> K|J|H|L 移动窗口到上下左右.
  4. 操作参数列表 :prev/:next及缓冲区列表:bprev/:bnext.

  5. 更多 Ex 命令 :h ex-cmd-index.

  6. 操作缓冲区文本的 Ex 命令

    命令用途
    :[range]delete [x]删除指定范围内的行(到寄存器 x 中)
    :[range]y[ank] [x]复制指定范围内的行(到寄存器 x 中)
    :[range]put [x]在指定行后粘贴寄存器 x 中的内容
    :[range]co[py] {address}把指定范围内的行拷贝到{address}所指定的行之下
    :[range]m[ove] {address}把指定范围内的行拷贝到{address}所指定的行之下
    :[range]j[oin]把指定范围的行连接到一起变成一行:
    :[range]norm[al] {commands}对指定范围内的每一行执行普通模式命令{commands}
    :[range]s[ubstitute]/{pattern}/{string}/[flags]对指定范围内出现{pattern}的地方替换成{string}
    :[range]g[lobal]/{pattern}/[cmd]对指定范围内匹配{pattern}的所有行,在其上执行 Ex 命令{cmd}

技巧 28:

Licensed under CC BY-SA 4.0
comments powered by Disqus