Dire a Vim di usare .vimrc personalizzato è facile, ma come dirgli di usare un percorso alternativo invece di ~ / .vim?


15

Posso usare vim -u filenameper usare al filenameposto del mio default .vimrc. Sto usando questo metodo quando cambio contesti utente ( su) per usare my .vimrc anche se in esecuzione come superutente.

Come posso ottenere lo stesso anche per la cartella che per impostazione predefinita è in ~/.vimmodo da poter puntare Vim dalla riga di comando a una cartella alternativa?


Quello che voglio ottenere

Bene, supponiamo user joe( HOME=/home/joe) e user root( HOME=/root). L'utente joeha un alias impostato per vimquesto simile (ma originariamente impostato usando la $HOMEvariabile per renderlo dinamico):

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

Quindi l'utente joefa qualcosa sulla falsariga di sudo su -(ma con aggiunta di magia), con conseguente caricamento delle .bashrcaltre chicche . L'utente ha ora lo stesso alias esatto per set come mostrato sopra./home/joerootrootvim

Il problema è che questo .vimrcè usato su vari sistemi e in vari scenari. Spesso viene chiamato l'account di Joe joe, ma a volte sarà qualcosa di simile local.joeo qualunque altra cosa, con un valore diverso per $HOME. Quindi scrivere un percorso assoluto nella ~/.vimcartella non sembra essere una buona idea. Tuttavia, nel nostro scenario sopra, l'utente rootnon ha una cartella /root/.vimche, tuttavia, dovrebbe esistere per impostazione predefinita tramite il file caricato .vimrc( /home/joe/.vimrc).

Quello che voglio ottenere - preferibilmente dalla riga di comando - è far sì che Vim usi i plugin ecc. Da sotto /home/joe/.vimquando viene avviato come root(supponendo che aliassia impostato come mostrato - altri casi possono essere ignorati). Se esiste un metodo dinamico tramite VimScript, fornire i puntatori. Ma usare variabili come questa $HOMEporterebbe ad una cattura 22, credo.


probabilmente puoi farlo con un buon vecchio ln. come 'mv ~ / .vim ~ / .vim-qualunque cosa && ln -s ~ / .vim-qualunque ~ / .vim` quindi fare lo stesso per .vimrc. termina tutto con un po 'di alias bash in modo da poter facilmente cambiare in un modo o nell'altro
jar

Risposte:


9

Vim appare in ~ / .vim perché quella directory è nell'elenco predefinito in 'runtimepath', abbreviato in 'rtp'. Per dire a Vim di cercare altrove, dovrai specificare completamente un diverso valore 'rtp', o modificare il default usando ad esempio una chiamata a substitute (). Se vuoi solo che Vim cerchi prima in un posto diverso i tuoi file di configurazione, non preoccuparti che guardi anche in ~ / .vim, e non importa che non guardi nella tua alternativa dopo la directory, il comando è piuttosto semplice:

vim --cmd 'set rtp^=alternate_dir'

Vedere

:help --cmd
:help :set^=

Sostituire .vim con la tua directory alternativa richiede un po 'più di battitura.

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

Ho provato a sostituirlo ~/.vimcon un altro percorso, ma non ho potuto eguagliare il ~, quindi sono andato avanti e ho pubblicato quello che avevo.

modificare

Il motivo per cui non ho potuto trovare una corrispondenza ~con il valore di 'rtp' è che quando il valore viene ottenuto come valore &rtpanziché come output di :set rtp?, ~viene espanso nel nome percorso completo della home directory dell'utente. Non c'è ~nel risultato.

I seguenti lavori.

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

grazie mille per il tempo dedicato a rispondere. Sembra molto promettente. Ci penserò un po 'domani e ti farò sapere come va. Vorrei che il mio VimScript fu più forte, ma ci sto lavorando e questo punta in una direzione promettente.
0xC0000022L

@ 0xC0000022L: il modo in cui l'hai mostrato \\~fa il lavoro. Una via di fuga per Bash, credo? Comunque questo non funziona ancora, perché qualcosa è diverso su come VimScript gestisce ~.
0xC0000022L

Penso di averlo. Si noti che :set rtp?mostra "~ / .vim" ma che si :echo &rtpespande ~al nome completo del percorso. Il seguente sembra funzionare: `vim --cmd 'let & rtp = substitute (& rtp, $ HOME." / \. Vim "," alternate "," g ")'. Aggiornerò la mia risposta.
garyjohn,

grazie, differenza molto interessante e sottile. Rende alcune cose più problematiche per il mio caso specifico, ma accetterò. Questo mi ha portato molto oltre.
0xC0000022L

3

Nel .vimrc che scegli, puoi specificare il percorso di runtime:

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

Se stai usando la tua persona, .vimrcpuoi impostarla sulla tua .vimdirectory personale e dovrebbe funzionare sia come sue il tuo account normale.


Questo non è esattamente dalla riga di comando. C'è un modo per rendere questo dinamico o giù di lì? Vedi, suppongo che se dovessi usare qualcosa del genere $HOMEnel mio account sarebbe risolto /home/joema come root ancora per /root... quindi non si vince nulla. Questo .vimrcdovrebbe funzionare su piattaforme e versioni di Vim e l'impostazione di un percorso assoluto lo spezza totalmente. Grazie per aver dedicato del tempo a rispondere, però.
0xC0000022L

@ 0xC Stai già specificando vimrc dalla riga di comando, e questo a sua volta specifica il percorso di runtime. Nota che nel vimrc puoi eseguire script per definire le variabili, quindi se modifichi la tua domanda con il risultato esatto possiamo probabilmente trovare un modo per farlo.
Paul

ha modificato la mia domanda. Grazie per la pazienza :)
0xC0000022L

Negli utenti .bashrc, potresti impostare una variabile, per esempio $REALHOME, che è esente da sudo reset_enve quindi usarla come base per rtp?
Paul

Suona come una valida opzione. Ho trovato più facile contrabbandare variabili in questo modo, tuttavia:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.