Вывод оболочки оболочки emacs в новый буфер

Например, я хочу написать что-то вроде:

$ git diff | tempbuffer

и открыть diff в новом несохраненном буфере.

Ответ 1

Вы можете просто использовать M-! - он запустит команду в том же cwd, что и ваш буфер оболочки, и выведет результаты в буфер *Shell Command Output*.

Обратите внимание, что если результаты являются краткими, этот буфер не будет поднят, и результат будет скопирован в область эха; однако буфер все еще используется и доступен. C-h f shell-command RET содержит сведения о том, что представляет собой "короткий" вывод:

Если выход достаточно короткий, чтобы отображать в области эхо-сигнала (определяется переменной max-mini-window-height, если resize-mini-windows не равен нулю), там показано. В противном случае отображается буфер, содержащий вывод.

Ответ 2

Если вы используете eshell, вы можете перенаправить вывод в буфер, например.

 print foo > #<buffer bar>

который создает новый буфер bar с содержимым 'foo'. Для получения дополнительной информации см. Emacswiki на http://www.emacswiki.org/emacs/EshellRedirection.

Ответ 3

К сожалению, emacsclient не читает свой стандартный ввод, поэтому вам нужна какая-то оболочка. Здесь используется функция оболочки Bash, которая работает для меня:

tempbuffer() {
  perl -MFile::Temp -MFile::Copy -e \
  'copy *STDIN, $file = File::Temp->new; system "emacsclient", $file';
}

Ответ 4

Я сделал пакет (e-sink), используя информацию из emacs wiki в качестве отправной точки. Он работает, как вы описали, и "хвост" - это выход, а не ожидание, пока процесс не завершит отображение всего.

Ответ 5

Мое личное предпочтение - это то, что вы можете ввести в Bash без необходимости управления любыми файлами:

git diff | (f=$(mktemp); cat > $f; emacsclient $f; rm -v $f)

emacsclient ожидает, что вы закончите с буфером до того, как Bash удалит временный файл.

Я бы использовал M-! (phils answer), если я начал команду оболочки с нуля и выше (что похоже на ответ Шона), если я был "посреди чего-то" в оболочке, а затем решил "я хочу передать это Emacs".