Почему режим 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"))