¿Cómo lidiar con cadenas que contienen espacios en el script Vim?


10

Tengo el siguiente comando en mi vimrc:

execute "set path+=".getcwd()."/**"

Funciona bien si el directorio de trabajo actual es como /home/tamlok/my_work/. Sin embargo, si el directorio contiene espacios, como D:\Program Files\vim\, vim se quejará.

Supongo que puedo arreglar esto usando la substitute()función para reemplazar todos los espacios con espacios escapados. ¿Qué haría un vimmer experimentado aquí?

Otro problema es \en Windows. Si getcwd()consigue D:\Program Files\vim\, ¿necesito para escapar de la \con \\o sustituirla /?

Por ahora lo manejo así:

let mycwd=substitute(getcwd(), '\\', '/', 'g')
let mycwd=substitute(mycwd, ' ', '\\ ', 'g')
execute "set path+=".mycwd."/**"

¿Eso esta bien? Cualquier ayuda es apreciada! ¡Muchas gracias!

Respuestas:


14

La función que estás buscando es fnameescape(). Se escapará de todos los caracteres especiales en una cadena dada que contiene una ruta a un archivo para que coincida con el estándar del sistema operativo actual.

Para más sobre esto ver :help fnameescape()


¡Muchas gracias! ¿Es /lo mismo que `\` en la ruta del archivo en GVim en Windows?
Tamlok

44
Es cierto, pero ten cuidado con la diferencia entre fnameescape()y shellescape(). El primero se usa al pasar argumentos en la línea de comando de Vim, para que Vim no los moleste. El último se usa al pasar argumentos a comandos externos, para que el shell no los moleste. En Windows también existe shellslash, lo que tendrá una gran influencia en la cantidad de pelos en la cabeza si alguna vez necesita meterse con !commandamigos.
Sato Katsura el

2

Yo tuve el mismo problema. Intenta usarlo solo /en rutas y escapa de espacios en blanco como este . Por ejemplo, agrego esta línea en mi vimrc:

set rtp=C:/Program\ Files\ (x86)/Vim/vim74/vim.exe

Que si usted lo ordena :echo &rtppuede ver:

C:/Program Files (x86)/Vim/vim74/vim.exe

Tenga en cuenta que aquí no hay \espacios en blanco antes.


¡Muchas gracias! Sin embargo, obtuve el camino de una llamada de función. Así que creo que no puedo controlar el separador en el camino. Aquí se necesita una función de escape, tal como sugiere la respuesta seleccionada.
tamlok

@tamlok, lo siento, pero aún no uso las funciones; eres un vimer más profundo que yo :-) Comparte tu conocimiento, cuando encuentres la respuesta, por favor)
George Lanetz

Hola, la respuesta de EvergreenTree es solo la clave de la pregunta. :) ¡Gracias!
tamlok

@tamlok, los resultados de búsqueda me confunden con las palabras "evergreentree" en Google. Quizás, no te entendí bien.
George Lanetz

Hola, EvergreenTree es un usuario de StackExchange y publicó una respuesta en esta pregunta. Solo mira arriba. :)
tamlok
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.