Есть ли хороший способ сделать проект Emacs? - PullRequest
9 голосов
/ 15 апреля 2009

Я использую emacs для кодирования и редактирования текста. Когда я создаю новый проект кодирования, я просто создаю новую папку и добавляю в нее исходный код.

Проблема в том, что в случае нескольких папок трудно вернуться к top и запустите make-файл.

Есть ли хороший метод управления проектами, например, Eclipse или другие IDE?

Ответы [ 12 ]

7 голосов
/ 15 апреля 2009

Я знаю вашу проблему. Если у вас есть Makefile в той же папке, что и ваш исходный код, и вы находитесь в исходном буфере, тогда 'compile' будет собираться правильно

Но если ваш источник находится в другой папке, тогда emacs не сможет найти Makefile.

Одним из решений является указание местоположения файла Makefile путем установки переменной default-directory в качестве файловой переменной в каждом исходном файле.

Вы делаете это, добавляя такую ​​строку вверху файла (и перезагружая ее).

// -*- mode: C++; default-directory: "c:/somewhere/yourmakefiledirectory/" -*-
7 голосов
/ 15 апреля 2009

Ниже находится ;; раздел компиляции моего файла .emacs. Я использую CTRL + F7 для make и F7 для make clean. Он будет искать в текущем каталоге, а затем в ... и т. Д. Файл с именем "Makefile" для запуска make.

Также не значит, что F8 переходит в исходное окно к первой ошибке, а CTRL + F8 возвращает вас к предыдущей ошибке. (Кстати, если вы думаете, что это круто, вы должны увидеть, что я сделал для интеграции 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)
6 голосов
/ 01 декабря 2011

Просто M-x compile один раз из корневого каталога. Это создаст буфер *compilation*, который запомнит каталог и параметры, с которыми он был вызван.

Затем, когда вы хотите перекомпилировать, просто наберите M-x recompile. Это работает из любого места. Он возвращает ваш оригинальный буфер *compilation* и использует каталог, сохраненный в этом буфере, для поиска вашего Makefile.

Есть и другие способы запуска компиляции вне корневого каталога вашего проекта, но я подумал, что укажу на это, поскольку он работает "из коробки" с нулевой настройкой. Многие другие ответы сделали решение более сложным, чем оно есть.

Подсказки буфера компиляции

Если вы наберете C-c C-f, находясь в буфере компиляции, он включит next-error-follow-minor-mode, так что, пока вы будете перемещаться среди ошибок буфера компиляции, во втором окне будет отображаться ошибка в исходном буфере исходного кода.

M-n и M-p будут перемещаться между ошибками буфера компиляции.

Если вы уже находитесь в исходном буфере и хотите переключаться между ошибками, введите M-g n или M-g p.

Подсветка синтаксических ошибок

Введите M-x flymake-mode для проверки синтаксиса на лету при вводе. Это выделит синтаксические ошибки красным цветом. Если навести курсор мыши, появится сообщение об ошибке.

Чтобы Flymake работал, вы должны добавить правило проверки синтаксиса в ваш make-файл.

C ++ пример:

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

Это правило проверяет синтаксис файла, но не компилирует его, поэтому оно работает быстро.

5 голосов
/ 15 апреля 2009

Обычно я больше не компилирую из emacs, но почему вы не можете запустить оболочку в буфере только для запуска make. Храните эту оболочку в каталоге верхнего уровня.

Что касается управления проектами, какие функции вы ищете?

3 голосов
/ 15 апреля 2009

Я использую EDE из пакета CEDET - он может поддерживать различные типы проектов. Я использую его для работы с CMake вместе с пользовательской командой компиляции (вы можете найти ее здесь - см. Функцию MyCompile)

2 голосов
/ 15 апреля 2009

Я недавно начал использовать project-root для управления моими различными деревьями каталогов. Теперь я привязал F5 к (with-project-root (compile)), и каталогу default-автоматически присваивается корень любого проекта, который я указал в моем .emacs, в зависимости от того, какой буфер я вызываю скомпилировать из.

1 голос
/ 05 сентября 2011

1 голос
/ 15 апреля 2009

Я не совсем уверен, что вы спрашиваете, но вы, возможно, ищете Speedbar .

0 голосов
/ 12 июня 2009

Я бы использовал eproject; http://github.com/jrockway/eproject

Вот пример из SO: Есть ли где-нибудь хорошее управление проектами Emacs?

По сути, он объединяет функции CEDET, Project-root и так далее. Вы можете объявить определения проекта несколькими способами и получить доступ к данным через унифицированный API. Это также идет с небольшим количеством хорошего сахара, включая интеграцию ibuffer. (Отфильтруйте ibuffer по проекту, см. Имя проекта рядом с именем буфера и т. Д.]

0 голосов
/ 15 апреля 2009

когда я делал это с 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
...