Movimento del cursore dopo $ motion

Aug 22 2020

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 ne una colonna m. Se premi il tasto j, la tua posizione diventa linea n+1e stessa colonna m. Se la riga n+1ha 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 jmovimento.

Tuttavia, se ci si trova normal modee 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 jti porterà all'ultimo carattere su quella riga. mnon 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ù jmovimenti, ognuno atterra il cursore alla fine della riga, ignorando ciò mche è 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

2 filbranden Aug 22 2020 at 16:58

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 curswantnumero è 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 inttipo con segno nel linguaggio C.)