В Vim как искать границу WORD? - PullRequest
0 голосов
/ 04 апреля 2019

Мне нравится, как Vim различает слова и СЛОВА , но это различие отсутствует в синтаксисе регулярного выражения.Я могу использовать атомы \< и \> для поиска границы слова (с нулевой шириной).Но что, если я хочу найти границу СЛОВА?Похоже, что для СЛОВА должен быть обычный атом , но его нет.

Вот лучшее, что я мог бы представить как эквивалент \<, но вместо СЛОВА вместослова:

\(\(\s\)\@<=\|^\)

Соответствует или символу пробела с нулевой шириной, или начало строки.Кажется, он делает то, что я хочу, но это своего рода чудовище для чего-то, что я хотел бы часто использовать.

У меня также есть немного более простая, но и менее общая версия, которая использует\zs вместо просмотра нулевой ширины.Этот работает только тогда, когда это начало вашего матча (то есть вы не можете использовать его в середине того, что вы хотите сопоставить):

\(^\|\s\)\zs

Есть ли способ определить мой собственный атомза это?Или как-то сделать его более удобным в использовании?У кого-нибудь есть другие, лучшие идиомы, которые они используют для этого случая?

1 Ответ

1 голос
/ 04 апреля 2019

Ну, во-первых, в зависимости от того, что вы хотите, может быть более простой подход.\<\> зависит от настройки iskeyword, поэтому, если вы хотите изменить их, чтобы они всегда работали на СЛОВАХ, вы можете просто изменить эту настройку.Но если вы хотите использовать оба, это не сработает.

Вот самое короткое, что я могу придумать:

" \< for WORD
\S\@<!

" \> for WORD
\S\@!

Объяснение:

  • \S\@<!

    \S означает «непробельный символ», а \@<! означает «Соответствует нулевой ширине, если предыдущий атом НЕ совпадает непосредственно перед тем, что следует».

  • \S\@!

    \S\@! НЕ сопровождается непробельным символом.

Использование этих lookaheads / lookbehinds более элегантнопотому что вам не нужно указывать начало / конец строки.

Есть ли способ определить мой собственный атом для этого?

К сожалению, не такЯ знаю.Вероятно, ваша лучшая ставка будет выглядеть примерно так:

cnoreabbrev <something> \S\@<!
cnoreabbrev <something> \S\@!

Стоит отметить, что они будут соответствовать пустым строкам, тогда как \<\> - нет.Это то, что вы обменяете на короткое регулярное выражение.

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