【最新版《Mastering Vim》封面,涵盖 Vim 9.0 版特性】
写在前面
花了整整两天时间,终于把第二章的条记梳理出来了。本章初学时感觉知识点十分庞杂,第二遍梳理要点才发现自成体系。虽然和我此前的《Vim Masterclass》专栏相比还有肯定差距,但本章与第一章都是全书的 Vim 基础汇总(篇幅共占全书三分之一之多),我在整理条记时只管避开《Vim Masterclass》专栏讲过的重点内容,并完整附上相关章节的链接地点。假如您对文中提到的知识点还比较生疏,我黑白常不建议您继承往后学的。须知磨刀不误砍柴工,打基础的时间是再怎么也不能省的,以免后期 “走火入魔”。牢记,牢记,牢记!!!
第二章 Vim 编辑与浏览高级技巧
本章概要
- Vim 插件的快速浅易安装方法(第 3 章详述);
- 多文件或长文本语境下 Vim 缓冲区、窗口、标签和折叠功能的应用;
- 使用 Netrw、NERDTree、Vinegar、CtrlP 等插件实如今 Vim 内部浏览复杂文件结构树;
- 涵盖各类文本对象的文件高级导航技巧,以及使用 grep 和 ack 工具实现跨文件检索技巧,以及 EasyMotion 插件的用法;
- 使用寄存器进行复制和粘贴利用
本章内容依然略显杂乱,提到的 Vim 知识点几乎涵盖了我在《Vim Masterclass》专栏先容过的所有高级话题。先撇开叙述的结构化和条理性不谈,这让我对后续需要真正 “精通” 的内容充满等待。这篇条记依然会延续上一章的行文风格,对基础专栏讲过的内容一概从简,仅梳理本书独有的、或此前专栏着墨不多的新内容。
为方便查阅,以下是本章涉及的《Vim Masterclass》专栏对应的文章位置(强烈保举从这里夯实基础):
- 【Vim Masterclass 条记06】S05L18 寄存器的用法
- 【Vim Masterclass 条记09】S06L22:Vim 文本的搜刮、查找与更换利用
- 【Vim Masterclass 条记10】S06L23:Vim 文本的搜刮、查找与更换利用
- 【Vim Masterclass 条记13】S07L28:Vim 文本对象
- 【Vim Masterclass 条记23】第十章:Vim 缓冲区与多窗口的用法概述 + S10L42:Vim 缓冲区的用法详解与多文件编辑
- 【Vim Masterclass 条记25】S10L45:Vim 多窗口的常用利用方法及相关注意事项
- 【Vim Masterclass 条记26】S11L46:Vim 插件的安装、使用与一样平常管理
本章源码:https://github.com/PacktPublishing/Mastering-Vim-Second-Edition/tree/main/Chapter02。
1 Vim 插件的快速安装
为方便后续先容,本章所有插件都默认安装到了 ~/.vim/pack/plugins/start/ 目录下,而且都是通过复制 GitHub 代码仓库实现安装的。但是作者跳过了很多关键细节,比如为什么要在 ~/.vim/ 下创建文件夹等。这里略作补充。
先通过 Vim 的 :set packpath? 下令找到 Vim 插件的默认根路径,确认为 ~/.vim:
然后按插件主动见效的方式,创建包名为 plugins 的现实存放路径,并完成相应插件的安装:
- mkdir -p ~/.vim/pack/plugins/start
- cd ~/.vim/pack/plugins/start
- git clone https://github.com/your/plugin/url
复制代码 本章会用到的插件 GitHub 仓库地点如下:
- Unimpaired:https://github.com/tpope/vim-unimpaired;
- NERDTree:https://github.com/scrooloose/nerdtree;
- Vinegar:https://github.com/tpope/vim-vinegar;
- CtrlP:https://github.com/ctrlpvim/ctrlp.vim;
- ack.vim:https://github.com/mileszs/ack.vim;
- EasyMotion:https://github.com/easymotion/vim-easymotion。
注意:这样安装的插件不会主动加载其文档到 Vim 帮助系统,必须手动执行 :helptags /your/plugin/doc/path 或者 :helpt ALL。为此,可以在 vimrc 文件添加如下下令,实现每次启动 Vim 强制加载插件文档 1:
- autocmd VimEnter * silent! helptags ALL " Load help files for all plugins
复制代码 提示
更多插件管理详情,请参考我的《Vim Masterclass》第 26 篇条记:Vim 插件的安装、使用与一样平常管理。
2 Vim 处理多个文件的方式
主要有四种方式:
- Buffers:即缓冲区(详见《Vim Masterclass》第 23 篇条记)
- Windows:即多窗口利用(详见《Vim Masterclass》第 25 篇条记)
- Tabs:标签页利用(新增)
- Folds:编辑区折叠(新增)
如下图所示:
【图 2.1 Vim 处理多个文件的方式:Buffers 缓冲区(未专门展示)、Windows】
2.1 Buffers 缓冲区
先容缓冲区常规利用时提到了一个叫 unimpaired 的插件(详见 GitHub 仓库)。该插件通过设置一系列方便实用的组合键提升编辑服从:
- ]b 与 [b:取代 :bn 和 :bp 来浏览缓冲区;
- ]f 与 [f:顺、逆序浏览当前缓冲区同级目录下的差别文件;
- ]l 与 [l:顺、逆序浏览位置列表(location list,第 5 章详述);
- ]q 与 [q:顺、逆序浏览快速修复列表(quickfix list,第 5 章详述);
- ]t 与 [t:顺、逆序浏览各标签页(第 4 章详述)。
更多用法参考插件文档(:help unimpaired)。
2.2 Windows 窗口
Ctrl + X:将当前窗口与下一个窗口进行位置互换。
调解窗口大小的下令:
- 高度增加 N 行::resize +N + Enter
- 高度镌汰 N 行::resize -N + Enter
- 宽度增加 N 列::vertical resize +N + Enter
- 宽度镌汰 N 列::vertical resize -N + Enter
简写形式:
- :res 等价于 :resize
- :vert res 等价于 :vertical resize
雷同用法还可以迁移到窗口切分上::vertical split 等效于 :vert sp 等效于 :vs
2.3 Tabs 标签
【图 2.2 Vim 中的多标签页示意图】
基本利用:
- 新增标签页::tabnew
- 切到下一个标签页:gt 或 :tabnext 或 :tabn
- 切回上一个标签页:gT 或 :tabprevious 或 :tabp
- 转到第一个标签页::tabfirst
- 转到最后一个标签页::tablast
- 移动当前标签到顺数第 N 个位置::tabmove N 或 :tabm N
- 在新标签中打开文件 file_name::tabe path/to/file_name(或 :tabedit)
2.4 Folds 折叠
控制内容折叠的 Vim 选项为 foldmethod,默认值为 manual,表示手动管理折叠地区。常见利用有:
- 创建折叠:
- zf:创建折叠。比方,选中一段文本后按 zf,会将选中的文本折叠。
- zF:在指定行数范围内创建折叠。比方,10zF20 会将第 10 行到第 20 行折叠。
- 打开折叠:
- zo:打开当前光标下的折叠。
- zO:递归打开当前光标下的所有折叠。
- 关闭折叠:
- zc:关闭当前光标下的折叠。
- zC:递归关闭当前光标下的所有折叠。
- 切换折叠状态:
- 删除折叠:
设置 Python 文件主动根据代码缩进进行折叠(写到 .vimrc 文件,重启 Vim 见效):
- " Fold python code lines based on indentations
- autocmd filetype python set foldmethod=indent
复制代码 Folds 的可视化效果设置
执行下令 :set foldcolumn=N(此中 N 为 0 到 12 之间的数字),Vim 将在左侧开辟一个宽度为 N 列字符间隔的可视化地区:
【图 2.3 设置宽度为 5 的 Folds 可视化地区效果图】
设置首次打开文件是主动展开所有折叠地区
对 .vimrc 文件作如下设置:
- " Mave all of the folds open when opening a new file
- autocmd BufRead * normal zR
复制代码 或者使用 foldlevelstart 选项,设置默认展开的最大层数(比方 5 层):
foldmethod 选项的常用取值:
- manual:默认值;
- indent:按缩进折叠;
- expr:基于自定义表达式来折叠,支持 Vimscript 语法;
- marker:基于特定的标记(marker)来定义折叠地区,默认为 {{{ + }}},实用于较长的 .vimrc 文件;
- syntax:基于语法高亮规则来折叠代码,但并非每种语言都主动支持(比方 Python 就不支持);
- diff:当 Vim 处于 diff 模式时主动见效(第 5 章详述)
由于书中并未展开,很多知识都在后面章节详述,这里仅举一例(marker):
【图 2.4 foldmethod=marker 时的折叠实测效果】
此外,也可以基于某种文件范例单独见效某种折叠方式,语法格式为:
- autocmd filetype <filetype> set foldmethod=<method>
复制代码 3 文件树形结构导航技巧
主要先容了五种树形导航技巧:
- 内置 Netrw 插件
- :e + wildmenu 选项
- 第三方 NERDTree 插件
- 第三方 Vinegar 插件
- 第三方 CtrlP 插件
3.1 内置的 Netrw 插件
Netrw 读作 /net-R-W/,即 Network Read Write 的缩写,由 Vim 社区大神 Tim Pope 贡献,旨在为 Vim 提供内置的文件浏览特性,让用户可以更轻松地浏览目录和管理文件,而且支持远程浏览。这是一款 非常容易上瘾 的隐藏了诸多强大功能的极致插件(详见 郑征大神的 Netrw 专题分享)。
打开方式:
- vim . + Enter
- :E + Enter;
- :e . + Enter;
- 以垂直分割窗口打开::Vex + Enter;
- 以水平分割窗口打开::Sex + Enter;
- 以靠左侧边栏形式打开:
ex + Enter;
初始界面:
【图 2.5 Vim 内置插件 Netrw 界面效果截图】
【Netrw 的远程浏览】:
- 通过 SFTP 协议访问某远程文件夹::Ex sftp://<domain>/<directory>/
- 通过 SCP 协议打开某远程文件::e scp://<domain>/<directory>/<file>
Netrw 实用小技巧补充
这里仅补充几个实用技巧(按 F1 查看详细文档):
- 新增文件:%,然后按要求输入文件名即可;
- 新增文件夹:d,然后按要求输入文件夹名称即可;
- 快速切换到当前用户主目录下:~;
- 隐藏或体现顶部提示栏:I
- 切换文件列表视图:按 i 依次轮换 ——
- 简约视图(thin,亦即默认视图,如图 2.5 所示)
- 详细视图(long,)
- 平铺视图(wide)
- 目录树视图(tree)
【补图 1:Netrw 的 long 详细视图】
【补图 2:Netrw 的 wide 平铺视图】
【补图 3:Netrw 的 tree 目录树视图】
值得一提的是,Tim Pope 对目录树视图似乎情有独钟,插件文档里还专门列出了目录树视图的示例利用流程(最佳实践):
翻译过来就是:
- vim .
- (用 i 切到目录树视图)
- 导航到目标文件
- v(在垂直分割窗口中编辑目标文件内容)
- ctrl-w h(切回 netrw 文件列表)
- P(在上一个窗口中编辑刚才选中的文件)
- ctrl-w h(切回 netrw 文件列表)
- P(在上一个窗口中编辑刚才选中的文件)
- ...以此类推...
复制代码 3.2 :e + wildmenu 选项
使用 :e 和 wildmenu 选项的组合,也可以快速浏览文件。如图所示(执行下令 :e + Space + Tab):
【图 2.6 使用 :e + wildmenu 快速浏览文件目录】
除了用 Tab 键切换候选项外,还可以在文件夹上通过方向键 ↓(下钻)↑(返回上一层)冲破当前路径限制,实现其他位置文件列表的快速浏览。
Vim 9 新增的 wildmenu 垂直弹窗特性
新版 Vim 9 还为 wildmenu 提供了垂直弹窗功能,通过下令 set wildoptions=pum + Enter 即可开启,体验感爆棚:
【图 2.7 Vim9 提供的垂直弹窗形式的 wildmenu 实测效果图】
3.3 NERDTree 插件
GitHub 安装地点:https://github.com/scrooloose/nerdtree
打开下令::NERDTree + Enter
【图 2.8 NERDTree 实测界面效果图】
将光标地点条目设置为 NERDTree 书签::Bookmark + Enter
标注的书签都存放在 NERDTree 的收藏夹中,通过大写的 B 下令控制其体现与隐藏:
【图 2.9 NERDTree 书签与收藏夹功能实测效果图】
NERDTree 收藏夹默认是隐藏的,可手动配置主动开启:
- let NERDTreeShowBookmarks=1 " Display bookmarks on startup.
复制代码 设置启动 Vim 主动体现 NERDTree 侧边栏:
- autocmd VimEnter * NERDTree " Enable NERDTree on Vim startup.
复制代码 当 NERDTree 变为最后一个开启的窗口时,默认不会主动关闭,通过在 vimrc 文件中配置下列内容可实现默认主动关闭:
- " Autoclose NERDTree if it's the only open window left.
- autocmd BufEnter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
复制代码 3.4 Vinegar 插件
Vinegar 插件也是 Tim Pope 的杰作(详见 GitHub 仓库),主要是为了办理 NERDTree 插件在复杂多窗口情况下利用困难的问题。比方,在下列情况中假如再打开一个文件,将很难一眼看出会在哪个窗口中加载目标内容:
【图 2.10 NERDTree 在复杂多窗口情况下编辑文件存在的问题】
按照上述截图的现实情况,终极 ingredient.py 文件将出如今加载 egg.py 文件的窗口中,因为 NERDTree 会在 最后创建的窗口中 打开下一个目标文件。
Vinegar 实现了在当前运动窗口加载目标文件的问题,而且通过 - 下令让文件列表就在当前窗口中渲染 Netrw 界面,选中文件也在当前窗口加载,利用十分丝滑。
但是假如已经安装了 NERDTree,再使用 - 时默认会出现 NERDTree 的界面。这需要在 vimrc 文件中设置以下内容进行修复:
- " Avoid NERDTree replaces Netrw
- let NERDTreeHijackNetrw=0
- packloadall
复制代码 这样,想在哪个窗口加载文件内容,就能在哪儿调出 Netrw 界面,十分方便:
【图 2.11 修复 NERDTree 劫持 Netrw 后的编辑界面效果图(拟在底部窗口加载目标文件)】
3.5 CtrlP 插件
CtrlP 插件(详见 GitHub 仓库)非常适合跨文件的浏览与访问,而且支持文件名的模糊查找。启动下令:Ctrl + P。
其他常见利用:
- Ctrl + J:令光标在 CtrlP 的候选列表中上移一项;
- Ctrl + K:令光标在 CtrlP 的候选列表中下移一项;
- Enter:打开当前光标地点的文件;
- Esc:关闭 CtrlP;
- Ctrl + F:候选列表下翻一页;
- Ctrl + B:候选列表上翻一页;
此外,CtrlP 还支持直接查看缓冲区列表(:CtrlPBuffer)以及近来修改过的文件列表(:CtrlPMRU)以及两者混合列表(:CtrlPMixed)。比方通过 :CtrlPBuffer 下令限定缓冲区列表:
【图 2.12 使用 CtrlPBuffer 下令限定 CtrlP 只展示缓冲区列表】
也可以将其映射为一个定制的快捷键组合:
- nnoremap <C-b> :CtrlPBuffer<cr> " Map CtrlP buffer mode to Ctrl + b.
复制代码 4 文件内的高级导航技巧
主要记住这张图:
【图 2.13 Ted Naleid 总结的文件内导航按键一览表】
此中值得一提的有:
- ge:光标移至前一个单词(word)的末尾(gE 则对应 WORD);
- { 和 }:快速定位当前段落的段首和段尾;
- ( 和 ):快速定位到当前句子的句首和句尾;
- H / M / L:光标快速定位到当前页面的顶部、正中、底部;
- t / f 检索技巧:详见《Vim Masterclass》第 9 篇、第 10 篇条记;
- :noh:完整写法 :nohlsearch,用于清除跨行检索某关键字后 残留的高亮体现样式。
关于插入模式的常用按键,记住这个图:
【图 2.14 Vim 插入模式的按键汇总】
补充几个紧张按键:
- gi:快速定位并重新进入上一次插入内容的地方;
- [count]s:删除 [count] 个或单个字符(前缀为数字可删除多个字符),然后进入插入模式;
- S 或 cc:快速删除当前行内容并进入插入模式,且保存当前行缩进部门;
5 跨文件搜刮技巧
5.1 系统工具 grep
认识 grep 下令的可以直接用 grep。比方搜刮当前路径下所有包罗 ingredient 的 Python 源文件:
- grep -r "ingredient" . --include="*.py"
复制代码
【图 2.15 使用系统内置 grep 下令进行文件内容检索】
5.2 vimgrep 下令
假如对 grep 不熟,也可换用 :vimgrep,语法格式为:
- :vimgrep <pattern> <path>
复制代码 此中,pattern 既可以是一个字符串,也可以是一个基于 Vim 的正则表达式。路径 path 支持通配符检索,比方 ** 表示递归检索,**/*.py 可限定文件范例等。
在 Vim 中实现划一检索效果,需执行下令::vimgrep ingredient **/*.py + Enter
【图 2.16 在 Vim 中使用 vimgrep 实现跨文件检索实测效果图】
关于 vimgrep 检索的常见利用:
- :cn:定位到下一个匹配项,未在当前文件则主动加载对应的文件;
- :cp:定位到上一个匹配项,未在当前文件则主动加载对应的文件;
- :copen:以 quickfix 窗口形式体现所有匹配效果(如下图所示);并可通过 J K 键完成上下浏览,Enter 键打开选中的匹配项;
【图 2.17 使用 :copen 下令查看所有匹配效果】
5.3 系统工具 ack
ack 工具针对代码库检索进行了专门优化,非常适合进行源代码检索。安装下令:
- $ sudo apt install ack-grep
复制代码 搜刮当前路径下所有包罗 ingredient 的 Python 源文件:
实测效果:
【图 2.18 使用 ack 系统工具检索效果图】
更多安装配置,详见官网:https://beyondgrep.com/install。
5.4 Vim 的 ack 插件
Vim 的 ack 插件将系统 ack 的检索效果集成到了 quickfix 窗口中,使用体验更加流畅。
安装地点:https://github.com/mileszs/ack.vim
使用方法也很简朴,只需要将系统下令改为 Vim 版:
实测效果如下:
【图 2.19 实测 Vim 的 ack 插件检索效果截图】
有了该插件,无需运行 :copen 下令即可体现 quickfix 窗口。
5.5 文本对象使用技巧
Vim 中的文本对象即:单词(w)、句子(s)、段落(p)、标签(t)、各种引号与括号(`、'、"、)、]、})。
详细用法详见《Vim Masterclass》专栏 第 13 篇条记。
5.6 EasyMotion 插件
安装地点:https://github.com/easymotion/vim-easymotion
该插件极大地拓宽了原生 Vim 的光标定位利用,可以在极短时间内准确定位到页面上的指定位置。
使用方法:\\ + {motion}
此中 \\ 为两次重复的 Leader 键,默认为 \ 键,实测效果如下:
【图 2.20 实测 EasyMotion 插件的导航定位功能界面效果】
详细用法详见《Vim Masterclass》第 26 篇条记。
也可以直接参考 EasyMotion 插件文档::help easymotion + Enter
6 寄存器的用法
书中所有知识点都可以参考《Vim Masterclass》专栏 第 6 篇条记。
后记
本章知识点十分庞杂,是后续进阶高级话题的必备基础。书中提到的每个第三方插件都值得认真深挖,共同官方提供的插件文档与 DeepSeek 智能助手,可实现快速突破。假如基础没有打牢,不建议继承往放学。
- 原书提供的初始配置下令 silent! helptags ALL 并不见效。后求助 DeepSeek 进行改进,方才实现既定目标。 ↩︎
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |