将Emacs变量传递给minibuffer shell命令

ten*_*npn 7 emacs emacs23

我可以通过点击快速运行shell命令M-!.我想做的一件事是对当前文件执行shell快速操作.一个例子是通过perforce检查文件:

M-! p4 edit buffer-file-name RET

(是的,有perforce集成,但我对minishell/variable问题而不是特定的工作流更感兴趣)

当然,buffer-file-name在将命令发送到shell之前不会评估变量.

有一个简单的即时方式来做到这一点?或者我是否必须推出自定义elisp功能?

Arn*_*eur 6

当前Emacs似乎有内置的东西来实现所需的结果,在M-!(shell-command)按下之后<down>,您将在提示符下获得您当前正在访问的文件名.现在您可以编辑它以添加要在其上运行的命令.

dired-mode它会给你的文件,你的光标目前.


Ste*_*fan 5

事实上,使用 Cu M-: 几乎是正确的。我不太确定使用shell-quote-argumentineval-to-shell-argument因为它只适用于字符串,因此无法用于eval-to-shell-argument插入数字或符号。你可以尝试这样的事情:

(defun sm-minibuffer-insert-val (exp)
  (interactive
   (list (let ((enable-recursive-minibuffers t))
           (read-from-minibuffer "Insert: "
                                 nil read-expression-map t
                                 'read-expression-history))))
    (let ((val (with-selected-window (minibuffer-selected-window)
                 (eval exp)))
          (standard-output (current-buffer)))
      (prin1 val)))
Run Code Online (Sandbox Code Playgroud)

然后将此函数绑定到您的迷你缓冲区中(define-key minibuffer-local-map [?\M-:] 'sm-minibuffer-insert-val)。当然,如果您想要插入的唯一内容是缓冲区文件名,那么您的操作execute-shell-command-on-buffer会更简单。