Es ist einfach, Vim die Verwendung von benutzerdefiniertem .vimrc mitzuteilen, aber wie kann es angewiesen werden, anstelle von ~ / .vim einen alternativen Pfad zu verwenden?

15

Ich kann verwenden vim -u filenamezu verwenden , filenameanstatt mein Standard .vimrc. Ich verwende diese Methode, wenn ich zwischen Benutzerkontexten ( su) wechsle , um my zu verwenden .vimrc, obwohl ich als Superuser ausgeführt werde.

Wie kann ich dasselbe auch für den Ordner erreichen, der standardmäßig ~/.vimso eingestellt ist , dass ich Vim von der Befehlszeile auf einen alternativen Ordner verweisen kann ?


Was ich erreichen will

Okay, nimm user joe( HOME=/home/joe) und user root( HOME=/root) an. Der Benutzer joeverfügt über einen Alias-Satz, vimder wie folgt aussieht (der ursprünglich mithilfe der $HOMEVariablen festgelegt wurde, um diese Dynamik zu erzielen):

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

Dann joetut der Benutzer etwas in der Art von sudo su -(aber mit zusätzlicher Magie), was dazu führt, dass die .bashrcund andere Leckereien /home/joegeladen werden müssen root. Der Benutzer roothat jetzt genau den gleichen Alias vimwie oben angegeben.

Das Problem ist, dass dies .vimrcauf verschiedenen Systemen und in verschiedenen Szenarien verwendet wird. Häufig wird Joes Konto aufgerufen joe, aber manchmal ist es etwas wie local.joeoder was auch immer, was zu einem anderen Wert für führt $HOME. Es ~/.vimscheint also keine gute Idee zu sein, einen absoluten Pfad zum Ordner zu programmieren. In unserem obigen Szenario hat der Benutzer rootjedoch keinen Ordner /root/.vim, der jedoch standardmäßig über loaded .vimrc( /home/joe/.vimrc) vorhanden sein soll.

Was ich - vorzugsweise auf der Kommandozeile - erreichen möchte, ist, Vim dazu zu bringen, Plugins usw. von unten zu verwenden, /home/joe/.vimwenn es gestartet wird als root(vorausgesetzt, das aliasist wie gezeigt eingestellt - andere Fälle können ignoriert werden). Wenn es eine dynamische Methode über VimScript gibt, geben Sie bitte Zeiger an. Aber die Verwendung von Variablen, wie $HOMEsie zu einem Haken 22 führen würden, denke ich.

0xC0000022L
quelle
Sie können dies wahrscheinlich mit guten alten erledigen ln. wie 'mv ~ / .vim ~ / .vim-whatever && ln -s ~ / .vim-whatever ~ / .vim` dann mache dasselbe für .vimrc. wickeln Sie das alles mit ein paar Bash-Alias ​​ab, damit Sie leicht die eine oder andere Richtung wechseln können
jar

Antworten:

9

Vim sucht in ~ / .vim, weil sich dieses Verzeichnis in der Standardliste in 'runtimepath' befindet, abgekürzt als 'rtp'. Um Vim anzuweisen, woanders zu suchen, müssen Sie einen anderen 'rtp'-Wert vollständig angeben oder den Standardwert bearbeiten, indem Sie beispielsweise einen Aufruf von substitute () verwenden. Wenn Sie möchten, dass Vim zuerst an einer anderen Stelle nach Ihren Konfigurationsdateien sucht, ist es egal, dass es auch in ~ / .vim und in Ihrem alternativen after-Verzeichnis, dem Befehl, sucht ist ziemlich einfach:

vim --cmd 'set rtp^=alternate_dir'

Sehen

:help --cmd
:help :set^=

Das Ersetzen von .vim durch Ihr alternatives Verzeichnis erfordert etwas mehr Eingabe.

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

Ich habe versucht, ~/.vimdurch einen anderen Pfad zu ersetzen , aber ich konnte nicht mit dem übereinstimmen ~, also ging ich voran und gab bekannt, was ich hatte.

Bearbeiten

Der Grund , warum ich konnte das nicht überein ~von ‚rtp‘ im Wert besteht darin , dass , wenn der Wert als Wert erhalten wird , &rtpanstatt die Ausgabe von :set rtp?, die ~auf den Namen vollständigen Pfades erweitert werden von Home - Verzeichnis des Benutzers. Es ist kein ~Ergebnis vorhanden.

Folgendes funktioniert.

vim --cmd 'let &rtp = substitute(&rtp, $HOME."/\.vim", "alternate", "g")'
garyjohn
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben, uns zu antworten. Das sieht sehr vielversprechend aus. Ich werde morgen ein wenig daran basteln und dich wissen lassen, wie es geht. Ich wünschte, mein VimScript fu wäre stärker, aber ich arbeite daran und dies weist in eine vielversprechende Richtung.
0xC0000022L
@ 0xC0000022L: So, wie Sie es gezeigt haben, \\~erledigt es den Job. Eine Flucht für Bash, nehme ich an? Auf jeden Fall funktioniert dies immer noch nicht, da sich die Art und Weise, wie VimScript mit VimScript umgeht, ändert ~.
0xC0000022L
Ich glaube ich habe es. Beachten Sie, dass :set rtp?Shows „~ / .vim“ , aber das :echo &rtpdehnt sich ~auf den vollständigen Pfadnamen. Folgendes scheint zu funktionieren: `vim --cmd 'let & rtp = substitute (& rtp, $ HOME." / \. Vim "," alternate "," g ")'. Ich werde meine Antwort aktualisieren.
Garyjohn
Danke, sehr interessanter und subtiler Unterschied. Macht einige Dinge für meinen speziellen Fall problematischer, aber ich werde akzeptieren. Das brachte mich viel weiter.
0xC0000022L
3

In der von Ihnen ausgewählten .vimrc können Sie den Laufzeitpfad angeben:

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

Wenn Sie Ihre Person verwenden, können .vimrcSie dies auf Ihr persönliches .vimVerzeichnis einstellen und es sollte sowohl als auch suals Ihr normales Konto funktionieren .

Paul
quelle
Dies ist nicht genau von der Befehlszeile aus. Gibt es eine Möglichkeit, dies zu dynamisieren oder so? Sehen Sie, ich nehme an, wenn ich so etwas wie $HOMEdamals in meinem eigenen Konto verwenden würde, würde es sich auflösen, /home/joeaber als root immer noch /root... damit nichts gewonnen wird. Dies .vimrcsoll plattform- und vimübergreifend funktionieren, und das Festlegen eines absoluten Pfades macht das völlig unmöglich. Vielen Dank, dass Sie sich die Zeit genommen haben zu antworten.
0xC0000022L
@ 0xC Sie geben den vimrc bereits über die Befehlszeile an, und dies gibt wiederum den Laufzeitpfad an. Beachten Sie, dass Sie in vimrc Skripte ausführen können, um Variablen zu definieren. Wenn Sie also Ihre Frage mit dem genauen Ergebnis bearbeiten, können wir wahrscheinlich einen Weg finden, dies zu tun.
Paul
bearbeitet meine Frage. Vielen Dank für die Geduld :)
0xC0000022L
Könnten .bashrcSie in den Benutzern eine Variable setzen, $REALHOMEdie von der ausgenommen ist, sudo reset_envund diese dann als Grundlage verwenden für rtp?
Paul
Es klingt wie eine praktikable Option. Ich fand es jedoch einfacher, Variablen auf diese Weise zu schmuggeln:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L