Что вызывает асимметрию в количестве символов `\`, необходимых для vim exec? - PullRequest
0 голосов
/ 28 октября 2018

Рассмотрим следующий файл, бесстыдно похищенный из Изучите Vimscript на нелегком пути .

Topic One
=========

This is some text about topic one.

It has multiple paragraphs.

Topic Three
--------

Hello World
Topic Two
=========

This is some text about topic two.  It has only one paragraph.

Предположим, я пытаюсь найти текст над обоими типами заголовков, и я пишуследующее выражение.

:onoremap <buffer> ih :<c-u>execute "normal! ?^\\(==\\+\\|--\\+\\)$\r:nohlsearch\rkvg_"<cr>

Это отображение не работает, по-видимому, потому что выражение \\| преобразуется в |.С другой стороны, следующее отображение работает:

:onoremap <buffer> ih :<c-u>execute "normal! ?^\\(==\\+\\\\|--\\+\\)$\r:nohlsearch\rkvg_"<cr>

Это кажется очень противоречивым, поскольку \( может быть представлен с \\( в строке, а \+ может быть представлен с \\+ в строке.

Почему \| требует \\\\| для представления?

Я пытаюсь найти ментальную модель для причины, поэтому яможет рассуждать о будущих случаях, подобных этому.

1 Ответ

0 голосов
/ 29 октября 2018

Обратные слеши в двойных кавычках просто необходимо экранировать один раз , так что "\\(" дает '\".Однако | необходимо экранировать дважды , один раз для двойных кавычек и еще раз, потому что в противном случае он завершит команду :map.По этой причине я настоятельно рекомендую использовать <Bar> вместо \| внутри отображений.Это задокументировано под :help map-bar.

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