Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在emacs中编译大型项目_Emacs_Compilation - Fatal编程技术网

在emacs中编译大型项目

在emacs中编译大型项目,emacs,compilation,Emacs,Compilation,一个大型项目可能有多个深度级别的目录。Emacs的默认编译命令是“make-k”,如果我修改了某个源代码,然后键入“M-x compile-RET”,它将在源代码所在的目录下执行“make-k” 我想我可以编写一个函数来确定Makefile是否存在于当前目录下,如果存在,继续在父目录下搜索,直到找到顶级目录,然后执行building命令,这将与我的预期一样正确 然而,我不太清楚如何开始,谁能给我一些提示开始?就像我可能遇到的函数或变量一样。谢谢。看看: “C-h v编译命令”直接来自emacs。

一个大型项目可能有多个深度级别的目录。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,则测试 成功

因此您可以生成一个函数来扫描父目录中的makefile, 并以此作为你的测试


根据文档,如果命令为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")