पाठ का एक ब्लॉक ले जाने के लिए तेज़ तरीका


25

यहां बताया गया है कि मैं आमतौर पर टेक्स्ट या कोड के ब्लॉक को कैसे कॉपी करता हूं:

  1. विजुअल मोड के साथ ब्लॉक का चयन करें ( V) और इसे हटा दें d; या अगर यह सिर्फ एक ही लाइन है, तो उपयोग करें dd
  2. उस जगह पर जाएं जहां मैं चाहता हूं कि पाठ हो, मैं अंतर के बारे में याद रखने के लिए बहुत बेवकूफ हूं pऔर Pइसलिए, मुझे यह अधिकार लगभग 50% समय मिलता है। (अगर मुझे यह गलत लगता है: फिर से कोशिश करें)।
  3. कभी कभी, खरोज का समायोजन की जरूरत है, तो मैं के साथ दृश्य मोड के पास जाओ Vफिर से और एक ही ब्लॉक फिर से चुनें, और उपयोग >या <कि ठीक करने के लिए।

क्या कोई आसान तरीका है? कुछ संपादकों में मैंने देखा है कि आप पाठ का एक ब्लॉक "उठा" सकते हैं, जैसा कि यह था, और इसे चारों ओर ले जाएं; यहाँ Emacs से एक उदाहरण है (लेकिन मैंने इसे अन्य संपादकों में भी देखा है):

Emacs

या शायद एक और (और भी बेहतर) तरीका है?


खरोज मुद्दे के बारे में आप के साथ चिपका कर इसे हल कर सकते ]pया [pबजाय pया P। इस तरह से आप जिस ब्लॉक को चिपकाते हैं, वह स्वतः हो जाएगा।
गोंकेलो रिबेरो

आप ड्र्यू नील बब्लिंग टेक्स्ट द्वारा स्क्रेंकास्ट देखना चाह सकते हैं, जो विम-अनइम्पायर का उपयोग करने की सलाह देता है ।
होट्सचे

जवाबों:


13

इसके लिए एक प्लगइन है: dragvisuals.vim

यह डिफ़ॉल्ट रूप से किसी भी कुंजी को बांधता नहीं है, इसलिए आपको स्वयं ऐसा करना होगा। मैं करने के लिए उन्हें मैप करने के लिए चाहते Control+ Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

यह वर्तमान चयन को डुप्लिकेट करने के लिए एक बोनस कुंजी के साथ भी आता है:

xmap <expr> D DVB_Duplicate()

अन्य उत्तरों पर इस प्लगइन के लाभ:

  • यदि आप पहली पंक्ति से आगे बढ़ने की कोशिश करते हैं तो कोई पाठ गायब नहीं होता है।
  • यदि आप अंतिम पंक्ति से नीचे जाते हैं तो यह फ़ाइल का विस्तार करेगा।
  • बाएँ / दाएँ चलना थोड़ा बेहतर काम करता है।

इसे पूरक करने के लिए एक और उपयोगी चाल है, ये कीबाइंड हैं:

xnoremap > >gv
xnoremap < <gv

>विजुअल मोड में रहते हुए आपके द्वारा उपयोग किए जाने के बाद यह अंतिम दृश्य चयन का चयन करेगा , इसलिए आप संरेखण को अधिक आसानी से समायोजित कर सकते हैं (आप तीर कुंजियों का उपयोग भी कर सकते हैं, लेकिन यह इसे एक वर्ण से स्थानांतरित करेगा, और एक नहीं shiftwidth)।


1
इसके लिए एक और प्लगइन है कि मेरे सुझाए गए प्लगइन के लेखक का वर्णन है "अपने खुद के ड्रैग्विसुअलवेसिम का एक बहुत बेहतर सुधार": github.com/zirrostig/vim-schlepp
Jay Thompson

8

चरण 3 के लिए, आप gv=इसके बजाय उपयोग कर सकते हैं ( =मतलब इंडेंट, और gv"अंतिम दृश्य चयन को फिर से चुनें")।

Emacs व्यवहार के लिए, आपके .vimrc में कुछ मैपिंग जोड़ना बहुत सरल होगा।

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

फिर आप दृश्य रेखा चयन के चारों ओर जाने के लिए ऊपर और नीचे तीर कुंजियों का उपयोग कर सकते हैं। (बेशक, आप अलग-अलग कुंजियों में मैप कर सकते हैं, साथ ही अगर आप तीर से नफरत करते हैं।)

(आप इसे सामान्य दृश्य चयनों के साथ कर सकते हैं और उन्हें बाएं और दाएं स्थानांतरित कर सकते हैं: vnoremap <left> dhPgvhohoऔर vnoremap <right> dpgvlolo।)


gvअंतिम दृश्य चयन पर जाता है, जो इस मामले में वह पैराग्राफ होगा जिसे हटा दिया गया था। मुझे किसकी याद आ रही है?
रॉबर्ट स्मिथ

4

आप लाइनों को स्थानांतरित करने के लिए कुछ कुंजियों को फिर से बना सकते हैं। उदाहरण के लिए, ऊपर और नीचे तीर यदि आप के माध्यम से चारों ओर ले जाने के लिए उपयोग किया जाता है hjkl

जैसे .vimrc पर

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m, एक लाइन को स्थानांतरित करने के लिए सामान्य आदेश

+1या -2एक रेखा को ऊपर या नीचे इंगित करने के लिए (-1 उसी स्थान पर रेखा रखता है)

gvVISUALमोड में फिर से उसी पाठ का चयन करने के लिए

यह समाधान रजिस्टरों के साथ हस्तक्षेप नहीं करता है, इसलिए कोई भी कॉपी किए गए पाठ अभी भी उपलब्ध होंगे, साथ ही साथ सुधारक को उचित इंडेंटेशन सेट करने के लिए कोड भी सुधार होगा, आदि।


यह अच्छा है, लेकिन मेरे लिए नहीं है, क्योंकि मुझे =इसका उपयोग करना पसंद नहीं है (यह अक्सर मेरे लिए बहुत अधिक असंबंधित स्वरूपण बदलता है)।
मार्टिन टूरनोइज

4

ऐसा करने का सबसे आसान तरीका यहाँ प्रलेखित है: http://vimrcfu.com/snippet/77

अपने .vimrc में निम्नलिखित डालें

vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv


यह भी देखें स्क्रीनकास्ट चलती ग्रेग Hurell द्वारा खड़ी लाइनों: # 65
Hotschke

3

इस के लिए कुछ plugins रहे हैं, लेकिन मैं पसंद टिम पोप के vim-अछूता ( GitHub ) (इंगो करकट LineJuggler समान है)।

आप अपने पाठ के ब्लॉक को नेत्रहीन रूप से चुनें ]e(ई-एक्सचेंज के लिए) ब्लॉक को नीचे की ओर ले जाने के [eलिए ( दूसरी दिशा के लिए)। .कार्रवाई को दोहराने के लिए उपयोग करें (आपके पास दोहराना है। स्थापित नहीं है)। यदि आप बहुत दूर जाते हैं तो बस पूर्ववत करें u

अब व्यक्तिगत रूप से मुझे लगता है pऔर Pऐसे सामान्य आदेश हैं कि बुरी आदतें बनाने से पहले उन्हें सीखना सबसे अच्छा होगा। फिर आप ]pउसी इंडेंट में पेस्ट करने के लिए इस्तेमाल कर सकते हैं । यदि आप >pबिना सोचे-समझे उपयोग कर रहे हैं, तो आप एक इंडक्शन स्तर को गहरा या =pपेस्ट और सुधार करने के लिए पेस्ट कर सकते हैं ।

यदि आपको याद रखने में परेशानी होती है pऔर Pतब यह आपको उन कमांड oऔर Oकमांड के संदर्भ में सोचने में मदद कर सकता है जो एक प्रकार की समरूपता है।

जैसा कि दूसरों ने नोट किया है कि आप gvएक दृश्य चयन को फिर से उपयोग करने के लिए उपयोग कर सकते हैं । हालाँकि यदि आप सिर्फ पाठ / पेस्ट करते हैं तो आप अपना दृश्य चयन खो देंगे। झल्लाहट मत करो क्योंकि हर परिवर्तन (और यान!) सेट '[और ']बदले हुए क्षेत्र के आसपास होगा । तो आप के माध्यम से इंडेंट कर सकते हैं >'](पढ़ें: अंतिम बदलाव के अंत तक सही शिफ्ट) और .इंडक्शन को दोहराने के लिए तब तक उपयोग करें जब तक कि आपके पास सही जगह पर टेक्स्ट न हो।

अधिक मदद के लिए देखें:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv

2

यदि आप उस पंक्ति संख्या को जानते हैं जिसे आप टेक्स्ट के ब्लॉक को स्थानांतरित करना चाहते हैं, तो आप :moveब्लॉक को वहां ले जाने के लिए कमांड के साथ एक सीमा या दृश्य चयन का उपयोग कर सकते हैं ।

उदाहरण के लिए, यदि मेरे पास निम्न फ़ाइल है:

1 aaa
2 bbb
3 ccc
4 ddd

और मैं सी की लाइन के बाद ए की लाइन को स्थानांतरित करना चाहता हूं, मैं कर्सर को ए की लाइन पर डाल देता हूं और दर्ज करता हूं :m3, और फिर लाइन को स्थानांतरित कर दिया जाता है।

यह +/- ऑफसेट के साथ भी काम करता है। ऊपर के उदाहरण में, :m+2पंक्ति 2 रेखाओं को नीचे ले जाने के लिए एक ही परिणाम पूरा किया जा सकता है ।

पाठ के ब्लॉक के लिए, केवल अंतर एक सीमा या चयन में जोड़ रहा है। फ़ाइल के अंत में आआ और bbb लाइनों को स्थानांतरित करने के लिए, :1,2m$($ = अंतिम पंक्ति) जैसी कमांड का उपयोग करें या नेत्रहीन रूप से लाइनों का चयन करें और :m$


1
अधिक युक्तियों के बारे में :moveभी देखने के लिए vim.wikia.com/wiki/Moving_lines_up_or_down या टिप 29 ' डुप्लीकेट या मूव लाइन्स यूज़िंग ': t 'और': m 'कमांड्स इन द बुक प्रैक्टिकल विम टू डी नील।
होट्सचे

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