विम: पहले से एक दूसरे के साथ एक लाइन की जगह


112

प्रति दिन कम से कम एक बार मेरी निम्न स्थिति है:

A: This line should also replace line X
...
X: This is line should be replaced

मेरा मानना ​​है कि मैं उस कार्य को कुशलता से नहीं करता।

मैं क्या करूं:

  • लाइन A: AG पर जाएं
  • यान रेखा A: yy
  • लाइन X: XG पर जाएं
  • पेस्ट लाइन ए: पी
  • पुरानी लाइन पर जाएँ: j
  • पुरानी लाइन हटाएं: dd

इस अतिरिक्त नुकसान यह है कि लाइन एक्स डिफ़ॉल्ट रजिस्टर, जो अगर मैं एक और बात यह है कि करने के लिए ए yanking साथ प्रतिस्थापित किया जाना चाहिए और एक अतिरिक्त रजिस्टर से चिपकाने लगता है कष्टप्रद है में है है ( "Ayy , " एपी ) इस सरल कार्य भी करता है कम सक्षम।

मेरे सवाल:

  • क्या मैं पहले से लाई गई लाइन को बदलने के लिए एक अंतर्निहित विम कमांड को याद करता हूं?
  • यदि नहीं, तो मैं अपनी स्वयं की कमांड को कैसे बाँध सकता हूं जो डिफ़ॉल्ट रजिस्टर में याँक्ड लाइन को छोड़ देता है?

2
विम के संपादन मॉडल के साथ यह मेरा एकल सबसे बड़ा मुद्दा है। मुझे एक समाधान जानना अच्छा लगेगा। एक CUA संपादक कट और डिलीट के बीच अंतर करता है, इसलिए आप बस कुछ टेक्स्ट को काटते हैं, फिर आप जो चाहें उसे हटा सकते हैं और पेस्ट कर सकते हैं। विम के साथ, आपके द्वारा काटे गए पाठ को हटाने के लिए कोई भी डिलीट कर देता है। आप एक और संपादक की तुलना में कहीं अधिक कीस्ट्रोक्स का उपयोग करके समाप्त होते हैं।
मड


@Mud :moveऔर ब्लैक होल रजिस्टर के बारे में जानें ( _) (या वास्तव में, सिर्फ रजिस्टर)
se

2
@ मुझे रजिस्टरों के बारे में पूरी जानकारी है, लेकिन इसमें प्रति कट / पेस्ट ऑपरेशन में 4 कीस्ट्रोक्स जोड़े जाते हैं और अधिक पूर्वगामी की आवश्यकता होती है। जब आप बहुत अधिक संपादन कर रहे होते हैं, तो यह जल्दी जुड़ जाता है।
मड

मेमोरी के कुछ बाइट्स को बचाने के अलावा, ब्लैक होल रजिस्टर का उपयोग करने के लिए किसी अन्य रजिस्टर के विपरीत लाभ है? मेरा तर्क है कि कोई भी रजिस्टर ब्लैक होल रजिस्टर हो सकता है यदि आप उससे वापस नहीं पढ़ते हैं।
स्लीपब्लैंक

जवाबों:


91

मुझे क्या करना होगा :

  1. aG
  2. Y
  3. xG
  4. Vp

आपको सामान्य मोड छोड़ने की ज़रूरत नहीं है, लेकिन यह लाइन को यैंक करता है । आप हालांकि उपयोग कर सकते हैं V"0pजो हमेशा चरण 2 में लाई गई लाइन को लगाएगा।


11
@ डडल: हाँ, Yका पर्यायवाची हैyy
icecrime

8
चरण 1 और 2 को संयुक्त रूप से प्रयोग किया जा सकता है: ay [Eg: 20y] Vp द्वारा अनुसरण किया जाना चाहिए। आपको इसे यैंक करने के लिए एक पंक्ति में जाने की आवश्यकता नहीं है।
भाद्र

2
यदि आप V "0p के बजाय ccCTRL + r0ESC के साथ अतिरिक्त लाइनों को ओवरराइट करते हैं तो निम्नलिखित सभी लाइनों को सिर्फ (रिपीटर) के साथ बदला जा सकता है
जॉर्डन मॉरिस

Yके लिए एक पर्याय है yy, लेकिन मैं इसे करने के लिए remapping का सुझाव देते हैं y$मैच के लिए Dऔर C
mgold

नीचे जॉर्डन मॉरिस stackoverflow.com/users/970673/jordan-morris द्वारा जवाब की जाँच करें - वास्तव में आप कमांड को कई बार दोहराने की अनुमति देकर पूरी तरह से vim कमांड का उपयोग करता है।
JESii

105

Vp: लाइन का चयन करें, जो चिपका था उसे चिपकाएं


3
VPसाथ ही साथ काम करता है, जो आसान है क्योंकि आप पूरे अनुक्रम के लिए Shift को पकड़ कर रख सकते हैं।
जॉर्ज हिलियार

24
बहुत अच्छी चाल है, हालांकि यह एक (शायद) महत्वपूर्ण चेतावनी पर ध्यान देने योग्य है: यह यैंक रजिस्टर को उस लाइन की सामग्री के साथ अद्यतन करने का कारण बनता है जिसे अधिलेखित किया जा रहा है, इसलिए यह कुछ कार्यों के साथ अच्छी तरह से नहीं खेल सकता है - जैसे यदि आप ओवरराइट करना चाहते हैं कई गंतव्यों पर एक ही पंक्ति।
अंडरस्कोर_ड

8
@underscore_d, यदि आप करते हैं V"0p, तो यह अच्छी तरह से खेलता है , जो पिछले yanked रजिस्टर से चिपकाता है।
टाइमब्लाकट्टू

@timblaktu क्या आप समझा सकते हैं कि क्या V"0pकरता है? V विजुअल लाइन लाइन मोड में जाता है और p चिपकाने के लिए है। क्या हैं "और के लिए धन्यवाद 0?
theprogrammer

43

इसका अतिरिक्त नुकसान यह है कि लाइन एक्स अब डिफ़ॉल्ट रजिस्टर में है, जो कि अगर मुझे एक और लाइन मिलती है जिसे ए के साथ बदला जाना चाहिए तो यह कष्टप्रद है।

सामान्य रजिस्टरों को प्रभावित किए बिना पाठ को हटाने के लिए, आप ब्लैक होल रजिस्टर का उपयोग कर सकते हैं "_:

"_dd

10
मैं बनाने के लिए मेरी .vimrc करने के लिए कुछ मैपिंग जोड़ा dऔर ddहमेशा ब्लैक होल का उपयोग करें, और xऔर xxप्रदर्शन जो सबसे संपादकों एक "कट" फोन (हटाने और डिफ़ॉल्ट रजिस्टर करने के लिए बचाने के लिए) होगा:noremap x d noremap xx dd noremap d "_d noremap dd "_dd
IMSoP

2
मैं वीआईएम में चीजों को फिर से भरने से सावधान हूं, क्योंकि यह अन्य कंप्यूटरों पर, या आईडीआई के लिए वीआईएम-शैली प्लगइन्स में आसान नहीं हो सकता है। यदि आप वास्तव में खुदाई करते हैं तो भी VIM के डिजाइनरों को डिफ़ॉल्ट मैपिंग के साथ समस्याओं का समाधान करना पड़ता है।
जॉर्डन मॉरिस

15

उन उत्तरों पर निर्माण करना जो एक पंक्ति का उपयोग करने Vpया VPचिपकाने का सुझाव देते हैं - यैंक रजिस्टर की सामग्री को बदलने से बचने के लिए मुझे लगता है कि सबसे एर्गोनोमिक कमांड बस है:

VPY


यह सबसे सरल समाधान है जो यान कंटेंट को छोड़ देता है। बहुत धन्यवाद!
heylookltsme

14
  1. Y y
  2. j (उस पंक्ति पर जाएँ जिसे आप बदलना चाहते हैं), और फिर
  3. Vp (अपरकेस v और फिर p, यान्ड कंटेंट से बदल देगा)

बहुत बढ़िया! वास्तव में बहुत छोटा है और दृश्य मोड के साथ कई लाइनों का चयन करना आसान बनाता है। यह पेस्ट बफर को भी बरकरार रखता है। यह कष्टप्रद है जब dd उस बफर को अधिलेखित कर देता है ...
अकाटू

@ अक्ताउ यह बफर बरकरार नहीं छोड़ता है।
जॉर्डन मॉरिस

9

मैं कमांडलाइन (Ex) मोड का उपयोग करता हूं और निम्नलिखित दो कमांड करता हूं

:XmA
:Ad

यह बस लाइन एक्स को ए के नीचे ले जाता है, फिर ए को हटाता है जो लाइन अप करता है

उदाहरण के लिए

:7m3
:3d

क्या आप एक उदाहरण दे सकते हैं? जब मैं उदा 50Gm30G विम दबाता हूँ तो लाइन 50 और फिर नीचे तक जाती है और यह बात है। इसके अलावा: विज्ञापन A = 50 या A = 50G के लिए कुछ नहीं करता है
खस्ता

7
  1. पहली पंक्ति की शुरुआत में जाएं।

  2. y, $- अंत में लाइनब्रेक के बिना लाइन को कॉपी करें

  3. लक्ष्य रेखा के प्रारंभ में जाएं।

    1. V, p- सिर्फ एक लक्ष्य रेखा को बदलें

    2. c, c, Ctrlr, 0, Esc- लक्ष्य लाइन मूल झटका के साथ बदलें

  4. अगली लक्ष्य रेखा के आरंभ में जाएं।

  5. . - 4.2 पर जारी आदेश को दोहराता है।

टिप्पणियाँ:

  • 4.1 है y, $क्योंकि यदि आप करते हैं y, yया Yआप लाइनब्रेक की नकल करेंगे, और Ctrlr0वास्तव में आपके लक्ष्य रेखा के नीचे लाइनब्रेक जोड़ता है।

  • 4.2 की जगह V p, जो दोहराने के साथ काम नहीं करता है क्योंकि तकनीकी रूप से अंतिम क्रिया हटा दी जाती है, इसलिए .बस एक पंक्ति को हटा देगा।

  • अगर किसी को पता है कि EX मोड (कमांड लाइन) से 'रिप्लेस करंट लाइन को रजिस्टर से रिप्लेस' कैसे किया जाता है, तो मैं आपसे सुनना चाहता हूं (और यह जानने के लिए कि आपने दस्तावेज कहां पाया है)। एक दोहराने योग्य EX कमांड हो सकता है जो 4.2 से अधिक तेज है और / या लाइनब्रेक कैविटी नहीं है।


1
चरण ४.२ यहाँ हत्यारा है, जैसा कि आप अब ४.३ में डॉट कमांड के साथ पूरी प्रक्रिया को दोहरा सकते हैं - यही सब के बारे में है!
JESii

1
मुझे यह नहीं मिलता। 'AG' मेरे मेकर को लाइन के अंत में डालता है, इन्सर्ट मोड में प्रवेश करता है और 'G' में प्रवेश करता है। ऐसा क्या है जो मुझे नहीं मिलता है?
gustafbstrom

@gustafbstrom निष्पक्ष आलोचना - खेद है कि ए को लाइन संख्या का प्रतिनिधित्व करना था, लेकिन मैं इसे इंगित करने में विफल रहा। संपादित।
जॉर्डन मॉरिस

5

यहाँ मैं क्या करूँगा

  • लाइन A की शुरुआत करें, AG(जहाँ A स्पष्ट रूप से एक पंक्ति संख्या है)
  • कुछ रजिस्टर के लिए यैंक लाइन, उदाहरण के लिए एक (नई लाइन के बिना)। प्रकार"ay$
  • लाइन डालने के लिए ले जाएँ, XG
  • स्थानापन्न लाइन, S
  • रजिस्टर ए से डालें Ctrl-Ra

4

आप इसे विजुअल मोड के साथ उपयोग कर सकते हैं।

  • लाइन A पर जाएं: AG
  • दृश्य मोड के साथ लाइन का चयन करें: VESC
  • लाइन X पर जाएं: XG
  • लाइन के लिए विकल्प मोड दर्ज करें: S
  • आपके द्वारा कॉपी की गई लाइन पेस्ट करें: shift+ insert(या क्लिपबोर्ड से चिपकाने के लिए आपके पास जो भी मैपिंग हो)।

आह। वी और एस के बारे में पता नहीं था । हालाँकि, आपके कदम मेरे लिए काम नहीं करते क्योंकि मैं अपने OS क्लिपबोर्ड पर नहीं चढ़ता, जो कि केवल एक ही है जिसे मैं इन्सर्ट मोड में एक्सेस कर सकता हूँ। इसलिए मुझे पहले इन्सर्ट मोड छोड़ना होगा।
क्रिस्पी

3

आप भी कर सकते हैं:

Vy (in normal mode at the line you want to copy)
Vp (in normal mode at the line you want to replace)
  • रिक्त स्थान या लाइन अंत नहीं बनाता है।
  • प्रतिलिपि पाठ की शुरुआत में कर्सर रखा गया है।

एक ही चाबियों का उपयोग एक से अधिक लाइन को यैंक / पेस्ट करने के लिए किया जा सकता है।

V (in normal mode at what you want to yank)
(use jk to move the selection)
y (to yank the selection)
V (in normal mode at where you want to paste)
(use jk to move the selection)
p (to replace the selection with the yanked lines)

2

आप सामान्य मोड में इस कमांड का उपयोग कर सकते हैं:

:AmX | Xd

mआदेश के लिए है m[ove], जो, लाइन नंबर एक्स के बाद लाइन नंबर एक चाल आप के बजाय नकल लाइन ले जाते हैं, उपयोग करना चाहते हैं co[py]dआदेश के लिए है d[elete]

आप coलाइनों की एक श्रृंखला का उपयोग करके (प्रतिलिपि का उपयोग कर ) स्थानांतरित कर सकते हैं

:start,end m X

2

सिसल्ड द्वारा हाल की टिप्पणी के प्रकाश में (धन्यवाद!), मैं देख रहा हूं कि मैंने मूल मुद्दे को पूरी तरह से समझ नहीं पाया। लाइन को स्थानांतरित करना उचित नहीं है, लेकिन कॉपी करना (चूंकि लाइन yanked है।) इसलिए मैं इसे संशोधित करूंगा:

:1t20:20d_
  1. लाइन 20 के बाद पहली पंक्ति ( :tकमांड एक उपनाम है :copy) के लिए कॉपी करें ( इसे लाइन 21 पर रखेगा)

  2. हटाए गए लाइन 20 को हटाएं, हटाए गए लाइन को 'ब्लैकहोल' रजिस्टर में डालें ( _) (यानी वर्तमान यैंक बफर को प्रभावित नहीं करें)

जैसा कि हालिया टिप्पणी में उल्लेख किया गया है, यह वर्तमान कर्सर स्थिति को प्रभावित नहीं करेगा।


1
  1. : ay (जहां एक पंक्ति संख्या है। उदाहरण: 20y)। यह एक लाइन को यमकित (यमक इच्छित) करता है।
  2. वीपी

1

मुझे इसके लिए Ex कमांड का उपयोग करना आसान लगता है; पूर्व। 9 से 46 को स्थानांतरित करने के लिए:

 :46|9m.|-1d

यह कर्सर को लाइन 46 तक ले जाएगा, लाइन 9 को करंट के नीचे ले जाएगा, फिर पिछली लाइन को हटा दें (चूंकि स्थानांतरित लाइन चालू है)।

या मार्क (एस) का उपयोग करके, मार्क 'ए' का उपयोग कर:

:46ma a|9m'a|'ad

EX आदेशों की सुंदरता यह है कि आप उन्हें अपने कर्सर को जहाँ भी (सामान्य मोड में) चला सकते हैं। मैं पसंद करता हूं :1m20|.+1d(लाइन 1 से लाइन 20 तक और अगली पंक्ति को हटाएं, अर्थात, वह पाठ जो पहले 20 रेखा पर था)। हालांकि एक ही विचार!
वृद्ध

1

मुझे अक्सर Y एक पंक्ति में रखना पड़ता है और इसे कई स्थानों पर प्रतिस्थापित करना होता है, जिनमें से प्रत्येक का एक अलग मूल्य होता है (जिसका अर्थ है कि मैं एक rexx नहीं कर सकता)।

Y वांछित मूल लाइन को yank करने के लिए

और फिर हर उस लाइन पर जिसे आप बदलना चाहते हैं, VpzeroY


0

मैं "ब्लैक होल" रजिस्टर का सरल उपयोग करूंगा:

दिया हुआ:

nnoremap <Cd> "_dd

समाधान होगा:

<Cd> yy

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.