Emacs有像vim一样原生的编译机制吗?

在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))))
7 个赞

可以用 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))))))))))
2 个赞

谢谢,不过我想知道的是Emacs除了原有的M-x compile外还有没有其他原生的方式😅

不过看两位都是推荐插件,看来是没有了😂

projectile也可以定制每个project的编译命令

请问下使用 compile-dwim 中的 compile-dwim-run 功能运行编译后的结果时,如果运行的代码是需要输入信息的时候怎么输入值?

请教下smart-compile如何自定义命令来覆盖已有的命令,比如编译c文件我想加上-Wall -g类似这样,好像只有修改原文件?