Vim 8.0 扩展了方案的语法高亮显示



我使用不同版本的方案(Gambit-C和Guile(,并且我已经为(大多数(Gambit-C的关键字编写了一个语法文件。但是,我只想在为Gambit-C使用文件时使用它。

从我的 vimrc 获取它不起作用,因为方案语法是在我的 vimrc 之后获取的,如果我使用 -s<脚本>或 -c获取它,它仅适用于打开的第一个文件,我必须为每个额外的文件/参数提供它。

我看到了这个解决方案,它部分解决了我的问题,但我真的不希望 vim 为每个方案文件使用 Gambit-C 语法。我也尝试添加

if exists("b:is_gambit") || exists("is_gambit")
"syntax extensions
....."
endif 

并像在鸡方案 vim 帮助中显示的那样使用它,但这不起作用,然后我意识到它似乎也不适用于鸡方案(即在".vim/ftplugin/scheme.vim"文件中设置"let b:is_chicken"不会将鸡语法添加到方案中(!!

我是否对变量"(let b:is_chicken("和(let b:is_gambit(做错了什么,或者是否有另一种方法可以使它适用于选定的方案文件,例如在所有文件加载后使 .vimrc 源文件?

更新:事实证明,由于某种原因,".vim/ftplugin/scheme.vim"没有获得来源,变量"b:is_chicken"也没有设置(这可以使用":scriptnames"或"echo b:is_chicken"进行检查(。然后我把"let b:is_chicken"放在".vim/syntax/scheme.vim"中,鸡方案语法就起作用了。但是,这并不能区分不同的方案文件。

似乎有三种方法可以做我想做的事情,我需要(尝试(理解变量、autocmd 和模式线

  1. 添加到将用于 Gambit-C 文件的 vimrc 中(即 vi -u {vimrc} [Gambit-C 文件] (

    ( 以下任一
    let g:is_gambit=1  "" This works on all the buffers 
    

:autocmd BufRead *.scm let b:is_gambit "" This works for all the buffers but is redundant given the above.

并放置表单的语法文件

if exists("b:is_gambit") || exists("is_gambit")
"syntax extensions
....."
endif 

如上文设置为".vim/after/syntax/scheme.vim"。

注意:在 -u {vimrc} 中设置 b:is_gambit 仅将其设置为当前缓冲区,而 g:is_gambit 表示所有打开的(方案 .i.e. ".scm"( 缓冲区(如果在 ".vim/syntax/scheme.vim" 中设置了 b:is_gambit,但它适用于所有缓冲区(。对于变量,b = 当前缓冲区,g = 全局。

或。。。。。。

  1. 添加到将用于 Gambit-C 文件的 vimrc 中(即 vi -u {vimrc} [Gambit-C 文件] (

    :autocmd BufEnter *.scm source /path/to/file/gambitc.vim ""Note BufEnter not BufRead
    

其中gambitc.vim是Gambit-C的语法文件。

注意:这里的 gambitc.vim 只需要将额外的语法添加到方案语法中

和。。。。。。

  1. 正如这里正确解释的那样,在您的一般 vimrc 中设置模式行并将 Gambit-C 语法文件放在".vim/syntax/"中,以不同的名称(例如".vim/syntax/gambitc.vim"(并通过将其放在文件中来获取原始方案语法

    :source /usr/share/vim/vim80/syntax/scheme.vim
    

或任何方案语法文件的路径。

然后在每个文件中要使用Gambit-C语法类型

;; vim: filetype=gambitc

即从当前语言中注释此行,然后编写语句。

如果我的任何解决方案有任何问题,请告诉我,我个人更喜欢第二个,因为它在将其移植到不同的机器时涉及更少的工作,尽管我怀疑使用"g:is_gambit"方法更有效

最新更新