有没有一个好的方法来做Emacs项目?

有没有一个好的方法来做Emacs项目?,emacs,project,bookmarks,bookmark,Emacs,Project,Bookmarks,Bookmark,我使用emacs进行一些编码和文本编辑。当我创建一个新的编码项目时,我只需创建一个新文件夹,并将源代码添加到其中 问题是,对于多个文件夹,很难将其更改回原来的文件夹 top,然后运行makefile 有没有什么好的方法来进行项目管理,比如eclipse或 其他IDE?我通常不再从emacs内部编译,但是为什么不能在缓冲区中运行shell来运行make呢。将该shell保存在顶级目录中 至于项目管理,您需要什么功能 我不确定你到底在问什么,但你可能正在寻找。取决于语言。JDE是一个很好的Java环

我使用emacs进行一些编码和文本编辑。当我创建一个新的编码项目时,我只需创建一个新文件夹,并将源代码添加到其中

问题是,对于多个文件夹,很难将其更改回原来的文件夹 top,然后运行makefile

有没有什么好的方法来进行项目管理,比如eclipse或
其他IDE?

我通常不再从emacs内部编译,但是为什么不能在缓冲区中运行shell来运行make呢。将该shell保存在顶级目录中


至于项目管理,您需要什么功能

我不确定你到底在问什么,但你可能正在寻找。

取决于语言。JDE是一个很好的Java环境,Distel是一个很好的Erlang环境。我相信其他平台也有很好的环境。不过,总体而言,与Eclipse这样的IDE相比,您必须在emacs中进行更多的配置。在我看来,回报是值得的。

我知道你的问题。如果您的Makefile与源代码位于同一文件夹中,并且您位于源代码缓冲区中,那么“compile”将正确生成

但是,如果您的源文件位于不同的文件夹中,那么emacs将找不到Makefile

一种解决方案是通过在每个源文件中将“default directory”变量设置为文件变量来指定Makefile的位置

您可以通过在文件顶部添加一行(并重新加载)来完成此操作


我最近开始使用来管理我的各种目录树。现在我已经将F5绑定到(使用项目根(compile)),默认目录自动设置为我在.emacs中指定的任何项目的根目录,基于调用编译的缓冲区。

我使用CEDET包中的EDE-它可以维护不同类型的项目。我使用它与CMake一起工作,并使用自定义编译命令(您可以找到它-请参阅MyCompile函数)

当提示输入编译命令时,如何输入以下内容:

“cd;制作”


如果经常键入很麻烦,可以在“compile command”变量中设置它——尽管在您键入一次之后,它会在会话中被记住。

当我使用Java执行此操作时,我使用了ANT,ANT通过“-find”开关优雅地处理了此操作

实际上,它只是在当前目录中查找build.xml文件,直到找到它为止。非常方便,特别是在Java项目中,因为它们强制的目录结构

对于Make,我将创建一个类似的替换:

#!/bin/sh
# mymake -- my "hunt the makefile" make command
if [ -f Makefile ]
then
    exec make
else
    cur=`pwd`
    if [ $cur = "/" ]
    then
        echo "Can not find Makefile"
        exit 1
    fi
    newdir=`dirname $cur`
    cd $newdir
    exec mymake
fi

以下是;;;my.emacs文件的编译部分。我使用CTRL+F7组合键进行make,使用F7组合键进行make clean。它将在当前目录中搜索,然后在。。以此类推,一个名为“Makefile”的文件将在其上运行make

也不是说F8会将源窗口跳转到第一个错误,而CTRL+F8会将您带到上一个错误。(顺便说一句,如果你觉得这太棒了,你应该看看我为GDB集成做了些什么)…:)

我会使用eproject

以下是SO的一个示例:

基本上,它统一了CEDET、项目根等的特性。您可以通过多种方式声明项目定义,并通过统一的API访问数据。它还带有一些不错的糖,包括ibuffer集成。(按项目筛选ibuffer,请参见缓冲区名称旁边的项目名称等)。]

  • 您可以使用桌面书签、目录书签或书签列表书签来组织项目--请参阅

  • 另请参见:了解更多选项


只需从根目录
M-x编译一次
。这将创建一个
*编译*
缓冲区,它将记住调用它的目录和参数

然后,当您想要重新编译时,只需发出
M-x recompile
。这在任何地方都可以工作。它会调回原始的
*编译*
缓冲区,并使用存储在该缓冲区中的目录查找生成文件

还有其他方法可以从项目的根目录之外发布编译,但我想我应该指出这一点,因为它可以在零定制的情况下开箱即用。许多其他的响应使得解决方案听起来比实际情况更复杂

编译缓冲区提示 如果在编译缓冲区中键入
C-C-f
,它将启用
next error follow minor mode
,以便在编译缓冲区的错误之间导航时,第二个窗口将在其原始源缓冲区中显示错误

M-n
M-p
将在编译缓冲区的错误之间移动

如果您已经在源缓冲区中,并且希望在那里的错误之间导航,请键入
M-g n
,或
M-g p

突出显示语法错误 键入
M-x flymake mode
以在键入时执行即时语法检查。它将以红色突出显示语法错误。鼠标悬停将显示错误消息

要使flymake正常工作,必须向makefile中添加检查语法规则

C++示例:

check-syntax:
    g++ -o nul -S ${CXXFLAGS} ${CHK_SOURCES}

此规则检查文件的语法,但不编译它,因此速度很快。

编译时,您可以在编译缓冲区中获得结果,并且可以轻松地从错误导航到源代码。介意分享您的配置吗?我想看看好的gdb集成是什么样子。
;; Compilation
(setq compilation-scroll-output 1) ;; automatically scroll the compilation windo
w
(setq compilation-window-height 10) ;; Set the compilation window height...
(setq compilation-finish-function ;; Auto-dismiss compilation buffer...
      (lambda (buf str)
        (if (string-match "exited abnormally" str)
            (message "compilation errors, press F6 to visit")
          ; no errors, make the compilation window go away after 2.5 sec
          (run-at-time 2.5 nil 'delete-windows-on buf)
          (message "No compilation errors!"))))

(require 'cl) ; If you don't have it already
(defun* get-closest-pathname (&optional (file "Makefile"))
  "This function walks up the current path until it finds Makefile and then retu
rns the path to it."
  (let ((root (expand-file-name "/")))
    (expand-file-name file
              (loop
            for d = default-directory then (expand-file-name ".." d)
            if (file-exists-p (expand-file-name file d))
            return d
            if (equal d root)
           return nil))))

(defun my-compile-func ()
  "This function does a compile."
  (interactive)
  (compile (format "make -C %s" (file-name-directory (get-closest-pathname)))))

(defun my-compile-clean-func ()
  "This function does a clean compile."
  (interactive)
  (compile (format "make -C %s clean" (file-name-directory (get-closest-pathname
)))))

(defun my-compile-package-func ()
  "This function builds an Endura package."
  (interactive)
  (compile (format "make -C %s package" (file-name-directory (get-closest-pathna
me)))))

(global-set-key [f7] 'my-compile-clean-func)
(global-set-key [C-f7] 'my-compile-func)
(global-set-key [S-f7] 'my-compile-package-func)
(global-set-key [f8] 'next-error)
(global-set-key [C-f8] 'previous-error)
check-syntax:
    g++ -o nul -S ${CXXFLAGS} ${CHK_SOURCES}