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