Недавняя статья на Хабре напомнила мне о том, сколько времени я провел пытаясь написать свой плагин к Intellij IDEA. Официальная документация по созданию плагинов хоть и есть, но её неожиданно мало.
В этой статье я расскажу о том, как зарегистрировать свой тип файла в Intellij IDEA. Это может понадобиться если вы пишете свой языковой плагин или хотите запускать внешний редактор для файлов. В качестве примера возьмем файлы Apache JMeter (установка самого JMeter не требуется).
Итак, откроем существующий проект с plugin модулем или создадим новый. Как это сделать можно почитать в упомянутой статье и в официальном туториале.
Новый тип файла
Нам понадобится иконка размером 16x16 пикселей. Сохраним ее в папку и пометим папку как Source Root. Можно положить иконку прямо в icons
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.
Автор: Sinclair2K