Come posso procurarmi una selezione visiva di vimscript?


11

Se ho un paio di righe di vimscript che voglio testare prima di inserire il mio vimrc, è possibile selezionare visivamente, quindi procurarle?

Ho provato

  • fare la selezione visiva v, quindi i movimenti per fare la selezione ecc., quindi
  • :'<,'>so

Ma vim dà un errore

nessun intervallo consentito

anche

:'<,'>w | so

Uso ! per scrivere buffer parziale

Come posso trovare vimscript selezionato visivamente?

Risposte:


11

Sulla riga di comando premi <C-u>quindi digita @*e digita.

<C-u>eliminerà l'intervallo visivo '<,'>che è stato inserito automaticamente se viene selezionato visivamente del testo.

:@*eseguirà il contenuto del *registro che contiene tutto ciò che è selezionato visivamente al momento.

Anche se il testo che è selezionato / evidenziato è nel tuo browser (firefox, chrome, ...), funzionerà, il *registro ti permetterà di accedervi direttamente in vim.


Se il testo è selezionato in un buffer vim, un'altra soluzione è copiarlo in un registro denominato, ad esempio un registro digitando "ay.

Quindi, nella riga di comando, digita: <C-r>ae inserisci.
Ctrl+ rti darà una sorta di prompt rappresentato dal personaggio "(per maggiori informazioni leggi :h c_Ctrl-r).
A questo nuovo prompt, se si fornisce il nome di un registro, il suo contenuto verrà inserito nella riga di comando, dove sarà possibile modificarlo prima dell'esecuzione.


Inoltre, se copi del testo senza specificare un registro, sarà accessibile dal registro senza nome " .

Supponiamo quindi che tu abbia una riga di vimscript in un file e desideri cercarlo rapidamente, puoi copiarlo con Y, quindi cercarlo sulla riga di comando con: :<C-r>"e invio.

Infine, se si utilizza quest'ultima soluzione, è necessario conoscere solo un problema.
Se vedi uno strano personaggio sulla riga di comando come questo ^M, è la notazione con il cursore del ritorno a capo. Dovresti eliminarlo, altrimenti probabilmente otterrai un errore.

In sintesi, tu:

  1. copia la tua riga di vimscript con Y
  2. passare alla modalità di comando con :
  3. premere <C-r>per accedere al prompt dei registri
  4. digitare "per chiamare il registro senza nome
  5. premi backspace per eliminare il ^Mpersonaggio
  6. e premi invio.

1
Dolce! : D funziona bene - non avevo mai incontrato @*prima, grazie!
the_velour_fog

Sono contento che ti abbia aiutato. Ho modificato la risposta per proporre un'altra soluzione.
saginaw,

1
bello, ho provato il tuo suggerimento su come usarlo : <C-r>a in realtà ha funzionato anche bene :) Immagino che Vim abbia letto ^M's come ritorna la riga - ed eseguito ciascuno come la sua linea / comando individuale?
the_velour_fog

Questa è una buona domanda, sinceramente non lo so. Di solito se non cancello questo personaggio ho degli errori. Sono contento che abbia funzionato per te senza errori. Forse qualcuno con maggiori conoscenze sull'argomento ci spiegherà come Vim tratta quel tipo di personaggi speciali.
saginaw,

2

In realtà lo faccio in modo leggermente diverso, faccio solo le modifiche nel mio vimrc e lo reindirizzo ogni volta che lo scrivo. (Ho un set a cascata di file vimrc quindi questo mi permette di cambiarne uno qualsiasi.)

if $MYVIMRC != ''
    autocmd BufWritePost    *vimrc      source $MYVIMRC
endif

2

Più direttamente alla domanda rispetto alla mia altra risposta, potresti definire una mappatura come questa ( nnoremapper nessuna selezione, esegui solo la riga corrente; vnoremapper quando la modalità visiva è attiva):

nnoremap <F2> :execute getline(".")<CR>
vnoremap <F2> :<C-u>for line in getline("'<", "'>") \| execute line \| endfor<CR>

In entrambi i casi, la "linea corrente" è :executed, quindi nella versione visuale si :executepassa da una riga all'altra attraverso la selezione visiva.

Come indicato in un'altra risposta, <C-u>elimina la specifica dell'intervallo che viene visualizzata nella riga di comando quando :viene digitata. I |personaggi devono essere sfuggiti perché altrimenti sono interpretati come la fine del vnoremapcomando.

Questo potrebbe anche essere trasformato in una funzione per sbarazzarsi di alcuni della ginnastica di fuga, ma non mi sembra una grande vittoria in questo momento. Fondamentalmente sarebbe la vnoremap espansa in più righe ed called con un intervallo o meno a seconda della modalità di mappatura [nv].


Oh, la mappatura della modalità visiva esegue intere linee, quindi se sei un blocco o un personaggio ignora i punti di inizio e fine all'interno delle linee.
dash-tom-bang,
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.