首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs:使用regex和Lisp函数运行shell命令来启动gud

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

Stack Overflow用户
提问于 2018-11-13 23:24:08
回答 1查看 365关注 0票数 0

我正在尝试编写一些Emacs函数,以便能够简单地使用Spacemacs的Java层编译和调试Java类(不想进入像jdee这样的复杂包)。编译函数被定义为beblow,并按预期工作。

代码语言:javascript
复制
(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中设置的局部变量。

调试函数定义为:

代码语言:javascript
复制
;; 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的函数。gudcompilation-start函数的等价性是什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-14 11:56:09

  1. 问题是您希望在regexp中包含反斜杠,但是反斜杠已经用作Emacs字符串中的转义字符。让我们尝试在回显区域中显示字符串: (消息"%s“"gsed -n‘s/^package\s+(^;\s+);\s*$/\1/p ") 这显示: gsed -n 's/^package +(^;+);*$/^A/p‘ 因此,正如您所看到的,反斜杠被Emacs解析器“吃掉”。我们需要将反斜杠加倍,以便它们在我们发送给gsed的字符串中逐字显示: "gsed -n的/^package\s\+(^;\s\+\);\s*$/\1/p‘“ 或者,在Emacs Lisp中实现搜索: (保存-偏移(goto-char (点-min))(搜索-前进-regexp“^包[:空白:]+\([^;:空白:]+\);”)(匹配字符串1)
  2. 在gud中运行jdb的函数是jdb: (jdb命令)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53290968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档