विमिफ़ के साथ परिवर्तनों को कॉपी करने का अनुशंसित तरीका क्या है?


117

फ़ाइलों की तुलना करते समय, और एक स्रोत कोड रिपॉजिटरी को अपडेट करते हुए, मैं vimdiff का उपयोग करना पसंद करता हूं। एक फ़ाइल से दूसरे में किए गए परिवर्तनों को कॉपी करने के लिए, मैं आमतौर पर इस तरह एक प्रमुख अनुक्रम का उपयोग करता हूं: -

Shift + V (select line)
k or j; { or }; Up or down arrow keys (select more lines)
y  (copy selected lines)
Ctrl + w, left/right arrow (move to other pane)
p (paste lines)

विम, कीबोर्ड शॉर्टकट्स का मास्टर होने के नाते, यह निश्चित रूप से इसी कार्य को करने का एक आसान तरीका होना चाहिए। वहाँ एक है? स्रोत-कोड परिवर्तनों को मैन्युअल रूप से अपडेट करने के लिए आप क्या उपयोग करते हैं?


2
एक सार्थक प्रश्न में "यह वह नहीं होना चाहिए जो मेरी अस्पष्ट समझ रखने के लिए धन्यवाद।" उत्तर दिया गया कुछ ऐसा है जो मुझे बहुत पहले सीखना चाहिए था।
कालेब

1
आपके प्रश्न के सर्वश्रेष्ठ उत्तर यहाँ हैं: stackoverflow.com/questions/5288875/…
erik

जवाबों:


181

do(diff प्राप्त करें) और dp(diff put) वह है जो आपको चाहिए। इस संदर्भ में अन्य सहायक सामान्य मोड कमांड की एक छोटी सूची यहां दी गई है।

]c               - advance to the next block with differences
[c               - reverse search for the previous block with differences
do (diff obtain) - bring changes from the other file to the current file
dp (diff put)    - send changes from the current file to the other file
zo               - unfold/unhide text
zc               - refold/rehide text
zr               - unfold both files completely
zm               - fold both files completely

ध्यान दें:
दोनों doऔर dpकाम करता है, तो आप दृश्य मोड में नहीं एक ब्लॉक या सामान्य मोड में एक ब्लॉक के तहत सिर्फ एक लाइन पर हैं, लेकिन। दृश्य मोड में पाठ की पंक्तियों का चयन करते समय, आपको सामान्य आदेशों का उपयोग करना चाहिए

  • :'<,'>diffget तथा
  • :'<,'>diffput

यह भी देखें :h copy-diffs

:diffupdate परिवर्तनों के लिए फ़ाइलों को फिर से स्कैन करेगा।


4
सच। मैंने पाया कि शुरू में यह काफी उलझन भरा था, क्योंकि पूरे (सन्निहित) ब्लॉकों की नकल की जाती है। समान मोड की अलग-अलग मोड के ऑटो-हाइडिंग के साथ, मैंने खुद को यह सोचते हुए पाया कि "क्या हाल ही में हुआ है?", प्रत्येक चाल को ट्रिपल-चेक करने से पहले, दोनों पैन में। कहें कि आपने फ़ाइलों में से एक पर इंडेंटेशन बदल दिया है; तब मुझे लगता है कि सब कुछ पार हो जाएगा। महीन कुशल नियंत्रण (यानी दृश्य चयन) के लिए, मैंने पाया कि पूर्ण आदेशों :[range]diffgetऔर :[range]diffputकी जरूरत है।
एलेक्स लीच

8
आप एक साथ दृश्य मोड का उपयोग कर सकते हैं diffgetऔर diffput: visual दृश्य मोड दर्ज करें और कुछ पाठ / रेखाओं को चिह्नित करें। ② फिर :diffputचयनित लाइनों को दूसरी फ़ाइल पर धकेलने के लिए या दूसरी फ़ाइल :diffgetसे चयनित लाइनें प्राप्त करने के लिए टाइप करें ।
एरिक

6
नमस्ते, क्या किसी को पता है कि सिर्फ एक लाइन के लिए "डू" (अंतर प्राप्त करना) के बराबर है? मान लीजिए कि आपके पास कोड का एक ब्लॉक (एक से अधिक लाइन) है जो अलग-अलग हैं, "इन" कोड के किसी भी लाइन पर कर्सर के साथ "करें" या तो इन कोड के नीचे की लाइन के लिए कोड के पूरे ब्लॉक के लिए अंतर प्राप्त होगा --- लेकिन मैं सिर्फ एक लाइन के लिए अंतर प्राप्त करना चाहता हूं। हर बार जब मैं नेत्रहीन करने के लिए है इस लाइन, "diffget" के बाद थोड़ा कठिन ... का चयन करें,
wiswit

12
यह ध्यान रखना महत्वपूर्ण है कि पूर्ववत आदेश केवल उस बफर में काम करेगा जिसे बदल दिया गया था, इसलिए यदि आप dpअपने दिमाग का उपयोग करते हैं और बदलते हैं, तो आपको अन्य बफर को पूर्ववत करने के लिए स्विच करने की आवश्यकता है।
रैंडम 832

1
@wiswit: Vपूरी लाइन का चयन करने के लिए, फिर doवर्तमान vim (8.0) में एक विशिष्ट लाइन को कॉपी करने के लिए काम करता है, जो भी इसके लायक है।
dannysauer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.