Передача буфера внешней команде в Vim

94

Я вроде как новичок в Vim. Я хотел бы отправить содержимое текущего буфера на стандартный ввод внешней команды (скажем, на почту). Моя последняя цель - установить ярлык для быстрой отправки электронной почты из текущего буфера Vim. Я предполагаю, что это должно быть тривиально, но я не смог найти способ отправить буфер Vim внешней команде. Заранее спасибо.

ясар
источник
Связанные вопросы по предоставлению выделенного текста STDINдля команд оболочки: конвейер к оболочке и получение вывода в информационной строке и Замена выделенного исходного текста выводом
user1129682

Ответы:

135

Вы можете использовать :w !cmdдля записи текущего буфера в stdin внешней команды. Откуда :help :w_c:

: [диапазон] w [обряд] [++ opt]! {cmd}

Выполните {cmd}со [range]строками как стандартный ввод (обратите внимание на пробел перед '!'). {cmd}выполняется аналогично с ":!{cmd}", любое '!'заменяется предыдущей командой |:!|.

Связанная команда :%!cmdвыполняет то же самое, а затем заменяет текущий буфер выводом команды. Поэтому :%!sortвызовет внешнюю команду сортировки для сортировки текущего буфера на месте.

Джон Кугельман
источник
6
Это полезно для форматирования json, например: :'<,'>!python -mjson.toolили:%!python -mjson.tool
TrinitronX
1
Для форматирования используйте :%!gofmtбез последнего %, так как это приведет к использованию сохраненной версии (которая может отличаться от текущего буфера)
thomasrutter
Есть ли способ заменить текущий буфер на вывод команды только в случае успеха? Если команда возвращает ненулевое значение, не заменять буфер?
thomasrutter
@thomasrutter, если буфер заменен сообщением об ошибке вместо предполагаемого вывода, вы можете просто нажать uдля отмены
törzsmókus
1

Вот пример того, как отправить текущий буфер на внешний стандартный ввод из командной строки:

vim -es +"w >> /dev/stdout" -cq! /etc/hosts

Это полезно для написания сценариев.

Чтобы узнать больше о трюках с командной строкой, проверьте:

Kenorb
источник