Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 在缓冲区中重新加载所有文件后,文件类型设置丢失_Vim - Fatal编程技术网

Vim 在缓冲区中重新加载所有文件后,文件类型设置丢失

Vim 在缓冲区中重新加载所有文件后,文件类型设置丢失,vim,Vim,运行后:bufdo e 我的所有文件都会丢失其文件类型设置,我必须在每个文件中手动运行:set ft=XXX 有人知道如何解决这个问题吗 运行:bufdo set ft=XXX不起作用,我不想将所有文件设置为同一文件类型 干杯。出于性能原因,bufdo命令不会更新语法高亮显示: 从vim文档: 注意:在执行此命令时,通过将语法自动命令事件添加到“eventignore”来禁用它。这大大加快了编辑每个缓冲区的速度 您可以通过重新运行以下命令来更新受影响缓冲区的语法突出显示: :语法在您可以通过以下

运行
后:bufdo e
我的所有文件都会丢失其文件类型设置,我必须在每个文件中手动运行
:set ft=XXX

有人知道如何解决这个问题吗

运行
:bufdo set ft=XXX
不起作用,我不想将所有文件设置为同一文件类型


干杯。

出于性能原因,
bufdo
命令不会更新语法高亮显示:

从vim文档:

注意:在执行此命令时,通过将语法自动命令事件添加到“eventignore”来禁用它。这大大加快了编辑每个缓冲区的速度

您可以通过重新运行以下命令来更新受影响缓冲区的语法突出显示:


:语法在

您可以通过以下autocmd自动修复此问题:

" 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

编辑:添加autocmd嵌套以正确还原突出显示组并处理缓冲区重新加载,正如问题明确提出的那样。

如果您正在检查更改的文件(例如在VCS中切换分支后),则
:checktime
可能是比
:bufdo e>更合适的解决方案-它是为此目的设计的,没有语法突出显示问题。

来自vim文档:注意:当执行此命令时,语法自动命令事件通过将其添加到“eventignore”中被禁用。这大大加快了编辑每个缓冲区的速度。实际上,除非我关闭自动文件类型检测,否则我无法重现您的问题。您是否打开了
:filetype
?实际上,在丢失语法高亮显示的文件上运行“:set ft”,表明文件类型设置正确!这就是vim文档所指的吗?好的,现在复制它,在每个缓冲区上运行
语法
,恢复突出显示。。。如果要对所有缓冲区执行此操作,可能必须编写vim函数,因为
bufdo
由于明显的原因无法执行此操作。似乎我只需在一个缓冲区上运行
syntax on
,即可恢复所有缓冲区上的语法高亮显示。谢谢。这似乎只在我第一次运行
bufdo e时起作用。如果我再次运行它,缓冲区中的其他文件将丢失语法高亮显示。@centerback:我的主要用例是
:bufdo%s更新
;似乎必须显式地处理缓冲区重新加载。我已经更新了我的答案。这将恢复默认的文件类型语法,但是它不会从我的vimrc恢复一些自定义的语法设置。是否有一种“正确”的方法来设置vimrc中的“高光组”颜色以便恢复?回答我自己的评论,解决方案是将我的
匹配设置为,
autocmd
语句中的
语法
高亮显示
命令,以便在启用高亮显示时重新应用。无论何时在Vim之外修改文件(缓冲区),这都是正确的答案。正如Paul所说,在分支之间切换就是一个例子<代码>:上的语法未更新我的
$HOME/.vim/syntax/custom.vim
文件中的更改。