Я новичок в Emacs. Мне приходится пытаться найти, как использовать Emacs для использования с большими проектами C ++, особенно для индексирования кода и автозаполнения имен функций и поведения, подобного Eclipse. Некоторое время я использовал Vim, где использовал ctags для индексации кода в своем проекте, а Vim пытался автоматически завершать мой код, используя выпадающее меню опций. Я пытаюсь добиться того же с Emacs сейчас. Но во время моего поиска результаты указали на CEDET, автозаполнение и другие сторонние плагины.
Я пытался использовать ctags с ctags -e -R .
и etags, но безуспешно.
Я пропускаю способ Emacs по умолчанию для достижения того же поведения? Какой самый лучший и простой способ добиться того, чего я хочу?
Я использую CEDET с автозаполнением успешно. По сути, автозаполнение является провайдером раскрывающегося списка, и оно берет свои источники из различных вещей, наиболее интересно из CEDET (но также из etags и Gnu Global, которые я тоже рекомендую).
Хорошей отправной точкой для CEDET является http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html
Конфигурация emacs Алекса Отта есть: https://github.com/alexott/emacs-configs — это полезный ресурс.
Обратите внимание, что вам нужно получить CEDET от bzr и правильно установить / настроить автозаполнение. Я настоятельно рекомендую el-get установить автозаполнение (и некоторые другие вещи). Вам нужно настроить общие проекты для EDE, чтобы автозаполнение работало для случайных файлов C / C ++, не являющихся частью структурированного проекта EDE.
Вам придется потратить некоторое время на настройку emacs, но это окупится. Инструмент невероятно продуктивен после правильной настройки.
индексирование
Вы можете использовать GNU / глобальной вместо ctags: он поддерживает C ++ и, на мой взгляд, более эффективен при работе с большими проектами (тем более, что вы можете обновить индекс, а не восстанавливать его с нуля). И все же намного проще использовать этот CEDET / Semantic (который также является фантастическим инструментом, если вы потратите время на его настройку).
Пример использования:
$ cd sources
$ gtags -v # create the index
$ cd subdirectory
$ [hack hack hack]
$ global -u # update the index (can be called from anywhere in the project)
В Emacs активируйте gtags-mode
в буферах исходного кода, чтобы получить доступ к командам gtags:
gtags-find-tag
(M-.): найти определение указанного тега в ваших исходных файлах (gtags
позволяет выбирать между всеми возможными определениями, если их несколько, или напрямую переходить, если есть только одна возможность)gtags-pop-stack
(M- *): возврат к предыдущему местуgtags-find-rtag
: найти все варианты использования указанного тега в исходных файлахНиже моя конфигурация для gtags
, который автоматически активируется gtags-mode
если индекс найден:
;; gtags-mode
(eval-after-load "gtags"'(progn
(define-key gtags-mode-map (kbd "M-,") 'gtags-find-rtag)))
(defun ff/turn-on-gtags ()
"Turn `gtags-mode' on if a global tags file has been generated.
This function asynchronously runs 'global -u' to update global
tags. When the command successfully returns, `gtags-mode' is
turned on."(interactive)
(let ((process (start-process "global -u""*global output*""global" "-u"))
(buffer (current-buffer)))
(set-process-sentinel
process
`(lambda (process event)
(when (and (eq (process-status process) 'exit)
(eq (process-exit-status process) 0))
(with-current-buffer ,buffer
(message "Activating gtags-mode")
(gtags-mode 1)))))))
(add-hook 'c-mode-common-hook 'ff/turn-on-gtags)
Автоматическое завершение
Я не знаю лучшего инструмента, чем auto-complete
. Даже если он не включен в Emacs, его очень легко установить с помощью системы упаковки (например, в джем или же melpa Хранилища).
Это зависит от того, что вы ищете в IDE. Я использую Emacs для довольно большого проекта C ++. Конечно, вам нужно настроить emacs для работы так, как вы хотите, чтобы он работал в большей степени, чем любая другая IDE.
Но да, CEDET — это начало, хотя и не идеальное.
Однако есть очень хороший режим автозаполнения для Emacs. http://cx4a.org/software/auto-complete/ это не intelisense, но он должен каким-то образом интегрироваться с CEDET, чтобы дать вам хорошее автозаполнение.
Еще одна важная функция, которую я часто использую, — это функция ff-find-other-file
легко перейти из заголовка и файлов реализации.
Тогда, конечно, вам нужно свернуть свой собственный Bulid. CEDET имеет некоторую поддержку проектов, но я не проверял это. Однако Emacs хорошо интегрируется с инструментами сборки командной строки, такими как make. Ошибки печатаются в буфере, и вы можете легко перейти на нужную строку в Emacs.
GDB также хорошо интегрируется с Emacs M-x gdb
тогда просто запомни gdb-many-windows
команда.
Я рекомендую посмотреть молниеносную беседу Атилы Невеса на CppCon 2015 под названием Emacs как C ++ IDE.
Для подробностей смотрите мой ответ на этот связанный вопрос.
Я использую GNU Global и два популярных плагина Emacs:
компания для завершения кода
emacs-helm-gtags для навигации по коду