Сказати Vim використовувати користувацький .vimrc просто, але як сказати йому використовувати альтернативний шлях замість ~ / .vim?


15

Я можу використовувати, vim -u filenameщоб використовувати filenameзамість свого замовчування .vimrc. Я використовую цей метод при перемиканні користувацьких контекстів ( su), щоб використовувати мій, .vimrc хоч і працює як суперпользователь.

Як я можу досягти того ж також для папки , в якій за замовчуванням є ~/.vimтаким , що я можу вказати 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-what && ln -s ~ / .vim-what ~ / .vim`, тоді зробіть те ж саме для .vimrc. загортайте все це за допомогою псевдоніму "Баш", щоб ви могли легко переходити так чи інакше
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 фу був сильнішим, але я працюю над цим, і це вказує на перспективний напрямок.
0xC0000022L

@ 0xC0000022L: те, як ви показали, \\~виконує цю роботу. Одну втечу для Баша, я вважаю? У будь-якому випадку це все ще не працює, тому що дещо відрізняється від обробки VimScript ~.
0xC0000022L

Я думаю, що це я маю. Зверніть увагу, що :set rtp?показує "~ / .vim", але це :echo &rtpпоширюється ~на повну назву шляху. Здається, працює так: `vim --cmd 'let & rtp = substitute (& rtp, $ HOME." / \. Vim "," alternate "," g ")'. Я оновлю свою відповідь.
garyjohn

дякую, дуже цікава і тонка різниця. Робить деякі речі більш проблематичними для мого конкретного випадку, але я прийму. Це отримало мене набагато далі.
0xC0000022L

3

У вибраному вами .vimrc ви можете вказати шлях виконання:

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

Якщо ви користуєтеся своєю особою, .vimrcви можете встановити це у своєму особистому .vimкаталозі, і воно має працювати як з suвашим звичайним обліковим записом.


Це не зовсім з командного рядка. Чи є спосіб зробити це динамічним чи так? Дивіться, я гадаю, якби я використовував щось подібне $HOMEтоді у власному обліковому записі, який би вирішив, /home/joeале як root все-таки /root... так нічого не виграється. Це .vimrcповинно працювати на платформах та версіях Vim, а встановлення абсолютного шляху повністю перешкоджає цьому. Дякую, що знайшли час для відповіді.
0xC0000022L

@ 0xC Ви вже вказуєте vimrc з командного рядка, і це, в свою чергу, визначає шлях виконання. Зауважте, що у vimrc ви можете запускати сценарії для визначення змінних, тому, якщо ви редагуєте своє запитання з точним результатом, ми, ймовірно, можемо розробити спосіб це зробити.
Павло

редагував моє запитання. Дякую за терпіння :)
0xC0000022L

Чи .bashrcможете ви користувачі встановити змінну, скажімо $REALHOME, що звільнена від, sudo reset_envа потім використати її як основу rtp?
Павло

Це звучить як один життєздатний варіант. Однак мені було легше перевезти змінні:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.