我正在尝试直接从 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/