emacs - emacs lisp shell 进程参数的问题

标签 emacs lisp perforce elisp

我正在尝试直接从 xemacs 运行 P4V 命令。 将 p4.el 拉入 emacs 后,我编写了以下内容:

(defun p4v-command (cmd)
  (get-buffer-create p4-output-buffer-name);; We do these two lines
  (kill-buffer p4-output-buffer-name)      ;; to ensure no duplicates
  (call-process "p4v" nil (get-buffer-create p4-output-buffer-name) nil
                "-p" (p4-get-p4-port)
                "-u" "UserName"
                "-c" (p4-current-client)
                "-cmd" (shell-quote-argument (concat cmd " " (buffer-name))))
  (display-buffer p4-output-buffer-name))

我正在尝试为 shell 命令获取以下内容(当 cmd 等于 prevdiff 时):

p4v -p port -u user -c client -cmd "prevdiff file.txt"

但是,当我使用 prevdiff 执行上述函数时,出现以下错误

P4V: unrecognized argument '"prevdiff' for '-cmd' option.

因此,调用进程似乎将引用的字符串“prevdiff file.txt”拆分为单独的参数,而 P4V 仅处理第一个参数。

这似乎并没有发生在我用 call-process 尝试过的其他命令上,所以我不确定这是一个 lisp 问题还是与 P4V 有关。

有人知道怎么解决吗?

最佳答案

call-process 绝对不会连接它的参数;它直接将它们传递给程序。要查看情况,请键入 M-: 并计算以下表达式:

(call-process "/bin/ls" nil "*scratch*" nil "avg ba")

其中“avg”和“ba”是当前目录中的文件。我将以下消息插入到我的 scratch 缓冲区中:

/bin/ls: cannot access avg ba: No such file or directory

如果 call-process 重新解析了参数,它会将“avg ba”拆分为两个单独的参数 --- 但错误消息显示它没有。

相反,问题出在 shell-quote-argument 上。当我评估您在 scratch 缓冲区中提到的调用时,我得到以下信息:

(shell-quote-argument "prevdiff file.txt")
"prevdiff\\ file.txt"

换句话说,p4v 实际收到的命令是您在 shell 中输入的内容:

p4v -p port -u user -c client -cmd '"prevdiff file.txt"'

这就是 p4v 提示“prevdiff”的原因。

所以我认为你想要的是:

"-cmd" (concat cmd " " (shell-quote-argument (buffer-name))))

(当然要检查我的 parent )。

关于emacs - emacs lisp shell 进程参数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358987/

相关文章:

emacs - 如何在 elisp 中为交互式缓冲区设置名称

linux - 创建在后台启动的 emacs 别名?

lisp - (a (b . c) d) 在方框符号中的正确表示是什么?

version-control - 将文件复制到新分支并在 P4V 中保留更改列表历史记录

perforce - 在 Perforce 中合并时复制所有更改列表描述?

java - 从标签获取文件 - Perforce Java API

emacs - 突出显示缓冲区修改

Emacs:在 Racket 模式下关闭 pretty-print

variables - Lisp 中的未绑定(bind)变量

字符串列表上的 lisp 成员函数