Comment gérer la chaîne contenant des espaces dans le script Vim?

10

J'ai la commande suivante dans mon vimrc:

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

Cela fonctionne bien si le répertoire de travail actuel est similaire /home/tamlok/my_work/. Cependant, si le répertoire contient des espaces, tels que D:\Program Files\vim\, vim se plaindra.

Je suppose que je peux résoudre ce problème en utilisant la substitute()fonction pour remplacer tous les espaces par des espaces échappés. Que ferait un vimmer expérimenté ici?

Un autre problème est \dans Windows. Si getcwd()obtient D:\Program Files\vim\, dois-je échapper \à \\ou le remplacer par /?

Pour l'instant je le gère comme ceci:

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

Est-ce que ça va? Toute aide est appréciée! Merci beaucoup!

tamlok
la source

Réponses:

14

La fonction que vous recherchez est fnameescape(). Il échappera tous les caractères spéciaux dans une chaîne donnée contenant un chemin d'accès à un fichier pour correspondre à la norme du système d'exploitation actuel.

Pour en savoir plus à ce sujet, voir :help fnameescape()

Arbre à feuilles persistantes
la source
Merci beaucoup! Est-ce /la même chose que `\` dans le chemin du fichier dans GVim sous Windows?
tamlok
4
C'est vrai, mais méfiez-vous de la différence entre fnameescape()et shellescape(). Le premier est utilisé lors du passage d'arguments sur la ligne de commande de Vim, afin qu'ils ne soient pas molestés par Vim. Ce dernier est utilisé lors du passage d'arguments à des commandes externes, afin qu'ils ne soient pas agressés par le shell. Sous Windows, il y en a aussi shellslash, qui aura une influence majeure sur le nombre de cheveux sur votre tête si vous avez besoin de jouer avec !commandvos amis.
Sato Katsura
2

J'ai eu le même problème. Essayez simplement de l'utiliser /dans les chemins et échappez aux espaces comme celui-ci . Par exemple, j'ajoute cette ligne dans mon vimrc:

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

Que si vous commandez, :echo &rtpvous pouvez voir:

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

Notez qu'il n'y a pas d' \espace avant.

George Lanetz
la source
Merci beaucoup! Cependant, j'ai obtenu le chemin d'un appel de fonction. Je pense donc que je ne peux pas contrôler le séparateur dans le chemin. Une fonction d'échappement est nécessaire ici, tout comme ce que suggère la réponse sélectionnée.
tamlok
@tamlok, je suis désolé, mais je n'utilise pas encore de fonctions - vous êtes plus profond que moi :-) Partagez vos connaissances, quand vous trouverez la réponse, s'il vous plaît)
George Lanetz
Salut, la réponse d'EvergreenTree n'est que la clé de la question! :) Merci!
tamlok
@tamlok, je suis confus par les résultats de recherche par les mots "evergreentree" dans Google. Peut-être que je ne vous ai pas bien compris.
George Lanetz
Bonjour, EvergreenTree est un utilisateur de StackExchange et a publié une réponse à cette question. Voir ci-dessus. :)
tamlok