Menjalankan perintah pembersihan hanya untuk jalur yang diedit?

8

Mengacu pada tugas pembersihan seperti (tetapi tidak terbatas pada) yang dirinci dalam pertanyaan ini:

apakah ada cara untuk menerapkan perintah-perintah itu hanya baris file yang benar-benar dimodifikasi? Ini untuk menjaga agar keluaran diff terfokus pada perubahan aktual setelah mengedit kode sumber (kode-resensi potensial tidak akan bingung dengan perubahan yang terlibat dalam membersihkan seluruh file), sementara tidak memperkenalkan masalah pemformatan baru.

guido
sumber
vim.wikia.com/wiki/… ... Mungkin menjadi tempat yang baik untuk memulai ... Tidak ada waktu untuk menulis jawaban lengkap sekarang ;-)
Martin Tournoij
@Carpetsmoker thx untuk tautan
guido
Saya melakukan penggalian lagi, dan saya pikir ini tidak mungkin. :changestidak berfungsi tanpa banyak peretasan; karena tampaknya informasi ini disimpan dalam file viminfo, dan tidak ada cara untuk melihat perubahan mana yang Anda buat pada sesi ini, dan yang sebelumnya ... Kecuali Anda menonaktifkan file viminfo tentu saja, tapi itu agak berat ... ingin terbukti salah di sini, meskipun :-)
Martin Tournoij
@Carpetsmoker Saya tidak berpikir daftar perubahan berisi cukup informasi untuk mengimplementasikan fitur ini, bahkan jika Anda dapat mengisolasi perubahan yang dibuat di setiap sesi. Ini berisi posisi kursor tunggal untuk setiap perubahan, jadi Anda tidak dapat mengetahui sejauh mana pengeditan yang dilakukan.
Kaya
@Rich Ya, saya sampai pada kesimpulan yang sama ...
Martin Tournoij

Jawaban:

4

Anda dapat menggunakan perintah folddoopenuntuk menjalankan perintah hanya pada baris yang tidak berada dalam flip tertutup.

Misalnya, Anda dapat menghapus spasi dari ujung baris dengan perintah:

:%s/\s\+$//

Untuk menerapkan ini hanya pada garis yang saat ini tidak berada dalam flip tertutup, tambahkan folddopen, seperti ini:

:%folddoopen s/\s\+$//

folddoopenbisa juga disingkat menjadi foldd.

Jika Anda menggunakan Vim sebagai alat diff kontrol sumber Anda, maka Anda dapat menggunakan ini untuk menerapkan suntingan hanya pada baris yang diubah saat melihat diff.

Perhatikan bahwa secara default, mode diff Vim menampilkan beberapa baris sebelum dan sesudah setiap bagian yang diubah. Jadi agar tidak mempengaruhi garis yang segera sebelum atau setelah baris berubah Anda harus set pertama contextdalam diffoptuntuk 0misalnya:

:set diffopt=filler,context:0

Untuk pengeditan manual, Anda mungkin juga menemukan foldopenopsi untuk berguna. Ini mendefinisikan jenis perintah mana yang akan menyebabkan lipatan terbuka. Meskipun perhatikan bahwa itu tidak mencegah pengeditan terjadi di dalam lipatan seperti yang dilakukan folddoopenperintah.

(Jika Anda memaksudkan hal lain dengan "baris file yang sebenarnya dimodifikasi" maka Anda harus menemukan cara untuk melipat garis yang tidak berubah sebelum Anda menjalankan perintah: cara termudah adalah menyimpan salinan yang tidak berubah. file dan gunakan vimdiff secara manual.)

Kaya
sumber
2
Ini ide yang sangat kreatif! Saya tidak tahu :folddoopen, sepertinya perintah yang sangat berguna. Saya juga ingin menawarkan bahwa jika menggunakan fugitive.vim , Anda dapat lebih mudah melihat perbedaan buffer saat ini dengan :Gdiffperintah.
tommcdo
Ini bekerja dengan baik; Saya dapat membuka buffer awal dengan revisi sebelumnya berbeda dengan saat ini :vsp new, lalu :read !git show HEAD~1:pathdan akhirnya :windo diffthis(dan kemudian menggunakan solusi Anda).
guido