Inoltra l'output del comando shell (!) In un nuovo buffer in Vim


Risposte:


27

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

È quasi esattamente ciò di cui ho bisogno, al contrario per poter accedere al nome file del buffer corrente. Nota: aggiornata la domanda per chiarire, si spera, il risultato finale desiderato.
Richie Marquez,

@Richard Marquez: ho aggiornato questa risposta. la nuova scheda è ora aperta con il "vecchio" nome file, quindi è possibile chiamare
:!

Ma non :r!echosenza alterare il buffer.
Luc Hermitte,

2
@garyjohn, akira: grazie per l'aiuto. La parte "<cr> = ..." ha fatto errori Vim spew, ma sono stato in grado di farlo funzionare con ": tabnew | r! Echo #".
Richie Marquez,

1
Potrebbe anche essere utile notare che se si desidera mappare questo su una chiave nel proprio .vimrc, è necessario sostituire | carattere con <bar>.
Richie Marquez,

16

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.txte 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 #

:newcrea una divisione orizzontale, utilizzare invece :vnewse si desidera una divisione verticale e :tabnewper una nuova scheda.


Sei in grado di rispondere a questa domanda anche qui ? si tratta di provare a utilizzare il buffer corrente con %per il buffer successivo ma E499.
hhh,


2

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>

vedi l'altra risposta, puoi farlo senza memorizzare il nome in una variabile. ma buona risposta comunque.
Akira,

Infatti. Non ero sicuro che "#" avrebbe dato il risultato atteso in quel caso - dato che non uso mai le schede
Luc Hermitte,
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.