Es fácil decirle a Vim que use .vimrc personalizado, pero ¿cómo decirle que use una ruta alternativa en lugar de ~ / .vim?

15

Puedo usar vim -u filenamepara usar en filenamelugar de mi predeterminado .vimrc. Estoy usando este método al cambiar los contextos de usuario ( su) para usar mi .vimrc aunque se ejecute como superusuario.

¿Cómo puedo lograr lo mismo también para la carpeta, que por defecto es ~/.vimpara poder apuntar Vim desde la línea de comandos a una carpeta alternativa?


Lo que quiero lograr

De acuerdo, supongamos usuario joe( HOME=/home/joe) y usuario root( HOME=/root). El usuario joetiene un conjunto de alias para vimeste aspecto (pero originalmente configurado usando la $HOMEvariable para hacer esta dinámica):

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

Luego, el usuario joehace algo en la línea de sudo su -(pero con magia adicional), lo que resulta en que se carguen las .bashrcotras golosinas . El usuario ahora tiene exactamente el mismo alias para establecer como se muestra arriba./home/joerootrootvim

El problema es que esto .vimrcse usa en varios sistemas y en varios escenarios. A menudo se llama a la cuenta de Joe joe, pero a veces será algo similar local.joeo lo que sea, lo que da como resultado un valor diferente para $HOME. Así que codificar una ruta absoluta a la ~/.vimcarpeta no parece ser una buena idea. Sin embargo, en nuestro escenario anterior, el usuario rootno tiene una carpeta /root/.vimque, sin embargo, se espera que exista de forma predeterminada a través de loaded .vimrc( /home/joe/.vimrc).

Lo que quiero lograr, preferiblemente en la línea de comando, es hacer que Vim use complementos, etc., desde abajo /home/joe/.vimcuando se inicia como root(suponiendo que aliasse configure como se muestra, se pueden ignorar otros casos). Si hay algún método dinámico a través de VimScript, proporcione punteros. Pero $HOMEcreo que usar variables como las que conducirían a una captura 22.

0xC0000022L
fuente
probablemente puedas hacer esto con los viejos tiempos ln. como 'mv ~ / .vim ~ / .vim-whatever && ln -s ~ / .vim-whatever ~ / .vim', haga lo mismo para .vimrc. envuelva todo eso con un poco de alias bash para que pueda cambiar fácilmente de una forma u otra
jar

Respuestas:

9

Vim busca en ~ / .vim porque ese directorio está en la lista predeterminada en 'runtimepath', abreviado como 'rtp'. Para decirle a Vim que busque en otro lado, tendrá que especificar completamente un valor 'rtp' diferente, o editar el valor predeterminado usando una llamada a sustituto (), por ejemplo. Si solo desea que Vim busque primero en un lugar diferente para sus archivos de configuración, no le importe que también se vea en ~ / .vim, y no le importe que no se vea en su alternativa después del directorio, el comando es bastante simple:

vim --cmd 'set rtp^=alternate_dir'

Ver

:help --cmd
:help :set^=

Reemplazar .vim con su directorio alternativo requiere un poco más de escritura.

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

Intenté reemplazarlo ~/.vimpor otro camino, pero no pude igualarlo ~, así que seguí adelante y publiqué lo que tenía.

Editar

La razón por la que no pude coincidir ~con el valor de 'rtp' es que cuando el valor se obtiene como el valor en &rtplugar de la salida de :set rtp?, ~se expande al nombre de ruta completo del directorio de inicio del usuario. No hay ~en el resultado.

Los siguientes trabajos.

vim --cmd 'let &rtp = substitute(&rtp, $HOME."/\.vim", "alternate", "g")'
garyjohn
fuente
Muchas gracias por tomarse el tiempo para responder. Esto se ve muy prometedor. Voy a jugar con esto un poco mañana y les diré cómo va. Desearía que mi VimScript fu fuera más fuerte, pero estoy trabajando en ello y esto apunta en una dirección prometedora.
0xC0000022L
@ 0xC0000022L: la forma en que lo mostró \\~hace el trabajo. Un escape para Bash, supongo. De todos modos, esto todavía no funciona, porque algo es diferente acerca de cómo VimScript maneja el ~.
0xC0000022L
Creo que lo tengo Observe que :set rtp?muestra "~ / .vim" pero que se :echo &rtpexpande ~al nombre completo de la ruta. Lo siguiente parece funcionar: `vim --cmd 'let & rtp = sustitute (& rtp, $ HOME." / \. Vim "," alternate "," g ")'. Actualizaré mi respuesta.
garyjohn
gracias, diferencia muy interesante y sutil. Hace algunas cosas más problemáticas para mi caso específico, pero voy a aceptar. Esto me llevó mucho más lejos.
0xC0000022L
3

En el .vimrc que elija, puede especificar la ruta de tiempo de ejecución:

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

Si está utilizando a su persona .vimrc, puede configurarlo en su .vimdirectorio personal y debería funcionar tanto como susu cuenta normal.

Pablo
fuente
Esto no es exactamente de la línea de comando. ¿Hay alguna manera de hacer esta dinámica más o menos? Mira, supongo que si tuviera que usar algo así $HOMEen mi propia cuenta, se resolvería, /home/joepero como root todavía /root... así que no se gana nada. Se .vimrcsupone que esto funciona en todas las plataformas y versiones de Vim y establecer una ruta absoluta lo rompe por completo. Sin embargo, gracias por tomarse el tiempo de responder.
0xC0000022L
@ 0xC Ya está especificando el vimrc desde la línea de comando, y esto a su vez especifica la ruta de tiempo de ejecución. Tenga en cuenta que en el vimrc puede ejecutar scripts para definir variables, por lo que si edita su pregunta con el resultado exacto, probablemente podamos encontrar una manera de hacerlo.
Paul
editado mi pregunta Gracias por la paciencia :)
0xC0000022L
En los usuarios .bashrc, ¿podría establecer una variable, por ejemplo $REALHOME, que esté exenta de la sudo reset_envy luego usarla como base rtp?
Paul
Suena como una opción viable. Sin embargo, me resultó más fácil contrabandear variables de esta manera:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L