我正在尝试做一些我希望简单的事情,但我不明白为什么它不起作用。
对于 markdown 文件中的下一行,我想定义一个映射来给一行加下划线,例如:
line 0
# line 1
## line 2
### line 3
#### line 4
##### line 5
###### line 6
####### line 7
######## line 8
我想要的是以下内容:当光标位于第 0 行或第 1 行或其他行上时,我只想添加:
<u>
如果该行没有 #,则在行的开头 --或--<u>
在该行的最后一个 # 之后</u>
在行尾
所以我想要的是,当我按U
任何行时,它会添加标签<u>
和</u>
,如下所示:
<u> line 0 </u>
# <u> line 1 </u>
## <u> line 2 </u>
### <u> line 3 </u>
#### <u> line 4 </u>
##### <u> line 5 </u>
###### <u> line 6 </u>
####### <u> line 7 </u>
######## <u> line 8 </u>
在键盘上,我可以简单地执行^f#;;;;;;;;;;;;;;a <u><C-c>A </u><C-c>
,而且效果很好。
在我的 .vimrc 上,为什么nnoremap U ^f#;;;;;;;;;;;;;;a <u><C-c>A </u><C-c>
不起作用?
(注:我写了很多分号,以防标题很长)
大量的分号破坏了映射。引用自
:help map-error
:;
没有跳转到的A#
会导致错误并中止映射。您可以减少分号的数量,并看到当(且仅当)给出正确数量的哈希值时它才有效。一个几乎有效但更好的替代方案是使用适当的动作,例如
:help motion.txt
转到e
单词的末尾而不是大量的分号。请注意,如果#
当前行中不存在任何一个,这仍然会失败。使用e
会更干净,但仍然失败。:substitute
我们可以使用该命令和允许可选数量的哈希值的正则表达式来获得工作映射。这是一个 Ex 命令,因此避免了不必要的模式切换。请注意,我使用
@
而不是熟悉的方式/
来分隔模式和替换字符串,而不必转义 中的斜杠</u>
。该模式本身是行锚点的开始
^
,后跟任意数量#
的空白\s
。原子\zs
开始匹配(即我们忽略它之前的任何内容)。这.*
只是一个贪婪的全能比赛。替换字符串是
<u> & </u>
,这是两个之间有匹配项的标签。所有这些都记录在
:help :substitute
和中:help pattern
,特别:help /^
是:help /\zs
和:help s/\&
。正如评论中提到的,上面的内容不适用于带有 VSCodeVim 插件的 Visual Studio Code。原因似乎是它不识别原子
\zs
。我们可以编写一个具有两个工作相同的捕获组的模式在 Vim 上,我们必须转义捕获组的括号(除非我们使用非常神奇的模式)。 VSCodeVim 似乎并非如此。
您可能还对“不要在未找到时停止映射”感兴趣