Я пытаюсь написать некоторую функцию Emacs Lisp, чтобы иметь возможность просто компилировать и отлаживать классы Java в Spacemacs, используя его слой Java (не хочу вдаваться в сложные пакеты, такие как jdee
). Функция компиляции определена ниже и работает как положено
(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-path
и java-class-path
- это локальные переменные, установленные в .dir-locals.el
в корневом каталоге проекта.
Функция отладки определяется как:
;; 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)
)
Я все еще пытаюсь заставить это работать. Вот две проблемы:
- при запуске функции
shell-command-to-string
команда gsed -n
's/^package\s\+\([^;\s]\+\);\s*$/\1/p' java_file
возвращает пустой
строка ""
, в то время как она возвращает полное имя пакета как
ожидается при работе в терминале. Если я изменю его на gsed -n '/^package/p'
, функция emacs вернет строку пакета ОК. Так
кажется, shell-command-to-string
не может справиться с обычным
выражение в gsed
. Любая работа вокруг?
- Я не смог найти функцию для запуска
gud
или jdb
. Какой будет gud
эквивалент compilation-start
функции?