我希望此函数编译当前缓冲区(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命令成功,没有输出)”而没有显示输出。
非常感谢答案或指示。
答案 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 variable,mode 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"))))