首页 > 代码库 > 《Vim实用技巧》笔记

《Vim实用技巧》笔记

Vim实用技巧

Table of Contents

  • 1. Vim决问题的方式

  • 2. 普通模式

  • 3. 插入模式

  • 4. 可视模式

  • 5. 命令行模式

    • 5.1. 操作文本的Ex命令

    • 5.2. range服务说明

    • 5.3. 补全

    • 5.4. 命令行窗口–使用vim的编辑能力编辑Ex命令

    • 5.5. 执行外部命令

  • 6. 管理多个文件

    • 6.1. 缓冲区列表管理

    • 6.2. 参数列表

    • 6.3. 窗口操作

    • 6.4. 标签页操作

  • 7. 打开及保存文件

    • 7.1. 打开文件

    • 7.2. 使用find查找文件

    • 7.3. 使用netrw管理文件系统

  • 8. 寄存器

  • 9. 宏

  • 10. 模式匹配

    • 10.1. 调整大小写敏感

    • 10.2. 调整正则表达式的匹配模式

    • 10.3. 特殊匹配符

    • 10.4. 统计当前模式的匹配个数

  • 11. 查找功能

  • 12. 替换功能

    • 12.1. 标志位总结

    • 12.2. 替换域中的特殊字符

    • 12.3. 使用寄存器内容

    • 12.4. 重复上一次substitute命令

  • 13. Quckfix列表与位置列表

  • 14. 与外部程序的交互

  • 15. Vim中的补全功能

  • 16. 拼写检查

    • 16.1. Vim拼写检查器的基本命令

    • 16.2. 使用其他拼写字典

    • 16.3. 在插入模式下更正拼写错误

1 Vim决问题的方式

  • >G命令会增加当前行到文档末尾的缩进层次

  • Vim中可重复的操作及回退

    目的操作重复回退
    做出修改{edit}.u
    在行内查找下一指定字符[前一个字符]f{char}/t{char};,
    在行内查找上一指定字符[后一个字符]F{char}/T{char};,
    在文档中查询下一处匹配项/pattern<CR>nN
    在文档中查询下一处匹配项?pattern<CR>nN
    执行替换:s/target/replacement&u
    宏操作q{register}{changes}q@{register}u
    执行Ex命令:Ex命令@:(:寄存器总是存储最后一次的Ex命令)u

2 普通模式

  • 学会把d{motion}与/查找动作一起使用,可以极大提高效率

  • 改变大小写

    • gU{motion} 修改为大写

    • gu{motion} 修改为小写

    • g~{motion} 大小写翻转

    • gUgU 修改当前行为大写

    • gugu 修改当前行为小写

    • g~g~ 当前行大小写翻转

  • 缩进

    • >{motion} 增加缩进

    • <{motion} 减少缩进

    • ={motion} 自动缩进

  • 数字运算

    • C-a +1

    • C-x -1

  • 虚拟替换模式

    • gR 进入虚拟连续替换模式,它把tab当成一组空格来处理

    • gr 进入虚拟单词替换模式,它把tab当成一组空格来处理

  • 移动

    操作作用
    j k按照实际行向下向上移动
    gj和gk按照屏幕行向下向上移动
    ge反向移动到上一个单词的结尾
    gf跳转到光标所在字符串所表示的文件,通过配置suffixesadd选项,允许省略文件后缀名,通过配置path属性可以省略部分目录信息
    ``当前文件中上次跳转动作之前的位置
    `.上次修改的位置
    `^上次插入的地方
    `[上次修改或复制的起始位置
    `]上次修改或复制的结束位置
    `<上次高亮选区的起始位置
    `>上次高亮选区的结束位置
    H跳转到屏幕最上方
    M跳转到屏幕正中间
    L跳转到屏幕最下方
  • 按子串移动

    子串比单词的范围更大,它仅仅以空白字符作为分隔依据.

    • W 类似w,移动到下一个字串

    • B 类似b,移动到上一个字串

    • E 类似e,移动到子串的字部

    • gE 类似ge,移动到上一个字串的尾部

3 插入模式

  • 更正错误

    • C-h 删除前一个字符

    • C-w 删除前一个单词

    • C-u 删除到行首

  • 返回普通模式

    • ESC 或者 C-[ 切换到普通模式

    • C-o 切换到插入-普通模式

  • 寄存器

    • C-r {register} 访问寄存器中的内容

    • C-r C-p {register} 访问寄存器中的内容

    • C-r = 访问表达式寄存器,通过访问该特殊寄存器可以执行计算式甚至一段Vim脚本

  • 插入特殊字符

    • C-v u {1234} 以4为16进制编码来输入字符

    • 普通模式下ga 显示光标所在的字符编码

    • C-v 非数字键 插入这个按键本身所代表的字符

    • C-k{char1}{char2} 以二合字母插入非常用字符

    • :digraphs 查看可用的二合字母列表

    • :digraph-table 查看另一个更为有用的列表

4 可视模式

  • gv 重选上次的高亮选区

  • o 切换高亮选区的活动端

  • 当实用命令.重复对高亮选区所做的修改时,此修改会重复作用域相同范围的文本

  • 在windows下使用C-q进入列块编辑模式,而在linux下使用C-v进入列块编辑模式,在emacs的evil-mode下,也使用C-v进入列块模式

5 命令行模式

5.1 操作文本的Ex命令

命令用途
:[range]delete [register]删除指定范围的行到register中
:[range]yank [register]赋值指定范围的行到register中
:[line]put [register]在指定行后粘贴register的内容
:[range]copy {address}将指定范围的行拷贝到{address}所指定的行之下
:[range]move {address}将指定范围的行移动到{address}所指定的行之下
:[range]join连接指定范围的行
:[range]normal {commands}对指定范围的每一行执行普通命令
:[range]substitute/{pattern}/{string}/{flag}正则替换
:[range]global/{pattern}/{cmd}对给定范围内匹配的行,在上面执行Ex命令
:[range]vglobal/{pattern}/{cmd}global的取反
:[range]global!/{pattern}/{cmd}global的取反
:grep /vimgrep搜索关键字

5.2 range服务说明

符号地址
N文件的第N行
$文件的最后一行
0虚拟行,位于文件第一行的上方
.光标所在行
‘m包含位置标记m的行
‘<高亮选区的起始行
‘>高亮选区的结束行
%整个文件(:1,$的简写形式)


5.3 补全

  • C-d 显示可用的补全列表

  • Tab 自动补全

  • C-r C-w 插入光标下的单词

  • C-r C-a 插入光标下的子串

5.4 命令行窗口–使用vim的编辑能力编辑Ex命令

命令动作
q/打开查找命令历史的命令行窗口
q:打开Ex命令历史的命令行窗口
C-f从命令行模式切换到命令行窗口
:help cmdwin查看命令行帮助

5.5 执行外部命令

命令用途
:shell启动shell
:!{cmd}在shell中执行cmd
:read !{cmd}在shell中执行cmd,并把标准输出插入到光标下方
[range]write !{cmd}在shell中执行{cmd},以[range]作为其标准输入
[range]!{fiter}使用外部命令{filter}过滤指定的[range]

6 管理多个文件

6.1 缓冲区列表管理

命令用途
:ls列出缓冲区列表
:bnext上一个缓冲区
:bprev下一个缓冲区
:bfirst列表开头的buffer
:blast列表结尾的buffer
:buffer N第N号buffer
:buffer {bufname}匹配bufname的buffer
:bdelete N1 N2…删除buffer
:N,M bdelete删除buffer
:bufdo在:ls列出的所有缓冲区执行Ex命令


6.2 参数列表

参数列表记录了在启动时作为参数传递給Vim的文件列表. 通过设置参数列表,可以通过:nexthe :prev来打开下一个/上一个文件

  • :args 显示当前参数列表的内容

  • :args {filelist} 设置文件列表

  • :args {文件通配符} 设置符合文件通配的文件列表

    其中,

  1. *符号用于匹配0到多个字符,但范围仅限于指定的目录

  2. ** 也匹配0到多个字符,范围递归进入目录的子目录

:args `shell命令` 以shell命令的输出作为参数列表的值:argdo命令在列表中的每个缓冲区上执行同一条命令在使用:argdo/:bufdo前,最好启用‘hidden‘设置.启用hidden选项后,如果活动的缓冲区的内容发生了变化,Vim会在离开该缓冲区时自动将其隐藏. 否则Vim会阻止离开该缓冲区. 这样我们就无法用:argdo或:bufdo命令来修改一组缓冲区.

6.3 窗口操作

操作用途
C-w s水平分割当前窗口
C-w v垂直分割当前窗口
:split {file}水平分割当前窗口,并在新窗口载入file
:vsplit {file}垂直分割当前窗口,并在新窗口载入file
C-w w在窗口间循环切换
C-w c或:close关闭活动窗口
C-w o或:only只保留活动窗口,关闭其他所有窗口
C-w =使所有窗口等宽,等高
C-w _最大化活动窗口的高度
[N]C-w _将活动窗口的高度设为N行
C-w 竖线类似C-w _,但设置窗口的宽

6.4 标签页操作

Vim的标签页是可以容纳一系列窗口的容器,它类似于Linux中的虚拟桌面的概念

命令用途
:tabedit {filename}在新标签页打开{filename}
C-w T把当前窗口移到一个新标签页
:tabclose关闭当前标签页
:tabonly只保留当前标签页,关闭其他标签页
:tabnext{n}或{N}gt切换到编号为{N}的标签页
:tabnext或gt切换到下一个标签页
:tabprevious或gT切换到上一个标签页
:tabmove [N]将当前标签页移动到第N个位置,默认为最后一个位置

7 打开及保存文件

7.1 打开文件

  • :pwd 查看当前工作目录,所谓工作目录只的是vim启动时的那个目录,该目录 不随着 buffer路径的不同而不同

  • :edit %<TAB> %符号代表缓冲区中的完整路径

  • :edit %:h :h修饰符会去除文件名,但保留路径部分,使用这种方式可以快速打开与活动缓冲区中文件属于同一个目录的文件

7.2 使用find查找文件

:find命令运行我们通过文件名打开一个文件,而无需输入该文件的完整路径.

在使用该功能前先需要配置path选项

  1. :set path+=app/**

  2. :find recvfrommb<tab>

7.3 使用netrw管理文件系统

8 寄存器

  • 使用寄存器

    "{register}复制/删除操作

  • 无名寄存器

    若没有指定寄存器,则Vim缺省使用无名寄存器,可以使用""表示. 它是极其易变的

  • 复制专用寄存器

    使用y{motion}时,不仅会把内容存入无名寄存器,而会存入复制专用寄存器,可用"0来表示

  • 有名寄存器

    用小些字母a-z引用寄存器,会覆盖原寄存器内容. 而用大写字母A-Z引用寄存器,则会将新内容添加到该寄存器的原有内容之后

  • 黑洞寄存器

    使用"_来引用,该寄存器不保存任何内容

  • 系统剪贴板

    使用"+来引用,该寄存器与系统剪贴板相关联

  • 主剪贴板

    X11视窗支持另一种叫做主剪贴板的剪贴板(primary),它高村者上次被高亮选中的文本,可用用鼠标中键把他们粘贴出来. 使用"*来引用

    Windows/Mac OS没有主剪贴板的概念,因此"*也代表系统剪贴板

  • 其他寄存器

    寄存器内容
    "=表达式寄存器
    "%当前文件名
    "#轮换文件名
    ".上次插入的文本
    ":上次执行的Ex命令
    "/上次查找的模式

9 

  • 对多行同时执行某个宏

    • [range]normal @{register}

    • global/pattern/@{register}

  • 对多个文件同时执行宏

    • :argdo normal @{register}

    • :bufdo normal @{register}

10 模式匹配

10.1 调整大小写敏感

  • 匹配式中任何地方出现\C则表示开启大小写敏感模式

  • 匹配式中任何地方出现\c则表示大小写不敏感模式

10.2 调整正则表达式的匹配模式

  • \v表示开启very magic搜索模式,即假定除_,大小写字符和数字之外的所有字符都具有特殊含义

  • \V表示开启very nomagic原义开关,即默认消除大多数字符上的特殊含义.

10.3 特殊匹配符

  • <匹配左定界符

  • >匹配右定界符

  • \_s匹配空格或者回车符

  • %()只使用括号的分组功能,不捕获其内容

  • \ze和\zs对匹配进行裁剪

    一个匹配的边界通常对应于一个模式的起始与结尾. 但我们可以使用元字符\zs和\ze对匹配进行裁剪,使其成为这个完成模式的一个子集.

    \zs标志着一个匹配的起始,\ze用来界定匹配的结束


10.4 统计当前模式的匹配个数

使用:%s///gn就可以统计当前模式的匹配个数

标志位n会抑制正常的替换动作. 该命令不会对每次匹配进行替换,而是简单地统计匹配的次数

11 查找功能

  • /pattern//e 定位到查找匹配的结尾

  • // 将查找域留空,则Vim将重用上一次的查找模式

  • 类似的s//中将查找域留空,Vim也会重用上一次的查找模式

  • normal模式下q/打开查询历史的命令行窗口

12 替换功能

12.1 标志位总结

标志位功能
g修改一行内的所有匹配
c让我们有机会可以确认或拒绝每一处修改
n不真正作替换,而只报告本次substitute命令匹配的个数
e屏蔽错误提示
&指示Vim重用上一次substitute命令所用过的标志位

12.2 替换域中的特殊字符

具体可用过:h sub-replace-special来查询完整的列表

符号描述
\r插入一个换行符
\t插入一个制表符
\\插入一个反斜杠
\{数字}插入第N个子匹配
\0插入匹配模式的所有内容
&插入匹配模式的所有内容
~使用上一次调用substitute时的替换域
\={Vim Script}插入{Vim Script}表达式的结果

12.3 使用寄存器内容

在命令模式下也能通过C-r{register}的方式来将寄存器内容插入命令行.

因此在输入查询域时可以用C-r\来代替

12.4 重复上一次substitute命令

  • 使用g&在整个文件范围内重复substitute命令

  • 使用[range]&&在指定范围内重新执行替换操作.

  • normal模式下的&命令是:s的同义词,用于重复上一次的替换操作.但它不包含替换的标志位.

13 Quckfix列表与位置列表

对于每一条用于填充quickfix列表的命令都有一条对应的命令,把结果保存到位置列表.

:make,:grep以及:vimgrep会实用quickfix列表,而:lmake,:lgrep,:lvimgrep实用位置列表.

这两者的区别在于在任一特定的时刻,只能有一个quickfix列表,而位置列表却可以有多个.

命令用途
:cnext跳转到下一项
:cprev跳转到上一项
:cfirst跳转到第一项
:clast跳转到最后一项
:cnfile跳转到下一个文件的第一项
:cpfile跳转到上一个文件的最后一项
:cc N跳转到第N项
:copen打开quickfix窗口
:cclose关闭quickfix窗口
:colderquickfix的前一个版本
:cnewquickfix的后一个版本

位置窗口的操作,只需要把quickfix的命令起始字符改为l即可

14 与外部程序的交互

  • makeprg选项允许我们指定运行:make时所调用的程序

  • errorformat选项允许我们告诉Vim如何解析:make产生的结果

  • grepprg选项允许我们指定允许:grep所调用的程序

  • grepformat选项指示Vim如何解析来自:grep命令的输出结果

  • :vimgrep命令允许我们实用Vim自带的正则表达式引擎,实现跨越文件的查找功能

    :vimgrep[!] /{pattern}/[g][j] {files}

15 Vim中的补全功能

  • ignorecase选项会影响到补全时的大小写敏感问题

  • 触发自动补全的方法

    命令补全类型
    C-n普通关键字,可以通过设置complete选项来定制普通关键字补全时所扫描的位置
    C-x C-n当前缓冲区关键字
    C-x C-i包含文件关键字,Vim本身就理解C语言的包含方式,但通过设置include选项,我们也可以让它了解其他语言的对应提示符
    C-x C-]tag文件关键字
    C-x C-k字典查找,可以通过dictionary选项来指定一个或多个含有单词列表的文件
    C-x C-l整行补全
    C-x C-f文件名补全,需要注意的是,Vim的文件自动补全功能只相对于工作目录的路径进行扩展,而不是相对于当前编辑文件的路径. 可以通过:cd命令来却换工作目录,:cd -切换到之前的工作目录
    C-x C-o全能补全
  • 与自动补全的弹出式菜单相互交互

    按键作用
    C-n / C-p实用下一个/上一个匹配项
    C-y确认选用当前选中的匹配项
    C-e还原最少输入的文本
    C-h /BackSpace从当前匹配项删除一个字符
    C-l从当前匹配项增加一个字符
    {char}中止补全,并插入字符

16 拼写检查

16.1 Vim拼写检查器的基本命令

命令用途
:set spell开启检查
[s 或 ]s在拼写错误间响应地进行反向及正向的跳转
z=来获取Vim提供的更正建议列表,也可以使用N z=来跳过提示,直接采纳第N个更正建议
zg把当前单词添加到拼写文件
zw将当前单词从拼写文件中删除
zug撤销对当前单词的zg或zw命令

16.2 使用其他拼写字典

Vim默认以英文字典作为拼写字典,通过配置spelllang选项可以让我们更改 本地缓冲区 的缺省设置.

如果我们试着加载某个尚未支持的拼写文件,Vim会自动为我们提供下载和安装的方法

通过配置spellfile选项,我们可以指定一个文件路径,用于保存由zg和zw命令所添加,删除的单词

spellfile可以设置多个文件,在zg前加上数字标号能指定添加到那个文件中

16.3 在插入模式下更正拼写错误

在插入模式下按C-x s 或C-x C-s会触发一个特殊的自动补全(参见compl-spelling).

Vim会从光标位置开始进行反向扫描,直到发现一处拼写错误为止;然后提供更正建议.


《Vim实用技巧》笔记