Vim 8.0 扩展语法突出显示方案
Vim 8.0 extended syntax highlighting for scheme
我使用了不同版本的方案(Gambit-C 和 Guile)并且我已经为(大部分)Gambit-C 的关键字编写了一个语法文件。但是,我只想在为 Gambit-C 使用文件时使用它。
从我的 vimrc 获取它不起作用,因为方案语法是在我的 vimrc 之后获取的,如果我使用 -s 或 -c 获取它,它只适用于打开的第一个文件,我必须为每个额外的 file/argument 获取它。
我看到 this 解决方案部分解决了我的问题,但我真的不希望 vim 对 every 方案使用 Gambit-C 语法文件。
我也尝试添加
if exists("b:is_gambit") || exists("is_gambit")
"syntax extensions
....."
endif
并像 chicken scheme vim help 中显示的那样使用它,但这没有用,然后我意识到它似乎也不适用于鸡肉方案(即在 ". vim/ftplugin/scheme.vim" 文件没有将 chickens 语法添加到方案中)!!
我是不是对变量“(let b:is_chicken)”和(let b:is_gambit)做错了什么,或者是否有另一种方法让它适用于选定的方案文件,例如制作.vimrc 在所有文件加载后获取文件?
更新:事实证明,由于某种原因,“.vim/ftplugin/scheme.vim”没有得到来源,变量 "b:is_chicken was not set (this can be checked using ":scriptnames” 或 "echo b:is_chicken" ). 然后我把 "let b:is_chicken" 放在 ".vim/syntax/scheme.vim" 中,chicken scheme 语法就起作用了。虽然这不区分不同的 scheme 文件。
似乎有三种方法可以做我想做的事,我需要(尝试)理解变量、autocmd 和 modelines
添加到将用于 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" )缓冲区(如果 b:is_gambit 在 ".vim/syntax/scheme.vim" 中设置,它在所有缓冲区中都有效)。对于 variables,b = 当前缓冲区和 g = 全局。
或者……
添加到将用于 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只需要在scheme语法中加入额外的语法即可
和……
如正确解释here 在您的通用 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" 方法是更有效率
我使用了不同版本的方案(Gambit-C 和 Guile)并且我已经为(大部分)Gambit-C 的关键字编写了一个语法文件。但是,我只想在为 Gambit-C 使用文件时使用它。
从我的 vimrc 获取它不起作用,因为方案语法是在我的 vimrc 之后获取的,如果我使用 -s
我看到 this 解决方案部分解决了我的问题,但我真的不希望 vim 对 every 方案使用 Gambit-C 语法文件。 我也尝试添加
if exists("b:is_gambit") || exists("is_gambit")
"syntax extensions
....."
endif
并像 chicken scheme vim help 中显示的那样使用它,但这没有用,然后我意识到它似乎也不适用于鸡肉方案(即在 ". vim/ftplugin/scheme.vim" 文件没有将 chickens 语法添加到方案中)!!
我是不是对变量“(let b:is_chicken)”和(let b:is_gambit)做错了什么,或者是否有另一种方法让它适用于选定的方案文件,例如制作.vimrc 在所有文件加载后获取文件?
更新:事实证明,由于某种原因,“.vim/ftplugin/scheme.vim”没有得到来源,变量 "b:is_chicken was not set (this can be checked using ":scriptnames” 或 "echo b:is_chicken" ). 然后我把 "let b:is_chicken" 放在 ".vim/syntax/scheme.vim" 中,chicken scheme 语法就起作用了。虽然这不区分不同的 scheme 文件。
似乎有三种方法可以做我想做的事,我需要(尝试)理解变量、autocmd 和 modelines
添加到将用于 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" )缓冲区(如果 b:is_gambit 在 ".vim/syntax/scheme.vim" 中设置,它在所有缓冲区中都有效)。对于 variables,b = 当前缓冲区和 g = 全局。
或者……
添加到将用于 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只需要在scheme语法中加入额外的语法即可
和……
如正确解释here 在您的通用 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" 方法是更有效率