Vim: экранирование «черты», объединяющей Ex-команды

Я не понимаю, почему эти команды делают разные вещи.

Вставляется в файл vimrc, активируется нажатием tв обычном режиме:

nnoremap t :call search('\m\(a\|b\)', 'W')<CR>
nnoremap t :call search('\m\(a\\|b\)', 'W')<CR>

Вводится непосредственно в командную строку:

:call search('\m\(a\|b\)', 'W')
:call search('\m\(a\\|b\)', 'W')

Чтобы быть точным: «Предполагаемое» поведение требует \\|в примере nnoremap, но для этого требуется \ |в примере поиска call

Я знаю, что специальная обработка bar ( :help :bar) является одной из тех ловушек, которые расставил Vim. для меня, но это все равно не имеет смысла. В документации четко сказано, что «этот список команд будет видеть bar как часть своего аргумента», но ни одно из этих исключений здесь не применимо. Все команды, участвующие в этом примере, рассматривают bar как символ мета-конкатенации. Также в этой ситуации полоса находится внутри строки, и (я думаю?) разбор ее как части строки имеет приоритет над синтаксисом мета-конкатенации.

5
задан N West 30 April 2012 в 20:39
поделиться