Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Syntax highlighting is not turned on in vim when opening multiple files using argdo

Tags:

vim

I frequently open whole sets of file at once from inside MacVim. To do this, I typically use the commands:

args *PATTERN*
argdo tabedit

This loads all files in the working directory that match the pattern into the argument list, and then opens them all in separate tabs. Syntax highlighting is not automatically turned on when I do this and I have to set it manually. How can I fix this?

like image 526
Sean Mackesey Avatar asked Sep 18 '12 22:09

Sean Mackesey


3 Answers

I had already posted a workaround for :bufdo in a similar question; here is an extended version that handles your use case, too. Working around the automatic setting of 'eventignore' is quite tricky, therefore it's amply commented:

" 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
like image 88
Ingo Karkat Avatar answered Oct 15 '22 11:10

Ingo Karkat


Something like this should work:

:argdo set eventignore-=Syntax | tabedit

That removes Syntaxfrom the eventignore setting.

like image 32
Raimondi Avatar answered Oct 15 '22 11:10

Raimondi


argdo adds Syntax to the 'eventignore' setting (see :h argdo). This means you do not have any highlighting for those files because the Syntax autocommand event is not fired for that buffer . Which makes it look like the 'filetype' is not being set. This is not true. You can check by doing a :set ft?. You can run :syntax on to turn back on syntax highlighting. But this is not really desirable and feels kludgy.

Probably a better approach is to wean yourself off of using tabs and instead use buffers and the associated buffer commands. Arglist related buffer commands are ::next, :previous, :first, and :last. You can open up specific files with :b file.c or :sb file.c to open the buffer in a new split.

I realize this is a hard pill to swallow and there certainly are times you may really want each buffer in its own tab page. Once you force yourself to use buffers more you will find the need for tabs are rare. You may want to look at Drew Neil's excellent Vimcast on How to use tabs. I also recommend using Tim Pope's unimpaired.vim to move around the argument list easier.

If you really must have each in file in their own tab use :argdo tabe then you should probably follow it with a :syntax on or :tabdo doautocmd Syntax

For more help see:

:h :argdo
:h arglist
:h buffers
:h :b
:h :sb
:h :next
:h :tabdo
:h :doa
:h Syntax
:h :syn-on
like image 21
Peter Rincker Avatar answered Oct 15 '22 13:10

Peter Rincker