मैं विम में चयनित लाइनों को कैसे क्रमित करूं?


94

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

पहली पंक्ति
दूसरी पंक्ति
तीसरी पंक्ति
चौथी पंक्ति

मैं उन्हें उल्टा करना चाहता हूं

चौथी पंक्ति
तीसरी पंक्ति
दूसरी पंक्ति
पहली पंक्ति

मैं विम में ऐसा कैसे कर सकता हूं?




1
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1 vi.stackexchange.com/a/2107/10254
8 दिसबंर को

जवाबों:


86

किसी फ़ाइल में सभी पंक्तियों को उलटने के लिए,

:g/^/m0

स्पष्टीकरण के लिए देखें

:help 12.4

जो यह भी दर्शाता है कि कैसे सिर्फ कुछ लाइनों को उल्टा करना है।


12
सटीक सहायता अनुभाग पर शानदार टिप! सारांशित करने के लिए: 1. अंतिम पंक्ति में एक मार्कर सेट करें जिसे आप रिवर्स चाहते हैं (मैं मार्कर का नाम 'a' का उपयोग कर रहा हूं ma), 2. कर्सर को ब्लॉक की पहली पंक्ति पर ले जाएं, 3. टाइप करें:'a,.g/^/m 'a
ब्रेंट फॉस्ट

68

वांछित पंक्तियों का चयन करें, हिट करें !, और परिणामस्वरूप प्रॉम्प्ट में tacएक ला के माध्यम से लाइनों को पाइप करें :'<,'>!tacman tacअधिक जानकारी के लिए देखें।


4
लाइनों का चयन करने के shift+vलिए, दृश्य लाइन मोड में प्रवेश करने के लिए उपयोग करें, फिर jचयन में लाइनों को जोड़ने के लिए।
बुद्धिमत्तापूर्ण

मैं पुष्टि कर सकता हूं कि यह विंडोज़ के साथ-साथ काम करता है gvim! अन्यथा, आपको निरपेक्ष लाइन नंबरों का उपयोग करना होगा (हो सकता है कि आप रिश्तेदार का उपयोग कर सकते हैं, लेकिन आपको सावधान रहना होगा) :g/^/m0(जो कि वास्तव में याद रखना भी कठिन है) ... तो, अनिवार्य रूप से, टैक विम के साथ होना चाहिए चाहे कोई भी प्लेटफार्म हो आप पर हैं, लेकिन यह 100% विमिस्क्रिप्ट नहीं है, लेकिन जो परवाह करता है: P
dylnmc

टीएसी पूरी तरह से देशी विम हैंडलिंग नहीं है, लेकिन, 'm'ove कमांड लाइन नंबर लेता है और यह हमेशा उचित नहीं होता है। मैं अक्सर एक सीमा के हिस्से के रूप में एक चिह्न का उपयोग करता हूं, इसलिए :.,'a!tacन्यूनतम प्रयास के साथ काम करता है।
स्टॉपोग

उपयोग करने के बाद shift+v, आप }अगले पैराग्राफ तक पहुंचने के लिए उपयोग कर सकते हैं , या ऊर्ध्वाधर स्थान खाली कर सकते हैं । इसके अलावा, man tac: concatenate and print files in reverse
निलोन

33

मैक ओएस एक्स पर, tacमौजूद नहीं है, लेकिन आप tail -rउसी प्रभाव का उपयोग कर सकते हैं :

:%!tail -r

यह दृश्य मोड के लिए भी अच्छी तरह से काम करता है:

:'<,'>!tail -r

अंश tail(1):

-R विकल्प इनपुट को रिवर्स ऑर्डर में प्रदर्शित करता है, लाइन द्वारा। इसके अतिरिक्त, यह विकल्प -b, -c और -n विकल्पों के अर्थ को बदल देता है। जब -r विकल्प निर्दिष्ट किया जाता है, तो ये विकल्प उस बाइट्स, लाइनों या 512-बाइट ब्लॉकों की संख्या को प्रदर्शित करने के लिए निर्दिष्ट करते हैं, जो बाइट्स, लाइनों या ब्लॉक के बजाय इनपुट के आरंभ या अंत से प्रदर्शित करते हैं। -R विकल्प के लिए डिफ़ॉल्ट सभी इनपुट प्रदर्शित करना है।


3
अति उत्कृष्ट! तो OS X के तहत 'tac' प्रदान करने के लिए:alias tac='tail -r'
Brent Faust

4
आप भी कर सकते हैं brew install coreutilsऔर उपयोग कर सकते हैं gtac
एंड्रयू मार्शल

1
प्रतिभा। उपयोग करने के बारे में कभी नहीं सोचा था! इस प्रकार के दृश्य लाइन हेरफेर के लिए कमांड।
चार्ली डलास

3

विजुअल मोड के साथ अधिक आरामदायक लोगों के लिए:
1. उस चयन के ऊपर लाइन नंबर को पहचानें जिसे आप उपयोग कर रहे हैं :set nu
2. Shift-Vचयन को हाइलाइट करने के लिए जिसे आप फ़्लिप करना चाहते हैं (विजुअल मोड)।
3 :g/^/m <Line number from step 1>.।

ध्यान दें कि दृश्य मोड में यह स्वचालित रूप से दिखाई देगा :'<,'>g/^/m <Line number>जब आप 3 से कमांड में टाइप करेंगे ।

यह कमांड आपके द्वारा दिए गए लाइन नंबर में एक समय में एक लाइन को स्थानांतरित करके काम करता है। जब दूसरा आइटम दिए गए लाइन नंबर में धकेल दिया जाता है, तो वह पहले डाउन को लाइन नंबर + 1 में धकेल देता है। उसके बाद तीसरा पहला और दूसरा डाउन करता है और इसी तरह जब तक कि पूरी सूची को सिंगल लाइन नंबर में धकेल नहीं दिया जाता है जिसके परिणामस्वरूप रिवर्स ऑर्डर की गई सूची।


4
आप '<मैन्युअल रूप से लाइन नंबर दर्ज करने के बजाय उपयोग कर सकते हैं । बस एक पंक्ति पहले चयन शुरू करें और निष्पादित करें :'<,'>g/^/m'<
पलेक

3

:Rev[erse]आपके लिए एक कमांड और वैकल्पिक मैपिंग vimrc, ताकि आपको इस रेसिपी के गैर-स्पष्ट चरणों को याद और प्रदर्शन न करना पड़े:

" Reverse the lines of the whole file or a visually highlighted block.
    " :Rev is a shorter prefix you can use.
    " Adapted from http://tech.groups.yahoo.com/group/vim/message/34305
command! -nargs=0 -bar -range=% Reverse
    \       let save_mark_t = getpos("'t")
    \<bar>      <line2>kt
    \<bar>      exe "<line1>,<line2>g/^/m't"
    \<bar>  call setpos("'t", save_mark_t)

nmap <Leader>r :Reverse<CR>
xmap <Leader>r :Reverse<CR>

( :xmapदृश्य के :help mapmode-xलिए मानचित्र लेकिन मोड का चयन न करें, जैसा कि मुद्रण योग्य वर्णों को मैप करने के लिए सलाह देता है।)

(इसके आधार पर: http://tech.groups.yahoo.com/group/vim/message/34305 )


यह स्वीकृत उत्तर IMO होना चाहिए। सबसे आम तौर पर उपयोगी और मुझे याद करने की ज़रूरत नहीं है :'<,'>g/^/m'<:)
एलियट

1
@ एलियट, धन्यवाद! :) (मैंने 'बोनस सामग्री' का एक सा जोड़ा;))
आरोन थोमा

मैं इस मामले में चयन प्रारंभ -1 कैसे कह सकता हूं? क्योंकि इस बिंदु पर चाल शुरू होती है।
सर्जियोअराजू

@SergioAraujo: कुछ ऐसा है :-1,+1Revजो आप ढूंढ रहे हैं? पता है कि आप नेत्रहीन उस सीमा का चयन कर सकते हैं जिसे आप रिवर्स करना चाहते हैं, जैसे V7j:Rev:। यदि यह आपके प्रश्न का उत्तर नहीं देता है, तो मैं इसे समझ नहीं पाया हूं, इसलिए आपको इसे मेरे लिए विस्तृत या फिर से लिखना होगा।
हारून थोमा

1

मान लीजिए कि आप पंक्ति 3 पर हैं, इसलिए हमारे पास 3 से 6. की सीमा है।

:3,6g/^/m2

1
आप वर्तमान लाइन की संख्या को छोड़ सकते हैं: अपनी सीमा की पहली पंक्ति पर कर्सर के साथ, आप को छोटा कर सकते हैं :,6g/^/m2; या जब सीमा की अंतिम पंक्ति पर :3,g/^/m2:; और :3,6g/^/m2फ़ाइल में कहीं से भी काम करता है।
एरोन थोमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.