Emacs C IDE / Gnu Global helm-gtags
Привет сообщество Ubuntu,
поэтому прежде всего я хотел бы сказать, что я новичок в Ubuntu (16.10) и Linux. Я решил использовать Windows как можно меньше, а также хотел начать изучать язык программирования C. Однако я подумал, что было бы неплохо сделать это в Emacs, поэтому я начал изучать Emacs и делал несколько Учебников по emacs. Главным образом Основы и чем обучение, делая. Поэтому я нашел этот учебник https://tuhdo.github.io/c-ide.html Перед этим я установил множество пакетов, включая helm, gtags и helm-gtags. Я также установил ncurses libary для установки gnu global.
Итак, теперь мы добрались до моей проблемы / вопроса. Прежде всего, если честно, сейчас я не совсем понимаю, что такое gtags, но я подумал, что выясню это, когда установлю (думаю, что-то для навигации). Но в разделе "Навигация по исходному коду" он говорит о:
"Перед использованием ggtags или helm-gtags не забудьте создать базу данных GTAGS, запустив gtags в корневом каталоге вашего проекта в терминале: ".. а затем некоторые команды
Я думаю, что мне как-то нужно соединить библиотеку с Emacs. В FAQ по GNU_Global написана ссылка на папку моего проекта со ссылкой на: /usr/src/lib
Но в моем каталоге / usr / src нет папки lib. Теперь я думаю, потому что Ubuntu имеет немного отличную структуру от других дистрибутивов Linux, эта библиотека где-то еще? Или я совершенно не прав? Я не мог найти ответы с Google, так что, возможно, вы можете просветить меня.
Заранее спасибо, Энди
2 ответа
gtags - это инструмент Linux, который генерирует базу данных символов для исходного кода, а затем позволяет искать эти символы для использования и определения. ggtags - это "плагин" для Emacs, который предоставляет автоматизированный интерфейс для инструмента. Некоторыми альтернативами, которые имеют схожую функциональность с gtags, являются ctags, etags и cscope, большинство из которых имеют свои собственные плагины Emacs.
Примечательно, что многие из этих инструментов не очень хороши в обработке больших баз кода (размер ядра Linux и более) из-за способа хранения своих баз данных. Например, ядро Linux сгенерирует текстовый файл объемом 2 ГБ при использовании только gtags, и этот файл необходимо загружать и искать всякий раз, когда вы пытаетесь выполнить поиск символов. Существуют обходные пути для решения этой проблемы (ниже).
Простое решение
1. Установите gtags в вашей системе.
sudo apt-get install global
Теперь в командной строке вы сможете запустить эту команду и посмотреть, где она установлена:
which gtags
2. Скажите плагину Emacs ggtags, где найти инструмент gtags.
Используя путь, возвращаемый which gtags
добавьте следующую строку в файл ~/.emacs:
(setq ggtags-executable-directory "/path/to/gtags/parent/dir")
3. Создайте базу данных gtags для проекта кода.
По умолчанию ggtags будет искать вверх по дереву каталогов из файла, в котором вы выполнили поиск символа, пытаясь найти файл GTAGS. Этот файл GTAGS (и, возможно, некоторые связанные) - это ваша база данных символов. Если он не найдет совпадения для символа в первом файле базы данных, он продолжит поиск в дереве каталогов дополнительных баз данных. Приоритеты для совпадений определяются на основе близости файла использования / определения символа к файлу, в котором вы выполняете поиск. Генерация этой базы данных называется "маркировка", и обычно она находится в корне дерева источника, которое вы хотите пометить. Сам инструмент gtags не выполняет этот поиск продолжения, так как он передал путь к определенной базе данных, а встроенный плагин Etacs, предоставляемый gtags, поддерживает это поведение с одной базой данных.
Чтобы создать базу данных gtags для исходной папки из Emacs, когда вы используете плагин ggtags (рекомендуется для встроенного плагина Emacs gtags), вам нужно запустить команду ggtags-create-tags
, Связывание клавиш по умолчанию для запуска произвольных команд в Emacs - Mx, поэтому нажмите его, а затем введите ggtags-create-tags
, Он запросит у вас папку, все которой нужно пометить, и базу данных следует разместить, поэтому укажите ее в верхнем каталоге исходной папки, которую вы хотите пометить. Он будет работать некоторое время, возможно, довольно долго, если у вас есть большое дерево исходных текстов, блокируя весь графический интерфейс Emacs, пока он генерирует базу данных тегов. После завершения он будет автоматически использоваться ggtags при необходимости.
Гораздо лучшее решение
Одной из проблем с gtags, ctags, etags и cscope является размер создаваемых баз данных. Так как они помечают, где определены символы, а также где они используются, вы можете получить базу данных, размер которой превышает ваше фактическое дерево исходных текстов. В этом случае очень большие базы данных представляют проблему поиска в разумные сроки. Использование ggtags с установленным по умолчанию Ubuntu gnu-global tool приводит к очень неэффективному формату базы данных, который экспоненциально ухудшается с ростом. В основном это связано с тем, что Ubuntu все еще предоставляет инструмент gnu-global с 2008 года, а не современную версию, и он не предназначен для использования гораздо более эффективных инструментов ctags в качестве базовой структуры.
Чтобы избежать проблем с gtags и заставить его использовать более эффективные ctags, вам нужен global-6.4 или новее, и он должен быть собран для указания ваших установок ctags. Единственный способ, который я действительно нашел, - это собрать его из исходного кода и предоставить правильные параметры, а также все необходимые установки зависимых пакетов. В итоге я написал сценарий оболочки для этой установки и настройки и сохранил его в GitHub вместе с остальными сценариями настройки и установки emacs. Вы можете получить его по https://github.com/mtalexan/emacs-settings/blob/master/global_install.sh.
Вам нужно будет установить несколько вещей в ~/.emacs, чтобы в полной мере использовать это:
(setq ggtags-use-idutils t)
(setq ggtags-use-project-gtagsconf nil)
Это позволяет использовать очень эффективный подпакет idutils и гарантирует, что вызовы gtags используют ваши глобальные настройки для gtags, которые вы сейчас скомпилировали.
Как использовать gtags / ggtags / helm-gtags
Я лично использую ggtags, а не helm-gtags или gtags. Emacs предоставляет "плагин" gtags по умолчанию, но у него гораздо худший интерфейс, чем у ggtags, и он будет искать только одну базу данных. Я использую helm регулярно для большинства вещей, но мне нравится мой интерфейс ggtags, отделенный от моего интерфейса helm, когда я анализирую совпадения, поэтому я не использую helm-gtags. Также helm-gtags довольно медленный, если ваша база данных gtags велика.
Для ggtags вам нужно установить ggtags-mode, чтобы он был полезен. Это можно сделать, добавив его для автоматического запуска в c-режиме, добавив в файл.emacs что-то вроде следующего
(add-hook 'c-mode-common-hook
(lambda ()
(when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
(ggtags-mode 1))))
В качестве альтернативы вы можете установить его всегда включенным, вместо этого используя следующую строку:
(setq ggtags-global-mode 1)
Настройки, которые я рекомендую, если вы собираетесь использовать большую кодовую базу, требуют в вашем файле ~/.emacs следующих строк:
; Allow very large database files
(setq ggtags-oversize-limit 104857600)
(setq ggtags-sort-by-nearness t)
При просмотре кода чаще всего я следую за символом под моим курсором, выявляю все варианты использования символа под моим курсором и иногда выполняю поиск символа, не связанный с тем, где находится мой курсор. Они соответствуют командам: ggtags-find-tag-dwim
а также ggtags-find-reference
, Эти команды работают с точкой (вашей позицией курсора Emacs), но откроет подсказку для вас, чтобы ввести символ, когда под вашей точкой нет символа или когда они вызваны из Mx.
Когда ты бежишь ggtags-find-tag-dwim
он может делать несколько вещей, лучше всего понимаемых при игре с ним, но обычно переходит к совпадению, когда есть только одно совпадение (эквивалент, который не выполняет автоматический переход, ggtags-find-tag
) или откроет боковые окна как ggtags-find-reference
со списком возможных совпадений, который включает файл, номер строки и некоторый контекст для него, где каждая запись кликабельна, чтобы перейти непосредственно туда.
Будьте осторожны, когда это окно открыто, оно переводит вас в специальный второстепенный режим, который означает, что клавиши вверх и вниз будут переключаться между совпадениями, пока вы не нажмете Enter, чтобы официально выбрать совпадение.
Удобно, когда вы выбираете совпадение, ваша метка остается позади. Это означает, что вы можете использовать команду pop-tag-mark
чтобы вернуться к последнему месту, где вы были. tag-mark - это набор тегов-меток, поэтому вы можете многократно искать символы и всегда иметь возможность вернуться к каждому месту до начала поиска. Если вы хотите просто выполнить поиск вручную, а не на основе символа в точке, есть некоторые функции ggtags, которые работают как ggtags-find-tag-dwim
, но предложит вам ввести символ в минибуфере. ggtags-find-tag-dwim
будет делать то же самое, если под точкой нет символа.
Судо может стать глобальным
/*********************** Ниже не имеет значения *****************/ Добро пожаловать в Linux и C и это мой первый пост. лол
Вы на правильном пути! Поздравляю! Я студент EE, делающий CS сейчас.
Я надеюсь, что мой совет поможет вам.
- Избавьтесь от Windows, даже не используйте его на виртуальной машине. если не могу, но второй ноутбук только для Linux и программирования C/C++.
Windows для развлечения, для непрограммиста, я мог бы быть немного экстремальным. ДА, C/C++ и Unix для жирных, для профи!
- Я думаю, вы еще не начали изучать C++. Если Ture, чувак, сначала запустите C++, используйте или любую книгу из стека обмена, или Quora.
Зачем? C++ сложнее, и больше работы, и если вы знакомы с C++. Я не уверен, я думаю, что C можно легко подобрать.
почему C++ во-первых, много стиля программирования C не предлагается в C++. Некоторые запрещены, если вы хотите написать хороший и современный C++.
ДА, выучи С трудный путь. есть даже книга, которая называется так.
ХАХА, но если ты студент EE и делаешь встроенную систему, учись C! Выучи C! Выучи C! C определенно страна чудес здесь.
Стать богом в программировании на С: (мой путь)
Книга K&R, Библия!
APUE, Библия снова! В APUE есть онлайн-курс, люди серьезные.
Я думаю, что вы хорошо идти, не нужно больше читать, НО!
если у вас достаточно времени и энергии, прочтите исходный код UNIX. Существует книга под названием "Комментарий исходного кода Unix". Это была обязательная книга по информатике в MIT. но перед этим вам понадобятся некоторые знания об ОС.
Хватит о С!
Давайте поговорим об IDE, так как вы новичок в Linux.
Используйте Emacs, Vi или.. как для C, так и для C++, python, о, может быть другими языками программирования.
IDE делает тебя ленивым, не думая о том, что на самом деле происходит.
Подумайте об этом, C/C++ созданы задолго до какой-то модной IDE, ОС Windows!
как люди программировали ОС в те дни? использовать IDE? ха-ха
Изучите C/C++ трудным путем. Я гарантирую, вам понравится.
ПОСЛЕДНО, НЕ ПОЛУЧИТЕ GNU Global.
"Это полезно для взлома больших проектов, которые содержат много подкаталогов", - говорит Интернет.
Вы поддерживаете какие-то крупные проекты или просто делаете упражнения по программированию учебников?
Опять же, это делает тебя ленивым!