É fácil dizer ao Vim para usar .vimrc personalizado, mas como dizer para ele usar um caminho alternativo em vez de ~ / .vim?

15

Eu posso usar vim -u filenamepara usar em filenamevez do meu padrão .vimrc. Estou usando esse método ao alternar contextos de usuário ( su) para usar o meu .vimrc mesmo sendo executado como superusuário.

Como posso obter o mesmo também para a pasta que por padrão é ~/.vimpara que eu possa apontar o Vim da linha de comando para uma pasta alternativa?


O que eu quero alcançar

Ok, suponha usuário joe( HOME=/home/joe) e usuário root( HOME=/root). O usuário joetem um alias definido para o vimqual se parece com isso (mas originalmente definido usando a $HOMEvariável para tornar isso dinâmico):

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

Em seguida, o usuário joefaz algo como sudo su -(mas com mágica adicionada), resultando no carregamento de .bashrcoutros itens . O usuário agora tem exatamente o mesmo alias para definir, como mostrado acima./home/joerootrootvim

O problema é que isso .vimrcé usado em vários sistemas e em vários cenários. Muitas vezes, a conta de Joe é chamada joe, mas às vezes será algo parecido local.joeou qualquer outra coisa, resultando em um valor diferente para $HOME. Portanto, codificar um caminho absoluto para a ~/.vimpasta não parece ser uma boa ideia. No entanto, em nosso cenário acima, o usuário rootnão possui uma pasta /root/.vimque, no entanto, é esperada que exista por padrão através do carregado .vimrc( /home/joe/.vimrc).

O que eu quero alcançar - de preferência na linha de comando - é fazer com que o Vim use plugins etc. por baixo /home/joe/.vimquando iniciado como root(assumindo que o aliasestá definido como mostrado - outros casos podem ser ignorados). Se houver algum método dinâmico via VimScript, forneça ponteiros. Mas usar variáveis ​​como a $HOMEque levaria a um problema 22, eu acho.

0xC0000022L
fonte
provavelmente você pode fazer isso com bons velhos tempos ln. como 'mv ~ / .vim ~ / .vim-qualquer coisa && ln -s ~ / .vim-qualquer coisa ~ / .vim`, faça o mesmo para .vimrc. embrulhar tudo isso com algum apelido festa para que você possa facilmente alternar uma forma ou de outra
jar

Respostas:

9

O Vim procura em ~ / .vim porque esse diretório está na lista padrão em 'runtimepath', abreviado como 'rtp'. Para dizer ao Vim para procurar em outro lugar, você precisará especificar completamente um valor 'rtp' diferente ou editar o padrão usando uma chamada para substituir (), por exemplo. Se você deseja que o Vim procure primeiro em um local diferente seus arquivos de configuração, não se importe com a aparência em ~ / .vim e não se preocupe com a aparência do diretório alternativo após, o comando é bem simples:

vim --cmd 'set rtp^=alternate_dir'

Vejo

:help --cmd
:help :set^=

Substituir .vim pelo seu diretório alternativo requer um pouco mais de digitação.

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

Tentei substituir ~/.vimpor outro caminho, mas não consegui igualar o ~, então fui em frente e postei o que tinha.

Editar

O motivo pelo qual não pude corresponder o ~valor no 'rtp' é que, quando o valor é obtido como o valor de &rtpe não como a saída de :set rtp?, ele ~é expandido para o nome do caminho completo do diretório inicial do usuário. Não existe ~no resultado.

Os seguintes trabalhos.

vim --cmd 'let &rtp = substitute(&rtp, $HOME."/\.vim", "alternate", "g")'
garyjohn
fonte
muito obrigado por reservar um tempo para responder. Isso parece muito promissor. Amanhã vou mexer com isso e informá-lo como será. Eu gostaria que meu fu VimScript fosse mais forte, mas estou trabalhando nisso e isso aponta para uma direção promissora.
0xC0000022L 06/03
@ 0xC0000022L: a maneira como você mostrou que \\~faz o trabalho. Uma fuga para Bash, eu acho? De qualquer forma, isso ainda não funciona, porque algo é diferente sobre como o VimScript lida com o ~.
0xC0000022L
Eu acho que tenho. Observe que :set rtp?mostra "~ / .vim", mas que se :echo &rtpexpande ~para o nome do caminho completo. O seguinte parece funcionar: `vim --cmd 'let & rtp = substitute (& rtp, $ HOME." / \. Vim "," alternate "," g ")'. Vou atualizar minha resposta.
garyjohn
obrigado, diferença muito interessante e sutil. Torna algumas coisas mais problemáticas para o meu caso específico, mas vou aceitar. Isso me levou muito mais longe.
0xC0000022L
3

No .vimrc que você escolher, você pode especificar o caminho de tempo de execução:

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

Se você estiver usando sua pessoa .vimrc, poderá configurá-la no seu .vimdiretório pessoal e ele deve funcionar tanto quanto na susua conta normal.

Paulo
fonte
Isso não é exatamente da linha de comando. Existe alguma maneira de tornar isso dinâmico ou algo assim? Veja, eu suponho que se eu usasse algo como, $HOMEentão, em minha própria conta, isso resolveria, /home/joemas como raiz ainda é /root... então nada é ganho. Isto .vimrcé suposto para trabalhar em todas as plataformas e versões vim e definir um caminho absoluto quebra totalmente isso. Obrigado por reservar um tempo para responder, no entanto.
0xC0000022L
@ 0xC Você já está especificando o vimrc na linha de comando, e isso, por sua vez, especifica o caminho do tempo de execução. Observe que no vimrc você pode executar scripts para definir variáveis, portanto, se você editar sua pergunta com o resultado exato, provavelmente poderemos descobrir uma maneira de fazê-lo.
Paul
editou minha pergunta. Obrigado pela paciência :) #
0xC0000022L
Nos usuários .bashrc, você pode definir uma variável, por exemplo $REALHOME, isenta da variável sudo reset_enve usá-la como base rtp?
Paul
Parece uma opção viável. Eu achei mais fácil de variáveis contrabandear desta forma, no entanto:alias sudosu='sudo su -l root -c "REALHOME='\''/home/joe'\'' /bin/bash --rcfile /home/joe/.bashrc"'
0xC0000022L