Функции навигации по исходному коду Emacs - PullRequest
6 голосов
/ 19 августа 2010

Я работаю над большим проектом C ++. Я работаю с Emacs в течение последних шести месяцев. Я попытался настроить CEDET, чтобы иметь возможность легко перемещаться, но я обнаружил некоторые проблемы.

1.- Иногда семантический не находит некоторые символы, а иногда он не ... я не знаю четко, какие файлы являются семантической индексацией. Я пытался использовать EDE (следуя инструкциям в этой статье http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html),, но я также нашел некоторые проблемы ...

  • У меня есть несколько версий (релизов) одного и того же проекта, каждая в своей папке. Как я могу сказать emacs, с каким проектом я работаю?
  • Как я могу сказать ede, где искать мои заголовочные файлы? Могу ли я указать только корневой каталог, и семантик будет искать файлы заголовков во всех подкаталогах?

2.- Я работал с vim + cscope некоторое время назад, и я помню, что был способ вернуться назад в стек символов (Ctrl-t). Есть ли что-нибудь подобное в emacs?

P.D.> Некоторые данные, чтобы прояснить вопрос.

У меня несколько версий одного и того же проекта. У каждого есть свой корневой каталог. Каждый проект имеет несколько модулей, каждый из которых находится внутри подкаталога. В каждом модуле есть файл заголовков.

/home/user/
          |
           \Release-001
          |           |
          |            \makefile
          |            \ Module-001
          |           |           |
          |           |            \makefile
          |           |            \subdir-001
          |           |           |          \header-001.h
          |           |           |          \header-002.h
          |           |            \subdir-002
          |           |           |          \header-003.h
          |            \ Module-002
          |           |           |
          |           |            \makefile
          |           |            \subdir-003
          |           |           |          \header-004.h
          |           |           |          \header-005.h
          |           |            \subdir-004
          |           |           |          \header-006.h
          |
           \Release-002
          |           |
          |            \makefile
          |            \ Module-001
          |           |           |
          |           |            \makefile
          |           |            \subdir-001
          |           |           |          \header-001.h
          |           |           |          \header-002.h
          |           |            \subdir-002
          |           |           |          \header-003.h
          |            \ Module-002
          |           |           |
          |           |            \makefile
          |           |            \subdir-003
          |           |           |          \header-004.h
          |           |           |          \header-005.h
          |           |            \subdir-004
          |           |           |          \header-006.h

Это конфигурация о EDE, которую я имею в своем .emacs

;; Cedet load commands
(add-to-list 'load-path "~/emacs-dir/cedet/cedet")
(load-file "~/emacs-dir/cedet/cedet/common/cedet.el") 

;; EDE: activating mode.
(global-ede-mode t)

;; Projects definition
(ede-cpp-root-project "Release-001"
                     :name "Release-001"
                     :file "~/Release-001/makefile"
                     :include-path '("/"
                                     )
                     :system-include-path '("~/exp/include")
                     :spp-table '(("SUSE9" . "")
                                )
)
(ede-cpp-root-project "Release-002"
                     :name "Release-002"
                     :file "~/Release-002/makefile"
                     :include-path '("/"
                                     )
                     :system-include-path '("~/exp/include")
                     :spp-table '(("SUSE9" . "")
                                )
)

Просто чтобы вы знали ... Я работаю с консольной версией (-nw) emacs.

Ответы [ 2 ]

2 голосов
/ 20 августа 2010

Ваша конфигурация в основном правильная, за исключением: include-path для ваших проектов.

Если в указанном исходном файле написано:

   #include "Module-001/subdir-002/header-003.h"

тогда все в порядке. Если включить говорит:

   #include "subdir-002/header-003.h"

тогда ваш: include-путь должен иметь

   :include-path '("/Module-001" )

в нем.

Что касается того, что делает семантический индекс, он будет индексировать ваш текущий файл, и все, что он может найти. Используйте режим семантического оформления, чтобы увидеть, какие заголовки EDE нашел для вас, чтобы определить, является ли ваша конфигурация точной.

Он также будет индексировать все файлы в том же каталоге, что и тот, который вы редактируете, но только во время простоя, поэтому, если вы не позволите Emacs простаивать, он не сможет обойти его.

Вы можете ускорить операции индексации, если используете CScope, как предлагает Божидар. Затем вы можете включить поддержку CScope как в EDE, так и в семантической базе данных. Однако поддержка CScope в семантической базе данных появилась недавно, поэтому вам понадобится CVS-версия CEDET. Это должно было бы убедиться, что все это было проиндексировано.

Чтобы перейти назад, изучите справку для semantic-mru-bookmark-mode. Это отслеживает ваш прогресс в ваших файлах на основе именованного местоположения, что довольно удобно и всегда работает.

0 голосов
/ 20 августа 2010

В прошлом я использовал Emacs Code Browser при работе над проектами C ++, и я нашел его очень удовлетворительным - в дополнение к отличной навигации по файлам и структуре кода вы получаете отличную интеграцию с VCS (различные значки в соответствии с текущему состоянию файла в проекте). В сочетании с ECB я использовал cscope для Emacs, так как вы упомянули для vim, вы, вероятно, захотите использовать его и в Emacs.

В качестве альтернативы, если вы хотите более простое решение, вы можете взглянуть на Emacs Nav . Он также поддерживает некоторые интересные вещи и не зависит от семантики и скорости: вам нужно будет использовать только etags / ctags для индексации вашего проекта.

...