Получить ввод из редактора (vim/nano/emacs/textmate?)

Получить ввод из редактора (vim/nano/emacs/textmate?)

Мне просто интересно, есть ли способ получить ввод не из, StdInа из $EDITOR- будь то vim, nano, emacs или даже редактор, не являющийся командной строкой (MacVim/TextMate). Каковы варианты/обходные пути/лучшие практики?

По сути, я бы хотел иметь такой же рабочий процесс heredoc, но из $editor.

$ sort -nr << FOO | uniq -c 
pipe heredoc> foo 
pipe heredoc> bar
pipe heredoc> baz
pipe heredoc> foo
pipe heredoc> FOO
   2 foo
   1 baz
   1 bar

решение1

Команда vipeв пакетеmoreutilsпозволяет вам запускать $EDITOR в середине конвейера.
Вы можете получить желаемое поведение следующим образом:

$ </dev/null vipe |sort -nr | uniq -c 

решение2

Думаю, единственный шанс заставить его работать с любым редактором — это использовать временные файлы:

FILE=$(mktemp); $EDITOR "$FILE"; <"$FILE" …command… ; rm "$FILE"

(Однако это не позволяет запустить команду до тех пор, пока не будет предоставлен полный ввод.)

Также вы можете использовать echo "# please insert your input bellow" >"$FILE"перед вызовом to $EDITORдля вставки комментария, который будет отображаться внутри редактора. Убедитесь, что он не повлияет на поведение команды (или попросите пользователя явно удалить его).

решение3

Emacs имеет возможность запустить оболочку в одном из своих буферов (используйте оболочку MX). Но запущенные процессы все равно будут получать входные данные из stdin, их stdin будет просто псевдотерминалом, другим концом которого будет emacs.

решение4

В Emacs вы можете выполнить любую команду и предоставить содержимое одного из буферов Emacs (точнее, выбранной области) в качестве стандартного ввода для приложения.

Например, если содержимое вашего буфера Emacs будет lsи вы пометите его как область (используя C-SPC), затем запустите shell-command-on-region( M-|) и введите команду bash(полная комбинация: M-| command RET), она будет lsвыполнена bash, а вывод будет открыт как новый буфер.

Если вы используете C-u M-| command RETon region, вывод заменит отмеченную команду в вашем текущем буфере.

Связанный контент