使用argdo打开多个文件时,vim中没有启用语法高亮显示



我经常从MacVim内部一次打开整组文件。为此,我通常使用以下命令:

args *PATTERN*
argdo tabedit

这会将工作目录中与模式匹配的所有文件加载到参数列表中,然后在单独的选项卡中打开所有文件。当我这样做时,语法高亮显示不会自动打开,我必须手动设置。我该怎么解决这个问题?

我已经在类似的问题中发布了:bufdo的解决方法;这里还有一个扩展版本,可以处理您的用例。围绕'eventignore'的自动设置工作相当棘手,因此有充分的评论:

" Enable syntax highlighting when buffers are displayed in a window through
" :argdo and :bufdo, which disable the Syntax autocmd event to speed up
" processing.
augroup EnableSyntaxHighlighting
" Filetype processing does happen, so we can detect a buffer initially
" loaded during :argdo / :bufdo through a set filetype, but missing
" b:current_syntax. Also don't do this when the user explicitly turned off
" syntax highlighting via :syntax off.
" The following autocmd is triggered twice:
" 1. During the :...do iteration, where it is inactive, because
" 'eventignore' includes "Syntax". This speeds up the iteration itself.
" 2. After the iteration, when the user re-enters a buffer / window that was
" loaded during the iteration. Here is becomes active and enables syntax
" highlighting. Since that is done buffer after buffer, the delay doesn't
" matter so much.
" Note: When the :...do command itself edits the window (e.g. :argdo
" tabedit), the BufWinEnter event won't fire and enable the syntax when the
" window is re-visited. We need to hook into WinEnter, too. Note that for
" :argdo split, each window only gets syntax highlighting as it is entered.
" Alternatively, we could directly activate the normally effectless :syntax
" enable through :set eventignore-=Syntax, but that would also cause the
" slowdown during the iteration Vim wants to avoid.
" Note: Must allow nesting of autocmds so that the :syntax enable triggers
" the ColorScheme event. Otherwise, some highlighting groups may not be
" restored properly.
autocmd! BufWinEnter,WinEnter * nested if exists('syntax_on') && ! exists('b:current_syntax') && ! empty(&l:filetype) && index(split(&eventignore, ','), 'Syntax') == -1 | syntax enable | endif
" The above does not handle reloading via :bufdo edit!, because the
" b:current_syntax variable is not cleared by that. During the :bufdo,
" 'eventignore' contains "Syntax", so this can be used to detect this
" situation when the file is re-read into the buffer. Due to the
" 'eventignore', an immediate :syntax enable is ignored, but by clearing
" b:current_syntax, the above handler will do this when the reloaded buffer
" is displayed in a window again.
autocmd! BufRead * if exists('syntax_on') && exists('b:current_syntax') && ! empty(&l:filetype) && index(split(&eventignore, ','), 'Syntax') != -1 | unlet! b:current_syntax | endif
augroup END

这样的东西应该可以工作:

:argdo set eventignore-=Syntax | tabedit

这将从eventignore设置中删除Syntax

argdoSyntax添加到'eventignore'设置中(请参见:h argdo)。这意味着这些文件没有任何突出显示,因为该缓冲区没有触发语法自动命令事件。这使得看起来'filetype'没有被设置。这不是真的。你可以通过做:set ft?来检查。您可以运行:syntax on来重新启用语法高亮显示。但这并不是真正令人满意的,而且感觉很草率。

也许更好的方法是放弃使用选项卡,转而使用缓冲区和相关的缓冲区命令。与Arglist相关的缓冲区命令有::next:previous:first:last。可以使用:b file.c:sb file.c打开特定文件,以在新拆分中打开缓冲区。

我意识到这是一颗难以下咽的药丸,当然有时你可能真的希望每个缓冲区都在自己的标签页中。一旦你强迫自己更多地使用缓冲区,你就会发现很少需要选项卡。你可能想看看Drew Neil关于如何使用标签的出色的Vimcast。我还建议使用Tim Pope的unaired.vim来更容易地在论点列表中移动。

如果您真的必须在文件中的每个选项卡中使用:argdo tabe,那么您可能应该使用:syntax on:tabdo doautocmd Syntax

有关更多帮助,请参阅:

:h :argdo
:h arglist
:h buffers
:h :b
:h :sb
:h :next
:h :tabdo
:h :doa
:h Syntax
:h :syn-on

我不熟悉argsargdo,但如果您需要在不同的选项卡中打开与模式匹配的文件,可以使用以下内容:

:next *
:tab ball

:next *打开所有使用正确语法高亮显示模式的文件,但是:tab ball打开内存中的所有文件,如果您有不需要在选项卡中打开的缓冲区,这可能会有问题。

最新更新