Проблема с аргументами процесса оболочки emacs lisp - PullRequest
4 голосов
/ 29 июля 2010

Я пытаюсь запускать команды P4V напрямую из xemacs. После добавления 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))

Я пытаюсь получить следующее для команды оболочки (когда cmd равно prevdiff):

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

Однако, когда я выполняю вышеуказанную функцию с prevdiff, я получаю следующую ошибку

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

Таким образом, кажется, что call-процесс разбивает строку в кавычках "prevdiff file.txt" на отдельные аргументы, а P4V обрабатывает только первый.

Похоже, этого не происходит с другими командами, которые я пробовал с call-process, поэтому я не уверен, что это проблема с lisp или что-то связанное с P4V.

Кто-нибудь знает, как решить эту проблему?

1 Ответ

4 голосов
/ 30 июля 2010

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-аргумент.Когда я оцениваю вызов, который вы упоминаете в буфере scratch , я получаю следующее:

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

Другими словами, команда p4v фактически получает то, что вы вводите в оболочкеas:

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

Вот почему p4v жалуется на "prevdiff.

Так что я думаю, что вы хотите вместо этого:

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

(но проверьте мои пареныконечно).

...