В vim, есть ли способ установить "очень волшебное" постоянно и глобально? - PullRequest
50 голосов
/ 21 сентября 2010

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

Ответы [ 2 ]

54 голосов
/ 21 сентября 2010

Не напрямую, однако вы всегда можете использовать отображение:

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

Даже если бы вы могли установить «очень волшебство» так, как вы можете set nomagic, вы действительно не захотите этогосломал бы почти все плагины.

Редактировать

См. также эту страницу .

12 голосов
/ 11 апреля 2014

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]\>, который не начинается с \v. Без переназначений, описанных выше, ввод / и нажатие стрелки вверх вызовут этот шаблон поиска. С помощью переназначений, однако, после ввода / необходимо удалить автоматически вставленный \v перед нажатием стрелки вверх, чтобы вызвать этот шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...