首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在vimrc中使用包含regex的变量

如何在vimrc中使用包含regex的变量
EN

Stack Overflow用户
提问于 2016-01-05 15:13:15
回答 2查看 758关注 0票数 1

简略版:我想在.vimrc上做这样的事情

代码语言:javascript
复制
let my_regex = "some regex"
autocmd Syntax * syn match CamelCase my_regex transparent containedin=.*Comment.*,.*String.*,VimwikiLink contains=@NoSpell contained

但它显然不起作用-变量my_regex没有展开或识别。如果我直接用它的内容替换变量--它工作得很好。我在这里错过了什么?

故事:在搜索了一下之后,我发现了一个技巧这里,它使vim的拼写检查忽略骆驼大小写单词(上下)。但是我把regex扩展到忽略了其他几个词,这个表达变得非常丑陋。所以,我试着做这样的事情:

代码语言:javascript
复制
" ignore camel case  "
let vim_spellcheck_ignore_words = "\(\<\|_\)\%(\u\l*\)\{2,}\(\>\|_\)\|\<\%(\l\l*\)\%(\u\l*\)\{1,}\>"

" ignore upper-case only words  "
let vim_spellcheck_ignore_words = vim_spellcheck_ignore_words . "\|\<[A-Z]*\>"

" ignore words, which contain '_' or a digit  "
let vim_spellcheck_ignore_words = vim_spellcheck_ignore_words . "\|\<[a-zA-Z_]*[0-9_]\+[0-9a-zA-Z_]*\>"

" something ese ..  "
let vim_spellcheck_ignore_words = vim_spellcheck_ignore_words . "something"  

autocmd Syntax * syn match CamelCase vim_spellcheck_ignore_words transparent containedin=.*Comment.*,.*String.*,VimwikiLink contains=@NoSpell contained

最后解决办法:

代码语言:javascript
复制
" begin regex "
let vim_spellcheck_ignore_words = "/" 

" ignore upper and lower camel case words "
let vim_spellcheck_ignore_words = vim_spellcheck_ignore_words . "\\(\\<\\|_\\)\\%(\\u\\l*\\)\\{2,}\\(\\>\\|_\\)\\|\\<\\%(\\l\\l*\\)\\%(\\u\\l*\\)\\{1,}\\>"

" ignore all-caps words "
let vim_spellcheck_ignore_words = vim_spellcheck_ignore_words . "\\|\\<[A-Z]*\\>"

" ignore words, which contain a digit or '_' "
let vim_spellcheck_ignore_words = vim_spellcheck_ignore_words . "\\|\\<[a-zA-Z_]*[0-9_]\\+[0-9a-zA-Z_]*\\>"

" end of regex "
let vim_spellcheck_ignore_words = vim_spellcheck_ignore_words . "/"

autocmd Syntax * exe "syn match CamelCase" vim_spellcheck_ignore_words "transparent containedin=.*Comment.*,.*String.*,VimwikiLink contains=@NoSpell contained"

解决办法摘要(基于初步办法):

  • //中包围正则表达式
  • 逃避所有的斜杠
  • 使用exe (execute)计算表达式

备选方案:

代码语言:javascript
复制
autocmd Syntax * syn match CamelCase
    \ "\(\<\|_\)\%(\u\l*\)\{2,}\(\>\|_\)\|\<\%(\l\l*\)\%(\u\l*\)\{1,}\>
    \ \|\<[A-Z]*\>
    \ \|\<[a-zA-Z_]*[0-9_]\+[0-9a-zA-Z_]*\>"
    \ transparent containedin=.*Comment.*,.*String.*,VimwikiLink contains=@NoSpell contained
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-05 15:42:06

syn不需要一个表达式。我不记得确切地知道ex命令期望从:exe:let:echo系列命令中获得一个表达式。因此,如果要使用变量,必须使用:exe命令来插入变量:

代码语言:javascript
复制
autocmd Syntax * exe "syn match CamelCase" my_regex "transparent containedin=.*Comment.*,.*String.*,VimwikiLink contains=@NoSpell contained"
票数 2
EN

Stack Overflow用户

发布于 2016-01-05 15:43:55

我希望我能正确理解你的问题。

要动态地“构建”命令/自动you,可以使用:execute如下:

代码语言:javascript
复制
autocmd Syntax * exe "syn match CamelCase " . variable ." .... rest commands"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34614982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档