如何模块化处理Java文件的两个Lisp函数的公共功能?

如何模块化处理Java文件的两个Lisp函数的公共功能?,java,emacs,elisp,Java,Emacs,Elisp,我使用一个Lisp函数编译当前Java文件,另一个函数运行它。这两个函数都使用相同的功能来获取包名和相应的编译/运行目录(此功能发布为)。我想将这些函数的通用功能模块化,即从(let*)到(cd),但不包括在内。我如何做到这一点 作为奖励,我想撤销目录的更改(cd:ing),因为这些功能是为了避免意外行为,例如在parten目录中开始查找文件(C-x C-f),它已经完成 (添加钩子'java模式钩子 (lambda() (定义java编译当前文件() “使用javac编译当前文件” (互动)

我使用一个Lisp函数编译当前Java文件,另一个函数运行它。这两个函数都使用相同的功能来获取包名和相应的编译/运行目录(此功能发布为)。我想将这些函数的通用功能模块化,即从
(let*
)到
(cd
),但不包括在内。我如何做到这一点

作为奖励,我想撤销目录的更改(
cd
:ing),因为这些功能是为了避免意外行为,例如在parten目录中开始查找文件(
C-x C-f
),它已经完成

(添加钩子'java模式钩子
(lambda()
(定义java编译当前文件()
“使用javac编译当前文件”
(互动)
(让*)套餐(不包括短途旅行)
(转到字符(最小点))
(当(向前搜索“^\\s*包\\s+\\(.\\);”(最大点)t)
(匹配字符串1)))
(目录(文件名目录(缓冲区文件名)))
子目录(子目录)
(如果是目录
(setq目录(文件truename目录))
(错误“当前缓冲区未访问文件”))
(包装时)
(setq子目录(反向(拆分字符串包“\\”))
(而子目录
(如果(字符串匹配(concat“^\\(.*/\\)”(regexp引号(car子目录))“/$”)目录)
(setq目录(匹配字符串1目录)
子目录(cdr子目录))
(错误“包与目录结构不匹配”))
(光盘目录)
(编译
(concat“javac-Xlint:all”;Tog bort-Werror från
;argumenten.För
格纳利格特!
(如果是包(concat包“/”)
(文件名非目录(缓冲区文件名(()()())))
(本地设置键[(f8)]'java编译当前文件)
;; https://stackoverflow.com/a/12548762/789593
(定义java运行当前文件()
“运行当前文件对应的java程序”
(互动)
(让*)套餐(不包括短途旅行)
(转到字符(最小点))
(当(向前搜索“^\\s*包\\s+\\(.\\);”(最大点)t)
(匹配字符串1)))
(目录(文件名目录(缓冲区文件名)))
子目录(子目录)
(如果是目录
(setq目录(文件truename目录))
(错误“当前缓冲区未访问文件”))
(包装时)
(setq子目录(反向(拆分字符串包“\\”))
(而子目录
(如果(字符串匹配(concat“^\\(.*/\\)”(regexp引号(car子目录))“/$”)目录)
(setq目录(匹配字符串1目录)
子目录(cdr子目录))
(错误“包与目录结构不匹配”))
(光盘目录)
(shell命令
(concat“java”
(如果是包(concat包“.”)
(文件名为sans扩展名)
(文件名非目录(缓冲区文件名(()(())())))
(本地设置键[(f7)]“java运行当前文件”))

这里是一个粗糙的、未经测试的代码重构。它不是特别优雅或惯用,但至少应该足以让您开始

;;1.将“java get package”重构为自己的“defun”
将“java包目录”重构为自己的“defun”
;3.在“java模式钩子”之外出现了“defun”
使用(let((默认目录…)代替(cd…)
;5.将击键分配到“我的java模式挂钩”
(defun java get包()
“在点之前获取包定义”
(互动)
(省去远足
(保存匹配数据;;添加;您也需要此
(转到字符(最小点))
(当(向前重新搜索“^\\s*包\\s+\\(.\\);”
(最大点)t)
(匹配字符串1)
(定义java包目录(包)
“获取当前缓冲区中包的包目录”
(let((目录(文件名目录(缓冲区文件名)))
子目录(子目录)
(如果是目录
(setq目录(文件truename目录))
(错误“当前缓冲区未访问文件”))
(保存匹配数据
(setq子目录(反向(拆分字符串包“\\”))
(而子目录
(如果(字符串匹配(concat“^\\(.*/\\))
(regexp报价(汽车子目录))“/$”)
目录)
(setq目录(匹配字符串1目录)
子目录(cdr子目录))
(错误“包与目录结构不匹配”))
目录)
(定义java编译当前文件()
“使用javac编译当前文件”
(互动)
(let*((包(java get包))
(默认目录(java包目录包)))
(编译
(concat“javac-Xlint:all”;删除了过于嘈杂的内容-Werror
(如果是包(concat包“/”)
(文件名非目录(缓冲区文件名)))
(定义java运行当前文件()
“运行当前文件对应的java程序”
(互动)
(let*((包(java get包))
(默认目录(java包目录包)))
(shell命令
(concat“java”
(如果是包(concat包“.”)
(文件名为sans扩展名)
(文件名非目录(缓冲区文件名)))
(defun my java mode hook()“进入java模式时要运行的东西”
(本地设置键[(f7)]'java运行当前文件)
(本地设置键[(f8)]“java编译当前文件”)
(添加hook'java mode hook#'my-java-mode-hook)
新函数可能应该接受一个缓冲区参数,这样您就可以在不同的缓冲区上调用它们,而不是在您所在的缓冲区上调用它们,以实现通用性并遵守常见的Emacs约定。不过,希望这足以让您开始使用。

这里是一个示例