Vim - 仅匹配文字字符串第一个字符的模式

Vim - pattern to match only first character of literal string

我正在尝试编写一个仅匹配按字面解释的字符串的第一个字符(可以是任何字符,也可以是空格)的模式。

所以给出这个函数,它使用“非常没有魔法”来逐字匹配作为参数给定的字符串,然后突出显示该字符串,我该如何修改它,使其只突出显示第一个字符?

function! MatchFirst(i)
  highlight Red ctermbg=red ctermfg=0 guibg=#ff0000 guifg=#000000
  call matchadd('Red', '\V' . escape(a:i, '\'))
endfunction

因此,例如在以下文本中调用 MatchFirst('{^(sed'),如果 { 后跟 *(sed,则只会突出显示 {,但不会在任何其他地方突出显示。目前它突出显示整个给定字符串 {^(sed.

Lorem ipsum do{^(lor sit amet, consectetur adipiscing elit, e{^(sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo con{^(sequat. Duis aute irure dolor in rep{^(rehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

稍后编辑

为了提供一点上下文,MatchFirst 函数的参数是用户视觉选择的文本,因此它可以是任何字面意思,可以是 foobarfoo\ze\bar&#@!^><..?/\\国字字

在 Vim 模式中仅 select 部分匹配的最简单方法是使用 \ze 标记匹配的结束。有关详细信息,请参阅 :help /\ze

你可以在“very nomagic”模式下直接使用\ze\V。您会在 :help /\V:

下找到它

Use of \V means that after it, only a backslash and terminating character (usually / or ?) have special meaning: "very nomagic"

由于 \ze 已经以反斜杠开头,您根本不需要修改它就可以在 \V.

下工作

在您的 {^(sed 示例中,您可以使用 \V{\ze^(sed 来匹配第一个 {,但前提是它是 {^(sed.

的一部分

将它们放在你的函数中,你可以使用:

call matchadd('Red',
    \ '\V' .  escape(strcharpart(a:i, 0, 1), '\') .
    \ '\ze' . escape(strcharpart(a:i, 1), '\'))

注意:您可能遇到 a:i 是空字符串的极端情况,在这种情况下您可能想做一些不同的事情。