Как переместить экран без перемещения курсора в Vim?

598

Недавно я обнаружил ярлыки Ctrl+ Eи Ctrl+ Yдля Vim, которые соответственно перемещают экран вверх и вниз с шагом в одну строку, не перемещая курсор .

Знаете ли вы какую-либо команду, которая оставляет курсор там, где он есть, но перемещает экран так, чтобы строка с курсором стала первой строкой? (наличие команды для последней строки было бы хорошим бонусом).

Я могу добиться этого, вручную нажимая Ctrl+ E(или Ctrl+ Y) нужное количество раз, но было бы неплохо иметь команду, которая каким-то образом это делает напрямую.

Любые идеи?

ereOn
источник
Разве этот вопрос не должен быть в разделе Vim?
Джон

Ответы:

877
  • zz- переместить текущую строку в середину экрана
    ( Осторожноzz , если вы Caps Lockслучайно включили, вы сохраните и выйдите vim!)
  • zt - переместить текущую строку в верхнюю часть экрана
  • zb - переместить текущую строку в нижнюю часть экрана
Кевин Воган
источник
9
@HappyGreenKidNaps Карта, которая закрывает ключ для управления как можно скорее!
Аарон
Я довольно привязан к своему кепке, особенно в отношении множества макросов Си, но у вас есть другие варианты. Сначала найдите неотображенный ключ (проверьте оба регистра на наличие букв; попробуйте добавить модификатор или лидер, используя символ или функциональную клавишу и т. Д.) И сопоставьте его с чувствительной к регистру комбинацией «рискованно». Во-вторых, настройте vimundo по своему вкусу, чтобы вы могли восстановиться после упс. (Непереносимые взломы входящих :) В-третьих, сделайте то же самое, но с помощью пользовательской конфигурации клавиатуры, например, клавиши Windows + Z; для карт последовательности, попробуйте xdotoolили triggerhappy. Наконец, отобразите свое состояние блокировки прописными буквами (это нельзя сделать в Vimscript.) ...
Джон П
2
Запрос вашего состояния блокировки шапки очень зависит от окружающей среды. Я слышал, что это не может быть сделано в Vimscript, и на данный момент я принял это. Если вы хотите идти по этому пути, там xev -q, cat /proc/bus/input/devicesчтобы найти устройство для запроса и evtestили thd ... --dump /dev/input/event<#>для проверки состояния и т.д. Если вы абсолютно необходимы сделать общесистемное переназначение, по крайней мере своп два замка , как колпачки <-> Num - но проблема в том, что он забывает, что он включен, потому что, если вы хотели его раньше, вы будете использовать его на любой карте. Риск взлома Vim перед файлами / пользователем / системой.
Джон П,
Другие опции скрипта Vim: включите «подтвердить», чтобы подтвердить выход / оставить / и т. Д .; для написания, я думаю, вам понадобится автокоманда для BufWritePre с confirm(). Кроме того, вместо сопоставления caps lock с ctrl, вы можете сопоставить его с ключом или комбинацией, понятной, но не отображенной Vim, и затем эмулировать caps lock исключительно в режиме вставки / замены, вручную или с помощью чего-то вроде github.com/tpope/ Vim-Capslock . Вам, вероятно, не понадобится это вне Vim, но если вы это сделаете, напишите сценарий xmodmap, чтобы отменить ваши изменения, или посмотрите, поддерживает ли программа собственные отображения (и делают заметки)
John P
3
zt / zz / zb - фиксированный курсор и перемещение экрана в t op / center (немецкий: ' z entrum') / b ottom <---> H / M / L - фиксированный экран и перемещение курсора в положение H igh / M на холостом ходу / L ow позиция
eli
626

Дополнительно:

  • Ctrl- yПеремещает экран на одну строку вверх
  • Ctrl- eПеремещает экран вниз на одну строку
  • Ctrl- uПеремещает курсор и экран на ½ страницы
  • Ctrl- dПеремещает курсор и экран вниз на ½ страницы
  • Ctrl- bПеремещает экран на одну страницу вверх, курсор на последнюю строку
  • Ctrl- fПеремещение экрана вниз на одну страницу, курсор на первую строку

Ctrl- yи Ctrl- eизменять положение курсора только в том случае, если он будет перемещен за пределы экрана.

Предоставлено http://www.lagmonster.org/docs/vi2.html

Пол Уилер
источник
91
@ulidtko: после (по-шведски), в прошлом (имеется в виду прошлое), вверх, вниз, назад, вперед. (Слова назад и вперед длиннее, чем вверх и вниз, поэтому, естественно, они перемещают экран на большее расстояние;)
Моберг
12
Я думаю, да, так как вчера было бы лучше мнемоника, хотя ^^
Моберг
Ctrl-u и Ctrl-d перемещают курсор: « Курсор перемещается на одинаковое количество строк вверх в файле (если это возможно; при переносе строк и при попадании в конец файла может быть разница). »
Lex R
Спасибо @LexR, я обновил ответ, чтобы отразить это различие.
Пол Уилер
1
:help CTRL-EговоритMnemonic: Extra lines.
Нико Беллик
39

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

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g
GWW
источник
1
обратите внимание, что если вам нужно только перейти к строке с закладкой, вы можете использовать 'g
Matt Briggs
4
«Vim требует, чтобы курсор постоянно находился на текущем экране» Пользователи Vim любят хвастаться, что в Vim все настраивается. Это не так. Я не хочу, чтобы мой курсор двигался во время прокрутки файла. Разрушитель для меня
гаделать
8
У меня никогда не было ситуации, когда я хотел, чтобы курсор находился там, где вы его не видели. Конечно, курсор перемещается при прокрутке, но вы можете вернуться туда, где вы были тривиально (чтобы вы могли видеть, где вы на самом деле были, а не просто догадываться). Двойной бэк-тик для одного, Ctrl-Oдля другого действительно великого, и "backtick, period" возвращает вас туда, где вы в последний раз редактировали.
Даш-Том-Бэнг
3
@gedalat, это очень раздражает в других редакторах, когда вы прокручиваете, не знаете, где находится ваш курсор, и вынуждены использовать мышь, чтобы щелкнуть где-то, просто чтобы вы могли вернуть курсор назад. Или вы думаете, что «здесь», начинаете печатать, и он внезапно возвращается к тому месту, где был курсор, и в этот момент вы не можете вернуться к тому месту, где вы прокручивали, потому что отслеживаются только позиции курсора. Наверное, хорошо держать курсор, следуя туда, куда вы идете.
Шахбаз
1
Это настраивается, @gadelat. Вам просто нужно отобразить этот самый ответ (пометить позицию с помощью mg, прокрутить вокруг, перейти к отметке, 'gи все готово. Теперь вы можете вызвать настраиваемую клавишу, чтобы обойти, и вы почувствуете, как курсор никогда не покинул текущую позицию. Вуаля!
Доктор Беко
18

Вот мое решение в vimrc:

"keep cursor in the middle all the time :)
nnoremap k kzz
nnoremap j jzz
nnoremap p pzz
nnoremap P Pzz
nnoremap G Gzz
nnoremap x xzz
inoremap <ESC> <ESC>zz
nnoremap <ENTER> <ENTER>zz
inoremap <ENTER> <ENTER><ESC>zzi
nnoremap o o<ESC>zza
nnoremap O O<ESC>zza
nnoremap a a<ESC>zza

Так, чтобы курсор оставался в середине экрана, а экран двигался вверх или вниз.

Генри
источник
Мне кажется, это решение больше, чем нужно ОП. Я применил его, и он работает как шарм.
Густаво Пинсард
9
Как насчет того, чтобы просто установить scrolloff на половину значения 'lines'?
сл.
к сожалению, "nnoremap o o <ESC> zza" теряет автоиндент, но это обходится путем добавления и удаления временного символа '.' "nnoremap o o. <ESC> zzxa"
Нил Макгилл
Спасибо @rld, «scrolloff» также является хорошим или, возможно, лучшим решением. Спасибо! Вот ссылка: vim.wikia.com/wiki/…
Генри
14

Для того, чтобы оставить курсор в той же колонке при использовании Ctrl+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

Вы должны определить следующую опцию:

:set nostartofline
Александр Румянцев
источник
2
Я забываю / путаю его каждый раз: zt / zz / zb - исправил курсор и переместил экран в t op / center (немецкий: ' z entrum') / b ottom <---> H / M / L - фиксированный экран и перемещение курсор H Igh / M iddle / L ква позиции
Eli
8

Я удивлен, что никто не использует Scrolloffопцию, которая держит курсор в середине страницы. Попробуйте это с:

:set so=999

Это первый рекомендуемый метод в вики Vim, который хорошо работает.

Джесси Реза Хорасани
источник
3
И если вы не хотите, чтобы курсор всегда был прямо посередине, вы можете установить его на меньшее значение. Например, :set scrolloff=4потребуется, чтобы курсор всегда находился на расстоянии как минимум 4 строки от верхней или нижней части окна, чтобы у вас всегда был хотя бы небольшой контекст.
Сорен Бьорнстад
6

Я использовал эти сочетания клавиш в прошлом ( примечание: отдельные нажатия клавиш, например, нажмите z , отпустите, нажмите следующую клавишу):

z enter -> перемещает текущую строку в верхнюю часть экрана

z . -> перемещает текущую строку в центр экрана

z - -> перемещает текущую строку вниз

Если это не очевидно:

enterозначает Returnили Enterключ.

. означает клавишу DOT или «полный останов» (. ).

-означает ключ HYPHEN ( -)

Что бы это ни стоило, z.избегайте опасности сохранения и закрытия Vi, случайно набрав, ZZесли включен caps-lock.

кутеж
источник
5

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

10Ctrl+ Eсделает Ctrl+ E10 раз вместо одного.

yunzen
источник
4

zEnter делает именно то, что просит этот вопрос.

Это работает там, где странно zzне будет работать (vim 7.4.1689 на Ubuntu 2016.04 LTS без специального .vimrc)

Николас Рауль
источник
2

Иногда полезно для прокрутки текста с Kи Jключами, поэтому я эту функцию «прокрутки» режим в моем .vimrc (также связанный с zs).

Смотрите scroll_mode.vim .

Олег Халидов
источник
2

моя мнемоника для прокрутки ...

При добавлении к другим ответам также обращайте внимание zeи zs, что означает: перемещать экран влево / вправо от курсора (без перемещения курсора)

+-------------------------------+
^                               |
|c-e (keep cursor)              |
|H(igh)             zt (top)    |
|                   ^           |
|           ze      |      zs   |
|M(iddle)  zh/zH <--zz--> zl/zL |
|                   |           |
|                   v           |
|L(ow)              zb (bottom) |
|c-y (keep cursor)              |
v                               |
+-------------------------------+

также посмотрите на положение hи, lи tи bи (с помощью qwertz-клавиатуры) c-eи c-y(также «y» указывает на нижнюю часть) на клавиатуре, чтобы запомнить, где движется экран.

Eli
источник
1

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

Также легко быстро переключаться между курсором в первой строке, последней строкой и курсором в середине, просто щелкнув мышью j, kили lкогда вы находитесь в режиме плагина.

Я думаю, это было бы хорошо здесь.

щелчок
источник
1

Введите vim и введите:

:help z

zэто команда vim для перерисовки, поэтому она перерисовывает файл относительно того места, где вы поместили курсор. У вас есть следующие варианты:

z+- Перерисовывает файл с курсором в верхней части окна и сначала непустым символом вашей строки.

z-- Перерисовывает файл с курсором внизу окна и сначала непустым символом вашей строки.

z.- Перерисовывает файл с курсором в центре окна и сначала непустым символом вашей строки.

zt- Перерисовывает файл с курсором в верхней части окна.

zb- Перерисовывает файл с курсором внизу окна.

zz- Перерисовывает файл с курсором в центре окна.

Джо
источник