Come posso reindirizzare l'output di un comando shell in un nuovo buffer in Vim? Ovviamente il seguente non funzionerebbe, ma puoi vedere a cosa sto arrivando:
:!echo % | :newtab
Come posso reindirizzare l'output di un comando shell in un nuovo buffer in Vim? Ovviamente il seguente non funzionerebbe, ma puoi vedere a cosa sto arrivando:
:!echo % | :newtab
Risposte:
Non è possibile reindirizzare l'output di un comando shell in un comando che crea un nuovo buffer, ma è possibile creare un nuovo buffer e leggere l'output di un comando shell in quel buffer con una voce sulla riga comandi di Vim. Una versione funzionante del tuo esempio sarebbe
:tabnew | r !echo <c-r>=bufname("#")<cr>
Si noti che il simbolo pipe in questo caso è un separatore tra i comandi Vim ex, non la pipe della shell. Guarda anche
:help :tabnew
:help :r!
:help :bar
:r!echo
senza alterare il buffer.
Ecco cosa faccio. È accennato nei commenti nelle risposte sopra.
:new | r ! <cmd>
:new | r ! <cmd> # (# is replaced with filename)
Esempio 1 : trova tutti i file di testo in/tmp
:new | r ! find /tmp -name '*.txt'
Esempio 2 : stai modificando il file foo.txt e vuoi eseguire ls -la foo.txt
e ottenere l'output in un buffer:
:new | r ! ls -la #
Il #
è sostituito con il nome del file originale che si sta modificando tampone. Ciò è particolarmente utile per comandi di controllo del codice sorgente ad es
:new | r ! hg annotate -un #
:new
crea una divisione orizzontale, utilizzare invece :vnew
se si desidera una divisione verticale e :tabnew
per una nuova scheda.
:tabnew | enew | r ! <your shell cmd>
per me va bene.
Se è davvero necessario archiviare il risultato in un nuovo buffer, ma sono necessarie informazioni dal vecchio buffer corrente, è possibile utilizzare system()
:
:let res = system('echo '.expand('%'))
:tabnew
:put=res
o memorizzare il nome del buffer corrente per dopo :
:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>