配置Vim的Bash函数名单词边界高亮及关键字冲突修复
解决Vim中Bash函数名的两个高亮问题
我之前也碰到过类似的困扰,这就给你一步步解决:
一、实现Bash函数名的单词边界高亮
Vim默认的Bash语法高亮并没有专门针对函数名的单词边界高亮,我们可以通过自定义语法规则来实现。
在你的~/.vimrc(Neovim用户则是~/.config/nvim/init.vim)中添加以下配置:
" 针对Bash文件,定义函数名的单词边界匹配规则 autocmd FileType bash syn match BashFuncName "\<\w\+-\?\w\+\>" containedin=BashFunction " 将自定义的函数名语法组链接到默认的函数高亮样式(也可以自定义颜色) autocmd FileType bash hi def link BashFuncName Function
- 解释:
\<和\>是Vim的单词边界标记,确保我们只匹配完整的函数名;\w\+-\?\w\+用来匹配包含连字符的函数名(比如values-for这种格式);containedin=BashFunction限定这个规则只在函数定义的代码块内生效。 - 如果想要自定义高亮颜色,可以把第二行换成类似这样:
autocmd FileType bash hi BashFuncName guifg=#89dceb ctermfg=14(gui是图形界面颜色,cterm是终端颜色)。
二、修复函数名包含Bash关键字时的误判报错
这个问题是因为Vim的Bash语法文件会全局匹配关键字,即使它们是函数名的一部分。我们可以通过修改语法优先级,让函数名内的关键字不被识别为错误。
最稳妥的方法是在~/.vim/after/syntax/bash.vim(如果没有这个文件,直接创建即可)中添加以下内容:
" 清除原有全局关键字匹配规则 syn clear BashKeyword " 重新定义关键字匹配,限定只在命令、循环、条件等代码块中生效 syn match BashKeyword "\<if\>\|\<then\>\|\<else\>\|\<fi\>\|\<for\>\|\<in\>\|\<while\>\|\<do\>\|\<done\>\|\<case\>\|\<esac\>\|\<until\>\|\<function\>\|\<time\>\|\<select\>\|\<return\>\|\<continue\>\|\<break\>" containedin=BashCommand,BashLoop,BashConditional,BashCase,BashSelect " 定义函数名内的关键字匹配规则 syn match BashFuncName "\<\w\+-\?\w\+\>" containedin=BashFunction contains=BashFuncNameKeyword syn match BashFuncNameKeyword "\<if\>\|\<then\>\|\<else\>\|\<fi\>\|\<for\>\|\<in\>\|\<while\>\|\<do\>\|\<done\>\|\<case\>\|\<esac\>\|\<until\>\|\<function\>\|\<time\>\|\<select\>\|\<return\>\|\<continue\>\|\<break\>" containedin=BashFuncName " 让函数名内的关键字和函数名使用相同高亮,覆盖错误标记 hi def link BashFuncNameKeyword BashFuncName
这样配置后,像values-for()这种函数名里的for就会被当作函数名的一部分,不会再被标黄提示语法错误了。
测试验证
创建一个测试脚本test.sh,写入:
values-for() { echo "Hello from values-for function" } my-if-test() { echo "Another function with keyword in name" }
用Vim打开后,你会看到两个函数名都被完整高亮,且关键字部分没有错误标记。
内容的提问来源于stack exchange,提问作者Stephen Chu
相关产品推荐
相关产品推荐

