2012-02-05 16 views
8

In Vim, qual è il modo migliore (portatile e veloce) per leggere l'output di un comando shell? Questo output può essere binario e quindi contenere valori null e (non) avere newline finale che conta. Soluzioni attuali che vedo:Il modo migliore per leggere l'output del comando shell

  1. Utilizzare system(). Problemi: non funziona con NULL.
  2. Utilizzare :read !. Problemi: non salverà newline finale, cerca di essere intelligente nel rilevamento del formato di output (dos/unix/mac).
  3. Utilizzare ! con il reindirizzamento sul file temporaneo, quindi readfile(, "b") per leggerlo. Problemi: due chiamate per l'opzione fs, shellredir reindirizza lo stderr di default e dovrebbe essere meno portabile ('shellredir' è menzionato qui perché è probabile che sia impostato su un valore valido).
  4. Utilizzare system() e filtrare le uscite tramite xxd. Problemi: molto lento, meno trasportabile (nessun equivalente di 'shellredir' per i tubi).

Altre idee?

risposta

4

Si sta utilizzando un editor di testo . Se ti interessano le NUL, gli EOL finali e (forse) le codifiche in conflitto, devi comunque utilizzare un editor esadecimale?

Se ho bisogno di questa quantità di controllo delle mie operazioni, io uso il percorso xxd anzi, con

:se binary 

Un'opzione bello ti sembra di perdere è inserto modalità registro espressione inserimento:

Credito=system('ls -l')Inserisci

Questo può o non può essere più intelligente/meno intrusivo nei confronti della codifica dei caratteri aziendali, ma è possibile provarlo se è abbastanza importante per te.

Oppure si potrebbe usare Perl o supporto Python utilizzare efficacemente popen

un'idea approssimativa:

:perl open(F, "ls /tmp/ |"); my @lines = (<F>); $curbuf->Append(0, @lines) 
+0

si può provare ' = sistema ('printf '' \ x00' '') '. Non uscirà nulla, mentre ':%! Printf '\ x00'' metterà il singolo NULL visto come'^@ 'nel buffer (grosso problema:':%! Printf' \ x00 \ r \ n'' non lo stesso). – ZyX

+0

Il problema è che non voglio avere due funzioni: "legge il comando nel buffer", normalmente ottenibile da "%!" E "metti l'output del comando nel file" e non posso dire che non avrò mai più bisogno. Analog to 'readfile()' è la soluzione più flessibile in questo caso. – ZyX

+0

Ho appena pensato di usare il supporto perl/python; vedere la risposta per l'antipasto – sehe