Come spostare lo schermo senza spostare il cursore in Vim?


598

Recentemente ho scoperto le scorciatoie Ctrl+ Ee Ctrl+ Yper Vim che spostano rispettivamente lo schermo su e giù con un passo di una riga, senza spostare il cursore .

Conosci qualche comando che lascia il cursore dov'è ma sposta lo schermo in modo che la linea che ha il cursore diventi la prima riga? (Avere un comando per l'ultima riga sarebbe un bel bonus).

Posso farlo premendo manualmente Ctrl+ E(o Ctrl+ Y) il numero corretto di volte, ma avere un comando che in qualche modo lo fa direttamente sarebbe bello.

Qualche idea?


Questa domanda non dovrebbe essere nella sezione Vim?
Giovanni,

Risposte:


877
  • zz- sposta la linea corrente al centro dello schermo
    ( Attenzionezz , se ti capita di accenderti Caps Lockaccidentalmente, salverai e uscirai vim!)
  • zt - sposta la riga corrente nella parte superiore dello schermo
  • zb - sposta la riga corrente nella parte inferiore dello schermo

9
@HappyGreenKidNaps Mappa che blocca il tasto di blocco per controllare al più presto!
Aaron,

Sono piuttosto attaccato al mio blocco maiuscole, soprattutto per gestire molte macro C, ma hai altre opzioni. Innanzitutto, trova un tasto non mappato (controlla entrambi i casi per le lettere; prova ad aggiungere un modificatore o una guida, usando un simbolo o un tasto funzione, ecc.) E mappalo sulla combinazione "rischiosa" sensibile al maiuscolo / minuscolo. In secondo luogo, configura vimundo a tuo piacimento in modo da poter recuperare da un oops. (Hack non portatili in arrivo :) Terzo, fai lo stesso ma dalla configurazione della tastiera dell'utente, ad es. Tasto Windows + Z; per mappe di sequenze, prova xdotoolo triggerhappy. Infine, mostra lo stato di blocco maiuscole (impossibile eseguirlo in Vimscript.) ...
John P

2
L'interrogazione dello stato di blocco maiuscole dipende molto dall'ambiente. Ho sentito che non può essere fatto in Vimscript, e a questo punto l'ho accettato. Se vuoi percorrere quella strada, c'è xev -q, cat /proc/bus/input/devicesper trovare il dispositivo da interrogare e evtesto thd ... --dump /dev/input/event<#>per controllare lo stato, ecc. Se devi assolutamente effettuare una rimappatura a livello di sistema, almeno scambia due blocchi come maiusc <--> num - ma il problema dimentica di più che è attivo, perché se lo volevi prima, continuerai a usarlo, su qualsiasi mappa. Rompere il rischio Vim prima di files / user / system.
John P,

Altre opzioni di script Vim: attiva 'conferma' per confermare uscire / uscire / ecc .; per la scrittura, credo che avresti bisogno di un autocommand per BufWritePre con confirm(). Inoltre, invece di mappare il blocco maiuscole su ctrl, è possibile mapparlo su un tasto o una combinazione compresa ma non mappata da Vim e quindi emulare il blocco maiuscole esclusivamente in modalità inserimento / sostituzione, a mano o con qualcosa come github.com/tpope/ vim-capslock . Probabilmente non ti servirà al di fuori di Vim, ma se lo fai, scrivi uno script xmodmap per ripristinare le tue modifiche o vedi se il programma supporta i suoi mapping (e prendi appunti)
John P

3
zt / zz / zb - cursore fisso e sposta lo schermo su t op / center (tedesco: ' z entrum') / b ottom <---> H / M / L - schermo fisso e sposta il cursore su H igh / M idle / L ow position
eli

626

Inoltre:

  • Ctrl- ySposta lo schermo in alto di una riga
  • Ctrl- eSposta lo schermo in basso di una riga
  • Ctrl- uSposta il cursore e lo schermo verso l'alto di ½ pagina
  • Ctrl- dSposta il cursore e lo schermo in basso di ½ pagina
  • Ctrl- bSposta lo schermo in alto di una pagina, il cursore sull'ultima riga
  • Ctrl- fSposta lo schermo in basso di una pagina, il cursore sulla prima riga

Ctrl- ye Ctrl- ecambia la posizione del cursore solo se viene spostato fuori dallo schermo.

Per gentile concessione di http://www.lagmonster.org/docs/vi2.html


91
@ulidtko: efter (dopo in svedese), yore (che significa passato), su, giù, indietro, avanti. (Le parole avanti e indietro sono più lunghe che su e giù, quindi spostano lo schermo più a lungo;)
Moberg

12
Immagino che ieri, dato che ieri sarebbe un mnemonico migliore però ^^
Moberg

Sia Ctrl-u che Ctrl-d spostano il cursore: " Il cursore viene spostato dello stesso numero di righe nel file (se possibile; quando si avvolgono le linee e quando si colpisce la fine del file potrebbe esserci una differenza). "
Lex R

Grazie @LexR, ho aggiornato la risposta per riflettere quella distinzione.
Paul Wheeler,

1
:help CTRL-EdiceMnemonic: Extra lines.
Niko Bellic,

39

Vim richiede che il cursore sia sempre nella schermata corrente, tuttavia, è possibile aggiungere la posizione corrente ai segnalibri scorrere e quindi tornare al punto in cui ci si trovava.

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g

1
nota che se ti interessa solo andare alla riga dei segnalibri, potresti usare 'g
Matt Briggs l'

4
"Vim richiede che il cursore sia sempre nella schermata corrente" Agli utenti di Vim piace vantarsi che tutto sia configurabile in vim. Questo non lo è. Non voglio spostare il cursore mentre sto scorrendo il file. Dealbreaker for me
gadelat

8
Non ho mai avuto una situazione in cui volevo che il cursore si trovasse in un punto in cui non si vedeva. Certo, il cursore si sposta quando scorri ma puoi tornare a dove eri banalmente (in modo da poter vedere dove eri in realtà, non solo una sorta di ipotesi). Doppio back-tick per uno, Ctrl-Oper un altro davvero fantastico, e "backtick, period" ti riporta al punto in cui eri l'ultima modifica.
dash-tom-bang,

3
@gedalat, è molto fastidioso in altri editor quando scorri via, non sai più dove si trova il cursore e devi usare il mouse per fare clic da qualche parte solo per riavere il cursore. Oppure pensi di essere "qui", inizia a digitare e salta improvvisamente al punto in cui si trovava il cursore, a quel punto non puoi tornare indietro al punto in cui hai fatto scorrere, perché vengono tracciate solo le posizioni del cursore. Avere il cursore a seguire dove vai è probabilmente una buona cosa.
Shahbaz,

1
È configurabile, @gadelat. Devi solo mappare questa risposta (segna la posizione con mg, scorri, 'gvai al segno con e il gioco è fatto. Ora puoi invocare il tasto configurabile per andare in giro e ti sembrerà che il cursore non abbia mai lasciato la posizione attuale. Voilá!
Dr Beco,

18

Ecco la mia soluzione in 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

In modo che il cursore rimanga al centro dello schermo e lo schermo si sposterà su o giù.


Penso che questa soluzione sia più ciò di cui l'OP aveva bisogno. L'ho applicato e funziona come un fascino.
Gustavo Pinsard,

9
Che ne dici di impostare 'scrolloff' a metà del valore di 'righe'?
rld.

sfortunatamente "nnoremap o o <ESC> zza" perde l'autoindent, ma questo si aggira aggiungendo e rimuovendo un carattere temporaneo '.' "nnoremap o o. <ESC> zzxa"
Neil McGill

Grazie @rld, lo 'scrolloff' è anche una soluzione buona o forse migliore. Grazie! Ecco il riferimento: vim.wikia.com/wiki/…
Henry,

14

Per lasciare il cursore nella stessa colonna quando si utilizza Ctrl+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

dovresti definire la seguente opzione:

:set nostartofline

2
Lo dimentico / confondo ogni volta: zt / zz / zb - cursore fisso e sposta lo schermo su t op / center (tedesco: ' z entrum') / b ottom <---> H / M / L - schermo fisso e sposta cursore H IGH / M edio / L posizione OW
eli

8

Sono sorpreso che nessuno stia usando l' Scrolloffopzione che mantiene il cursore al centro della pagina. Provalo con:

:set so=999

È il primo metodo consigliato sul wiki di Vim e funziona bene.


3
E se non si desidera che il cursore sempre di essere proprio nel mezzo, è possibile impostarlo su un valore inferiore. Ad esempio, :set scrolloff=4richiederà che il cursore si trovi sempre ad almeno 4 righe dalla parte superiore o inferiore della finestra, in modo da avere sempre almeno un po 'di contesto.
Soren Bjornstad,

6

Ho usato queste scorciatoie in passato ( nota: tasti separati, ovvero tocca z , lascia andare, tocca il tasto successivo):

z enter -> sposta la riga corrente nella parte superiore dello schermo

z . -> sposta la riga corrente al centro dello schermo

z - -> sposta la riga corrente in basso

Se non è ovvio:

enterindica la chiave Returno Enter.

. indica il tasto DOT o "stop completo" (. ).

-indica la chiave HYPHEN ( -)

Per quello che vale, z.evita il pericolo di salvare e chiudere Vi digitando accidentalmente ZZse il blocco maiuscole è attivato.


5

Puoi aggiungere il prefisso ai comandi di spostamento del cursore con un numero e questo ripeterà quel comando tante volte

10Ctrl+ Efarà Ctrl+ E10 volte invece di una.


4

zEnter fa esattamente quello che questa domanda chiede.

Funziona dove stranamente zznon funzionerebbe (vim 7.4.1689 su Ubuntu 2016.04 LTS senza .vimrc speciale)



2

A volte è utile scorrere il testo con i tasti Ke J, quindi ho questa funzione "scroll mode" nel mio .vimrc (anche legato azs ).

Vedi scroll_mode.vim .


2

il mio mnemonico per lo scorrimento ...

L'aggiunta ad altre risposte presta anche attenzione zee zs, nel senso: sposta lo schermo a sinistra / destra del cursore (senza spostare il cursore)

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

anche guardare la posizione di he le te be (con tastiera QWERTZ) c-ee c-y(anche la "y" in qualche modo i punti verso il basso) sulla tastiera per ricordare dove lo schermo è in movimento.


1

Ho scritto un plugin che mi consente di navigare nel file senza spostare la posizione del cursore. Si basa sul piegare le linee tra la tua posizione e la posizione del bersaglio e poi saltare oltre la piega, o interromperla e non muoverti affatto.

E 'anche facile da veloce-switch tra il cursore sulla prima riga, l'ultima riga e il cursore in mezzo da solo clic j, kol quando si è nella modalità del plugin.

Immagino che sarebbe una buona scelta qui.


1

Inserisci vim e digita:

:help z

zè il comando vim per ridisegnare, quindi ridisegna il file relativamente a dove si posiziona il cursore. Le opzioni che hai sono le seguenti:

z+- Ridisegna il file con il cursore in alto della finestra e al primo carattere non vuoto della riga.

z-- Ridisegna il file con il cursore in basso della finestra e al primo carattere non vuoto della riga.

z.- Ridisegna il file con il cursore al centro della finestra e al primo carattere non vuoto della riga.

zt- Ridisegna il file con il cursore nella parte superiore della finestra.

zb- Ridisegna il file con il cursore nella parte inferiore della finestra.

zz- Ridisegna il file con il cursore al centro della finestra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.