Например, я хочу написать что-то вроде:
$ git diff | tempbuffer
и открыть diff в новом несохраненном буфере.
Например, я хочу написать что-то вроде:
$ git diff | tempbuffer
и открыть diff в новом несохраненном буфере.
Вы можете просто использовать M-! - он запустит команду в том же cwd, что и ваш буфер оболочки, и выведет результаты в буфер *Shell Command Output*
.
Обратите внимание, что если результаты являются краткими, этот буфер не будет поднят, и результат будет скопирован в область эха; однако буфер все еще используется и доступен. C-h f shell-command
RET содержит сведения о том, что представляет собой "короткий" вывод:
Если выход достаточно короткий, чтобы отображать в области эхо-сигнала (определяется переменной
max-mini-window-height
, еслиresize-mini-windows
не равен нулю), там показано. В противном случае отображается буфер, содержащий вывод.
Если вы используете eshell
, вы можете перенаправить вывод в буфер, например.
print foo > #<buffer bar>
который создает новый буфер bar
с содержимым 'foo'. Для получения дополнительной информации см. Emacswiki на http://www.emacswiki.org/emacs/EshellRedirection.
К сожалению, emacsclient
не читает свой стандартный ввод, поэтому вам нужна какая-то оболочка. Здесь используется функция оболочки Bash, которая работает для меня:
tempbuffer() {
perl -MFile::Temp -MFile::Copy -e \
'copy *STDIN, $file = File::Temp->new; system "emacsclient", $file';
}
Я сделал пакет (e-sink), используя информацию из emacs wiki в качестве отправной точки. Он работает, как вы описали, и "хвост" - это выход, а не ожидание, пока процесс не завершит отображение всего.
Мое личное предпочтение - это то, что вы можете ввести в Bash без необходимости управления любыми файлами:
git diff | (f=$(mktemp); cat > $f; emacsclient $f; rm -v $f)
emacsclient ожидает, что вы закончите с буфером до того, как Bash удалит временный файл.
Я бы использовал M-! (phils answer), если я начал команду оболочки с нуля и выше (что похоже на ответ Шона), если я был "посреди чего-то" в оболочке, а затем решил "я хочу передать это Emacs".