Como lidar com string contendo espaços no script Vim?

10

Eu tenho o seguinte comando no meu vimrc:

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

Funciona bem se o diretório de trabalho atual for semelhante /home/tamlok/my_work/. No entanto, se o diretório contiver espaços, como D:\Program Files\vim\, vim reclamará.

Suponho que posso corrigir isso usando a substitute()função para substituir todos os espaços por espaços de escape. O que um vimmer experiente faria aqui?

Outra questão é \no Windows. Se getcwd()fica D:\Program Files\vim\, eu preciso para escapar do \com \\ou substituí-lo por /?

Por enquanto, eu manejo assim:

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

Tudo bem? Qualquer ajuda é apreciada! Muito obrigado!

tamlok
fonte

Respostas:

14

A função que você está procurando é fnameescape(). Ele escapará a todos os caracteres especiais em uma determinada sequência que contém um caminho para um arquivo para corresponder ao padrão do sistema operacional atual.

Para mais informações, consulte :help fnameescape()

EvergreenTree
fonte
Muito obrigado! É /o mesmo que `\` no caminho do arquivo no GVim no Windows?
tamlok
4
É verdade, mas cuidado com a diferença entre fnameescape()e shellescape(). O primeiro é usado ao passar argumentos na linha de comando do Vim, para que eles não sejam molestados pelo Vim. O último é usado ao passar argumentos para comandos externos, para que eles não sejam molestados pelo shell. No Windows, há também shellslash, o que terá uma grande influência no número de cabelos na sua cabeça, se você precisar mexer com os !commandamigos.
Sato Katsura
2

Eu tive o mesmo problema. Tente usar apenas /nos caminhos e escape dos espaços em branco dessa maneira . Por exemplo, adiciono esta linha no meu vimrc:

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

Do que se você comandar, :echo &rtppoderá ver:

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

Observe que aqui não existe \espaço em branco antes.

George Lanetz
fonte
Muito obrigado! No entanto, eu peguei o caminho de uma chamada de função. Então, acho que não posso controlar o separador no caminho. Uma função de escape é necessária aqui, exatamente como sugere a resposta selecionada.
tamlok
@tamlok, lamento, mas eu não utilizar as funções ainda - você é mais profundo vimer então eu :-) Compartilhe o seu conhecimento, quando você vai encontrar a resposta, por favor)
George Lanetz
Olá, a resposta da EvergreenTree é apenas a chave para a pergunta! :) Obrigado!
tamlok
@tamlok, estou confuso com os resultados da pesquisa com as palavras "evergreentree" no Google. Talvez eu não tenha entendido direito.
George Lanetz
Olá, EvergreenTree é um usuário no StackExchange e postou uma resposta nesta pergunta. Basta ver acima. :)
tamlok