Emacs: запустить команду оболочки с регулярным выражением и функцией Lisp для запуска gud - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь написать некоторую функцию 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)
  )  

Я все еще пытаюсь заставить это работать. Вот две проблемы:

  1. при запуске функции 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. Любая работа вокруг?
  2. Я не смог найти функцию для запуска gud или jdb. Какой будет gud эквивалент compilation-start функции?

1 Ответ

0 голосов
/ 14 ноября 2018
  1. Проблема в том, что вы хотите включить в свое регулярное выражение обратные слэши, но они уже используются в качестве escape-символов в строках Emacs Lisp. Давайте попробуем отобразить строку в эхо-области:

    (message "%s" "gsed -n 's/^package\s\+\([^;\s]\+\);\s*$/\1/p' ")
    

    Отображается:

    gsed -n 's/^package +([^; ]+); *$/^A/p' 
    

    Итак, как вы можете видеть, обратные слеши были "съедены" парсером Emacs Lisp. Нам нужно удвоить обратную косую черту, чтобы они буквально появлялись в строке, которую мы отправляем на gsed:

    "gsed -n 's/^package\\s\\+\\([^;\\s]\\+\\);\\s*$/\\1/p' "
    

    Или же реализовать поиск в Emacs Lisp:

    (save-excursion
      (goto-char (point-min))
      (search-forward-regexp "^package[[:blank:]]+\\([^;[:blank:]]+\\);")
      (match-string 1))
    
  2. Функция для запуска jdb внутри gud: jdb:

    (jdb command)
    
...