Функции за навигация в изходния код на Emacs

Работя върху голям C++ проект. Работя с emacs през последните шест месеца. Опитах се да конфигурирам CEDET така, че да мога да навигирам лесно, но открих някои проблеми.

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

  • Имам няколко версии (Releases) на един и същ проект, всяка в собствена папка. Как мога да кажа на 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-path за вашите проекти.

Ако даден изходен файл казва:

   #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, така и в семантичната база данни. Включването на поддръжка на 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 Code Browser, когато работех върху C++ проекти и го намерих за много задоволителен - в допълнение към страхотна навигация на файлове и структура на кода получавате отлична VCS интеграция (различни икони според текущото състояние на файл в проекта). Във връзка с ECB използвах cscope за Emacs, тъй като споменахте за vim, вероятно ще искате да го използвате и в Emacs.

Като алтернатива, ако искате по-просто решение, можете да погледнете Emacs Nav. Той поддържа и някои фантастични неща и няма зависимост от семантиката и скоростната лента - ще трябва да използвате само etags/ctags, за да индексирате проекта си.

person Bozhidar Batsov    schedule 19.08.2010