在vim中,有没有办法永久地和全局地设置“非常神奇”?

时间:2010-09-21 12:53:25

标签: vim

我对正则表达式搜索使用“非常神奇”(即/ \ v或%s / \ v),但我希望我可以设置一些选项,这样我就不必再在任何地方包含\ v。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:54)

不是直接的,但是你总是可以使用映射:

:nnoremap / /\v
:cnoremap %s/ %s/\v

即使你能以set nomagic的方式设置'非常神奇',你真的不想这样,因为它会破坏现有的每个插件。

修改

另见this page

答案 1 :(得分:12)

EDIT2:我刚刚发现了这个插件,它可能比重映射解决方案更好(它似乎有一些不可避免的缺点;见下文)。但是我还没有测试过,所以我不知道它是否完全符合预期。

http://www.vim.org/scripts/script.php?script_id=4849

编辑3:我已经使用这个插件大约一年半了,我喜欢它。它仍然会干扰搜索历史记录(见下文),它也会中断incsearch,所以我在Vim配置中有以下内容:

" Since I use incsearch:
let g:VeryMagic = 0
nnoremap / /\v
nnoremap ? ?\v
vnoremap / /\v
vnoremap ? ?\v
" If I type // or ??, I don't EVER want \v, since I'm repeating the previous
" search.
noremap // //
noremap ?? ??
" no-magic searching
noremap /v/ /\V
noremap ?V? ?\V

" Turn on all other features.
let g:VeryMagicSubstituteNormalise = 1
let g:VeryMagicSubstitute = 1
let g:VeryMagicGlobal = 1
let g:VeryMagicVimGrep = 1
let g:VeryMagicSearchArg = 1
let g:VeryMagicFunction = 1
let g:VeryMagicHelpgrep = 1
let g:VeryMagicRange = 1
let g:VeryMagicEscapeBackslashesInSearchArg = 1
let g:SortEditArgs = 1

我暂时使用了DrAI的建议,但由于以下行为,在实践中发现它令人沮丧:

如果您输入以下内容:     /{图案}     :%S // {替换}

...然后,如果没有此映射,您可以在进行替换之前查看要替换的内容。但是通过重新映射,您突然有s/\v/而不是s//;这符合 eveything in the file ,这显然是错误的。

幸运的是,s命令本身有一个替代形式,使用very magic进行搜索。以下是我目前在.vimrc中使用的映射:

nnoremap / /\v
vnoremap / /\v
cnoremap %s/ %smagic/
cnoremap >s/ >smagic/ 
nnoremap :g/ :g/\v
nnoremap :g// :g//

请注意,在尝试使用以s/结尾的模式时,仅映射s会导致问题;同样,在使用以g/结尾的模式时,映射g会产生问题。请注意,:g/:g//映射会阻止Vim立即显示命令。

编辑:不幸的是,似乎没有"魔法" :global的版本,这就是使用看似多余的:g//映射来确保全局命令可以使用以前的搜索模式的原因。

另一个缺点是这些重新映射会干扰搜索历史记录。例如,考虑使用*来搜索光标下的下一个单词。这会导致Vim搜索模式\<[word]\>\v开头。如果没有上述重映射,键入/并按向上箭头将调用该搜索模式。 重映射,但在输入/后,您必须先删除自动插入的\v,然后再按向上箭头才能调出该模式。

答案 2 :(得分:1)

要回复the answer above,因为我还没有评论,请从How to make substitute() use another magic mode?,vim文档和我自己的测试中,smagic(和sm)仅输入{ {1}}模式,而不是magic模式。

very magic

例如,应该将 *:snomagic* *:sno* :[range]sno[magic] ... Same as `:substitute`, but always use 'nomagic'. {not in Vi} *:smagic* *:sm* :[range]sm[agic] ... Same as `:substitute`, but always use 'magic'. {not in Vi} 转换为(而不是)的文件中的:%sm/(/)/g,这对我来说是以下情况

:%sm/\(/\)/g

相反,要进入E54: Unmatched \( E54: Unmatched \( E476: Invalid command 模式,应该在very magic(即\v)的搜索表达式中使用substitute (如果我搞砸了,请纠正我,我是Vim的新手)