发布于 2026-01-06 14 阅读
0

面向高级用户的 Vim 指南

面向高级用户的 Vim 指南

欢迎来到本系列的第三部分,旨在帮助你利用强大的活力释放地球上前所未见的力量。

  1. Vim 入门指南
  2. Vim 中级用户指南
  3. Vim 高级用户指南
  4. Vim 进阶用户指南

我们将在本文中一起探讨:

  • 一些以“.”开头的漂亮按键g
  • 什么是量程以及如何使用量程。
  • 快速修复清单和位置清单。
  • 绝妙的替代命令。
  • 非常实用:global(或:g)命令。
  • 什么是分数以及分数可以做什么。
  • 如何通过一次按键增加和减少数字。
  • 如何使用简洁的命令对文本进行排序。

但在深入探讨本文的精彩内容之前,亲爱的读者,我有一些建议:

  1. 打开 Vim,一边阅读一边摆弄各种命令和按键。这是记住所有让你惊叹的内容的最佳方法。这样,你就能在接下来的日子里随时随地感受到震撼。
  2. 不要使用速查表;边读边自己记。这样可以方便你快速找到最符合自身需求的命令。

废话不多说,我们开始吧!

有用的“g”键组合

让我们先从一些以“g”开头的混合按键开始g。Vim 中有很多这样的“g”命令,我们在之前的文章中已经见过一些了。你还记得吗?

您可以在普通模式下使用这些按键:

  • gf- 编辑光标所在文件路径下的文件。
    • 您可以使用CTRL+W CTRL+F它在新窗口中打开文件。
    • 如果您安装了该插件,它可以打开光标下的 URL netrw
  • gx打开光标所在文件路径下的文件。
    • 它将使用操作系统默认用于处理此文件类型的应用程序。
    • 它也支持网址。它会打开你常用的浏览器并加载网站。
    • 只有安装了插件才能正常工作netrw
  • gi- 移动到您上次插入的位置,并切换到插入模式。
    • 如果你暂停编辑去查看其他文件,这个功能就非常有用。
    • 它底层使用了标记:本文稍后将详细介绍。
  • gv- 启动可视模式,并使用上次可视模式下所做的选择。
  • gn- 选择您上次搜索的结果:
    1. 跳转到上次搜索的结果。
    2. 切换到可视模式(如果您之前不在可视模式下)。
    3. 选择匹配项。
    4. 您可以继续按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>
Enter fullscreen mode Exit fullscreen mode

它会将按键映射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 *

  1. 它会在工作目录的每个文件中搜索模式“hello”。
  2. 它会将符合您输入的模式“hello”的所有位置填充到一个快速修复列表中。
  3. 它会将光标移动到快速修复列表的第一个位置。

如果你想了解更多关于 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
    1. 在正常模式下按下按钮"a,指定要写入的寄存器。
    2. 复制、更改或删除某些内容(例如,在dd正常模式下使用)以将其写入a
  • 读取登记簿a
    1. 在正常模式下,按下按钮"a指定要读取的寄存器。
    2. 在 NORMAL 模式下使用 put 键(例如pP)将寄存器的内容输出到当前缓冲区。

这里我们以寄存器为例a,但它适用于任何可写寄存器。

登记簿的类型

Vim 中有 10 种不同类型的寄存器:

  1. 未命名寄存器") - 包含最后删除、更改或撤销的内容,即使指定了一个寄存器。
  2. 编号的寄存器(从09
    • 0包含上次 yank 的内容。
    • 19一个包含您已删除或更改的内容的堆栈。
      1. 每次您删除或更改某些内容时,它都会添加到注册表中1
      2. 注册表的先前内容1将被分配给注册表2,先前的内容将被分配23……
      3. 当向寄存器中添加内容时1,寄存器中的内容9就会丢失。
    • 如果您之前已通过按键指定了某个寄存器,则这些寄存器都不会被写入"
  3. 小删除寄存器-
    • 包含任何已删除或已更改的小于一行的内容。
    • 如果你指定了一个寄存器,则不会写出来"
  4. 命名寄存器(范围从az
    • 如果你不通过按键指定它们,Vim 将永远不会写入它们"
    • 您可以使用每个寄存器的大写名称附加到其后面(而不是覆盖它)。
  5. 只读寄存器.%:
    • .包含最后插入的文本。
    • %包含当前文件名。
    • :包含最近执行的命令行。
  6. 备用缓冲区寄存器#) - 包含当前窗口的备用缓冲区。
  7. 表达式寄存器=)——存储表达式的结果。关于此寄存器的更多信息,请参见下文。
  8. 选择寄存器+*
    • +与系统剪贴板同步。
    • *与剪贴板选择同步(仅限 *nix 系统)。
  9. 黑洞寄存器_)——其中写入的所有内容将永远消失。
  10. 上次搜索模式寄存器/) - 此寄存器包含您的上次搜索。

如您所见,即使您没有通过按键指定任何寄存器",您删除、更改或复制的内容也会自动覆盖其中一个(或多个)寄存器。因此,如果您不希望写入寄存器的内容被 Vim 静默覆盖,请始终写入指定的寄存器

使用 put 命令而不指定任何寄存器,默认情况下会输出未命名寄存器的内容。但你的代码中可能包含这样一行vimrc

clipboard+=unnamedplus
Enter fullscreen mode Exit fullscreen mode

在这种情况下,您更改、删除或复制的内容将直接写入未命名寄存器目标+寄存器。使用 put 命令也会直接输出该+寄存器。许多人(包括我)都觉得这样更容易访问操作系统剪贴板,而无需指定+读取或写入的寄存器,非常方便。

添加录音

我们在上一篇文章中已经看到,可以使用寄存器来记录按键操作q。现在您已经了解如何使用寄存器,就可以对这些按键操作进行操作了:

  • 如果在录制过程中出错,您可以导出整个寄存器,进行修改,然后再保存回去。
  • 您可以使用寄存器的大写形式在录音中添加后缀。例如:
    1. 按下qa并录制你想要的任何按键。再次按下即可停止录制q
    2. 你意识到自己漏打了几个键。
    3. 执行按键操作,确保您位于录制的最后一个位置。
    4. 点击此键qA数据添加到您的注册表中a。完成后,q再次点击此键。

你的宏命令现在有了更大的灵活性。

在插入和命令行模式下使用寄存器

这个神奇的快捷键"在普通模式下非常好用,但是如何在插入模式或命令行模式下输出寄存器的内容呢?为此,您可以使用它将CTRL+R <reg>寄存器的内容放入<reg>当前缓冲区。

例如,如果您CTRL+R %在 INSERT 模式下按下该键,则会将寄存器的内容放入%当前缓冲区。

疯狂表情登记簿

如果你还不了解表达方式,我即将彻底改变你的人生。希望你已经准备好了。

试试这个:

  1. 切换到插入模式并按下相应的键CTRL+r =。你将进入 Vim 的命令行界面。
  2. 从那里,你可以输入任何你想要的 Vimscript 表达式,就像system("ls")我们上面看到的那样,或者4+4
  3. 按下ENTER运行表达式,您将看到 shell 命令的输出ls直接插入到缓冲区中!

在插入模式下,执行一些自定义函数非常有用。如果您使用 Neovim,也可以使用该函数luaeval()执行一些 Lua 代码。

清空收银机

关于收银机的最后一个小技巧:如果你想清空一个收银机,你可以这样做:

qaq
Enter fullscreen mode Exit fullscreen mode

开始录音会删除此寄存器中的所有内容。因此,您只需q再次按下停止键即可停止录音,使寄存器为空。

Vim 帮助

  • :help registers
  • :help clipboard
  • :help clipboard-unnamed
  • :help clipboard-unnamedplus

替代命令

让我们继续攀登巅峰,成为 Vim 之神(或女神)。接下来要学习的是替代命令。

基础知识

如果您已经熟悉 CLI sed,这条命令会唤起您的一些美好回忆。

替换是指使用范围和计数将某些内容替换为其他内容的方法。计数决定了从范围的最后一行开始,替换会影响多少行。

与其他许多命令一样,如果不指定范围,默认范围是当前行。

以下是该命令本身的模式:

:s/pattern/replacement/flags
Enter fullscreen mode Exit fullscreen mode

这是什么意思?

  • pattern是您要匹配的搜索词。
  • 它将replacement替换每行中第一个匹配的模式。
  • 修改flag命令的行为。

还有另一个元素,这里用斜杠表示/:分隔符。它不一定是斜杠,可以是除以下字符之外的任何字符:

  • 字母数字字符(包含在范围a-zA-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 中的正则表达式简直就像魔法一样。你以为我在开玩笑?我可没开玩笑。以下是我觉得需要记住的一些要点:

  • 要使用所有正则表达式元字符,可以在模式前加上\vvery magic)。
  • 要访问几乎所有正则表达式元字符(除了(,)|),请使用命令:sm代替:ss替换magic)。
  • 要访问所有元字符(除了$,请使用:sno代替魔法)。:ssno
  • 要完全禁用所有元字符,可以在模式前加上\VVery nomagic)。

例如,如果我想删除缓冲区中的所有左括号,我可以运行以下三个等效命令之一:

:%s/\V(/
:%sm/(/
:%s/\(/
Enter fullscreen mode Exit fullscreen mode

如果你了解正则表达式的元字符,你可能会好奇元字符是什么~。它是 Vim 世界里最新的替换字符串。实际上,你可以在 Vim 的正则表达式中使用更多的元字符(称为原子)和字符类。

如果你不了解正则表达式元字符,我已经录制了一些视频来解释正则表达式的基础知识(使用 grep)。

本系列的下一篇文章将更深入地探讨 Vim 的正则表达式。

附加命令

以下是我觉得很有用的另外两个命令:

  • :&&- 重复上次替换操作,并加上旗帜。
  • :~- 使用相同的替换重复上次的替换命令,但使用上次使用的搜索模式。

例如,假设您在 Vim 中依次执行以下操作:

:s/pattern/replacement/
/hello
:~
Enter fullscreen mode Exit fullscreen mode

最后一条命令将替换helloreplacement

您也可以在普通模式下使用这些便捷的快捷键:

  • &- 重复上一次替换,但去掉其范围和标记。
  • g&- 重复上次替换操作,包括其范围和标志,并将其模式替换为上次搜索模式。

替补队员的旗帜

以下是一些可能有用的标志:

  • &- 使用上一个替换命令中的标志。
  • c请您确认每一项替换。
  • g- 替换每一行中所有出现的字符(不仅仅是第一处)。
  • i- 该模式不区分大小写。
  • I- 此图案区分大小写。
  • n- 只报告比赛场次,不包含替补。

现在你可以随心所欲地进行各种替换了!

Vim 帮助

  • :help :substitute
  • :help :sm
  • :help :sno
  • :help :s_flags

全球司令部

还不够?想要更强大的力量?那就见识一下神圣的全局命令吧!它的工作方式与替换命令类似,区别在于它会执行一条命令,而不是替换一个模式。

基础知识

以下是该命令本身的模式:

:g/pattern/command
Enter fullscreen mode Exit fullscreen mode

如果需要,你也可以在前面加上一个范围前缀。

举个例子,假设你想删除当前缓冲区中所有包含“useless”模式的行。为此,你可以运行:

:g/useless/d
Enter fullscreen mode Exit fullscreen mode

不错,但我可以给你更大的权力。

普通模式命令

你知道这个命令:norm吗?你可以输入一些普通模式下的按键指令,它会像你在普通模式下按下这些按键一样执行它们。例如,以下命令会删除光标下的单词:

:norm daw
Enter fullscreen mode Exit fullscreen mode

现在让我们将普通模式命令与全局命令结合起来:

:g/useless/norm gu$
Enter fullscreen mode Exit fullscreen mode

这将把包含该模式的每一行都转换为小写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/
`

这将把第一个匹配项从标记的确切位置替换patternreplacement标记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 编辑器里有这样精彩的内容:

`

  1. 摘些红花。
  2. 加些鸡蛋。
  3. 别管它了,回去用电脑吧。

如果在可视模式下选中最后两行并按下回车键g CTRL+a,您将得到:

`

  1. 摘些红花。
  2. 加些鸡蛋。
  3. 别管它了,回去用电脑吧。

您还可以在命令前添加计数参数,以添加精确的数量。例如,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 高手了吗?

现在我们可以做出两个假设:

  1. 与过去的自己相比,你可能比以前更加技艺精湛了。
  2. 与许多人相比,你还有很长的路要走,需要不断练习和学习。

但最重要的是:你不必在意第二点。永远与过去的自己比较,而不是与他人比较。继续走自己的路,你终将获得顿悟。那时,你将构建属于你自己的“无鼠标开发”环境,独自一人搬到喜马拉雅山舒适的山洞里,过着虔诚的生活,将你的整个灵魂奉献给对至高无上的智慧的探索。

我们从这篇文章中学到了什么?

  • Vim 中的字母“g”有点像一根魔杖:
    • 有很多以“g”开头的实用按键。
    • 该标志g通常与替换命令一起使用。
    • 全局命令:g功能非常强大,可以将命令应用于特定的内容。
  • 范围功能允许您对多个连续的行执行多个命令。
  • 快速修复列表是一个包含不同文件中位置信息的全局列表。你可以使用 . 对其应用任何命令:cdo
  • 您可以使用快速修复窗口查看快速修复列表中的条目。
  • 位置列表与快速修复列表类似,区别在于每个打开的窗口只能有一个位置列表(和一个位置窗口)。
  • 您可以使用替换命令:s将模式(正则表达式)替换为其他内容。:sm您可以选择是否使用正则表达式:sno
  • 你可以用标记来增加操作的精准度。

为了奖励你坚持读完这篇文章的毅力和韧性,我给你最后一个提示::help ex-cmd-index将列出 Vim 中所有可用的命令。

Vim 易于上手但难以精通:这很好,因为我们永不止步地进步!

相关来源


变成无鼠标

您是否想构建一个以 Linux shell 和 Vim 为核心的无鼠标开发环境?

构建你的无鼠标开发环境

在键盘和鼠标之间切换会消耗认知能量。本书将一步步指导您搭建一个基于 Linux 的开发环境,让您无需离开键盘即可进行开发。

把你原本用来切换输入设备的脑力集中到它应该集中的地方:你的创作上。


文章来源:https://dev.to/phantas0s/a-vim-guide-for-advanced-users-1ddk