Подтвердить что ты не робот

В vim существует ли способ установить "очень волшебную" навсегда и глобально?

Я использую "очень волшебный" для поиска в регулярном выражении (т.е./\ v или% s/\ v), но мне хотелось бы установить какой-то параметр, поэтому мне больше не нужно включать \v в любом месте. Есть ли способ сделать это?

4b9b3361

Ответ 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, прежде чем нажимать стрелку вверх, чтобы вызвать этот шаблон.