Vimスクリプトでスペースを含む文字列を処理する方法は?


10

vimrcに次のコマンドがあります。

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

現在の作業ディレクトリがのようであれば、うまく機能します/home/tamlok/my_work/。ただし、ディレクトリになどのスペースが含まれている場合D:\Program Files\vim\、vimは文句を言うでしょう。

substitute()関数を使用してこれを修正し、すべてのスペースをエスケープされたスペースに置き換えることができると思います。経験豊富なビマーはここで何をしますか?

もう1つの問題は\Windowsにあります。場合getcwd()を取得D:\Program Files\vim\、私はエスケープする必要がありますか\\\かと交換してください/

今のところ私はそれをこのように扱います:

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

それは大丈夫ですか?どんな助けでもありがたいです!どうもありがとう!

回答:


14

あなたが探している機能はfnameescape()です。現在のオペレーティングシステムの標準に一致するように、ファイルへのパスを含む特定の文字列内のすべての特殊文字をエスケープします。

これについての詳細は :help fnameescape()


どうもありがとう!ある/`\` Windows上のgvimでファイルパスと同じ?
tamlok 2015年

4
確かに、しかし、違いに注意fnameescape()してshellescape()。前者は、Vimのコマンドラインで引数を渡すときに使用されるため、Vimによって痴漢されません。後者は外部コマンドに引数を渡すときに使用されるため、それらはシェルによって痴漢されません。Windowsにはもありshellslashます。これは!command、友達や友達をいじる必要がある場合に、頭の髪の数に大きな影響を与えます。
佐藤桂

2

私も同じ問題を抱えていました。/パスでのみ使用して、このように空白をエスケープしてください。たとえば、vimrcに次の行を追加します。

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

あなたが命令:echo &rtpするならば、あなたは見ることができます:

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

ここでは\空白の前にないことに注意してください。


どうもありがとう!しかし、私は関数呼び出しからパスを取得しました。そのため、パスのセパレータを制御できないと思います。選択した答えが示唆するように、ここではエスケープ関数が必要です。
tamlok、2016

@tamlok、申し訳ありませんが、私はまだ関数を使用していません-あなたはより深いvimerです:-)知識を共有してください、あなたが答えを見つけたら、ください)
George Lanetz

こんにちは、エバーグリーンツリーの答えは質問の鍵にすぎません!:)ありがとう!
tamlok 2017年

@ tamlok、Googleの「evergreentree」という単語による検索結果に混乱しています。おそらく、私はあなたを正しく理解していませんでした。
ジョージラネッツ2017年

こんにちは、EvergreenTreeはStackExchangeのユーザーであり、この質問に回答を投稿しました。上記をご覧ください。:)
tamlok 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.