Vim: Sự khác biệt giữa hai phương pháp thiết lập biến này là gì?


1

Trong .vimrc của tôi , tôi có biến sau được định nghĩa:

let $VIMFILES = "~/.vim"

Hơn nữa trong .vimrc của tôi , tôi cố gắng đặt backupdirtùy chọn như vậy:

set backupdir=$VIMFILES/backup
" `set backupdir?` will return: backupdir=~/.vim/backup

Tuy nhiên, nó không hoạt động. Cố gắng vào :wmột tệp sẽ thất bại và trả lại như sau:

"foo" E510: Can't make backup file (add ! to override)

Thật kỳ lạ, cài đặt backupdirbằng phương pháp sau chỉ hoạt động tốt ...

exec "set backupdir=" . $VIMFILES . "/backup"
" Like the first method, `set backupdir?` will
" also return: backupdir=~/.vim/backup

Bất cứ ai cũng có thể làm sáng tỏ lý do tại sao phương pháp đầu tiên thất bại và phương pháp thứ hai hoạt động, mặc dù backupdircó giá trị mong muốn trong cả hai trường hợp? Tôi có đang sử dụng bất kỳ kỹ thuật không phù hợp nào không, và nếu vậy, tôi nên sử dụng cái gì thay thế?

Câu trả lời:


2

Tôi có thể tái tạo điều này, và thực sự, nó trông khá khó hiểu. Một điều khó khăn là :set backupdir?không nhất thiết phải in giá trị tùy chọn thực tế; nó thực hiện một số biến đổi, vì vậy những gì bạn nhìn thấy không phải lúc nào cũng được sử dụng.

Tôi nghĩ vấn đề nằm ở việc sử dụng các ~/trong $VIMFILESbiến. Khi bạn trực tiếp :settùy chọn (như được mô phỏng bởi lần :executethử cuối cùng ), Vim dường như tự động mở rộng điều đó. Nhưng khi bạn gán nó cho một biến môi trường, nó được giữ nguyên văn và do thiếu mở rộng, nên đã :writethất bại. Lưu ý rằng đầu ra giống hệt nhau vì Vim rõ ràng tự động chuyển /home/usernametrở lại ~trong đầu ra.

Tôi sẽ giải quyết điều này bằng cách mở rộng rõ ràng giá trị biến:

let $VIMFILES = expand("~/.vim")

Cảm ơn vì cái nhìn sâu sắc có giá trị! Tôi đã không nhận thức được làm thế nào và khi nào Vim nội bộ mở rộng các biến. Bạn hoàn toàn đúng về việc setchuyển đổi giá trị quá. Ví dụ :echo expand("~/.vim/backup"): trả về: /home/zeroknight/.vim/backup:set backupdir?trả về : ~/.vim/backup. Cảm ơn bạn một lần nữa cho giải pháp và cái nhìn sâu sắc!
ZeroKnight
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.