Bagaimana cara mendeteksi apakah file swp mengandung perubahan yang belum disimpan?

11

Saat mengedit kode sumber menggunakan gvim (v.7.4.488), saya ingin mengkomit beberapa perubahan vcs (Saya menggunakan git 2.1.4 dari baris perintah di Ubuntu linux).

git --status

menunjukkan file mana yang saya ubah. Namun, ini juga menunjukkan vim .*.swpdari buffer yang terlihat saat ini (baik jika file tersebut berisi perubahan yang belum disimpan dan ketika file yang diedit sama dengan .*.swp-file). Tentu, git dapat mengabaikan file-file ini atau vim dapat menyimpan file swap di lokasi yang berbeda (lihat vim.wikia atau pertanyaan ini di stackoverflow ). Tapi saya suka .*.swpfile -fil yang muncul git --statusketika mereka berisi perubahan yang belum disimpan, karena itu menandakan saya bahwa saya melakukan file dalam keadaan yang berbeda dari apa yang saya pikirkan.

Bagaimana saya bisa menghindari kesalahan positif dari .*.swp-file yang muncul git --statusketika file yang disimpan sama dengan .*.swp-file, sementara bisa melihat file yang dikomit berada dalam keadaan yang berbeda dari yang saya edit dengan vim?

  • Apakah mungkin hanya memiliki .*.swp-file, ketika file pada disk dan file dalam vim berbeda?
  • Apakah ada cara lain untuk mendeteksi file yang belum disimpan?

Menggabungkan komentar @elyashiv dan @VanLaser menghasilkan metode yang lebih sederhana daripada mendeteksi apakah file swap menyiratkan file yang belum disimpan:

  1. jangan biarkan git mengabaikan file. *. sw [po];
  2. ketika melakukan, jika git --statusmengungkapkan ada .*.sw[po]-file melakukan :wain vi; dan,
  3. tambahkan dan komit.
Kasper van den Berg
sumber
1
Anda dapat menggunakan :wauntuk memastikan tidak ada file yang belum disimpan.
elyashiv
2
sungguh, ini jauh "lebih waras" untuk memastikan semua file Anda disimpan sebelum Anda git commit...
VanLaser

Jawaban:

8

vim -rpada baris perintah akan mencantumkan semua file swap di direktori saat ini dan direktori sementara, dan apakah mereka berisi perubahan yang belum disimpan. Cari garis yang mengatakan modified: no/YES.

Saya tidak tahu bagaimana cara memberitahu Vim untuk mencari di direktori yang berbeda, jadi Anda harus mengubah ke setiap direktori yang berisi file swap dan jalankan vim -r. Anda bisa membuat skrip yang mem-parsing output git status, atau digunakan find -name '.*.sw[po]', dan kemudian dijalankan vim -rdi setiap direktori, untuk menampilkan semua file swap dengan perubahan yang belum disimpan.

(Saya menggunakan .*.sw[po]bukan .*.swp, karena kadang-kadang .swofile dibuat di samping .swpfile, ketika Anda mengedit file yang sudah memiliki file swap. .swnFile juga dapat dibuat jika Anda mengedit file dengan dua file swap yang ada, tapi saya tidak berpikir Saya pernah melihat satu di alam liar. Jika Anda benar-benar paranoid, Anda bisa menggunakan .*.sw[a-p]atau hanya .*.sw?.)

Lihat :help -runtuk (sedikit) informasi lebih lanjut tentang -ropsi, atau :help recover.txtuntuk informasi lebih lanjut tentang pemulihan dan bertukar nama file.

Lithis
sumber
1
Nah, file swap Vim adalah file tersembunyi (mengarah .pada nama file) sehingga pola yang tepat adalah .*.sw[a-p](walaupun dalam kasus patologis, Anda sebenarnya bisa sampai ke sana .foo.saa). Itu juga harus mencegah pencocokan file Flash, karena saya ragu itu biasanya merupakan file tersembunyi.
jamessan
@ jamessan Yang utama .diperlukan di shell glob, tetapi *.swpberfungsi sebagai argumen untuk find. Tetapi pemimpin .membuat segalanya lebih sederhana. Terima kasih!
Lithis
8
  • Apakah mungkin hanya memiliki .*.swp-file, ketika file pada disk dan file dalam vim berbeda?

Iya. Cuplikan di bawah ini (diadaptasi dari vimrc tpope ) akan menonaktifkan file swap untuk buffer ketika tidak dimodifikasi, jadi file swap hanya ada untuk file yang dimodifikasi.

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

Peringatan : Karena file swap hanya ada ketika buffer diubah, Anda kehilangan penggunaan file swap sebagai kunci penasihat. Jika buffer tidak dimodifikasi, maka Vim lain dapat mulai mengeditnya tanpa pemberitahuan bahwa buffer sudah terbuka. Jika Vim kedua disimpan sebelum yang pertama membuat lebih banyak perubahan, maka mereka tidak akan diketahui sampai pengguna mencoba untuk menyimpan atau sesuatu memicu Vim untuk memeriksa apakah file tersebut dimodifikasi.

jamessan
sumber