Как мне записать вывод команды vim в регистр без перевода строки? - PullRequest
6 голосов
/ 10 декабря 2011

Это связано с этим вопросом: Как перенаправить вывод команды ex в текущий буфер или файл?

Однако проблема с использованием :redir заключается в том, что он вызывает 3 или 4 дополнительных перевода строки перед выходом, и их трудно удалить с помощью функции замены.

Например, если я сделаю следующее:

:redir @a  
:pwd  
:redir END 

Содержимое @a состоит из трех пустых строк и затем нормального ожидаемого результата.

Я пытался опубликовать процесс с чем-то вроде этого:

:let @b = substitute(@a, '\s*\(.\{-}\)\s*', '\1', '')

Но в результате @b имеет то же содержимое, что и @a.

Кто-нибудь знает более эффективный (т. Е. Работающий) способ постобработки или замену :redir, у которого нет этих лишних строк?

1 Ответ

4 голосов
/ 10 декабря 2011

Значение в регистре b не отличается от значения в регистре a , поскольку ваше регулярное выражение не соответствует.

  1. Вам нужно написать группирующие скобки и открывающую фигурную скобку с обратными слешами.
    См :help /magic; фактически опция magic всегда включена для substitute() регулярных выражений.
  2. \s соответствует только SP и TAB (не LF); но \_s включает LF (альтернативно, вы можете использовать \n, чтобы просто соответствовать LF).
  3. Вам нужно привязать конец выражения, чтобы \{-} не «сдавался», не сопоставляя ничего (все, кроме начальных символов новой строки, не соответствует и, следовательно, не заменяется входной строкой).

Вот модифицированная версия вашей замены:

:let @b = substitute(@a,'\_s*\(.\{-}\)\_s*$','\1','')

Может быть проще подумать об удалении начальных и конечных пробелов вместо сопоставления всего между ними. Это можно сделать за одну подстановку с помощью модификатора замещения g (многократные подстановки) с регулярным выражением, в котором используется оператор чередования , где одна альтернатива привязана к началу строки (%^) а другой привязан к концу строки (%$).

substitute(@a,'\v%^\_s+|\_s+%$','','g')

Это регулярное выражение использует \v, чтобы избежать необходимости добавлять обратную косую черту для %^, +, | и %$.

Измените оба вхождения с \_s на \n, если вы просто хотите обрезать начальные / конечные символы новой строки (вместо SP, TAB или NL).

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