Почему режим emacs comint не обрабатывает строку как оболочку?

Например, у меня есть следующая команда для запуска моего проекта:

java -cp "lib/*:src:resources" clojure.main -m etl-proxy.proxy.core

Поэтому я пытаюсь создать буфер comint с помощью следующей команды:

(progn 
   (kill-all-local-variables)
   (erase-buffer)
   (comint-mode)
   (comint-exec (current-buffer) "etl-proxy" 
                "java" nil '("-cp" "\"lib/*:src:resources\"" "clojure.main" 
                            "-m" "etl-proxy.proxy.core")))

Это приведет к ошибке пути к классу Java. Но когда я меняюсь "lib/*:src:resources" ключ в списке свойств это нормально работает.

Как я могу принудительно обработать строку в режиме коминта без запуска оболочки в нем?

1 ответ

Решение

Я думаю, что вы называете "обработкой строк" ​​- это обработка, выполняемая обычной оболочкой. Лучший инструмент для этого (т. Е. Делать это, следуя всем правилам, таким как то, что должно быть указано, что произойдет, если $(...) появляется внутри "..."как расширить "foo"*"bar"и т.д...) это оболочка.

Если вы знаете, что нужная вам обработка намного проще, чем может сделать оболочка, вы можете попробовать использовать специальный код, чтобы не проходить через оболочку. shell.el делает это в нескольких местах и ​​использует shell--unquote-argument для этого, так что вы можете попробовать использовать эту функцию, как в:

(comint-exec (current-buffer) "etl-proxy" 
             "java" nil (mapcar #'shell--unquote-argument
                                '("-cp" "\"lib/*:src:resources\"" "clojure.main" 
                                  "-m" "etl-proxy.proxy.core"))))

но в вашем случае, вероятно, проще использовать оболочку:

(comint-exec (current-buffer) "etl-proxy" 
             "/bin/sh" nil '("-c" "java -cp \"lib/*:src:resources\" clojure.main -m etl-proxy.proxy.core"))
Другие вопросы по тегам