Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Выделение текста

Приветствую, коллеги! С вами рубрика "Секреты Вим", и сегодня я расскажу о методах выделения текста и командах, которые для этого предусмотрены.

Оглавление рубрики

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

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

Теперь чисто вимовское выделение текста. Для этого есть особый режим: визуальный, выделения, visual mode. Выделение заменяет команду движения: те или иные команды применяются к нему. Иными словами, вы заранее делаете движение, визуально выделяя текст, а потом к нему применяете команду: копирования в буфер, удаления, изменения регистра и т.п.

Включается режим одной из трех команд: v, V, <C-v>. Первая выделяет текст посимвольно, выделение можно распространять командами движения: вправо, вниз, до конца строки, до конца текста, до символа в строке, поиском... Вторая выделяет целые строки. Третья выделяет прямоугольник текста и аналогов в классике не имеет.

Столбиу выделен через <C-v> и движение (стрелки, например).
Столбиу выделен через <C-v> и движение (стрелки, например).

Можно выделять мышкой, если в переменную mouse входят a (все режимы) или v. Например, :set mouse=a или :set mouse=n,v,i Это символьное выделение, как v.

Выделили — применяйте команду. Чаще всего это копирование в буфер: y. Может быть вставка p, при этом выделенный текст будет заменен новым и помещен в буфер. Удаление d тоже возможно. Еще можно поменять регистр (~, U, u) и вообще применять любые команды, которые работают с движениями, и не только их. Например, выделить столбец текстовой таблицы и нажать r0 — весь столбец заполнится нулями.

Команда o прыгает на другой конец выделения. Полезно, если оно большое. Движения же использовать нельзя: они меняют выделение.

Команды семейства v могут предваряться повторителем. В этом случае они повторяют предыдущее выделение столько раз, сколько указано, с текущей позиции.

К примеру, вы выделили командой v 12 символов и что-то сделали с ними. Потом, в другом месте, нажали 1v и выделили 12 символов. Или выделили три строки командой V. Потом, позже, 3V выделит 9 строк.

С блоком на повторитель умножается и ширина, и высота блока! Так что блок 3х3 символа потом, позже, после 3<C-v> выделит 9х9.

Еще полезная команда: gn или gN. Повторяет поиск, как n или N (вперед/назад), но сразу выделяет найденное.

Команды U и u, которые обычно означают отмену действий, теперь переводят выделенный текст в верхний/нижний регистр.

Для блоков есть несколько особых команд. Это I, после которой вводится строка и завершается всё <ESC>. При этом строка добавляется к каждой строке выделенного блока слева.

Аналогичная команда A добавляет строку справа. Если блок создан <C-v>$, то есть строки входят в него до конца, то указанный текст клеится вплотную; в прочих случаях отделяется пробелом.

К блоку на предыдущем скриншоте применил команду А: ввел 666 и нажал ESC.
К блоку на предыдущем скриншоте применил команду А: ввел 666 и нажал ESC.

Команда c удаляет блок и включает режим вставки; введенная строка будет повторена на всех строках блока. Завершается тоже <ESC>. Вариант C еще и удалит остатки строк после блока.

К блоку можно применить табуляторы > и <, сделав отступ, но не от левого края текста, а от левого края блока.

Можно применять команды ex (которые с двоеточием) для выделения, только они работают со всей строкой. Это и :sort, и :g, и :s, и не только. Что удобно: можно отредактировать команду в истории и применить к тому же выделению: в начале команды будет что-то вроде '<,'> и это удалять не надо: это означает "то, что было выделено", даже если выделения уже нет.

Привязки vmap позволяют переопределять команды для визуального режима и режима выделения (который аналог классического). Если надо их разделить, есть семейство xmap — только для визуального.

Еще можно задать startsel в переменную keymodel, и тогда клавиши-стрелки, включая PageUp, Home и т.п., с нажатым shift выделяют текст, точно как команда v.

Несколько слов про select mode — тот самый аналог классического выделения. Это малоизвестный и, на мой взгляд, не особенно полезный режим выделения текста. Выделить текст так позволяют команды gh, gH, g<C-h>, аналогичные вышерассмотренным v, V, <C-v>, а также можно выделить текст по-вимовски и нажать <C-g>. Есть и еще способы: для этого надо настроить переменную selectmode и об этом я расскажу в другой раз.

Путеводитель по каналу