Настроить Vim на использование собственного .vimrc легко, но как сказать ему использовать альтернативный путь вместо ~ / .vim?

15

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

Как я могу достичь того же также для папки , в которой по умолчанию является ~/.vimтаким , что я могу указать Vim из командной строки в другую папку?


Чего я хочу достичь

Хорошо, предположим, user joe( HOME=/home/joe) и user 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.

0xC0000022L
источник
Вы, вероятно, можете сделать это со старым добрым ln. например, 'mv ~ / .vim ~ / .vim-what & & ln -s ~ / .vim-what ~ / .vim`, сделайте то же самое для .vimrc. оберните все это некоторым псевдонимом bash, чтобы вы могли легко переключаться в одну или другую сторону
jar

Ответы:

9

Vim ищет в ~ / .vim, потому что этот каталог находится в списке по умолчанию в runtimepath, сокращенно как rtp. Чтобы заставить Vim искать в другом месте, вам нужно будет полностью указать другое значение 'rtp' или отредактировать значение по умолчанию, используя, например, вызов substitute (). Если вы просто хотите, чтобы 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")'
garyjohn
источник
Большое спасибо за то, что нашли время ответить. Это выглядит очень многообещающе. Я немного поработаю с этим завтра и дам вам знать, как это происходит. Я бы хотел, чтобы мой фу VimScript был сильнее, но я работаю над этим, и это указывает на многообещающее направление.
0xC0000022L
@ 0xC0000022L: способ, которым вы показали, \\~делает свою работу. Один спасение для Баша? Во всяком случае, это все еще не работает, потому что что-то другое в том, как VimScript обрабатывает ~.
0xC0000022L
Я думаю, что у меня есть это. Обратите внимание, что :set rtp?показывает «~ / .vim», но :echo &rtpрасширяется ~до полного имени пути. Кажется, работает следующее: `vim --cmd 'let & rtp = substitute (& rtp, $ HOME." / \. Vim "," alternate "," g ")'. Я обновлю свой ответ.
Гарион
спасибо, очень интересная и тонкая разница. Делает некоторые вещи более проблематичными для моего конкретного случая, но я собираюсь принять. Это сделало меня намного дальше.
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