【问题标题】:Why emacs comint mode doesn't process string as shell?为什么 emacs comint 模式不将字符串作为 shell 处理?
【发布时间】:2012-11-29 07:05:34
【问题描述】:

例如,我有以下命令来运行我的项目:

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" 键时,这项工作正常。

如何在不运行 shell 的情况下强制在 comint 模式下处理字符串?

【问题讨论】:

    标签: shell emacs comint-mode


    【解决方案1】:

    我认为你所说的“字符串处理”是由通常的 shell 执行的处理。更好的工具(即遵循所有规则,例如需要引用的内容,如果$(...) 出现在"..." 中会发生什么,如何扩展"foo"*"bar" 等...)是外壳。

    如果您知道您需要的处理比 shell 所能做的要简单得多,您可以尝试使用特殊情况代码来避免通过 shell。 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"))))
    

    但在你的情况下,只使用 shell 可能更简单:

    (comint-exec (current-buffer) "etl-proxy" 
                 "/bin/sh" nil '("-c" "java -cp \"lib/*:src:resources\" clojure.main -m etl-proxy.proxy.core"))
    

    【讨论】:

    • 非常感谢,非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多