Vim — шаблон для сопоставления только с первым символом строки литерала

#regex #vim

#регулярное выражение #vim

Вопрос:

Я пытаюсь написать шаблон, который соответствовал бы только первому символу (может быть любым символом, а также пробелом) строки, интерпретируемой буквально.

Итак, учитывая эту функцию, которая использует «very no magic» для буквального сопоставления строки, заданной в качестве аргумента, а затем выделяет эту строку, как я могу изменить ее, чтобы она выделяла только первый символ?

 function! MatchFirst(i)
  highlight Red ctermbg=red ctermfg=0 guibg=#ff0000 guifg=#000000
  call matchadd('Red', 'V' . escape(a:i, ''))
endfunction
 

Так, например, вызов MatchFirst('{^(sed') следующего текста только выделит { , если { за ним следует *(sed , но не в каком-либо другом месте. В настоящее время он выделяет всю заданную строку {^(sed целиком .

Lorem ipsum do{^(lor sit amet, consectetur adipiscing elit, e{^(sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo con{^(sequat. Duis aute irure dolor in rep{^(rehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

ПОСЛЕДУЮЩЕЕ РЕДАКТИРОВАНИЕ

Чтобы дать немного контекста, аргументом для MatchFirst функции является текст, визуально выбранный пользователем, поэтому он может быть буквально любым, это может быть foobar , foozebar , amp;#@!^><..?/\ , 国字字 , и т.д.

Комментарии:

1. Подумайте о размещении вопросов о Vim на Vi и Vim Stack Exchange, там вы можете привлечь к этому больше внимания, чем на SO.

2. @filbranden Я только что понял, что в какой-то момент я действительно опубликовал другой вопрос о Vi и Vim a и фактически получил от вас ответ 🙂 Я разместил это сообщение на SO, наверное, по привычке.

3. Все хорошо… Я склонен упоминать Vi и Vim на случай, если постеры не знают об этом… Большинство из нас также проверяет SO (у меня есть закладка для вопросов с тегом «vim»), но гораздо проще отслеживать только одно место… Ваше здоровье!

Ответ №1:

Самый простой способ выбрать только часть соответствия в шаблоне Vim — это использовать ze для обозначения конца соответствия. :help /ze Подробнее см..

Вы можете использовать ze непосредственно в режиме «very nomagic» V . Вы найдете это в разделе :help /V :

Использование V означает, что после него только обратная косая черта и завершающий символ (обычно / или ? ) имеют особое значение: «очень nomagic»

Поскольку ze уже начинается с обратной косой черты, вам вообще не нужно ее изменять, чтобы она работала V .

В вашем примере {^(sed вы можете использовать V{ze^(sed для сопоставления с первым { , но только тогда, когда он является частью {^(sed .

Собрав все это вместе в своей функции, вы можете использовать:

 call matchadd('Red',
     'V' .  escape(strcharpart(a:i, 0, 1), '') .
     'ze' . escape(strcharpart(a:i, 1), ''))
 

ПРИМЕЧАНИЕ: у вас может быть угловой регистр, где a:i находится пустая строка, возможно, вы захотите сделать что-то другое в этом случае.

Комментарии:

1. Спасибо, я вижу случай, когда это не работает, например, если задействованы двойные обратные косые черты. Например: lorem foo\bar ipsum , тогда MatchFirst("foo\bar") не будет совпадать. Чтобы дать вам немного контекста, это для небольшого плагина, который я пишу, и аргументом является визуально выделенный текст, поэтому он может быть буквально любым.

2. @skamsie Проблема на самом деле в вашем вызове , вы используете строку в двойных кавычках, поэтому "foo\bar" на самом деле имеет только одну обратную косую черту (попробуйте с :echo помощью, чтобы увидеть ее.) Вызов MatchFirst('foo\bar') работает, как ожидалось.

3. Спасибо, теперь это работает :). Я не знал, что есть разница между двойными и одинарными кавычками, но я «погуглил» и теперь понимаю. Я принял ваш ответ, однако я был бы признателен, если бы вы могли объяснить в своем ответе, почему ze все еще работает в этом случае. Я подумал, что использование «very no magic» заставляет все интерпретировать как обычную строку.

4. Смотрите :help expr-string для строк в двойных кавычках и :help literal-string для строк в одинарных кавычках. Также: learnvimscriptthehardway.stevelosh.com/chapters/26.html

5. Да, точно! Я протестировал его с этой последовательностью, и мне показалось, что он работает правильно.