In che modo vim determina la dimensione di una singola "modifica" quando si utilizza "u" e "CTL-R"?


17

Quando uso uo CTL-Rper annullare o ripetere una modifica in vim, mi sembra di modificare pezzi di testo, non solo la sequenza di tasti più recente.

Cosa determina la dimensione del blocco considerato come una singola modifica?

Risposte:


19

Stai cercando la definizione di undo-blocks.

Da :h undo-blocks:

Un comando di annullamento normalmente annulla un comando digitato, indipendentemente dalle modifiche apportate da quel comando. Questa sequenza di modifiche annullabili forma un blocco di annullamento. Pertanto, se i tasti digitati richiamano una funzione, tutti i comandi nella funzione vengono annullati insieme.

Lo stesso blocco viene utilizzato per redo. Da :h redo:

Le ultime modifiche vengono ricordate. È possibile utilizzare i comandi Annulla e Ripeti sopra per ripristinare il testo com'era prima di ogni modifica. Puoi anche applicare nuovamente le modifiche, recuperando il testo prima dell'annullamento.


4
Puoi anche dividere manualmente un singolo blocco di annullamento con il comando CTRL-G uin modalità inserimento, che è utile se hai alcune macro in modalità inserimento.
fruglemonkey,

8

Editing modale di vim è spesso visto come un operatore (per esempio c, d...) applicato sopra un movimento (ad esempio iw, w, }, ...). Come un meraviglioso prodotto Vim ottiene un grosso annullamento. Laddove come altri editor devono fare alcune ipotesi per trasformare molti piccoli annullamenti in blocchi di annullamento, Vim lo fa naturalmente. Un altro effetto collaterale è che ti dà un operatore di ripetizione, .(noto anche come comando punto).

La tua domanda menziona specificamente le sequenze di tasti, quindi presumo che tu voglia sapere come annullare piccole modifiche mentre sei in modalità inserimento. La risposta è che questa non è "la via di Vim". "The Vim Way" significa che sarai in modalità insert per brevi raffiche alla volta. Ciò significa che quando si commettono errori nella modalità di inserimento, spesso si esce dalla modalità normale e si corregge il testo o si annulla ue si riscrive il testo.

A volte è necessario dividere un blocco di annullamento in modalità inserimento. Ciò può essere realizzato tramite <c-g>uin modalità di inserimento. Vedi :h :undoje :h undo-blocksper maggiori informazioni.

Per ulteriore aiuto, suggerisco quanto segue:

:h undo-blocks
:h :undoj
:h undo-tree
:h persistent-undo
:h undo.txt

Ci sono anche alcuni screencast su questo argomento:


"Chunky undo" - la migliore descrizione che abbia mai visto.
Matt Parker,

6

Puoi pensarlo anche in questo modo: ogni volta che vai in modalità inserimento per modificare il testo e premi Esc, questo formerà un blocco. Se provi a annullare quel blocco, andrai nella stessa posizione prima di entrare nella modalità di inserimento.

Pertanto puoi "salvare" le modifiche semplicemente uscendo di volta in volta dalla modalità di inserimento: diciamo che vai alla modalità di inserimento e scrivi una funzione. È possibile continuare a scrivere codice e passare alla funzione successiva, tuttavia a volte è preferibile tornare alla modalità normale e passare nuovamente alla modalità di inserimento. In questo modo, puoi avere il tuo codice strutturato in modo semplice e se devi tornare indietro puoi sapere in quale posizione finirai.

Nota: se usi le frecce per spostarti, è come se avessi premuto Esc+ [ hjkl]

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.