Làm thế nào để đối phó với chuỗi chứa khoảng trắng trong tập lệnh Vim?


10

Tôi có lệnh sau trong vimrc của mình:

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

Nó hoạt động tốt nếu thư mục làm việc hiện tại là như thế /home/tamlok/my_work/. Tuy nhiên, nếu thư mục chứa khoảng trắng, chẳng hạn như D:\Program Files\vim\, vim sẽ khiếu nại.

Tôi cho rằng tôi có thể sửa lỗi này bằng cách sử dụng substitute()chức năng để thay thế tất cả các không gian bằng các không gian thoát. Một vimmer có kinh nghiệm sẽ làm gì ở đây?

Một vấn đề khác là \trong Windows. Nếu getcwd()được D:\Program Files\vim\, tôi cần phải thoát khỏi \với \\hoặc thay thế nó với /?

Bây giờ tôi xử lý nó như thế này:

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

Ổn chứ? Bất kỳ trợ giúp được đánh giá cao! Cảm ơn rất nhiều!

Câu trả lời:


14

Các chức năng bạn đang tìm kiếm là fnameescape(). Nó sẽ thoát tất cả các ký tự đặc biệt trong một chuỗi nhất định có chứa đường dẫn đến tệp để khớp với tiêu chuẩn của hệ điều hành hiện tại.

Để biết thêm về điều này xem :help fnameescape()


Cảm ơn rất nhiều! Có /giống như `\` trong đường dẫn tệp trong GVim trên Windows không?
tamlok

4
Đúng, nhưng hãy cẩn thận về sự khác biệt giữa fnameescape()shellescape(). Cái trước được sử dụng khi truyền các đối số trên dòng lệnh của Vim, để chúng không bị Vim quấy nhiễu. Cái sau được sử dụng khi truyền đối số cho các lệnh bên ngoài, để chúng không bị quấy nhiễu bởi shell. Trên Windows cũng có shellslash, điều này sẽ có ảnh hưởng lớn đến số lượng tóc trên đầu của bạn nếu bạn cần phải làm phiền với !commandbạn bè.
Sato Katsura

2

Tôi đã từng gặp vấn đề tương tự. Hãy thử chỉ sử dụng /trong các đường dẫn và thoát khỏi khoảng trắng như thế này . Ví dụ tôi thêm dòng này vào vimrc của mình:

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

Hơn nếu bạn sẽ ra lệnh :echo &rtpbạn có thể thấy:

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

Lưu ý rằng ở đây không có \trước khoảng trắng.


Cảm ơn rất nhiều! Tuy nhiên, tôi đã nhận được đường dẫn từ một cuộc gọi chức năng. Vì vậy, tôi nghĩ rằng tôi không thể kiểm soát dải phân cách trên đường dẫn. Một chức năng thoát là cần thiết ở đây, giống như những gì câu trả lời được chọn cho thấy.
tamlok

@tamlok, tôi xin lỗi, nhưng tôi không sử dụng chức năng chưa - bạn là sâu vimer sau đó tôi :-) Chia sẻ kiến thức của bạn, khi bạn sẽ tìm thấy câu trả lời, xin vui lòng)
George Lanetz

Xin chào, câu trả lời của EvergreenTree chỉ là chìa khóa cho câu hỏi! :) Cảm ơn!
tamlok

@tamlok, tôi bối rối trước kết quả tìm kiếm bởi từ "evergreentree" trong Google. Có lẽ, tôi đã không hiểu bạn đúng.
George Lanetz

Xin chào, EvergreenTree là người dùng trong StackExchange và đã đăng câu trả lời trong câu hỏi này. Chỉ cần xem ở trên. :)
tamlok
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.