C'è un modo per rilevare se sto registrando in vimscript?


11

C'è qualcosa del genere

eval("is_recording()")

che posso chiamare nel mio vimscript per scoprire se sto registrando una macro? Avrei pensato che funzionasse:

eval("mode(1)")

ma questo ritorna "n".

Non sono sicuro che sia importante, ma sto usando Neovim, quindi se è esclusivo di Neovim, va bene.


3
IMHO sarebbe una cattiva idea - "registrare", in quel caso, diventerebbe un nome falso :) Non so cosa stai cercando di fare, ma forse porre quella domanda potrebbe fornire diversi modi per risolverlo.
VanLaser,

@VanLaser Cosa intendi con falso nome?
James,

1
Se un'azione Vim è diversa quando la stai registrando, significa che il processo di registrazione stesso influisce sull'azione, quando dovrebbe solo "memorizzarla" per la ripetizione successiva. Cosa ti aspetti che accada quando esegui la macro?
VanLaser,

Risposte:


4

In primo luogo, penso che il tuo problema sia principalmente un problema XY . Dovresti fornirci ulteriori informazioni su ciò che stai cercando di fare alla fine e penso che potremmo trovare un'altra soluzione.

Ora ecco una soluzione alternativa, probabilmente non è l'ideale e certamente non molto robusto, ma potresti aggiungere queste righe al tuo .vimrc:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

L'idea è che la "modalità di registrazione" viene attivata esclusivamente quando si preme qin modalità normale.

In base a ciò crei una variabile g:isRecordingche verrà attivata / disattivata ogni volta che avvii o interrompi una registrazione. In questo modo quando si avvia la registrazione g:isRecordingverrà impostato su 1e su 0quando si interrompe la registrazione. È quindi possibile accedere allo stato di registrazione tramite il valore della variabile.

Lo "svantaggio" è che per evitare la mappatura ricorsiva, dovrai usare Shit-q per avviare e interrompere la registrazione anziché q. (Nota che non è un grosso problema: sto usando shift-qper attivare la modalità di registrazione da un po 'di tempo perché non mi piace il shift-qcomportamento originale )

Il problema principale di questa soluzione è che se ci si dimentica e si utilizza qla variabile non verrà attivata ma non sarà possibile disabilitarla q(ad es. Con nnoremap q <nop>) perché se si fa shift-qnon funzionerà più.


2

Questa è una richiesta piuttosto curiosa poiché non esiste una "modalità" per la registrazione di una macro. Dopo aver esaminato alcuni documenti, ho trovato quanto segue inusr_10

Si inizia passando al primo carattere della prima riga. Successivamente si eseguono i seguenti comandi:

qa Inizia a registrare una macro nel registro a .

^ Sposta all'inizio della riga.

i # include "Inserisci la stringa #include" all'inizio della riga.

$ Sposta alla fine della riga.

a "Aggiungi le virgolette doppie (") alla fine della riga.

j Passa alla riga successiva.

q Interrompere la registrazione della macro.

La cosa straordinaria per me è stata la frase "Inizia a registrare una macro nel registro a"

Poiché ogni macro verrà salvata in un registro per impostazione predefinita, speravo che saremmo stati in grado di vederlo :regnell'elenco. Si scopre che funziona come un fascino!

Esempio:

In modalità normale: qaisomething<Esc>

e dentro di :regnoi vediamo l'entrata!

"a   isomething^[

Con questa conoscenza dovresti essere in grado di "spiare" i registri per confermare che una macro viene registrata (usa un registro con nome su ogni registrazione [mappa qper usare sempre lo stesso registro (o qualcosa del genere)]

Se riscontri problemi fammi sapere e cercherò di aiutarti (dal momento che questa funzionalità è nuova anche per me: D)

modifica Per risolvere il problema di un registro in uso durante lo yank, ti ​​consiglio di esaminare un tipo speciale di registro che puoi usare solo per quello vimLche stai scrivendo (nessuno yank sarebbe mai impegnato sul registro ( "ay))

Ecco alcune informazioni dai :help registersregistri disponibili

Esistono dieci tipi di registri: registri E354

  1. Il registro senza nome ""

  2. 10 registri numerati da "0 a" 9

  3. Il piccolo registro di cancellazione "-

  4. 26 registri nominati da "a a" z o da "A a" Z

  5. tre registri di sola lettura ":,"., "%

  6. registro buffer alternativo "#

  7. l'espressione register "=

  8. La selezione e il drop registri "*," + e "~

  9. Il registro del buco nero "_

  10. Registro ultimo modello di ricerca "/

Supponendo che tu abbia un registro che intendi utilizzare ora il problema diventa "come faccio a sapere quando la registrazione è stata interrotta?". Per prendersi cura di questo mi piacerebbe prendere uno sguardo al autocmd-eventdi CursorHold; la nota nei documenti di aiuto sembra piuttosto promettente (proverei a capire come potrei differenziare il cursore normale Tenere premuto rispetto all'evento inattivo / inesistente che si verifica quando il tuo registro viene scritto ai fini della macro)

CursorHold

Quando l'utente non preme un tasto per il tempo specificato con 'updatetime'. Non riattivato fino a quando l'utente non ha premuto un tasto (ovvero non attiva ogni ms di "aggiornamento" se lasci Vim per fare un caffè. :) Vedi | CursorHold-example | per l'anteprima dei tag. Questo evento viene attivato solo in modalità Normale. Non viene attivato quando si attende la digitazione di un argomento di comando o un movimento dopo un operatore. Durante la registrazione dell'evento CursorHold non viene attivato. | Q |


Non vedo davvero come risolva il problema: quando finisci di registrare la tua macro una stringa viene salvata nel registro, ma come fai a differenziare quando il registro contiene una macro o quando contiene qualcosa proveniente da un comando yank per esempio. Inoltre, il registro viene salvato come uno scatto quando finisci di registrare, quindi quando vedi che il contenuto del registro è cambiato non sei più in modalità di registrazione.
statox

La mia speranza era che tu potessi usare qualcosa come il registro del buco nero (un registro che non verrà mai tirato indietro). Se hai quel registro bloccato, potresti dare un'occhiata a CursorHold che ha un comportamento speciale quando sei in modalità di registrazione (aggiornerò la mia risposta con qualche informazione in più per vedere se questo ti aiuta)
Dan Bradbury

aggiunte alcune informazioni sugli altri registri (modo per evitare conflitti con yank) e un suggerimento su come potremmo essere in grado di catturare "registrazione" con CursorHold non attivo durante la registrazione macro. Se stai ancora combattendo questo dopo quelle note fammi sapere e posso provare a implementarlo dopo che il lavoro è finito. Come nota, è blackhole registerstato menzionato solo come un suggerimento e un interessante vim tidbit che potrebbe portare a qualcosa (non sarebbe utile usarlo durante la registrazione di macro; poiché @_ non è utilizzabile.) In realtà non puoi nemmeno tentare di salvare la macro ad esso ..
Dan Bradbury,

Ho trascorso un po 'di tempo in quest'ultima notte (dopo aver rotto la tastiera della birra) e ho trovato incredibilmente difficile capire esattamente quando la registrazione è in corso e termina. Il mio sospetto CursorHoldsembra essere un sogno impossibile a causa del ritardo CursorHold che sta realmente accadendo (ha fatto accadere un semplice incremento globale ogni volta per vederlo). Ancora incredibilmente interessato a trovare un modo per farlo e continuerò a spaccarmi la faccia contro i tasti fino a quando non avremo una soluzione.
Dan Bradbury

Secondo me non hai mille diverse opzioni: devi sovrascrivere il comportamento qe fargli cambiare una variabile e iniziare / interrompere la registrazione. Un autocomando non può essere affidabile qui poiché nessun autocmd si attiva alla pressione di un tasto e non è possibile eseguire una funzione di polling a causa della natura monotread di Vim. Buona fortuna per le tue future sperimentazioni :-)
statox
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.