我正打算编写一些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-path
和java-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)
)
我仍在努力使其正常运行。这是两个问题:
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
中的表达式。有没有解决的办法? gud
或jdb
的函数。相当于gud
函数的compilation-start
是什么?答案 0 :(得分: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))
在gud中运行jdb的函数是jdb
:
(jdb command)