如何以默认语法停止 vim 阅读?

问题描述

我已经定义了我自己的 javascript 语法文件,它在 ~/.vim/Syntax/after/

问题是 /usr/share/vim/vim82/Syntax 中存在的认语法文件与我的自定义语法文件一起加载(它似乎在我的自定义语法之前加载)。

结果是它与我的自定义语法冲突。

我如何只加载我的自定义语法文件?不是认的。

当然,我可以删除认的(有效),但考虑到它只会在 vim 更新时放回那里,这似乎不是对问题的非常可靠的修复。

我的自定义文件顶部有“语法清除”,但没有帮助。

我还注意到认语法文件的顶部有以下内容

  if !exists("main_Syntax")
    " quit when a Syntax file was already loaded
    if exists("b:current_Syntax")
      finish
    endif
    let main_Syntax = 'javascript'
  elseif exists("b:current_Syntax") && b:current_Syntax == "javascript"
    finish
  endif

但这也无济于事。

我也尝试将语法文件夹放在 .vim/Syntax 中,如官方 vim 页面所建议的那样,但这似乎根本没有做任何事情(例如,它根本没有被读取)。

谢谢。

解决方法

原则上,语法脚本的来源顺序如下:

~/.vim/syntax/foo.vim
$VIMRUNTIME/syntax/foo.vim
~/.vim/after/syntax/foo.vim

~/.vim/after/syntax/ 排在最后。如果您正在编写内置语法脚本的完整替代品,这不是一个好地方,因为您至少有一个在您之前的语法脚本。另一方面,如果您想做的是添加自己的内容或有选择地覆盖之前设置的内容,这是一个好地方。

$VIMRUNTIME/syntax/ 也不是一个好地方,因为它是一个系统范围的位置。 您的定制应该发生在您的 $HOME中,对吗?

~/.vim/syntax/ 首先是自定义语法脚本的理想位置,如果添加以下行:

let b:current_syntax = "javascript"

这是因为 $VIMRUNTIME/syntax/javascript.vim 以以下样板开头:

if !exists("main_syntax")
  " quit when a syntax file was already loaded
  if exists("b:current_syntax")
    finish
  endif
  let main_syntax = 'javascript'
elseif exists("b:current_syntax") && b:current_syntax == "javascript"
  finish
endif

本质上,如果设置了 b:current_syntax 则抛出毛巾,并以:

let b:current_syntax = "javascript"

“标记它的领土”,如果你愿意的话。

您不必检查任何东西,因为您是第一位的,但您仍然需要告诉其他语法脚本注意他们自己的事情。

请注意,不礼貌的语法脚本可能不会检查该缓冲区局部变量,因此完全有可能仍然存在冲突即使您在做正确的事情。但这就是 Vim 的本质。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...