1 つの Lisp 関数を使用して現在の Java ファイルをコンパイルし、別の Lisp 関数を使用してそれを実行します。どちらの関数も同じ機能を使用して、パッケージ名とコンパイル/実行する適切なディレクトリを取得します (この機能は別の質問への回答として投稿されました)。これらの関数の共通機能をモジュール化したいと考えて(let*
い(cd
ます。これどうやってするの?
おまけとして、parten ディレクトリから始まるcd
ファイル ( ) を見つけるなどの予期しない動作を回避するために関数が実行されるため、ディレクトリの変更 (:ing)を元に戻したいと思います。C-x C-f
これは、によって達成できることが示唆されunwind-protect
ています。
(add-hook 'java-mode-hook
(lambda ()
(defun java-compile-current-file ()
"Compiles the current file with javac"
(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)
(compile
(concat "javac -Xlint:all " ; Tog bort -Werror från
; argumenten. För
; gnälligt!
(if package (concat package "/") "")
(file-name-nondirectory (buffer-file-name))))))
(local-set-key [(f8)] 'java-compile-current-file)
;; https://stackoverflow.com/a/12548762/789593
(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)))))))
(local-set-key [(f7)] 'java-run-current-file)))