2009-03-06 1 views
7

Vorrei salvare l'azione ripetuta singola corrente (questo è ciò che accade quando si preme.), Quindi eseguire una macro e quindi ripristinare il. azione (perché le macro di solito lo cambiano).Backup: ripristinare l'azione di ripetizione corrente (.) In VIM

È possibile?

In alternativa, è possibile scrivere una macro senza modificare la corrente. azione? Credo di poter provare a fare tutto in modalità Comando, ma non sono sicuro che sia possibile.

Background: Sto scrivendo una funzione di browser di file (come il comando-T in TextMate, vedere http://github.com/mdemare/fuzzy_file_finder), e voglio fare come poche modifiche possibili per l'ambiente dell'utente, in modo che i cambiamenti devono avvenire nella funzione . Attualmente, quando cambi file usando questa funzione, la tua. l'azione viene sovrascritta, il che è molto sgradito.

risposta

10

In VIM è possibile creare una macro che eseguirà tutte le modifiche che abitualmente in modalità normal senza disturbare la funzionalità redo [.] avvolgendo quelle modifiche in un utente definito :function e quindi l'esecuzione che funzione con un tasto :map ped.

Esempio

Il modo migliore per vedere è con un esempio. Si supponga di voler aggiungere il testo yyy alla fine della riga corrente ogni volta che si preme il tasto F2, ma non si desidera interferire con il comando di ripetizione [.].

Ecco come si fa:

  1. Aprire una nuova finestra vim ed eseguire i seguenti comandi:

    :fu JL() 
        normal Ayyy 
        endfu 
    :map <F2> :call JL()<Enter> 
    
  2. Ora aggiungere del testo, diciamo xxx, digitando Axxx<Esc>

  3. Ora premi la chiave [F2] e dovresti vedere xxxyyy

  4. Infine, premere il tasto [.] e si dovrebbe vedere xxxyyyxxx

Proprio quello che volevi!

Perché questo funziona

Questo funziona a causa della natura del modo VIM esegue il comando redo. VIM tiene traccia dei caratteri di un comando durante la digitazione. Quando si preme la chiave [.], inserisce nuovamente quei caratteri nel buffer della tastiera per eseguirli nuovamente. Sfortunatamente, una semplice macro q funziona allo stesso modo: inserisce caratteri nel buffer e così facendo sovrascrive il buffer di ripristino. Anche il comando :normal esegue questa operazione, ma quando viene inserito all'interno di una funzione definita dall'utente si aggira questa limitazione perché il codice che esegue la funzione definita dall'utente salva e ripristina il buffer di ripristino durante la funzione definita dall'utente.

Questo succede in eval.c e getchar.c nel codice sorgente VIM. Cerca saveRedobuff per vedere cosa sta succedendo.

4

È possibile registrare un'azione in un registro da utilizzare in un secondo momento. Premere q seguito da un registro (az, AZ, 0-9 o " sono identificatori registro validi), applicare il comando/azioni desiderate e la stampa q per arrestare la registrazione . il comando può essere richiamato premendo @ seguita da registro il.

Per istruzioni più dettagliate, vedere la sezione complex repeat del Vim documentation.

NOTA: Purtroppo, la sequenza qa.qu non farà esattamente quello che vuoi in quanto il . Il comando ripeterà l'ultima azione corrente e non l'ultima azione al momento della registrazione del comando.

+0

Lo so, non è quello che intendevo. Questo è ciò che chiamo una macro e cambia il. azione. –

+0

Bene, allora suppongo che tu risponda no ... –

4

L'unico modo in cui posso pensare di aiutarti: Rimappare "." per salvare una cronologia delle azioni, che è possibile richiamare se necessario. Per idee su queste linee, vedi il plugin repeat.vim.

+0

Come si recupera l'ultima azione rimappando '.'? Come viene memorizzata/modificata l'ultima azione? –

+0

@monjardin: In realtà non conosco quelle risposte, ma mi sono imbattuto nel plug-in di vim che sembrava fare quelle cose, quindi l'ho menzionato come possibile ispirazione. –