การบอกเป็นกลุ่มเพื่อใช้. vimrc แบบกำหนดเองนั้นง่าย แต่จะบอกให้ใช้เส้นทางอื่นแทน ~ / .vim ได้อย่างไร?


15

ฉันสามารถใช้vim -u filenameที่จะใช้แทนการเริ่มต้นของฉันfilename .vimrcฉันใช้วิธีนี้เมื่อเปลี่ยนบริบทผู้ใช้ ( su) เพื่อใช้งานของฉัน .vimrcแม้ว่าจะทำงานเป็น superuser

ฉันสามารถบรรลุเดียวกันยังโฟลเดอร์ซึ่งเริ่มต้นโดยเป็น~/.vimเพื่อที่ฉันสามารถชี้เป็นกลุ่มจากบรรทัดคำสั่งไปยังโฟลเดอร์ทางเลือก?


สิ่งที่ฉันต้องการเพื่อให้บรรลุ

ตกลงสมมติว่าผู้ใช้joe( HOME=/home/joe) และผู้ใช้root( HOME=/root) ผู้ใช้joeมีชุดนามแฝงvimซึ่งมีลักษณะดังนี้ (แต่เดิมตั้งค่าไว้โดยใช้$HOMEตัวแปรเพื่อสร้างไดนามิก):

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

จากนั้นผู้ใช้joeทำอะไรบางอย่างตามสายของsudo su -( แต่ด้วยเวทมนตร์ที่เพิ่มขึ้น) ส่งผลให้.bashrcและอื่น ๆ สารพัดจากที่จะโหลด/home/joe ขณะนี้rootผู้ใช้rootมีชื่อแทนเดียวกันที่แน่นอนสำหรับvimชุดดังที่แสดงด้านบน

ปัญหาคือว่าสิ่งนี้.vimrcถูกใช้ในระบบต่าง ๆ และในสถานการณ์ต่าง ๆ บ่อยครั้งที่บัญชีของโจถูกเรียกjoeแต่บางครั้งก็จะเป็นสิ่งที่ชอบหรือสิ่งอื่นที่ส่งผลให้ค่าแตกต่างกันสำหรับlocal.joe $HOMEดังนั้นการเข้ารหัสเส้นทางที่แน่นอนไปยัง~/.vimโฟลเดอร์จึงไม่ใช่ความคิดที่ดี อย่างไรก็ตามในสถานการณ์สมมติข้างต้นผู้ใช้ของเราrootไม่มีโฟลเดอร์/root/.vimซึ่งคาดว่าจะมีอยู่ตามค่าเริ่มต้นผ่านโหลด.vimrc( /home/joe/.vimrc)

สิ่งที่ฉันต้องการบรรลุ - โดยเฉพาะอย่างยิ่งในบรรทัดคำสั่ง - คือการให้ Vim ใช้ปลั๊กอิน ฯลฯ จากด้านล่าง/home/joe/.vimเมื่อเริ่มต้นเป็นroot(สมมติว่าaliasมีการตั้งค่าตามที่แสดง - กรณีอื่นสามารถละเว้นได้) หากมีวิธีการแบบไดนามิกผ่าน VimScript โปรดระบุพอยน์เตอร์ แต่การใช้ตัวแปรเช่น$HOMEจะนำไปสู่การจับ 22 ฉันคิดว่า


lnคุณอาจจะได้รับนี้ทำกับดีเก่า เช่น 'mv ~ / .vim ~ / .vim-สิ่ง && LN -s ~ / .vim-สิ่งที่ ~ / .vim` .vimrcแล้วทำเช่นเดียวกันสำหรับ ห่อทุกอย่างด้วยนามแฝง bash เพื่อให้คุณสามารถสลับทางเดียวหรืออย่างอื่นได้อย่างง่ายดาย
jar

คำตอบ:


9

Vim ดูใน ~ / .vim เนื่องจากไดเรกทอรีนั้นอยู่ในรายการเริ่มต้นใน 'runtimepath' ย่อว่า 'rtp' หากต้องการบอกให้ Vim ดูที่อื่นคุณจะต้องระบุค่า 'rtp' ที่แตกต่างกันอย่างสมบูรณ์หรือแก้ไขค่าเริ่มต้นโดยใช้การโทรเพื่อทดแทน () หากคุณเพียงต้องการให้ Vim ค้นหาสถานที่ที่แตกต่างกันสำหรับไฟล์การกำหนดค่าของคุณก่อนไม่ต้องสนใจว่ามันจะมีลักษณะเป็น ~ / .vim และไม่สนใจว่ามันจะไม่ได้ค้นหาในไดเรกทอรีอื่นหลังจากคำสั่ง ค่อนข้างง่าย:

vim --cmd 'set rtp^=alternate_dir'

ดู

:help --cmd
:help :set^=

การแทนที่. vim ด้วยไดเร็กตอรี่ทางเลือกของคุณจะใช้การพิมพ์เพิ่มขึ้นเล็กน้อย

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

ฉันพยายามแทนที่~/.vimด้วยเส้นทางอื่น แต่ฉันไม่สามารถจับคู่ได้~ดังนั้นฉันจึงไปข้างหน้าและโพสต์สิ่งที่ฉันมี

แก้ไข

เหตุผลที่ฉันไม่สามารถจับคู่กับ~ในค่าของ 'rtp' คือเมื่อได้รับค่าเป็นค่า&rtpมากกว่าการส่งออกของ:set rtp?ที่~จะถูกขยายไปยังชื่อเส้นทางแบบเต็มของไดเรกทอรีบ้านของผู้ใช้ ไม่มี~ผลลัพธ์

ผลงานดังต่อไปนี้

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

ขอบคุณมัดสำหรับการสละเวลาในการตอบ สิ่งนี้ดูมีแนวโน้มมาก พรุ่งนี้ฉันจะมีคนจรจัดนี้และบอกให้คุณรู้ว่ามันจะไปอย่างไร ฉันหวังว่า VimScript fu ของฉันจะแข็งแกร่งขึ้น แต่ฉันกำลังทำอยู่และมันจะชี้ไปในทิศทางที่สดใส
0xC0000022L

@ 0xC0000022L: วิธีที่คุณแสดงให้เห็นว่ามัน\\~ทำงานได้ดี One Escape for Bash ฉันคิดว่างั้นเหรอ? อย่างไรก็ตามเรื่องนี้ยังไม่ทำงานเพราะบางสิ่งบางอย่างที่แตกต่างกันเกี่ยวกับวิธี VimScript ~จัดการ
0xC0000022L

ฉันคิดว่าฉันมีมัน ขอให้สังเกตว่า:set rtp?จะแสดง "~ / .vim" แต่:echo &rtpจะขยาย~เป็นชื่อพา ธ แบบเต็ม ดูเหมือนว่าจะใช้งานได้ดังต่อไปนี้: `vim --cmd 'let & rtp = replace (& rtp, $ HOME." / \. vim "," Alternate "," g ")' ฉันจะอัปเดตคำตอบของฉัน
garyjohn

ขอบคุณความแตกต่างที่น่าสนใจและลึกซึ้ง ทำให้บางสิ่งเป็นปัญหามากขึ้นสำหรับกรณีเฉพาะของฉัน แต่ฉันจะยอมรับ ทำให้ฉันได้มากขึ้นอีก
0xC0000022L

3

ใน. vimrc ที่คุณเลือกคุณสามารถระบุรันไทม์พา ธ :

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

หากคุณกำลังใช้บุคคลของ.vimrcคุณคุณสามารถตั้งค่านี้เป็น.vimไดเรกทอรีส่วนบุคคลของคุณและควรใช้งานได้ทั้งsuบัญชีปกติและของคุณ


สิ่งนี้ไม่ได้มาจากบรรทัดคำสั่ง มีวิธีใดที่จะทำให้เกิดไดนามิกนี้หรือ? ดูสิฉันคิดว่าถ้าฉันจะใช้บางอย่างเช่น$HOMEนั้นในบัญชีของฉันเองมันจะแก้ปัญหา/home/joeแต่เมื่อรูทยังคง/root... สิ่งนี้.vimrcควรจะทำงานข้ามแพลตฟอร์มและเวอร์ชัน Vim และการตั้งค่าพา ธ สัมบูรณ์ที่ทำลายสิ่งนั้นทั้งหมด ขอบคุณที่สละเวลาตอบ
0xC0000022L

@ 0xC คุณกำลังระบุ vimrc จากบรรทัดคำสั่งแล้วสิ่งนี้จะระบุพา ธ รันไทม์ โปรดทราบว่าใน vimrc คุณสามารถเรียกใช้สคริปต์เพื่อกำหนดตัวแปรดังนั้นหากคุณแก้ไขคำถามของคุณด้วยผลลัพธ์ที่แน่นอนเราอาจจะสามารถหาวิธีที่จะทำได้
Paul

แก้ไขคำถามของฉัน ขอบคุณสำหรับความอดทน :)
0xC0000022L

ในผู้ใช้.bashrcคุณสามารถตั้งค่าตัวแปรพูด$REALHOMEว่าได้รับการยกเว้นจากsudo reset_envนั้นใช้เป็นพื้นฐานสำหรับrtpหรือไม่
เปาโล

ดูเหมือนหนึ่งตัวเลือกที่ทำงานได้ ฉันพบว่าการลักลอบขนย้ายตัวแปรด้วยวิธีนี้ทำได้ง่ายกว่า:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.