Вопрос по – настройка типа файла потеряна после перезагрузки всех файлов в буфере

7

После запуска:bufdo e! Все мои файлы теряют свои настройки типа файла, и я должен вручную запустить:set ft=XXX в каждом файле.

Кто-нибудь знает, как решить эту проблему?

Бег:bufdo set ft=XXX не работает, и я не хочу устанавливать для всех файлов один и тот же тип файла в любом случае.

Приветствия.

Из документов Vim:Note: While this command is executing, the Syntax autocommand event is disabled by adding it to 'eventignore'. This considerably speeds up editing each buffer. Benj
кажется, мне просто нужно бежатьsyntax on на одном буфере для восстановления подсветки синтаксиса на всех буферах. Благодарю. centerback
на самом деле, работает ': set ft?' для файлов, которые потеряли подсветку синтаксиса, показывает, что тип файла установлен правильно! Это то, на что ссылаются vim docs? centerback
Хорошо, воспроизведено сейчас, работаетsyntax on на каждом буфере восстанавливает подсветку ... Возможно, вам придется написать функцию vim, если вы хотите сделать это для всех буферов, хотя, так какbufdo не сделаю это по очевидным причинам. Benj
На самом деле, я не могу воспроизвести вашу проблему, если я не отключу автоматическое определение типа файла, у вас есть:filetype on? Benj

Ваш Ответ

3   ответа
15

bufdo Команда не обновляет подсветку синтаксиса по соображениям производительности:

Из Vim Docs:

Note: While this command is executing, the Syntax autocommand event is disabled by adding it to 'eventignore'. This considerably speeds up editing each buffer

Вы можете обновить подсветку синтаксиса для затронутых буферов, повторно запустив:

:syntax on

Самое простое решение, спасибо.
5

" Enable syntax highlighting when buffers were loaded through :bufdo, which
" disables the Syntax autocmd event to speed up processing.
augroup EnableSyntaxHighlighting
    " Filetype processing does happen, so we can detect a buffer initially
    " loaded during :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.
    " 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 * nested if exists('syntax_on') && ! exists('b:current_syntax') && ! empty(&l:filetype) | 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

Edit: Добавьте вложение autocmd для правильного восстановления групп подсветки и обработки перезагрузок буфера, поскольку вопрос явно задан для этого.

Это восстанавливает синтаксис типов файлов по умолчанию, но не восстанавливает некоторые настройки синтаксиса из моего vimrc. Есть ли "правильный" ответ? способ установить & quot; выделить ГРУППУ & quot; цвет в vimrc так будет восстанавливаться?
@centerback: мой основной вариант использования был:bufdo %s... | update; похоже, что перезагрузки буфера должны обрабатываться явно. Я обновил свой ответ.
Кажется, это работает только при первом запускеbufdo e!, Если я запускаю его снова, другие файлы в буфере теряют подсветку синтаксиса. centerback
Отвечая на мой собственный комментарий, решение было поставить мойmatch, syntax а такжеhighlight Команды вautocmd заявление, поэтому они повторно применяются, когда выделение включено.
5

после переключения веток в вашей VCS), тогда:checktime может быть более подходящим решением, чем:bufdo e! - он разработан для этой цели и не имеет проблемы выделения синтаксиса.

Это правильный ответ для любого изменения файла (буфера) вне Vim. Как сказал Павел, примером может служить переключение между ветвями.

Похожие вопросы