Intellij idea подсветка кода

Colors and fonts

As a developer, you work with a lot of text resources: the source code in the editor, search results, debugger information, console input and output, and so on. Colors and font styles are used to format this text and help you better understand it at a glance.

IntelliJ IDEA uses color schemes that define the preferred colors and fonts.

A color scheme is not the same as the interface theme, which defines the appearance of windows, dialogs, and controls.

You can use a predefined color scheme or customize it to your liking. It is also possible to share schemes.

Select a color scheme

Press Ctrl+Alt+S to open the IDE settings and select Editor | Color Scheme .

Use the Scheme list to select a color scheme.

By default, there are the following predefined color schemes:

Classic Light : designed for the macOS Light and Windows 10 Light interface themes

Darcula : designed for the Darcula interface theme

High contrast : designed for the High contrast interface theme (recommended for users with sight deficiency)

IntelliJ Light : designed for the IntelliJ Light interface theme

If you install a plugin with a color scheme, that scheme will be added to the list of predefined schemes. For more information, see Share color schemes.

Customize a color scheme

You can customize a predefined color scheme, but it is recommended to create a duplicate for your custom color and font settings:

Duplicate a color scheme

Press Ctrl+Alt+S to open the IDE settings and select Editor | Color Scheme .

Select a color scheme, click , and then click Duplicate .

(Optional) To rename your custom scheme, click and select Rename .

Predefined color schemes are listed in bold font. If you customize a predefined color scheme, it will be displayed in blue. To restore a predefined color scheme to default settings, click and select Restore Defaults . You cannot remove predefined color schemes.

To define color and font settings, open the Editor | Color Scheme page of the IDE settings Ctrl+Alt+S . The settings under Editor | Color Scheme are separated into sections. For example, the General section defines basic editor colors, such as the gutter, line numbers, errors, warnings, popups, hints, and so on. The Language Defaults section contains common syntax highlighting settings, which are applied to all supported programming languages by default. In most cases, it is sufficient to configure Language Defaults and make adjustments for specific languages if necessary. To change inherited color settings for an element, clear the Inherit values from checkbox.

Semantic highlighting

By default, the color scheme defines syntax highlighting for reserved words and other symbols in your source code: operators, keywords, suggestions, string literals, and so on. If you have a function or method with many parameters and local variables, it may be hard to distinguish them from one another at a glance. You can use semantic highlighting to assign a different color to each parameter and local variable.

Enable semantic highlighting

Press Ctrl+Alt+S to open the IDE settings and select Editor | Color Scheme | Language Defaults | Semantic highlighting .

Select the Semantic highlighting checkbox and customize the color ranges if necessary.

This will enable semantic highlighting for all languages that inherit this setting from Language Defaults . To enable it for a specific language instead (for example, Java) go to the Editor | Color Scheme | Java | Semantic highlighting page of the IDE settings Ctrl+Alt+S , clear the Inherit values from checkbox, and select the Semantic highlighting checkbox.

Share color schemes

If you are used to a specific color scheme, you can export it from one installation and import it to another one. You can also share color schemes with other developers. If necessary, you can import your favorite color settings from Eclipse.

Export a color scheme as XML

IntelliJ IDEA can save your color scheme settings as an XML file with the .icls extension. You can then import the file to another installation.

Press Ctrl+Alt+S to open the IDE settings and select Editor | Color Scheme .

From the Scheme list, select a color scheme, click , then click Export and select IntelliJ IDEA color scheme (.icls) .

Specify the name and location of the file and save it.

Export a color scheme as a plugin

The plugin can be uploaded to the plugin repository for others to install. This format has several benefits over an XML file, including metadata, feedback, download statistics, and versioning (when you upload a new version of the plugin, users will be notified about it).

Press Ctrl+Alt+S to open the IDE settings and select Editor | Color Scheme .

From the Scheme list, select a color scheme, click , then click Export and select Color scheme plugin .jar .

In the Create Color Scheme Plugin dialog, specify the version details and vendor information. Then click OK .

When you install a plugin with a color scheme, that scheme will be added to the list of predefined schemes.

Import a color scheme

Press Ctrl+Alt+S to open the IDE settings and select Editor | Color Scheme .

From the Scheme list, select a color scheme, click , then click Import Scheme .

Fonts

To customize the default font, open the Editor | Font page of the IDE settings Ctrl+Alt+S . This font is used and inherited in all color schemes by default. For more information, see Font.

IntelliJ IDEA can use any font that’s available in your operating system. To add another font to the list, either install it in the operating system or into the Java runtime that is used run IntelliJ IDEA.

Customize the color scheme font

You can set a different font for your current scheme.

Читайте так же:  Samsung ue40h6200ak нет изображения подсветка есть

This is not recommended if you are planning to share your scheme or use it on other platforms that may not support the selected font. In such cases, use the default global font settings.

Press Ctrl+Alt+S to open the IDE settings and select Editor | Color Scheme | Color Scheme Font .

Select the Use color scheme font instead of the default checkbox.

Customize the console font

By default, text in the console uses the same font as the color scheme. To use a different font in the console:

Press Ctrl+Alt+S to open the IDE settings and select Editor | Color Scheme | Console Font .

Select the Use console font instead of the default checkbox.

Productivity tips

See the color scheme settings for the current symbol

Put the caret at the necessary symbol, press Ctrl+Shift+A , find the Jump to Colors and Fonts action, and execute it.

This will open the relevant color scheme settings for the symbol under the caret.

See which fonts are currently used in the editor

Press Ctrl+Shift+A , find the Show Fonts Used by Editor action, and execute it.

This will open the Fonts Used in Editor dialog with a list of fonts.

Both the Jump to Colors and Fonts and the Show Fonts Used by Editor actions do not have a default shortcut. To assign a shortcut for an action, select it in the Find Action popup and press Alt+Enter .

Источник

Разработка плагина IntelliJ IDEA. Часть 5

В этой части: подсветка, ссылочная система, автодополнение, навигация по коду. Предыдущая часть здесь.

Подсветка синтаксиса и ошибок

Класс, используемый в IDEA для определения, как соответствующий текстовый диапазон должен быть подсвечен, называется TextAttributesKey. Экземпляр этого класса создается для каждого различного типа элементов, которые должны быть подсвечены (ключевые слова, числа, строки, комментарии и т.д.), он определяет атрибуты по-умолчанию, которые применяются к элементам соответствующего типа (например, ключевые слова выделяются полужирным, числа – синим, строки – курсивом и зеленым фоном). Отображение TextAttributesKey на специфические атрибуты, используемые в редакторе, определено классом EditorColorsScheme и может быть настроено пользователем, если плагин предоставляет соответствующий конфигурационный интерфейс. В подсветке может использоваться наложение нескольких TextAttributeKey: например, один ключ может определять начертание, а другой – цвет элемента.

Базовая подсветка синтаксиса

Подсветка синтаксиса и ошибок выполняется на разных уровнях. На первом – подсветка синтаксиса, основанная на результатах лексического разбора, осуществляется посредством интерфейса SyntaxHighlighter. Этот интерфейс возвращает экземпляры TextAttributeKey для каждого типа токенов, который требует особую подсветку. Для подсвечивания ошибок лексера применяется стандартный объект класса TextAttributeKey для недопустимых символов ( HighligherColors.BAD_CHARACTER ).

Схема управления цветом немного изменилась в Intelli IDEA 12.1, чтобы облегчить работу дизайнеров схем и сделать одинаковое отображение для различных языков программирования, даже если схема не была изначально предназначена для них. Ранее языковые плагины использовали фиксированные цветовые схемы не всегда совместимые, например, с темными темами. Новая реализация позволяет определить зависимости от набора стандартных текстовых атрибутов, привязанных к схеме, а не конкретному языку. Атрибуты для специфических языков все еще могут быть установлены дизайнером схемы, но теперь они необязательны. Новые цветовые схемы получили расширение .icls во избежание проблем с совместимостью.
Теперь для определения текстовых атрибутов и зависимости от стандартных ключей используется класс DefaultLanguageHighlighterColors.

На втором уровне подсветки – выделение ошибок, произошедших во время синтаксического разбора. Если определенная цепочка токенов не соответствует грамматике языка, метод PsiBuilder.error() может быть использован для подсветки неверных токенов и отображения сообщения об ошибке.

Аннотации

Третий уровень подсветки выполняется с помощью интерфейса Annotator. Плагин может зарегистрировать одну или несколько аннотаций в точках расширения com.intellij.annotator , после чего они будут вызваны в фоновом процессе во время подсветки элементов PSI-дерева пользовательского языка. Аннотации могут анализировать не только синтаксис, но и семантику и таким образом предоставлять более тонкую логику обработки и подсветки ошибок. Аннотация может содержать функциональность для решения обнаруженных проблем (т.н. quick fix).

Когда файл изменен, аннотация вызывается инкрементально для обработки только изменившихся элементов PSI-дерева.
Для подсветки определенного диапазона текста как ошибки или предупреждения, аннотация вызывает createErrorAnnotation() или createWarningAnnotation() на объекте типа AnnotationHolder, и опционально registerFix() на возвращаемом объекте класса Annotator для добавления логики исправления ошибки. Для применения дополнительной подсветки, аннотация может вызвать AnnotationHolder.createInfoAnnotation() с пустым сообщением и затем, вызвав Annotation.setTextAttributes(), установить атрибуты текста.

Внешние аннотации

Наконец, если в пользовательском языке используется внешние средства для валидации файлов, их результаты можно предоставить, реализовав интерфейс ExternalAnnotator и зарегистрировав его в точке расширения com.intellij.externalAnnotator . Подсветка с помощью ExternalAnnotator имеет наименьший приоритет и выполняется только после выполнения всех фоновых процессов. Внешние аннотации используют тот же интерфейс AnnotationHolder для адаптации вывода внешних инструментов и показа подсветки.

Страница настроек цвета

Плагин также может предоставить конфигурационный интерфейс, позволяющий пользователю настраивать цвета определенных элементов. Для этого необходимо создать экземпляр класса ColorSettingPage и зарегистрировать его в точке расширения com.intellij.colorSettingsPage .

Функция «Export to HTML» использует тот же механизм подсветки, что и редактор, поэтому становится доступной для пользовательского языка сразу после реализации SyntaxHighlighter.

Ссылочная система IntelliJ IDEA

Одна из наиболее важных и запутанных частей в реализации программной структуры пользовательского языка – это разрешение ссылок, т.е. способность проследовать от места использования элемента (переменная в выражении, вызов метода и т.д.) к месту определения (декларации переменной, метода и т.п.). Это требуется для поддержки многих функций IDEA, таких как «Go to Declaration» (Ctrl-B и Ctrl-Click), а также при поиске использований, переименовании, автодополнении.

Каждый PSI-элемент, который должен работать ссылкой обязан переопределить метод PsiElement.getReference(), так чтобы он возвращал соответствующую реализацию интерфейса PsiReference. Этот интерфейс может быть реализован как самим классом PsiElement, так и отдельным. Если элемент может содержать несколько ссылок (например, строка с перечислением классов), то в таком случае он должен реализовать метод PsiElement.getReferences(), возвращающий массив из ссылок.

Главный метод интерфейса PsiReference – это resolve(), который возвращает либо элемент, на который указывает ссылка, либо null, если невозможно разрешить ссылку (например, если указывает на неопределенный класс). Противоположный ему метод isReferenceTo(), который проверяет, указывает ли ссылка на конкретный элемент. Последний метод может быть реализован с помощью вызова resolve() и сравнения результата с переданным PSI-элементом, но позволяет разработчику применить дополнительные оптимизации.

Читайте так же:  Рамка для японского номера с подсветкой

Пример: Ссылка на ResourceBundle в плагине Properties.

IDEA предоставляет множество интерфейсов, которые могут быть использованы как база для реализации поддержки ссылок, а именно интерфейс PsiScopeProcessor и метод PsiElement.processDeclarations(). Эти интерфейсы обладают множеством сложностей, которые не обязательны для большинства пользовательских языков (например, поддержка подстановки обобщенных типов), но они необходимы, если пользовательский язык может ссылаться на Java код. Если интероперабельность с Java не требуется, либо имеются другие причины, плагин может переопределить стандартную реализацию разрешения ссылок.

Стандартные вспомогательные классы IDEA, используемые для разрешения ссылок, состоят из следующих компонентов:

  • класса, реализующего интерфейс PsiScopeProcessor, который собирает возможные определения ссылок и останавливает процесс разрешения, когда он полностью завершен. Главный метод, который необходимо реализовать – это execute(), который вызывается для обработки каждого определения и возвращает false, когда определение найдено;
  • функция, которая обходит дерево от места обнаружения ссылки и до ее разрешения или выхода из области видимости;
  • PSI-элементы, на которых вызывается метод processDeclarations() во время обхода PSI-дерева. Если элемент является определением, то он передает ссылку на самого себя в метод execute(). Если необходимо в соответствии с языковыми правилами определения областей видимости, элемент может передать PsiScopeProcessor в свои дочерние элементы.

Существует расширение интерфейса PsiReference, которое позволяет ссылкам использовать несколько целевых элементов – PsiPolyVariantReference. Целевые элементы ссылки возвращаются методом multiResolve(). Действие «Go to Declaration» для такого типа ссылок позволяет выбрать какой именно элемент использовать для навигации. Реализация multiResolve() может быть основана на PsiScopeProcessor, если вместо остановки поиска после первого найденного результата продолжить собирать остальные целевые элементы.

С другой стороны в IntelliJ IDEA существует подход к реализации ссылочной системы посредством Reference Contributor и Reference Provider.
PsiReferenceContributor проверяет каждый PsiElement и по соответствующему описанию, заданному пользователем, возвращает зарегистрированный для данного случая объект провайдера ссылок (пример). В свою очередь, PsiReferenceProvider – это класс, предназначенный для нахождения ссылок внутри одного элемента PSI дерева. Он возвращает массив объектов PsiReference (пример).
Метод PsiReferenceProvider.getReferencesByElement() должен возвратить список ссылок (PsiReference), которые содержатся в переданном ему элементе PsiElement. В данном случае возвращается только одна ссылка, но в общем случае их может быть несколько, при этом каждая ссылка должна будет содержать соответствующий textRange (начальный индекс и конечный индекс нахождения ссылки внутри текста PSI-элемента).

Reference Contributor должен быть зарегистрирован в файле plugin.xml в соответствующей точке расширения — com.intellij.psi.referenceContributor.
После чего возможно использовать результаты его работы для получения списка ссылок при реализации метода PsiElement.getReferences(). Чтобы не дублировать этот код в каждом ссылочном элементе можно определить базовый класс для пользовательских Psi-элементов:

Автодополнение кода

Существует два основных типа автодополнения, которые могут быть использованы в пользовательском языковом плагине: простое ссылочное дополнение и дополнение на базе провайдера.

Простое автодополнение

Для заполнения списка дополнения, IDEA вызывает метод PsiReference.getVariants() либо у ссылки под курсором, либо у фиктивного элемента, который помещается под курсором. Этот метод должен возвратить массив объектов, содержащий строки, PSI-элементы, либо экземпляры класса LookupElement. Если в возвращенном массиве обнаружен экземпляр PsiElement, то в списке дополнения отобразится соответствующая ему иконка.
Наиболее распространенный способ реализации getVariants() является использование той же функции обхода дерева, что и в методе PsiReference.resolve(), но возвращающей все найденные определения.

Автодополнение на базе провайдера

Реализация дополнения на базе интерфейса CompletionContributor дает наибольший контроль над операцией автодополнения кода.
Основной сценарий использования Completion Contributor состоит из вызова метода extend() и передачи в параметр «pattern» соответствующего контекста, в котором применим данный вариант дополнения, в параметр «provider» передается провайдер дополнений, который генерирует соответствующие пункты списка автодополнения.

Пример: CompletionContributor для автодополнения ключевых слов в файлах MANIFEST.MF.

Пункты в списке автодополнения представлены экземплярами интерфейса LookupElement. Эти объекты обычно создаются с помощью LookupElementBuilder. Для каждого из них можно определить следующие атрибуты:

  • основной текст, дополнительный текст, строка с типом – дополнительный текст показывается сразу за основным, но не используется для поиска совпадений, предназначен в основном для показа списка параметров метода. Строка, содержащая тип дополняемого выражения, в списке дополнений выравнена по правому краю, обычно показывает возвращаемый тип метода или содержащий его класс;
  • иконку;
  • атрибуты текста;
  • обработчик при вставке текста – это метод обратного вызова, исполняемый, когда выбран какой-либо пункт из списка дополнения, может быть использован, например, для вставки скобок после вызова метода.

Поиск использований

Действие «Find Usages» в IDEA – это многошаговый процесс, каждый шаг которого требует участия со стороны плагина: в виде реализации и регистрации FindUsagesProvider в точке расширения com.intellij.lang.findUsagesProvider, а также особенностей реализации программной структуры (интерфейсы PsiNamedElement и PsiReference).

Для реализации данной функции должны быть выполнены следующие шаги:

  • до того как выполнить действие «Find Usages», IDEA строит индекс слов, представленных в каждом файле пользовательского языка. Используя реализацию WordsScanner, полученную от FindUsagesProvider.getWordsScanner(), IDEA загружает содержимое каждого файла и передает его в сканер слов, вместе с обработчиком слов. Сканер разбивает текст на слова, определяет контекст каждого слова (код, комментарии, строки) и передает их обработчику. Простейший путь реализации сканера – использование класса DefaultWordsScanner;
  • когда пользователь вызывает действие «Find Usages», IDEA определяет элемент, ссылки на который требуется найти. PSI-элемент под курсором (или прямой родитель в дереве токена под курсором) должен быть PsiNamedElement или ссылкой на таковой. IDEA будет использовать кэш слов для поиска текста возвращенного PsiNamedElement.getName(). Если текстовый диапазон PsiNamedElement включает другой текст помимо идентификатора, возвращенного getName(), метод getTextOffset() должен быть переписан так, чтобы возвращать стартовое смещение идентификатора;
  • как только элемент обнаружен, IDEA вызывает FindUsagesProvider. canFindUsagesFor(), чтобы узнать применимо ли действие к данному элементу;
  • когда пользователю показывается диалог «Find Usages», IDEA вызывает FindUsagesProvider.getType() и FindUsagesProvider.getDescriptiveName(), для того чтобы определить, как следует отображать этот элемент;
  • для каждого файла, содержащего найденные слова, IDEA строит PSI-дерево и производит рекурсивный спуск. IDEA разбивает текст каждого элемента на слова и сканирует их. Если элемент проиндексирован как идентификатор, то для каждого слова проверяется, не указывает ли оно на искомый элемент;
  • после того как все использования найдены, результаты показываются на панели использований. Текст для отображения пользователю берется из метода FindUsagesProvider.getNodeText().

Чтобы корректно отобразить название найденного элемента в заголовке панели Find Usages необходимо предоставить реализацию интерфейса ElementDescriptionProvider. Объект ElementDescriptionLocation, который передается в провайдер в этом случае должен иметь актуальный тип UsageViewLongNameLocation.

В следующей части: рефакторинги, форматирование и др.

Источник

Оцените статью
Охраны в доме нет
Adblock
detector