जवाबों:
http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file
फाइल सिस्टम में वर्तमान में संपादित फ़ाइल और इसके अनमॉडिफाइड संस्करण के बीच एक अंतर देखने के लिए एक फ़ंक्शन और कमांड है। बस इसे अपने vimrc या plugin directory में डालें, एक फ़ाइल खोलें, उन्हें सहेजे बिना कुछ संशोधन करें, और करें
: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()
अलग-अलग दृश्य से बाहर निकलने के लिए आप
:diffoff
कमांड का उपयोग कर सकते हैं ।नीचे एक समान फ़ंक्शन है, जो
'cvs diff'
कमांड की नकल करने के लिए अनुकूलित है ...
:w !diff % -
diff
। %
वर्तमान में खुली फ़ाइलपथ को संदर्भित करता है। यह सब :w
कमांड का तर्क क्यों है ? इसके अलावा, -
काम करने वाले बफर की सामग्री को कैसे सौंपा जाता है? क्या यह स्वचालित रूप से है, कि बफर की सामग्री (या शायद बफर में एक विशिष्ट रेंज) शेल कमांड के लिए स्टड को सौंपी जाती है?
:w
क्योंकि हम फाइल को कमांड पर ( stdin
) पर लिख रहे हैं । कमांड में, -
इसे पढ़ने के लिए कहता है stdin
।
:w !git diff % -
एक रंगीन संस्करण के लिए उपयोग करें , अगर आपने गिट स्थापित किया है!
fatal: bad flag '-' used after filename
चलाने पर त्रुटि मिलती है :w !git diff % -
।
क्योंकि कुछ लोगों ने कमांड के लिए स्पष्टीकरण के बारे में पूछा
:w !diff % -
यहाँ एक अधिक विस्तृत उत्तर लिखने का मेरा प्रयास है:
मैं मान रहा हूं कि आप एक सिस्टम पर काम कर रहे हैं cat
औरecho
इंस्टॉल किया हुआ है (उदाहरण के लिए लगभग कोई भी GNU / Linux, Mac OS, BSD और अन्य UNIX- जैसे सिस्टम)।
उपरोक्त आदेश निम्नानुसार काम करता है:
फ़ाइल को सहेजने के लिए सिंटैक्स है:
:w <filename>
विम में शेल कमांड को निष्पादित करने के लिए सिंटैक्स है:
:!<command>
विम द्वारा जारी शेल पर्यावरण के अंदर %
वर्तमान फ़ाइल नाम को इंगित करता है। आप निम्नलिखित को निष्पादित करके इसे सत्यापित कर सकते हैं:
:!echo %
यह फ़ाइल नाम (या एक त्रुटि, अगर विम फ़ाइल नाम के बिना चलाया गया था) का उत्पादन करना चाहिए।
बिल्ली का उपयोग करके हम फ़ाइल की सामग्री को भी आउटपुट कर सकते हैं:
:!cat %
यह अपने अंतिम सहेजे गए राज्य में फ़ाइलों की सामग्री को वापस कर देना चाहिए या यदि इसे कभी सहेजा नहीं गया है, तो एक त्रुटि।
कार्यक्रम अंतर मानक इनपुट (स्टडिन) से पढ़ने में सक्षम है। इसका मैन पेज निम्नलिखित बताता है:
[...] यदि एक फ़ाइल '-' है, तो मानक इनपुट पढ़ें। [...]
फ़ाइल नाम के बिना सेव कमांड को निष्पादित करना, बल्कि इसके पीछे एक शेल कमांड के कारण फ़ाइल सामग्री को शेल में स्टड करने के लिए लिखने के बजाय इसे भौतिक फ़ाइल में सहेजने का कारण बनता है। आप इसे निष्पादित करके सत्यापित कर सकते हैं
:w !cat
यह हमेशा फ़ाइलों को मुद्रित करना चाहिए वर्तमान सामग्री (जो इसके बजाय एक फ़ाइल में लिखी गई होगी)।
इसे एक साथ रखना (या tl; डॉ।): फ़ाइल को स्टड करने के लिए "सहेजा गया" है, फ़ाइल इनपुट के रूप में फ़ाइल नाम और स्टडिन के साथ चलाया जाता है।
यह जानने के बाद भी आप इस तरह से कुछ कर सकते हैं - vimdiff के साथ फ़ाइलों की तुलना कर सकते हैं - यह सिर्फ एक विचार है जो आप ऐसा नहीं करना चाहते हैं:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(इसके बाद आसानी से खोलें और उपयोग करते हुए बंद करें :qall
)
vim - -c ":vnew $1 |windo diffthis"
बना रहा होगा, जो इसे निष्पादन योग्य बना देगा, इसे PATH में सहेजना होगा उदाहरण के लिए vimdiffWithStdin
और फिर vim में निम्नलिखित कमांड के साथ तुलना करना::w !vimdiffWithStdin %
:w !vimdiff % /dev/stdin
:। मैं नहीं जानता कि क्या खिड़कियों के लिए एक समान चाल मौजूद है।
मुझे हमेशा डिफरेंसेस पसंद हैं - अच्छा, सरल, काम करता है।
:DiffChangesDiffToggle
।
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 % -
है कि यह दूरस्थ स्रोतों पर भी काम करता है (उदाहरण के लिए vim sftp://example.com/foo.txt
) :
निम्नलिखित स्रोत और उपयोग करें: DIFF कमांड
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()
नहीं बिल्कुल वही जो आप ढूंढ रहे हैं लेकिन SCMDiff.vim वास्तव में अच्छा है। एक keypress, और यह एक स्रोत नियंत्रण रेपो में हेड संशोधन के साथ आपकी वर्तमान फ़ाइल को अलग करता है। यह कई SCMS के साथ काम करने के लिए है। मैं इसे पर्फेक्ट के साथ उपयोग करता हूं।
यहाँ एक प्लगइन है, जो विभिन्न उत्तरों पर आधारित है: https://github.com/gangleri/vim-diffsaved
यह :w !diff % -
विधि और अधिक शामिल diffthis
एक प्रदान करता है ।
इसके अलावा अंडरट्री इसे भी अनुमति देती है, लेकिन बहुत अधिक (विभिन्न पूर्ववत चौकियों के बीच भिन्नता)। गुंडो के समान ।
मैं histwin प्लगइन की सिफारिश कर सकते हैं ।
हालांकि यह करने के लिए अंतर नहीं है वर्तमान बचाया फ़ाइल का संस्करण (अन्य उत्तर की तरह), यह कर सकते हैं vimdiff में परिवर्तन के बाद से आप edting शुरू कर दिया , और यहां तक कि पुन: चलाने के क्रम में अपने परिवर्तन। अंतर दिखाता है यदि आप मध्यवर्ती रूप से बचत करते हैं।
इसके अतिरिक्त, यह सभी पूर्ववत इतिहास शाखाओं की एक सूची प्रदर्शित करता है और आपको उनके बीच स्विच या अंतर करने की अनुमति देता है।
पुनश्च: जबकि प्लगइन स्वचालित रूप से हर फ़ाइल को बदलने के बाद से संपादित इतिहास में क्षणों को ट्रैक नहीं करता है, आप उस पल को स्पष्ट रूप से "टैग" कर सकते हैं जब आप फ़ाइल को ऐसे सहेजते हैं कि आप बाद में इसके साथ विमीडिफ कर सकते हैं, यदि आप ऐसा चाहते हैं। शायद यह स्वचालित हो सकता है?
अगर आप vimdiff की तरह तुलना के लिए vim का उपयोग करना चाहते हैं, तो आप कुछ इस तरह कर सकते हैं:
अपना .vimrc संपादित करें और जोड़ें:
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
वहां से आप अपने परिवर्तनों को देखेंगे और qall
कमांड मोड में F8 दबाकर vimdiff की तरह उपयोग करने वाले अलग-अलग दृश्य को छोड़ सकते हैं । अपनी पसंद की किसी भी कुंजी के साथ F8 बदलें।
संपादित करें: जोड़ा -M किसी भी संशोधन को अस्वीकार करने के लिए, क्योंकि यह बचा नहीं है।
Vim: Error reading input, exiting...
कि यहां क्या गलत हो रहा है?
git निम्नलिखित कमांड का समर्थन करता है
:w !git diff --no-index -- % -
इसे अपने ~ / .vimrc में निम्नलिखित जोड़कर एक कमांड में मैप करें
command GitDiff execute "w !git diff --no-index -- % -"
अब अमल करना :GitDiff
एक छोटी सी आज्ञा बन जाता है ताकि प्रत्येक बचाने से पहले वह जल्दी से दिखाई दे सके।
आप एक अंतिम बैकअप बना सकते हैं और इसके साथ मूल बैकअप बना सकते हैं:
:set backup
:set patchmode=.orig
इसके बाद, आप उन्हें एक विभाजन में खोल सकते हैं:
:vsp %:p~ or :vsp %:.orig
और वहाँ से:
:vimdiff in each buffer
यदि आप बिना किसी बचे हुए पर मर चुके हैं, लेकिन विमीडफ चाहते हैं, तो आप यह भी कर सकते हैं:
ggVGy # copy the whole buffer
:vnew # open a split
CTRL-W w # switch to it
shift-P # paste at start
और फिर करते हैं: प्रत्येक विभाजन पर अंतर
आपके द्वारा अभी परिवर्तित किए गए परिवर्तन [ बफर ], अर्थात जो पिछले सहेजे गए संस्करण ( वर्किंग डीर एक्टोरी में) से भिन्न हैं, ये अंतिम इंडेक्स संस्करण ( Git ) के साथ भिन्न हो सकते हैं । मैंने दोनों को मैप किया:
" 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()
Vddiff बनाम Gdiff का उदाहरण।
इसके अलावा, vimdiff
अन्य पथ में आसान होमलोन फ़ाइल के लिए:
" 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
यदि संभव हो और अन्यथा (जैसे जीआईटी प्रोजेक्ट नहीं) तो प्रदर्शन करें :vimdiff
। के साथ try-catch-endtry
। लेकिन :DiffWithSaved
एक गिट परियोजना में इस तरह की कमी है।
:w !diff % -
बेहतर नहीं है जब आप एक एवरचार्जिंग और बड़ी संख्या में बॉक्स पर विम का उपयोग कर रहे हैं जिसे आप आसानी से .vimrc के लिए बदल नहीं सकते हैं? (बशर्ते वे स्थापित हो गए हैं।)