对于单文件非交互式c ++程序,在同一缓冲区中打印编译输出和程序(运行时)的输出

时间:2013-11-15 14:05:00

标签: emacs

如何编译单个文件c ++程序,将输出打印到编译缓冲区,如果编译成功则运行c ++可执行文件,并将c ++可执行文件的输出附加到编译输出。

以下elisp代码可以使用与缓冲区名称相同的名称编译c ++程序。现在如何运行并将exectutable的输出附加到 compile 缓冲区

(defun cpp-single-file-compile ()
  (interactive)
  (save-buffer)
  (compile
   (concat "g++ -g " (buffer-file-name) " -o " (file-name-sans-extension (buffer-file-name)))))

(add-hook 'c++-mode-hook (lambda () (local-set-key "\C-c\C-c" 'cpp-single-file-compile)))

2 个答案:

答案 0 :(得分:0)

此外,对于您的代码,我在hack-local-variables命令中有一个C-c C-c

(defun compileCompileCommand ()
  "Compile current file."
  (interactive)
  (hack-local-variables)
  (unless file-local-variables-alist
    (setq compile-command (concat "g++ -g " (buffer-file-name) " -o " (file-name-sans-extension (buffer-file-name))
        " && " (file-name-sans-extension (buffer-file-name)) ".exe")))
    (compile compile-command))

(add-hook 'c-mode-common-hook '(lambda () 
                 (local-set-key (kbd "C-c C-c") 'compileCompileCommand)))

然后我将局部变量添加到我的源文件中。例如:

#include <iostream>

int main() {
    std::cout << "Test";

    return 0;
}

/*
Local Variables:
compile-command: "g++ -g test.cc && ./a.exe"
End:
 */

因此,您可以根据每个文件决定要执行的操作。由于compile-command事物的原因,hack-local-variables的更改在下一次编译中被视为。

输出结果为:

-*- mode: compilation; default-directory: "/c/temp/" -*-
Compilation started at Fri Nov 15 15:22:34

g++ -g test.cc && ./a.exe
Test
Compilation finished at Fri Nov 15 15:22:34

编辑:有时需要链接一些额外的库或指定一些额外的包含路径。因此,我无法接受Talespin_Kit作为完整解决方案的答案。我认为在上面编辑的版本中给出的组合更好。如果给出局部变量,则使用原始compile-command,否则使用自动生成的compile-command。注意,还可以使用assq来检查compile-command是否是局部变量的成员。

答案 1 :(得分:0)

解决方案非常简单。只需在编译后执行

(defun cpp-single-file-compile ()
  (interactive)
  (save-buffer)
  (compile
   (concat "g++ -g " (buffer-file-name) " -o " (file-name-sans-extension (buffer-file-name))
       " && " (file-name-sans-extension (buffer-file-name)) ".exe")))

(add-hook 'c++-mode-hook (lambda () (local-set-key "\C-c\C-c" 'cpp-single-file-compile)))