আমার ফাইলটি ভিমে সংরক্ষণ করার আগে আমি কি পরিবর্তনগুলি দেখতে পাচ্ছি?


134

আমি ভিম ব্যবহার করি আমি একটি ফাইল খুলি। আমি এটি সম্পাদনা করি এবং এটি সংরক্ষণ করার আগে আমি কী সম্পাদনা করেছি তা দেখতে চাই।

আমি কীভাবে এটি ভিমে করতে পারি?

উত্তর:


57

http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file

বর্তমানে সম্পাদিত ফাইল এবং ফাইল সিস্টেমে এর অপরিবর্তিত সংস্করণের মধ্যে পার্থক্য দেখার জন্য একটি ফাংশন এবং কমান্ড এখানে রয়েছে। এটি কেবল আপনার ভিএমআরসি বা প্লাগইন ডিরেক্টরিতে রেখে দিন, একটি ফাইল খুলুন, সেগুলি সংরক্ষণ না করে কিছু পরিবর্তন করুন এবং করুন :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'আদেশটি অনুকরণ করার জন্য ...


7
@ luc-hermitte আপনি :w !diff % -যখন চিরচেনা এবং বিপুল সংখ্যক বাক্সে ভিএম ব্যবহার করছেন তখন বিকল্পটি উচ্চতর নয়, যার জন্য আপনি সহজেই .vimrc পরিবর্তন করতে পারবেন না? (প্রদত্ত তারা
পৃথকভাবে

1
ভিম শেষ আশার হাতিয়ার নয়। অন্য যে কোনও কিছুই উপলভ্য না থাকাকালীন সেই কাজ করবে। এটি আমার মূল কাজ করার সরঞ্জাম।
লুক হার্মিটে

12
কেবল একটি লিঙ্ক সরবরাহ করা সত্যিই কোনও উত্তর নয়
স্কুরপি

3
কেওসের উত্তর উচ্চতর এবং টোবিয়াসের উত্তরে ব্যাখ্যাটি সম্পূর্ণ।
আভি কোহেন

1
আপনি কি দয়া করে কেবল একটি লিঙ্কের পরিবর্তে কিছু সামগ্রী যুক্ত করতে পারেন? SO নির্দেশিকা ...
Błażej মিশালিক

160
:w !diff % -

4
ভিমডিফ দিয়ে এটি করার কোনও উপায় আছে? আমি চেষ্টা করেছি: w! Vimdiff% - তবে সাফল্য ছাড়াই।
জো জে

14
কেউ কি এটি ব্যাখ্যা করতে পারেন? আমি বুঝতে পারছি না কি হচ্ছে। আমি বুঝতে পারছি আপনি গুলি চালাচ্ছেন diff%বর্তমানে খোলা ফাইলপথ বোঝায়। কেন এই সমস্ত :wআদেশের একটি যুক্তি ? এছাড়াও, কীভাবে -ওয়ার্কিং বাফারের বিষয়বস্তুগুলিকে বরাদ্দ দেওয়া হয়? এটি কি ভিআইএম-এ স্বয়ংক্রিয়, শেল কমান্ডের জন্য বাফারের সামগ্রীগুলি (বা সম্ভবত কোনও নির্দিষ্ট পরিসর) স্টিডিনকে দেওয়া হবে?
নাথান ওয়ালেস

9
@ নাথানওয়্যালেস: এটি একটি যুক্তি :wকারণ আমরা ফাইলটি কমান্ডটিতে (অন stdin) লিখছি । কমান্ডে, -এটি থেকে পড়তে বলে stdin
বিশৃঙ্খলা

14
বা :w !git diff % -রঙিন সংস্করণ ব্যবহার করুন , যদি আপনি গিট ইনস্টল করেন!
দেরগাচেভ

5
@ দারগাচেভ আমি fatal: bad flag '-' used after filenameচালানোর সময় ত্রুটিটি পাই :w !git diff % -
গ্রেস্কেল

100

কারণ কিছু লোক আদেশের ব্যাখ্যা সম্পর্কে জিজ্ঞাসা করেছিল

:w !diff % -

আরও বিস্তারিত উত্তর লেখার জন্য আমার এই প্রচেষ্টাটি এখানে:

আমি ধরে নিচ্ছি যে আপনি কোনও সিস্টেমে কাজ করছেন catএবং echoইনস্টল করেছেন (যেমন প্রায় কোনও জিএনইউ / লিনাক্স, ম্যাক ওএস, বিএসডি এবং অন্যান্য ইউএনএক্স-এর মতো সিস্টেম)।

উপরের কমান্ডটি নিম্নলিখিত হিসাবে কাজ করে:

  1. ভিমে ফাইল সংরক্ষণের বাক্য গঠনটি হ'ল:

    :w <filename>
    
  2. ভিমে শেল কমান্ড চালানোর সিনট্যাক্সটি হ'ল:

    :!<command>
    
  3. ভিএম দ্বারা ইস্যু করা শেল পরিবেশের অভ্যন্তরে %বর্তমান ফাইলের নাম চিহ্নিত করা হয়। আপনি নিম্নলিখিতটি সম্পাদন করে এটি যাচাই করতে পারেন:

    :!echo %
    

    এই ফাইলনামটি আউটপুট করা উচিত (অথবা একটি ত্রুটি, যদি ভিএম ফাইল নাম ছাড়া চালানো হয়)।

    বিড়াল ব্যবহার করে আমরা ফাইলের সামগ্রীটিও আউটপুট করতে পারি:

    :!cat %
    

    এটি ফাইলগুলির সামগ্রীটিকে সর্বশেষ সংরক্ষিত অবস্থায় বা কোনও ত্রুটি যদি এটি কখনও সংরক্ষণ না করা হয় তবে তা ফিরিয়ে আনতে হবে।

  4. প্রোগ্রাম ডিফ স্ট্যান্ডার্ড ইনপুট (স্টিডিন) থেকে পড়তে সক্ষম। এর ম্যান পৃষ্ঠাতে নিম্নলিখিতটি উল্লেখ করা হয়েছে:

    [...] যদি কোনও ফাইল '-' হয় তবে স্ট্যান্ডার্ড ইনপুট পড়ুন। [...]

  5. ফাইলের নাম ব্যতীত সেভ কমান্ড প্রয়োগ করা নয় বরং এর পিছনে একটি শেল কমান্ড প্রয়োগ করার ফলে ভিআইএম শারীরিক ফাইলগুলিতে সংরক্ষণের পরিবর্তে শেলটির স্টিডিনে ফাইল সামগ্রী লিখতে পারে। আপনি কার্যকর করে এটি যাচাই করতে পারেন

    :w !cat
    

    এটি সর্বদা ফাইলগুলির বর্তমান সামগ্রীকে মুদ্রণ করা উচিত (যা পরিবর্তে কোনও ফাইলে লেখা হত)।

এটি একসাথে রাখা (বা tl; dr): ফাইলটি স্টিডিনে "সংরক্ষণ করা হয়েছে", ফাইলের নাম এবং স্টিডিনের সাথে ইনপুট হিসাবে চালানো হয়।

এটি জানার সাথে ভিমডিফের মতো কিছু করার সাথেও ফাইলগুলির তুলনা করা যেতে পারে - এটি এমন একটি ধারণা যা আপনি এটি করতে চান না:

:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile

(তারপরে পঠনযোগ্য খুলুন এবং ব্যবহার করে ভিমডিফ বন্ধ করুন :qall)


ভিমিডিফ ব্যবহারের জন্য আরও বিচক্ষণ দৃষ্টিভঙ্গিটি হ'ল নিম্নলিখিত শেল স্ক্রিপ্ট তৈরি করা হবে vim - -c ":vnew $1 |windo diffthis", এটি কার্যকর হবে, উদাহরণস্বরূপ PATH এ এটি সংরক্ষণ করুন vimdiffWithStdinএবং তারপরে :w !vimdiffWithStdin %
ভিমে

এমনকি সহজ: :w !vimdiff % /dev/stdin। জানিনা উইন্ডোজের জন্যও একই ধরণের কৌশল রয়েছে কিনা।
deft_code

11

আমি সর্বদা পৃথক্ পছন্দগুলি পছন্দ করি - সুন্দর, সাধারণ, কাজ।


এটি অত্যন্ত উচ্চতর বিকল্পগুলির চেয়ে অনেক বেশি ভাল কাজ করে। এটি এটিকে টগল করার ক্ষমতা দেয়।
স্টিভেন লু

1
@ স্টিভেনলু - মেহ ... আপনি কি করতে পারেন? যাই হোক না কেন, আপনি এটি পছন্দ করেছেন খুশি। আমি অন্যান্য পদ্ধতির চেয়ে এটি ব্যবহারিক মনে করি।
রক

আমি, আমি দ্বিতীয় @ স্টিভেন করি, আপনার প্রস্তাবিত বিবর্তনগুলি দুর্দান্ত। ধন্যবাদ!
আঃ

এটি একই বিকাশকারী থেকে প্লাগইন হিসাবে ইনস্টল করা যেতে পারে: github.com/jmcantrell/vim-diffchanges
সুমন্ত

10

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

... vimdoc.sourceforge.net/htmldoc/diff.html# তে ডকুমেন্টেড হিসাবে: ডিফ ওরিগ । এই w !diff % -vim sftp://example.com/foo.txt
ওভারটির

1
আমি এটি আরও ভাল পছন্দ করি কারণ আমরা টার্মিনালের পরিবর্তে ভিএম বাফারের মধ্যেই পার্থক্যটি দেখতে পাই
নিকো বেলিক

পার্থক্যগুলি পরীক্ষা করার পরে আপনি কীভাবে স্বাভাবিক অবস্থায় ফিরে যাবেন?
নিকো বেলিক

কমান্ড সহ কমান্ড প্রতিস্থাপন করে আপনি যদি ক্লজটি থেকে মুক্তি পেতে পারেন! (দেখুন: এইচ E174)
এলিগ

@ নিকোবেলিক প্রথমে ": কিউ" দিয়ে "পুরানো" উইন্ডোটি (স্ক্র্যাচ বাফার হিসাবে চিহ্নিত) বন্ধ করুন। আপনি সাধারণ মোডে থাকাকালীন দুবার ctrl-W আলতো চাপ দিয়ে উইন্ডোজের মধ্যে পরিবর্তন করতে পারেন windows তারপরে আপনি লিখিতভাবে পৃথকটি টগল করতে পারেন: ডিফফফ
brunch875

2

নিম্নলিখিতটি ব্যবহার করুন এবং ব্যবহার করুন: ডিআইএফএফ কমান্ড

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()

2

আপনি যা খুঁজছেন ঠিক তা নয় তবে এসসিএমডিফ.ভিম সত্যিই দুর্দান্ত। একটি কিপ্রেস, এবং এটি সোর্স কন্ট্রোল রেপোতে আপনার বর্তমান ফাইলটিকে মাথা সংশোধন করে পৃথকভাবে হাইলাইট করে। এর অর্থ অনেকগুলি এসএমএসের সাথে কাজ করা। আমি এটি পারফরম্যান্স সহ ব্যবহার করি।


2

এখানে বিভিন্ন উত্তরের উপর ভিত্তি করে একটি প্লাগইন রয়েছে: https://github.com/gangleri/vim-diffsaved

এটি :w !diff % -পদ্ধতি এবং আরও জড়িত diffthisএকটি সরবরাহ করে।

আনডোট্রি ছাড়াও এটি এটিকে অনুমতি দেয় তবে আরও অনেক কিছু (বিভিন্ন পূর্ববর্তী চেকপয়েন্টগুলির মধ্যে পৃথক)। গুন্ডোর মতোই ।


1

আমি হিস্টউইনকে সুপারিশ করতে পারি প্লাগইনটি ।

যদিও এটি ফাইলের বর্তমান সংরক্ষিত সংস্করণটির সাথে আলাদা নয় (অন্যান্য উত্তরগুলির মতো), আপনি সম্পাদনা শুরু করার পরে এটি পরিবর্তনগুলি এবং এমনকি পুনরায় প্লে করতে পারবেন আপনার পরিবর্তনগুলিআপনি যদি মাঝারিভাবে সংরক্ষণ করেন তবে পার্থক্যটি দেখায়।

অতিরিক্তভাবে, এটি সমস্ত পূর্বাবস্থায় থাকা ইতিহাস শাখার একটি তালিকা প্রদর্শন করে এবং আপনাকে তাদের মধ্যে স্যুইচ বা পৃথক করার অনুমতি দেয়।

PS: প্রতিটি ফাইল পরিবর্তনের পর থেকে প্লাগইনটি সম্পাদনা ইতিহাসের মুহুর্তগুলিকে স্বয়ংক্রিয়ভাবে ট্র্যাক করে না, আপনি যখন ফাইলটি সংরক্ষণ করেন তখন আপনি সেই মুহূর্তটি স্পষ্টভাবে "ট্যাগ" করতে পারেন, যদি আপনি এটি চান তবে পরে এটির সাথে ভিমিডিফ করতে পারবেন। এই কি স্বয়ংক্রিয় করা যেতে পারে?


1

আপনি যদি ভিমডিফের মতো তুলনা করার জন্য ভিম ব্যবহার করতে চান তবে আপনি এই জাতীয় কিছু করতে পারেন:

আপনার .vimrc সম্পাদনা করুন এবং যুক্ত করুন:

nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>

সেখান থেকে আপনি আপনার পরিবর্তনগুলি দেখতে পাবেন qallএবং কমান্ড মোডে F8 টিপে বিমডিফের মতো ব্যবহার করে ভিন্ন মতামতটি ছাড়তে পারেন। আপনার পছন্দের যে কোনও কী দিয়ে F8 প্রতিস্থাপন করুন।

সম্পাদনা: কোনও সংশোধন বাতিল করার জন্য -এম যুক্ত করা হয়েছে, কারণ এটি সংরক্ষণ করা হয়নি।


এই আদেশটি আমার পক্ষে কাজ করা শুরু করে, এটি আমাকে পাশাপাশি দেখায়। যাইহোক, আমি যত তাড়াতাড়ি কিছু চেষ্টা এবং সম্পাদনা করার সাথে সাথে ভিম উইন্ডোটি পাগল হয়ে যায়। আমি টাইপ করা শুরু করি এবং আমি পর্দার উভয় পাশের ভিমে শব্দের পিছনে একটি বাশ প্রম্পট পাই। সুতরাং এটি পৃথক প্রদর্শিত হবে বলে মনে হচ্ছে, কিন্তু তারপরে Vim ক্র্যাশ। অতিরিক্তভাবে, আমি এই ত্রুটিটি এখানে Vim: Error reading input, exiting...কোন ভুল হতে চলেছে কোন ধারণা পেতে পারি ?
ট্রেভর

@ ট্রেভর: সমস্যাগুলি কী তা আমি কেবল অনুমান করতে পারি। এই মত আলাদা করার সময় কোনও পরিবর্তন করার জন্য এটি সংরক্ষণ করা যায় না। অতএব আমি এটি পুরোপুরি অস্বীকার করার জন্য "-M" পরামিতি যুক্ত করেছি। দুঃখিত।
টোবিয়াস হেইনিকে

1

git নিম্নলিখিত কমান্ড সমর্থন করে

:w !git diff --no-index -- % -

আপনার ~ / .vimrc এ নিম্নলিখিত যোগ করে একটি কমান্ডে মানচিত্র করুন

command GitDiff execute "w !git diff --no-index -- % -"

:GitDiffপ্রতিটি সঞ্চয়ের আগে দ্রুত পার্থক্য প্রদর্শন করার জন্য এক্সিকিউট করা একটি সহজ সামান্য কমান্ডে পরিণত হয়।


0

আপনি এর সাথে একটি শেষ ব্যাকআপ এবং আসল ব্যাকআপ তৈরি করতে ভিএম তৈরি করতে পারেন:

: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

এবং তারপরে করুন: প্রতিটি বিভক্তিতে পৃথক


0

আপনি কেবল সম্পাদিত [ বাফার ] পরিবর্তনগুলি , অর্থাৎ শেষ রক্ষিত সংস্করণ ( ওয়ার্কিং ডায়ার ইক্টোরি) থেকে পৃথক হওয়াগুলি, এগুলি সর্বশেষ সূচী সংস্করণ ( গিট ) এর সাথে পৃথক হতে পারে । আমি উভয় ম্যাপ:

" 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: : vimdiff
  • গিডিফ: 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

1
কেউ কেবলমাত্র 1 টি মানচিত্র তৈরি করতে পারে যা কার্যকর করে: একটি Gdiffসম্ভব হলে এবং অন্যথায় (যেমন গিট প্রকল্প নয়) তারপরে একটি সম্পাদন করুন :vimdiff। সঙ্গে try-catch-endtry। তবে :DiffWithSavedগিট প্রকল্পে এইভাবে অভাব রয়েছে।
এক্সপি গার্সিয়া

-2

উপরের পরামর্শগুলি অনুসরণ করুন আমি গিট ডিফ ব্যবহার করি যা আমি বেশি পছন্দ করি:

:w !git diff  % -
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.