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