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

おすすめ記事