Sublime Text
Плагин доступен для установки из Package Control по названию WebFont.
Вызов плагина осуществляется клавишами Ctrl+Alt+F.
Обновление списка шрифтов автоматически.
Поддерживаются Sublime Text >= 3.
Visual Studio Code
Установить плагин можно из списка плагинов в редакторе: File > Preferences > Extensions > Webfont. После установки перезапустить редактор.
Запуск плагина из контекстного меню или Command Palette
Обновление списка шрифтов автоматически.
WebStorm
Установить плагин можно из списка плагинов в редакторе: File > Settings > Plugins. После установки перезапустить редактор.
Вызов плагина осуществляется клавишами Ctrl+Alt+F.
Обновление списка шрифтов автоматически.
Поддерживаются WebStorm и PhpStorm.
Плагин для webstorm и авто-дополнение
Хотелось бы поделиться простым способом добавить недостающее авто-дополнение в IDE семейства IDEA. В нашем случае к WebStorm или PhpStrom.
У нас на проекте на фронте используется библиотека require.js. И при работе с ней нужно указывать пути к тем или иным файлам что бы добавить их в зависимости. К сожалению пути к этим файлам приходиться писать руками или копировать по частям.
И я подумал что это нужно бы исправить, и добавить авто дополнение пути до файлов.
После этого я начал искать информацию как писать плагины к Idea и вспомнил о статье хабраюзера zenden2k, в которой он рассказывал как сделать плагин для разрешения ссылок для kohana. Перед прочтением моей статьи обязательно нужно её прочитать.
Решив что разрешение ссылок тоже очень полезный функционал, я для начала написал плагин именно для этого.
При написании плагина я столкнулся с проблемой отсутствия PSI структуры для javascript файлов в Idea Community Edition, а без этого было не возможно определить структуру файла JS, которая нужна для определения нужного элемента для разрешения ссылки. Мне пришлось поставить себе Idea Ultimate EAP. В Idea UT нужно поставить плагин для Javascript, и тогда в PSI Viewer (Tools ->View PSI Structure) будет доступен выбор PSI структуры для Javascript файлов.
Скриншот
Так же в связи с тем что со времени написания той статьи JetBrains выкатили openapi для PHP и JS, я использовал привязку уже к конкретному PSI элементу JSLiteralExpression. Мой PsiReferenceContributor стал выглядеть так:
RequirejsPsiReferenceContributor.java
package requirejs; import com.intellij.lang.javascript.psi.JSLiteralExpression; import com.intellij.patterns.StandardPatterns; import com.intellij.psi.PsiReferenceContributor; import com.intellij.psi.PsiReferenceRegistrar; public class RequirejsPsiReferenceContributor extends PsiReferenceContributor < @Override public void registerReferenceProviders(PsiReferenceRegistrar psiReferenceRegistrar) < RequirejsPsiReferenceProvider provider = new RequirejsPsiReferenceProvider(); psiReferenceRegistrar.registerReferenceProvider(StandardPatterns.instanceOf(JSLiteralExpression.class), provider); >>
Как видно вместо PsiElement.class я уже использовал конкретно JSLiteralExpression.class, что бы не приходилось обрабатывать все подряд элементы.
Но для того что бы можно было использовать openapi нужно подключить его в проекте плагина в idea. Для этого нужно зайти в Project Structure, там выбрать Libraries. Нажимаем на + над центральной колонкой, выбираем Java и в открывшемся окне выбора файла выбираем файл «/path_to_webstrom/plugins/JavaScriptLanguage/lib/javascript-openapi.jar»:
Скриншот

Потом переходим к Modules, открываем вкладку Dependencies, и там на против javascript-openapi указываем Scope как Provided:
Скриншот

После этих манипуляций IDE будет подсказывать названия классов и других вещей что входят в openapi для javascript.
Так же нужно было изменить PsiReferenceProvider, избавив его от рефлексии, вышло примерно так:
RequirejsPsiReferenceProvider.java
package requirejs; import com.intellij.ide.util.PropertiesComponent; import com.intellij.lang.javascript.psi.JSCallExpression; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReferenceProvider; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; public class RequirejsPsiReferenceProvider extends PsiReferenceProvider < @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) < Project project = psiElement.getProject(); PropertiesComponent properties = PropertiesComponent.getInstance(project); String webDirPrefString = properties.getValue("web_dir", "webfront/web"); VirtualFile webDir = project.getBaseDir().findFileByRelativePath(webDirPrefString); if (webDir == null) < return PsiReference.EMPTY_ARRAY; >try < String path = psiElement.getText(); if (isRequireCall(psiElement)) < PsiReference ref = new RequirejsReference(psiElement, new TextRange(1, path.length() - 1), project, webDir); return new PsiReference[] ; > > catch (Exception ignored) <> return new PsiReference[0]; > public static boolean isRequireCall(PsiElement element) < PsiElement prevEl = element.getParent(); if (prevEl != null) < prevEl = prevEl.getParent(); >if (prevEl != null) < if (prevEl instanceof JSCallExpression) < try < if (prevEl.getChildren().length >1) < if (prevEl.getChildren()[0].getText().toLowerCase().equals("require")) < return true; >> > catch (Exception ignored) <> > > return false; > >
Далее необходимо реализовать метод отвечающий за разрешение данной ссылки.
И вот тут у меня возник затык связанный с очень скупой информацией о написании плагинов к idea. Дело в том что изначально у меня было желание начинать поиск файлов от директорий помеченных как «Resource Root», но увы я не смог найти как можно получить такие директории. Поэтому решил брать путь до директории из настроек, для чего реализовал страницу настройки как в описано в статье zenden2k, поэтому не буду повторяться.
После того как мы узнали директорию в которой нам нужно искать файлы по пути, всё было просто. У класса VirtualFile есть метод findFileByRelativePath, который принимает на вход строку пути, и ищет существует ли файл по данному пути и есть да, то возвращает его как экземпляр VirtualFile класса. Так что нужно было взять значение строки из PsiElement, вырезать лишнее, добавить недостающее и проверить существует ли такой файл. Если существует, то просто вернуть ссылку на него в виде экземпляра PsiElement. Метод resolve выглядит так:
RequirejsReverence.java::resolve()
@Nullable @Override public PsiElement resolve() < String path = element.getText(); path = path.replace("'", "").replace("\"", ""); if (path.startsWith("tpl!")) < path = path.replace("tpl!", ""); >else < path = path.concat(".js"); >if (path.startsWith("./")) < path = path.replaceFirst( ".", element .getContainingFile() .getVirtualFile() .getParent() .getPath() .replace(webDir.getPath(), "") ); >VirtualFile targetFile = webDir.findFileByRelativePath(path); if (targetFile != null) < return PsiManager.getInstance(project).findFile(targetFile); >return null; >
Сделав это я получил разрешение ссылок и можно было приступать к реализации авто-дополнения.
В idea есть два способа реализовать авто-дополнение. Первый простой, это реализовать метод getVariants интерфейса PsiReference, и второй продвинутый использовать CompletionContributor. Я в попробовал оба способа, но каких-то преимуществ в CompletionContributor, для себя не нашёл, поэтому остановился на использовании первого способа.
Для авто-дополнения нам нужно возвращать список элементов в виде массива. Это может быть массив со строками, LoookupElement или PsiElement.
В начале я попробовал возвращать строки. Но тут меня ждал сюрприз. Дело в том что idea строки со слешами вставляет после последнего слеша всю строку. При этом если выдавать строку только со значением после слеша, то idea не воспринимает эту строку как подходящую для авто-дополнения. Это поведение мне не совсем понятно. И найти информацию о том как правильно сделать авто-дополнения строк со слешами или как вариант с путями для файлов мне не удалось.
По этому сделал по своему.
Для того что бы самому управлять вставкой значения нужно реализовать интерфейс InsertHandler и в нем в методе handleInsert произвести необходимые действия. А что бы его использовать нужно возвращать не просто строку, а LookupElement, в котором будет нужный нам InsertHandler.
Так что я расширил класс LookupElement, таким образом:
RequirejsLookupElement.java
package requirejs; import com.intellij.codeInsight.completion.InsertHandler; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; public class RequirejsLookupElement extends LookupElement < String path; PsiElement element; private InsertHandlerinsertHandler = null; public RequirejsLookupElement(String path, InsertHandler insertHandler, PsiElement element) < this.path = path; this.insertHandler = insertHandler; this.element = element; >public void handleInsert(InsertionContext context) < if (this.insertHandler != null) < this.insertHandler.handleInsert(context, this); >> @NotNull @Override public String getLookupString() < return path; >>
Реализация InsertHandler выглядит так:
RequirejsInsertHandler.java
package requirejs; import com.intellij.codeInsight.completion.InsertHandler; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.LookupElement; public class RequirejsInsertHandler implements InsertHandler < private static final RequirejsInsertHandler instance = new RequirejsInsertHandler(); @Override public void handleInsert(InsertionContext insertionContext, LookupElement lookupElement) < if (lookupElement instanceof RequirejsLookupElement) < insertionContext.getDocument().replaceString( ((RequirejsLookupElement) lookupElement).element.getTextOffset() + 1, insertionContext.getTailOffset(), ((RequirejsLookupElement) lookupElement).path ); >> public static RequirejsInsertHandler getInstance() < return instance; >>
Суть метода handleInsert в том что мы берём lookupElement получаем PsiElement для которого он был показан и выбран, из PsiElement мы получаем его местоположение в файле и заменяем текстом из lookupElement.path всю длинну строки элемента. Конечно это не лучший способ, но к сожалению другого я найти не смог.
После этого я сделал поиск всех подходящих файлов, и возвращал их в виде массива LookupElement.
Вот полный листинг RequirejsReference:
RequirejsReference.java
package requirejs; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl; import com.intellij.openapi.vfs.newvfs.impl.VirtualFileImpl; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiReference; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; public class RequirejsReference implements PsiReference < PsiElement element; TextRange textRange; Project project; VirtualFile webDir; public RequirejsReference(PsiElement element, TextRange textRange, Project project, VirtualFile webDir) < this.element = element; this.textRange = textRange; this.project = project; this.webDir = webDir; >@Override public PsiElement getElement() < return this.element; >@Nullable @Override public PsiElement resolve() < String path = element.getText(); path = path.replace("'", "").replace("\"", ""); if (path.startsWith("tpl!")) < path = path.replace("tpl!", ""); >else < path = path.concat(".js"); >if (path.startsWith("./")) < path = path.replaceFirst( ".", element .getContainingFile() .getVirtualFile() .getParent() .getPath() .replace(webDir.getPath(), "") ); >VirtualFile targetFile = webDir.findFileByRelativePath(path); if (targetFile != null) < return PsiManager.getInstance(project).findFile(targetFile); >return null; > @Override public String toString() < return getCanonicalText(); >@Override public boolean isSoft() < return false; >@NotNull @Override public Object[] getVariants() < ArrayListfiles = filterFiles(this.element); ArrayList completionResultSet = new ArrayList(); for (int i = 0; i < files.size(); i++) < completionResultSet.add( new RequirejsLookupElement( files.get(i), RequirejsInsertHandler.getInstance(), this.element ) ); >return completionResultSet.toArray(); > protected ArrayList getAllFilesInDirectory(VirtualFile directory) < ArrayListfiles = new ArrayList(); VirtualFile[] childrens = directory.getChildren(); if (childrens.length != 0) < for (int i = 0; i < childrens.length; i++) < if (childrens[i] instanceof VirtualDirectoryImpl) < files.addAll(getAllFilesInDirectory(childrens[i])); >else if (childrens[i] instanceof VirtualFileImpl) < files.add(childrens[i].getPath().replace(webDir.getPath() + "/", "")); >> > return files; > protected ArrayList filterFiles (PsiElement element) < String value = element.getText().replace("'", "").replace("\"", "").replace("IntellijIdeaRulezzz ", ""); Boolean tpl = value.startsWith("tpl!"); String valuePath = value.replaceFirst("tpl!", ""); ArrayListallFiles = getAllFilesInDirectory(webDir); ArrayList trueFiles = new ArrayList(); String file; for (int i = 0; i < allFiles.size(); i++) < file = allFiles.get(i); if (file.startsWith(valuePath)) < if (tpl && file.endsWith(".html")) < trueFiles.add("tpl!" + file); >else if (file.endsWith(".js")) < trueFiles.add(file.replace(".js", "")); >> > return trueFiles; > @Override public boolean isReferenceTo(PsiElement psiElement) < return false; >@Override public PsiElement bindToElement(@NotNull PsiElement psiElement) throws IncorrectOperationException < throw new IncorrectOperationException(); >@Override public PsiElement handleElementRename(String s) throws IncorrectOperationException < throw new IncorrectOperationException(); >@Override public TextRange getRangeInElement() < return textRange; >@NotNull @Override public String getCanonicalText() < return element.getText(); >>
Я выделил метод поиска файлов отдельно, так как он рекурсивный, и так же выделил метод фильтрации файлов, так как для темплейтов нужны только html, а для остального нужны js файлы. Так же при вставке темплейты вставляются вместе с префиксом tpl!, а js файлы вставляются без расширения js.
UPD:
В комментариях, пользователь VISTALL, подсказал что создание собственного класса наследника LookupElement было лишним. Вместо этого можно использовать LookupElementBuilder, который позволяет указать какой какой insertHandler использовать и к какому PsiElement он относится.
Для использования LookupElementBuilder, я изменил метод RequirejsReference::getVariants, следующим образом:
RequirejsReference::getVariants
@NotNull @Override public Object[] getVariants() < ArrayListfiles = filterFiles(element); ArrayList completionResultSet = new ArrayList(); for (int i = 0; i < files.size(); i++) < completionResultSet.add( LookupElementBuilder .create(element, files.get(i)) .withInsertHandler( RequirejsInsertHandler.getInstance() ) ); >return completionResultSet.toArray(); >
Что бы сгенерированный LookupElement знал к какому PsiElement он относится, достаточно вызвать метод create, первым параметром передав PsiElement, а вторым строку, которую нужно использовать для авто-дополнения.
Так же я изменил сам RequirejsInsertHandler::handleInsert так:
RequirejsInsertHandler::handleInsert
@Override public void handleInsert(InsertionContext insertionContext, LookupElement lookupElement)
Из него я убрал проверку на тип lookupElement и использовал методы для получения PsiElement и строки для замены.
После этих манипуляций, класс RequirejsLookupElement, более не нужен.
UPD 2:
Плагин слегка допилен и выложен на github: github.com/Fedott/WebStormRequireJsPlugin
Тае же плагин теперь доступен в официальном репозитории jetbrains: plugins.jetbrains.com/plugin/7337
Хотелки можно отправлять писать на github или здесь.
На этом всё.
Есть есть вопросы или советы как лучше реализовать, буду рад их прочесть.
Plugins
Use this page to manage plugins: browse the plugin repository, install, remove, enable, disable, and update plugins.
Main controls
Use this tab to browse and install plugins from JetBrains Marketplace.
If you want to browse your custom plugin repository, type repository: followed by the URL of the repository. For example:
repository:»http://plugins.example.com:8080/» myPlugin
Use this tab to browse your installed plugins, enable, disable, and remove them if necessary.
Configure additional plugin settings:
- Manage Plugin Repositories : Open the Custom Plugin Repositories Dialog. For more information, refer to Custom plugin repositories.
- HTTP Proxy Settings : Open the HTTP Proxy settings dialog.
- Install Plugin from Disk : Select the local archive file (ZIP or JAR) from which to install a plugin.
- Disable All Downloaded Plugins : Select to deactivate all the plugins showed in the list of the Downloaded plugins.
- Enable All Downloaded Plugins : Select to activate all the plugins showed in the list of the Downloaded plugins.
10 полезных плагинов для IntelliJ IDEA: для новичков и опытных разработчиков


Денечек добрый! У разработчиков есть основной инструмент, чтобы “творить” — среда разработки, вроде Eclipse, NetBeans и т.д. Но без сомнений, самой популярной средой на данный момент является Intellij IDEA. Она создана для того, чтобы упростить написание кода во множество раз.Но возможно, не всем будет хватать функциональности данной среды или захочется сделать её больше “под себя”. Это реально: достаточно расширить её функциональность, добавив плагины.
| Плагины — подключаемый дополнительный функционал к основной программе и предназначенный для расширения её возможностей. |
Сегодня мы рассмотрим 10 интересных плагинов для работы в Intellij IDEA, которые помогут вам в работе или по крайней мере поднимут настроение =) Сперва давайте проведем курс молодого бойца по установке плагинов в IntelliJ IDEA на примере установки новой темы.
1. Темы IntelliJ IDEA
У вас никогда не было ощущения, что всего лишь несколько стандартных тем для Intellij IDEA как-то маловато? Возможно, вам хотелось выбирать не из того, что есть, а покопаться и найти что-то под себя? Так, давайте это сделаем! Для начала зайдите сюда и выберите подходящую вам тему (или пак тем). К примеру, я выбрал Gradianto. Далее у нас есть два способа установки плагина.
У вас должна быть открыта ваша IDEA. Выбрав тему, жмем на кнопку Get ->Install , после чего всплывет выбор IntelliJ IDEA, которая установлена на компьютере:
↓
Далее в вашей среде разработки всплывет следующее окошко:
Жмём Ok . Плагин установлен! Далее для запуска плагина нужно перезагрузить IntelliJ IDEA , чтобы он начал работать. Для плагина с темами этого не понадобилось, тема сразу сменилась на зеленую:
Способ 2: установка с Intellij idea
В idea заходим в левом правом углу в File -> Settings :
Далее заходим во вкладку Plugins и вбиваем в поиск название плагина ( Gradianto ), можно даже не полностью:
Жмем зеленую кнопку Install — и готово!
Смена темы

Зеленая — не единственная новая тема. Чтобы посмотреть остальные:
- заходим опять в File -> Settings
- открываем вкладку Appearance
После этого нажимаем на выпадающий список Theme и видим четыре новые доступные темы:Мне вот больше всего понравилась тема Gradianto Deep Ocean :
Выключение / удаление плагина
Давайте посмотрим, как выключить плагин или вовсе удалить:
- опять открываем окошко Settings-> Plugins
- выбираем вкладку Installed
Нажатие Disable сделает плагин неактивным:
Ну а если нажмем стрелочки рядом с Включением/Выключением плагина ( Enable/Disable ), то мы увидим окошко, которое позволит удалить плагин с вашей idea :
Как вы можете видеть, всё на самом деле очень просто)) Ну а дальше давайте рассмотрим несколько плагинов для IDEA, которые могут быть весьма полезными.
2. String Manipulation

Плагин, который добавит в вашу idea много новых возможностей работы со строками. Найти его можно по этой ссылке. После установки и рестарта среды разработки, при нажатии правой клавиши, к примеру, на названии переменной выделения некоторого текста, появится дополнительная функция — String Manipulation , которая предоставляет множество возможностей для изменения выбранной строки:Этот плагин будет наиболее полезен, когда нужно будет взаимодействовать с каким-то очень большим текстом. Он позволяет фильтровать, сортировать, менять регистр, менять стиль написания (например, сделать для всего текста camelCase), менять что-то во всех строках текста одновременно (интригующе звучит), кодировать текст в какой-то формат (например, в шестнадцатеричный формат SHA-1) и многое многое другое. Да, поначалу будет казаться, что различных функций слишком много и не совсем понятно, что делает та или иная. Но со временем вы привыкнете и станете богом форматирования текста в Intellij IDEA.
3. IDE Features Trainer
Данный плагин предназначен в первую очередь для новичков, он поможет изучить основные ярлыки и функции в среде IDE в интерактивном режиме. Так сказать, это будет ваш личный тренер по боевому ориентированию в Intellij idea.
Найти его можно вот здесь. После установки заходите в раздел Help -> IDE Features Trainer .
Далее выбираете тему, о которой хотели бы узнать подробнее. Например, рефакторинг:
И начинаете выполнять задания шаг за шагом.
4. Key Promoter X

Как я заметил, чем более опытный и скиловый программист, тем большее количество горячих клавиш он знает. Ведь вместо того чтобы, вручную то-то искать или делать, можно нажать пару сочетаний клавиш и вуаля! Соответственно, и работать вы будете гораздо быстрее. Поэтому представляю вашему вниманию плагин Key Promoter X. После его загрузки, когда мы зайдем в какую-то настройку, меню или вкладку, мы будем видеть в правом нижнем углу подсказки, какими сочетаниями клавиш мы могли бы выполнить то же самое действие (вызвать то же самое окно настройки, меню и т.д):В комбинации с прохождением IDE Features Trainer впоследствии вы сможете работать в вашей IDEA фактически без использования мышки (что ускорит вашу работу в разы).
5. RainbowBrackets и HighlightBracketPair
Я не мог обойти стороной плагин Rainbow Brackets, после установки которого работа с кодом станет в разы удобнее, ведь пары скобок станут разноцветными:
Это вам позволит видеть сразу, какая открывающаяся скобка с какой закрывающейся идёт в паре. Цвета не случайны (не взяты с потолка), есть определенная логика: скобки, используемые в одной и той же степени вложенности в другую скобку, будут иметь одинаковый цвет. Например, скобки в желтых будут зелеными, а уже в зеленых все будут голубыми, и так далее. Говоря о скобках, перейдём к HighlightBracketPair. При использовании данного плагина вы будете ясно видеть, в каком конкретно блоке кода или скобках находится ваш курсор, так как эта пара скобок будет подсвечиваться:
Эти два инструмента могут быть очень полезными, если вы работаете над кодом, который имеет большую вложенность.
6. Codota AI

В далекие-далекие времена код писали в обычном txt блокноте. И вот представьте, что вы где-то забыли скобку, ну или в имени какого-то класса сделали ошибку, и всё просто не компилировалось! В итоге нужно было часами искать ошибку и быть чрезвычайно внимательным в написании кода. Это испытание только для людей с крепчайшими нервами. И я так думаю, это кому-то изрядно допекло, так что ребята взялись да и начали создавать различные среды для работы с кодом. Intellij Idea, Eclipse, NetBeans. И вот вы работаете, в Intellij Idea, которая очень умна и нереально помогает в написании кода, подсказывая места возможных ошибок, и подтягивая нужные названия классов и методов, как только вы их начинаете писать. А как насчёт того, чтобы сделать её ещё чуточку умнее? Для этого и можно воспользоваться плагином Codota AI. Данный плагин предназначен для лучшего завершения кода с использованием ИИ. Codota использует самые передовые модели машинного обучения, чтобы помочь завершить строки кода на основе миллионов программ Java с открытым исходным кодом и вашего контекста, помогая вам писать код гораздо быстрее и с меньшим количеством ошибок. Другими словами, этот плагин даёт возможность подсказывать IDEA на основании контекста вашего приложения. Например, показать доступную, видимую переменную нужного типа:Также можно выделить нужный блок кода, например, название метода, и попытаться поискать уже готовые аналоги:
7. SpotBugs
Говоря о помощниках в написании кода, думаю, нам бы не помешал такой, который поможет отлавливать ошибки, не так ли? Тут на сцену и выходит плагин SpotBugs. SpotBugs обеспечивает статический анализ байтового кода для поиска ошибок в коде Java из IntelliJ IDEA. То есть, этот плагин — отличный инструмент обнаружения некоторых дефектов в коде Java, который анализирует ваш код и сравнивает его с 400+ шаблонов ошибок и плохих решений. Среди таких ошибок — бесконечные рекурсивные циклы, взаимоблокировки (deadlock, livelock), некорректные использование различных библиотек. SpotBugs может идентифицировать сотни серьезных дефектов в больших приложениях (обычно около одного дефекта на 1000–2000 строк исходных текстов без комментариев). После установки в меню выбираем Analyze -> SpotBugs -> цель анализа. Это может быть как один файл, так и целый модуль, включая или не включая тесты:
После анализа, внизу вы можете увидеть окошко с указанием всех найденных ошибок или плохих решений и предложений по исправлению:
8. Maven helper

Плагин Maven helper просто обязателен для тех, кто используем Maven. Он добавляет простой способ анализа и исключения конфликтующих зависимостей, а также возможностей видеть Maven зависимости в различных формах (список, дерево). Чтобы запустить анализ, откройте pom -ник и нажмите вкладку внизу — Dependency Analyzer , после чего можно узнать, какие зависимости с какими конфликтуют и исключить конфликтующие:Также добавляются дополнительные возможности для запуска / отладки отдельных файлов или для корневого модуля: Включение данного менеджера зависимостей поможет сэкономить время на решение возникающих проблем с зависимостями.
9. Scratch
Во время написания кода часто думаешь: вот это нужно будет подправить перед коммитом, или где-то нужно записать для себя временные данные, для какого-нибудь теста, или увиденные при отладке приложения, или ещё какие-нибудь пометки. Для этого, как правило, создается новый экземпляр блокнота на скорую руку, но это всё равно не то. Так может лучше использовать средства нашей любимой IntelliJ IDEA? Например, плагин Scratch. С этим плагином можно создавать временные вкладки текстового редактора в IDEA, где можно записать код, временные данные или какие-то мысли, которые нужны для работы позже, но не должны сохраняться навсегда (например, кеши). Проблема с замусоривающими, одноразовыми txt файлами исчезнет навсегда. После загрузки плагина нажимаем Alt + C . Появится окошко для задания имени вашему текстовому файлу:
После нажатия Ok мы получим вкладку с временным текстовым файлом. Если файл уже был создан ранее, это сочетание клавиш откроет его, если есть уже целый список таких вкладок, то будет открыта самая последняя:
В описании плагина вы сможете увидеть остальные горячие клавиши для использования этих временных, текстовых файлов. Также доступ к данным временным файлам можно получить и с меню Tools ->Scratch->. 
10. Progress Bar
И напоследок в качестве разгрузки хотелось бы отметить небольшие веселые плагины на Progress Bar. Эти плагины меняют внешний вид обычной скучной полоски загрузки индикатора выполнения на что-то более веселое. Мне, например, очень понравился плагин Марио:
Ну или попробовать весьма популярный плагин — Nyan Progress Bar.
Но хотелось бы заметить, что добавление дополнительной функциональности приводит к большим ресурсным затратам вашего приложения, и чрезмерное увлечение плагинами может сказаться на производительности вашего приложения.
Поэтому в попытке собрать свою идеальную сборку плагинов не нужно слишком увлекаться: необходимо стараться держать “золотую середину” между производительностью и дополнительными функциональным возможностями. А на этом у меня на сегодня всё) Делитесь интересными плагинами в комментариях.