2012-01-18 15 views
5

मैं एक वाईएएमएल फ़ाइल के साथ काम कर रहा हूं जिसमें आईडी के रूप में एक पूर्णांक है जो हर 4-6 लाइनों में दिखाई देता है। मैं इस फ़ाइल के बीच में एक रिकॉर्ड जोड़ना चाहता हूं (पठनीयता के लिए) जो अनुक्रमिक संख्या को बरकरार रखता है।विम मैक्रो: लगातार लगातार लाइनों पर संख्या बढ़ाना

नीचे फ़ाइल प्रारूप। कोई विचार?

- id: 1 
    type: string 
    option: diff_string 
    other: alt_string // note: 'other' option does not appear for all records 

- id: 2 
    type: string 
    option: diff_string 

//new record would go here as id: 3, increasing id: # of all following records by 1 

- id: 3 
    type: string 
    option: diff_string 
    other: alt_string 

उत्तर

5

मेरा मानना ​​है कि आप प्राप्त कर सकते हैं (यहाँ: चर g:I) एक काउंटर स्थापित करने के साथ आप क्या चाहते हैं 1:

let g:I=1 

और फिर प्रत्येक पंक्ति से मेल खाता है पर एक प्रतिस्थापन पर अमल ^- id: \d\+$:

%g/^- id: \d\+$/ s/\d\+/\=g:I/|let g:I=g:I+1 

g:I के वास्तविक मूल्य के साथ \d\+ को प्रतिस्थापित करने के लिए प्रतिस्थापन \= चीज़ (:help sub-replace-expression देखें) का उपयोग करता है। सबस्टेशन के बाद, काउंटर बढ़ता है (let g:I=g:I+1)।

g/^- id: \d\+$/ के साथ आप सुनिश्चित करते हैं कि प्रतिस्थापन केवल ^- id: \d\+ से मेल खाने वाली रेखाओं पर किया जाता है।

संपादित आप इसके लिए एक नक्शा करना चाहते हैं, तो आप अपने में निम्नलिखित स्निपेट रख सकते हैं।vimrc:

nnoremap resync :let g:I=1<CR>:%g/^- id: \d\+$/ s/\d\+/\=g:I/\|let g:I=g:I+1<CR> 

जो सामान्य मोड में resync टाइप करके पुनः समन्वयन अपने आईडी की अनुमति देता है।

| से \ और <CR> के उपयोग से बचने पर ध्यान दें जहां आप एंटर दबाएंगे।

+0

यह एक और वैध तरीका है, और यह 1 से शुरू होने वाले दस्तावेज़ में प्रत्येक आईडी को फिर से शुरू कर देगा। इस कोड को अपने क्लिपबोर्ड में कॉपी करें और कोशिश करने के लिए '@ @' का उपयोग करें (यदि आप जीयूआई का उपयोग करते हैं)। – Benoit

+0

'@ @' क्या करता है? मुझे लगता है कि यह 'id: x' लाइनों को प्रिंट करता है लेकिन मुझे नहीं पता कि यह क्यों है। –

+2

Nyfenegger: ': @' एक रजिस्टर में संग्रहीत पूर्व आदेश चलाता है। '+' रजिस्टर आमतौर पर बाहरी क्लिपबोर्ड से जुड़ा होता है। देखें ': सहायता: @ '। यदि आप vimrc से उद्धरणों का प्रयास करना चाहते हैं तो यह बहुत उपयोगी है: 'yy' फिर': @ "' – Benoit

3

आदेश कर्सर लाइन + 1 से बाद के सभी आईडी बढ़ाने के लिए में:

:.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1) 

(nr2char(1) में CTRL-ए कुंजीयन की तरह है)।

तुम भी कर सकते हैं:

:.+1,$g/^- id: \d\+$/normal! 0^A 

आप ^A तो CTRL-V टाइप CTRL-ए कहाँ दर्ज करें। ध्यान दें कि मैं पहला संस्करण पसंद करता हूं: आप इसे कॉपी-पेस्ट कर सकते हैं, कोड में कोई शाब्दिक नियंत्रण चरित्र नहीं है।

विवरण:

  • .+1,$ फ़ाइल के अंत तक अगली पंक्ति से सीमा है। :help range
  • :g कमांड पैटर्न के पालन में सभी लाइनों पर काम करता है। विपरीत :v है। के लिए, CTRL-ए अगले बढ़ाने के लिए लाइन के शुरू करने के लिए जाने के लिए 0: :help :g
  • /^- id: \d\+$/ एक लाइन के शुरू में मैचों - id:, 1 या अधिक संख्याएं और उसके बाद पंक्ति के अंत (:help pattern)
  • :normal! निभाता सामान्य आदेशों नंबर।

आप एक मानचित्रण चाहते हैं:

nnoremap <F1> :.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1)<enter> 

रखो अपने vimrc में है कि, और अब सामान्य मोड में एफ 1 दबाने का आनंद लें, और कर्सर लाइन incrementing से नीचे के सभी आईडी देखते हैं।

+0

उत्कृष्ट, हालांकि मैं व्यक्तिगत रूप से वैश्विक परिवर्तन पसंद करता हूं। इस सवाल के साथ सभी उत्तरों में आपकी मदद के लिए, बेनोइट, धन्यवाद। – Lumen

1

मैं निम्नलिखित लघु और सीधा प्रतिस्थापन आदेश का उपयोग करूंगा।

:,$s/^- id: \zs\d\+/\=submatch(0)+1/ 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^