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

Рубрика "Секреты Вим". О позиции в тексте

Всем привет! Поговорим о курсоре.

Полезная штука, показывающая текущую позицию в тексте: именно в этом месте появится символ, если нажать на клавишу. Курсор в Вим удобный, но иногда хотелось бы, чтобы текущая строка и/или текущий столбец (символ в строке) были более заметны. Особенно, если подсветка синтаксиса обильна и текст весь разноцветный: это удобно для выделения глазом синтаксических элементов, но курсор можно и потерять на фоне.

В Вим такие возможности есть (начиная с версии 7). Флаг cursorline подсвечивает всю текущую строку (:set cursorline). Убрать, как и любой флаг, позволяет :set nocursorline. Цвет подсветки определяется группой CursorLine. Ее можно настроить, см. заметку про подсветку синтаксиса. Например, так:

:highlight CursorLine ctermfg=red ctermbg=lightblue

Можно аналогично подсветить столбец: это полезно если текст имеет прямоугольную структуру: например, это таблица с данными. Тогда примените команду :set cursorcolumn. Несложно догадаться, что цветовая группа называется CursorColumn. Разумно ее сделать такой же, как и для строки.

Вот так это выглядит. Включены и cursorline, и cursorcolumn, и обе цветовые группы заданы как показано выше: цвет фона голубой, цвет текста на фоне красный. Файл HTML Википедии, конечно, нет нужды редактиорвать: просто пример обильного и разноцветного текста.
Вот так это выглядит. Включены и cursorline, и cursorcolumn, и обе цветовые группы заданы как показано выше: цвет фона голубой, цвет текста на фоне красный. Файл HTML Википедии, конечно, нет нужды редактиорвать: просто пример обильного и разноцветного текста.

Отрисовка этой красоты может замедлять Вим, так что смотрите, надо ли оно вам. Включить/выключить подсветку несложно, а если повесить на клавишу, то и вообще легко. А можно сделать автокоманды:

au WinLeave * set nocursorline nocursorcolumn
au WinEnter * set cursorline cursorcolumn

Тогда при входе в данное окно подсветка будет включаться, а при выходе — выключаться.

В визуальном режиме подсветка отключается.

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

Позицию курсора показывает строка информации, которую можно настроить. Она может сообщать номер строки, позицию в строке (номер байта или символа), процент текста выше курсора, номер байта и многое другое.

Обсудим номера строк: тоже своего рода указатель позиции. Есть опция number (сокращенно nu), включающая номера строк: это удобно. Отключается, как и любой флаг, добавлением no: set nonu. А есть относительные номера: relativenumber (rnu). При этом показаны относительные номера для данной строки: сама строка имеет относительный номер 0, на одну выше и ниже 1, далее 2 и т.д. Если включены обе опции, то для текущей строки показан не нуль, а абсолютный номер. Например:

2 ааа
1 ббб
42 ввв
1 ггг
2 ддд

По умолчанию на номера строк выделяется 4 позиции; три для номеров и одна для разделителя. Этого хватит, если текст в пределах тысячи строк. Далее колонки будут добавляться. Минимальное число можно изменить, задав numberwidth.

Цветовое оформление номеров строк можно изменить, изменив группу LineNr.

Запомнить позицию позволяют метки: mx ставит метку x, а `x возвращается к ней. `` возвращается к предыдущей позиции, а `" восстановит последнюю позицию перед закрытием файла.

Еще стоит упомянуть функции getcurpos() и setpos(). Первая возвращает список из пяти значений, описывающих позицию. Вторая задает позицию, принимая в качестве аргументов выражение (варианты . для курсора и 'x для метки x) и тот самый список. Возвращает 0, если позиция возможно и -1 в противном случае.

Зачем это надо? Для гроссмейстерских трюков. Можно сохранить позицию вот так, например (пример из правки Вим):

let save_cursor = getcurpos()
...
call setpos('.', save_cursor)

Удачи, коллеги!

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

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