2010-07-29 4 views
4

Я пытаюсь запустить команды P4V непосредственно из xemacs. После стягивания в p4.el для Emacs Я написал следующее:Проблема с аргументами процесса оболочки emacs lisp

(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. 

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

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

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

+0

Я не могу воспроизвести то, что вы видите точно, но вы уверены, что вам нужен '(shell-quote-argument ...)' там? Кажется, что 'call-process' передает аргументы непосредственно процессу, без uinsg оболочки. Что произойдет, если вы не попытаетесь процитировать аргумент? –

+0

Спасибо, Майк. Думаю, мне это нужно. Он вставляет кавычки в строку, поэтому вы получаете строку с "\" prevdiff file.txt \ "". Это означает, что строка передается в кавычки при передаче команде оболочки. – sickgemini

ответ

4

call-process определенно не объединяет свои аргументы; он передает их непосредственно программе. Чтобы увидеть это так, тип M-: и вычислите следующее выражение:

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

где «средний» и «ба» файлы в текущем каталоге. Я получаю следующее сообщение вставляется в мой поцарапать буфер:

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

Если вызов-процесс был вновь разобран аргументы, он будет иметь раскол «средний ба» на две отдельные аргументы --- но сообщение об ошибке показывает, что это не так.

Вместо этого проблема заключается в аргументе shell-quote. Когда я оцениваю вызов, который вы упоминаете в поцарапать буфер, я получаю следующее:

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

Другими словами, команда P4V на самом деле получает то, что нужно ввести в оболочке, как:

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

Вот почему P4V жалуется на «prevdiff

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

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

(но, конечно, проверьте мои parens).

+0

Спасибо Джим! Работал. – sickgemini

+0

Это не совсем так: когда вы получаете '' prevdiff \\ file.text'', а затем передаете его в 'call-process', кавычки не отправляются процессу (они являются частью строки elisp синтаксис, а не часть строки).Я думаю, что происходит, что @Jim Blandy и я на unixy-системах, тогда как @Jeremy Simon находится в Windows, где 'shell-quote-argument' будет возвращать' '\ 'prevdiff file.txt \" "'. Это объясняет ошибку 'p4v'. –

+0

Да, Майк, ты прав. Я неправильно понял, что было в буфере * scratch *. Джереми, я рад, что моя ошибка и разница в ОС отменена! –