Apakah ada cara untuk menghubungkan penghematan di Vim hingga melakukan di git?

11

Saya baru ke dunia Vim, dan saya ingin membuatnya sehingga setiap kali saya menyimpan file itu berkomitmen untuk kontrol versi. Apakah ini mungkin?

gonzo.floyd
sumber

Jawaban:

4

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.

donasi berhasil
sumber
4

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'
Nick Edwards
sumber
1
Ada kutipan tunggal yang hilang di akhir cmd, tepat setelah fi.
Andrew-Dufresne
2
Versi ini hanya berfungsi jika Anda berada di direktori root repo Anda. Solusi yang lebih baik adalah 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
Andrew-Dufresne
Ini berfungsi untuk saya di linux. Adakah yang tahu cara membuatnya bekerja di windows?
user334287
2

Anda mungkin ingin melihat ke dalam plugin buron , ini adalah plugin git yang sangat kuat untuk vim. Anda juga dapat mengatur sebuah autocmdseperti yang donothingsuccessfullydisarankan, tetapi memunculkannya :Gcommitatau :Gstatus(dari mana Anda dapat memilih perubahan untuk ditambahkan ke indeks git)

mkomitee
sumber
1

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).

sargon
sumber
0

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.

Nyonya
sumber
Itu benar, tetapi saya juga ingin memiliki skrip semalam yang memindahkan file yang berhasil dikompilasi dari repo "save-on-commit" ke repo "perubahan yang berarti".
gonzo.floyd
Yah, itu bukan ide yang buruk dengan Git. "Berkomitmen sering" adalah semacam moto. Ini berfungsi lebih baik dengan cara ini juga, karena Anda dapat bekerja secara bersamaan pada file yang sama dengan banyak pengembang dan masalah minimal. Akan sangat berguna untuk menghubungkan ke mekanisme save vim.
Metagrapher
Alur kerja di Git bisa sangat berbeda dari Subversion. Anda mungkin tidak pernah melakukan ini di svn karena akan kasar, tetapi ini memiliki kegunaan yang benar-benar valid di git. Misalnya server integrasi pengujian dari beberapa jenis dapat dihubungkan ke cabang tes. Komit otomatis saat save menjadi sangat berguna. Ketika Anda sampai pada titik bahwa sesuatu berfungsi, Anda kemudian akan menggunakan git rebase untuk memecah semua aktivitas menjadi satu komit dengan pesan yang bermakna, kemudian bergabung ke cabang devel Anda. Jika ini terdengar menakutkan atau kompleks, itu hanya karena Anda disesuaikan dengan keterbatasan vcs sumber yang tidak didistribusikan.
Caleb
0

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 autocmdperistiwa Vim tertentu . Sebagai contoh, sebuah skrip bernama .bufwritepost.vimhook.shakan dijalankan (secara serempak) setiap kali BufWritePostperintah 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

Andrew
sumber
0

Saya ingin melaporkan pendapat saya tentang masalah ini.

Saya memiliki vimrc.vimrepositori 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.vimdari 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:

  1. Untuk windows, saya mengubah direktori ke lokasi file vimrc. Ini bukan yang terbaik, dan saya mungkin berubah nanti agar mirip dengan linux. Jangan menganggap ini terlalu serius, tetapi Anda mungkin ingin menggunakannya sebagai panduan. gittelah berada di jalan (yaitu Anda harus dapat mengetik git <ENTER>di cmd.exe)
  2. Untuk Linux, saya pertama-tama memeriksa apakah saya mengedit vimrc.vim yang tepat
  3. Simpan direktori kerja saat ini ke tempdir
  4. Ubah direktori ke file vimrc.vim
  5. Lakukan git commit
  6. Kembali ke direktori kerja sebelumnya
  7. Saya secara manual mendorong perubahan git

Catatan:

  1. Perintah dapat "dirantai" dengan vim |. Rantai akan dibatalkan jika salah satu perintah gagal. Untuk memecah beberapa baris, mulai dengan baris berikutnya \.
  2. Ini dapat diperluas ke file ftplugin. Filter Anda akan menjadi *.vimdanexpand($VIMCONF)."/ftplugin/"
pengguna334287
sumber