Як перемістити екран без переміщення курсору у Vim?


598

Нещодавно я виявив Ctrl+ Eта Ctrl+ Yярлики для Vim, які відповідно переміщують екран вгору та вниз одним кроковим кроком, не переміщуючи курсор .

Чи знаєте ви яку-небудь команду, яка залишає курсор там, де він є, але переміщує екран так, щоб рядок, який містить курсор, став першим рядком? (мати команду для останнього рядка було б приємним бонусом).

Я можу досягти цього, натиснувши Ctrl+ E(або Ctrl+ Y) відповідну кількість разів, але мати команду, яка так чи інакше робить це було б непогано.

Будь-які ідеї?


Чи не повинно бути це питання у розділі Vim?
Джон

Відповіді:


877
  • zz- перемістіть поточну лінію на середину екрана
    ( обережноzz , якщо Caps Lockвипадково ви потрапили , ви збережете та вийдете vim!)
  • zt - перемістити поточну лінію вгору екрана
  • zb - перемістити поточну лінію в нижній частині екрана

9
@HappyGreenKidNaps Map, яка замикає клавішу блокування, щоб керувати якомога швидше!
Аарон

Я досить прив’язаний до свого блокування шапки, особливо маю справу з великою кількістю макросів С, але у вас є інші варіанти. По-перше, знайдіть немапанований ключ (перевірте обидва регістри букв; спробуйте додати модифікатор або лідер, використовуючи символ або функціональну клавішу тощо) та відзначте його на "ризикованій" комбінації, що відрізняється від регістру. По-друге, налаштуйте 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(). Крім того, замість відображення блокування шапок у ctrl ви можете зіставити його на ключ або комбінацію, зрозумілу, але невідомі від Vim, а потім емуляцію шапок блокувати виключно в режимі вставки / заміни, вручну або в чомусь на зразок github.com/tpope/ vim-caplock . Ймовірно, він вам не знадобиться поза Vim, але якщо ви це зробите, напишіть сценарій xmodmap, щоб відновити зміни, або подивіться, чи підтримує програма власні відображення (і робити примітки.)
Джон П

3
zt / zz / zb - фіксований курсор і переміщення екрана до t op / center (німецька: ' z entrum') / b ottom <---> H / M / L - фіксований екран і переміщення курсору до H igh / M iddle / 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: efter (після шведською), yore (означає минуле), вгору, вниз, назад, вперед. (Слова вперед і вперед довші, ніж вгору і вниз, тому, природно, вони переміщують екран на більшу відстань;)
Moberg

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

1
зауважте, що якщо ви хочете лише перейти до закладеної лінії, ви можете скористатися 'g
Метт Бріггс

4
"Vim вимагає, щоб курсор постійно знаходився на поточному екрані" Користувачі Vim люблять похвалитися, що все налаштовується в vim. Цей не є. Я не хочу, щоб мій курсор переміщався під час прокрутки файлу. Dealbreaker для мене
gadelat

8
У мене ніколи не було ситуації, коли я хотів, щоб курсор був десь, якого ти не бачив. Звичайно, курсор рухається навколо, коли ви прокручуєте, але ви можете повернутися туди, де ви були тривіально (щоб ви могли бачити, де ви були насправді, а не просто гадати). Подвійне позначення зворотного галочки для одного, Ctrl-Oдля іншого дійсно чудового, а "зворотний вибір, період" повертає вас туди, де ви востаннє редагували.
Даш-Том-Банг

3
@gedalat, це дуже дратує інших редакторів, коли ви прокручуєтесь, не знаєте, де вже знаходиться ваш курсор, і вам доведеться користуватися мишею, щоб десь натиснути, щоб ви могли повернути курсор назад. Або ви думаєте, що ви "тут", почніть вводити текст, і він раптом відскакує туди, де був курсор, і в цей момент ви не можете перескочити туди, де ви прокрутили, тому що відстежуються лише позиції курсору. Здійснення того, що курсор слідкує, куди ви йдете, - це, мабуть, добра річ.
Шахбаз

1
Це налаштовується, @gadelat. Вам просто потрібно відобразити цю саму відповідь (позначте позицію за допомогою mg, прокрутіть, перейдіть до позначки, 'gі ви закінчите. Тепер ви можете викликати налаштований ключ, щоб обійти, і буде відчуватися, що курсор ніколи не залишає поточного положення. Voilá!
Д-р Беко,

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" на половину значення "рядків"?
rld.

на жаль, "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 Ow position
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якщо ввімкнено ковпачок.


5

Ви можете приєднати команди переміщення курсору цифрою, яка повторить цю команду багато разів

10Ctrl+ Eзробить Ctrl+ E10 разів замість одного.


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" якось вказує внизу) на клавіатурі, щоб запам'ятати, куди рухається екран.


1

Я написав плагін, який дозволяє мені переміщатися по файлу без переміщення положення курсору. Він заснований на складенні ліній між вашою позицією та цільовою позицією, а потім перестрибнувши складку або перервіть її і зовсім не рухайтеся.

Також легко швидко перемикатися між курсором на першому рядку, останнім рядком та курсором посередині, просто клацаючи клавішею j, kабоl коли ви перебуваєте в режимі плагіна.

Я думаю, що це було б добре.


1

Введіть vim та введіть:

:help z

zє командою vim для перемальовки, тому вона перемальовує файл відносно місця, де ви розміщуєте курсор. Ваші параметри такі:

z+- Перемальовує файл курсором у верхній частині вікна та спочатку непорожнім символом рядка.

z-- Перемальовує файл курсором у нижній частині вікна та спочатку непорожнім символом рядка.

z.- Перемальовує файл курсором у центрі вікна та спочатку не порожнім символом рядка.

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

zb- Перемальовує файл курсором у нижній частині вікна.

zz- Перемальовує файл курсором у центрі вікна.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.