СПРАВОЧНИК ПО VIM - Брам Мооленаар
В этой главе обсуждаются команды, которые перемещают содержимое окна. Если курсор перемещается за пределы окна, то позиция, в которой находится курсор, перемещается в область окна (с учётом экранных строк, указанных в значении опции 'scrolloff'). Страница окна равняется количеству строк в окне минус два. Мнемоника этих команд не всегда бывает ясной. Следует помнить, что команды относятся к перемещению окна (части буфера, который вы видите на экране) вверх или вниз по отношению к буферу. Если окно перемещается вверх, то текст в окне смещается вниз.
Краткие начальные сведения о прокрутке в Vim можно найти в разделе 03.7 руководства пользователя.
- Прокрутка вниз
- Прокрутка вверх
- Прокрутка относительно курсора
- Горизонтальная прокрутка
- Синхронная прокрутка
- Прокрутка при помощи колеса мыши
1. Прокрутка вниз
Указанные ниже команды перемещают окно редактирования (часть буфера, которую вы видите) вниз, т.е. с помощью этих команд вы можете видеть больше строк в нижней части текста:
2. Прокрутка вверх
В этом разделе представлены команды, которые позволяют перемещать окно редактирования (часть буфера, которая видна на экране) вверх (т.е. они позволяют увидеть больше строк в верхней части текста):
3. Прокрутка относительно курсора
Команды, рассматриваемые в этом разделе, перемещают текст в окне редактирования (часть буфера, которая видна на экране) сохраняя текущую позицию курсора:
z<CR> | Обновить окно, поместив строку [число] наверху окна (по умолчанию -- строку, в которой находится курсор). Курсор помещается в позиции первого непробельного символа этой строки. |
zt | Как "z<CR>", но курсор остаётся в той же колонке. Vi не имеет такой возможности. |
z{высота}<CR> | Обновить окно, установив его {высоту} (в строках). Эта команда полезна при медленном обновлении окна, чтобы сделать высоту окна меньше. Высота окна не может быть больше, чем высота экрана. |
z. | Обновить окно, поместив строку, на которую указывает [число] в середину окна (по умолчанию -- строка, в которой находится курсор). Курсор помещается в позиции первого непробельного символа этой строки. |
zz | Как "z.", но курсор остаётся в той же колонке. Будьте внимательны: при нажатой кнопке Caps Lock эта команда становится командой "ZZ": записать содержимое буфера и выйти! Vi не имеет такой возможности. |
z- | Обновить окно, поместив строку, на которую указывает [число] внизу окна (по умолчанию -- строка, в которой находится курсор). Курсор помещается в позиции первого непробельного символа этой строки. |
zb | Как "z-", но курсор остаётся в той же колонке. Vi не имеет такой возможности. |
4. Горизонтальная прокрутка
В четырёх указанных ниже командах курсор следует за прокруткой экрана. Если символ, на котором находится курсор, смещается за пределы видимой области окна, то курсор перемещается к ближайшему символу, который находится на экране. Значение опции 'sidescroll' не используется.
В нижеследующих командах курсор не перемещается относительно текста, но сам текст прокручивается относительно экрана.
5. Синхронная прокрутка
Иногда желательно связать два окна друг с другом таким образом, чтобы при прокрутке содержимого одного окна также происходила бы и прокрутка содержимого другого окна. В Vim окнам может быть назначено такое поведение при помощи опции 'scrollbind', которая включается для каждого окна по отдельности. Если у данного окна включена опция 'scrollbind', то при его прокрутке также будет синхронно прокручиваться содержимое всех остальных окон, в которых включена эта опция, если это представляется возможным. На поведение опции 'scrollbind' также влияет значение опции 'scrollopt'.
При использовании полос прокрутки связка происходит только при прокрутке окна, в котором находится курсор. Этим обстоятельством можно пользоваться для того, чтобы избежать нежелательной синхронизации прокрутки без изменения значений соответствующих опций.
Если в окне также включена опция 'diff', то при синхронизации прокрутки учитываются различия между двумя буферами. В противном случае, используется следующий метод.
Каждое окно, для которого включена опция 'scrollbind' отслеживает собственное "относительное смещение", то есть разницу между положением вертикальной прокрутки данного окна и положением вертикальной прокрутки другого окна. Когда одно из 'scrollbind'-окон прокручивается за пределы начала или конца текста, то окно прокрутка перестаёт выполняться, однако желаемое значение прокрутки за пределами текста запоминается. Эта информация хранится для того, чтобы окно могло сохранять одинаковое относительное смещение независимо от положения прокрутки в пределах или за пределами буфера.
В то же время, если курсор помещается в 'scrollbind'-окно, прокрутка которого выходит за пределы буфера, то другие окна с синхронной прокруткой должны быть прокручены в положение, в котором относительное смещение текущего окна имеет смысл. Такое поведение можно изменить, если убрать флаг 'jump' из значения опции 'scrollopt'.
Опция 'scrollbind' может иметь смысл не только при использовании команд для вертикальной прокрутки, отдаваемых с клавиатуры, но и при использовании вертикальной полосы прокрутки в текущем окне. Однако, при использовании вертикальной полосы прокрутки значение 'scrollbind' игнорируется для окон, в которых в данный момент не находится курсор. Это позволяет организовать быстрое выравнивание относительного смещения в окнах, для которых включена опция 'scrollbind'.
6. Прокрутка при помощи колеса мыши
Если у вас есть мышь с колесом для прокрутки, то оно будет работать в Vim с графическим интерфейсом. Принцип работы колеса зависит от вашей операционной системы. Кроме того, колесо также может работать и в xterm |xterm-колесо_мыши|.
В графическом интерфейсе Win32 действие прокрутки при помощи колеса встроено в код программы. Прокрутка колеса работает точно так же, как и перемещение полосы прокрутки в текущем окне. Количество строк, на которое прокручивается окно, зависит от настроек драйвера мыши. Если прокрутка вызывает проблемы с потерей фокуса ввода, см. |intellimouse-проблемы_с_колесом|.
В графическом интерфейсе X11 (Motif, Athena и GTK) прокрутка колеса мыши воспринимается как нажатие на кнопки <MouseDown> и <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>