任意の Lisp 式を評価し、その値を現在のバッファー (非値に設定している限り、ミニバッファーを含む) のポイントに挿入するためにC-u M-:
(をユニバーサル プレフィックス引数と共に) を使用できます。eval-expression
enable-recursive-minibuffers
nil
あなたの例では: C-u M-: buffer-file-name RET
.
式の結果は Lisp 形式で出力されることに注意してください。つまり、その後の の呼び出しがLisp 値read
を構築するような方法で引用されます。equal
文字列の場合、これは二重引用符で囲むことを意味します。これは、下位シェルによって期待どおりに解釈される可能性があります。ただし、Elisp とシェルによる異なるエスケープが必要な特殊文字を含む文字列で問題が発生する場合があります。
より正しい方法はshell-quote-argument
、phils のソリューションのように を使用します。以下は、Lisp 式を読み取り、その値を適切に引用されたシェル ワードとしてポイントに挿入する簡単な defun です。
(defun eval-to-shell-argument (form)
(interactive "XEval: ")
(insert (shell-quote-argument form)))
"X"
の引数としてを使用すると、読み取りと評価のステップが自動的に行われinteractive
ます。
追加するために編集: @tenpn が指摘するように、上記の解決策は、ポップアップのようなミニバッファーのようなバッファーローカル変数の挿入には機能しません (より正確には、ミニバッファーのバッファーローカル値を挿入しますbuffer-file-name
。M-!
便利である)。これは動作するように見える改訂版です。ミニバッファーがアクティブな場合、式の読み取りと評価中に、以前に選択されたウィンドウのバッファーが一時的にアクティブになります。
最終編集: @Stefan の回答から(minibuffer-selected-window)
、以前に選択したウィンドウを見つけるために使用する必要があったことがわかります。(format "%s" ..)
また、文字列内の特殊文字を引用しながら、文字列以外の値を挿入できるように を追加しました。最終版は次のとおりです。
(defun eval-to-shell-argument ()
(interactive)
(let* ((buffer
(if (minibufferp)
(window-buffer (minibuffer-selected-window))
(current-buffer)))
(result
(with-current-buffer buffer
(eval-minibuffer "Eval: "))))
(insert (shell-quote-argument (format "%s" result)))))