Emacs: 运行 shell command with regex and Lisp function to start gud

Emacs: run shell command with regex and Lisp function to start gud

我正在尝试编写一些 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*$//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*$//p' java_file 命令 return 为空 字符串 "",而它 return 是完全限定的包名称 在终端中 运行 时预期。如果我将其更改为 gsed -n '/^package/p',则 emacs 函数 return 包行 OK。所以 似乎 shell-command-to-string 无法处理常规 gsed 中的表达式。有什么解决方法吗?
  2. 我找不到触发 gudjdb 的函数。 gud 等同于 compilation-start 函数的是什么?
  1. 问题是您希望在正则表达式中包含反斜杠,但反斜杠已在 Emacs Lisp 字符串中用作转义字符。让我们尝试在回显区显示字符串:

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

    这显示:

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

    正如您所见,Emacs Lisp 解析器 "eaten" 反斜杠。我们需要将反斜杠加倍,以便它们在我们发送到 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)