2012-02-05 11 views
8

En Vim, ¿cuál es la mejor forma (portátil y rápida) de leer la salida de un comando de shell? Este resultado puede ser binario y, por lo tanto, contiene valores nulos y (no) tiene una nueva línea final que importa. Soluciones actuales que veo:La mejor forma de leer la salida del comando de shell

  1. Use system(). Problemas: no funciona con NULLs.
  2. Use :read !. Problemas: no guardará la línea nueva posterior, intenta ser un formato de salida de detección inteligente (dos/unix/mac).
  3. Uso ! con redirección de archivo temporal, entonces readfile(, "b") para leerlo. Problemas: dos llamadas para la opción fs, shellredir también redirige stderr de manera predeterminada y debería ser menos portátil (aquí se menciona 'shellredir' porque es probable que se establezca en un valor válido).
  4. Utilice system() y obtenga salidas de filtro a través de xxd. Problemas: muy lento, menos portátil (no es equivalente a 'shellredir' para tuberías).

¿Alguna otra idea?

Respuesta

4

Está utilizando un texto editor. Si te importan los NUL, los EOL finales y (posiblemente) las codificaciones conflictivas, ¿necesitas usar un editor hexadecimal de todos modos?

Si necesito esta cantidad de control de mis operaciones, que utilizan la ruta xxd de hecho, con

:se binary 

Una buena opción que parece faltar es el modo de inserción registro expresión de inserción:

Cr=system('ls -l')Introduzca

Esto puede o no ser más inteligente o menos intrusivo sobre el negocio de codificación de caracteres, pero podría intentarlo si es lo suficientemente importante para usted.

O usted podría utilizar Perl o soporte de Python para utilizar con eficacia popen

idea aproximada:

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

Usted puede tratar de ' = Sistema ('printf '' \ x00' '') '. No dará salida a nada, mientras que ':%! Printf '\ x00'' pondrá un solo NULL visto como'^@ 'en el búfer (gran problema:':%! Printf' \ x00 \ r \ n'' lo mismo). – ZyX

+0

El problema aquí es que no quiero tener dos funciones: "leer el comando en el búfer", normalmente alcanzable mediante "%!" Y "poner salida de comando en el archivo" y no puedo decir que nunca necesite más. Analógico a 'readfile()' es la solución más flexible en este caso. – ZyX

+0

Sólo pensé en usar la compatibilidad con perl/python; ver respuesta para empezar – sehe

Cuestiones relacionadas