2012-02-19 23 views
8

Tengo un script de Vim que llama a un script de shell externo y lee el resultado en el búfer actual. Funciona bien en sistemas Unix. Intento que el guión sea independiente del sistema operativo, por lo que también quiero que funcione para los usuarios de Windows. Aquí está la línea relevante de la secuencia de comandos:¿Cómo usar las variables de entorno de Windows en el script de Vim?

:exe ":0r !$HOME/bin/shell_script" 

De acuerdo con documentos de Vim, $HOME debería traducirse bien para los usuarios de Windows también. Usando gvim en Win XP en modo comando, haciendo

:echo $HOME 

produce de hecho "C: \ Documents and Settings \ my_user".

Sin embargo, mi script de Vim (ajustado por barras invertidas) falla en la máquina Windows con un mensaje en la ventana cmd.exe DOS diciendo

$ HOME \ bin \ shell_script" no encontrado.

En otras palabras, Vim no parece ser la ampliación del valor de $HOME antes de pasarla a cmd.exe.

no puedo usar %APPDATA% ya sea porque Vim interpreta % como el curre nt archivo y pre/añade el nombre del archivo al APPDATA. Weird that Vim does expande % pero no expande $HOME.

¿Cómo obtengo $HOME expandido correctamente? ¿Es porque estoy usando exe en la secuencia de comandos vim?

Respuesta

0

Aquí tienes alguna información acerca de las barras y las barras invertidas en vim:

http://vimdoc.sourceforge.net/htmldoc/os_dos.html

Cuando usted prefiere utilizar barras diagonales, establezca la opción 'shellslash'. Vim reemplazará las barras diagonales inversas con barras diagonales al expandir los nombres de archivo . Esto es especialmente útil cuando se utiliza un 'shell' tipo Unix.

+0

Esta pregunta no es sobre (hacia atrás) reduce drásticamente.El problema aquí es que el shell simplemente no comprende '$ HOME' – doubleDown

6

No necesita ! para leer un archivo.

:exe ":0r $HOME/bin/shell_script" 

O lee type de comandos en Windows (como cat en Linux):

:exe '0r !type "'. $HOME . '\bin\shell_script"' 

Nota:

  • la type se ejecuta en el shell de Windows, por lo que necesita \ (barra invertida) en la trayectoria
  • si $HOME contiene space s, necesita " (comillas dobles) para preserva el valor literal de space s
+1

Para aclarar, quiero ejecutar el script externo e insertar el resultado en el buffer. –

+0

@NickColeman Simplemente elimine 'type', y vuelva a ejecutar. – kev

+0

Eché de menos que se había mudado $ HOME fuera de las cotizaciones. Eso lo solucionó Gracias por la respuesta. –

4

Para aclarar la respuesta dada por Kev:

En las ventanas de la variable $ HOME no se expande correctamente cuando escapa a la consola. Por ejemplo, considere este código:

:e $HOME/myscript 

Esto funciona porque vim expande $ HOME de forma normal. Por otro lado, esto no funcionará:

:%! $HOME/myscript 

¿Por qué? Debido vim pasa todo después de ! a la carcasa subyacente, que en Windows es cmd.exe que hace las variables de entorno %LIKE_THIS%. Si intenta usar esta notación, Vim saltará y ampliar % al nombre del archivo actual - imagínate.

Cómo conseguir alrededor de él? exe utilizar la palabra clave:

:exe "%! ".$HOME."\myscript" 

Analicemos:

  • :exe es un comando que toma una cadena y lo evalúa (eval pensar en la mayoría de los idiomas)
  • "!% " el escape al shell de comandos. Tenga en cuenta que se cita para que exe pueda evaluarlo. También tenga en cuenta la forma en que hay un espacio extra allí para que cuando añadimos el hogar var no lo hace, pero justo en contra de ella
  • .$HOME del punto es un símbolo de concatenación de cadenas. El $HOME está fuera de las comillas, pero concatenan para que vim se puede expandir de forma adecuada
  • ."/myscript" camino a la escritura y los posibles argumentos (también citado)

    Lo importante aquí está manteniendo $HOME fuera de las comillas, de lo contrario, puede no expandirse adecuadamente en Windows.

1

Probablemente necesite algo así como la función expand. Por ejemplo:

:echo expand("$HOME/hello") 
/home/amir/hello 

Puede encontrar más información sobre expand() en :help expand.

Cuestiones relacionadas