Bagaimana cara menangani string yang berisi spasi dalam skrip Vim?


10

Saya memiliki perintah berikut di vimrc saya:

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

Ini berfungsi dengan baik jika direktori kerja saat ini seperti /home/tamlok/my_work/. Namun, jika direktori berisi spasi, seperti D:\Program Files\vim\, vim akan mengeluh.

Saya kira saya bisa memperbaiki ini menggunakan substitute()fungsi untuk mengganti semua ruang dengan ruang yang lolos. Apa yang akan dilakukan vimmer berpengalaman di sini?

Masalah lainnya adalah \pada Windows. Jika getcwd()mendapat D:\Program Files\vim\, apakah saya harus melarikan diri \dengan \\atau menggantinya /?

Untuk saat ini saya menanganinya seperti ini:

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

Apakah itu oke? Bantuan apa pun dihargai! Terima kasih banyak!

Jawaban:


14

Fungsi yang Anda cari adalah fnameescape(). Ini akan lolos dari semua karakter khusus dalam string yang diberikan yang berisi jalur ke file agar sesuai dengan standar sistem operasi saat ini.

Untuk lebih lanjut tentang ini, lihat :help fnameescape()


Terima kasih banyak! Apakah /sama dengan `\` di jalur file di GVim pada Windows?
tamlok

4
Benar, tetapi waspadalah terhadap perbedaan antara fnameescape()dan shellescape(). Yang pertama digunakan ketika melewati argumen pada baris perintah Vim, sehingga mereka tidak dianiaya oleh Vim. Nanti digunakan ketika meneruskan argumen ke perintah eksternal, sehingga tidak dianiaya oleh shell. Di Windows juga ada shellslash, yang akan memiliki pengaruh besar pada jumlah rambut di kepala Anda jika Anda perlu mengotak-atik !commanddan berteman.
Sato Katsura

2

Saya memiliki masalah yang sama. Coba gunakan saja /di jalur, dan keluar dari ruang kosong seperti ini . Misalnya saya menambahkan baris ini di vimrc saya:

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

Daripada jika Anda akan memerintahkan :echo &rtpAnda dapat melihat:

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

Perhatikan bahwa di sini tidak ada \spasi sebelum.


Terima kasih banyak! Namun, saya mendapat jalur dari pemanggilan fungsi. Jadi saya pikir saya tidak bisa mengendalikan separator di jalan. Fungsi melarikan diri diperlukan di sini, seperti yang disarankan oleh jawaban yang dipilih.
tamlok

@tamlok, saya minta maaf, tapi saya belum menggunakan fungsi - Anda lebih dalam maka saya :-) Bagikan pengetahuan Anda, ketika Anda akan menemukan jawabannya, silakan)
George Lanetz

Hai, jawaban EvergreenTree hanyalah kunci dari pertanyaan! :) terima kasih!
tamlok

@tamlok, saya bingung dengan hasil pencarian dengan kata-kata "evergreentree" di Google. Mungkin, saya tidak mengerti Anda benar.
George Lanetz

Hai, EvergreenTree adalah pengguna di StackExchange dan memposting jawaban dalam pertanyaan ini. Lihat saja di atas. :)
tamlok
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.