如何在了解包的情况下让 Lisp 函数调用 java?

2024-01-07

在Emacs中使用Lisp函数来运行当前文件对应的Java程序。

(defun java-run-current-file ()
  "Runs the java program the current file correspond to"
  (interactive)
  (shell-command
   (concat "java "
       (file-name-sans-extension
        (file-name-nondirectory (buffer-file-name))))))

它的工作原理是剥离当前文件名的路径和扩展名,并将其用作参数java它从文件所在的路径运行。这种方法的问题是,如果当前文件是包的一部分,那么

  1. 论据java必须以包名称和点作为前缀,并且
  2. java必须从包含该包的目录运行。

例如,如果文件是 file.java 并且包名称是 pkgjava被称为java pkg.file从包含目录 pkg 的目录(放置 file.java 的目录的父目录)。

如何修改函数以了解包并构造参数java因此?我想可以通过在当前文件中搜索包声明来解决这个问题,例如

package pkg;

如果它找到一个,它就会使用该包名称来调用java适当地。


尝试使用以下代码在当前文件中搜索包声明:

(save-excursion
  (goto-char (point-min))
  (when (re-search-forward "^\\s *package\\s +\\(.*\\);" (point-max) t)
    (match-string 1)))

这将返回a之间的值package声明和分号。它会返回nil如果没有找到这样的声明。

(请注意,如果有注释掉的内容,这可能会失败package在实际包声明之前的某处声明,采用 C 风格的多行注释(/* ... */).)

要更改运行 shell 命令的目录,请使用cd功能。由于在 Java 中包结构应该反映目录结构,因此您可以使用上述代码确定的包信息来找出源代码的基本目录:

(let ((directory (file-name-directory (buffer-file-name)))
      (sub-dirs (reverse (split-string package "\\."))))
  (while sub-dirs
    (if (string-match (concat "^\\(.*/\\)" (regexp-quote (car sub-dirs)) "/$") directory)
        (setq directory (match-string 1 directory)
              sub-dirs (cdr sub-dirs))
      (error "Package does not match directory structure")))
  (cd directory))

您可以使用此代码来扩展您的功能,如下所示:

(defun java-run-current-file ()
  "Runs the java program the current file corresponds to"
  (interactive)
  (let* ((package (save-excursion
                    (goto-char (point-min))
                    (when (re-search-forward "^\\s *package\\s +\\(.*\\);" (point-max) t)
                      (match-string 1))))
         (directory (file-name-directory (buffer-file-name)))
         sub-dirs)

    (if directory
        (setq directory (file-truename directory))
      (error "Current buffer is not visiting a file"))

    (when package
      (setq sub-dirs (reverse (split-string package "\\.")))

      (while sub-dirs
        (if (string-match (concat "^\\(.*/\\)" (regexp-quote (car sub-dirs)) "/$") directory)
            (setq directory (match-string 1 directory)
                  sub-dirs (cdr sub-dirs))
          (error "Package does not match directory structure"))))

    (cd directory)
    (shell-command
     (concat "java "
             (if package (concat package ".") "")
             (file-name-sans-extension
              (file-name-nondirectory (buffer-file-name)))))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在了解包的情况下让 Lisp 函数调用 java? 的相关文章

随机推荐