在emacs中编译大型项目
一个大型项目可能有多个深度级别的目录。Emacs的默认编译命令是在emacs中编译大型项目,emacs,compilation,Emacs,Compilation,一个大型项目可能有多个深度级别的目录。Emacs的默认编译命令是“make-k”,如果我修改了某个源代码,然后键入“M-x compile-RET”,它将在源代码所在的目录下执行“make-k” 我想我可以编写一个函数来确定Makefile是否存在于当前目录下,如果存在,继续在父目录下搜索,直到找到顶级目录,然后执行building命令,这将与我的预期一样正确 然而,我不太清楚如何开始,谁能给我一些提示开始?就像我可能遇到的函数或变量一样。谢谢。看看: “C-h v编译命令”直接来自emacs。
“make-k”
,如果我修改了某个源代码,然后键入“M-x compile-RET”
,它将在源代码所在的目录下执行“make-k”
我想我可以编写一个函数来确定Makefile是否存在于当前目录下,如果存在,继续在父目录下搜索,直到找到顶级目录,然后执行building命令,这将与我的预期一样正确
然而,我不太清楚如何开始,谁能给我一些提示开始?就像我可能遇到的函数或变量一样。谢谢。看看:
“C-h v编译命令”直接来自emacs。您可以尝试使用以下命令:
(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 ")))
有一种水果酱
从文档中……当您需要时,可以指定cons单元格列表,每个单元格类似于(TEST.COMMAND)
命令用于编译命令
测试成功
测试可以是:
- 一串。在本例中,它用作正则表达式, 并与与关联到的文件名匹配 缓冲器当正则表达式匹配时,测试成功
- 表示主模式的符号。在这种情况下 如果缓冲区使用该主模式,则测试 成功
- 一种符号,表示名称不为的任何函数 以\“-模式\”结尾。在这种情况下,函数是 调用,如果返回非nil,则测试 成功
- 表格清单。在这种情况下,表格将被评估, 如果返回值为非nil,则测试 成功
根据文档,如果命令为nil,那么包将使用测试结果作为编译命令。这意味着您只需要一个函数,返回一个make命令,引用相应目录中的makefile 对于喜欢bash脚本而不是Emacs Lisp的人来说,这里有一个解决方案。在my.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)))
虽然这不是您问题的答案,但在这种情况下,我通常会在顶部目录中运行一次
M-x compile
,保持编译缓冲区打开,然后在之后运行M-x recompile
。编译缓冲区保留在第一次使用的目录中。您的compile命令似乎会检查父目录,但是,深度可能超过两个,如果超过两个,则无法工作。如果编译阶段出现错误怎么办?最好将compile命令设置为shell脚本,但仍然使用compile而不是shell命令来构建脚本。然后,您可以为错误定义regexp——如果默认值不适合您的情况——这样,在编译缓冲区中的错误上按RET将跳转到有问题的代码。这是在emacs中编译的主要好处。感谢您的建议。我在Emacs方面的经验有限,我仍在努力将它变成一个理想的IDE。其想法是在初始解决方案中将“shell命令”替换为“compile”,并丢失“&”。这确实好得多,和我想的不太一样。首先,我假设您正在使用(保存一些缓冲区1)替换M-x编译的提示行为。最好让compile为您完成这项工作,如果提示让您感到困扰,请自定义编译并询问save变量。现在,如果您还将compile命令自定义为“make and run.csh”,那么您将不再需要emacs make and run;您只需使用compile即可。另外请注意,您使用(cd topdir)的方式可能会产生一些微妙的副作用,这些副作用可能是您想要的,也可能是您不想要的。再次感谢您的纠正。(cd topdir)的副作用已经开始困扰我,所以这是个糟糕的主意。最终看来,解决方案相当简单。我不知道compile命令能够处理除“make”之外的任何事情。正如我所说,我仍在学习Emacs。
#!/bin/bash
make -j && ./<main>
(setq compile-command "script.sh")