Справочник по VIM

Прокрутка

СПРАВОЧНИК ПО VIM — Брам Мооленаар

В этой главе обсуждаются команды, которые перемещают содержимое окна. Если курсор перемещается за пределы окна, то позиция, в которой находится курсор, перемещается в область окна (с учётом экранных строк, указанных в значении опции ‘scrolloff’). Страница окна равняется количеству строк в окне минус два. Мнемоника этих команд не всегда бывает ясной. Следует помнить, что команды относятся к перемещению окна (части буфера, который вы видите на экране) вверх или вниз по отношению к буферу. Если окно перемещается вверх, то текст в окне смещается вниз.

Краткие начальные сведения о прокрутке в Vim можно найти в разделе 03.7 руководства пользователя.

  1. Прокрутка вниз
  2. Прокрутка вверх
  3. Прокрутка относительно курсора
  4. Горизонтальная прокрутка
  5. Синхронная прокрутка
  6. Прокрутка при помощи колеса мыши

1. Прокрутка вниз

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

CTRL-EПрокрутка окна на [число] строк вниз. Мнемоника: Ещё.
CTRL-DПрокрутка окна вниз («Downwards», «вниз»). Количество строк определяется значением опции ‘scroll’ (по умолчанию: половина экрана). Если указано [число], то перед выполнением команды прокрутки значение опции ‘scroll’ устанавливается равным [числу]. Курсор перемещается на указанное количество строк вниз, если это возможно: при достижении конца файла или при переносе длинных строк файла на экране возможны расхождения. Если курсор находится на последней строке файла, то ничего не происходит и Vim выдаёт звуковой сигнал. См. также справку по опции ‘startofline’.
Vi: эта команда отличается в Vim тем, что происходит прокрутка экранных строк, на значение, указанное в опции ‘scroll’, а не строк файла; если в файле содержатся длинные строки, которые на экране отображаются перенесёнными, то это приводит к различиям.
<S-Down> или
<PageDown> или
CTRL-F
Прокрутка окна на заданное [число] страниц вперёд (вниз) по отношению к буферу. Мнемоника: «Forwards», «вперёд». См. также опцию ‘startofline’.
z+Без [числа]: Обновить окно, поместив строку, находящуюся сразу за нижней границей окна в самый верх окна. Курсор при этом помещается в позицию первого непробельного символа данной строки. С [числом]: то же, что и «z<CR>».

2. Прокрутка вверх

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

CTRL-YПрокрутка окна на [число] строк вверх.

Замечание: На MS-Windows CTRL-Y привязана к операции повторного выполнения отменённой команды.

CTRL-UПрокрутка окна вверх («Upwards», «вверх»). Количество строк определяется значением опции ‘scroll’ (по умолчанию: половина экрана). Если указано [число], то перед выполнением команды прокрутки значение опции ‘scroll’ устанавливается равным [числу]. Курсор перемещается на указанное количество строк вверх, если это возможно: при достижении начала файла или при переносе длинных строк файла на экране возможны расхождения. Если курсор находится на первой строке файла, то ничего не происходит и Vim выдаёт звуковой сигнал. См. также справку по опции ‘startofline’.
Vi: эта команда отличается в Vim тем, что происходит прокрутка экранных строк, на значение, указанное в опции ‘scroll’, а не строк файла; если в файле содержатся длинные строки, которые на экране отображаются перенесёнными, то это приводит к различиям.
<S-Up> или
<PageUp> или
CTRL-B
Прокрутка окна на заданное [число] страниц назад (вверх) по отношению к буферу. Мнемоника: «Backwards», «назад». См. также опцию ‘startofline’.
z^Без [числа]: Обновить окно, поместив строку, находящуюся сразу за верхней границей окна в самый низ окна. Курсор при этом помещается в позицию первого непробельного символа данной строки.
С [числом]: Прежде всего выполняется прокрутка текста с тем, чтобы поместить строку, на которую указывает [число] в самый низ окна, затем обновить окно, поместив самую верхнюю строку окна в самый низ окна. Курсор при этом помещается в позицию первого непробельного символа данной строки.

3. Прокрутка относительно курсора

Команды, рассматриваемые в этом разделе, перемещают текст в окне редактирования (часть буфера, которая видна на экране) сохраняя текущую позицию курсора:

z<CR>Обновить окно, поместив строку [число] наверху окна (по умолчанию — строку, в которой находится курсор). Курсор помещается в позиции первого непробельного символа этой строки.
ztКак «z<CR>», но курсор остаётся в той же колонке.
Vi не имеет такой возможности.
z{высота}<CR>Обновить окно, установив его {высоту} (в строках). Эта команда полезна при медленном обновлении окна, чтобы сделать высоту окна меньше. Высота окна не может быть больше, чем высота экрана.
z.Обновить окно, поместив строку, на которую указывает [число] в середину окна (по умолчанию — строка, в которой находится курсор). Курсор помещается в позиции первого непробельного символа этой строки.
zzКак «z.», но курсор остаётся в той же колонке. Будьте внимательны: при нажатой кнопке Caps Lock эта команда становится командой «ZZ»: записать содержимое буфера и выйти!
Vi не имеет такой возможности.
z-Обновить окно, поместив строку, на которую указывает [число] внизу окна (по умолчанию — строка, в которой находится курсор). Курсор помещается в позиции первого непробельного символа этой строки.
zbКак «z-«, но курсор остаётся в той же колонке.
Vi не имеет такой возможности.

4. Горизонтальная прокрутка

В четырёх указанных ниже командах курсор следует за прокруткой экрана. Если символ, на котором находится курсор, смещается за пределы видимой области окна, то курсор перемещается к ближайшему символу, который находится на экране. Значение опции ‘sidescroll’ не используется.

z<Right> или
zl
Прокрутка экрана на заданное [число] символов влево. Работает только при выключенной опции ‘wrap’.
Vi не имеет такой возможности.
z<Left> или
zh
Прокрутка экрана на заданное [число] символов вправо. Работает только при выключенной опции ‘wrap’.
Vi не имеет такой возможности.
zLПрокрутка экрана на половину ширины экрана влево. Работает только при выключенной опции ‘wrap’.
Vi не имеет такой возможности.
zHПрокрутка экрана на половину ширины экрана вправо. Работает только при выключенной опции ‘wrap’.
Vi не имеет такой возможности.

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

zsПрокрутка экрана по горизонтали, курсор помещается у левого края экрана (start, «начало»). Работает только при выключенной опции ‘wrap’.
Vi не имеет такой возможности.
zeПрокрутка экрана по горизонтали, курсор помещается у правого края экрана (end, «конец»).  Работает только при выключенной опции ‘wrap’.
Vi не имеет такой возможности.

5. Синхронная прокрутка

Иногда желательно связать два окна друг с другом таким образом, чтобы при прокрутке содержимого одного окна также происходила бы и прокрутка содержимого другого окна. В Vim окнам может быть назначено такое поведение при помощи опции ‘scrollbind’, которая включается для каждого окна по отдельности. Если у данного окна включена опция ‘scrollbind’, то при его прокрутке также будет синхронно прокручиваться содержимое всех остальных окон, в которых включена эта опция, если это представляется возможным. На поведение опции ‘scrollbind’ также влияет значение опции ‘scrollopt’.

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

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

Каждое окно, для которого включена опция ‘scrollbind’ отслеживает собственное «относительное смещение», то есть разницу между положением вертикальной прокрутки данного окна и положением вертикальной прокрутки другого окна. Когда одно из ‘scrollbind’-окон прокручивается за пределы начала или конца текста, то окно прокрутка перестаёт выполняться, однако желаемое значение прокрутки за пределами текста запоминается. Эта информация хранится для того, чтобы окно могло сохранять одинаковое относительное смещение независимо от положения прокрутки в пределах или за пределами буфера.

В то же время, если курсор помещается в ‘scrollbind’-окно, прокрутка которого выходит за пределы буфера, то другие окна с синхронной прокруткой должны быть прокручены в положение, в котором относительное смещение текущего окна имеет смысл. Такое поведение можно изменить, если убрать флаг ‘jump’ из значения опции ‘scrollopt’.

:syncbindЭта команда позволяет установить одинаковое относительное смещение для всех окон с синхронной прокруткой. Иными словами, если какое-либо из окон прокручивается в самый верх буфера, то и другие окна с включённой опцией ‘scrollbind’ будут также прокручены в самый верх своих буферов.

Опция ‘scrollbind’ может иметь смысл не только при использовании команд для вертикальной прокрутки, отдаваемых с клавиатуры, но и при использовании вертикальной полосы прокрутки в текущем окне. Однако, при использовании вертикальной полосы прокрутки значение ‘scrollbind’ игнорируется для окон, в которых в данный момент не находится курсор. Это позволяет организовать быстрое выравнивание относительного смещения в окнах, для которых включена опция ‘scrollbind’.

6. Прокрутка при помощи колеса мыши

Если у вас есть мышь с колесом для прокрутки, то оно будет работать в Vim с графическим интерфейсом. Принцип работы колеса зависит от вашей операционной системы. Кроме того, колесо также может работать и в xterm |xterm-колесо_мыши|.

В графическом интерфейсе Win32 действие прокрутки при помощи колеса встроено в код программы. Прокрутка колеса работает точно так же, как и перемещение полосы прокрутки в текущем окне. Количество строк, на которое прокручивается окно, зависит от настроек драйвера мыши. Если прокрутка вызывает проблемы с потерей фокуса ввода, см. |intellimouse-проблемы_с_колесом|.

В графическом интерфейсе X11 (Motif, Athena и GTK) прокрутка колеса мыши воспринимается как нажатие на кнопки <MouseDown> и <MouseUp>. По умолчанию, для этих кнопок установлены следующие значения:

<MouseDown>прокрутка на три строки вниз.
<S-MouseDown>прокрутка на страницу вниз.
<C-MouseDown>прокрутка на страницу вниз.
<MouseUp>прокрутка на три строки вверх.
<S-MouseUp>прокрутка на страницу вверх.
<C-MouseUp>прокрутка на страницу вверх.

Это должно работать во всех режимах, кроме режима редактирования командной строки.

Замечание: <MouseDown> используется для прокрутки текста вниз, поэтому этот код выдаётся при прокрутке колеса вверх!

Вы можете изменить поведение по умолчанию, определив собственные привязки для этих кнопок. Например, чтобы прокрутка колеса приводила к прокрутке на одну строку или на полэкрана в Обычном режиме:

:map <MouseDown> <C-Y>
:map <S-MouseDown> <C-U>
:map <MouseUp> <C-E>
:map <S-MouseUp> <C-D>

Вы также можете использовать сочетания с кнопками Ctrl и Alt.

Конечно, вышеуказанное работает только в том случае, если Vim получает информацию о событиях, связанных с управлением колесом мыши. Проверить это можно с помощью программы «xev».

При использовании XFree86, мышь должна быть правильно описана в файле /etc/XF86Config. Например, в FreeBSD для мыши Logitech с колесом следует указать:

Protocol     "MouseMan"
Device "/dev/psm0"
ZAxisMapping 4 5

Дополнительную информацию смотрите в документации по Xfree86.

Для использования колеса мыши в новом xterm достаточно правильно настроить работу мыши с сервером X, как это было описано выше.

В более старых версиях xterm может потребоваться выполнить следующее:
1. Добиться работы колеса в сервере X, как это указано выше.
2. Добавить необходимые преобразования для xterm, чтобы xterm мог передавать события прокрутки редактору Vim в виде escape-последовательности.
3. Добавить в Vim необходимые привязки кнопок для установления соответствия между этими escape-последовательностями и значениями <MouseUp> и <MouseDown>.

Для задания необходимых преобразований можно добавить нижеследующие строки в файл ~.Xdefaults (или в другой файл, где задаются настройки для ресурсов X):

XTerm*VT100.Translations:                #override \n\
s<Btn4Down>: string("0x9b") string("[64~") \n\
s<Btn5Down>: string("0x9b") string("[65~") \n\
<Btn4Down>: string("0x9b") string("[62~") \n\
<Btn5Down>: string("0x9b") string("[63~") \n\
<Btn4Up>: \n\
<Btn5Up>:

Теперь добавьте эти привязки в файл vimrc:

:map <M-Esc>[62~ <MouseDown>
:map! <M-Esc>[62~ <MouseDown>
:map <M-Esc>[63~ <MouseUp>
:map! <M-Esc>[63~ <MouseUp>
:map <M-Esc>[64~ <S-MouseDown>
:map! <M-Esc>[64~ <S-MouseDown>
:map <M-Esc>[65~ <S-MouseUp>
:map! <M-Esc>[65~ <S-MouseUp>