Il est facile de dire à Vim d'utiliser .vimrc personnalisé, mais comment lui dire d'utiliser un chemin alternatif au lieu de ~ / .vim?

15

Je peux utiliser vim -u filenamepour utiliser à la filenameplace de ma valeur par défaut .vimrc. J'utilise cette méthode lors du changement de contextes utilisateur ( su) pour utiliser mon .vimrc même si je cours en tant que superutilisateur.

Comment puis - je obtenir le même aussi pour le dossier qui est par défaut ~/.vimpour que je puisse pointer Vim de la ligne de commande à un autre dossier?


Ce que je veux réaliser

D'accord, supposons user joe( HOME=/home/joe) et user root( HOME=/root). L'utilisateur joea un ensemble d'alias vimqui ressemble à ceci (mais initialement défini en utilisant la $HOMEvariable pour rendre cette dynamique):

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

Ensuite, l'utilisateur joefait quelque chose dans le sens de sudo su -(mais avec de la magie supplémentaire), ce qui entraîne le chargement des .bashrcet d'autres goodies . L'utilisateur a maintenant exactement le même alias pour l' ensemble comme indiqué ci-dessus./home/joerootrootvim

Le problème est que cela .vimrcest utilisé sur divers systèmes et dans divers scénarios. Souvent, le compte de Joe est appelé joe, mais parfois ce sera quelque chose comme local.joeou quoi que ce soit d'autre, résultant en une valeur différente pour $HOME. Donc, coder en dur un chemin absolu vers le ~/.vimdossier ne semble pas être une bonne idée. Cependant, dans notre scénario ci-dessus, l'utilisateur rootne possède pas de dossier /root/.vimqui, cependant, devrait exister par défaut via le chargé .vimrc( /home/joe/.vimrc).

Ce que je veux réaliser - de préférence sur la ligne de commande - est de faire en sorte que Vim utilise des plugins, etc. /home/joe/.vimquand il est démarré en root(en supposant que la valeur aliasest définie comme indiqué - d'autres cas peuvent être ignorés). S'il existe une méthode dynamique via VimScript, veuillez fournir des pointeurs. Mais l'utilisation de variables telles que $HOMEconduirait à un catch 22, je pense.

0xC0000022L
la source
vous pouvez probablement le faire avec du bon vieux ln. comme 'mv ~ / .vim ~ / .vim-quel que soit && ln -s ~ / .vim-quel que soit ~ / .vim` puis faites de même pour .vimrc. envelopper tout cela avec un alias bash afin que vous puissiez facilement basculer dans un sens ou dans l'autre
pot

Réponses:

9

Vim regarde dans ~ / .vim parce que ce répertoire est dans la liste par défaut dans 'runtimepath', abrégé en 'rtp'. Pour dire à Vim de chercher ailleurs, vous devrez spécifier complètement une valeur 'rtp' différente, ou modifier la valeur par défaut en utilisant un appel à substitute () par exemple. Si vous voulez simplement que Vim recherche d'abord un autre endroit pour vos fichiers de configuration, ne vous souciez pas qu'il regarde également dans ~ / .vim, et ne vous souciez pas qu'il ne regarde pas dans votre répertoire alternatif après, la commande est assez simple:

vim --cmd 'set rtp^=alternate_dir'

Voir

:help --cmd
:help :set^=

Remplacer .vim par votre répertoire alternatif demande un peu plus de frappe.

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

J'ai essayé de remplacer ~/.vimpar un autre chemin, mais je ne pouvais pas faire correspondre le ~, alors j'ai continué et affiché ce que j'avais.

Éditer

La raison pour laquelle je ne pouvais pas faire correspondre la ~valeur de «rtp» est que lorsque la valeur est obtenue comme valeur de &rtpplutôt que comme sortie de :set rtp?, la ~est étendue au nom de chemin complet du répertoire personnel de l'utilisateur. Il n'y ~en a pas dans le résultat.

Les œuvres suivantes.

vim --cmd 'let &rtp = substitute(&rtp, $HOME."/\.vim", "alternate", "g")'
garyjohn
la source
merci beaucoup d'avoir pris le temps de répondre. Cela semble très prometteur. Je bricolerai avec ça un peu demain et je vous ferai savoir comment ça se passe. Je souhaite que mon fu VimScript soit plus fort, mais je travaille dessus et cela pointe dans une direction prometteuse.
0xC0000022L
@ 0xC0000022L: la façon dont vous l'avez montré \\~fait le travail. Une évasion pour Bash, je pense? Quoi qu'il en soit, cela ne fonctionne toujours pas, car quelque chose est différent sur la façon dont VimScript gère le ~.
0xC0000022L
Je pense que je l'ai. Notez que :set rtp?"~ / .vim" s'affiche, mais qu'il se :echo &rtpdéveloppe ~jusqu'au nom de chemin complet. Le texte suivant semble fonctionner: `vim --cmd 'let & rtp = substitute (& rtp, $ HOME." / \. Vim "," Alternate "," g ")'. Je mettrai à jour ma réponse.
garyjohn
merci, différence très intéressante et subtile. Rend certaines choses plus problématiques pour mon cas spécifique, mais je vais accepter. Cela m'a beaucoup aidé.
0xC0000022L
3

Dans le .vimrc que vous choisissez, vous pouvez spécifier le chemin d'exécution:

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

Si vous utilisez votre personne, .vimrcvous pouvez définir cela dans votre .vimrépertoire personnel et cela devrait fonctionner à la fois comme suet votre compte normal.

Paul
la source
Ce n'est pas exactement de la ligne de commande. Existe-t-il un moyen de rendre cette dynamique plus ou moins? Vous voyez, je suppose que si je devais utiliser quelque chose comme ça $HOMEdans mon propre compte, il se résoudrait à /home/joemais en tant que root à /root... donc rien n'est gagné. Cela .vimrcest censé fonctionner sur toutes les plateformes et versions de Vim et définir un chemin absolu rompt totalement cela. Merci d'avoir pris le temps de répondre.
0xC0000022L
@ 0xC Vous spécifiez déjà le vimrc à partir de la ligne de commande, ce qui à son tour spécifie le chemin d'exécution. Notez que dans le vimrc, vous pouvez exécuter des scripts pour définir des variables, donc si vous éditez votre question avec le résultat exact, nous pouvons probablement trouver un moyen de le faire.
Paul
édité ma question. Merci pour la patience :)
0xC0000022L
Dans les utilisateurs .bashrc, pourriez-vous définir une variable, par exemple $REALHOME, qui est exemptée de la sudo reset_env, puis l'utiliser comme base pour rtp?
Paul
Cela ressemble à une option viable. J'ai cependant trouvé plus facile de faire passer des variables de cette façon:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L