面向高级用户的 Vim 指南
欢迎来到本系列的第三部分,旨在帮助你利用强大的活力释放地球上前所未见的力量。
我们将在本文中一起探讨:
- 一些以“.”开头的漂亮按键
g。 - 什么是量程以及如何使用量程。
- 快速修复清单和位置清单。
- 绝妙的替代命令。
- 非常实用
:global(或:g)命令。 - 什么是分数以及分数可以做什么。
- 如何通过一次按键增加和减少数字。
- 如何使用简洁的命令对文本进行排序。
但在深入探讨本文的精彩内容之前,亲爱的读者,我有一些建议:
- 打开 Vim,一边阅读一边摆弄各种命令和按键。这是记住所有让你惊叹的内容的最佳方法。这样,你就能在接下来的日子里随时随地感受到震撼。
- 不要使用速查表;边读边自己记。这样可以方便你快速找到最符合自身需求的命令。
废话不多说,我们开始吧!
有用的“g”键组合
让我们先从一些以“g”开头的混合按键开始g。Vim 中有很多这样的“g”命令,我们在之前的文章中已经见过一些了。你还记得吗?
您可以在普通模式下使用这些按键:
gf- 编辑光标所在文件路径下的文件。- 您可以使用
CTRL+W CTRL+F它在新窗口中打开文件。 - 如果您安装了该插件,它可以打开光标下的 URL
netrw。
- 您可以使用
gx打开光标所在文件路径下的文件。- 它将使用操作系统默认用于处理此文件类型的应用程序。
- 它也支持网址。它会打开你常用的浏览器并加载网站。
- 只有安装了插件才能正常工作
netrw。
gi- 移动到您上次插入的位置,并切换到插入模式。- 如果你暂停编辑去查看其他文件,这个功能就非常有用。
- 它底层使用了标记:本文稍后将详细介绍。
gv- 启动可视模式,并使用上次可视模式下所做的选择。gn- 选择您上次搜索的结果:- 跳转到上次搜索的结果。
- 切换到可视模式(如果您之前不在可视模式下)。
- 选择匹配项。
- 您可以继续按
n(或gn)键来选择当前比赛和下一场比赛之间的区域。
gI- 在行首插入文本,无论第一个字符是什么。- 该按键会在行首第一个非空白字符之前
I插入文本。
- 该按键会在行首第一个非空白字符之前
ga- 以十进制、十六进制或八进制形式打印a光标下字符的 scii 值。gu- 使用动作输入小写字母(例如,guiw)。gU- 使用动作输入大写字母(例如,gUiw)。
要尝试使用 `? `gf和 ` gx?`,例如,您可以https://www.google.com/在 Vim 中输入 `?`,将光标放在它上面,然后按下相应的按键。别忘了 URL 末尾的斜杠。
你很快就会发现使用 `:` 的一个不便之处gx:当你在文件路径上使用它时,Vim 会一直卡住,直到你关闭该文件。因此,我创建了以下映射,你可以将其添加到你的.vimrc`:`文件中。
nnoremap gX :silent :execute
\ "!xdg-open" expand('%:p:h') . "/" . expand("<cfile>") " &"<cr>
它会将按键映射gX到光标下的相对文件路径。它会在后台xdg-open使用您喜欢的应用程序打开文件。该程序仅适用于基于 Linux 的系统;对于 macOS,请尝试其他方法。xdg-openopen
Vim 帮助
:help reference:help g
范围
现在开胃菜已经吃完了,让我们来探索 Vim 盛宴的第一道正餐:范围(ranges)。你可以将范围应用于许多命令,使其功能非常强大。
基础知识
[range]在 Vim 的帮助文档中,每个接受范围参数的命令前面都会显示该范围字符串。可以使用多个行指定符,用逗号分隔,。
以下是一些您可以使用的最有趣的范围:
<number>- 您范围内的任何数字<number>都指行号。.- 表示当前行(通常是默认范围)。$- 表示当前缓冲区的最后一行。%- 表示整个文件(与...相同1,$)。*- 使用您在上一次视觉模式下所做的最后一次选择。
例如,使用以下命令:d:
:1,40d- 删除第 1 行至第 40 行。:2,$d- 删除从第二行到文件末尾的每一行。:.,$d- 删除从当前行到文件末尾的每一行。:%d删除所有行。
你也可以根据需要对范围进行一些算术运算。例如,假设你的光标位于第 60 行:范围.,.+10将等价于范围60,70。
视觉模式和范围
如果在可视模式下进行一些选择后切换到命令行模式,您会看到这两个符号:'<和,中间'>用逗号隔开。这也是一个范围!,
这些符号分别'<代表你选择的第一行和'>最后一行。它们都是标记;我们稍后会详细介绍标记。
实际上,范围'<,'>和*是同义词,但前者更灵活。例如,您可以使用范围从选定的第一行到文件末尾执行命令'<,$。
Vim 帮助
:help [range]:help v_::help '<:help '>
Vim 的快速修复和位置列表
现在,我们来谈谈 Vim 中一个非常有用的数据结构:快速修复列表。
不要将快速修复列表和快速修复窗口混淆:它们是两个不同的实体。前者是一个数据结构,后者可以显示该数据结构。
快速修复清单
你可以把快速修复列表看作是一个或多个文件中的一组位置。
基础知识
举个例子:如果你运行该命令会发生什么:vimgrep hello *?
- 它会在工作目录的每个文件中搜索模式“hello”。
- 它会将符合您输入的模式“hello”的所有位置填充到一个快速修复列表中。
- 它会将光标移动到快速修复列表的第一个位置。
如果你想了解更多关于 vimgrep 和其他搜索工具的信息,我写了一篇文章。其他命令(例如 `vimgrep`:make或 `vimgrep` :grep)也会自动生成快速修复列表。
让我们进一步揭开标记的神秘面纱:快速修复列表中的这些位置实际上是隐藏标记!
快速修复列表通常用于显示代码库中的特定错误,这些错误通常由编译器或代码检查工具(:make例如通过命令)输出,但正如我们刚才看到的,它们不仅限于此。为了更通用地表达,我将快速修复列表中的条目称为“位置”,但有时 Vim 的帮助文档会将它们称为“错误”。请不要混淆:它们的含义是一样的。
除其他条件外,快速修复列表条目必须包含文件名,才能跳转到其所在位置。否则,该条目将指向空文件,难以跳转到任何位置。
实用命令
您可以使用以下命令浏览当前的快速修复列表:
:cl或者:clist- 显示当前快速修复列表中所有有效条目。您可以添加一个范围作为参数(仅限数字)。:cc <number>- 移动到<number>当前快速修复列表的第 th 个条目。:cnext或者:cn- 移至当前快速修复列表中的下一个条目。:cprevious或者:cp- 移至当前快速修复列表中的上一个条目。:cfirst或者:cfir- 移至当前快速修复列表的第一个条目。:clast或者:clas- 移至当前快速修复列表的最后一个条目。
以下是一些能让快速修复列表功能更加强大的附加命令:
:cdo <cmd><cmd>-对当前快速修复列表中的每个有效条目执行命令。:cexpr <expr>或者:cex <expr>- 使用 Vimscript 表达式的评估结果创建快速修复列表<expr>。:caddexpr <expr>或者:cadde <expr>- 将 Vimscript 表达式的计算结果附加<expr>到当前快速修复列表中。
如果您完全不知道如何使用最后两条命令,您可以这样做:
:cex []- 清空当前快速修复列表。:cex system("<cmd>")- 将任意 shell 命令添加到您的快速修复列表中。例如,<cmd>您可以尝试使用以下命令。ls
快速修复窗口
如何将当前的快速修复列表显示在一个新的缓冲区中?您可以使用以下命令实现:
:copen或者:cope- 打开一个窗口(带有特殊缓冲区)以显示当前的快速修复列表。
您只能打开一个快速修复窗口。要将光标移动到快速修复窗口中所选快速修复列表条目的位置,请按ENTER或.cc。
位置列表
位置列表与快速修复列表类似,区别在于前者是窗口本地的,而后者是 Vim 实例全局的。换句话说,您可以同时拥有多个位置列表(每个打开的窗口一个),但您只能访问一个快速修复列表。
位置列表的命令与快速修复列表的命令类似;通常,你只需要将命令中的第一个c(qui fix)替换为(ocation)。cll
例如:
:lli或者:llist- 显示当前位置列表中所有有效条目。您可以添加一个范围作为参数(仅限数字)。:ll <number><number>- 移动到当前位置列表的条目。:lnext或者:lne- 移至当前快速修复列表中的下一个条目。
要填充您的位置列表,您还可以使用命令:lvimgrep或:lmake例如。
Vim 用户通常会使用快速修复列表来处理代码库中的错误,而使用位置列表来查找搜索结果。但最终决定权在你。使用 Vim,你就是自己命运的主宰。
Vim 帮助
:help quickfix:help quickfix-window:help location-list:help location-list-window:help expr:help system()
Vim 的寄存器
注册表是 Vim 功能中的另一大亮点。你可以把注册表想象成可以读取或写入文本的地方。我喜欢把它们比作 Vim 的剪贴板。
指定寄存器
以下是用于显示和指定寄存器的命令和普通模式下的按键组合:
:registers或者:reg- 显示您的账簿内容。"<reg>- 此按键指定<reg>要读取或写入的寄存器。
如何判断<reg>是通过按键操作读取还是写入寄存器"?这取决于你之后按下的按键。例如:
- 写入寄存器
a:- 在正常模式下按下按钮
"a,指定要写入的寄存器。 - 复制、更改或删除某些内容(例如,在
dd正常模式下使用)以将其写入a。
- 在正常模式下按下按钮
- 读取登记簿
a:- 在正常模式下,按下按钮
"a指定要读取的寄存器。 - 在 NORMAL 模式下使用 put 键(例如
p或P)将寄存器的内容输出到当前缓冲区。
- 在正常模式下,按下按钮
这里我们以寄存器为例a,但它适用于任何可写寄存器。
登记簿的类型
Vim 中有 10 种不同类型的寄存器:
- 未命名寄存器(
") - 包含最后删除、更改或撤销的内容,即使指定了一个寄存器。 - 编号的寄存器(从
0到9)0包含上次 yank 的内容。1是9一个包含您已删除或更改的内容的堆栈。- 每次您删除或更改某些内容时,它都会添加到注册表中
1。 - 注册表的先前内容
1将被分配给注册表2,先前的内容将被分配2给3…… - 当向寄存器中添加内容时
1,寄存器中的内容9就会丢失。
- 每次您删除或更改某些内容时,它都会添加到注册表中
- 如果您之前已通过按键指定了某个寄存器,则这些寄存器都不会被写入
"。
- 小删除寄存器(
-)- 包含任何已删除或已更改的小于一行的内容。
- 如果你指定了一个寄存器,则不会写出来
"。
- 命名寄存器(范围从
a到z)- 如果你不通过按键指定它们,Vim 将永远不会写入它们
"。 - 您可以使用每个寄存器的大写名称附加到其后面(而不是覆盖它)。
- 如果你不通过按键指定它们,Vim 将永远不会写入它们
- 只读寄存器(
.,%和:).包含最后插入的文本。%包含当前文件名。:包含最近执行的命令行。
- 备用缓冲区寄存器(
#) - 包含当前窗口的备用缓冲区。 - 表达式寄存器(
=)——存储表达式的结果。关于此寄存器的更多信息,请参见下文。 - 选择寄存器(
+和*)+与系统剪贴板同步。*与剪贴板选择同步(仅限 *nix 系统)。
- 黑洞寄存器(
_)——其中写入的所有内容将永远消失。 - 上次搜索模式寄存器(
/) - 此寄存器包含您的上次搜索。
如您所见,即使您没有通过按键指定任何寄存器",您删除、更改或复制的内容也会自动覆盖其中一个(或多个)寄存器。因此,如果您不希望写入寄存器的内容被 Vim 静默覆盖,请始终写入指定的寄存器。
使用 put 命令而不指定任何寄存器,默认情况下会输出未命名寄存器的内容。但你的代码中可能包含这样一行vimrc:
clipboard+=unnamedplus
在这种情况下,您更改、删除或复制的内容将直接写入未命名寄存器和目标+寄存器。使用 put 命令也会直接输出该+寄存器。许多人(包括我)都觉得这样更容易访问操作系统剪贴板,而无需指定+读取或写入的寄存器,非常方便。
添加录音
我们在上一篇文章中已经看到,可以使用寄存器来记录按键操作q。现在您已经了解如何使用寄存器,就可以对这些按键操作进行操作了:
- 如果在录制过程中出错,您可以导出整个寄存器,进行修改,然后再保存回去。
- 您可以使用寄存器的大写形式在录音中添加后缀。例如:
- 按下
qa并录制你想要的任何按键。再次按下即可停止录制q。 - 你意识到自己漏打了几个键。
- 执行按键操作,确保您位于录制的最后一个位置。
- 点击此键
qA将数据添加到您的注册表中a。完成后,q再次点击此键。
- 按下
你的宏命令现在有了更大的灵活性。
在插入和命令行模式下使用寄存器
这个神奇的快捷键"在普通模式下非常好用,但是如何在插入模式或命令行模式下输出寄存器的内容呢?为此,您可以使用它将CTRL+R <reg>寄存器的内容放入<reg>当前缓冲区。
例如,如果您CTRL+R %在 INSERT 模式下按下该键,则会将寄存器的内容放入%当前缓冲区。
疯狂表情登记簿
如果你还不了解表达方式,我即将彻底改变你的人生。希望你已经准备好了。
试试这个:
- 切换到插入模式并按下相应的键
CTRL+r =。你将进入 Vim 的命令行界面。 - 从那里,你可以输入任何你想要的 Vimscript 表达式,就像
system("ls")我们上面看到的那样,或者4+4。 - 按下
ENTER运行表达式,您将看到 shell 命令的输出ls直接插入到缓冲区中!
在插入模式下,执行一些自定义函数非常有用。如果您使用 Neovim,也可以使用该函数luaeval()执行一些 Lua 代码。
清空收银机
关于收银机的最后一个小技巧:如果你想清空一个收银机,你可以这样做:
qaq
开始录音会删除此寄存器中的所有内容。因此,您只需q再次按下停止键即可停止录音,使寄存器为空。
Vim 帮助
:help registers:help clipboard:help clipboard-unnamed:help clipboard-unnamedplus
替代命令
让我们继续攀登巅峰,成为 Vim 之神(或女神)。接下来要学习的是替代命令。
基础知识
如果您已经熟悉 CLI sed,这条命令会唤起您的一些美好回忆。
替换是指使用范围和计数将某些内容替换为其他内容的方法。计数决定了从范围的最后一行开始,替换会影响多少行。
与其他许多命令一样,如果不指定范围,默认范围是当前行。
以下是该命令本身的模式:
:s/pattern/replacement/flags
这是什么意思?
- 这
pattern是您要匹配的搜索词。 - 它将
replacement替换每行中第一个匹配的模式。 - 修改
flag命令的行为。
还有另一个元素,这里用斜杠表示/:分隔符。它不一定是斜杠,可以是除以下字符之外的任何字符:
- 字母数字字符(包含在范围
a-z、A-Z和 中的字符0-9)。 - 双引号
"。 - 一根管子
|。
这replacement不是必需的:如果省略,替换命令将删除匹配的模式。
您也可以:s不指定范围、模式、替换、标志或计数。在这种情况下,它将重复您上次执行的替换操作,但不使用标志;您可以&根据需要添加新的标志(除特定标志外)和计数。
让我们来看一些例子来了解它是如何运作的:
:s/pattern/replacement/pattern-将当前行中第一个出现的 替换为replacement。:s#pattern#replacement#- 与上面类似的替换方式。如果您在配置文件pattern或脚本中有一些 URL,这将非常有用replacement。:s/pattern/pattern- 删除当前行中第一个出现的。:s/pattern/replacement/gpattern-将当前行中所有出现的“ ”替换为“
您还可以添加范围作为前缀,计数作为后缀:
:%s/pattern/replacement/- 将当前缓冲区每一行中出现的第一个字符替换为 。pattern:%s/pattern/replacement/gpattern- 将当前缓冲区每一行中出现的所有“”替换为“” 。:1,10s/pattern/replacement/- 将当前缓冲区前十行中所有首次出现的“ ”替换为“ ”。pattern:s/pattern/replacement/ 10-将当前行和接下来的 10 行中出现的第一个字符替换为 。pattern:1,10s/pattern/replacement/ 5-将前十行和最后一行下方五行中所有首次出现的“”替换为“”。pattern:s g 10- 重复上次替换操作,但不添加标志,并添加一个新的标志g。这将影响上次替换命令最后一行之后的 10 行。
Vim 的“神奇”模式
在这种情况下, Apattern是一个正则表达式。但它并非你熟悉的、来自高级编程语言的那种传统正则表达式引擎。Vim 有自己的正则表达式引擎(实际上,它有两个!),这可能会让人感到困惑。
Vim 中的正则表达式简直就像魔法一样。你以为我在开玩笑?我可没开玩笑。以下是我觉得需要记住的一些要点:
- 要使用所有正则表达式元字符,可以在模式前加上
\v(very magic)。 - 要访问几乎所有正则表达式元字符(除了
(,)和|),请使用命令:sm代替:s(s替换magic)。 - 要访问所有元字符(除了)
$,请使用(:sno代替魔法)。:ssno - 要完全禁用所有元字符,可以在模式前加上
\V(Very nomagic)。
例如,如果我想删除缓冲区中的所有左括号,我可以运行以下三个等效命令之一:
:%s/\V(/
:%sm/(/
:%s/\(/
如果你了解正则表达式的元字符,你可能会好奇元字符是什么~。它是 Vim 世界里最新的替换字符串。实际上,你可以在 Vim 的正则表达式中使用更多的元字符(称为原子)和字符类。
如果你不了解正则表达式元字符,我已经录制了一些视频来解释正则表达式的基础知识(使用 grep)。
本系列的下一篇文章将更深入地探讨 Vim 的正则表达式。
附加命令
以下是我觉得很有用的另外两个命令:
:&&- 重复上次替换操作,并加上旗帜。:~- 使用相同的替换重复上次的替换命令,但使用上次使用的搜索模式。
例如,假设您在 Vim 中依次执行以下操作:
:s/pattern/replacement/
/hello
:~
最后一条命令将替换hello为replacement。
您也可以在普通模式下使用这些便捷的快捷键:
&- 重复上一次替换,但去掉其范围和标记。g&- 重复上次替换操作,包括其范围和标志,并将其模式替换为上次搜索模式。
替补队员的旗帜
以下是一些可能有用的标志:
&- 使用上一个替换命令中的标志。c请您确认每一项替换。g- 替换每一行中所有出现的字符(不仅仅是第一处)。i- 该模式不区分大小写。I- 此图案区分大小写。n- 只报告比赛场次,不包含替补。
现在你可以随心所欲地进行各种替换了!
Vim 帮助
:help :substitute:help :sm:help :sno:help :s_flags
全球司令部
还不够?想要更强大的力量?那就见识一下神圣的全局命令吧!它的工作方式与替换命令类似,区别在于它会执行一条命令,而不是替换一个模式。
基础知识
以下是该命令本身的模式:
:g/pattern/command
如果需要,你也可以在前面加上一个范围前缀。
举个例子,假设你想删除当前缓冲区中所有包含“useless”模式的行。为此,你可以运行:
:g/useless/d
不错,但我可以给你更大的权力。
普通模式命令
你知道这个命令:norm吗?你可以输入一些普通模式下的按键指令,它会像你在普通模式下按下这些按键一样执行它们。例如,以下命令会删除光标下的单词:
:norm daw
现在让我们将普通模式命令与全局命令结合起来:
:g/useless/norm gu$
这将把包含该模式的每一行都转换为小写useless。
当我第一次听到这些时,我看到了宇宙,看到了大爆炸,看到了创造与毁灭的循环。我理解了生命和死亡。我得到了祝福,在每一座自由的城市里吟唱着Vim的力量。
最后一点提示::norm请使用您自定义的按键映射。如果您只想使用 Vim 的默认映射,也可以使用norm!其他方式。
如果你要编写插件,请务必使用norm!. 你不知道你的用户有哪些映射关系。
Vim 帮助
:help :global:help :normal
分数
是时候回答困扰你那颗聪明头脑的问题了:什么是分数?
基础知识
您可以将标记理解为缓冲区中的特定位置。要设置标记,您可以m在 NORMAL 模式下使用,后跟以下范围内的字符:
a-z这些标记仅限于一个缓冲区。A-Z这些标记对多个缓冲区都是全局的。
如果你在 Vim 中通过选项设置了“viminfo”文件viminfo,或者在 Neovim 中通过选项设置了“shada”文件shada,这些标记会被保存下来。这意味着即使你关闭了文件,你仍然可以访问这些标记。
如果你想知道 Vim 有哪些选项以及如何显示它们的值,我在本系列的第一篇文章中已经写过相关内容。
此外,还有一些只读标记0-9。它们仅在使用viminfo文件(对于 Vim)或shada文件(对于 Neovim)时可用。它们会存储每次退出文件时光标的位置:`<read-to-mark>` 标记0存储最后一个位置,`<read-to-mark>` 标记1存储倒数第二个位置,依此类推。
在普通模式下,您可以使用以下按键移动到标记点:
'<mark>- 移动到设置标记的行的第一个非空白字符处。<mark>- -
<mark>移动到标记设置的确切位置。<mark> g' <mark>- 移动到标记点,无需更改跳转列表(我在本系列的前一篇文章中<mark>写过关于跳转列表的内容)。
实用命令
正如您所料,还有一些用于显示或操作标记的实用命令:
:marks- 显示设定的分数。:marks <marks>- 显示一些特定的标记<marks>。:delmarks <mark>或者:delm <mark>- 删除标记<mark>。:delmarks!或者delm!- 删除范围内的所有标记a-z。
例如,:marks <>将显示两个标记<和>。
你也可以将分数用作范围。例如:
`
:`a,`bs/pattern/replacement/
`
这将把第一个匹配项从标记的确切位置替换pattern到replacement标记a的确切位置b。
特殊标记
现在让我们通过以下按键引入特殊标记:
m<或者m>——设置标记'<,就像'>我们上面看到的那样。这对于按键操作非常有用gv。- `
[- 移动到先前更改、删除或撤销的内容的第一个字符。 ]` - 移动到先前更改、删除或撤销的内容的最后一个字符。- `
"- 移动到你上次关闭当前文件的位置。 - `
^- 移动到您上次使用 INSERT 模式的位置(此标记由gi底层按键使用)。
对于上面用反引号描述的每个按键,你可以用单引号'代替,但两者之间存在我们上面看到的区别。
Vim 帮助
:help mark-motions
数字运算
在经历了这些登记、替换和标记的把戏之后,这里有一个轻松的主题:加法(或减法)。
以下是一些在正常模式下执行此操作的按键组合:
CTRL+a- 增加该行第一个数字或数字。CTRL+x- 减去该行的第一位数字。
您也可以在可视模式下使用这些按键:
g CTRL+a除非您选择了多行,否则情况相同CTRL+a。如果选择了多行,则每行的第一个数字将依次递增。g CTRL+x除非您选择了多行,否则情况相同CTRL+x。如果选择了多行,则每行的第一个数字将依次递减。
为了更好地说明最后两个按键操作,假设你心爱的 Vim 编辑器里有这样精彩的内容:
`
- 摘些红花。
- 加些鸡蛋。
- 别管它了,回去用电脑吧。
如果在可视模式下选中最后两行并按下回车键g CTRL+a,您将得到:
`
- 摘些红花。
- 加些鸡蛋。
- 别管它了,回去用电脑吧。
您还可以在命令前添加计数参数,以添加精确的数量。例如,12 CTRL+a将 12 加到当前行的第一个数字上。
重要提示:这些按键操作也适用于无符号二进制数、八进制数和十六进制数,以及字母字符。它们的行为取决于选项的值nrformats。为了使这些按键操作按本文所述的方式运行,您不应将alpha作为选项值的一部分,否则您将递增(或递减)该行的nrformats第一个字母字符。
我个人认为最好排除字母字符,但无论如何,我建议你阅读 Vim 的帮助文档以了解更多信息。一如既往。
Vim 帮助
:help CTRL-A:help CTRL-X:help nrformats
文本排序
来点甜点怎么样?或许可以介绍一个直接在 Vim 中对文本进行排序的实用命令?命令如下:
:sort或者:sor- 根据指定范围对行进行排序。如果未指定范围,则对所有行进行排序。:sort!或者:sor!- 反转顺序。
您可以为该命令添加一些选项。以下是最常用的几个选项:
i- 忽略大小写。n- 根据行首第一位小数进行排序。f- 根据行中第一个浮点数进行排序。/pattern/- 根据比赛结束后的比赛内容进行排序。r- 与 结合/pattern/,根据匹配模式进行排序。
例如,如果您有一个 CSV 文件(以逗号,作为分隔符),并且想要根据第二列对每一行进行排序,您可以运行类似这样的命令:
:sort /[^,]*,/
如何根据每行的行号对以下列表进行排序?
Take some red flowers (1).
Forget about it and go back to your computer (3).
Add some eggs (2).
运行:sort n结果如下:
Take some red flowers (1).
Add some eggs (2).
Forget about it and go back to your computer (3).
一如既往,这里面有很多微妙之处。如果你想深入了解,你知道该怎么做:打开 Vim 的帮助文档,尽情享受它无穷无尽的奥秘吧!
Vim 帮助
:help sort
你现在是 Vim 高手了吗?
现在我们可以做出两个假设:
- 与过去的自己相比,你可能比以前更加技艺精湛了。
- 与许多人相比,你还有很长的路要走,需要不断练习和学习。
但最重要的是:你不必在意第二点。永远与过去的自己比较,而不是与他人比较。继续走自己的路,你终将获得顿悟。那时,你将构建属于你自己的“无鼠标开发”环境,独自一人搬到喜马拉雅山舒适的山洞里,过着虔诚的生活,将你的整个灵魂奉献给对至高无上的智慧的探索。
我们从这篇文章中学到了什么?
- Vim 中的字母“g”有点像一根魔杖:
- 有很多以“g”开头的实用按键。
- 该标志
g通常与替换命令一起使用。 - 全局命令
:g功能非常强大,可以将命令应用于特定的内容。
- 范围功能允许您对多个连续的行执行多个命令。
- 快速修复列表是一个包含不同文件中位置信息的全局列表。你可以使用 . 对其应用任何命令
:cdo。 - 您可以使用快速修复窗口查看快速修复列表中的条目。
- 位置列表与快速修复列表类似,区别在于每个打开的窗口只能有一个位置列表(和一个位置窗口)。
- 您可以使用替换命令
:s将模式(正则表达式)替换为其他内容。:sm您可以选择是否使用正则表达式:sno。 - 你可以用标记来增加操作的精准度。
为了奖励你坚持读完这篇文章的毅力和韧性,我给你最后一个提示::help ex-cmd-index将列出 Vim 中所有可用的命令。
Vim 易于上手但难以精通:这很好,因为我们永不止步地进步!
相关来源
- 你可能不知道的Vim小技巧——希勒尔·韦恩
- Vim 宏技巧- Hillel Wayne
- Vim 搜索、查找和替换:详细指南- 您忠实的仆人
变成无鼠标
您是否想构建一个以 Linux shell 和 Vim 为核心的无鼠标开发环境?
在键盘和鼠标之间切换会消耗认知能量。本书将一步步指导您搭建一个基于 Linux 的开发环境,让您无需离开键盘即可进行开发。
把你原本用来切换输入设备的脑力集中到它应该集中的地方:你的创作上。
文章来源:https://dev.to/phantas0s/a-vim-guide-for-advanced-users-1ddk
