Come posso interrompere la registrazione dalla riga di comando?


19

Quando sto registrando una macro con qe ho finito, posso digitare:

  • q per interrompere la registrazione se sono in modalità normale o visiva.
  • <c-o>q per interrompere la registrazione se sono in modalità inserimento.
  • ..

    Come posso interrompere la registrazione se la mia macro termina in modalità comando?


Qual è il tuo caso d'uso per questo? Sono davvero solo curioso :)
PhilippFrank il

2
@PhilippFrank Cercherò spesso e sostituirò lo stesso modello con altri diversi in vari blocchi di testo. Con una tale macro, è possibile selezionare automaticamente il blocco, scrivere il modello di ricerca effettivo e posizionare il cursore sulla buona posizione per digitare la catena di sostituzione. Quando lo gioco, selezionerà il blocco, accederà alla modalità di comando, digiterà :'<,'>s/toBeReplaced//gquindi posizionerà il cursore tra i due in //modo che tutto ciò che devo fare è digitare newString<cr>e il gioco è fatto. :)
iago-lito,

Quindi è come una macro con un parametro. Ottima idea, grazie!
PhilippFrank,

@PhilippFrank tipo di, sì. Sono felice che ti piaccia. :)
iago-lito,

Risposte:


12

Un'altra soluzione è quando in modalità riga di comando, utilizzare Ctrl-fe premere qper interrompere la registrazione.

Ctrl-fconsente di aprire la finestra della riga di comando, in cui è possibile modificare il comando in modalità normale. Per convalidare il comando, utilizzare semplicemente invio.


Pertanto, dopo aver aggiunto qualcosa di simile:

cnoremap <c-q> <c-f>i<c-o>q

nel tuo .vimrc, puoi usare <c-q>per interrompere la registrazione di una macro mentre sei in modalità comando.


Florent


Devi ancora rimuovere il carattere <Cf> ( ^F) dalla fine della macro, giusto? Almeno questo è quello che vedo.
VanLaser,

Quasi lì! Davvero utile (non sapevo della finestra della riga di comando ma è eccezionale), ma .. aargh! Sembra che l'accesso a questa finestra dalla modalità di inserimento perda l'area selezionata. C'è un modo per far funzionare il comando lanciato dalla finestra della riga di comando su un'area selezionata?
iago-lito,

@VanLaser No, dato che puoi continuare a digitare il tuo comando nella finestra della riga di comando. La tua macro sarà simile qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qe quindi la registrazione si è effettivamente fermata mentre scrivevi la parte di comando. Per usare la macro: @qFINISHYOURCOMMAND<cr>e il gioco è fatto: non è necessario modificarlo. Sfortunatamente, questo non sembra funzionare dalla modalità visiva (o perde la selezione) .. o mi sono perso qualcosa?
iago-lito,

Ah, giusto :) A proposito, ho potuto selezionare un intervallo visivo, quindi fare @qe l'intervallo è stato aggiunto all'avvio del comando '<,'>- finché la macro è iniziata con :....
VanLaser

@ lago-lito In realtà, sembra che anche se non vedi la tua selezione, l'intervallo specificato (cioè '<,'>) corrisponde ancora alla selezione quando convalidi il comando.
fflorent,

17

Un modo per farlo:

  • avvia la tua macro come al solito (es. qq... altri caratteri)
  • quando si raggiunge la modalità cmdline, scrivere tutti i caratteri desiderati
  • vuoi terminare la macro qui. Premi ESCper uscire dalla modalità cmdline, qper terminare la tua macro.
  • rimuovi il ESCdal tuo qregistro (*): puoi incollarlo in un buffer, rimuovere il ^[carattere, selezionare di nuovo tutto il materiale (per quanto riguarda i caratteri) e strapparlo indietro per registrarti q.
  • il gioco è fatto: eseguire la macro: @q.

Fondamentalmente, "post-process" un po 'la tua macro, poiché è memorizzata in un registro :)

(*) Un modo rapido per rimuovere l'ultimo carattere da una macro memorizzata nel registro qsarebbe:

:let @q = @q[:-2]

Haha! Finora questo è stato il mio hack = D. Non esiste un modo "canonico" per farlo? (anche più veloce )
iago-lito,

Non ne conosco uno, ma non uso troppo le macro (preferisco invece scrivere piccole funzioni). Le macro sembrano criptiche per me, quando le guardo dopo.
VanLaser,

@VanLaser: potresti dare qualche dettaglio in più sulla linea per :let @q = @q[:-2]favore? Soprattutto come [:-2]funziona? :-)
statox

Sta "tagliando" e funziona su liste e stringhe (che è il modo in cui accedo / setto @qsopra). Alcuni esempi qui
VanLaser

@VanLaser sembrano davvero criptici. Ci sono comunque utili per ripetere piccole e sofisticate cose che devi fare in casi molto specifici .. conosci questo tipo di problemi che appaiono solo una volta e durano solo pochi minuti. Essere in grado di gestirli creando macro al volo e senza dover scrivere e eseguire il debug di una funzione dedicata è semplicemente ... woo così meraviglioso! ^ ^
iago-lito,

3

Dopo aver letto il tuo commento sul caso d'uso, sembra che potresti usare una mappatura dei tasti anziché una macro.

Ho questa linea nel mio .vimrc (non ricordo dove l'ho trovata):

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

Ha un effetto simile al caso d'uso che hai descritto, mettendoti sulla riga di comando, quindi l'unica cosa che devi fare è digitare la sostituzione e premere invio, ma in questo caso, sostituendo tutte le occorrenze della parola che era sotto il cursore .

Per sostituire solo all'interno del blocco corrente, penso che dovrebbe funzionare qualcosa di simile al seguente:

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

Ovviamente, puoi mapparlo su qualsiasi chiave tu voglia.

Cosa fa sopra: segna la posizione corrente usando il marcatore senza nome, seleziona visivamente il blocco corrente, lascia la modalità visiva e riporta il cursore nella posizione salvata (i marcatori di selezione visiva sono ancora impostati), entra in modalità comando e digita il comando sostitutivo , inserendo la parola che si trovava sotto il cursore con <C-r><C-w>e posizionando il cursore per digitare la sostituzione.


Sì, ho anche questo. Nel mio caso d'uso specifico, tuttavia, il toBeReplacedmodello non è semplice come "la parola sotto il cursore", motivo per cui ho bisogno di una piccola macro specifica che potrei creare in movimento. E poi ancora: troppo specifico per una mappa: \ Grazie comunque :)
iago-lito

2
Forse, metti lo schema in un registro, quindi adatta la mappatura sopra per ottenere automaticamente il contenuto del registro come toBeReplacedparte (invece della parola corrente sotto il cursore, che è più limitante).
VanLaser,

1
@VanLaser Giusto, che consentirebbe una mappatura generale e lo renderebbe anche molto più semplice: va{:s/<C-r>0//g<Left><Left>con questo puoi strappare qualsiasi modello di cui hai bisogno prima, e quindi premere semplicemente il tasto mappato per sostituire quel modello con qualcosa nell'attuale bloccare.
Dhakimian,
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.