Saya baru ke dunia Vim, dan saya ingin membuatnya sehingga setiap kali saya menyimpan file itu berkomitmen untuk kontrol versi. Apakah ini mungkin?
Saya baru ke dunia Vim, dan saya ingin membuatnya sehingga setiap kali saya menyimpan file itu berkomitmen untuk kontrol versi. Apakah ini mungkin?
Jawaban:
Anda dapat menggunakan perintah otomatis Vim:
:autocmd BufWritePost * execute '!git add % && git commit -m %'
Itu belum diuji tetapi harus menambahkan file dan komit dengan nama file sebagai pesan komit.
Anda ingin BufWritePost karena ini dipicu setelah file ditulis. Saya membayangkan ada banyak kasus tepi yang irksome atau tidak aman.
Saya menggunakan perintah otomatis vim yang saya tempatkan di .vimrc saya. Perintah pertama melakukan pengecekan mentah bahwa kami bekerja di direktori git (dengan memeriksa keberadaan direktori .git, baik di direktori saat ini atau menggunakan git rev-parse
), kemudian menggunakan git -a -m %
sehingga hanya file yang sebelumnya telah ditambahkan yang dipentaskan dan dikomit. .
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
, dari jawaban SO
Anda mungkin ingin melihat ke dalam plugin buron , ini adalah plugin git yang sangat kuat untuk vim. Anda juga dapat mengatur sebuah autocmd
seperti yang donothingsuccessfully
disarankan, tetapi memunculkannya :Gcommit
atau :Gstatus
(dari mana Anda dapat memilih perubahan untuk ditambahkan ke indeks git)
Mengembangkan jawaban yang disediakan orang lain:
autocmd BufWritePost * execute ':silent ! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m "Auto-commit: saved %"; fi > /dev/null 2>&1'
Ini sepenuhnya transparan. Anda tidak akan mendapatkan pesan "Tekan enter untuk melanjutkan" (tetapi jika komit tidak berfungsi, Anda tidak akan tahu itu gagal).
Anda pasti bisa melakukan ini sedikit pun makro atau dengan perintah remapping.
(Periksa /programming/117150/can-i-re-map-commands-in-vim )
Saya tidak yakin itu pilihan yang baik. Saya tidak mahir di git untuk saat ini dan saya tahu kadang-kadang berbeda dari svn. Tapi saya tidak akan melakukan komit otomatis ini dengan svn. Komit perlu bermakna dan tidak menghemat waktu secara teratur.
Anda biasanya melakukan karena Anda menambahkan fungsi, memperbaiki bug, ... bukan hanya karena Anda mengerjakan file. Anda tidak akan berakhir dengan proyek yang tidak dikompilasi atau fungsi yang belum selesai.
Saya tahu pertanyaan ini sudah lama dan ini adalah promosi diri yang terang-terangan, tetapi saya menulis plugin Vim yang akan memicu skrip shell tertentu untuk dijalankan setelah autocmd
peristiwa Vim tertentu . Sebagai contoh, sebuah skrip bernama .bufwritepost.vimhook.sh
akan dijalankan (secara serempak) setiap kali BufWritePost
perintah dijalankan. Anda kemudian dapat dengan mudah memasukkan logika apa pun yang Anda inginkan untuk melakukan komit git di dalam skrip itu. Plugin mengasumsikan konvensi penamaan khusus dari skrip ini dan juga mendukung skrip "hook" yang memicu hanya pada file yang cocok dengan nama-nama tertentu atau memiliki ekstensi tertentu.
Detail lengkap: https://github.com/ahw/vim-hooks
Saya ingin melaporkan pendapat saya tentang masalah ini.
Saya memiliki vimrc.vim
repositori di git ( $VIMCONF
, dengan bootstrap .vimrc), dan memetakan <Leader>ve
("vim edit") untuk membuka vimrc di tab baru. Ini tidak mempengaruhi direktori kerja saat ini.
Jadi jika saya mengedit vimrc.vim
dari vim yang dimulai di direktori yang berbeda di luar repositori vim git saya, pendekatan yang dibahas oleh Nick Edwards akan gagal. Retasan saya adalah sebagai berikut (untuk windows dan linux)
if has('win32')
" The git command has to be passed to git. So we need to call bash.exe.
autocmd BufEnter *vimrc.vim silent! lcd %:p:h
autocmd BufWritePost *vimrc.vim if expand('<amatch>') =~ substitute(expand('$VIMCONF\vimrc.vim'), '\', '/', "g") | execute '! git add % & git commit -m %' | endif
else " Linux
autocmd BufWritePost *vimrc.vim
\ if expand('<amatch>') =~ expand($VIMCONF)."/vimrc.vim" |
\ let tempdir = getcwd() | execute 'cd' fnameescape(expand('<amatch>:h')) |
\ execute '! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m % ; fi' |
\ execute 'cd' fnameescape(tempdir) |
\ endif
endif
Penjelasan:
git
telah berada di jalan (yaitu Anda harus dapat mengetik git <ENTER>
di cmd.exe
)tempdir
Catatan:
|
. Rantai akan dibatalkan jika salah satu perintah gagal. Untuk memecah beberapa baris, mulai dengan baris berikutnya \
.*.vim
danexpand($VIMCONF)."/ftplugin/"