- PVSM.RU - https://www.pvsm.ru -

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

Недавняя статья [1]на Хабре напомнила мне о том, сколько времени я провел пытаясь написать свой плагин к Intellij IDEA. Официальная документация по созданию плагинов хоть и есть, но её неожиданно мало.

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

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

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

Нам понадобится иконка размером 16x16 пикселей. Сохраним ее в папку /resources/icons и пометим папку как Source Root. Можно положить иконку прямо в src.
Пишем плагин к Intellij IDEA: Регистрация типа файла

Каждый тип файла в 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’ах к интерфейсу [4], оговорю лишь несколько моментов.

  • Синглтоны в коде 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 и видим как наш тип файла зарегистрирован:
Пишем плагин к Intellij IDEA: Регистрация типа файла

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

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

Поскольку 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. Но это выходит за рамки статьи.

Запускаем и видим результат:
Пишем плагин к Intellij IDEA: Регистрация типа файла

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

  • com.intellij.lang.Language
  • com.intellij.openapi.fileTypes.LanguageFileType
  • com.intellij.openapi.fileTypes.SyntaxHighlighterFactory (или LanguageFileTypeHighlighterProvider)

Итого

Итак, у нас получилось зарегистрировать новый тип файла в Intellij IDEA с иконкой и подсветкой синтаксиса. Больше информации по разработке плагинов можно почерпнуть из официальной документации [5], исходного кода Intellij IDEA [6] или на форуме [7]. Полный код к посту можно найти на GitHub [8].

Автор: Sinclair2K


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/12883

Ссылки в тексте:

[1] статья : http://habrahabr.ru/post/148996

[2] Apache JMeter: http://jmeter.apache.org/

[3] туториале: http://confluence.jetbrains.net/display/IDEADEV/Getting+Started+with+Plugin+Development

[4] интерфейсу: https://github.com/JetBrains/intellij-community/blob/idea/117.798/platform/core-api/src/com/intellij/openapi/fileTypes/FileType.java

[5] официальной документации: http://confluence.jetbrains.net/display/IDEADEV/PluginDevelopment

[6] исходного кода Intellij IDEA: https://github.com/JetBrains/intellij-community

[7] форуме: http://devnet.jetbrains.net/community/idea/open_api_and_plugin_development

[8] найти на GitHub: https://github.com/ponomandr/idea-plugin-tutorial-1