在 vimrc 中,仅对特定文件类型应用特定的突出显示规则
in vimrc apply certain highlighting rules only for certain filetype
在我的 vimrc 中,我有一个脚本可以在 * * 双星 * * 之间将文本转换为粗体(实际上就像在这个编辑器中所做的那样),但我不希望它当然适用于我的 js 或 c 或任何编程文件,所以我尝试仅在它是 .txt 文件时才将其设为 运行 :
if (&filetype=='text')
set concealcursor=n
set conceallevel=3
hi AsteriskBold ctermfg=Green cterm=bold
autocmd BufEnter * syn match Asterisks contained "**" conceal
autocmd BufEnter * syn match AsteriskBold "\*\*.*\*\*" contains=Asterisks
endif
但显然 "if" 的条件不起作用,因为此规则不再适用于我的文件的 none,文本与否
编辑 => 解决方案
阅读答案后,我在我的 vimrc 中选择了这个解决方案(尽管这不是 vim 工作的最佳方式,正如 ingo 所解释的那样)
au BufEnter *.txt setf text "(set a filetype unless it already exist)
au filetype text set cocu=n cole=3
au filetype text hi AsteriskBold ctermfg=Green cterm=bold
au filetype text syn match Asterisks contained "**" conceal
au filetype text syn match AsteriskBold "\*\*.*\*\*" contains=Asterisks
您正在寻找 augroup
。
参见 :help augroup
和 :help filetype
。
例如:
augroup asteriskbold
au!
au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn set concealcursor=n conceallevel=3
au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn hi AsteriskBold ctermfg=Green cterm=bold
au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn syn match Asterisks contained "**" conceal
au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn syn match AsteriskBold "\*\*.*\*\*" contains=Asterisks
augroup end
文件类型
特定于文件类型的设置进入 ~/.vim/after/ftplugin/text.vim
。 (这要求您有 :filetype plugin on
;使用 after 目录允许您覆盖 $VIMRUNTIME/ftplugin/text.vim
完成的任何默认文件类型设置。)或者,您可以定义一个:autocmd FileType text ...
直接在您的 ~/.vimrc
中,但是一旦您有很多自定义项,这往往会变得笨拙。
语法
对于:syntax
命令,有一个对应的目录~/.vim/after/syntax/text.vim
。 (Vim 目前没有附带专用的 text
语法;您可以删除 after
部分,将您的语法作为主要语法。)
根据语法脚本约定,您的语法组应以文件类型为前缀;例如textAsterisks
。 :hi
组也必须重命名;然而,语法脚本通常使用 :hi def link
到 link 语法组到(更通用的)高亮组:hi def link textAsteriskBold AsteriskBold
。更多信息在 usr_44.txt
.
末尾
突出显示组
这些是全局的,您可以将 :hi
命令直接放入 ~/.vimrc
并只定义一次。
隐藏
隐藏设置为window-local,但文件类型和语法适用于缓冲区。通过使用 :set
(而不是 :setlocal
),这些设置将被从显示文本文件的文件打开的任何新 window 继承。根据您的工作流程(以及您编辑的其他文件类型是否完全使用隐藏),您可能永远不会注意到这一点,并且没有好的解决方法(只有一大堆 :autocmd
可以尝试调整它们)。请注意这一点。
在我的 vimrc 中,我有一个脚本可以在 * * 双星 * * 之间将文本转换为粗体(实际上就像在这个编辑器中所做的那样),但我不希望它当然适用于我的 js 或 c 或任何编程文件,所以我尝试仅在它是 .txt 文件时才将其设为 运行 :
if (&filetype=='text')
set concealcursor=n
set conceallevel=3
hi AsteriskBold ctermfg=Green cterm=bold
autocmd BufEnter * syn match Asterisks contained "**" conceal
autocmd BufEnter * syn match AsteriskBold "\*\*.*\*\*" contains=Asterisks
endif
但显然 "if" 的条件不起作用,因为此规则不再适用于我的文件的 none,文本与否
编辑 => 解决方案
阅读答案后,我在我的 vimrc 中选择了这个解决方案(尽管这不是 vim 工作的最佳方式,正如 ingo 所解释的那样)
au BufEnter *.txt setf text "(set a filetype unless it already exist)
au filetype text set cocu=n cole=3
au filetype text hi AsteriskBold ctermfg=Green cterm=bold
au filetype text syn match Asterisks contained "**" conceal
au filetype text syn match AsteriskBold "\*\*.*\*\*" contains=Asterisks
您正在寻找 augroup
。
参见 :help augroup
和 :help filetype
。
例如:
augroup asteriskbold
au!
au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn set concealcursor=n conceallevel=3
au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn hi AsteriskBold ctermfg=Green cterm=bold
au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn syn match Asterisks contained "**" conceal
au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn syn match AsteriskBold "\*\*.*\*\*" contains=Asterisks
augroup end
文件类型
特定于文件类型的设置进入 ~/.vim/after/ftplugin/text.vim
。 (这要求您有 :filetype plugin on
;使用 after 目录允许您覆盖 $VIMRUNTIME/ftplugin/text.vim
完成的任何默认文件类型设置。)或者,您可以定义一个:autocmd FileType text ...
直接在您的 ~/.vimrc
中,但是一旦您有很多自定义项,这往往会变得笨拙。
语法
对于:syntax
命令,有一个对应的目录~/.vim/after/syntax/text.vim
。 (Vim 目前没有附带专用的 text
语法;您可以删除 after
部分,将您的语法作为主要语法。)
根据语法脚本约定,您的语法组应以文件类型为前缀;例如textAsterisks
。 :hi
组也必须重命名;然而,语法脚本通常使用 :hi def link
到 link 语法组到(更通用的)高亮组:hi def link textAsteriskBold AsteriskBold
。更多信息在 usr_44.txt
.
突出显示组
这些是全局的,您可以将 :hi
命令直接放入 ~/.vimrc
并只定义一次。
隐藏
隐藏设置为window-local,但文件类型和语法适用于缓冲区。通过使用 :set
(而不是 :setlocal
),这些设置将被从显示文本文件的文件打开的任何新 window 继承。根据您的工作流程(以及您编辑的其他文件类型是否完全使用隐藏),您可能永远不会注意到这一点,并且没有好的解决方法(只有一大堆 :autocmd
可以尝试调整它们)。请注意这一点。