GitHub per .vimrc e plugin


21

So che molte persone memorizzano il loro .vimrc su GitHub per semplificare il corretto funzionamento su nuove macchine, e questo ha perfettamente senso per me. Includere plug-in, tuttavia, è problematico, perché i plug-in che utilizzo sono già repository git. Come si crea un repository che monitorerà sia il loro .vimrc che eventuali plugin che potrebbero essere installati?


Sento che questo potrebbe essere troppo orientato all'opinione; non esiste un obiettivo "migliore" e ci sono molte buone opzioni, ognuna con i propri pro e contro. Anche il bit specifico dei repository nidificati porta la domanda più nella categoria "using git" e meno su vim. Forse se ti concentri invece su un problema specifico che hai riscontrato con i plugin vim o vim mentre provavi a memorizzare la tua configurazione su github?

3
Posso modificarlo per ottenere il meglio se vuoi; la mia intenzione era di chiedere di più a "come posso fare questo?" domanda, pur riconoscendo che il modo in cui stavo pensando di affrontare il problema potrebbe non essere l'ideale.
Tom,

Ciò può essere d'aiuto, ma potrebbe anche trasformarlo in una domanda "elenco di cose" (ci sono, ancora una volta, molti modi diversi per farlo efficacemente). Al momento c'è un argomento su meta su tali domande se desideri contribuire alla discussione su come dovremmo trattare questo tipo di domande.

2
Modificato. Spero di aver chiarito che sto chiedendo "come posso fare?"
Tom,

1
Basta usare un gestore di plugin come Neobundle.
Filippo

Risposte:


18

Come gestire i repository all'interno dei repository è stata una domanda in corso con Git. I sottomoduli di Git sono un modo per affrontare la situazione, a scapito di aggiungere un po 'più di complessità da tenere traccia. Il sito git ha un'introduzione ai sottomoduli .

L'idea di base è mantenere un riferimento a un altro repository git associato a un percorso sul proprio repository. Questi riferimenti sono memorizzati in un file .gitmodulesnella radice del tuo repository (che è gestito da Git, quindi lascialo in pace). Parte della complessità entra in gioco durante la clonazione di un repository che ha sottomoduli: è necessario esplicitamente git submodule initcreare il .gitmodulesfile e quindi git submodule updateclonare i sottomoduli.


Ecco una procedura dettagliata di come aggiungerò un nuovo plug-in vim al mio repository dotfiles (ho creato un ~/.vim/aliasing per questo repository .vim/) usando un sottomodulo:

$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir

Dopo il submodule add, a git statusmostrerebbe che hai modificato (o creato) il .gitmodulesfile, con qualcosa del genere:

[submodule ".vim/bundle/vim-elixir"]
    path = .vim/bundle/vim-elixir
    url = https://github.com/elixir-lang/vim-elixir.git

Dovrebbe anche essere mostrato .vim/bundle/vim-elixircome nuovo file. Git tratta quel percorso specialmente ora: è una normale directory sul tuo file system (quindi vim lo carica normalmente), ma git difflo tratterà come un commit specifico dal suo repository. Quando si guardano i diff o i log per quel percorso (ad es. git log -1 -u .vim/bundle/vim-elixir), Git lo mostrerà come una stringa di una riga come questa:

Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e

L'aggiornamento all'ultima versione del plug-in corrisponde all'accesso al repository del sottomodulo e alla verifica di un nuovo commit, quindi al commit di quello nel repository:

$ cd .vim/bundle/vim-elixir
$ git remote -v            # note: the submodule repo's origin, not my repo's
origin  https://github.com/elixir-lang/vim-elixir.git (fetch)
origin  https://github.com/elixir-lang/vim-elixir.git (push)

$ git pull
# ...

$ cd -     # back to my repository's root
$ git status
# ...
    modified:   .vim/bundle/vim-elixir (new commits)

$ git diff .vim/bundle/vim-elixir
# ...
-Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
+Subproject commit d59784e7afbd0d55c501e40c43b57cbe6f6e04c2

$ git commit -m "update vim-elixir" .vim/bundle/vim-elixir

Grazie, sembra proprio il genere di cosa che stavo cercando!
Tom,

Ah, non ho notato che la tua risposta era stata pubblicata, poiché stavo modificando la mia da un po 'di tempo.
muru,

23

Non è necessario archiviare i plug-in nel VCS; puoi anche usare un gestore di pacchetti Vim. Da ieri uso vim-plug :

Puoi definire plugin nel tuo vimrc in questo modo:

call plug#begin('~/.vim/plugged')

Plug 'embear/vim-localvimrc'
Plug 'kchmck/vim-coffee-script'
" ... etc

call plug#end()

Quindi riavviare Vim e quindi installare i plug-in con:

:PlugInstall

In alternativa, puoi aggiungere questo frammento dalle FAQ al tuo file vimrc prima della plug#begin()chiamata:

if empty(glob('~/.vim/autoload/plug.vim'))
  silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
    \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  autocmd VimEnter * PlugInstall
endif

Questo inserirà i plugin ~/.vim/plugged. Non è necessario conservare questo file nel VCS . Se vuoi usare questo vimrc su un altro computer, chiama :PlugInstallquel computer.

per rimuovere un plugin, rimuoverlo dal file vimrc ed eseguire:

:PlugClean

Si noti che vim-plug non supporta l'installazione di script dal sito Web degli script Vim, ma tali script sono riprodotti su GitHub , quindi non è necessario farlo.

Ci sono anche alcuni vantaggi aggiuntivi come l'aggiornamento più semplice del plugin e il caricamento su richiesta per prestazioni migliori. Inoltre non corri il rischio di violare le condizioni di licenza dei plugin che stai distribuendo con i tuoi file vimrc.

Guarda anche:


5

Conservo il mio vimrc in github e i plugin come sottomoduli del mio repository.

Nel file readme.md ho inserito una riga che estrae il repository, quindi esegue lo script di installazione, in questo modo posso copiare una riga in un editor e impostare tutto. Fa un po 'più di un semplice VIM (ma non molto).

https://github.com/Loki-Astari/UnixConfig

Per usarlo:

cd
git clone git@github.com:Loki-Astari/UnixConfig.git ~/.config
cd .config
git submodule init
git submodule update
chmod +x init
./init
cd

PS. Disposto a prendere qualsiasi consiglio (come ho fatto secoli fa e non l'ho più toccato da allora).

Nota: la mia parte preferita è che configura anche git e lo configura per usare vim come strumento diff per git. Vimdiff è il miglior strumento diff.


5

Se desideri rimanere con Pathogen, un modo potrebbe essere quello di utilizzare i sottomoduli Git . Quando aggiungi un sottomodulo, git lo riconosce come da un altro repository e lascia il suo contenuto da solo (a meno che non sia stato modificato, nel qual caso, apparirà con contenuti non tracciati quando lo fai git status). Se tutti i plug-in basati su Github sono presenti bundle/, aggiungerli come sottomoduli è un'attività abbastanza semplice con una buona shell:

for f in bundle/*/ 
do 
    git submodule add $(awk '/url =/{print $3}' "$f/.git/config") "$f"
done

Puoi dare un'occhiata a come vengono visualizzati i sottomoduli nel mio repository vimrc .


Se si aggiunge un file a un sottomodulo o si apportano modifiche che non influiscono sul repository, git statussi lamenterà comunque che il sottomodulo abbia modifiche non impegnate o file non tracciati. Puoi fare in modo che git ignori tali modifiche aggiungendo ignore = dirtyalla configurazione del sottomodulo nel .gitmodulesfile. Per esempio:

[submodule "bundle/LaTeX-Box"]
    path = bundle/syntastic
    url = https://github.com/scrooloose/syntastic.git
    ignore = dirty

Un vantaggio dei sottomoduli è che la revisione del sottomodulo viene aggiunta al repository git, in modo che un git initsi occupi automaticamente di verificare quella particolare revisione. Puoi buttarlo via e dire a git di ignorare i sottomoduli dopo averli aggiunti aggiungendo ignore = allalla loro configurazione nel .gitmodulesfile. Per esempio:

[submodule "bundle/LaTeX-Box"]
    path = bundle/LaTeX-Box
    url = https://github.com/LaTeX-Box-Team/LaTeX-Box.git
    ignore = all

Infine, un comando per aggiornarli tutti!

git submodule foreach git pull

Avvertenza: sono nuovo ai sottomoduli. Non sono davvero sicuro di come si comportino.


vim-pandemic è un altro modo per migliorare il patogeno senza la necessità di utilizzare sottomoduli. Pandemic gestisce i repository remoti lasciando Pathogen per gestire il runtimepath. Ciò significa che sono necessari due strumenti, ma per compiti diversi che "dovrebbero" essere gestiti separatamente.
jalanb,

Qualcuno può commentare perché tpope nel readme del patogeno potrebbe dire perché i sottomoduli non sono la strada da percorrere? Non conosco neanche i sottomoduli (e la mia soluzione funziona benissimo anche senza un gestore di plug-in) ma immagino che la folla antisommodulo abbia qualcosa di interessante da dire.
dash-tom-bang,

1
@ dash-tom-bang Non leggo un po 'come lui che dice che non dovresti usare i sottomoduli. Penso che stia solo dicendo che non è il suo metodo preferito.
Rich

1
TBH dopo un paio d'anni di usarli, mi sono infastidito con i sottomoduli. Vorrei ora sconsigliare di usarli. Uso vim-plug ora e mi ha solo semplificato la vita.
Muru,

4

Puoi semplicemente aggiungere questa linea alla tua .gitignoreper ignorare tutti i tuoi plugin e non impegnarli:

vim/bundle

Inoltre, hai detto che è problematico che includesse il codice del plugin perché sono già repository github. Immagino tu intenda che non vuoi duplicare il codice, ma ho sentito dire che dovresti andare avanti e duplicare il codice che è una dipendenza in modo da poter sempre tornare a un punto particolare nel tuo codice e sapere che Funzionerà. Ecco alcuni articoli di James Shore che ne parlano: http://www.letscodejavascript.com/v3/blog/2014/12/the_reliable_build , http://www.letscodejavascript.com/v3/blog/2014/03/ the_npm_debacle . Sta parlando di codice di programmazione e npm (al contrario di vim), ma penso che l'argomento sia ancora valido, vuoi un ambiente affidabile per codificare o scrivere.


1
"Puoi semplicemente aggiungere questa riga al tuo .vimrc ..." intendevi .gitignore?
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.