क्या वर्तमान प्रक्रिया के टैब में git के अंतर के लिए vimdiff शुरू किया जा सकता है?

Jan 20 2021

मान लीजिए कि मेरे पास एक फ़ाइल बफर ओपन है और :terminal1 टैब पेज में एक स्प्लिट ओपन है। मैं एक नया टैब बनाना चाहता हूं, जहां मैं दौड़ता हूं, vimdiffलेकिन मेरे पास काफी अंतर है। मैं git difftool HEAD~1अपनी मौजूदा vim प्रक्रिया में दिखाने की कोशिश कर रहा हूं , बस दूसरे टैब पेज पर।

क्या यह प्लगइन्स के बिना विम 8 पर संभव है?

मुझे यह भ्रम तब होता है जब मैं करता हूं :tab terminalऔर फिर दौड़ता हूं git difftool HEAD~1। हालाँकि, यह एक विम सबप्रोसेस शुरू करता है और मैं इससे बचना चाहूँगा।

इस तरह का प्रश्न: मैं दो मोड में पहले से ही खुले हुए विम्डीफ मोड में कैसे प्रवेश कर सकता हूं? लेकिन गिट भिन्नता के लिए।

जवाब

2 NikolasTapia Jan 20 2021 at 17:03

हालांकि यह निश्चित रूप से वेनिला vimमें उल्लेखनीय हैvim-fugitive , मेरा सुझाव है कि आप tpope के उत्कृष्ट प्लगइन पर एक नज़र डालें । फिर, आपको बस :tab Gdiffवही करना होगा जो आप चाहते हैं।

यदि आप वास्तव में कोई प्लग-इन स्थापित नहीं करना चाहते हैं, तो निम्नलिखित कार्य कर सकता है मान लें कि वर्तमान फ़ाइल बफर नं में है। 1:

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. नए खुले टैब में, :vert sb 1 | windo diffthis

व्याख्या

  1. सबसे पहले एक नया टैब खोलता है tabnewऔर HEAD^फ़ाइल के संस्करण की सामग्री को बफर 1 में लोड करता है।
  2. एक ऊर्ध्वाधर विभाजन को बफ़र 1 के साथ खोलता है vert sb 1, फिर :diffthisटैब में सभी बफ़र्स को अलग मोड में प्रवेश करने के लिए जारी करता है।

संपादित करें

ओपी ने चरण 1 पर कुछ और स्पष्टीकरण के लिए कहा git show। उस फॉर्म के इनपुट की जरूरत है <rev>:<path>जहां <path>काम करने वाले पेड़ की जड़ के सापेक्ष होना चाहिए। उदाहरण के लिए, यदि बफर 1 में फ़ाइल का पूर्ण पथ /a/b/foo.extऐसा है bजिसमें आपका .gitफ़ोल्डर (यानी bआपके रेपो की जड़ है), git showठीक से काम करने के लिए आपको इसके साथ आमंत्रित करना होगा HEAD^:b/foo.e/a/b/foo.extया तो उपयोग करना या foo.extकाम नहीं करेगा। इसलिए मैं इस उदाहरण में git rev-parse --show-prefixगिट रूट (जो होगा b/) के सापेक्ष वर्तमान फ़ोल्डर का पथ प्राप्त करता था ।

फिर, मैंने vimफ़ाइल के नाम को जोड़ने के लिए पथ विस्तार का उपयोग किया (वह है foo.ext)। बफर 1 में जो भी फ़ाइल लोड की गई है उसका पथ लाने के लिए #1कहता vimहै, और :t"पूंछ" को निकालता है, जो /कि रास्ते में अंतिम के बाद सब कुछ है #1। कुछ मामलों में #1और #1:tसमान हैं, लेकिन यह हमेशा ऐसा नहीं होता है। उदाहरण के लिए, यदि आप दौड़ते vim b/foo.extतो बस के बजाय #1वापस लौट जाते । अधिक जानकारी के लिए देखें ।b/foo.extfoo.ext:help expand

बेशक, आप केवल पथ को मैन्युअल रूप से दर्ज कर सकते हैं, जैसे कि :tabnew | r! git show HEAD^:b/foo.ext, और यह काम करेगा। लेकिन ऊपर दिया गया संस्करण स्क्रिप्ट करने योग्य है या आप किसी मैप पर असाइन कर सकते हैं।