Jak przesuwać ekran bez poruszania kursorem w Vimie?

598

Niedawno odkryłem skróty Ctrl+ Ei Ctrl+ Ydla Vima, które odpowiednio przesuwają ekran w górę i w dół o jeden wiersz, bez przesuwania kursora .

Czy znasz jakieś polecenie, które pozostawia kursor tam, gdzie jest, ale przesuwa ekran tak, że linia zawierająca kursor staje się pierwszą linią? (posiadanie polecenia dla ostatniej linii byłoby miłym dodatkiem).

Mogę to osiągnąć, ręcznie naciskając Ctrl+ E(lub Ctrl+ Y) odpowiednią liczbę razy, ale fajnie byłoby mieć polecenie, które to robi bezpośrednio.

Jakieś pomysły?

ereOn
źródło
Czy to pytanie nie powinno znajdować się w sekcji Vim?
Jan

Odpowiedzi:

877
  • zz- przesuń bieżącą linię na środek ekranu
    ( Ostrożniezz , jeśli zdarzy ci się Caps Lockprzypadkowo, zapiszesz i wyjdziesz vim!)
  • zt - przenieś bieżącą linię na górę ekranu
  • zb - przesuń bieżącą linię na dół ekranu
Kevin Vaughan
źródło
9
@HappyGreenKidNaps Mapa, która zamyka klawisz blokady, aby jak najszybciej kontrolować!
Aaron
Jestem bardzo przywiązany do mojej blokady klawiszy, szczególnie w przypadku wielu makr C, ale masz inne opcje. Najpierw znajdź niezapisany klawisz (sprawdź litery w obu przypadkach; spróbuj dodać modyfikator lub linię odniesienia, używając symbolu lub klawisza funkcyjnego itp.) I zamapuj go na kombinację „ryzykowną” z rozróżnianiem wielkości liter. Po drugie, skonfiguruj vimundo według własnych upodobań, abyś mógł odzyskać po awarii. (Nadchodzą nieprzenośne hacki :) Po trzecie, zrób to samo, ale z konfiguracji klawiatury użytkownika, np. Klawisz Windows + Z; dla map do sekwencji spróbuj xdotoollub triggerhappy. Na koniec wyświetl stan Caps Lock (nie można tego zrobić w Vimscript.) ...
John P
2
Zapytanie o stan Caps Lock jest bardzo zależne od środowiska. Słyszałem, że nie można tego zrobić w Vimscript, i w tym momencie to zaakceptowałem. Jeśli chcesz pójść tą drogą, jest tam xev -q, cat /proc/bus/input/devicesaby znaleźć urządzenie do zapytania i evtestczy thd ... --dump /dev/input/event<#>sprawdzić stan itd Jeśli koniecznie musi wykonać ponowne mapowanie całego systemu, przynajmniej zamiany dwa zamki jak czapki <-> num - ale problem polega na tym, że bardziej zapominam, że jest włączony, ponieważ jeśli wcześniej tego chciałeś, będziesz go używać, niezależnie od mapy. Ryzykuj złamanie Vima przed plikami / użytkownikiem / systemem.
John P,
Inne opcje skryptu Vima: włącz „potwierdź”, aby potwierdzić wyjście / wyjście / etc .; do pisania, uważam, że będziesz potrzebować autokomendy dla BufWritePre z confirm(). Ponadto zamiast mapować Caps Lock na Ctrl, możesz mapować go na klucz lub kombinację zrozumiałą, ale niezamapowaną przez Vima, a następnie emulować Caps Lock wyłącznie w trybie wstawiania / zastępowania, ręcznie lub przez coś takiego jak github.com/tpope/ vim-capslock . Prawdopodobnie nie będziesz go potrzebować poza Vimem, ale jeśli to zrobisz, napisz skrypt xmodmap, aby przywrócić zmiany lub sprawdź, czy program obsługuje własne mapowania (i rób notatki)
John P
3
zt / zz / zb - naprawiono kursor i przesuwa ekran do t op / center (niemiecki: ' z entrum') / b ottom <---> H / M / L - naprawiono ekran i przesuwa kursor do H igh / M iddle / L ow pozycji
Eli
626

Dodatkowo:

  • Ctrl- yPrzesuwa ekran o jedną linię w górę
  • Ctrl- ePrzesuwa ekran w dół o jedną linię
  • Ctrl- uPrzesuwa kursor i ekran w górę ½ strony
  • Ctrl- dPrzesuwa kursor i ekran w dół ½ strony
  • Ctrl- bPrzesuwa ekran w górę o jedną stronę, kursor do ostatniej linii
  • Ctrl- fPrzesuwa ekran w dół o jedną stronę, kursor do pierwszego wiersza

Ctrl- yi Ctrl- ezmień pozycję kursora tylko wtedy, gdy zostanie przesunięty poza ekran.

Dzięki uprzejmości http://www.lagmonster.org/docs/vi2.html

Paul Wheeler
źródło
91
@ulidtko: efter (po szwedzku), dawno temu (czyli przeszłość), góra, dół, tył, przód. (Słowa do przodu i do tyłu są dłuższe niż w górę iw dół, więc naturalnie przesuwają ekran na większą odległość;)
Moberg
12
Chyba wczoraj, bo wczoraj byłby lepszy mnemonik ^^
Moberg
Zarówno Ctrl-u, jak i Ctrl-d przesuwają kursor: „ Kursor przesuwa się o tę samą liczbę linii w górę w pliku (jeśli to możliwe; kiedy linie się zawijają i gdy uderzają w koniec pliku, może być różnica).
Lex R
Dzięki @LexR, zaktualizowałem odpowiedź, aby odzwierciedlić to rozróżnienie.
Paul Wheeler,
1
:help CTRL-EmówiMnemonic: Extra lines.
Niko Bellic
39

Vim wymaga, aby kursor znajdował się na bieżącym ekranie przez cały czas, jednak możesz dodać zakładkę do bieżącej pozycji, przewinąć dookoła, a następnie wrócić do miejsca, w którym byłeś.

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g
GWW
źródło
1
zwróć uwagę, że jeśli zależy Ci tylko na przejściu do zakładki, możesz użyć 'g
Matt Briggs
4
„Vim wymaga, aby kursor znajdował się na bieżącym ekranie przez cały czas” Użytkownicy Vima lubią się chwalić, że wszystko jest konfigurowalne w vimie. Ten nie jest. Nie chcę przesuwać kursora podczas przewijania pliku. Dealbreaker dla mnie
gadelat
8
Nigdy nie miałem sytuacji, w której chciałbym, aby kursor znajdował się w miejscu, w którym go nie widziałeś. Jasne, kursor przesuwa się podczas przewijania, ale możesz wrócić do miejsca, w którym byłeś trywialnie (abyś mógł zobaczyć, gdzie właściwie byłeś, a nie tylko zgadywać). Podwójne tykanie dla jednego, Ctrl-Odla drugiego naprawdę świetnego, a „backtick, kropka” przywraca cię do miejsca, w którym ostatnio edytowałeś.
dash-tom-bang
3
@gedalat, jest bardzo denerwujące w innych edytorach, gdy przewijasz, nie wiesz już, gdzie jest twój kursor i musisz użyć myszy, aby gdzieś kliknąć, abyś mógł odzyskać kursor. Lub myślisz, że jesteś tutaj, zacznij pisać i nagle przeskakuje z powrotem do miejsca, w którym znajdował się kursor, w którym to momencie nie możesz wrócić do miejsca, w którym przewinąłeś, ponieważ śledzone są tylko pozycje kursora. Posiadanie kursora w miejscu, w którym się znajdujesz, jest prawdopodobnie dobrą rzeczą.
Shahbaz
1
Jest konfigurowalny, @gadelat. Trzeba tylko odwzorować tę odpowiedź (zaznacz pozycję za pomocą mg, przewiń dookoła, zaznacz goto za pomocą 'gi gotowe) Teraz możesz wywołać konfigurowalny klawisz, aby się obejść i poczujesz się, jakby kursor nigdy nie opuścił bieżącej pozycji. Voilá!
Dr Beco,
18

Oto moje rozwiązanie w 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

Aby kursor pozostał na środku ekranu, a ekran przesuwał się w górę lub w dół.

Henz
źródło
Myślę, że to rozwiązanie jest bardziej potrzebne OP. Zastosowałem to i działa jak urok.
Gustavo Pinsard,
9
Co powiesz na ustawienie „przewijania” do połowy wartości „linii”?
rld.
niestety „nnoremap o o <ESC> zza” traci autoindent, ale działa to wokół niego poprzez dodanie i usunięcie tymczasowego znaku „.” „nnoremap o o. <ESC> zzxa”
Neil McGill
Dziękuję @rld, „przewijanie” jest również dobrym, a może lepszym rozwiązaniem. Dzięki! Oto odniesienie: vim.wikia.com/wiki/…
Henry
14

Aby opuścić kursor w tej samej kolumnie po użyciu Ctrl+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

powinieneś zdefiniować następującą opcję:

:set nostartofline
Alexander Rumyantsev
źródło
2
Za każdym razem zapominam / mylę: zt / zz / zb - naprawiono kursor i przesuwa ekran do t op / center (niemiecki: ' z entrum') / b ottom <---> H / M / L - naprawiono ekran i ruch kursora H IGH / M iddle / L ow pozycji
eli
8

Dziwi mnie, że nikt nie korzysta z Scrolloffopcji, która utrzymuje kursor na środku strony. Wypróbuj z:

:set so=999

Jest to pierwsza zalecana metoda na wiki Vima i działa dobrze.

Jesse Reza Khorasanee
źródło
3
A jeśli nie chcesz kursor zawsze być tuż w środku, można ustawić ją na mniejszą wartość. Na przykład :set scrolloff=4będzie wymagał, aby kursor zawsze znajdował się w odległości co najmniej 4 linii od góry lub dołu okna, więc zawsze masz przynajmniej trochę kontekstu.
Soren Bjornstad,
6

W przeszłości używałem tych skrótów ( uwaga: oddzielne naciśnięcia klawiszy, tj. Dotknij z , puść, dotknij kolejnego klawisza):

z enter -> przenosi bieżącą linię na górę ekranu

z . -> przesuwa bieżącą linię na środek ekranu

z - -> przesuwa bieżącą linię na dół

Jeśli nie jest to oczywiste:

enteroznacza klawisz Returnlub Enter.

.oznacza DOT lub klawisz „pełnego zatrzymania” ( .).

-oznacza klawisz HYPHEN ( -)

Za to, co jest warte, z.pozwala uniknąć niebezpieczeństwa zapisywania i zamykania Vi przez przypadkowe wpisanie, ZZczy włączona jest funkcja Caps Lock.

Razzle
źródło
5

Możesz poprzedzić komendę przesuwania kursora cyfrą, która powtórzy tę komendę wiele razy

10Ctrl+ Ezrobi Ctrl+ E10 razy zamiast jednego.

Junzen
źródło
4

zEnter robi dokładnie to, o co pyta to pytanie.

Działa tam, gdzie dziwnie zznie działa (vim 7.4.1689 na Ubuntu 2016.04 LTS bez specjalnego .vimrc)

Nicolas Raoul
źródło
2

Czasami przydaje się przewijanie tekstu za pomocą klawiszy Ki J, więc mam tę funkcję „trybu przewijania” w moim .vimrc (również powiązane zzs ).

Zobacz scroll_mode.vim .

Oleg Khalidov
źródło
2

mój mnemonik do przewijania ...

Dodając do innych odpowiedzi, zwróć również uwagę ze i zs, co oznacza: przesuń ekran w lewo / prawo kursora (bez przesuwania kursora)

+-------------------------------+
^                               |
|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                               |
+-------------------------------+

również spojrzeć na stanowisku hi li ti bi (z klawiaturą QWERTZ) c-ei c-y(również „y” jakoś punkty do dołu) na klawiaturze, aby przypomnieć sobie, gdzie ekran jest w ruchu.

eli
źródło
1

Napisałem wtyczkę która pozwala mi poruszać się po pliku bez zmiany pozycji kursora. Polega ona na złożeniu linii między twoją pozycją a pozycją docelową, a następnie przeskoczeniu nad foldem lub przerwaniu go i wcale się nie ruszaj.

Jest to także łatwy do szybkiego przełącznika pomiędzy kursorem na pierwszej linii, w ostatnim wierszu i kursor w środku klikając przycisk j, klubl gdy jesteś w trybie wtyczki.

Wydaje mi się, że byłoby dobrze tutaj.

kłapnięcie
źródło
1

Wpisz vim i wpisz:

:help z

zjest poleceniem vim dla przerysowywania, więc przerysuje plik względem położenia kursora. Dostępne opcje są następujące:

z+- Przerysowuje plik z kursorem u góry okna i na początku niepustym znakiem linii.

z-- Przerysowuje plik z kursorem na dole okna i na początku niepustym znakiem linii.

z.- Przerysowuje plik z kursorem na środku okna i na początku niepustym znakiem linii.

zt- przerysowuje plik z kursorem w górnej części okna.

zb- przerysowuje plik z kursorem na dole okna.

zz- przerysowuje plik z kursorem na środku okna.

Joe
źródło