Найти тему
Сделай игру

NVIM он же NeoVim для разработчика. Часть 2.1

Оглавление

Начало - тут.

Итак, мы остановились на настройке удобных функций редактора кода. Однако, перед тем, как к ним перейти, давайте осветим самую используемую функциональность всех редакторов: копирование и вставка кода. Да-да, самый любимый приём всех разработчиков, от безбородых юниоров, до заросших техлидов. Ctrl-c/Ctrl-v короче.

В чём сложность: а только в том, что работа с буфером отличается.

Этап первый - скопируем текст из одного окна, вставим в другое

Для этого используются 3 подхода:

1. Копирование выделения: переходим в режим выделения (Visual mode) нажатием в командном режиме клавиши v. Затем нажимаем клавишу y (yank), затем переходим в нужное окно NVIM и, опять же, в командном режиме жмём кнопку p (см. как это работает ниже). Особенно такой режим хорош, когда надо скопировать какой-то нестандартный набор символов (например, начиная со 2 символа текущего слова и по 4 символ следующего).

Пример вставки выделением через v/y/p
Пример вставки выделением через v/y/p

2. Копирование в командном режиме:

  • yy - скопировать текущую строку целиком;
  • 3yy - скопировать текущую строку, начиная с текущей;
  • y$ - скопировать строку с текущей позиции до конца строки;
  • y^ - скопировать от текущего положения курсора до начала строки;
  • yw - скопировать от текущего положения курсора до конца слова;
  • yiw – скопировать слово, на котором стоит курсор, или пробел, если курсор стоит на нём;
  • y% - скопировать символ, но, если курсор стоит на (), [], {} - то будет скопирован текст в скобках, включая скобки. Но на угловых скобках этот фокус не работает.

3. Копирование через контекстное меню. Тут, полагаю, всё ясно. Так уж вышло, что у нас есть контекстное меню, открывающееся правой кнопкой мышки, хотя я его специально не подключал (а обычно это нужно), но в нём есть пункт, показывающий, как отключить.

Пример копирования через контекстное меню
Пример копирования через контекстное меню

Впрочем, осталась проблема - как скопировать текст, если его надо перенести из редактора в иное место (скажем, в браузер).

Признаться, тут я потерпел фиаско. Я нашёл способ: отключаешь мышку:

set mouse=

и тогда выделение начинает работать на уровне терминала, а не окна. Проблема в том, что выделяется не только текст, но и все дополнительные символы, например, номера строк, содержимое других окон. И если все окна, кроме нужного, можно закрыть комбинацией ctrl+w,o, то вот номера строк отключать каждый раз, как надо что-то скопировать - слишком трудоёмко.

Есть ещё один способ, но он требует объяснения. У NVIM есть два типа буфера: обычный и настоящий (см. подробности тут). Утверждается, "настоящий" - позволяет использовать буфер системы и копировать комбинацией "+y<...> для командного режима и "+y для визуального режима. Проблема, видимо, в том, что буфер моего терминала не связан с буфером гостевой ОС и буфером NVIM. Так что для копирования фрагментов текста из кода буду пользоваться другими способами (вывести в терминал и скопировать нужный фрагмент: xclip у меня не действует, т.к. работаю из консоли).

Ну ладно, можно переходить к основному функционалу.

Мультикурсор

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

Работа со множеством курсоров
Работа со множеством курсоров

Для того, чтобы реализовать подобный функционал, есть вполне себе готовый плагин - vim-visual-multi. Его и будем использовать. С установкой ничего нового, разберётесь.

Итак, что этот красавец может. А может он очень многое (перепечатываю с переводом из описания):

  • Выделять слова или уже выделенные части слов - Ctrl-N (как Ctrl-d в Sublime Text/VS Code);
  • Создавать новые курсоры сочетаниями Ctrl-Down/Ctrl-Up;
  • Выделять текст комбинацией Shift-<стрелки>;
  • Нажать n/N для перехода к следующему/предыдущему выделению;
  • Нажать [ / ] для перехода к предыдущему / следующему курсору;
  • Нажать q, чтобы пропустить курсор выделение;
  • Нажать Q, чтобы убрать курсор или выделение;
  • Включение режима редактирования: i,a,I,A.

Плагин работает в 2 режимах, но описание их я, пожалуй, пропущу. Но упомяну, что с выделениями можно делать интересные вещи: например, нажать ~, чтобы изменить большие буквы на маленькие (и наоборот) или нажать r, чтобы заменить выделенные символы на те, что будут введены (не очень актуально для данного режима, но всё же).

Продемонстрирую, как это всё работает:

Использование комбинаций ctrl+n для выделения слов и редактирования нескольких строк
Использование комбинаций ctrl+n для выделения слов и редактирования нескольких строк

Можно немного пакетно поуправлять отступами: ctrl+t в режиме редактирования позволяет двигать выделение вправо. А вот убрать отступ (сдвинуть влево) можно комбинацией ctrl+p, однако это работает только в режиме ввода; в режиме мультикурсора не работает.

Ещё одна полезная функциональность - объединение строк. Выделяем несколько строк (как в визуальном режиме, так и в режиме мультикурсора) и жмём J; можно набрать, скажем, 6J, чтобы объединить сразу 6 строк в одну:

Объединение несколько строк в одну
Объединение несколько строк в одну

Возможно, зависает в воздухе вопрос: а не слишком ли много внимания такому вот незначительному явлению, как объединению строк. Так вот, незначительность этого явления сильно переоценена. Простой случай: есть строка, которая сперва разбивается на несколько строк, потом одновременно редактируется в нескольких местах, а затем обратно объединяется в одну. Приложу пример из репозитория плагина:

Пример, как мультикурсор и "схлопывание" строки облегчает примерно всё
Пример, как мультикурсор и "схлопывание" строки облегчает примерно всё

Отменить/повторить - в режиме управления - u / ctrl+r. Ничего нового.

Если есть желания посмотреть другие сочетания клавиш - это тут.

Ещё несколько сочетаний клавиш, о которых хочется сказать (в режиме выделения нескольких курсоров):

  • { / } (по сути, shift+[ или shift+]) - снять выделение со строки / выделить всю строку;
  • если сделать несколько курсоров, то из можно переключать в режиме выделения клавишей w, а комбинация ctrl+n - позволяет выделить слово, рядом с которым стоит курсор;
  • если выделение - число - то можно использовать комбинации ctrl+a / ctrl+x, чтобы увеличивать или уменьшать его на 1;
  • можно выделить несколько участков: создать вертикальную линию курсоров (вверх или вниз), затем сместить курсор на соседнее положение и создать ещё одну вертикальную линию курсоров (вниз или вверх), нажать ctrl+n и выделить для редактирования сразу несколько наборов слов. Вот так:
Выделение нескольких столбцов текста
Выделение нескольких столбцов текста

Вообще, на этот плагин довольно много комбинаций клавиш назначено, однако далеко не все из них работают. Увы.

Не переключайтесь. Мы продолжим после рекламной паузы. Далее в нашей программе: как "обернуть" текст другим текстом и не тронуться умом. Плагин surround-vim, который просто так вам не сдастся.

А вот и продолжение.