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

bga*_*zka 52 vim

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

DrA*_*rAl 56

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

:nnoremap / /\v
:cnoremap %s/ %s/\v
Run Code Online (Sandbox Code Playgroud)

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

编辑

另见本页.

  • +1谢谢.FWIW,这似乎更通用:`:cnoremap s/s /\v`. (17认同)
  • 我不太关心插件。我想要不糟糕的正则表达式。 (2认同)
  • @DrAl,关于您的最终评论,似乎应该有一种方法可以在不影响插件的情况下更改该设置。并不是说你错了,但这似乎是一个明显的特征:当*我*搜索时,我希望事情总是以这种方式工作——这应该对插件没有影响。 (2认同)

Kyl*_*and 14

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
Run Code Online (Sandbox Code Playgroud)

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

如果键入以下内容:/ {pattern}:%s // {replacement}

...然后,如果没有这种映射,您可以在进行替换之前查看要替换的内容.但是通过重新映射,你突然s/\v/而不是s//; 这匹配文件中的eveything,这显然是错误的.

幸运的是,s命令本身有一个very magic用于搜索的替代形式.所以这里是我目前使用的映射.vimrc:

nnoremap / /\v
vnoremap / /\v
cnoremap %s/ %smagic/
cnoremap >s/ >smagic/ 
nnoremap :g/ :g/\v
nnoremap :g// :g//
Run Code Online (Sandbox Code Playgroud)

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

编辑:不幸的是,似乎没有"魔术"版本:global,这就是为什么看似多余的映射:g//用于确保全局命令可以使用以前的搜索模式.

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