Come produrre il risultato dei comandi vim sulla shell


11

Diciamo che sono nella shell ( bash) e voglio vedere l'output che :scriptnamesdarebbe, ma non voglio avviare vim o forse voglio echeggiarlo in un altro file.

Quindi eseguo

vim +scriptnames

Il che mi mostra tutti gli script, ma come posso riecheggiarlo nello stdout della shell?

Risposte:


10

Ciò accade, perché di solito Vim passa alla schermata alternativa e lavora lì. All'uscita, Vim tornerà indietro e quindi non vedrai più nulla della tua sessione Vim, ma il risultato del comando eseguito anche prima di avviare Vim.

Questa funzione è spiegata su :h xterm-screens (link)

Quindi praticamente non lo vuoi e quindi vuoi disabilitarlo. Puoi farlo, impostando :set t_ti= t_te=i codici terminali che eseguono questo su vuoto.

Mettendo tutto insieme, vorresti iniziare Vim in questo modo:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

Stiamo reimpostando l' 'more'opzione, in modo da non vedere il messaggio hit-enter-prompt.


1
Questo è FANTASTICO, grazie mille! In realtà dubitavo che fosse possibile.
hgiesel,

Questo rende possibile usare VimL come un vero e proprio linguaggio di scripting di sistema lasciandolo scrivere su stdout (per i particolarmente masochisti)?
Shadowtalker,

1
Un problema è che non riesco a scorrere il terminale. (Se il testo è più lungo della mia altezza terminale non riesco a vedere la parte superiore) Il testo scompare anche se apro vim e poi esco.
FDinoff,

@FDinoff Ecco a cosa servono i cercapersone less. Basta incanalarlo in meno in questo modo vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less. All'inizio il layout potrebbe essere rovinato (è nel mio terminale), ma dopo aver premuto <CL> tutto è bello e dandy.
hgiesel,

Non vedo output durante l'esecuzione vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!', c'è solo un "flash rapido", il comando esce con il codice 0, nessun output. Mi sto perdendo qualcosa?
TrungDQ

3

Possiamo anche usare il :redircomando per reindirizzare i risultati dei comandi vim in un file

Per esempio,

vim -c "redir! > vimout | scriptnames | redir END | q"

Questo reindirizza l'output di scriptnamesnel file "vimout"


1

Apprezzo la risposta fornita da Christian Brabandt ma penso che una risposta migliore sarebbe quella di separare il comando quit usando un altro comando -c in questo modo:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

L'uso di questo metodo significa che è possibile mettere insieme un numero di comandi diversi e quindi usare l'ultimo 'q!' per uscire da Vim.


0

Per le situazioni in cui è necessario che vim sia stato caricato completamente come se fosse stato avviato manualmente, funziona:

vim -c "autocmd! CursorHold * <commands to run>"

Ad esempio, volevo reindirizzare l'output di :mapun file dalla shell, ma volevo catturare la mappatura creata da vim-compagnia aerea solo dopo che è stata visualizzata la sua scheda (riga in alto che mostra tutti i nomi di buffer aperti). Perché sembra fare questo in modo asincrono, semplicemente eseguire un -creindirizzamento su un file non gli dava il tempo di fare i mapping. Potrebbe esserci un modo migliore, ma questo funziona per me, soprattutto perché ho già updatetimeimpostato 100(0,1 secondi), il che influisce sul tempo necessario CursorHoldall'evento. Per impostazione predefinita, vim lo imposta su 4 secondi.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
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.