Vim Macro su Ogni Linea di Selezione Visual

Vorrei eseguire una macro su ogni riga in una selezione, piuttosto che complessivamente il numero di righe nella mia testa. Per esempio, potrei scrivere una macro per la trasformazione:

Last, First

In

First Last

e mi piacerebbe correre su tutte le linee:

Stewart, John 
Pumpkin, Freddy
Mai, Stefan
...

Idee Vim guru?

EDIT: Questo è solo un esempio, ovviamente questo è trivialy regexable, ma ci sono altri casi che vengono in su che non è proprio così facile che io preferisco usare le macro.

  • Per essere onesti, io probabilmente fare questo particolare compito con regex. Ma la domanda è ancora valida per i casi più complessi.
  • Perché vim? A mio parere sed è più appriopriate.
  • Perché uscire dall’editor per modificare il testo con una riga regex?
  • Ok, Hai colto il punto 😉
InformationsquelleAutor Stefan Mai | 2010-07-26



3 Replies
  1. 141

    Si supponga di avere una macro q che correva (e rimasto) su una singola linea. Quindi è possibile eseguire su ogni riga la tua selezione:

    :'<,'>normal @q
    

    (se si dispone già di un gruppo di linee di selezione, premendo : produce :'<,'> sulla riga di comando)

    Per esempio, la seguente macro usa la maiuscola per ogni parola, ma la prima su una riga:

    :let @q="^dwgU$P"
    

    In modo che in esecuzione il seguente (in cui il + linee sono selezionati)

     0000: a long long time ago
     0001: in a galaxy far away
    +0002: naboo was under an attack
    +0003: and i thought me and qui-gon jinn
    +0004: could talk the federation in
     0005: to maybe cutting them a little slack.
    

    Con sopra normal @q comando, produce:

     0000: a long long time ago
     0001: in a galaxy far away
     0002: naboo WAS UNDER AN ATTACK
     0003: and I THOUGHT ME AND QUI-GON JINN
     0004: could TALK THE FEDERATION IN
     0005: to maybe cutting them a little slack.
    
    • :let @q="^wgU$"
    • Patè: beh, sì, se si voleva golf è 🙂
    • c’è un errore di battitura nel tuo comando? per me è solo funziona in questo modo: :'<,'>normal! @q
    • controllare le mappature – si potrebbe avere modificato @q. Da :help normal – “Se [!] è dato, le mappature non verrà utilizzato.”
    • accidenti … hai ragione! Io uso yankring e a quanto pare c’è un problema con questo: … non È possibile eseguire una macro con “:normal @a”. Non è ancora possibile, ma è possibile eseguire con “:è normale!! @a” (e con l’aiuto di documenti di yankring)
    • La velocità con il collegamento !! (mettere questo all’interno del vostro .vimrc) lasciate @q=”^wgU$” vmap <leader>d <esc>:'<‘>normale @q<cr> Ora, visual selezionare il testo e premere <leader> + q. Vim è pieno di magia !.

  2. 16

    Selezionare le righe quindi premere : per entrare in modalità di comando. Vim compila automaticamente '<,'>, che limita la gamma di linee selezionate. Per il tuo esempio è possibile utilizzare il :s comando per fare lo swap:

    :'<,'>s/\(\w\+\), \(\w\+\)/\2, \1/
    

    Questo si scambia due parole separate da una virgola su ogni riga la selezione visiva.

    È inoltre possibile utilizzare '< e '> come qualsiasi altro segnalibro o la posizione della linea di, ad esempio, come parte di un comando di movimento, in modo che in modalità normale d'< di eliminare dalla posizione corrente del cursore all’inizio della prima riga la selezione visiva. I marchi rimangono in vigore anche se il blocco non è più segnalato.

    Se si desidera riprodurre una macro registrata su ogni riga il necessario per eseguire la macro con il :normal comando. Purtroppo il :normal comando non funziona su una vasta gamma di linee, ma si può rimediare con il :global comando. Questo viene eseguito un :ex comando su ogni riga che corrisponde a una regex, così si può fare questo:

    :'<,'>g/^/norm @a
    

    Spiegazione:

    :'<,'>       for every line in the visual block
    g/^/        on every line that matches the regex /^/- i.e. every line
    norm         run in normal mode
    @a           the macro recorded in a
    
    • :help :normal-range
    • Questo è meglio che il accettato di rispondere perché supporta le macro che aggiungere nuove righe.
    • @Dave, Kirby Forse sarebbe meglio di cambio ^ con . per rendere la macro esegue solo su linee che ha un po ‘ di testo, no?
  3. 1

    È possibile aggiungere la funzione riportata di seguito per il vostro ~/.vimrc o semplicemente copiare sul vostro browser e l’esecuzione di :@+

    fun! RunMacroOverSelection(macroname)
        execute "'<,'>normal @". a:macroname
    endfun
    com -nargs=1 Rover :call RunMacroOverSelection(<f-args>)
    nnoremap <leader>r :Rover<space>
    

    Il vantaggio è che si può applicare a qualsiasi macro di visual selezione.
    È necessario dare la macro lettera come argomento, come:

    :Rover a
    

Lascia un commento