Emacs Lisp вопрос - PullRequest
       6

Emacs Lisp вопрос

1 голос
/ 24 июня 2010

Я хочу, чтобы эта функция компилировала содержимое текущего буфера (файл C) и показывала вывод (a.out), если компиляция прошла успешно

(defun c-shell-compile ()
  (interactive)
  (save-buffer)
  (if (equal (shell-command (concat "gcc " (buffer-file-name))) 
             "(Shell command succeeded with no output)")
      (shell-command "./a.out")
    ;;Else show the errors        
    ))

 (add-hook 'c-mode-hook
           (lambda () (local-set-key (kbd "\C-c\C-c") 'c-shell-compile)))

Но, похоже, он не работает, если компиляция завершается успешно, он просто говорит "(команда оболочки завершилась без вывода)", не показывая вывод.

Ответы или указания очень ценятся.

Ответы [ 4 ]

4 голосов
/ 24 июня 2010

Результатом команды shell является статус. Так что не сравнивайте его со строкой, а с 0

(defun c-shell-compile ()
   (interactive)
   (save-buffer)
   (when (= 0 (shell-command (concat "gcc " (buffer-file-name))))
         (shell-command "./a.out")))
2 голосов
/ 24 июня 2010

И еще одно решение:

M-x compile RET gdb <filename> && a.out

Команду компиляции по умолчанию можно получить, задав переменную compile-command либо как файловую переменную , переменная каталога , в режиме ловушка режима или вручную .Это хорошо работает, если a.out не требует ввода пользователя от стандартного ввода.

0 голосов
/ 24 июня 2010

Как и большинство elisp-кода, вы можете расширить процесс компиляции, используя хуки:

Именно так вы и должны идти.Рано или поздно вы захотите проверить ошибки компиляции, сохранить зависимые буферы и ... и не хотите заново изобретать колесо:

(add-hook 'compilation-finish-functions 
      (lambda (buffer desc)
        (when (string-equal desc "finished\n")
        (shell-command "./a.out"))))
0 голосов
/ 24 июня 2010

Эта версия использует 'compile (как упомянуто в комментарии выше, это позволит вам переходить к сообщениям об ошибках и т. Д.)

(defun c-compile ()
  (interactive)
  (compile (concat "gcc " (file-name-nondirectory (buffer-file-name))
                   " && ./a.out")))
...