我使用“非常神奇”进行正则表达式搜索(即 / 或 %s/ ),但我希望我可以设置一些选项,这样我就不必再在任何地方包含了。有办法做到这一点吗?
不直接,但是您始终可以使用映射:
:nnoremap / /\v
:cnoremap %s/ %s/\v
即使您可以以
set nomagic
的方式设置“非常神奇”,您真的不会想要这样做,因为它会破坏几乎所有现有的插件。
编辑
另请参阅此页。
EDIT2:我刚刚发现了这个插件,它可能比重新映射解决方案更好(这似乎有一些不可避免的缺点;见下文)。不过,我还没有测试过它,所以我不知道它的行为是否完全符合预期。
http://www.vim.org/scripts/script.php?script_id=4849
EDIT3:我已经使用这个插件大约一年半了,我喜欢它。然而,它仍然会干扰搜索历史记录(见下文),并且还会中断
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//
;这与文件中的所有内容相匹配,这显然是错误的。
幸运的是,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]\>
,该模式 not以
\v
开头。如果没有上述重新映射,输入 /
并按向上箭头将调用该搜索模式。 使用重新映射,但是,在输入
/
后,您必须先删除自动插入的 \v
,然后再按向上箭头才能调用该模式。,因为我还不能评论,来自如何使替代()使用另一种魔术模式?,vim文档和我自己的测试,smagic
(和
sm
)进入 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
(即 :%s/\v\(/\)/g
)
(如果我搞砸了,请纠正我,我对 Vim 还很陌生)\v
我当前在 init.vim 中的配置:
(我想转到第一行然后搜索,然后使用's
返回,所以
msgg
)" vim has set: au BufNewFile,BufRead *.ahk setf autohotkey
if &filetype == 'vim'
nnoremap / msgg/\v^[^"]*
elseif &filetype == 'autohotkey'
echo 'ahk'
nnoremap / msgg/\v^[^;]*
" todo
" https://github.com/hnamikaw/vim-autohotkey
elseif expand('%:t') == 'wf_key.ahk'
nnoremap / msgg/\v^[^;]*
elseif &filetype == 'zsh'
nnoremap / msgg/\v^[^#]*
else
" vscode neovim can not detect filetype?
nnoremap / msgg/\v^[^#";(//)(/*)]*
endif
nnoremap ? msgg/\v
" nnoremap / /\v
cnoremap s/ s/\v
todo:
very magic
的插件
https://github.com/coot/EnchantedVim
"vim.normalModeKeyBindingsNonRecursive":
[
{
"before": ["/"],
"after": ["/"]
}
]