मैं विम में दो लाइनें कैसे स्वैप करूं?


94

मेरे पास यह है:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

और मैं इसे प्राप्त करना चाहता हूं:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

क्या कीबोर्ड शॉर्टकट का उपयोग करके त्वरित तरीके से ऐसा करने का कोई तरीका है?


यदि आप विम से परिचित नहीं हैं, तो आप एक अलग संपादक का उपयोग करने पर विचार कर सकते हैं। उस Git के लिए संपादक केवल का उपयोग कर या तो कॉन्फ़िगर कर सकते हैं git config --global core.editor <whatever>शामिल करके एक बार (Git सहित) पर या कई बातों के लिए, export EDITOR=<whatever>अपने में .bashrc
स्वेन मार्नाच

जवाबों:


160

वर्तमान पंक्ति को अगले एक के साथ स्वैप करने के लिए, ddpकमांड मोड में रहते हुए टाइप करें।

  • dd - डिलीट लाइन (वास्तव में अन्य संपादकों में कटौती कहा जाता है) और इसे रजिस्टर में सहेजें
  • पी - रजिस्टर से पेस्ट लाइन

3
कर्सर को पहली पंक्ति पर ले जाएं, फिर टाइप करें ddp। यदि आप अभी तक कमांड मोड में नहीं हैं, तो Escकमांड मोड में जाने के लिए हिट करें।
स्वेन मार्नाच

32
dd"रजिस्टर" में कॉपी करने के बाद करंट लाइन को हटाता है। pप्रतियां ("डालता है") वर्तमान लाइन के बाद आपके बफर में रजिस्टर की सामग्री । इसी तरह, आप दो वर्णों के साथ स्वैप कर सकते हैं xp, या दो शब्दों के साथ dwwP
कीथ थॉम्पसन

@KeithThompson दुर्भाग्य से, दो शब्दों को स्वैप करने के लिए उतना आसान नहीं है।
सीएस

@ सीसी क्या आप इस बात का जिक्र कर रहे हैं कि dwwPयदि दो शब्द एक पंक्ति के अंत में हैं तो उसी तरह काम नहीं करते हैं? (और निम्नलिखित पंक्ति पर पहले शब्द के साथ एक पंक्ति में अंतिम शब्द को स्वैप करना और भी पेचीदा है।)
कीथ थॉम्पसन

1
@KeithThompson हाँ, हालाँकि मुझे अपनी टिप्पणी करने के बाद थोड़े बुरा लगा क्योंकि यह एक शाब्दिक मामला है;)
CS

52

ddवर्तमान लाइन को हटाता है, तो आप हटाए गए लाइन का उपयोग करके पेस्ट कर सकते हैं p। उपयोग करते हुए एक और तरीका है m। साथ मेंmआप के लाइनों के चारों ओर ले जा सकते हैं

:m 1 लाइन 1 के बाद वर्तमान लाइन को स्थानांतरित करेगा

:m 0 वर्तमान लाइन को ऊपर ले जाएगा

:m $ वर्तमान रेखा को नीचे की ओर ले जाएगा

अपने उदाहरण में, कर्सर को पहली पंक्ति में रखें और टाइप करें :m $

अधिक जानकारी: http://vim.wikia.com/wiki/Moving_lines_up_or_down


1
गैर विम "नेटिव्स" के स्पष्टीकरण के लिए धन्यवाद :-)
ब्रूनो बीरी

1
यह वह उत्तर है जो मैं अपने ज्ञान के विस्तार के लिए भी देख रहा था।
पेलेमेलो खेथो

धन्यवाद! यह वह उत्तर है जिसकी मुझे तलाश है। दृश्य मोड का उपयोग करके एक ही समय में कई लाइनों को स्वाइप करने पर यह और भी आसान हो सकता है।
करीम जिरौदी

8

तथ्य यह है कि प्रश्न काफी पुरानी है और चिह्नित के रूप में जवाब है के बावजूद, मैं कह रही है कि आप सामान्य मोड आदेश, जिसके द्वारा प्रदान किया गया उपयोग कर सकते हैं द्वारा जवाब का विस्तार करना चाहते हैं स्वेन Marnach साथ nnoremapइसलिए की तरह:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

यह आपको अपनी फ़ाइल के भीतर Ctrl+ Upऔर Ctrl+ के साथ लाइनों को स्थानांतरित करने की अनुमति देगा Down। हालाँकि यह @"रजिस्टर को अधिलेखित कर देगा , जो आपके पिछले कॉपी किए गए स्ट्रिंग / शब्द / पत्र / आदि को संग्रहीत करता है। तो "(reg) को जोड़ने से पहले ddऔर pआदेश हम इसे ठीक कर सकते हैं:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

यहां हम रजिस्टर "aमें अपनी लाइन को स्टोर करने के लिए डिलीट और पेस्ट कमांड से पहले जोड़ते हैं @a, इसलिए आपका डिफ़ॉल्ट कॉपी रजिस्टर ओवरराइट नहीं किया जाएगा। हालांकि यह @aरजिस्टर की सामग्री को ओवरराइट कर सकता है (जो जानता है, लेकिन आप इसे अपने उपयोग-मामले में किसी महत्वपूर्ण चीज के लिए उपयोग कर सकते हैं, लेकिन यह चरण बिट पागल है, आप इसे छोड़ सकते हैं यदि आप चाहते हैं), तो इसे भी ठीक करें:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

( <silent>नीचे संदेश-पंक्ति में हमारी आज्ञाओं को प्रतिध्वनित करने से रोकने की आवश्यकता है।)

अब हमारे पास दो मैपिंग हैं जो हमें कीबोर्ड शॉर्टकट के साथ फाइल के भीतर लाइनों को स्थानांतरित करने की अनुमति देते हैं। आप बटन को फिर से परिभाषित कर सकते हैं, मैं Alt+ j/ का उपयोग करता हूं k, जो कि <A-j>और <A-k>उन आदेशों के लिए होगा । हालांकि सभी टर्मिनल एमुलेटर Alt कुंजी मैपिंग AFAIK का समर्थन नहीं करते हैं।


2

उदाहरण:

  1. one
> 2. two

के साथ :m-2, स्विच (वर्तमान लाइन - 2)

> 2. two
  1. one

:m+1स्विच के साथ (वर्तमान लाइन + 1)

  1. one
> 2. two

आप चाहें तो इसे मैप कर सकते हैं।



यह डिफ़ॉल्ट उत्तर की तुलना में बेहतर उत्तर है
एलेक्स बिन झाओ

0

विम विकिया पेज में प्रस्तावित मैपिंग वास्तव में कुंजी संयोजनों को मैप करने का सबसे अच्छा तरीका है जो इस सुविधा को लागू करने के तरीके को प्रस्तुत करता है।

इसमें चाल के बाद एक इंडेंटेशन एक्शन शामिल है, जो कि बहुत अच्छा है (यह डबल बराबर है == संकेत है, यदि आप ऐसा नहीं चाहते हैं)।

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

nnoremap <A-j> :m .+1<CR>==
nnoremap <A-k> :m .-2<CR>==
inoremap <A-j> <Esc>:m .+1<CR>==gi
inoremap <A-k> <Esc>:m .-2<CR>==gi
vnoremap <A-j> :m '>+1<CR>gv=gv
vnoremap <A-k> :m '<-2<CR>gv=gv

मैं व्यक्तिगत रूप से उन्हें मैप किया <D-J>और <D-K>मेरी मैक पर, के बजाय <A-जो करने के लिए नक्शे Altकुंजी। इस तरह मैं Cmd+ Shift+ j/ का उपयोग करता हूं k, जो मेरी उंगलियों के लिए अधिक स्वाभाविक लगता है।

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