Привет, Хабр!
У команды CLion множество отличных новостей — питерская часть команды вместе с другими коллегами успешно перебралась в новый офис, к нам присоединились новые классные разработчики, а главное, мы буквально на днях выпустили первое большое обновление в этом году, CLion 2019.1!
Работа в новой версии шла сразу по нескольким фронтам:
Подробнее об этих и других нововведениях читайте ниже. А чтобы попробовать новые возможности и улучшения, скачайте бесплатную 30-дневную версию CLion с нашего сайта.
Как вы уже знаете, в CLion два инструмента для поддержки языка C++ — один полностью свой, а второй основан на Clangd. Они работают совместно, дополняя друг друга и обмениваясь необходимой информацией. При этом, если производительность и критерий функциональной полноты позволяют, мы сейчас стараемся перенести умные средства по работе с кодом на C++ в CLion на инструмент на базе Clangd. Речь пока не идет про рефакторинги кода, но вот подсветка кода в 2019.1 сделана уже на базе Clangd. Это существенно улучшило “отзывчивость” редактора.
Еще несколько релизов назад мы перевели CLion на инструмент на базе Clangd при показе ошибок в редакторе. Теперь текст ошибок показывается более детально. Это пригодится, например, при отладке ошибок, связанных с перегрузкой функций:
К этому добавилась возможность вычисления позиции возможного исправления (quick-fix) тоже через Clangd. Само же исправление предоставляется непосредственно собственным инструментом CLion.
Еще одно интересное направление нашей работы — это написание новых проверок на инструменте парсинга кода на Clangd. Начиная с CLion 2019.1, новая проверка для кода на C++ подскажет, когда функцию-член класса можно объявить статической:
Кстати, управление настройками этого альтернативного инструмента на Clangd можно найти в Settings/Preferences | Languages & Frameworks | C/C++ | Clangd.
Производительность редактора является одной из наших самых приоритетных целей. Помимо множества небольших улучшений, в этом релизе стоит отметить существенное улучшение начального времени индексирования проекта. Оно случается не всегда, но в случаях, когда для своих проектов вы используете одни и те же библиотеки: тогда CLion может это автоматически заметить и переиспользовать символы для этих библиотек для нового открытого проекта, который их использует. Когда речь идет об STL или Boost, улучшения становятся очень заметными!
В наших планах на этот год повышение аккуратности и точности наших рефакторингов для C++. Мы начали с двух самых базовых — Rename и Extract. Для Extract мы поправили множество случаев, когда результат рефакторинга оказывался некорректным из-за неправильно учтенных квалификаторов пространства имен (например,
Применительно к Rename мы обратили внимание на случай, когда происходит переименование класса или структуры, совпадающей с именем файла, в котором они находятся. Раньше мы всегда переименовывали и файл тоже, а теперь CLion спрашивает вас о предпочтительном исходе во время рефакторинга. Можете переименовать, а можете оставить старое имя файла. В обратную сторону тоже работает — переименование файла не приводит к безусловному переименованию класса. (Где-то здесь должны быть крики из зала: “Наконец-то!”.)
И, кстати, чуть ниже я расскажу о возможности задавать стили header guards. Так вот, если использованный в файле header guard следует заданному шаблону стиля и при этом в его имени есть имя переименованного файла, то CLion обновит и header guard!
В версии 2019.1 мы добавили возможность переключиться на ClangFormat для форматирования кода в CLion. Это включает в себя не только само действие форматирования (
Переключиться на ClangFormat можно глобально — в настройках Settings/Preferences | Editor | Code Style. А можно только для конкретного проекта. Причем, если в проекте будет обнаружен конфигурационный файл .clang-format, CLion предложит переключиться на ClangFormat именно с использованием этого конфигурационного файла:
Чуть больше деталей можно найти в нашем блоге (на английском).
Именование переменных, типов и других символов в коде — сложный, порою даже философский вопрос. Но в мире программирования (для улучшения читаемости кода) давно придумали стили именования. Есть стиль LLVM, есть Qt, есть Google. Поэтому в настройках CLion Settings/Preferences | Editor | Code Style | C/C++ теперь появилась новая вкладка — Naming Convention, в которой можно выбрать один из предопределенных стилей или настроить свой, задав стиль именования для различных типов символов (макросов, глобальных функций, членов класса, параметров, локальных переменных и пр.). Выбранная конвенция будет использоваться во всех действиях IDE — кодогенерации, рефакторинга, автоматических исправлениях и т. д. Кроме того, если хочется еще более точно следить за выполнением правил именования, можно включить новую проверку Inconsistent Naming, которая покажет имена, не соответствующие правилам, и предложит вариант переименования:
В этой же вкладке можно найти настройки стиля header guards, которые я упоминала выше:
Кстати, если вы предпочитаете использовать
У нас наконец дошли руки до просмотра памяти в отладчике. В текущей версии можно посмотреть память по указателю: достаточно встать на любой указать в панели Variables во время отладки и запросить Memory View (
На следующий релиз уже запланированы изменения в UI/UX, но сначала хотелось бы собрать отзывы от пользователей. Так что пишите!
Ассемблерный код теперь разбит по функциям и, главное, показывается не только в случае GDB, но и для LLDB!
Стоит, правда, отметить, что ассемблерный код показывается до сих пор только в тех случаях, когда нет исходных кодов функции. Так называемый режим disassemble on demand пока не поддержан.
Иногда пошаговая отладка затягивается из-за длительного вычисления переменных на каждом шаге. Но ведь порою эти вычисления никому не нужны — хочется как можно быстрее пройти какую-то область кода по шагам, изредка просматривая значения пары переменных! Теперь в CLion появилась возможность отключить пересчет переменных при пошаговой отладке — Mute Variables в контекстном меню отладчика делает ровно это. А когда понадобится вычислить и отобразить значения, на переменной можно нажать Load:
Илья Моторный (elmot) уже писал здесь на Хабре про свой плагин для интеграции CLion с STM32CubeMX и поддержкой отладчика OpenOCD. В конце прошлого года Илья присоединился к нашей команде и уже успел существенно обновить плагин и перенести его внутрь CLion.
Довольно большой и детальный блог пост по обновленному плагину можно найти в нашем блоге. Здесь же я опишу самое главное, что теперь можно сделать:
У Ильи много грандиозных планов, поэтому нам очень важны ваши отзывы. Так что, если вам интересна разработка под встроенные системы в CLion, ждем вас в комментариях!
Некоторое время назад список поддерживаемых проектных моделей в CLion был расширен Gradle C++ и compilation database. С последним были проблемы, связанные с тем, что формат не включает информацию о сборке всего проекта, поэтому ни сборка, ни запуск, ни отладка проекта в случае compilation database не были возможны. Да и просто в случае известной CLion проектной модели, иногда хочется иметь таргет, который просто собирается какой-то командой в терминале.
Теперь для таких случаев есть Custom Targets (Settings/Preferences | Build, Execution, Deployment | Custom Build Targets) и Custom Run/Debug Configurations (Run | Edit Configurations…). В случае таргета надо задать параметры внешних инструментов (external tools), которые будут использоваться при сборке и очистке проекта:
А в случае проектно-независимой конфигурации для запуска и отладки надо указать таргет, исполняемый файл и желаемые аргументы для запуска:
Встречаются ли в вашем коде строковые литералы, внутри которых запрос SQL, HTML код или регулярное выражение? Если да, то наверняка вам бы хотелось хотя бы подсветить код внутри литерала в соответствии с его происхождением. Теперь это возможно! Временно включить в строковом литерале другой язык можно простым нажатием
Продукты в компании JetBrains как правило создаются не одной небольшой командой, а командой всей соответствующей платформы. Поэтому в CLion попадают возможности из IntelliJ IDEA, WebStorm, AppCode, DataGrip, PyCharm и пр. В этом релизе из таких улучшений стоит отметить:
На этом пока все. Спасибо, если дочитали до конца!
Ну, и традиционный ролик о новых возможностях CLion 2019.1 (на английском):
Вопросы, пожелания, баг-репорты и просто мысли высказывайте в комментариях! Мы будем рады ответить.
Ваша команда JetBrains CLion
The Drive to Develop
У команды CLion множество отличных новостей — питерская часть команды вместе с другими коллегами успешно перебралась в новый офис, к нам присоединились новые классные разработчики, а главное, мы буквально на днях выпустили первое большое обновление в этом году, CLion 2019.1!
Работа в новой версии шла сразу по нескольким фронтам:
- Усовершенствования поддержки языка C++: подсветка кода через Clangd, улучшения рефакторингов Extract и Rename, новая проверка на то, что функцию-член класса можно объявить статической.
- Больше возможностей в настройках стиля написания кода: интеграция с ClangFormat, поддержка стилей именования переменных в C/C++, поддержка разных стилей для header guards.
- Новые возможности и улучшения отладчика: просмотр состояния памяти — Memory View — для указателей, просмотр дизассемблированного кода в случае LLDB, ускорение работы пошаговой отладки.
- CLion для микроконтроллеров, первые шаги.
- Возможность создавать Build Targets и конфигурации для запуска/отладки в CLion, которые никак не связаны с проектной моделью.
- Работа с другими языками программирования в строковых литералах в С/С++.
- Новые визуальные темы и другие платформенные возможности.
Подробнее об этих и других нововведениях читайте ниже. А чтобы попробовать новые возможности и улучшения, скачайте бесплатную 30-дневную версию CLion с нашего сайта.
Поддержка языка C++
Clangd
Как вы уже знаете, в CLion два инструмента для поддержки языка C++ — один полностью свой, а второй основан на Clangd. Они работают совместно, дополняя друг друга и обмениваясь необходимой информацией. При этом, если производительность и критерий функциональной полноты позволяют, мы сейчас стараемся перенести умные средства по работе с кодом на C++ в CLion на инструмент на базе Clangd. Речь пока не идет про рефакторинги кода, но вот подсветка кода в 2019.1 сделана уже на базе Clangd. Это существенно улучшило “отзывчивость” редактора.
Еще несколько релизов назад мы перевели CLion на инструмент на базе Clangd при показе ошибок в редакторе. Теперь текст ошибок показывается более детально. Это пригодится, например, при отладке ошибок, связанных с перегрузкой функций:
К этому добавилась возможность вычисления позиции возможного исправления (quick-fix) тоже через Clangd. Само же исправление предоставляется непосредственно собственным инструментом CLion.
Еще одно интересное направление нашей работы — это написание новых проверок на инструменте парсинга кода на Clangd. Начиная с CLion 2019.1, новая проверка для кода на C++ подскажет, когда функцию-член класса можно объявить статической:
Кстати, управление настройками этого альтернативного инструмента на Clangd можно найти в Settings/Preferences | Languages & Frameworks | C/C++ | Clangd.
Собственный инструмент парсинга кода
Производительность редактора является одной из наших самых приоритетных целей. Помимо множества небольших улучшений, в этом релизе стоит отметить существенное улучшение начального времени индексирования проекта. Оно случается не всегда, но в случаях, когда для своих проектов вы используете одни и те же библиотеки: тогда CLion может это автоматически заметить и переиспользовать символы для этих библиотек для нового открытого проекта, который их использует. Когда речь идет об STL или Boost, улучшения становятся очень заметными!
В наших планах на этот год повышение аккуратности и точности наших рефакторингов для C++. Мы начали с двух самых базовых — Rename и Extract. Для Extract мы поправили множество случаев, когда результат рефакторинга оказывался некорректным из-за неправильно учтенных квалификаторов пространства имен (например,
std::
), специализаций шаблонов и переопределенных имен типов (type aliases).Применительно к Rename мы обратили внимание на случай, когда происходит переименование класса или структуры, совпадающей с именем файла, в котором они находятся. Раньше мы всегда переименовывали и файл тоже, а теперь CLion спрашивает вас о предпочтительном исходе во время рефакторинга. Можете переименовать, а можете оставить старое имя файла. В обратную сторону тоже работает — переименование файла не приводит к безусловному переименованию класса. (Где-то здесь должны быть крики из зала: “Наконец-то!”.)
И, кстати, чуть ниже я расскажу о возможности задавать стили header guards. Так вот, если использованный в файле header guard следует заданному шаблону стиля и при этом в его имени есть имя переименованного файла, то CLion обновит и header guard!
Стили кодирования
В версии 2019.1 мы добавили возможность переключиться на ClangFormat для форматирования кода в CLion. Это включает в себя не только само действие форматирования (
Ctrl+Alt+L
на Windows/Linux, ⌥⌘L
на macOS) или автоформатирование при печати кода, но и форматирование перед коммитом (pre-commit hook), при генерации кода средствами CLion, при рефакторингах и при применении исправлений (quick-fixes). В общем, в любом месте, где IDE форматирует код, будет вызываться ClangFormat.Переключиться на ClangFormat можно глобально — в настройках Settings/Preferences | Editor | Code Style. А можно только для конкретного проекта. Причем, если в проекте будет обнаружен конфигурационный файл .clang-format, CLion предложит переключиться на ClangFormat именно с использованием этого конфигурационного файла:
Чуть больше деталей можно найти в нашем блоге (на английском).
Именование переменных, типов и других символов в коде — сложный, порою даже философский вопрос. Но в мире программирования (для улучшения читаемости кода) давно придумали стили именования. Есть стиль LLVM, есть Qt, есть Google. Поэтому в настройках CLion Settings/Preferences | Editor | Code Style | C/C++ теперь появилась новая вкладка — Naming Convention, в которой можно выбрать один из предопределенных стилей или настроить свой, задав стиль именования для различных типов символов (макросов, глобальных функций, членов класса, параметров, локальных переменных и пр.). Выбранная конвенция будет использоваться во всех действиях IDE — кодогенерации, рефакторинга, автоматических исправлениях и т. д. Кроме того, если хочется еще более точно следить за выполнением правил именования, можно включить новую проверку Inconsistent Naming, которая покажет имена, не соответствующие правилам, и предложит вариант переименования:
В этой же вкладке можно найти настройки стиля header guards, которые я упоминала выше:
Кстати, если вы предпочитаете использовать
#pragma
, то просто поправьте шаблон новых заголовочных файлов в Settings/Preferences | Editor | File and Code Templates.Отладчик
Просмотр памяти Memory View
У нас наконец дошли руки до просмотра памяти в отладчике. В текущей версии можно посмотреть память по указателю: достаточно встать на любой указать в панели Variables во время отладки и запросить Memory View (
Ctrl+Enter
на Windows/Linux, ⌘Enter
на macOS). А если вкладка memory view открыта при пошаговой отладке, то в ней можно видеть подсвеченные изменения в памяти:На следующий релиз уже запланированы изменения в UI/UX, но сначала хотелось бы собрать отзывы от пользователей. Так что пишите!
Дизассемблирование в случае LLDB
Ассемблерный код теперь разбит по функциям и, главное, показывается не только в случае GDB, но и для LLDB!
Стоит, правда, отметить, что ассемблерный код показывается до сих пор только в тех случаях, когда нет исходных кодов функции. Так называемый режим disassemble on demand пока не поддержан.
Производительность пошаговой отладки
Иногда пошаговая отладка затягивается из-за длительного вычисления переменных на каждом шаге. Но ведь порою эти вычисления никому не нужны — хочется как можно быстрее пройти какую-то область кода по шагам, изредка просматривая значения пары переменных! Теперь в CLion появилась возможность отключить пересчет переменных при пошаговой отладке — Mute Variables в контекстном меню отладчика делает ровно это. А когда понадобится вычислить и отобразить значения, на переменной можно нажать Load:
CLion для микроконтроллеров
Илья Моторный (elmot) уже писал здесь на Хабре про свой плагин для интеграции CLion с STM32CubeMX и поддержкой отладчика OpenOCD. В конце прошлого года Илья присоединился к нашей команде и уже успел существенно обновить плагин и перенести его внутрь CLion.
Довольно большой и детальный блог пост по обновленному плагину можно найти в нашем блоге. Здесь же я опишу самое главное, что теперь можно сделать:
- В диалоге New Project можно создать проект STM32CubeMX (.ioc).
- Прямо из CLion запустить для проекта STM32CubeMX, чтобы обновить настройки микроконтроллера и сгенерировать код для проекта.
- CLion при этом сам сгенерирует корректный CMake-файл для работы с этим проектом.
- CLion предложит выбор конфигурационного файла для железа (board config).
- Для отладки с помощью OpenOCD нужно создать конфигурацию специального типа “OpenOCD Download and Run”. Для проекта STM32CubeMX CLion создаст такую сам. Указав все настройки, можно отлаживаться на микроконтроллере прямо из CLion!
У Ильи много грандиозных планов, поэтому нам очень важны ваши отзывы. Так что, если вам интересна разработка под встроенные системы в CLion, ждем вас в комментариях!
Проектно-независимые таргеты и конфигурации
Некоторое время назад список поддерживаемых проектных моделей в CLion был расширен Gradle C++ и compilation database. С последним были проблемы, связанные с тем, что формат не включает информацию о сборке всего проекта, поэтому ни сборка, ни запуск, ни отладка проекта в случае compilation database не были возможны. Да и просто в случае известной CLion проектной модели, иногда хочется иметь таргет, который просто собирается какой-то командой в терминале.
Теперь для таких случаев есть Custom Targets (Settings/Preferences | Build, Execution, Deployment | Custom Build Targets) и Custom Run/Debug Configurations (Run | Edit Configurations…). В случае таргета надо задать параметры внешних инструментов (external tools), которые будут использоваться при сборке и очистке проекта:
А в случае проектно-независимой конфигурации для запуска и отладки надо указать таргет, исполняемый файл и желаемые аргументы для запуска:
Injected Language
Встречаются ли в вашем коде строковые литералы, внутри которых запрос SQL, HTML код или регулярное выражение? Если да, то наверняка вам бы хотелось хотя бы подсветить код внутри литерала в соответствии с его происхождением. Теперь это возможно! Временно включить в строковом литерале другой язык можно простым нажатием
Alt+Enter
и выбором опции “Inject language or reference”. Теперь выбираем нужный нам язык и в еще недавно обычном строковом литерале появляется подсветка выбранного языка, а также все специальные действия. Самый яркий пример — регулярные выражения и возможность проверки строки на соответствие им прямо в IDE:И многое другое
Продукты в компании JetBrains как правило создаются не одной небольшой командой, а командой всей соответствующей платформы. Поэтому в CLion попадают возможности из IntelliJ IDEA, WebStorm, AppCode, DataGrip, PyCharm и пр. В этом релизе из таких улучшений стоит отметить:
- Просмотр всех мест в коде проекта, где разработчик производил какие-то изменения или просто читал код, — Recent Locations Popup (
Shift+Ctrl+E
на Win/Lin,⇧⌘E
на macOS). - Создание новых тем для интерфейса IDE, в дополнение к стандартным светлой, темной (Darcula) и контрастной (High-Contrast). Примеры таких тем-плагинов и пошаговый туториал можно найти в нашей документации.
- Кстати, о плагинах. Если вы пишете на Rust, то наверняка знаете, что есть плагин IntelliJ Rust. В CLion его версия включает поддержку Cargo и отладчик. А с новым релизом в плагине появились инструменты профилирования кода на Линуксе и macOS, возможность автодополнения еще не импортированных символов, а также другие улучшения.
На этом пока все. Спасибо, если дочитали до конца!
Демо
Ну, и традиционный ролик о новых возможностях CLion 2019.1 (на английском):
Вопросы, пожелания, баг-репорты и просто мысли высказывайте в комментариях! Мы будем рады ответить.
Ваша команда JetBrains CLion
The Drive to Develop