如何将match()应用于每个缓冲区?

时间:2019-01-31 15:38:30

标签: vim

我做了一个小函数,通过调用matchadd()函数以指定的颜色突出显示当前选择。加上地图以便于使用。

除了仅在当前缓冲区中执行(或者是窗口?)之外,此方法行之有效

我尝试在映射中的调用之前使用bufdo和windo(请参见下文),但收到“无效地址”错误。

        app.Use(async (context, next) =>
        {
            if (!context.User.Identity.IsAuthenticated)
            {
                await context.ChallengeAsync();
            }
            else
            {
                await next();
            }
        });

其中MatchYellow等是我定义的突出显示组

我想拥有什么,它的行为与*命令相同。在我查看的每个文件中,所有匹配项都会突出显示

1 个答案:

答案 0 :(得分:0)

错误

无效地址错误是由与:call语法一起提供 count 引起的。映射的执行就像键入命令一样,因此9:变成了:.,.+8,并且您的call被执行了多次,每行一次。如果范围不存在,则会出现此错误。有一个简单的解决方法:当您通过v:count引用计数并且只需要调用一次时,就不需要范围,而<C-u>命令(在命令行模式下)会清除范围:

map mm :<C-u>call Mymatch(v:count)<CR>

无处不在

您是对的,matchadd()仅添加当前窗口的匹配项。如果您有多个窗口,则需要使用:windo。如果还有其他标签页,则还需要:tabdo。如果您添加了其他窗口,并且还希望在其中显示突出显示(而不必重新执行映射),则需要:autocmd,例如在WinNew上。

其他批评

  • You should use :noremap;它使映射不受重新映射和递归的影响。
  • :内的命令前面不需要:function
  • 要使映射工作更像内置命令(例如*),它应在正常模式下使用当前单词(通过expand('<cword>')),并且仅在可视模式下使用所选文本。
  • 您的条件繁琐。您可以将突出显示组放在 List 中,然后使用计数将其索引到其中:
call matchadd('Match' . ['None', 'Yellow', 'Green', 'Red'][a:sel], @")

插件替代

到现在应该很清楚,将您的映射转换为可靠的解决方案需要花费很多工作。幸运的是,这个想法并不新鲜,并且存在几个可供选择的插件。我的Mark plugin就是这样一种解决方案。 (插件页面上有许多替代插件的链接。)