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

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

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

答案1

功能current-message返回当前显示的消息回声区,如果有的话。您可以使用 插入它(insert (current-message))。然而,任何导致其他东西占据回波区域的事情都会导致current-message返回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)))

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

(global-set-key "\C-cm" 'insert-last-message)

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

要插入使用 计算 Lisp 代码片段的输出C-x C-e,请传递前缀参数:C-u C-x C-e

相关内容