2012-06-24 47 views
12

Cuando se inicia Vim, se agarra muchas de las variables de entorno desde el sistema operativo (como PATH) y también establece que las variables de entorno propios (como MYVIMRC).¿Cómo enumerar todas las variables de entorno en Vim?

¿Cómo puedo saber lista o ver todas las variables de entorno que Vim entiende y sus respectivos valores desde dentro de Vim?

+1

http://vim.wikia.com/wiki/Displaying_the_current_Vim_environment podría ser de ayuda – epsilonhalbe

+0

Así ¿Está buscando una lista completa de heredadores de vim herederos, o está buscando todos los archivos que Vim crea por sí mismo (solo)? –

+2

Hasta donde yo sé, no es posible hacerlo por medios Vim-only. Sin embargo, en los sistemas tipo Unix uno puede usar ':! Env'. –

Respuesta

18

En la secuencia de comandos de Vim, no hay una forma diseñada de obtener la lista de las variables de entorno definidas actualmente . Sin embargo, es posible explotar la función de finalización de línea de comandos de Vim .

Considere posibles terminaciones para el siguiente comando inacabado.

:echo $ 

No es difícil ver que, de acuerdo con la sintaxis de script de Vim, todas las terminaciones son los nombres de las variables de entorno. Al pulsar la tecla wildchar (Tab, por defecto) o Ctrl +D mostrará toda de ellos.

Para obtener esta lista de terminaciones dentro de un script, necesitamos superar su naturaleza interactiva. Un posible truco que consideramos aquí para hacer que, se basa en la combinación de características. El primero de ellos es el Ctrl + Un comando. En el modo de línea de comandos, este atajo activa la inserción de cada terminación disponible frente al cursor. Estas terminaciones se enumeran en orden alfabético y se separan con espacios.

Si hacemos Vim imprimir esas terminaciones insertados directamente en la línea de comandos, que podría fácilmente capturarlos mediante la reorientación de salida de comandos con el comando :redir . Pero todo lo que necesitamos para lograr ese efecto secundario es citar el texto insertado con Ctrl +Un: cita crea el resto de nuestra :echo comando de una cadena literal que se acaba de imprimir!

:echo 'NAME1 NAME2 NAME3' 
NAME1 NAME2 NAME3 

Para editar una línea de comandos de esta manera, un usuario puede escribir :ec (un alias para :echo) continuación $, pulse Ctrl + Un, tipo ', saltar al principio del comando con Ctrl +B, mueva el cursor sobre el signo del dólar pulsando (flecha derecha) dos veces, eliminar esa $ e inserte ' en su lugar. La misma secuencia de pulsaciones de teclas se puede reproducir de forma no interactiva utilizando el comando :normal.

Juntando todas estas piezas del rompecabezas, obtenemos la siguiente función.

function! Env() 
    redir => s 
    sil! exe "norm!:ec$\<c-a>'\<c-b>\<right>\<right>\<del>'\<cr>" 
    redir END 
    return split(s) 
endfunction 

Para que este método funcione, Vim debe ser compilado con la característica +cmdline_compl .

+0

Es mejor cambiar 'echo' a' return': eso funciona para mí: 'execute' fu! Test() \ nexe'silent normal!: return $ \ '') \ \ \ \ split ('' '. \ "\\ n \" \ nendfu "'. – ZyX

13

para enumerar todas las variables de entorno, utilice

:echo $<C-D> 

A continuación, puede empezar a escribir el nombre de la variable de interés, auto-completar con Tab, finalmente pulse Introduzca para mostrar su valor.

No indicó si necesita esto de forma interactiva o en un script. Para este último, desafortunadamente no es posible capturar la salida a través del :redir.

+0

Ingo Karkat: Gracias. Interactivo está bien conmigo. –

+0

Es posible capturar la finalización de línea de comandos usando ': redir'. Sin embargo, requiere un truco no trivial. Si está interesado, vea mi [respuesta] (http://stackoverflow.com/a/11192777/254635). –

3

Mirando las otras torres, puede hacerlo sin una secuencia de comandos.

el modo insertar y pulse

<C-R>= 

Dónde Ctrl +R le permite insertar cualquiera de los registros disponibles (ver: Ayuda i_Ctrl-R). Pero particularmente utilizará el registro de expresión = aquí para evaluar una cadena (vea: help @ =).

Entonces, ahora puede insertar la expresión introducida por la respuesta de ib. Introduce este:

$<C-A>"<HOME>"<CR><ESC> 

Ahora, podrá volver al modo normal y la expresión debería haber evaluado a una cadena y ha colocado en el buffer. Puede seguir limpiándolo con un comando alternativo:

:s/\s/\r$/g 

Esto debe colocar cada variable de entorno en una línea diferente.

0

Basado en la idea de IB y los comentarios de ZYX, aquí es la función que terminé usando:

function! GetEnvVars() 
    silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>" 
endfunction 
Cuestiones relacionadas