2011-01-04 9 views
10

Soy bastante nuevo en vim, y estoy teniendo dificultades para entender algunas sutilezas con vim scripting. Específicamente, tengo problemas para trabajar con comandos que esperan una cadena sin comillas (¿hay un nombre para esto?). Por ejemploVim: `cd` a la ruta almacenada en la variable

cd some/unquoted/string/path 

El problema es que me gustaría pasar una variable, pero llamar

let pathname = 'some/path' 
cd pathname 

va a tratar de cambiar el directorio actual a 'ruta' en lugar de 'some/path'. Una forma de evitar esto es usar

let cmd = 'cd ' . pathname 
execute cmd 

pero esto parece un poco indirecto. This StackOverflow question realmente usa cd con una variable, pero no funciona en mi sistema ("a: ruta" se trata como la ruta como se describe arriba).

Uso cd como ejemplo específico, pero este comportamiento no es exclusivo de cd; por ejemplo, el comando edit también se comporta de esta manera. (¿Hay un nombre para este tipo de comando?)

Respuesta

19

TL; DR: utilizar execute 'cd' fnameescape(pathname)

Explicación: Un montón de comandos básicos que tienen nombres de archivo como sintaxis de apoyo argumento de acento grave:

command `shell command` 

o

command `=vim_expression` 

por lo su ejemplo puede escribirse como

cd `=pathname` 

si está ejecutando esto en un entorno controlado. Usted no debe utilizar esta variante de plugins porque a) no es &wildignore ajuste que podría paso en su camino: set wildignore=*|cd =pathname hará cd fallan, independientemente de lo que se almacena en el pathname y b) si nombre de ruta contiene saltos de línea que se divide en dos o más directorios.Así, lo que se debe utilizar para cualquier pieza de código que tiene la intención de compartir es

execute 'cd' fnameescape(pathname) 

Tenga en cuenta que no debe utilizar execute "cd" pathname, ya que no se preocupa por caracteres especiales en nombre de ruta (por ejemplo, espacio).

+0

¡Excelente! Esto es exactamente lo que estaba buscando. Gracias por la explicación, también. –

3

Los comandos básicos en Vim nunca hacen ningún procesamiento de variables (¿cómo sabría que no pretendía cambiar al directorio de nombre de ruta en lugar de a alguna/ruta ¿uno?). Usted no tiene que ser tan rotonda como usted sugiere, que sólo puede hacer:

exe 'cd' pathname 

en cuenta que exe concatena argumentos con un espacio de forma automática, por lo que no hace tiene que hacer:

exe 'cd ' . pathname 
+0

Gracias! Eso es de hecho más limpio. ¿Hay una lista de estos "comandos básicos"? –

+0

Eche un vistazo a ': help expression-commands' – DrAl

0

Hace mucho tiempo escribí este plugin (function FixPathName() para resolver este tipo de problemas. Ahora vim tiene algunas funciones nuevas, como shellescape(), cuando la ruta necesita ser utilizada con comandos externos.

Cuestiones relacionadas