Есть ли удобный общий способ «захватить» эхо-результат команды в Emacs (из M-: или M-!)?

Иногда я хочу вставить результат команды Emacs (который был эхом в области эха) в другой буфер или другую запущенную X-программу. Поэтому я хотел бы положить его в кольцо убийства. Что было бы удобным способом сделать это?

Например: я могу запустить запрос с помощью команды оболочки в режиме ожидания, например :! rpm -qf (чтобы узнать, какой пакет принадлежит выбранному файлу в списке каталогов), а затем хотите вставить результат в другое место.

Или, еще один пример: если мне нужно имя файла текущего буфера (например, есть ли в Emacs пользовательский интерфейс, позволяющий удобно «захватить» имя файла буфера? ), И для этого еще не было предопределенной команды, я мог бы по крайней мере, сделать M-: (buffer-file-name) а затем использовать этот способ общего назначения для копирования показанного результата в kill-ring, чтобы вставить его позже. (Конечно, я мог бы eval (kill-new (buffer-file-name)) , но этот пример здесь, чтобы проиллюстрировать, какой способ общего назначения сделать захват эхо-результата, который я ищу.)

3 Solutions collect form web for “Есть ли удобный общий способ «захватить» эхо-результат команды в Emacs (из M-: или M-!)?”

Тип Cu перед M-: или M-! чтобы получить результат, вставленный вместо отправки в область эха.

Чтобы получить вещи прямо в кольцо убийства, вам нужно баловаться в Elisp. Что-то вроде этого (непроверено):

 ;;; kill ring version of M-! (defun shell-command-to-kill-ring (command) (interactive (list (read-shell-command "Shell command: " nil nil (let ((filename (cond (buffer-file-name) ((eq major-mode 'dired-mode) (dired-get-filename nil t))))) (and filename (file-relative-name filename)))) current-prefix-arg shell-command-default-error-buffer)) (kill-new (shell-command-to-string command))) ;;; kill-ring version of M-: (defun eval-expression-to-kill-ring () (interactive) (call-interactively 'eval-expression) (kill-new (car values))) 

Все сообщения, эхом в области сообщений, сохраняются в буфере *Messages* , поэтому просто переключитесь на него ( Ch e , view-echo-area-messages ) и выберите то, что вы хотите.

Если вы хотите получить значение, которое не зависит от текущего буфера, вы также можете переключиться на буфер *scratch* . Введите свое выражение и нажмите Cj ( eval-print-last-sexp ).

Небольшое улучшение по решению гейкозавра. Это делает правильную вещь, даже если выражение оценивается чем-то другим, кроме строки.

 (defun c5-eval-to-kill-ring () (interactive) (kill-new (with-output-to-string (princ (call-interactively 'eval-expression))))) (global-set-key (kbd "C-;") 'c5-eval-to-kill-ring) 
  • Запуск Emacs через значение переменной bash
  • Использование fasd для открытия файла или каталога в emacsclient
  • Как отправить содержимое буфера emacs в gcc без записи на диск?
  • Emacs: запрос-замена, регулярное выражение, повторное использование результата поиска
  • Emacs: разные пользователи, разные темы, один и тот же файл инициализации
  • Функция завершения командной строки Bash для vim и emacs 'scp: //' Удаленные пути к файлам
  • Emacs - нахождение курсора в нескольких окнах
  • Передача escape-последовательностей в оболочки в пределах ansi-term в Emacs
  • Emacs не будет прокручивать колесико мыши на Ubuntu 15.10 с Cinnamon
  • Проблемы с размером шрифта с Emacs в режиме linum
  • Shift-стрелка не работает в emacs в tmux
  • Почему Emacs, работающий в терминале, не выделяет Ctrl +; из ";"?
  • Linux и Unix - лучшая ОС в мире.