怎么在Emacs配置文件中执行Shell命令并获取结果?

因为需要在配置文件中加入 (setq org-ditaa-jar-path "/usr/share/java/ditaa/ditaa-0_10.jar") 其中的 ditaa-0_10.jar 文件名随 ditaa 版本而变化。

希望能够动态获取 ditaa jar 文件的路径,因为 /usr/share/java/ditaa 文件夹下只有 ditaa-*.jar,所以我的想法是在配置文件中执行ls /usr/share/java/ditaa,从而获取当前的文件名。

感谢!

写法一,用Emacs Lisp写:

(setq org-ditaa-jar-path (directory-files "/usr/share/java/ditaa" t "ditaa[[:ascii:]]+\\.jar$"))

写法二,用楼主的思路写:

(setq org-ditaa-jar-path (shell-command-to-string "ls /usr/share/java/ditaa/*.jar"))

这种写法会多一个换行符

2 个赞

十分感谢!!

您好,使用第一种写法后出现错误: (Spacemacs) Error in dotspacemacs/user-config: Wrong type argument: stringp, ("/usr/share/java/ditaa/ditaa-0_10.jar")

类型不符合:directory-files 返回的是 “list”,不是一个 “string”。可以试试

(car (directory-files ...))

去掉最后换行符的几种办法:

(substring "hello\n" 0 -1)
     => "hello"

(replace-regexp-in-string "\n" "" "hello\n")
     => "hello"

;; Emacs 24.4+
(require 'subr-x)
(string-trim "hello\n")
     => "hello"
1 个赞

感谢! 加了 car 就可以了

哈,昨天我也有个同样的需求:

(setq langtool-language-tool-jar
      (car (nreverse (file-expand-wildcards
                      "~/src/LanguageTool-*/languagetool-commandline.jar"))))
     => "~/src/LanguageTool-3.6/languagetool-commandline.jar"

感觉除了用 directory-files 外,file-expand-wildcards 还简单些(通配符 V.S. 正则表达式)。