Yanıtlar:
http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file
Şu anda düzenlenmiş olan dosya ile dosya sistemindeki değiştirilmemiş sürümü arasındaki farkı görmek için bir işlev ve komut. Bunu vimrc veya plugin dizinine koyun, bir dosya açın, kaydetmeden bazı değişiklikler yapın ve yapın
: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()
Farklı görünümden çıkmak için
:diffoff
komutu kullanabilirsiniz .Aşağıda,
'cvs diff'
komutu taklit etmek için uyarlanmış benzer bir işlev var ...
:w !diff % -
diff
. %
şu anda açık olan dosyayolunu ifade eder. Bütün bunlar neden :w
komuta karşı bir argüman ? Ayrıca, -
çalışma arabelleğinin içeriğine nasıl atanır? Bu otomatik olarak vim, arabellek içeriği (veya arabellekteki belirli bir aralık) kabuk komutları için stdin'e atanır mı?
:w
çünkü dosyayı komuta yazıyoruz (açık stdin
). Komutta, -
okumasını söyler stdin
.
:w !git diff % -
git yüklü ise renklendirilmiş bir sürüm için kullanın !
fatal: bad flag '-' used after filename
Çalıştırdığımda hatayı alıyorum :w !git diff % -
.
Çünkü bazı insanlar komuta için bir açıklama istedi
:w !diff % -
İşte daha ayrıntılı bir cevap yazma girişimim:
Yüklü cat
ve echo
kurulu bir sistem üzerinde çalıştığınızı varsayıyorum (örneğin hemen hemen tüm GNU / Linux, Mac OS, BSD ve diğer UNIX benzeri sistemler).
Yukarıdaki komut aşağıdaki gibi çalışır:
Bir dosyayı vim'e kaydetmek için sözdizimi:
:w <filename>
Vim'de shell komutu yürütmenin sözdizimi şöyledir:
:!<command>
Vim tarafından verilen kabuk ortamının içinde %
mevcut dosya adını gösterir. Aşağıdakileri yürüterek bunu doğrulayabilirsiniz:
:!echo %
Bu, dosya adını (veya vim dosya adı olmadan çalıştırıldıysa bir hatayı) çıkarmalıdır.
Cat kullanarak dosyanın içeriğini de çıkarabiliriz:
:!cat %
Bu, dosya içeriğini son kaydedildiği durumuna veya hiç kaydedilmemişse bir hataya dönmelidir.
Program farkı standart girişten (stdin) okuyabilir. Kılavuz sayfası şunları belirtir:
[...] Bir DOSYA '-' ise standart girişi okuyun. [...]
Save komutunu bir dosya adı olmadan yürütmek yerine arkasında bir kabuk komutu kullanmak, vim'in dosya içeriğini fiziksel bir dosyaya kaydetmek yerine kabuğun stdinine yazmasına neden olur. Bunu yürüterek doğrulayabilirsiniz.
:w !cat
Bu her zaman dosyaların geçerli içeriğini yazdırmalıdır (bunun yerine bir dosyaya yazılır).
Bir araya getirmek (veya tl; dr): Dosya stdin'e "kaydedilir", diff dosya adı ve stdin girdi olarak çalıştırılır.
Bunu bilmek vimdiff ile böyle bir şey yaparak dosyaları karşılaştırabilir - bu sadece bunu yapmak istemediğiniz bir fikir:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(Sonra salt okunur olarak açın ve vimdiff kullanarak kapatın :qall
)
vim - -c ":vnew $1 |windo diffthis"
, çalıştırılabilir hale getirmek, örneğin PATH'e kaydetmek vimdiffWithStdin
ve daha sonra :w !vimdiffWithStdin %
:w !vimdiff % /dev/stdin
. Pencereler için benzer bir hile olup olmadığını bilmiyorum.
Her zaman farklılıkları severim - güzel, basit, çalışır.
:DiffChangesDiffToggle
.
from vimrc_example.vim:
" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
if !exists(":DiffOrig")
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
\ | wincmd p | diffthis
endif
w !diff % -
çok üzerinde uzak kaynaklardan çalışır (örneğin: vim sftp://example.com/foo.txt
)
Aşağıdakileri kaynaklayın ve kullanın: DIFF komutu
function! s:diff()
let tmpa = tempname()
let tmpb = tempname()
earlier 100h
exec 'w '.tmpa
later 100h
exec 'w '.tmpb
update
exec 'tabnew '.tmpa
diffthis
vert split
exec 'edit '.tmpb
diffthis
endfunction
command! -nargs=0 DIFF call <SID>diff()
Tam olarak aradığınız şey değil ama SCMDiff.vim gerçekten harika. Bir tuşa basıldığında, kaynak kontrol deposundaki kafa revizyonu ile mevcut dosyanızı farklı şekilde vurgular. Birçok SCMS ile çalışmak içindir. Performansla kullanıyorum.
Burada farklı cevaplara dayanan bir eklenti var: https://github.com/gangleri/vim-diffsaved
Sağladığı :w !diff % -
yöntem ve daha fazla dahil diffthis
bir.
Bunun dışında, geri almanın yanı sıra buna daha fazla izin verir (farklı geri alma kontrol noktaları arasındaki farklar). Gundo benzer .
Ben tavsiye edebilir histwin eklentisi.
O değil fark yok iken akım kaydedilmiş (diğer cevaplar gibi) dosyanın sürümü, olabilir sen edting başladıktan sonra vimdiff değiştirir ve hatta tekrar sırayla değişiklikleri. Aradaki farkı kaydedip kaydetmediğinizi gösterir.
Ayrıca, tüm geri alma geçmişi dallarının bir listesini görüntüler ve bunlar arasında geçiş yapmanızı veya aralarında değişiklik yapmanızı sağlar.
Not: Eklenti, her dosya değiştiğinden beri düzenleme geçmişindeki anları otomatik olarak izlemese de, dosyayı kaydettiğiniz anı daha sonra onunla birlikte vimdiff yapabileceğiniz şekilde açıkça "etiketleyebilirsiniz". Belki bu otomatik olabilir?
Vimdiff gibi karşılaştırma için vim kullanmak istiyorsanız, böyle bir şey yapabilirsiniz:
.Vimrc dosyanızı düzenleyin ve ekleyin:
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
Oradan değişikliklerinizi göreceksiniz ve qall
komut modunda F8'e basarak vimdiff'deki gibi kullanarak diff görünümünden çıkabilirsiniz. F8'i istediğiniz herhangi bir anahtarla değiştirin.
Düzenleme: Herhangi bir değişikliğe izin vermemek için -M eklendi, çünkü kaydedilmedi.
Vim: Error reading input, exiting...
burada yanlış giden herhangi bir fikir bu hatayı alıyorum ?
git aşağıdaki komutu destekler
:w !git diff --no-index -- % -
~ / .vimrc'nize aşağıdakileri ekleyerek komutla eşleştirin
command GitDiff execute "w !git diff --no-index -- % -"
Şimdi yürütme :GitDiff
, her kaydetmeden önce farkı hızlı bir şekilde göstermek için kullanışlı küçük bir komut haline gelir.
Vim'in aşağıdakilerle bir son yedekleme ve orijinal yedekleme oluşturmasını sağlayabilirsiniz:
:set backup
:set patchmode=.orig
Bundan sonra, bunları bir bölünmüş olarak açabilirsiniz:
:vsp %:p~ or :vsp %:.orig
Ve oradan:
:vimdiff in each buffer
Artıklar üzerinde ölmediyseniz ancak vimdiff istiyorsanız, şunları da yapabilirsiniz:
ggVGy # copy the whole buffer
:vnew # open a split
CTRL-W w # switch to it
shift-P # paste at start
ve sonra şunu yapın:
Az önce düzenlediğiniz değişiklikler [ arabellek ], yani son kaydedilen sürümden ( çalışma dizininde) farklı olanlar, bunlar son dizin sürümüyle ( Git ) farklılık gösterebilir . Her ikisini de eşledim:
" Find diff inbetween currrent buffer and ... A{last index version} vs B{last saved version in working directory}
" - A{last index version}: the file as you last commited it
" git diff to vimdiff against the index version of the file:
nnoremap <leader>gd <Esc>:Gvdiff<CR><Esc>:echo "currentBuffer vs lastIndexVersion (last commited)"<CR>
" - B{last saved version in working directory}: the file you last :w,
" not neccesary commited it (not commited for sure if it is in NO git project)
" https://vim.fandom.com/wiki/Diff_current_buffer_and_the_original_file
nnoremap <leader>gd2 <Esc>:DiffSaved<CR><Esc>:echo "currentBuffer vs lastSaved (not neccesary equal to last commited)"<CR>
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()
Vimdiff vs Gdiff örneği.
Ayrıca, vimdiff
diğer yoldaki kolay homonym dosyasına:
" vimdiff homonym file
nnoremap <leader>dh <Esc>:vsplit %:p:h/../__/%:t <bar> :windo diffthis<Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left>
"E.g."$ vim /path01/proj02_pg064/processorder.php
":vsplit %:p:h/../proj01_pg05/%:t | :windo diffthis
Gdiff
mümkünse ve başka bir şekilde (örneğin bir Git projesi değil) a :vimdiff
. İle try-catch-endtry
. Ancak :DiffWithSaved
bir Git projesinde bu şekilde eksiktir.
:w !diff % -
kolayca değiştiremeyeceğiniz sürekli değişen ve çok sayıda kutuda vim kullanırken alternatif üstün değil mi? (