Я работаю преподавателем в онлайн-школе и обучаю студентов программированию. Периодически приходится рассказывать о некоторых функциях IntelliJ IDEA. На хабре не нашлось подходящей статьи с краткой выжимкой наиболее используемых функций. Кроме того, возникало несколько ситуаций, когда требовалось оптимизировать рутинные задачи на работе. Так и родилась идея этой статьи. Думаю, что даже разработчик с опытом в пару лет смогут найти для себя что-то новое и полезное.

Горячие клавиши

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

Навигация

  • Последние файлы = Ctrl + Е

  • Перейти обратно = Ctrl + Alt + Left

  • Последние места редактирования = Ctrl + Shift + E

  • Структура файла = Ctrl + F12

  • Дерево навигации = Alt + home

  • Перейти к последнему редактированному участку кода = Ctrl + Shift + Backspace

  • Горизонтальная прокрутка = Shift + колесо мыши

  • Переключаться между вкладками = Alt + (Влево/Вправо)

  • Переход к следующей подчеркнутой ошибке в коде = F2

Рефакторинг кода

  • Подсказки конструктора или метода = Ctrl + Р

  • Обернуть код какой-то конструкцией = Ctrl + Alt + T

  • Изменение имени переменной = Shift + F6

  • Автогенерация кода = Alt + Insert

  • Удалить текущую строку = Ctrl + Y

  • Двигать функцию вверх / вниз = Ctrl + Shift + (Вверх/Вниз)

  • Двигать строку вверх / вниз = Alt + Shift + (Вверх/Вниз)

  • Заменить параметр енама = Ctrl + Space -> Tab

  • Подвинуть строку по табам влево = Shift + Tab

Визуал

  • Поправить стиль кода = Ctrl + Alt + L

  • Выделить окружение строки - Ctrl + W

  • Закомментировать по одной строке = Ctrl + Slash

  • Закомментировать блок кода = Ctrl + Shift + Slash

  • Схлопнуть функцию = Ctrl + Minus

  • Развернуть функцию = Ctrl + Plus

Тренировки

Я и сам много раз гуглил что-то вроде "топ горячих клавиш для IntelliJ IDEA", находил большой список и закрывал этот сайт. Новые навыки закрепляются только после тренировок, для этого в IntelliJ IDEA есть встроенный тренажер. Открыть его можно в разделе (Help -> Learn Ide Features).

Кроме этого, для запоминания прекрасно поможет плагин Key promoter, об этом будет ниже.

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

Рис. Интерфейс Local History
Рис. Интерфейс Local History

IntelliJ IDEA предоставляет встроенный инструмент для отслеживания изменений в проекте — Local History. Эта функция автоматически сохраняет версии файлов, позволяя возвращаться к предыдущим состояниям кода даже без использования Git. Local History работает в фоновом режиме, записывая каждое изменение в файлы проекта, и предлагает удобный интерфейс для просмотра и восстановления этих изменений.

Основные возможности Local History

  1. Автоматическая фиксация изменений: Local History автоматически создает новые версии файлов при каждом сохранении, компиляции или запуске программы. Это позволяет отслеживать изменения в реальном времени и не беспокоиться о ручной фиксации версий.

  2. Просмотр истории изменений: Разработчик может просматривать историю изменений любого файла в проекте. В специальном окне будут представлены все зафиксированные версии файла с указанием времени и даты изменения.

  3. Сравнение версий: Инструмент позволяет сравнивать текущую версию файла с любой из предыдущих. Это удобно для анализа изменений и выявления различий между двумя версиями кода. Для сравнения версий нужно выбрать две интересующие версии в окне истории и нажать кнопку "Compare with Current".

  4. Восстановление предыдущих состояний: Если необходимо вернуть файл к одному из предыдущих состояний, достаточно выбрать нужную версию в окне истории и нажать кнопку "Revert". Это действие отменит все последующие изменения и восстановит выбранную версию файла.

  5. Отмена изменений: Помимо полного отката к предыдущей версии, Local History позволяет отменить отдельные изменения. Для этого нужно сравнить текущую версию с нужной и вручную выбрать, какие изменения стоит оставить, а какие — удалить.

  6. Настройка частоты фиксации: Пользователь может настроить частоту автоматической фиксации изменений в настройках IntelliJ IDEA. Это позволяет оптимизировать работу инструмента под конкретные нужды проекта.

Примеры использования

  1. Восстановление удаленного фрагмента кода: Допустим, вы удалили важный фрагмент кода и сохранили файл. С помощью Local History можно быстро вернуться к предыдущей версии файла и восстановить утраченное без отката других изменений

  2. Просмотр изменений за определенный период: Если нужно просмотреть, какие изменения были внесены в проект за последние сутки или неделю, это легко можно сделать в интерфейсе Local History и детально изучить каждое изменение.

  3. Работа без Git: Даже если вы не используете систему контроля версий (Git), Local History обеспечит базовую защиту от потери данных и возможность возврата к предыдущим состояниям кода. Такая ситуация может возникнуть при написании пет проектов.

Как открыть:

  1. ПКМ -> Local History -> Show History

  2. File -> Local history -> Show History

Постфиксное дополнение (Postfix Completion)

Постфиксное дополнение (Postfix Completion) — это удобная функция в IntelliJ IDEA, позволяющая быстро генерировать кодовые шаблоны на основе сокращений. Кроме того, эта функция позволяет автоматически включать наши переменные в эти шаблоны.

Принцип работы

Постфиксное дополнение основано на наборе заранее настроенных правил, которые составляют пару из сочетания букв и символов и соответствующего этому сочетанию шаблона кода. Думаю, все знают про то, что sout заменяется на System.out.println().

Однако в этом шаблоне не используется никакая переменная. Рассмотрим следующий пример кода:

int [] numbers = {1,2,3,4,5};

numbers.for

У нас есть массив numbers, при вводе numbers.for IntelliJ IDEA автоматически создает шаблон цикла с использованием массива:

int [] numbers = {1,2,3,4,5};  
  
for (int number : numbers) {  
  
}

Можно просмотреть все варианты ввода, нажав Ctrl + J на дефолтных настройках горячих клавиш.

Основные примеры использования

  1. Генерация циклов:

    • forifor (int i = 0; i < array.length; i++) {}

    • forfor (Element element : elements) {}

  2. Создание методов:

    • psvmpublic static void main(String[] args) {}

    • soutvSystem.out.println("value=" + value);

  3. Работа с объектами:

    • new → Конструктор объекта с заполненными параметрами.

    • cast → Приведение типа.

Настройки

Пользователи могут настраивать постфиксы в соответствии со своими потребностями: редактировать стандартные и добавлять свои. Для этого нужно перейти в настройки IntelliJ IDEA (File → Settings → Editor → General → Postfix Completion) и добавить или изменить существующие правила.

Пресеты (File and Code Templates)

Шаблоны файлов и кода (File and Code Templates) в IntelliJ IDEA — это инструмент, который помогает ускорить процесс создания новых файлов и структур кода, соответствующих принятым стандартам и соглашениям, избегая необходимости повторного ввода одинаковых фрагментов.

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

Что такое File Templates?

Шаблоны файлов (File Templates) — это предустановленные структуры для новых файлов, которые создаются в проекте. Например, при создании нового класса Java, IntelliJ IDEA автоматически добавляет стандартный заголовок с комментариями, информацию о пакете и основной каркас класса. Пользовательские шаблоны включать любой код и комментарии.

Рис. Самый простой вариант шаблона для класса с методом main.
Рис. Самый простой вариант шаблона для класса с методом main.

Что такое Code Templates?

Шаблоны кода (Code Templates) предназначены для быстрой генерации стандартных блоков кода, например, при вводе /** над методом создастся JavaDocs для этого метода с учетом входных параметров метода, выходного параметра и ошибок в секции throws.

Рис. Шаблон JavaDocs
Рис. Шаблон JavaDocs

Настройки

Шаблоны файлов и кода можно настраивать в соответствии с индивидуальными требованиями. Для этого нужно перейти в настройки IDE (File → Settings → Editor → File and Code Templates) и изменить существующие шаблоны или создать новые.

Конфигурация вкладок

По умолчанию вкладки располагаются сверху, над редактором кода. Это неудобно при дебаге: постоянно открываются новые вкладки, а старые при лимите закрываются. Конфигурацию вкладов можно настроить: переместить вкладки из строки над редактором в колонку справа, а еще увеличить лимит вкладок для закрытия предыдущих. Для этого нужно перейти в раздел настроек (File -> Settings -> Editor -> Editor Tabs)

Рис. Пример расположения вкладок
Рис. Пример расположения вкладок

Плагины

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

  1. Нужно узнать подходящую версию плагина для своей версии IntelliJ IDEA (это можно сделать найдя плагин в разделе File -> Settings -> Plugins)

  2. Далее нужно с использованием спец средств для смены локации скачать zip архив нужной версии плагина с сайта JetBrains

  3. А затем нужно установить этот плагин в том же разделе File -> Settings -> Plugins, в шестеренке будет опция "Install plugin from Disk"

Key promoter X

Key Promoter X — это плагин, который помогает пользователям освоить и запомнить горячие клавиши. Главная цель плагина — повысить производительность разработчиков, предлагая подсказки и напоминания о полезных сочетаниях клавиш.

Рис. Пример всплывающего окна
Рис. Пример всплывающего окна

Функционал

  1. Подсказки: Key Promoter X показывает всплывающую подсказку с предложением горячей клавиши всякий раз, когда пользователь пытается выполнить действие с помощью мыши.

  2. Рекомендации: Плагин анализирует действия пользователя и предлагает подходящие горячие клавиши для оптимизации работы.

  3. Обучение: Key Promoter X обучает использованию горячих клавиш, показывая статистику прогресса освоения и запоминание.

Rainbow brackets

Rainbow Brackets — это популярный плагин, который помогает визуально выделять скобки и парные элементы в коде. Основная цель этого плагина заключается в том, чтобы облегчить чтение и написание кода.

SonarLint

SonarLint – это статический анализатор кода. Его основная цель – выявление потенциальных ошибок, проблем безопасности и нарушений стандартов кодирования прямо во время написания кода. Плагин поддерживает различные языки программирования, включая Java, Python, JavaScript и другие.

Основные функции SonarLint:

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

  • Интеграция с SonarQube: При необходимости результаты анализа можно синхронизировать с сервером SonarQube для централизованного управления качеством кода.

  • Настраиваемые правила: Есть возможность настройки кастомных правил проверки, специфичных для компании или проекта.

Ниже представлен пример анализа с указанием ошибок:

Рис. Пример результата анализа плагином SonarLint
Рис. Пример результата анализа плагином SonarLint

Gigacode

Gigacode - это AI-плагин, который помогает генерировать, редактировать и объяснять код. Кроме этого, можно в специальном чате задавать вопросы. Ниже приведу некоторые примеры использования плагина.

1) Inline подсказки

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

2) Генерация кода по комментарию

Эта функция активируется, когда мы пишем в комментарии то, что хотим сделать, а плагин генерирует код, необходимый для реализации этих действий. Для этой функции нужна определенная тренировка, чтобы научиться грамотно писать запрос. Рассмотрим несколько примеров:

Пример 1:

Шаг 1: написать метод:

public static void printEven(List numbers) {  
  
}

Шаг 2: Написать комментарий для метода:

/*  
* Задание 2:  
 * Написать код, который будет выводить только четные числа из списка 
 */
 public static void printEven(List numbers) {  
  
}

Шаг 3: Нажать enter внутри метода, гигакод сгенерирует реализацию:

/*  
* Задание 2:  
 * Написать код, который будет выводить только четные числа из списка 
 * 
 */
 public static void printEven(List numbers) {  
    numbers.stream()  
            .filter(number -> number % 2 == 0)  
            .forEach(System.out::println);  
}

Пример 2:

var strList = List.of("CString1", "bString2", "CString3", "CString4", "bString5");  
  
/**  
 * 1. Перевести в  верхний регистр 
 * 2. Получить мапу: ключ - первая буква строки, значение - строки 
 * 
 */
  
// Этот код сгенерирован гигакодом:
 Map> collect = strList.stream()  
        .map(String::toUpperCase)  
        .collect(Collectors.groupingBy(s -> s.charAt(0)));

3) Рефакторинг кода

В меню справа после установки плагина появляется специальная иконка, которая открывает окно с чатом:

В этом чате можно задавать вопросы и использовать несколько предустановленных команд. Для демонстрации используем следующий кусок кода:

String[] text = new String[] {"I ", "Love ", "Java"};  
int i = 1;  
while (i < text.length) {  
    System.out.print(i);  
}

Выделяем его в редакторе и пишем в чате:
Отрефактори код, чтобы он выводил в консоль все элементы массива text

Нейронка выдает следующий результат:

public class Main {
    public static void main(String[] args) {
        String[] text = {"I ", "Love ", "Java"}; // Создаем массив строк
        for (String word : text) { // Итерируемся по массиву с помощью цикла for-each
            System.out.print(word); // Выводим элементы массива на экран
        }
    }
}

4. Объяснение кода

В чате можно выбрать несколько предустановленных команд, /explain - одна из них. С помощью этой команды можно получить объяснение кода для выделенного текста или всего файла

Ниже представлен пример объяснения от плагина:

Кроме этого в чате можно задавать любые вопросы. Недавно мне потребовалось составить регулярку и плагин с этим справился. Никогда регулярки не любил)

Структурный поиск

Во время изучения статей на хабре о возможностях Inteleji Idea нашел интересную статью про структурный поиск. Эта функция позволяет искать не вхождение какой-то строки, а наличие целого фрагмента кода с заданными параметрами. Ниже прикладываю ссылку на статью.

PS

Если использовать большинство возможностей и функций, описанных в статье, то легкость и скорость написания кода значительно увеличатся. Если у вас есть свои секретные фишки, то делитесь ими в комментариях. Буду благодарен за конструктивную критику и обратную связь.

Ссылки

Ссылка на маркетплейс с плагинами от JetBrains:
https://plugins.jetbrains.com/

Статья про Gigacode на хабре:
https://habr.com/ru/companies/usetech/articles/825470/

Статья про структурный поиск:
https://habr.com/ru/companies/krista/articles/510478/

Дополнительную информацию про localHistory в официальной документации:
https://www.jetbrains.com/help/idea/local-history.html

Ссылка для скачивания плагина Gigacode:
https://gigacode.ru/

Комментарии (8)


  1. edwgiz2
    13.12.2024 16:24

    Еще удобная штука Multiple cursors
    https://www.jetbrains.com/help/idea/multicursor.html


    1. Gabenskiy Автор
      13.12.2024 16:24

      Интересная функция, но в моей практике редко встречается потребность в множественном редактировании. А у вас часто?


      1. edwgiz2
        13.12.2024 16:24

        Несколько раз в неделю использую,

        например при написании java records, factrories. Удобно скопировать несколько а иногда и очень мого строчек из json, csv привести их например из snacke_case в camelCase. Названия колонок таблицы БД также из ui idea копируются как многострочный список и переводятся в код.

        Еще кейс - из логов скопировать только нужные фрагменты, например названия классов.


  1. ewolf
    13.12.2024 16:24

    Поправьте всё-таки написание ide к единому виду

    IntelliJ IDEA


  1. pep
    13.12.2024 16:24

    Реклама Сбера, ты ли это?

    По теме, возможно из очевидного, но: Shift + Shift магия. Поиск файлов, выполнение команд, работа со всем окружением в целом. Файлы искать можно по заглавным буквам, например найти HiddenGigacodeAdsServiceProvider можно введя HGASP или даже часть.


  1. mrprogre
    13.12.2024 16:24

    Первая статья из которой я формирую .doc и распечатываю его! Спасибо!


  1. VGoudkov
    13.12.2024 16:24

    Гм. Я бы назвал статью Junior of IntelliJ IDEA :) И вот почему:

    Первое, что нужно сделать, после того как открыл IDEA - зайти в Help / Keyboard Shortcuts PDF. Распечатать, повесить на стенку и учить наизусть. Там всё, что приведено в статье, и ещё много интересного :)

    Собственно второе, что нужно сделать - это отключить долбанное дефолтное переназначение F-кнопок на клавиатуре ноута со всяких "Открыть браузер", "Уменьшить громкость" и прочие "Почесать спинку" на нормальные F-xx и убрать руку от мышки. При профессиональной работе она нужна очень редко - либо потыкать в интерфейс, для которого нет shortcuts (ну как нет: значит просто лень настроить) либо повыделять что-то блоком на экране, т.е. тот самый мультикурсор. Главное меню тоже по shortcuts надо звать - Alt-H, K - и вот на экране тот самый PDF из предыдущего абзаца. Честно говоря, у меня есть круг задач, которые я стабильно делаю мышкой, но обычно они связаны с навигацией в каком-то из tool windows. Видимо просто лень придумывать shortcut-ы, они у меня кажется кончились, приходится делать многоуровневые. Мечтаю о клавиатуре с F12 - F24 или педали для переключения слоёв. Рояль не предлагать :)

    Следующее, с чем надо разобраться и начать использовать - это Live Templates (File | Settings | Editor | Live Templates). Похоже на Postfix completion, плюс: определение переменных уровня шаблона и контекста, в котором шаблон доступен. С его использованием становится не нужным например file templates: определяешь новый live template и вставляешь в пустой файл (Alt+1, Alt+Ins) по мере необходимости.

    Вот мой любимый (самодельный), лень каждый раз это всё печатать руками, вызывается по pat + Tab (PArametrized Test):

    static Stream<Arguments> sourceFor$METHOD_NAME$() {
        return Stream.of(
                Arguments.of("", ""),
                Arguments.of("", ""),
                Arguments.of("", "")
        );
    }
    
    @ParameterizedTest
    @MethodSource("sourceFor$METHOD_NAME$")
    public void should$METHOD_NAME$(String object0, String object1){
        $END$
    }

    После применения аккуратно правишь аргументы в парадигме - подали на вход - ожидаем результат и соответственно параметры метода на 11 строке, и вот он - параметризованный тест во всей красе. Минуc размножение тестов copy-paste, что обычно и происходит.

    Стоит поковырять VM оptions, дефолтные настройки это очень, очень мало. У нас были случаи креша с порчей открытых файлов. На 6GB получается держать пару открытых проектов среднего размера. Если у вас "альтернативно импортированное" решение - то файлик, в котором нужно править опции - он не тот, который в документации, он другой.

    Постарайтесь не использовать local history и shelve как основное хранилище изменений. Оно блин ЛОКАЛЬНОЕ. И прекрасно дохнет вместе с локальным винтом, чисткой кешей, переустановкой и ещё по тысяче причин. Git наше всё, тем более, что его поддержка близка к идеальной (но сравнивать два документа Word или PowerPoint, или отрисовать дерево веток как TortoiseGIt - не умеет). При правильном разведении веток - все мысли и идеи хранятся там, особенно если не стесняться писать многострочные пояснения к коммитам - что сделано, что не сделано, что падает и как и про что ещё нужно не забыть. WIP - коммит (Work In Progress) в локальную ветку после завершения каждого "логического блока" (30 минут - два часа работы, не больше) - это нормально. Всё равно потом будет squash и все душевные метания пропадут.. Зато возвращаешься к ветке через две недели, читаешь собственную историю и вспоминаешь, что имелось в виду. Но это уже не про IDEA, это про процесс разработки.

    Обязательно надо настраивать цветовую схему редактора кода. Дефолтная - мягко говоря не раскрывает всех возможностей среды по идентификации элементов, но тут целую статью надо писать.

    На первый взгляд выглядит попугаисто, но каждый цвет показывает на тип элемента:

    Пример цветовой схемы
    Пример цветовой схемы
    • белый - метод класса;

    • голубой - абстрактный метод

    • сиреневый - статический метод или интерфейс;

    • синий - класс;

    • зелёный - параметр;

    • салатовый - локальная переменная read-only;

    • желто-зелёный - параметр, захваченный из контекста;

    Кстати - если у вас не слишком хорошо со зрением, то штатный шрифт среды разработки можно и нужно увеличить: у меня актуальный фаворит для самой IDEA Inter 15, для кода - Noto Sans Mono те же 15. Время от времени надоедают, меняю на аналоги из Google Fonts.

    Главное меню пункты Code и Refactoring. Нужно протыкать каждый и понять, зачем он нужен и что делает. Избавляет от тысяч ручных правок файлов и экономит время. Но опять же - мышкой туда не набегаешься, поэтому учим клавиатурные комбинации. Мои фавориты - ну кроме очевидных рефакторингов, Extract/Introduce и Inline - Inspect Code, Analyze Data Flow from Here / to Here.

    Кажется, комментарий начинает превращаться в статью. Поэтому заканчиваю на каждодневных Call Hierarchy (Сtrl-Alt-H под Windows) и просто Hierarchy (Ctrl-H), первое работает на сигнатуре метода, второе - где угодно в коде (и тогда показывает про текущий класс / интерфейс, или на конкретном типе - тогда рассказывает про него.

    Удачи!


    1. Gabenskiy Автор
      13.12.2024 16:24

      А цветовая схема кода - это в настройках идеи или плагин какой-то? Благодарю за развернутый ответ с многими полезностями