Я хотел бы редактировать содержимое в vim, которое было динамически сгенерировано из командной строки, но при этом еще не было файла.
В примере:
$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin
но это с ошибками:
Vim: Предупреждение: вход не от терминала
Vim: Ошибка чтения ввода, выход ...
Можно ли этого добиться?
command-line
invocation
unix
kenorb
источник
источник
:help stdin
... Удивительно, как быстро можно найти ответы, задавая вопрос о встроенной документации.Ответы:
Вы должны использовать
-
вместо имени файла в командной строке:Приведенная выше команда откроет безымянный буфер, заполненный текстом, считанным из стандартного ввода.
источник
-
for stdin довольно стандартно для инструментов командной строки;Это всего лишь забавная заметка о
bash
иreadline
, но если вы установитеEDITOR
переменную окружения наvim
, нажатие Ctrl+ x+ eоткроет текущую строку вvim
. Кроме того, если вы введете Meta(Alt/Opt/Esc)+ Ctrl+ e, bash выполнит расширение на месте в текущей командной строке, то есть:с Meta(Alt/Opt/Esc)+ Ctrl+ eстанет
с Ctrl+ x+ eстанет
Обратите внимание, что после выхода из vim содержимое буфера vim выполняется в командной строке.
Эти функции становятся очень полезными для меня, когда я хочу выполнять многострочные команды в bash, например, для циклов или программ, требующих операторов здесь, и предоставляет интересный способ сохранить немного истории командной строки в файл для дальнейшего использования.
Чтобы ответить на исходный вопрос, вы также можете написать:
а затем нажмите Ctrl+ x+ , eчтобы загрузить его в
vim
. Также вы могли бы иметь,и выполните Meta(Alt/Opt/Esc)+ Ctrl+, eзатем Ctrl+ x+ e, что поместит все файлы хостов в одну строку и загрузит их
vim
(вероятно, это не лучшее использование этих функций - однако полезность этих методов может быть экстраполирована из нескольких рассмотренных примеров). Вот).Обратите внимание, что я предполагаю, что у вас
readline
установленemacs
режим. Если у васreadline
установленvim
режим, вы можете легко обнаружить соответствующие привязки с помощью команды:и поиск
edit-and-execute-command
илиshell-expand-line
, которые были соответственно связаны с привязками Ctrl+ x+ eи Meta(Alt/Opt/Esc)+ Ctrl+ e.источник
set -o vi
чтобы включить его. Затем вы можете просто использоватьv
отображение в обычном режиме для редактирования текущей команды в вашем редакторе.shell-expand-line
удалить символы новой строки из расширенного текста и 2.edit-and-execute-command
попытаться выполнить команду, записанную в буфере независимо от того, сохранен он или нет, когда вы выйдете из vi.В bash я нашел полезным использовать подстановку процессов с использованием
<(command)
синтаксиса, например:Смотрите также:
источник
bash
иzsh
(и неsh
,ksh
,dash
,fish
,csh
,tcsh
и т.д.)/proc/PID/fd/FD
. Если вы напишите буфер и выйдете, Vim не будет жаловаться, но файл, в который вы записали, будет удален ОС. Использование в-
качестве имени файла открытого буфера не имеет связанного с ним файла, поэтому, если вы попытаетесь выйти без (если вы не используете команду bang или что-то подобное) сохранения Vim предупредит вас.vimdiff <(echo foo) <(echo bar)
.:next
и:prev
перечитывание потока и ничего не получает. Стоит также упомянуть, что процессы не параллельны друг другу - например,cat <(sleep 3; echo a) <(echo b)
печатаются по порядку - и покаcat
чередует записи и чтения,vim
ждет, пока файл «закончит чтение», прежде чем отобразить все, кроме внешнего кадра.Если использование конвейера для нового Vim не является обязательным, вы можете использовать способность Vim извлекать вывод команд в текущий буфер в сочетании с наличием буфера, не являющегося файлом, с резервной копией (как, например, с
:new
редактированием несуществующего файла или его редактированием).:read!cat /etc/hosts
в командном режиме поместит вывод в ваш текущий буфер ниже текущей позиции курсора.Помимо необходимости удалять пустую первую строку, которая остается, когда это делается в пустом буфере, это работает хорошо и особенно удобно, если Vim уже запущен.
источник