Movimento del cursore dopo $ motion
Gioco al fantastico gioco chiamato VIM adventures (da cui sono riportate le immagini qui sotto). La domanda proviene dal gioco, ma è anche riproducibile in VIM, quindi questo è il posto che chiedo.
Supponi di essere dentro normal mode
, in piedi su una linea n
e una colonna m
. Se premi il tasto j
, la tua posizione diventa linea n+1
e stessa colonna m
. Se la riga n+1
ha meno colonne di m
, diciamo o
, sei posizionato alla colonna o
. Premete di nuovo j
. Vieni spostato sulla riga n+2
, sulla colonna m
(stesso controllo di prima). Vedi, la colonna da cui hai iniziato,, m
è ricordata. Questo può essere visto sulla prima immagine, con linee rosse che rappresentano il j
movimento.
Tuttavia, se ci si trova normal mode
e si preme il tasto $
, si viene spostati alla fine della riga corrente. Consideriamo ora la stessa sequenza di movimenti descritta nel paragrafo precedente. Ogni movimento j
ti porterà all'ultimo carattere su quella riga. m
non viene ricordato in questo caso. Questo può essere visto nella seconda immagine. Premendo prima $
, il cursore viene posizionato alla fine della prima riga. Quindi, premendo più j
movimenti, ognuno atterra il cursore alla fine della riga, ignorando ciò m
che è stato ricordato nel primo paragrafo.
Non riesco a trovarlo in nessuna documentazione VIM. Potete spiegarmi come funziona questo meccanismo di memoria o indicarmi la parte della documentazione che lo spiega?


Risposte
Infatti, non ci sono riferimenti molto diretti a questo comportamento nella documentazione del $comando stesso.
La documentazione del g$movimento in realtà si riferisce a questo comportamento, però, nello spiegare come g$
differisce da $
:
È diverso da
$
quando l'ultimo carattere della riga non è sullo schermo o quando viene utilizzato un conteggio. Inoltre, i movimenti verticali mantengono la colonna, invece di andare alla fine della riga.
Oltre che attraverso la documentazione, puoi dare un'occhiata a come Vim implementa effettivamente questo monitoraggio delle colonne, poiché funzioni come getcurpos()esportare tali informazioni come un attributo "curswant":
Il
curswant
numero è la colonna preferita quando si sposta il cursore verticalmente.
(Troverai anche l'attributo "curswant" nel Dict restituito da winsaveview().)
Ad esempio, se ti sei spostato orizzontalmente su una lunga riga alla colonna 24, quindi verticalmente su una riga che ha solo 17 colonne, vedrai questo:
: echo getcurpos () [0, 39, 17 , 0, 24 ]
Quindi puoi vedere che sei sulla colonna 17, ma "curswant" è la colonna 24 e Vim andrà a una colonna fino a 24 se una riga ha abbastanza colonne.
Dopo aver premuto $
e dato un'altra occhiata getcurpos()
all'output, ora vedrai:
: echo getcurpos () [0, 39, 17, 0, 2147483647 ]
Quindi vedrai che Vim sta implementando il $
comportamento impostando "curswant" su un numero molto grande, che è il maggior numero di colonne che Vim può memorizzare in una singola riga.
(Quel numero è in realtà 2 31 - 1, che è il numero intero positivo massimo che puoi memorizzare in un int
tipo con segno nel linguaggio C.)