有没有一种方便的通用方法来“抓取”Emacs 中命令的回显结果(M-: 或 M-!)?

有没有一种方便的通用方法来“抓取”Emacs 中命令的回显结果(M-: 或 M-!)?

有时,我想将 Emacs 命令的结果(已在回显区域中回显)插入到另一个缓冲区或另一个正在运行的 X 程序中。所以,我想把它放到杀戮环上。执行此操作的便捷方法是什么?

例如:我可以在 dired 模式下使用 shell 命令运行查询,例如:(!rpm -qf找出哪个包拥有目录列表中的选定文件),然后希望将结果插入到其他位置。

或者,另一个例子:如果我需要当前缓冲区的文件名(如Emacs 中是否有一个用户界面允许人们方便地“获取”缓冲区的文件名?),而且还没有任何预定义的命令,我至少可以这样做M-:(buffer-file-name),然后使用这种通用方法将显示的结果复制到kill-ring,以便稍后粘贴。 (当然,我可以 eval (kill-new (buffer-file-name)),但这里的示例是为了说明哪种通用方法来抓取我正在寻找的回显结果。)

答案1

在orC-u之前键入,将结果插入而不是发送到回显区域。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)))

答案2

消息区域中回显的所有消息都保存在缓冲区中*Messages*,因此只需切换到缓冲区(C-h e, view-echo-area-messages)并选择您想要的内容即可。

如果你想获取不依赖于当前缓冲区的表达式的值,你也可以切换到缓冲区*scratch*。输入您的表达式并按C-j( eval-print-last-sexp)。

答案3

对 geekosaur 的解决方案进行了轻微的改进。即使表达式求值结果不是字符串,此方法也能正确执行。

(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)

相关内容