最後のEmacsメッセージを現在のバッファにコピーします。

最後のEmacsメッセージを現在のバッファにコピーします。

エコー領域(存在する場合)のメッセージを作業バッファにすばやくコピーするために使用できる機能はありますか?define-keyまたは、global-set-key他の方法を使用してこの関数のショートカットを定義する必要がありますか?

答え1

機能current-message現在表示されているメッセージを返します。エコゾーンもしそうなら。を使って挿入できます(insert (current-message))。しかし、他のものがエコー領域を占めるようにするすべての要素はcurrent-messagereturnを引き起こしますnil

*Messages*Emacsのメッセージはバッファに保存されます。そこから最後の行を取得する方が便利です。複数行のメッセージがある可能性があるため、これは完全に信頼できませんが、まれです。このmessage機能は、1行に収まる短いメッセージでうまく機能します。

次の関数は最後のメッセージ(より正確にはバッファの最後の行)を挿入します*Messages*。プレフィックスパラメータを使用すると、前のメッセージ(1は最新のメッセージ、2は最後から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)

ファイル名を挿入するために2つのカスタムコマンドを呼び出すよりも簡単な方法があります。Emacs Wiki

Compute Lispを使用してスニペットの出力を挿入するには、C-x C-eプレフィックス引数を渡しますC-u C-x C-e

関連情報