Memberitahu Vim untuk menggunakan .vimrc kustom itu mudah, tetapi bagaimana cara mengatakannya untuk menggunakan jalur alternatif alih-alih ~ / .vim?

15

Saya bisa gunakan vim -u filenameuntuk menggunakan filenamebukan default saya .vimrc. Saya menggunakan metode ini ketika beralih konteks pengguna ( su) untuk menggunakan saya .vimrc meskipun berjalan sebagai pengguna super.

Bagaimana saya bisa mencapai hal yang sama juga untuk folder yang secara default ~/.vimsehingga saya bisa mengarahkan Vim dari baris perintah ke folder alternatif?


Apa yang ingin saya capai

Oke, anggap pengguna joe( HOME=/home/joe) dan pengguna root( HOME=/root). Pengguna joememiliki set alias untuk vimyang terlihat seperti ini (tetapi awalnya disetel menggunakan $HOMEvariabel untuk membuat ini dinamis):

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

Kemudian pengguna joemelakukan sesuatu di sepanjang garis sudo su -(tetapi dengan menambahkan sihir), menghasilkan .bashrcdan barang lainnya /home/joeuntuk dimuat root. Pengguna rootsekarang memiliki alias yang sama persis untuk vimditetapkan seperti yang ditunjukkan di atas.

Masalahnya adalah ini .vimrcdigunakan pada berbagai sistem dan dalam berbagai skenario. Seringkali akun Joe dipanggil joe, tetapi kadang-kadang akan menjadi sesuatu seperti local.joeatau apa pun, menghasilkan nilai yang berbeda $HOME. Jadi sulit mengkodekan jalur absolut ke ~/.vimfolder sepertinya bukan ide yang bagus. Namun, dalam skenario kami di atas pengguna roottidak memiliki folder /root/.vimyang, bagaimanapun, diharapkan ada secara default melalui yang dimuat .vimrc( /home/joe/.vimrc).

Apa yang ingin saya capai - lebih disukai di baris perintah - adalah untuk mendapatkan Vim untuk menggunakan plugin dll dari bawah /home/joe/.vimketika dimulai sebagai root(dengan asumsi aliasdiatur seperti yang ditunjukkan - kasus lain dapat diabaikan). Jika ada beberapa metode dinamis melalui VimScript, berikan pointer. Tetapi menggunakan variabel seperti $HOMEakan mengarah pada tangkapan 22, saya pikir.

0xC0000022L
sumber
Anda mungkin bisa menyelesaikan ini dengan baik ln. seperti 'mv ~ / .vim ~ / .vim-apapun && ln -s ~ / .vim-apapun ~ / .vim` maka lakukan hal yang sama untuk .vimrc. bungkus semua itu dengan beberapa bash alias sehingga Anda dapat dengan mudah beralih satu cara atau yang lain
jar

Jawaban:

9

Vim mencari ~ / .vim karena direktori itu ada dalam daftar default di 'runtimepath', disingkat 'rtp'. Untuk memberi tahu Vim untuk mencari di tempat lain, Anda harus menentukan nilai 'rtp' yang berbeda, atau mengedit default menggunakan panggilan untuk menggantikan () misalnya. Jika Anda hanya ingin Vim mencari di tempat yang berbeda untuk file konfigurasi Anda terlebih dahulu, jangan pedulikan itu juga terlihat di ~ / .vim, dan tidak peduli bahwa itu tidak terlihat di alternatif Anda setelah direktori, perintah cukup sederhana:

vim --cmd 'set rtp^=alternate_dir'

Lihat

:help --cmd
:help :set^=

Mengganti .vim dengan direktori alternatif Anda membutuhkan pengetikan yang lebih sedikit.

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

Saya mencoba mengganti ~/.vimdengan jalur lain, tetapi saya tidak bisa menyamai ~, jadi saya teruskan dan memposting apa yang saya miliki.

Edit

Alasan saya tidak bisa mencocokkan dengan ~nilai 'rtp' adalah bahwa ketika nilai diperoleh sebagai nilai &rtpdaripada output :set rtp?, ~diperluas ke nama path lengkap dari direktori home pengguna. Tidak ada ~hasilnya.

Pekerjaan berikut.

vim --cmd 'let &rtp = substitute(&rtp, $HOME."/\.vim", "alternate", "g")'
garyjohn
sumber
terima kasih banyak telah meluangkan waktu untuk menjawab. Ini terlihat sangat menjanjikan. Saya akan mengotak-atik ini sedikit besok dan memberi tahu Anda bagaimana hasilnya. Saya berharap fu VimScript saya lebih kuat, tetapi saya sedang mengusahakannya dan ini menunjuk ke arah yang menjanjikan.
0xC0000022L
@ 0xC0000022L: cara Anda menunjukkan itu \\~berfungsi. Satu jalan keluar untuk Bash, kurasa? Bagaimanapun ini masih tidak berfungsi, karena ada sesuatu yang berbeda tentang bagaimana VimScript menangani ~.
0xC0000022L
Saya rasa saya memilikinya. Perhatikan yang :set rtp?menunjukkan "~ / .vim" tetapi itu :echo &rtpdiperluas ~ke nama path lengkap. Tampaknya ini berfungsi: `vim --cmd 'let & rtp = pengganti (& rtp, $ HOME." / \. Vim "," alternate "," g ")'. Saya akan memperbarui jawaban saya.
garyjohn
terima kasih, perbedaan yang sangat menarik dan halus. Membuat beberapa hal lebih bermasalah untuk kasus spesifik saya, tetapi saya akan menerimanya. Ini membuat saya lebih jauh.
0xC0000022L
3

Di .vimrc yang Anda pilih, Anda dapat menentukan jalur runtime:

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

Jika Anda menggunakan orang .vimrcAnda maka Anda dapat mengatur ini ke .vimdirektori pribadi Anda dan itu harus berfungsi seperti halnya suakun normal Anda.

Paul
sumber
Ini bukan dari baris perintah. Apakah ada cara untuk membuat ini dinamis atau lebih? Lihat, saya kira jika saya menggunakan sesuatu seperti $HOMEitu di akun saya sendiri itu akan diselesaikan /home/joetetapi sebagai root masih untuk /root... jadi tidak ada yang dimenangkan. Ini .vimrcseharusnya bekerja di seluruh platform dan versi Vim dan menetapkan jalur absolut benar-benar menghancurkannya. Terima kasih telah meluangkan waktu untuk menjawab.
0xC0000022L
@ 0xC Anda sudah menentukan vimrc dari baris perintah, dan ini pada gilirannya menentukan path runtime. Perhatikan bahwa di vimrc Anda dapat menjalankan skrip untuk mendefinisikan variabel, jadi jika Anda mengedit pertanyaan Anda dengan hasil yang tepat, kami mungkin dapat menemukan cara untuk melakukannya.
Paul
mengedit pertanyaan saya. Terima kasih atas kesabarannya :)
0xC0000022L
Di pengguna .bashrc, dapatkah Anda menetapkan variabel, katakanlah $REALHOME, yang dikecualikan dari sudo reset_envdan kemudian menggunakannya sebagai dasar untuk rtp?
Paul
Kedengarannya seperti satu opsi yang layak. Saya merasa lebih mudah untuk menyelundupkan variabel dengan cara ini, namun:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L