Как стать автором
Обновить

Пишем плагин к Intellij IDEA: Регистрация типа файла

Время на прочтение3 мин
Количество просмотров7.3K
Недавняя статья на Хабре напомнила мне о том, сколько времени я провел пытаясь написать свой плагин к Intellij IDEA. Официальная документация по созданию плагинов хоть и есть, но её неожиданно мало.

В этой статье я расскажу о том, как зарегистрировать свой тип файла в Intellij IDEA. Это может понадобиться если вы пишете свой языковой плагин или хотите запускать внешний редактор для файлов. В качестве примера возьмем файлы Apache JMeter (установка самого JMeter не требуется).

Итак, откроем существующий проект с plugin модулем или создадим новый. Как это сделать можно почитать в упомянутой статье и в официальном туториале.

Новый тип файла


Нам понадобится иконка размером 16x16 пикселей. Сохраним ее в папку /resources/icons и пометим папку как Source Root. Можно положить иконку прямо в src.


Каждый тип файла в IntelliJ представлен в виде имплементации интерфейса com.intellij.openapi.fileTypes.FileType. Создадим собственную реализацию:

public class JMeterFileType implements FileType {
    public static final JMeterFileType INSTANCE = new JMeterFileType();

    @NotNull @Override
    public String getName() { return "JMeter"; }

    @NotNull @Override
    public String getDescription() { return "JMeter file"; }

    @NotNull @Override
    public String getDefaultExtension() { return "jmx"; }

    @Override
    public boolean isBinary() { return false; }

    @Override
    public boolean isReadOnly() { return false; }

    @Override
    public Icon getIcon() {
        return IconLoader.getIcon("/icons/beaker.png");
    }

    @Override
    public String getCharset(@NotNull VirtualFile file, byte[] bytes) {
        return CharsetToolkit.UTF8;
    }
}

Назначение методов можно почитать в JavaDoc’ах к интерфейсу, оговорю лишь несколько моментов.
  • Синглтоны в коде Intellij IDEA используются повсеместно. Обычно я стараюсь их избегать, но здесь я следую общему стилю, создав поле INSTANCE, которое нам скоро понадобится.
  • Если isReadOnly возвращает true, то тип файла можно изменить в настройках File > Settings > File Types.
  • isBinary влияет на то, будет ли файл открываться в текстовом редакторе. Файлы JMeter — это Java объекты, сериализованные в XML с помощью XStream. Руками такие файлы писать особого смысла нет, зато можно отслеживать изменения в системе контроля версий.

Регистрация типа файла


Следующий шаг — регистрация типа файла в системе. Для этого нам понадобится наследник класса com.intellij.openapi.fileTypes.FileTypeFactory:

public class JMeterFileTypeFactory extends FileTypeFactory {
    @Override
    public void createFileTypes(@NotNull FileTypeConsumer consumer) {
        consumer.consume(JMeterFileType.INSTANCE);
    }
}

Осталось прописать JMeterFileTypeFactory в plugin.xml
<idea-plugin version="2">
  ...
  <extensions defaultExtensionNs="com.intellij">
    ...
    <fileTypeFactory implementation="idea.plugin.jmeter.JMeterFileTypeFactory"/>
  </extensions>
</idea-plugin>

Готово!

Посмотрим что получилось. Запустим плагин, при этом запустится новый экземпляр Intellij IDEA. Откроем File > Settings > File Types и видим как наш тип файла зарегистрирован:


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


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


Поскольку JMeter файлы — это обычный XML, давайте добавим подсветку синтаксиса. Делается это одной строчкой в plugins.xml:
<idea-plugin version="2">
  ...
  <extensions defaultExtensionNs="com.intellij">
    ...
    <syntaxHighlighter key="JMeter"
                       implementationClass="com.intellij.ide.highlighter.XmlFileHighlighter"/>
  </extensions>
</idea-plugin>

… ну или почти одной. Здесь:
  • key — это значение, возвращаемое JMeterFileType.getName().
  • implementationClass — это имплементация SyntaxHighlighter.

Существует несколько готовых реализаций подсветки синтаксиса: HTML, Java, Regexp и др. Само собой можно создать свой SyntaxHighlighter. Но это выходит за рамки статьи.

Запускаем и видим результат:


Подсветка синтаксиса для языковых плагинов немного отличается. Подробно останавливаться не буду. Перечислю только классы, на которые стоит обратить внимание:
  • com.intellij.lang.Language
  • com.intellij.openapi.fileTypes.LanguageFileType
  • com.intellij.openapi.fileTypes.SyntaxHighlighterFactory (или LanguageFileTypeHighlighterProvider)

Итого


Итак, у нас получилось зарегистрировать новый тип файла в Intellij IDEA с иконкой и подсветкой синтаксиса. Больше информации по разработке плагинов можно почерпнуть из официальной документации, исходного кода Intellij IDEA или на форуме. Полный код к посту можно найти на GitHub.
Теги:
Хабы:
+28
Комментарии1

Публикации

Изменить настройки темы

Истории

Работа

Java разработчик
352 вакансии

Ближайшие события