Nói với Vim để sử dụng .vimrc tùy chỉnh thì dễ, nhưng làm thế nào để bảo nó sử dụng đường dẫn thay thế thay vì ~ / .vim?


15

Tôi có thể sử dụng vim -u filenameđể sử dụng filenamethay vì mặc định của tôi .vimrc. Tôi đang sử dụng phương pháp này khi chuyển ngữ cảnh người dùng ( su) sang sử dụng mặc dù tôi .vimrc đang chạy như siêu người dùng.

Làm thế nào tôi có thể đạt được như vậy cũng cho thư mục mà theo mặc định là ~/.vimvì vậy mà tôi có thể chỉ Vim từ dòng lệnh để một thư mục thay thế?


Những gì tôi muốn đạt được

Được rồi, giả sử người dùng joe( HOME=/home/joe) và người dùng root( HOME=/root). Người dùng joecó một bí danh được đặt vimgiống như thế này (nhưng ban đầu được đặt bằng cách sử dụng $HOMEbiến để tạo động này):

alias vim='vim -p -N -n -i NONE -u "/home/joe/.vimrc"'

Sau đó, người dùng joethực hiện một số thứ theo dòng sudo su -(nhưng có thêm phép thuật), dẫn đến .bashrcvà các tính năng khác /home/joesẽ được tải cho root. Người dùng roothiện có cùng một bí danh cho vimtập hợp như được hiển thị ở trên.

Vấn đề là điều này .vimrcđược sử dụng trên các hệ thống khác nhau và trong các tình huống khác nhau. Thông thường tài khoản của Joe được gọi joe, nhưng đôi khi nó sẽ giống như local.joebất cứ thứ gì khác, dẫn đến một giá trị khác $HOME. Vì vậy, mã hóa cứng một đường dẫn tuyệt đối đến ~/.vimthư mục dường như không phải là một ý tưởng tốt. Tuy nhiên, trong kịch bản trên của chúng tôi, người dùng rootkhông có thư mục /root/.vim, tuy nhiên, dự kiến ​​sẽ tồn tại theo mặc định thông qua tệp được tải .vimrc( /home/joe/.vimrc).

Những gì tôi muốn đạt được - tốt nhất là trên dòng lệnh - là để Vim sử dụng các plugin, v.v. từ bên dưới /home/joe/.vimkhi bắt đầu như root(giả sử aliasđược đặt như hiển thị - các trường hợp khác có thể bị bỏ qua). Nếu có một số phương thức động thông qua VimScript, vui lòng cung cấp các con trỏ. Nhưng sử dụng các biến như $HOMEsẽ dẫn đến một cái bẫy 22, tôi nghĩ vậy.


bạn có thể có được điều này được thực hiện với cũ tốt ln. như 'mv ~ / .vim ~ / .vim-anything && ln -s ~ / .vim-anything ~ / .vim` sau đó làm tương tự cho .vimrc. kết thúc tất cả những điều đó với một số bí danh bash để bạn có thể dễ dàng chuyển đổi cách này hay cách khác
jar

Câu trả lời:


9

Vim tìm trong ~ / .vim vì thư mục đó nằm trong danh sách mặc định trong 'runtimepath', viết tắt là 'rtp'. Để yêu cầu Vim tìm ở nơi khác, bạn sẽ phải chỉ định hoàn toàn một giá trị 'rtp' khác hoặc chỉnh sửa mặc định bằng cách sử dụng lệnh gọi để thay thế (). Nếu bạn chỉ muốn Vim tìm ở một vị trí khác cho các tệp cấu hình của mình trước tiên, đừng quan tâm rằng nó cũng tìm trong ~ / .vim và đừng quan tâm rằng nó không tìm trong thư mục thay thế của bạn sau thư mục, lệnh khá đơn giản:

vim --cmd 'set rtp^=alternate_dir'

Xem

:help --cmd
:help :set^=

Thay thế .vim bằng thư mục thay thế của bạn cần thêm một chút gõ.

vim --cmd 'let &rtp = substitute(&rtp, "\.vim", "alternate", "g")'

Tôi đã cố gắng thay thế ~/.vimbằng một con đường khác, nhưng tôi không thể phù hợp với ~, vì vậy tôi đã đi trước và đăng những gì tôi có.

Biên tập

Lý do tôi không thể khớp với ~giá trị của 'rtp' là khi giá trị được lấy là giá trị &rtpthay vì đầu ra của :set rtp?, thì ~được mở rộng thành tên đường dẫn đầy đủ của thư mục chính của người dùng. Không có ~kết quả.

Các công trình sau đây.

vim --cmd 'let &rtp = substitute(&rtp, $HOME."/\.vim", "alternate", "g")'

cảm ơn rất nhiều vì đã dành thời gian trả lời Điều này có vẻ rất hứa hẹn. Tôi sẽ sửa lại điều này vào ngày mai một chút và cho bạn biết nó diễn ra như thế nào. Tôi ước VimScript fu của tôi mạnh hơn, nhưng tôi đang nghiên cứu nó và điều này hướng đến một hướng đi đầy hứa hẹn.
0xC0000022L

@ 0xC0000022L: cách bạn thể hiện nó \\~thực hiện công việc. Một lối thoát cho Bash, tôi nghĩ? Dù sao thì điều này vẫn không hoạt động, bởi vì có gì đó khác biệt về cách VimScript xử lý ~.
0xC0000022L

Tôi nghĩ rằng tôi có nó. Lưu ý rằng :set rtp?hiển thị "~ / .vim" nhưng :echo &rtpmở rộng ~thành tên đường dẫn đầy đủ. Cách sau đây có vẻ hoạt động: `vim --cmd 'let & rtp = thay thế (& rtp, $ HOME." / \. Vim "," thay thế "," g ")'. Tôi sẽ cập nhật câu trả lời của tôi.
garyjohn

cảm ơn, sự khác biệt rất thú vị và tinh tế Làm cho một số điều có vấn đề hơn cho trường hợp cụ thể của tôi, nhưng tôi sẽ chấp nhận. Điều này đã cho tôi nhiều hơn nữa.
0xC0000022L

3

Trong .vimrc bạn chọn, bạn có thể chỉ định đường dẫn thời gian chạy:

let &runtimepath=/path/to/specific/vim/folder

Nếu bạn đang sử dụng người của mình .vimrcthì bạn có thể đặt thư mục này vào .vimthư mục cá nhân của mình và nó sẽ hoạt động cả như sutài khoản bình thường của bạn.


Đây không phải là chính xác từ dòng lệnh. Có cách nào để làm cho năng động này hay không? Hãy xem, tôi cho rằng nếu tôi sử dụng một cái gì đó giống như $HOMEtrong tài khoản của mình thì nó sẽ được giải quyết /home/joenhưng với tư cách là root vẫn /root... vì vậy không có gì là chiến thắng. Điều này .vimrcđược cho là hoạt động trên các nền tảng và phiên bản Vim và thiết lập một đường dẫn tuyệt đối phá vỡ hoàn toàn điều đó. Cảm ơn đã dành thời gian để trả lời, mặc dù.
0xC0000022L

@ 0xC Bạn đã chỉ định vimrc từ dòng lệnh và đến lượt nó chỉ định đường dẫn thời gian chạy. Lưu ý rằng trong vimrc, bạn có thể chạy các tập lệnh để xác định các biến, vì vậy nếu bạn chỉnh sửa câu hỏi của mình với kết quả chính xác, có lẽ chúng ta có thể tìm ra cách để làm điều đó.
Paul

chỉnh sửa câu hỏi của tôi. Cảm ơn sự kiên nhẫn :)
0xC0000022L

Trong người dùng .bashrc, bạn có thể đặt biến, giả sử $REALHOME, được miễn trừ sudo reset_envvà sau đó sử dụng biến đó làm cơ sở cho rtpkhông?
Paul

Nghe có vẻ như một lựa chọn khả thi. Tuy nhiên, tôi thấy việc buôn lậu các biến theo cách này dễ dàng hơn:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L
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.