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

问题描述 投票:0回答:5

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

vim
5个回答
69
投票

不直接,但是您始终可以使用映射:

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

即使您可以以

set nomagic
的方式设置“非常神奇”,您真的不会想要这样做,因为它会破坏几乎所有现有的插件。

编辑

另请参阅此页


16
投票

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
,然后再按向上箭头才能调用该模式。
    


1
投票
上面的答案

,因为我还不能评论,来自如何使替代()使用另一种魔术模式?,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 还很陌生)
    


0
投票
https://learnvimscriptthehardway.stevelosh.com/chapters/31.html#magic

添加普通模式映射,每当您开始搜索时,该映射都会自动为您插入
\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


0
投票

"vim.normalModeKeyBindingsNonRecursive": [ { "before": ["/"], "after": ["/"] } ]

	
© www.soinside.com 2019 - 2024. All rights reserved.