Avevo lo stesso tuo desiderio: volevo scrivere normali comandi vim e fare in modo che quelli modificassero un flusso di pipeline. Sono stato deluso dalla difficoltà di usare Vim normale in questo modo (così tante bandiere!), Come fornito dalle opzioni di vim predefinite.
Pertanto, ho scritto un piccolo wrapper su vim per farlo: https://github.com/MilesCranmer/vim-stream/ . Si chiama vims
.
Il cuore del wrapper è il seguente comando:
vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2
Usando questo, con la generazione del comando che faccio, risulta abbastanza conciso, e poiché vim è un editor modale, ho creato vims
un editor di flusso modale. Esistono tre modalità principali utili per la mentalità di modifica della pipeline:
[-t|--turn-off-mode] - (Default mode)
Every string is a vim command line, e.g., '%g/foo/d' deletes
all lines with foo.
[-e|--exe-mode] - Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] - Like exe-mode, but runs on 1st line only
Guarda questo:
$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World
Quindi, e
va fino alla fine Hello
, quindi a
inizia ad aggiungere.
Qualcosa di più elaborato, in modalità exe, per commentare le righe contenenti my_bad_var
ed eliminare la riga precedente.
cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'
Il che si traduce in vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'
: l' I
essere il comando per iniziare l'inserimento all'inizio della riga e //
la sequenza di commenti.
\<esc>kdd
preme il tasto Esc, si sposta su una riga, quindi elimina la riga.
Ho 11 esempi totali sul repository, ti incoraggio a verificarli. Ancora una volta, questo è in esecuzione su vim, è solo un modo per rendere vim più simile a sed per l'input di streaming (ma preservando tutte le tue amate macro di vim!)
|
personaggio convoglia l'output di un comando verso un altro.wea-this
non è un comando. Le tubazioni non possono essere utilizzate neanche per ottenere ciò che stai cercando di fare; farà sì che lo stdin di Vim sia l'applicazione per la mano sinistra, non la tastiera. Se si desidera ottenere standard input in un buffer in vim, avviarlo con un meno per il nome del file:echo Hello, world! | vim -
.