将最后一条 Emacs 消息复制到当前缓冲区

Mar*_*tus 6 emacs

是否有一个函数可以用来将回显区域(如果有)中的消息快速复制到我的工作缓冲区中?我应该用define-keyglobal-set-key或其他方式定义该功能的快捷方式吗?

Gil*_*il' 7

该函数current-message返回当前显示在echo area 中的消息(如果有)。你可以插入它(insert (current-message))。但是,任何导致其他东西占据回声区域的东西都会导致current-messagereturn nil

来自 Emacs 的消息存档在*Messages*缓冲区中。从那里获取最后一行会更有用。这并不完全可靠,因为可能有一条多行消息,但这种情况很少见:该message功能用于适合一行的短消息。

以下函数插入最后一条消息(更准确地说,是*Messages*缓冲区的最后一行。使用前缀参数,它返回较旧的消息:1 表示最新消息,2 表示倒数第二条消息,等等。参数 0 插入(current-message)如果有的话。

(defun last-message (&optional num)
  (or num (setq num 1))
  (if (= num 0)
      (current-message)
    (save-excursion
      (set-buffer "*Messages*")
      (save-excursion
    (forward-line (- 1 num))
    (backward-char)
    (let ((end (point)))
      (forward-line 0)
      (buffer-substring-no-properties (point) end))))))
(defun insert-last-message (&optional num)
  (interactive "*p")
  (insert (last-message num)))
Run Code Online (Sandbox Code Playgroud)

以正常方式将其绑定到一个键。例如,如果您希望该命令C-c m始终可用:

(global-set-key "\C-cm" 'insert-last-message)
Run Code Online (Sandbox Code Playgroud)

可能有比调用两个自定义命令来插入文件名更简单的方法,请参阅Emacs wiki

要插入评估 Lisp 片段的输出C-x C-e,请传递前缀参数:C-u C-x C-e