大型项目可能包含多个级别深度的目录。 Emacs的默认编译命令是"make -k"
,如果我修改了某个源代码,然后键入"M-x compile RET RET"
,它将在源代码所在的目录下执行"make -k"
。
我想我可以编写一个函数来确定Makefile是否存在于当前目录下,如果是,继续在父目录下搜索直到找到顶级目录,然后执行构建命令,这就像我期望的那样。
然而,我不是很清楚如何开始,有人能给我一些启示吗?就像我可能遇到的函数或变量一样。感谢。
答案 0 :(得分:4)
您可以尝试使用以下内容:
(setq compile-command
'(let ((mf (locate-dominating-file default-directory "Makefile")))
(if mf (setq mf (file-name-directory mf)))
(concat (if (and mf (not (equal mf default-directory)))
(format "cd %s; "
(shell-quote-argument
(file-relative-name
(directory-file-name mf)))))
"make -k ")))
答案 1 :(得分:3)
果酱中有smarter-compile。
从文档....当您需要时,您可以指定一个缺点单元格列表,每个单元格都像(TEST . COMMAND)
一样。
COMMAND用于compile-command
时
TEST成功了。
TEST可以是:
一个字符串。在这种情况下,它被用作正则表达式, 并与相关的文件名匹配 缓冲。当正则表达式匹配时,TEST成功。
一个符号,代表主要模式。在这种情况下 如果缓冲区使用该主要模式,则为TEST 成功。
一个符号,表示任何名称不是的函数 以\“ - mode \”结尾。在这种情况下,功能是 如果它返回非零,则为TEST 成功。
表单列表。在这种情况下,表格是eval'd, 如果返回值为非零,则为TEST 成功。
所以你可以生成一个在父目录中扫描makefile的函数, 并将其用作您的测试。
根据文档,如果COMMAND为nil,则包使用TEST的结果作为编译命令。这意味着您只需要一个函数,返回一个make命令,引用相应目录中的makefile。
答案 2 :(得分:1)
看看:http://emacswiki.org/emacs/CompileCommand
直接来自emacs的“C-h v compile-command”。
答案 3 :(得分:1)
对于喜欢使用Emacs Lisp的bash脚本的人来说,这是一个解决方案。在我的.emacs中,我定义了一个保存所有缓冲区并运行编译项目的bash脚本的命令。
(defun save-all-and-compile () (interactive)
(save-some-buffers 1)
(shell-command "make-and-run.sh &"))
(add-hook 'c-mode-common-hook (lambda ()
(local-set-key (kbd "<f5>") 'save-all-and-compile)))
对于小型项目,脚本可以像
一样简单#!/bin/bash
make -j && ./<main>
其中'main'是可执行文件的名称。对于较大的项目,首先需要找到根目录。同样,您可以使用不同的脚本(绑定到不同的键)来构建和运行程序。然后是一些用于测试项目不同部分的脚本。但这些只是人们可以自己解决的细节。
确保使用'&amp;'异步运行脚本。这样, Async Shell Command 缓冲区将打开make和你的项目的输出并保持打开状态。
修改强>
基于下面的讨论,似乎我最初推翻它并且解决方案非常简单。不是将通常的'make'或'make -k'传递给compile-command,而是可以使用shell脚本,该脚本首先导航到项目的根目录和构建。
(setq compile-command "script.sh")