Функции навигации по исходному коду Emacs

Я работаю над большим проектом С++. Я работаю с 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.


person thamurath    schedule 19.08.2010    source источник
comment
С какими проблемами вы столкнулись при использовании EDE?   -  person Laurynas Biveinis    schedule 19.08.2010
comment
Я отредактировал вопрос, чтобы добавить новую информацию. Спасибо за ваш интерес.   -  person thamurath    schedule 19.08.2010


Ответы (2)


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

Если данный исходный файл говорит:

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

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

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

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

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

in it.

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

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

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

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

person Eric    schedule 19.08.2010
comment
Спасибо за Ваш ответ. Проблема в том, что заголовочные файлы разбросаны по всему проекту. У каждого модуля есть подпапки, и заголовки находятся внутри этих подпапок, поэтому указать все пути, где находятся заголовки, было бы адом. - Есть ли способ заставить Semmantic искать заголовки во всех подкаталогах по корневому пути? - Читая документацию EDE, я обнаружил, что вместо указания путей в виде списков вы также можете предоставить функцию, которая будет выполнять поиск включаемых файлов в вашем проекте. К сожалению, я не знаю elisp. Где-нибудь, где я могу найти пример? Спасибо! - person thamurath; 20.08.2010
comment
Цель включения пути — ускорить поиск пути, сфокусировав его вниз. Если в этом нет никакой пользы, то лучше всего использовать CScope. Как только CScope включен в качестве функции поиска EDE (см. переменную ede-locate-setup-options), это похоже на наличие всего в качестве пути включения для всех файлов. Вероятно, есть некоторые предостережения, но я сам не пробовал этот трюк, чтобы знать наверняка. - person Eric; 22.08.2010

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

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

person Bozhidar Batsov    schedule 19.08.2010