Emacs lisp问题

时间:2010-06-24 12:00:15

标签: c emacs elisp

我希望此函数编译当前缓冲区(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)))

但它似乎没有用,如果编译成功,它只是说“(Shell命令成功,没有输出)”而没有显示输出。

非常感谢答案或指示。

4 个答案:

答案 0 :(得分:4)

shell-command的结果是状态。所以不要将它与字符串进行比较,而是将其与0

进行比较
(defun c-shell-compile ()
   (interactive)
   (save-buffer)
   (when (= 0 (shell-command (concat "gcc " (buffer-file-name))))
         (shell-command "./a.out")))

答案 1 :(得分:2)

又一个解决方案:

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

您可以通过在variable中将file variable compile-command设置为directory variablemode hook来获取默认编译命令,或者manually。如果a.out不需要来自stdin的用户输入,那么这很有效。

答案 2 :(得分:0)

此版本使用'编译(如上面的评论中所述,这将允许您跳转到错误消息等。)

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

答案 3 :(得分:0)

与大多数elisp代码一样,您可以使用hooks扩展编译过程:

这是你应该去的方式。迟早你会想要检查编译错误,保存相关缓冲区,......并且不要重新发明轮子:

(add-hook 'compilation-finish-functions 
      (lambda (buffer desc)
        (when (string-equal desc "finished\n")
        (shell-command "./a.out"))))