Я использую "очень волшебный" для поиска в регулярном выражении (т.е./\ v или% s/\ v), но мне хотелось бы установить какой-то параметр, поэтому мне больше не нужно включать \v в любом месте. Есть ли способ сделать это?
В vim существует ли способ установить "очень волшебную" навсегда и глобально?
Ответ 1
Не напрямую, однако вы всегда можете использовать отображение:
:nnoremap / /\v
:cnoremap %s/ %s/\v
Даже если вы можете установить "очень волшебное" в способ, которым вы можете set nomagic
, вы действительно не захотите, так как он сломает почти все плагины.
Изменить
См. также эту страницу.
Ответ 2
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//
; это соответствует eveything в файле, что, очевидно, неверно.
К счастью, команда 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 немедленно отображать команду.
EDIT: К сожалению, не существует "волшебной" версии :global
, поэтому кажущееся избыточное отображение :g//
используется, чтобы гарантировать, что глобальная команда может использовать предыдущий шаблон поиска.
Другим недостатком является то, что эти переназначения мешают истории поиска. В качестве примера рассмотрим использование *
для поиска следующего вхождения слова под курсором. Это заставляет Vim искать шаблон \<[word]\>
, который не начинается с \v
. Без описанных выше повторений, набрав /
и нажав стрелку вверх, вы услышите этот шаблон поиска. С перенаправлением, однако, после ввода /
, вы должны удалить автоматически вставленный \v
, прежде чем нажимать стрелку вверх, чтобы вызвать этот шаблон.