在vim下针对不同类型的文件,可以调用不同的compiler,并设置编译出错时的提示信息,并把信息填充到quickfix列表里方便定位
Emacs好像只能手写Makefile或者M-x compile
后删掉原有命令自己写?
在vim下针对不同类型的文件,可以调用不同的compiler,并设置编译出错时的提示信息,并把信息填充到quickfix列表里方便定位
Emacs好像只能手写Makefile或者M-x compile
后删掉原有命令自己写?
有一些插件可以实现:
smart-compile 个人目前在用的
quickrun 貌似挺多人用的
compile-dwim 这个好像是子龙山人用的
我个人使用 smart-compile
,所以对 smart-compile
略作一点介绍:
smart-compile 的代码非常精简,去掉注释的话 200 行都不到
使用逻辑是这样的,调用 smart-compile
, 首先看下当前目录下是否有 makefile 文件,有的话,调用 make 来编译,没有的话调用相应的指令来编译文件。
这个所谓的指令保存在 smart-compile-alist
变量里,是一个关联列表。基本上是 (后缀 . 命令) 的形式。 比如一个 c 后缀文件,调用 gcc 来编译:
("\\.c\\'" . "gcc -O2 %f -lm -o %n")
%F 完整的绝对路径(如 /usr/local/bin/netscape.bin)
%f 除去目录前缀的文件名(如 netscape.bin)
%n 除去扩展名和目录前缀的文件名(如 netscape)
%e 扩展名(如 bin)
这个一般不需要操心,主流语言基本上都支持了,个别不支持的稍微 hack 一下就可以了。
具体使用的时候,可以配合 projectile 这类的工具。比如:
(defun zerolee-compile (&optional arg)
"对 `compile' 和 smart-compile 的一个轻微的包装"
(interactive "p")
(cond ((projectile-project-root)
(let ((default-directory (projectile-project-root)))
(smart-compile arg)))
(t
(smart-compile arg))))
可以用 quickrun。不想装quickrun的话,根据每种文件了类型写make也行,比如c++
(use-package cc-mode
:defer t
:init
(add-hook 'c++-mode-hook
(lambda ()
(unless (or (file-exists-p "makefile")
(file-exists-p "Makefile"))
(set (make-local-variable 'compile-command)
(concat "g++ -g "
(if buffer-file-name
(let* ((out-dir (file-name-directory buffer-file-name))
(out-base (concat (file-name-base buffer-file-name) ".out"))
(out-path (concat out-dir out-base)))
(concat (shell-quote-argument buffer-file-name)
" -o "
(shell-quote-argument out-path))))))))))
谢谢,不过我想知道的是Emacs除了原有的M-x compile
外还有没有其他原生的方式😅
不过看两位都是推荐插件,看来是没有了😂
projectile也可以定制每个project的编译命令
请问下使用 compile-dwim 中的 compile-dwim-run 功能运行编译后的结果时,如果运行的代码是需要输入信息的时候怎么输入值?
请教下smart-compile如何自定义命令来覆盖已有的命令,比如编译c文件我想加上-Wall -g类似这样,好像只有修改原文件?