GitHub cho .vimrc và plugin


21

Tôi biết nhiều người lưu trữ .vimrc của họ trên GitHub để giúp dễ dàng hơn để làm việc ngay trên các máy mới và điều đó hoàn toàn có ý nghĩa với tôi. Tuy nhiên, bao gồm các plugin là có vấn đề, bởi vì các plugin tôi sử dụng đã là kho git. Làm thế nào để người ta tạo một repo sẽ theo dõi cả .vimrc và bất kỳ plugin nào có thể được cài đặt?


Tôi cảm thấy như điều này có thể quá thiên về quan điểm; không có mục tiêu "tốt nhất" và có rất nhiều lựa chọn tốt, mỗi lựa chọn đều có ưu và nhược điểm riêng. Ngoài ra, bit cụ thể về các kho lưu trữ lồng nhau đưa câu hỏi nhiều hơn vào danh mục "sử dụng git" và ít hơn về vim. Có lẽ nếu bạn tập trung thay vào một vấn đề cụ thể mà bạn gặp phải với các plugin vim hoặc vim trong khi cố gắng lưu trữ cấu hình của mình trên github?

3
Tôi có thể chỉnh sửa nó để đưa ra tốt nhất nếu bạn muốn; ý định của tôi là hỏi thêm về "làm thế nào để tôi làm điều này?" câu hỏi, trong khi thừa nhận rằng cách tôi suy nghĩ về vấn đề có thể không lý tưởng.
Tom

Điều đó có thể giúp ích, nhưng điều đó chỉ có thể làm cho nó trở thành một câu hỏi "danh sách các thứ" (một lần nữa, có rất nhiều cách khác nhau để làm điều này một cách hiệu quả). Hiện tại có một chủ đề về meta về những câu hỏi như vậy nếu bạn muốn đóng góp cho cuộc thảo luận về cách chúng ta nên đối xử với loại câu hỏi này.

2
Đã chỉnh sửa. Tôi hy vọng tôi đã nói rõ hơn rằng tôi đang hỏi "làm thế nào để tôi làm điều này?"
Tom

1
Chỉ cần sử dụng một trình quản lý plugin như neobundle.
Philip

Câu trả lời:


18

Làm thế nào để đối phó với các kho lưu trữ trong kho đã là một câu hỏi liên tục với git. Các mô hình con của Git là một cách để giải quyết tình huống, với chi phí thêm một chút phức tạp để theo dõi. Trang web git có một giới thiệu về mô hình con .

Ý tưởng cơ bản là giữ một tham chiếu đến kho lưu trữ git khác được liên kết với một đường dẫn trên kho lưu trữ của bạn. Các tham chiếu này được lưu trữ trong một tệp .gitmodulestrong thư mục gốc của kho lưu trữ của bạn (được quản lý bởi git, vì vậy hãy để nó một mình). Một số sự phức tạp xuất hiện khi nhân bản một repo có các mô hình con: bạn phải rõ ràng git submodule initđể tạo .gitmodulestệp và sau đó git submodule updatesao chép các mô hình con.


Đây là hướng dẫn về cách tôi sẽ thêm một plugin vim mới vào kho lưu trữ dotfiles của mình (tôi đã đặt ~/.vim/bí danh cho nhóm này .vim/) bằng cách sử dụng một mô hình con:

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

Sau đó submodule add, a git statussẽ hiển thị rằng bạn đã sửa đổi (hoặc tạo) .gitmodulestệp, với nội dung như sau:

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

Nó cũng sẽ hiển thị .vim/bundle/vim-elixirnhư là một tập tin mới. Git xử lý đường dẫn đó đặc biệt ngay bây giờ: đó là một thư mục bình thường trên hệ thống tệp của bạn (vì vậy vim tải nó lên bình thường), nhưng git diffsẽ coi nó như một cam kết cụ thể từ kho lưu trữ của nó. Khi nhìn vào diffs hoặc log cho đường dẫn đó (ví dụ git log -1 -u .vim/bundle/vim-elixir), git sẽ hiển thị nó dưới dạng một chuỗi một dòng như thế này:

Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e

Cập nhật lên phiên bản mới nhất của plugin tương ứng với việc đi vào kho lưu trữ của mô hình con và kiểm tra một cam kết mới, sau đó cam kết điều đó với kho lưu trữ của bạn:

$ 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

Cảm ơn, có vẻ như đó là thứ tôi đang tìm kiếm!
Tom

Ah, tôi không nhận thấy câu trả lời của bạn đã được đăng, vì tôi đã chỉnh sửa câu hỏi của tôi một thời gian.
muru 6/2/2015

23

Bạn không cần lưu trữ các plugin trong VCS của mình; bạn cũng có thể sử dụng trình quản lý gói Vim. Kể từ hôm qua, tôi sử dụng vim-plug :

Bạn có thể xác định bổ trợ trong vimrc của mình như vậy:

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

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

call plug#end()

Sau đó khởi động lại Vim và sau đó cài đặt plugin với:

:PlugInstall

Hoặc, bạn có thể thêm đoạn mã này từ Câu hỏi thường gặp vào tệp vimrc của mình trước plug#begin()cuộc gọi:

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

Điều này sẽ đặt các plugin vào ~/.vim/plugged. Bạn không cần phải giữ tệp này trong VCS của mình . Nếu bạn muốn sử dụng vimrc này trên máy khác, chỉ cần gọi :PlugInstalltrên máy đó.

để xóa plugin, hãy xóa nó khỏi tệp vimrc và chạy:

:PlugClean

Lưu ý rằng vim-plug không hỗ trợ cài đặt tập lệnh từ trang web tập lệnh Vim, nhưng các tập lệnh đó được nhân đôi trên GitHub , vì vậy không cần phải làm như vậy.

Ngoài ra còn có một số lợi thế bổ sung cho việc này như cập nhật plugin dễ dàng hơn và tải theo yêu cầu để có hiệu suất tốt hơn. Bạn cũng không có nguy cơ vi phạm các điều khoản cấp phép của các plugin bạn đang phân phối với các tệp vimrc của mình.

Xem thêm:


5

Tôi lưu trữ vimrc của tôi trong github và các plugin dưới dạng các mô hình con của kho lưu trữ của tôi.

Trong tệp readme.md tôi đặt một lớp lót kéo kho lưu trữ sau đó chạy tập lệnh thiết lập, bằng cách này tôi có thể sao chép một dòng vào trình chỉnh sửa và nó thiết lập mọi thứ. Nó làm nhiều hơn một chút so với chỉ vim (nhưng không nhiều).

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

Để dùng nó:

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

Tái bút Sẵn sàng nhận bất kỳ lời khuyên nào (như tôi đã làm từ lâu rồi và chưa từng chạm vào nó).

Lưu ý: Phần yêu thích của tôi là nó cũng thiết lập git và thiết lập nó để sử dụng vim làm công cụ tìm khác biệt cho git. Vimdiff là công cụ tìm khác biệt tốt nhất.


5

Nếu bạn muốn gắn bó với Pathogen, một cách có thể là sử dụng các mô đun con Git . Khi bạn thêm một mô hình con, git nhận ra nó là từ một kho lưu trữ khác và để lại nội dung của nó (trừ khi nó đã được thay đổi, trong trường hợp đó, nó sẽ hiển thị là có nội dung không bị theo dõi khi bạn làm git status). Nếu bạn có tất cả các plugin dựa trên Github của mình bundle/, thì việc thêm chúng dưới dạng các mô hình con là một nhiệm vụ khá đơn giản với lớp vỏ tốt:

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

Bạn có thể có một cái nhìn về cách các mô hình con hiển thị tại repo vimrc của tôi .


Nếu bạn thêm một tệp vào một mô hình con hoặc thực hiện một số thay đổi không ảnh hưởng đến kho lưu trữ, git statusvẫn sẽ phàn nàn về mô hình con có các thay đổi không được cam kết hoặc các tệp không được theo dõi. Bạn có thể làm cho git bỏ qua những thay đổi như vậy bằng cách thêm ignore = dirtyvào cấu hình mô hình con trong .gitmodulestệp. Ví dụ:

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

Một lợi ích của các mô hình con là việc sửa đổi mô hình con được thêm vào kho git, để git inittự động chăm sóc kiểm tra sửa đổi cụ thể đó. Bạn có thể vứt nó đi và bảo git bỏ qua các mô đun con sau khi bạn đã thêm chúng bằng cách thêm ignore = allvào cấu hình của chúng trong .gitmodulestệp. Ví dụ:

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

Cuối cùng, một lệnh để cập nhật tất cả!

git submodule foreach git pull

Lời cảnh báo: Tôi mới biết đến các mô hình con. Tôi không thực sự chắc chắn cách họ cư xử.


đại dịch vim là một cách khác để tăng cường mầm bệnh mà không cần sử dụng mô đun con. Đại dịch xử lý các kho lưu trữ từ xa để lại Pathogen để xử lý runtimepath. Điều này không có nghĩa là người ta cần hai công cụ, nhưng đối với các nhiệm vụ khác nhau mà "nên" được xử lý riêng.
jalanb

Bất cứ ai cũng có thể nhận xét về lý do tại sao tpope trong mầm bệnh readme có thể nói tại sao các mô đun con không phải là con đường để đi? Tôi cũng không biết các mô hình con (và giải pháp của tôi hoạt động rất tốt đối với tôi mà không cần đến trình quản lý plugin) nhưng tôi đoán đám đông chống mô hình con có một điều thú vị để nói.
dash-tom-bang

1
@ dash-tom-bang Tôi không đọc đoạn đó khi anh ấy nói rằng bạn không nên sử dụng mô hình con. Tôi nghĩ rằng anh ấy chỉ nói rằng đó không phải là phương pháp ưa thích của anh ấy .
Giàu

1
TBH sau một vài năm sử dụng chúng, tôi đã cảm thấy khó chịu với các mô đun con. Bây giờ tôi sẽ khuyên bạn không nên sử dụng chúng. Tôi sử dụng vim-plug bây giờ và nó chỉ làm cho cuộc sống của tôi dễ dàng hơn.
muru

4

Bạn chỉ có thể thêm dòng này vào của bạn .gitignoređể bỏ qua tất cả các plugin của bạn và không cam kết chúng:

vim/bundle

Ngoài ra, bạn nói rằng có vấn đề là nó sẽ bao gồm mã plugin bởi vì họ đã đăng ký lại. Tôi đoán bạn có nghĩa là bạn không muốn sao chép mã, nhưng tôi đã nghe nói rằng bạn nên tiếp tục và sao chép mã đó là một phụ thuộc để bạn luôn có thể quay lại một điểm cụ thể trong mã của mình và biết rằng nó sẽ làm việc Dưới đây là một số bài viết của James Shore nói về điều đó: http://www.letscodejavascript.com/v3/blog/2014/12/the_reliable_build , http://www.letscodejavascript.com/v3/blog/2014/03/ the_npm_debacle . Anh ấy đang nói về mã lập trình và npm (trái ngược với vim), nhưng tôi nghĩ rằng đối số vẫn được áp dụng, bạn muốn có một môi trường đáng tin cậy để viết mã hoặc viết.


1
"Bạn chỉ có thể thêm dòng này vào .vimrc của bạn ..." ý bạn là .gitignore?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.