하나의 Lisp 함수를 사용하여 현재 Java 파일을 컴파일하고 다른 하나는이를 실행합니다. 두 함수 모두 동일한 기능을 사용하여 패키지 이름과 적절한 디렉토리를 컴파일/실행합니다 (이 기능은 an answer to another question으로 게시 됨). 이 기능의 일반적인 기능을 모듈화하고 싶습니다. 예를 들어 (let*
에서 (cd
까지 포함하고 싶습니다. 어떻게해야합니까?Java 파일을 처리하는 두 개의 Lisp 함수의 공통 기능을 모듈화하는 방법은 무엇입니까?
보너스 나는 parten 디렉토리에서 시작하는 파일 (C-x C-f
) 찾기와 같은 예기치 않은 동작을 방지하기 위해 디렉토리 변경 (cd
: ing)을 실행 취소하고 싶습니다. 그것은 suggested that this can be achieved by 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)))
'(defun ...)'을 java-mode-hook에 추가하면,'java-compile-current-file'을 같은 것으로 지정 (다시)한다는 의미입니다. .java 파일을 방문 할 때마다 아마 당신이 원하는 것이 아닙니다. – Thomas
@ 토마스 나는'defun'을하기 위해 ['eval-after-load'] (http://stackoverflow.com/a/2736153/789593)와 함께 가야합니까? –
@wvxvw 괄호 문제를 해결했다고 생각합니다. 후크와 모드 맵에서 머리를 주셔서 감사합니다. '(define-key java-mode-map 'java-run-current-file)'? 'compile'에 관해서는'java-compile-current-file'의 뒷부분을 공부하면 알 수 있듯이 이미 사용하고 있습니다. 마지막으로 Java와 Emacs에서 SCons를 사용하기위한 좋은 참고 자료를 얻었습니까? –