GitHub для .vimrc и плагинов

21

Я знаю, что многие люди хранят свои .vimrc на GitHub, чтобы упростить получение права на работу на новых машинах, и это имеет для меня полное значение. Однако включение плагинов проблематично, поскольку используемые мной плагины уже являются репозиториями git. Как создать репо, который будет отслеживать как их .vimrc, так и любые плагины, которые могут быть установлены?

Том
источник
Я чувствую, что это может быть слишком ориентированным на мнение; нет объективного «лучшего», и есть много хороших вариантов, каждый со своими плюсами и минусами. Также немного о вложенных репозиториях переносит вопрос больше в категорию «using git», а не о vim. Возможно, если вместо этого вы сосредоточились на конкретной проблеме с плагинами vim или vim, пытаясь сохранить свою конфигурацию на github?
3
Я могу отредактировать его, чтобы вынести лучшее, если хотите; Мое намерение состояло в том, чтобы спросить больше "как мне это сделать?" вопрос, признавая, что то, как я думал о решении проблемы, может быть не идеальным.
Том
Это может помочь, но это может сделать вопрос «списком вещей» (опять же, есть много разных способов сделать это эффективно). В настоящее время есть мета-тема о таких вопросах, если вы хотите внести свой вклад в дискуссию о том, как мы должны относиться к такого рода вопросам.
2
Ред. Надеюсь, я пояснил, что спрашиваю "как мне это сделать?"
Том
1
Просто используйте менеджер плагинов, как neobundle.
Филипп

Ответы:

18

Как работать с репозиториями в репозиториях - постоянный вопрос с git. Подмодули Git - это один из способов решения ситуации за счет добавления немного большей сложности для отслеживания. Сайт git содержит введение в подмодули .

Основная идея состоит в том, чтобы сохранить ссылку на другой репозиторий git, связанный с путем в вашем репозитории. Эти ссылки хранятся в файле .gitmodulesв корне вашего хранилища (которым управляет git, поэтому оставьте его в покое). Некоторая сложность проявляется при клонировании репо с субмодулями: необходимо явно git submodule initсоздать .gitmodulesфайл, а затем git submodule updateклонировать субмодули.


Вот пошаговое руководство о том, как я добавлю новый плагин vim в мой репозиторий dotfiles (я использовал ~/.vim/псевдоним этого репозитория .vim/) с помощью подмодуля:

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

После submodule add, a git statusбудет показывать, что вы изменили (или создали) .gitmodulesфайл, примерно так:

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

Он также должен отображаться .vim/bundle/vim-elixirкак новый файл. Теперь Git обрабатывает этот путь специально: это обычный каталог в вашей файловой системе (поэтому vim загружает его нормально), но он git diffбудет обрабатывать его как определенный коммит из своего репозитория. При просмотре различий или журналов для этого пути (например git log -1 -u .vim/bundle/vim-elixir), git покажет его в виде однострочной строки, например:

Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e

Обновление до последней версии плагина соответствует входу в репозиторий подмодуля и проверке новой фиксации, а затем фиксации этого в вашем репозитории:

$ 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
alxndr
источник
Спасибо, это похоже на то, что я искал!
Том
Ах, я не заметил, что ваш ответ был опубликован, так как я редактировал свой в течение некоторого времени.
Муру
23

Вам не нужно хранить плагины в вашей VCS; Вы также можете использовать менеджер пакетов Vim. Со вчерашнего дня я использую vim-plug :

Вы можете определить плагины в вашем vimrc следующим образом:

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

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

call plug#end()

Затем перезапустите Vim и установите плагины с:

:PlugInstall

Или вы можете добавить этот фрагмент из FAQ в ваш файл vimrc перед plug#begin()вызовом:

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

Это вставит плагины ~/.vim/plugged. Вам не нужно хранить этот файл в вашей VCS . Если вы хотите использовать этот vimrc на другой машине, просто позвоните :PlugInstallна эту машину.

чтобы удалить плагин, удалите его из файла vimrc и запустите:

:PlugClean

Обратите внимание, что vim-plug не поддерживает установку сценариев с веб-сайта сценариев Vim, но эти сценарии отражаются на GitHub , поэтому в этом нет необходимости.

Есть также некоторые дополнительные преимущества, такие как более простое обновление плагина и загрузка по требованию для повышения производительности. Вы также не рискуете нарушить условия лицензии плагинов, которые вы распространяете вместе с вашими файлами vimrc.

Смотрите также:

Мартин Турной
источник
5

Я храню свой vimrc в github и плагины как подмодули моего хранилища.

В файле readme.md я поместил один вкладыш, который извлекает хранилище, затем запускает сценарий установки, таким образом я могу скопировать одну строку в редактор, и он все настраивает. Это немного больше, чем просто vim (но не так много).

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

Чтобы использовать это:

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. Готов принять любой совет (как я делал это давным-давно и с тех пор не трогал его).

Примечание: моя любимая часть в том, что он также настраивает git и настраивает его на использование vim в качестве инструмента сравнения для git. Vimdiff - лучший инструмент сравнения.

Мартин Йорк
источник
5

Если вы хотите придерживаться Pathogen, одним из способов может быть использование подмодулей Git . Когда вы добавляете подмодуль, git распознает его как из другого репозитория и оставляет его содержимое в покое (если только он не был изменен, в этом случае он будет отображаться как имеющий неотслеживаемый контент, когда вы это сделаете git status). Если вы используете все свои плагины на основе Github bundle/, то добавление их в виде подмодулей - довольно простая задача с хорошей оболочкой:

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

Вы можете посмотреть, как субмодули отображаются в моем репозитории vimrc .


Если вы добавляете файл в подмодуль или вносите какие-либо изменения, которые не влияют на репозиторий, git statusон все равно будет жаловаться на то, что в подмодуле имеются незафиксированные изменения или файлы без отслеживания. Вы можете заставить git игнорировать такие изменения, добавив ignore = dirtyконфигурацию субмодуля в .gitmodulesфайл. Например:

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

Одно из преимуществ подмодулей заключается в том, что ревизия подмодуля добавляется в репозиторий git, так что git initавтоматически выполняет проверку этой конкретной ревизии. Вы можете выбросить это и сказать git игнорировать подмодули, как только вы добавите их, добавив ignore = allих в конфигурацию .gitmodulesфайла. Например:

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

Наконец, одна команда, чтобы обновить их всех!

git submodule foreach git pull

Слово предостережения: я новичок в подмодулях. Я не совсем уверен, как они себя ведут.

Мур
источник
Vim-пандемия - это еще один способ усилить патоген без использования подмодулей. Pandemic обрабатывает удаленные репозитории, оставляя Pathogen для обработки пути выполнения. Это означает, что нужно два инструмента, но для несопоставимых задач, которые «должны» обрабатываться отдельно.
Джаланб
Кто-нибудь может прокомментировать, почему tpope в readme патогена может сказать, почему субмодули - это не тот путь? Я также не знаю субмодулей (и мое решение отлично работает для меня даже без менеджера плагинов), но я предполагаю, что толпа антимодулей может сказать что-то интересное.
dash-tom-bang
1
@ dash-tom-bang Я не читаю это, поскольку он говорит, что вы не должны использовать подмодули. Я думаю, он просто говорит, что это не его любимый метод.
Rich
1
TBH после нескольких лет их использования, меня раздражали субмодули. Я бы сейчас рекомендовал не использовать их. Сейчас я использую vim-plug, и это только облегчило мне жизнь.
Муру
4

Вы можете просто добавить эту строку в свой, .gitignoreчтобы игнорировать все ваши плагины и не фиксировать их:

vim/bundle

Кроме того, вы сказали, что проблематично, что он будет включать в себя код плагина, потому что это уже репозитории на github. Я предполагаю, что вы имеете в виду, что вы не хотите дублировать код, но я слышал, что вы должны идти вперед и дублировать код, который является зависимостью, чтобы вы всегда могли вернуться к определенной точке в вашем коде и знать, что это будет работать. Вот некоторые статьи Джеймса Шора, в которых об этом говорится: http://www.letscodejavascript.com/v3/blog/2014/12/the_reliable_build , http://www.letscodejavascript.com/v3/blog/2014/03/ the_npm_debacle . Он говорит о программном коде и npm (в отличие от vim), но я думаю, что аргумент все еще применим, вы хотите надежную среду для кодирования или записи.

aharris88
источник
1
«Вы можете просто добавить эту строку в ваш .vimrc ...» Вы имели в виду .gitignore?