È possibile fare in modo che un tasto di scelta rapida con prefisso numerico esegua una funzione che più volte?


7

Trovo che se si inserisce un prefisso numerico prima di eseguire un comando ex, la convenzione che si applica è quella di impostare il comando per preparare un'operazione su un intervallo di linee. È spiegato nella documentazione,

UN NUMERO DI LINEE

Quando sai quante righe vuoi cambiare, puoi digitare il numero e poi ":". Ad esempio, quando si digita "5:", si otterrà:

    :.,.+4

Ora puoi digitare il comando che desideri utilizzare. Utilizzerà l'intervallo "." (riga corrente) fino a ". + 4" (quattro righe in basso). Quindi si estende su cinque righe.

Ora quello di cui mi occupo è una mia funzione personalizzata, questa:

function! MyAmazingEnhancedDot()
    if v:hlsearch == 1
        :normal! .n
    else
        :normal! .j
    endif
endfun

Questo è solo un modo per semplificare le attività ripetitive che includono la ripetizione di un'operazione su un intervallo di righe o su una serie di corrispondenze di ricerca.

Questa funzione è associata a un tasto di scelta rapida. Come Alt+ .o altro.

Il mio obiettivo è quello di essere in grado di fare qualcosa di molto potente: dovrei essere in grado di digitare /varName<CR>ciwnew-var<ESC>n9<Alt+.>per raggiungere la ridenominazione di 10 istanze di varNamea new-var.

Quello che succede realmente se lo faccio è che non esegue la ridenominazione e che le 9 righe sono manipolate con la mia .operazione di modifica salvata dalla colonna 0.

Posso solo supporre che Vim è interpretare le mie battute in tal modo: :.,.+8 normal! .n.

Sul lato mezzo pieno di vetro, il :normal! .jcaso della rilegatura funziona davvero, perché il jmovimento che non ha alcun effetto non ha alcuna conseguenza in questa situazione. (Ho ancora bisogno jdi farlo funzionare in un caso d'uso interattivo con prefisso non numerico).

Quindi la mia domanda è: come posso ignorare il comportamento di espansione della linea che Vim applica al mio bind? Sarebbe fantastico se potessi leggere il prefisso numerico come argomento o qualcosa del genere.

Risposte:


6

Per impostazione predefinita, vim considera tutte le funzioni come se fossero comandi ex predefiniti, vale a dire qualsiasi numero con prefisso viene utilizzato come {range}. Per cambiare questo è necessario modificare la funzione e la mappa per utilizzare un conteggio.

Mappa con conteggio

Le mappe possono contare e sono rese disponibili tramite v:counte v:count1. Il primo contiene 0 se non viene fornito alcun conteggio e il successivo contiene 1 come predefinito. Puoi creare una mappa per la tua funzione:

nnoremap <M-.> :<C-u>call MyAmazingEnhancedDot(v:count1)<cr>

Per maggiori informazioni :h v:count

Comandi con conteggio

I comandi possono avere l'opzione di a {range}o a countcome prefisso. Quando si crea il comando, il flag -countdisabilita l'opzione range e imposta automaticamente la <count>variabile su 0. Facoltativamente, è possibile fornire un valore predefinito -count=N. Il valore del prefisso è quindi disponibile tramite la variabile countnella funzione.

Un comando che utilizza count sarebbe simile al seguente:

:command -count=1 EDot call MyAmazingEnhancedDot(<count>)

Ora quando chiami la 9EDottua funzione viene chiamata con il conteggio 9anziché un intervallo.

Per maggiori informazioni vedi :h command-count

Entrambi gli esempi

Ecco il tuo codice:

function MyAmazingEnhancedDot(count)
  let c = a:count
  while c > 0
    if v:hlsearch == 1
      :normal! .n
    else
      :normal! .j
    endif
    let c -= 1
  endwhile
endfunction

command -count=1 EDot call MyAmazingEnhancedDot(<count>)

nnoremap <M-.> :<C-u>exe v:count1 . "EDot"<CR>

Ora puoi fare il tuo esempio

/varName<CR>ciwvar-name<esc>n9<M-.>

1
Freddo. Ora sembra che ci sia troppo molti modi per risolvere il mio problema! Capisco che hai combinato entrambi i meccanismi nell'esempio che hai fornito per illustrare come usarli. Ma mi chiedo se non è sufficiente usare nnoremap <M-.> :<C-u>call MyAmazingEnhancedDot(v:count1)<cr>e saltare il command -count=1 EDot call MyAmazingEnhancedDot(<count>)?
Steven Lu,

Saltare l'opzione di comando va bene. L'unico vantaggio che si ottiene dall'opzione di comando è la possibilità di chiamarlo da comandi ex come :9EDot. Se non usi molto i comandi ex, saltalo.
jecxjo,

Eccezionale. Ora la tua risposta perfetta è completa!
Steven Lu,
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.