Emacs:使用regex和Lisp函数运行shell命令以启动gud

时间:2018-11-13 23:24:08

标签: emacs spacemacs

我正打算编写一些Emacs Lisp函数,以便能够使用其Java层在Spacemacs中简单地编译和调试Java类(不想进入jdee这样的复杂程序包中)。编译功能定义如下并按预期工作

(defun my-java-compile (command)
  (interactive (list (read-string
                      "Command: "
                      (concat
                           "javac"
                       " -d "
                       java-dest-path
                       " -cp "
                       java-class-path
                       " "
                       (file-name-nondirectory buffer-file-name)))))
  (unless (file-exists-p java-dest-path)
    (make-directory java-dest-path))
  (compilation-start command nil)
  )

java-dest-pathjava-class-path是在项目根目录的.dir-locals.el中设置的局部变量。

调试功能定义为:

;; get fully qualified class name
(defun get-fqcn ()
  (setq get-package-name-command
        (concat
         "gsed -n 's/^package\s\+\([^;\s]\+\);\s*$/\1/p' "
         buffer-file-name))
  (setq fqpn (shell-command-to-string get-package-name-command))
  (if (equal "" fqpn) (file-name-base buffer-file-name)
    (concat fqpn "." (file-name-base buffer-file-name)))
  )

(defun my-jdb (command)
  (interactive (list (read-string
            "Command: "
            (concat
              "jdb"
              " -classpath "
              java-class-path
              " "
              (get-fqcn)))))
  (helm-M-x nil jdb command)
  )  

我仍在努力使其正常运行。这是两个问题:

  1. 运行shell-command-to-string函数时,gsed -n 's/^package\s\+\([^;\s]\+\);\s*$/\1/p' java_file命令返回一个空 字符串"",同时返回标准软件包名称为 在终端中运行时预期。如果将其更改为gsed -n '/^package/p',则emacs函数将返回打包行OK。所以 似乎shell-command-to-string无法处理常规 gsed中的表达式。有没有解决的办法?
  2. 我找不到触发gudjdb的函数。相当于gud函数的compilation-start是什么?

1 个答案:

答案 0 :(得分:1)

  1. 问题是您想在正则表达式中包含反斜杠,但是反斜杠已经用作Emacs Lisp字符串中的转义字符。让我们尝试在回显区域显示字符串:

    (message "%s" "gsed -n 's/^package\s\+\([^;\s]\+\);\s*$/\1/p' ")
    

    这将显示:

    gsed -n 's/^package +([^; ]+); *$/^A/p' 
    

    如您所见,反斜杠被Emacs Lisp解析器“吃掉”。我们需要将反斜杠加倍,以使它们真实显示在我们发送给gsed的字符串中:

    "gsed -n 's/^package\\s\\+\\([^;\\s]\\+\\);\\s*$/\\1/p' "
    

    或者,在Emacs Lisp中实现搜索:

    (save-excursion
      (goto-char (point-min))
      (search-forward-regexp "^package[[:blank:]]+\\([^;[:blank:]]+\\);")
      (match-string 1))
    
  2. 在gud中运行jdb的函数是jdb

    (jdb command)