Programming
C++
January 2013 28

Sublime Text 2 для C/C++ разработчика или SublimeClang

From Sandbox
На хабре много статей посвященных редактору Sublime Text 2. Обычно они рождают за собой множество комментариев, где сторонники ST2 и всевозможных других редакторов (а также полноценных IDE) предаются веселому процессу «достоинствометрии».
Однако, среди комментариев мне лично ни разу не встречалось упоминаний о плагине SublimeClang, который кардинально меняет работу C++ программиста в этом редакторе. Поиск по хабру выдал всего 4 упоминания плагина в комментариях.
Не знаю, чем вызвано такое игнорирование. Хорошие вещи не обсуждаются? ST2 не используют C и С++ разработчики? Своей статьей я хочу исправить ситуацию. Я расскажу о некоторых, возможно не очевидных, особенностях установки и настройки, а также поделюсь парой собственных приемов и скриптов.

О плагине


Итак, плагин обеспечивает автодополнение кода и проверку ошибок прямо по ходу написания программы. Для файлов C/C++/ObjC/ObjC++ плагин заменяет стандартное автодополнение редактора на свое собственное. Для этого, плагин в фоне прогоняет исходник через компилятор clang, который формирует AST. Полученную информацию плагин использует для интеллектуальных подсказок автодополнения.
Ближайший аналог, который я могу подобрать — это функция IntelliSense в MS Visual Studio.
Использование информации из первых рук — от компилятора — позволяет плагину правильно узнавать, какие переменные, функции, типы и т.п. доступны в данной конкретной точки программы. Так же, в какой-то мере работают Go to definition (alt + d, alt + d) и Go to implementation (alt + d, alt + i). Список остальных горячих клавиш доступен на странице проекта.


Установка


Пользователям Windows и Mac OS X повезло — устанавливается плагин элементарно, через Sublime Package Manager.
Пользователям Linux — повезло меньше. Для Linux необходимые библиотеки не поставляются в собранном виде, так что устанавливать плагин надо из git-репозитория и провести сборку вручную. (Вообще, поставить-то можно и через Package Manager, вот только он удаляет все собранные вручную библиотеки каждый раз, когда решает проверить обновления). Инструкция по сборке есть на странице плагина, пункт «Additional Prerequisites (Linux Only)».

Пример установки на моей системе Archlinux x64
  1. Установить clang
  2. Установить python26
  3. Для того, чтобы победить ошибку «ctypes can't be imported» сделать symlink:
    ln -s /usr/lib/python2.6/ /opt/sublime_text/lib/python2.6

  4. Установить SublimeClang
    git clone --recursive git://github.com/quarnster/SublimeClang.git 

  5. Так как в archlinux libclang.so находится в /usr/lib/llvm/, т.е. не там, где ее ожидает увидеть SublimeClang, делаю symlink внутрь папки плагина.
    ln -s /usr/lib/llvm/libclang.so 

  6. Собираю недостающие плагину библиотеки по инструкции со страницы проекта.
    cd src
    mkdir build
    cd build
    cmake ..
    make
    



Настройка


Настраивается плагин стандартным для ST2 способом.
Есть файл SublimeClang/SublimeClang.sublime-settings. Файл хорошо документирован, все возможные настройки перечислены там и в комментариях есть примеры использования.
Есть User/SublimeClang.sublime-settings, куда следует перенести собственные настройки.
Так же, возможно указать специфичные для проекта параметры. Они указываются в файле проекта (Project - Edit project) в секции "Settings". К имени каждой опции плагина добавляется префикс "sublimeclang". Таким образом, например, настройки проекта, использующего C++11 могут выглядеть так

"settings":
{
	// Настройки самого редактора
	"trim_trailing_white_space_on_save": true,

	// Настройки плагниа
	// В основном файле настроек плагина эта опция называется "additional_language_options". Здесь же добавляем префикс.
	"sublimeclang_additional_language_options":
	{
		"c++" :["-std=c++11",
				"-stdlib=libc++"
				]
	}
}


Стандартные общие настройки весьма адекватны. Единственное — что я меняю и вношу в User-настройки — это "debug_options": true. Эта опция включает вывод списка параметров, которые передаются компилятору. После включения, параметры компилятора будут выводиться в консоли редактора (View - Show console).

Интеграция с билд-скриптами


Основная проблема, с которой я столкнулся — плагин (а значит и компилятор) не знает где искать заголовочные файлы нестандартных библиотек. (На Windows, вероятно, он и о стандартных ничего не знает).
Основной способ решения проблемы — использование опций плагина "options" и "additional_language_options", которые позволяют передать компилятору пути и необходимые дефайны. Естественно, можно указать общие и специфичные для проекта настройки. Например

"sublimeclang_options":
[
	"-I~/libs/boost_1_52_0",
	"-I~/code/sdl2/root/include"
]


Метод универсальный и простой как валенок, но содержит существенный недостаток — настройки, фактически, повторяют ту информацию, которая и так известна build-системе, которая собирает код проекта.

Плагин предоставляет опцию «options_script», в которой можно указать команду, которая будет вызываться для каждого файла. Эта команда должна вернуть список опций компилятора для данного конкретного файла. Таким образом можно писать собственные скрипты, которые спросят настройки компилятора у build-системы и сообщат их плагину.

Разработчик плагина в комментариях к опции даёт ссылку на скрипт https://gist.github.com/3944250, который берет настройки компиляции из CMake.
Для своего текущего проекта я немного подредактировал скрипт. Теперь
  1. скрипт подбирает настройки к заголовочным файлам;
  2. не жестко задается папка, в которой CMake проводит сборку. Вместо этого скрипт ищет папку build, проходя рекурсивно на верх по дереву папок. У меня в одном проекте ST2 много разных маленьких проектов CMake.

Моя версия скрипта https://gist.github.com/4641812

Аналогично я проводил интеграцию с утилитой ino, которая используется для сборки проектов arduino. Ссылка на скрипт https://gist.github.com/4641886. В шапке скрипта приведены настройки, которые необходимо добавить в файл проекта ST2. Также следует указать ST2 считать файлы .ino файлами C++. Для этого в правом нижнем углу нажать на выбор схемы подсветки кода и выбрать С++ в подменю "Open all with current extension as...".

Теоретически, можно создать скрипт, который вытащит команды компиляции из Makefile-скриптов. GNU make позволяет сделать дамп всех переменных и правил (make -np), которые затем можно распарсить и вытащить команды компиляции. И я даже начинал писать скрипт, но забросил это дело.

Недостатки


Ну а куда же без них.

  1. В некоторых замороченных случаях (дополнение параметров шаблона какого-нибудь замороченного шаблонного класса) плагин таки падает и роняет за собой ST2. Бывает редко, я видел такое всего пару раз во время моих экспериментов с новыми фичами C++11. Неприятно, конечно, но спасает то, что ST2 очень часто делает автосохранения. Я терял всего пару последних изменений кода.
  2. Иногда плагин не видит вариантов для дополнения. Особенно, если в файле есть ошибки. Что, конечно, логично, на исходник с ошибками полагаться нельзя, но тем не менее, не приятно.
  3. Плагин иногда не подсказывает имя метода класса, когда пишешь его вызов в теле другого метода того же класса. this->method_name — подсказывает. Просто начинаешь писать method_name — не подсказывает. Повторяется не всегда, я не могу конкретнее сказать, когда такое происходит — просто не исследовал.
  4. Недостаток, скорее не самого плагина, а моего скрипта выделения параметров компилятора из базы cmake. Допустим мы переходим к определению функции (или класса, чего угодно) в заголовочный файл сторонней библиотеки. Настройки компилятора для этого заголовочного файла плагину уже не известны и он теряется, выдает кучу ошибок на неизвестные типы и т.п.


Заключение


В данной статье я попытался описать тонкости настройки, которые, на мой взгляд, не достаточно хорошо описаны в документации. Я надеюсь, статья поможет тем разработчикам, которые, как и я, хотели бы иметь инструмент для быстрой проверки своих идей или для ведения небольших проектов, для которых расчехлять полноценную IDE не годится. ST2, с его богатыми возможностями по редактированию и навигации в тексте, вместе с плагином SublimeClang, становится отличным инструментом для разработчика.
+20
49.5k 163
Comments 29
Top of the day