Saya menggunakan Vim. Saya membuka file. Saya mengeditnya dan saya ingin melihat apa yang telah saya edit sebelum menyimpannya.
Bagaimana saya bisa melakukan ini di Vim?
http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file
Berikut adalah fungsi dan perintah untuk melihat perbedaan antara file yang saat ini diedit dan versi yang tidak dimodifikasi dalam sistem file. Cukup letakkan ini di vimrc Anda atau di direktori plugin, buka file, buat beberapa modifikasi tanpa menyimpannya, dan lakukan
:DiffSaved
.function! s:DiffWithSaved() let filetype=&ft diffthis vnew | r # | normal! 1Gdd diffthis exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype endfunction com! DiffSaved call s:DiffWithSaved()
Untuk keluar dari tampilan diff Anda dapat menggunakan
:diffoff
perintah.Di bawah ini adalah fungsi yang serupa, diadaptasi untuk meniru
'cvs diff'
perintah ...
:w !diff % -
unggul ketika Anda menggunakan vim pada kotak yang selalu berubah dan besar yang Anda tidak dapat dengan mudah mengubah .vimrc untuk? (Asalkan mereka memiliki diff diinstal.)sumber
diff
.%
merujuk ke filepath yang saat ini terbuka. Mengapa semua ini merupakan argumen untuk:w
perintah? Juga, bagaimana cara-
ditugaskan ke konten buffer yang berfungsi? Apakah itu otomatis dalam vim, bahwa isi buffer (atau mungkin rentang tertentu dalam buffer) ditugaskan untuk stdin untuk perintah shell?:w
karena kami sedang menulis file ke perintah (onstdin
). Dalam perintah,-
suruh dibaca daristdin
.:w !git diff % -
untuk versi berwarna, jika Anda sudah menginstal git!fatal: bad flag '-' used after filename
ketika saya menjalankan:w !git diff % -
.Karena beberapa orang bertanya tentang penjelasan untuk perintah itu
Inilah upaya saya untuk menulis jawaban yang lebih terperinci:
Saya berasumsi bahwa Anda bekerja pada sistem dengan
cat
danecho
diinstal (misalnya, hampir semua GNU / Linux, Mac OS, BSD dan sistem seperti UNIX lainnya).Perintah di atas berfungsi sebagai berikut:
Sintaks untuk menyimpan file di vim adalah:
Sintaks untuk menjalankan perintah shell di vim adalah:
Di dalam lingkungan shell yang dikeluarkan oleh vim
%
kebetulan menunjuk ke nama file saat ini. Anda dapat memverifikasi ini dengan menjalankan yang berikut:Ini akan menampilkan nama file (atau kesalahan, jika vim dijalankan tanpa nama file).
Menggunakan cat, kami juga dapat menampilkan konten file:
Ini harus mengembalikan konten file dalam keadaan terakhir disimpan atau kesalahan jika tidak pernah disimpan.
Program diff dapat membaca dari input standar (stdin). Halaman manualnya menyatakan sebagai berikut:
Menjalankan perintah save tanpa nama file tetapi perintah shell di belakangnya menyebabkan vim untuk menulis konten file ke stdin dari shell bukannya menyimpannya dalam file fisik. Anda dapat memverifikasi ini dengan mengeksekusi
Ini harus selalu mencetak file konten saat ini (yang seharusnya ditulis ke file).
Menyatukannya (atau tl; dr): File "disimpan" ke stdin, diff dijalankan dengan nama file dan stdin sebagai input.
Mengetahui yang ini juga bisa membandingkan file dengan vimdiff melakukan sesuatu seperti ini - ini hanya ide yang tidak ingin Anda lakukan:
(Kemudian buka hanya baca dan tutup vimdiff menggunakan
:qall
)sumber
vim - -c ":vnew $1 |windo diffthis"
, menjadikannya dapat dieksekusi, menyimpannya di PATH sebagai contohvimdiffWithStdin
dan kemudian membandingkan dengan perintah berikut dalam vim::w !vimdiffWithStdin %
:w !vimdiff % /dev/stdin
. Saya tidak tahu apakah ada trik serupa untuk windows.Saya selalu suka perubahan - bagus, sederhana, bekerja.
sumber
:DiffChangesDiffToggle
.dari vimrc_example.vim:
sumber
w !diff % -
adalah bahwa ia bekerja sumber lebih jauh juga (misalnya:vim sftp://example.com/foo.txt
)Sumber berikut ini dan gunakan: perintah DIFF
sumber
Tidak persis apa yang Anda cari tetapi SCMDiff.vim sangat keren. Satu penekanan tombol, dan ini akan menyoroti file Anda saat ini dengan revisi kepala di repo kontrol sumber. Ini dimaksudkan untuk bekerja dengan banyak SCMS. Saya menggunakannya dengan terpaksa.
sumber
Ada sebuah plugin, berdasarkan jawaban yang berbeda di sini: https://github.com/gangleri/vim-diffsaved
Ini memberikan
:w !diff % -
metode dan yang lebih terlibatdiffthis
.Terlepas dari undotree memungkinkan ini juga, tetapi juga lebih banyak (berbeda antara pos pemeriksaan yang berbeda). Mirip dengan Gundo .
sumber
Saya dapat merekomendasikan plugin histwin .
Meskipun tidak berbeda dengan versi file yang disimpan saat ini (seperti jawaban lainnya), ia dapat mengubah perubahan sejak Anda mulai mengedit , dan bahkan memutar ulang perubahan Anda secara berurutan. Perbedaannya terlihat jika Anda menyimpan perantara.
Selain itu, ini menampilkan daftar semua membatalkan cabang sejarah dan memungkinkan Anda untuk beralih atau berbeda di antara mereka.
PS: Walaupun plugin tidak secara otomatis melacak momen dalam riwayat edit sejak setiap perubahan file, Anda dapat secara eksplisit "menandai" saat ketika Anda menyimpan file tersebut sehingga nantinya Anda dapat melakukannya, jika Anda menginginkannya. Mungkin ini bisa otomatis?
sumber
Jika Anda ingin menggunakan vim untuk perbandingan seperti di vimdiff, Anda dapat melakukan sesuatu seperti ini:
Edit .vimrc Anda dan tambahkan:
Dari sana, Anda akan melihat perubahan Anda dan dapat keluar dari tampilan diff menggunakan
qall
seperti di vimdiff dengan menekan F8 dalam mode perintah. Ganti F8 dengan tombol apa saja yang Anda suka.Sunting: Ditambahkan -M untuk melarang modifikasi apa pun, karena tidak menyimpan.
sumber
Vim: Error reading input, exiting...
setiap ide apa yang salah di sini?git mendukung perintah berikut
:w !git diff --no-index -- % -
petakan ke perintah dengan menambahkan berikut ini ke ~ / .vimrc Anda
command GitDiff execute "w !git diff --no-index -- % -"
Sekarang mengeksekusi
:GitDiff
menjadi perintah kecil yang berguna untuk dengan cepat menampilkan diff sebelum setiap save.sumber
Anda dapat membuat vim membuat cadangan terakhir dan cadangan asli dengan:
Setelah itu, Anda dapat membukanya secara terpisah:
Dan dari sana lakukan:
Jika Anda mati karena tidak ada sisa makanan tetapi ingin vimdiff, Anda juga dapat melakukan:
dan kemudian lakukan: bedakan ini pada setiap split
sumber
Perubahan yang baru saja Anda edit [ buffer ], yaitu yang berbeda dari versi yang disimpan terakhir (dalam direktori kerja ), ini mungkin berbeda dengan versi indeks terakhir ( Git ). Saya memetakan keduanya:
Contoh vimdiff vs Gdiff.
Selanjutnya, untuk mempermudah
vimdiff
file homonim di jalur lain:sumber
Gdiff
jika memungkinkan dan sebaliknya (mis. Bukan proyek Git) kemudian melakukan a:vimdiff
. Dengantry-catch-endtry
. Namun cara ini:DiffWithSaved
dalam proyek Git kurang.Ikuti saran di atas saya gunakan git diff yang sangat saya sukai:
sumber