2009-02-28 11 views
80

में वैरिएबल नाम बदलना मैं विम के माध्यम से बहुत सारे सी/पर्ल कोड को पढ़ने की कोशिश कर रहा हूं जिसमें कई एकल अक्षर परिवर्तनीय नाम हैं।विम

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

मुझे लगता है कि
1) क्योंकि एक ही एकल अक्षर नाम अलग scoping ब्लॉक में विभिन्न प्रयोजनों के हो सकता है regexes काम करेगा न
2) पत्र एक और बड़ा वर नाम का भाग सकता है, या एक स्ट्रिंग में या का एक ही संयोजन टिप्पणी .. उन

किसी भी ज्ञात समाधान को संशोधित नहीं करना चाहते हैं ??

उत्तर

160

निम्न चर का नाम बदलने का तरीका है जो वर्तमान दायरे {} में परिभाषित किया गया है।

अपने कर्सर को चर उपयोग के लिए ले जाएं। gd दबाएं। जिसका अर्थ है - कर्सर को परिभाषा में ले जाएं। अब [{ दबाएं - यह आपको दायरे में शुरू कर देगा। V दबाएं - विजुअल लाइन चयन चालू कर देगा। % दबाएं - विपरीत } पर कूद जाएगा इस प्रकार पूरे दायरे का चयन करेगा। :s/ दबाएं - विकल्प कमांड की शुरुआत करें। <C-R>/ - परिवर्तनीय नाम से मेल खाने वाले पैटर्न को सम्मिलित करेगा (वह नाम जो आप gd दबाकर पहले थे)। /newname/gc<CR> - प्रत्येक मैच पर पुष्टि के साथ खोज शुरू करेगा और प्रतिस्थापित करेगा।

अब आपको मैक्रोज़ रिकॉर्ड करना होगा या इससे भी बेहतर - एक कुंजी मैप करें।

" For local replace 
nnoremap gr gd[{V%::s/<C-R>///gc<left><left><left> 

" For global replace 
nnoremap gR gD:%s/<C-R>///gc<left><left><left> 

अपने .vimrc को यह रखो या सिर्फ निष्पादित करें:

यहाँ अंतिम मैपिंग कर रहे हैं। स्थानीय चर पर gr दबाकर :s कमांड पर आपको new_variable_name दर्ज करना होगा और दर्ज करें।

+30

+1 मुझे पहले जाना चाहिए था। धन्यवाद –

+0

वास्तव में उपयोगी, विशेष रूप से +1 क्योंकि इसे आसानी से अन्य भाषाओं में "विस्तारित" किया जा सकता है। –

+6

नोट: gd macvim में जावास्क्रिप्ट मोड में परिभाषा के तत्काल दायरे में चर का पता लगाने के लिए काम नहीं करता है। यह फ़ाइल में कुछ फ़ंक्शन में वेरिएबल नाम के पहले उपयोग में ले जाता है :( यदि आप कुछ दायरे में हैं और उस दायरे को चुनना चाहते हैं, तो "va {" - "विज़ुअल का चयन करें {" - रास्ता है जाने के लिए मुझे लगता है। – Srikumar

2

आप वैश्विक खोज में 'सी' संशोधक का उपयोग कर सकते हैं और प्रतिस्थापित कर सकते हैं जो आपको प्रत्येक प्रतिस्थापन के लिए पुष्टि के लिए पूछेगा। इसमें अधिक समय लग जाएगा, लेकिन यह एक गैर humongous कोड फ़ाइल के लिए काम कर सकते हैं:

%s/\$var/\$foo/gc 

सी की पुष्टि के लिए खड़ा है।

+0

मैं अनदेखा-मामले के लिए खड़ा हूं। आप सी चाहते हैं, हर परिवर्तन की पुष्टि करें। –

+0

यह सुनिश्चित नहीं है कि आपको $ foo से बचने की आवश्यकता है ... –

+0

ओह .. इसके बारे में खेद है .. उत्तर – Adnan

8

AFAIK, वीआईएम में कोई वास्तविक रिफैक्टरिंग समर्थन नहीं है। एक रिफैक्टर के इरादे से नाम बदलते समय मैं आमतौर पर निम्नलिखित सावधानी बरतता हूं।

  1. मेरे उपयोग अंकों को बदलने के दायरे को सीमित करें।
  2. रेगेक्स में प्रवेश करते समय, \ < और > के साथ नाम ब्रैकेट करें। यह इसे एक पूरे शब्द से मेल खाता है जो गलत नामों के प्रकार को कम कर देगा।
  3. खराब प्रतिस्थापन
  4. को बदलने के लिए एक मल्टीलाइन प्रतिस्थापन न करें यदि कोड एक छोटे से बदलाव के अलावा कुछ भी है तो सावधानी से कोड को देखें।

मेरे अंत परिवर्तन इस

:'a,'bs/\<foo\>/bar 

मैं वहाँ विम के लिए एक रिफैक्टरिंग उपकरण नहीं किया जा रहा लेकिन मैं इसे नहीं देखा है के बारे में गलत होने के लिए प्यार होता है की तरह कुछ लग रहा है।

+0

पर्ल में आप खोज पैटर्न में टाइप भी जोड़ सकते हैं। यानी स्केलर्स के लिए $, एरे के लिए @, हैश के लिए% –

+0

@ नाथन: दुर्भाग्य से, यह पर्ल (5.X) में थोड़ा और मुश्किल है, क्योंकि सरणी के सिगिल और उपयोग के साथ हैश बदलते हैं:% हैश -> पूरे हैश, $ हैश {कुंजी} -> एकल मान, @ हश {qw/ab /} हैश स्लाइस। 512 से अधिक नई वीम चाल सीखने के लिए – user55400

0

सी में, आप सीस्कोप का उपयोग करके कुछ प्रगति करने में सक्षम हो सकते हैं। यह वाक्यविन्यास को समझने का प्रयास करता है, इसलिए यह जानने का मौका होगा कि पत्र एक चर था।

0

यदि यह एकाधिक फ़ाइलों में है, तो आप sed को देखने पर विचार कर सकते हैं। प्रतिस्थापन के लिए अपनी फ़ाइलों और xargs प्लस sed को पकड़ने के लिए ढूंढें का उपयोग करें। मान लें कि आप * .c से मेल खाने वाली सभी फ़ाइलों में a_better_name के साथ प्रतिस्थापित करना चाहते हैं, आप

ढूंढ सकते हैं। -नाम "*। सी" | xargs sed -i -e's/a/a_better_name/g '

ध्यान रखें कि यह सभी घटनाओं को प्रतिस्थापित करेगा, ताकि आप अधिक मजबूत रेगेक्स चाहें।

7

इस कर्सर के तहत हो जाता है :call Rnvar()

expand("<cword>") के साथ अपने .vimrc

" Function to rename the variable under the cursor 
function! Rnvar() 
    let word_to_replace = expand("<cword>") 
    let replacement = input("new name: ") 
    execute '%s/\(\W\)' . word_to_replace . '\(\W\)/\1' . replacement . '\2/gc' 
endfunction 

यह कॉल में डाल शब्द। खोज स्ट्रिंग फ़ाइल-स्कोप के लिए % का उपयोग करती है, और \(\W\) पैटर्न प्रतिस्थापित करने के लिए शब्द की सीमा पर गैर-शब्द वर्णों की खोज करते हैं, और उन्हें \1 और \2 चर में सहेजते हैं ताकि प्रतिस्थापन पैटर्न में फिर से डाला जा सके।