【问题标题】:autocmd setting signs is breaking syntax highlightingautocmd 设置标志正在破坏语法突出显示
【发布时间】:2014-11-13 19:42:29
【问题描述】:

我目前有一个用于BufAdd 的自动命令,它将在加载文件的某些行中添加标记(符号)。我为每个标志定义了自定义亮点,大致如下:

highlight Custom1 ctermfg=black ctermbg=red
highlight Custom2 ctermfg=black ctermbg=green

sign define custom_sign1 text=>> texthl=Custom1
sign define custom_sign2 text=<< texthl=Custom2

标志是通过以下方式创建的:

sign place ID line=LINE name=custom_sign1 file=FILENAME

其中ID 是文件中符号的唯一ID,LINE 是符号的行号,FILENAME 是文件名。

所有符号都被正确创建,但它会破坏语法突出显示。然后我必须再次执行syntax on,但随后标志的自定义颜色不显示,此时我必须重新加载定义这些颜色的 vimscript。

如何使这不破坏语法突出显示?

此外,这是通过使用 BufAddVimEnter 事件的自动命令完成的。

编辑:在帖子末尾写错了 BufXXX 事件 - 应该是 BufAdd

更新:

要重复我的问题,请获取下面的 .vim 文件,然后打开一个通常以语法高亮显示的新缓冲区。第一行会有一个红色的&gt;&gt; 符号,但文件不会突出显示语法。注意它必须是一个新的缓冲区(不在缓冲区列表中):

highlight Custom1 ctermfg=black ctermbg=red
highlight Custom2 ctermfg=black ctermbg=green

sign define custom_sign1 text=>> texthl=Custom1
sign define custom_sign2 text=<< texthl=Custom2

function! SignLine()
    execute "sign place 1 line=1 name=custom_sign1 file=" . expand("<afile>")
endfunction

autocmd!
    autocmd BufAdd * call SignLine()
augroup END

我创建了一个名为test.c 的简单文件。使用上述 .vim 脚本作为初始文件打开 vim,获取它(使用 :so %),然后打开 test.c,这是我看到的:

使用:syntax on 重新打开语法后,现在看起来像这样(自定义标志颜色现在已损坏):

要让自定义标志颜色再次起作用,我必须重新获取 vimscript AGAIN (:so test.vim),之后自定义标志和语法突出显示都可以工作:

我不应该这样做。为什么会这样?

【问题讨论】:

    标签: vim


    【解决方案1】:

    在 Vim 中打开脚本时,语法高亮已经提供了一个重要线索:

    最后一行没有正确突出显示,因为没有对应于augroup END:augroup 命令!您需要这样定义它(或将两条内线合并为autocmd! BufAdd ...):

    augroup SignLine
        autocmd!
        autocmd BufAdd * call SignLine()
    augroup END
    

    最初的:autocmd! 删除了所有定义的自动命令,也是负责加载语法的那些。这解释了损坏的行为。

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2015-08-26
      • 2022-11-17
      • 2016-11-29
      • 2014-09-26
      • 1970-01-01
      相关资源
      最近更新 更多