2010-06-24 183 views
1

我想这个函数编译当前缓冲区(C文件)的内容,并表示,如果编译成功,的Emacs Lisp问题

(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))) 

输出(a.out的),但它似乎并没有被工作,如果编译成功,它只是说“(Shell命令成功,没有输出)”而不显示输出。

答案或方向非常感谢。

+0

考虑使用'编译它也会创建一个特殊*编译*缓冲区来检查编译器输出/错误。 – 2010-06-24 12:17:03

+0

这就是我最初尝试的,但使用shell命令似乎更灵活的定制。 – jimbo 2010-06-24 12:26:45

+0

您可以使用挂钩定制大多数elisp函数:请参阅下面的代码。 即使挂钩不可用,您也可以使用defadvice。 – 2010-06-24 14:24:44

回答

4

shell命令的结果是状态。所以,不要把它比作一个字符串,但以0

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

谢谢,它工作! ,现在C是像python一样交互(对于小文件atleast);) – jimbo 2010-06-24 12:25:40

+0

顺便说一句,必须添加一个)后(缓冲区文件名) – jimbo 2010-06-24 12:40:40

+0

@jimbo,感谢您的通知,我修复了代码。 – AProgrammer 2010-06-24 12:42:08

0

这个版本使用“编译(如上面这个留言中提到将让你跳到错误的消息等)

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

像大多数elisp代码,您可以使用钩子扩展编译过程:

这是您应该去的方式。迟早你会想看看编译错误,节省相关的缓冲区,...不要wan't推倒重来:

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