Emacsでコマンドのエコー結果(M-:またはM-!)を「キャッチする」便利な一般的な方法はありますか?

Emacsでコマンドのエコー結果(M-:またはM-!)を「キャッチする」便利な一般的な方法はありますか?

時々、私はEmacsコマンドの結果(エコー領域にエコーされた)を他のバッファまたは実行中の他のXプログラムに挿入したいと思います。だからキリングリングに入れたかったです。これを行う便利な方法は何ですか?

たとえば、diredモードでシェルコマンドを使用して、次のクエリを実行できます(!rpm -qfディレクトリリストで選択したファイルを所有するパッケージを見つける)。その後、結果を別の場所に挿入しようとします。

または別の例:現在のバッファのファイル名が必要な場合(例:バッファのファイル名を簡単に「インポート」できるユーザーインターフェイスはEmacsにありますか?)、まだ事前定義されたコマンドはありません。少なくともこれを実行しM-:(buffer-file-name)てから、この一般的な方法を使用して後で貼り付けるために、表示された結果をキリングにコピーできます。 (もちろんevalを行うこともできますが(kill-new (buffer-file-name))、ここの例は私が探している結果を得るための一般的なアプローチを示すことです)。

答え1

C-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-jeval-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)

関連情報