विम में परावर्तन


98

बेशक यह तथ्य कि आप आईडीई पर रिफ्लेक्टर कर सकते हैं, बहुतों के लिए अनमोल है, मैं शायद ही कभी ऐसा करता हूं जब मैं कोडिंग करता हूं, लेकिन मैं किसी और के स्रोत को संपादित करते समय इसे करने की कोशिश कर सकता हूं। आप विम में कई फ़ाइलों में इस तरह के एक तुच्छ कार्य को कैसे पूरा करते हैं?

मुझे यह प्लगइन रूबी को पुनः प्राप्त करने के लिए मिला , लेकिन "किसी भी" भाषा के बारे में कैसे?


2
रिफैक्टरिंग बहुत भाषा-विशिष्ट है। आपको अपनी रुचि के प्रत्येक भाषा के लिए विशिष्ट ऐड-ऑन देखने की आवश्यकता है। आप संभवतः कुछ के लिए ऐड-ऑन ढूंढ सकते हैं और दूसरों के लिए नहीं। यदि कोई ऐसा है जो आप चाहते हैं और नहीं पा सकते हैं, तो यदि आप महत्वाकांक्षी महसूस कर रहे हैं, तो आप एक प्रारंभिक बिंदु के रूप में एक और समान भाषा के लिए मौजूदा ऐड-ऑन का उपयोग करके, एक लिखने की कोशिश कर सकते हैं।
स्टीव जोर्गेनसन

2
VIM को सिंगल फाइल्स को एडिट करने के लिए बनाया गया है, और शायद डायरेक्ट्री के तहत फाइल - प्रोजेक्ट्स नहीं । कई IDE- समर्थित रिफ्लेक्टरिंग पूरे प्रोजेक्ट में फ़ाइलों को प्रभावित करेंगे (जैसे एक वर्ग का नाम बदलना)। मुझे लगता है कि यह (जी) VI (m) जैसे संपादक के साथ यह "सही" होना मुश्किल होगा, जहां मुझे लगता है कि एक कंपनी या एक बड़ी परियोजना को इसे लेना होगा। उन्हें मूल रूप से सरल स्ट्रिंग प्रतिस्थापन करने से बचने के लिए प्रत्येक भाषा को पार्स करना होगा और त्रुटियों के लिए प्रवृत्त हो जाना होगा (ctags इसमें से कुछ देता है ), साथ ही संबंधित प्रोजेक्ट प्रकार (यह जानने के लिए कि कौन सी फ़ाइलों को संपादित करना है)।
मेरलिन मॉर्गन-ग्राहम

1
टिप्पणियों के लिए धन्यवाद, मुझे लगता है कि यह वह जगह है जहां चीजें मुश्किल होने लगती हैं और वीआईएम को एक आईडीई में मोड़ने की कोशिश करना ऐसा नहीं है जैसे कई भाषाओं को संपादित करने के लिए केवल एक कार्यक्रम का उपयोग करना। मैं वास्तव में IDE पर उपलब्ध कुछ "उन्नत" सुविधाओं के कारण VIM को छोड़ना नहीं चाहता हूं।
हेल्मुट ग्रान्डा

@ मेरलिनमर्गन-ग्राहम - कुछ लोग केवल कुछ (बड़ी, जो हो सकती हैं) फाइलों में अपना कोड रखते हैं। इस समस्या से पूरी तरह से बचता है।
रूक

7
@ एल्डिगास: यह समस्या के आसपास काम करेगा। लेकिन यह कुछ भाषाओं (जैसे जावा) के लिए अनुशंसित प्रथाओं के खिलाफ है। मूल रूप से उपकरण की जरूरतों को पूरा करने के लिए कोड झुकने, जब यह वास्तव में चारों ओर का दूसरा तरीका होना चाहिए।
मेरलिन मॉर्गन-ग्राहम

जवाबों:


76

मैं सहमत हूं कि 'विम एक आईडीई' प्रतिमान नहीं है। लेकिन ऐसे समय होते हैं जब कोई आईडीई नहीं होता है। यहाँ उन स्थितियों में मेरा क्या उपयोग है:

: grep,: vimgrep,: Ag,: Ggrep

नियमित प्रतिस्थापन के साथ जो करना अधिक होता है, उसका आमतौर पर उपयोग : मेरे प्रोजेक्ट ट्री पर grep और फिर रिफ्लेक्टर करने के लिए एक मैक्रो रिकॉर्ड करें -: g और: कोई ब्रेनर नहीं हैं। आमतौर पर यह मुझे बहुत कम प्रयासों के साथ बड़ी संख्या में फ़ाइलों को जल्दी से संशोधित करने देता है। ईमानदारी से, मैं इस पद्धति का उपयोग किसी भी अन्य की तुलना में अधिक करता हूं।

आपके वर्कफ़्लो के आधार पर अंतर्निहित कमांड धीमी / असुविधाजनक हो सकती हैं। यदि आप git का उपयोग करते हैं, तो आप उत्कृष्ट भगोड़े प्लगइन का उपयोग करना चाहते हैं और इसकी :Ggrepकमांड केवल git में जाँच की गई फ़ाइलों को खोजते हैं। मुझे इसकी तेजी के लिए सिल्वर सर्चर भी पसंद है ।

: अर्गडो,: कॉडो, और: बफ़डो

: cdo और : argdo फाइलों के सेट पर vim कमांड को निष्पादित करने के लिए आसान है।

कमांड लाइन

जब :vimgrepमैं उन फ़ाइलों की सूची को निर्धारित करना कठिन होता हूं, जिनके लिए मुझे कमांड लाइन grep का सहारा लेना पड़ता है / तो उन फ़ाइलों की सूची को अधिक बारीकी से जानने के लिए कमांड की जरूरत होती है, जिन्हें मुझे रिफ्लेक्टर करने की आवश्यकता है। सूची को एक टेक्स्ट फ़ाइल में सहेजें और उपयोग करें :eऔर मैक्रो रिकॉर्डिंग का एक मैशअप मुझे जो बदलाव करने की आवश्यकता है।

मुझे लगता है कि कम जंग खाए हुए मैं अपने मैक्रो रिकॉर्डिंग कौशल को अधिक उपयोगी रखता हूं, जो कि मैं रीमेकिंग के लिए विम ढूंढता हूं: रजिस्टरों से आरामदायक बचत / पुनर्स्थापना, रजिस्टर काउंटर वेरिएबल को बढ़ाना / बढ़ाना, बाद में उपयोग करने के लिए फाइल करने के लिए मैक्रो रिकॉर्डिंग की सफाई / बचत करना आदि।


अपडेट करें

मेरे द्वारा वर्णित विधियों के लिए इस अधिक वीडियोकास्ट को लिखने के बाद से vimcasts.org पर प्रकाशित किया गया है (मैं आपको सभी Vimcasts देखने के लिए प्रोत्साहित करता हूं! )। इन लोगों को देखने के लिए:

विमगल्फ भी अभ्यास करने का एक शानदार तरीका है।

भाषा सर्वर प्रोटोकॉल सर्वरों की सर्वव्यापकता के बाद से मैंने यह उत्तर लिखा है कि विम (और अन्य संपादकों) के लिए कुछ रीफैक्टरिंग क्षमता भी लाई है। IMO वे एक उद्देश्य-निर्मित IDE (मैं उनका उपयोग करते हैं, और coc और ALE को पसंद करते हैं) में आपके द्वारा देखी जाने वाली क्षमताओं को प्रतिबिंबित करने की क्षमता को बराबर करने से एक लंबा रास्ता तय करता है। अधिक जानकारी के लिए इस प्रश्न पर अन्य उत्तर देखें!


12
Refactoring पैटर्न मिलान की तुलना में अधिक है, यही कारण है कि IDE को इसे सुरक्षित तरीके से स्वचालित करने की आवश्यकता है। जाहिर है, आप इसे मैन्युअल रूप से कर सकते हैं, लेकिन उपलब्ध विकल्पों पर विचार करते हुए, और यह कि अधिकांश बार इसे मैन्युअल रूप से करना सुरक्षित है, तो आप किसी अन्य विकल्प पर भी विचार क्यों करेंगे?
कटेबरो ओकाम्पो सेप

1
@CutbertoOcampo मैं कुछ हद तक आपके साथ सहमत हूं: एक परियोजना (संरचना, भाषा (एस), स्टाफ कौशल और संसाधनों के असंख्य पहलुओं पर निर्भर करता है, कुछ नाम करने के लिए), आपकी समस्या के लिए एक महान रीफ़ैक्टरिंग उपकरण हो सकता है। मेरा जवाब उन स्थितियों पर लागू होता है जब यह सच नहीं है, और आप विम में समस्या से निपटना चाहते हैं।
dsummersl

2
यह ठीक है, मैं समझता हूं कि लोग अपने लंबे समय से पसंदीदा उपकरणों का उपयोग करके अधिक सहज महसूस कर सकते हैं, और यह भी है कि कुछ ऐसे हैक भी हैं जो वास्तव में अच्छा प्रदर्शन कर सकते हैं, शायद किसी भी आईडीई से बेहतर है, लेकिन एक आउट-ऑफ के लिए -बॉक्स समाधान मैं कहूंगा कि एक वास्तविक आईडीई अधिकांश उपयोगकर्ताओं के लिए बेहतर प्रदर्शन करेगा। मैं 80-20% तरह की स्थिति पर सोच रहा हूँ (और भी अधिक, आईडीई के पक्ष में संतुलन के साथ)।
कटिबर्तो ओकांपो

1
व्यावहारिक रूप से हर भाषा के लिए एक विचारधारा होती है। Vim या regex के साथ रीफैक्टरिंग करने की कोशिश करना बिल्कुल पागलपन सा लगता है। आप भी क्यों कोशिश करेंगे?
रोल करता है

1
@ नहीं-अपनी-विचारधारा या जो भी cfg आप केवल साथ रह सकते हैं और एक अच्छी छाप छोड़ सकते हैं ("सिर्फ छाप" के लिए नहीं बल्कि प्रतिष्ठा और भविष्य की स्थिति के लिए) के साथ एक शक्तिशाली सहकर्मी की इन-नीड मशीन को हथियाने के लिए पर्याप्त है।
खूनी

23

भाषा सर्वर प्रोटोकॉल (एलएसपी)

भाषा सर्वर प्रोटोकॉल में किसी प्रोजेक्ट में प्रतीकों के स्मार्ट नाम बदलने की सुविधा है :

https://microsoft.github.io//language-server-protocol/specifications/specification-3-14/#textDocument_rename

उदाहरण के लिए भाषा सर्वर निम्नलिखित इसका समर्थन करता है:

आप https://langserver.org/ के तहत अधिक भाषा सर्वर पा सकते हैं ।

शक्ति

एक विम एडिटर क्लाइंट को विम के भीतर उपयोग करना आवश्यक है। निम्नलिखित विकल्प मौजूद हैं:

  1. LanguageClient-neovim (जंग की आवश्यकता है) मैपिंग का सुझाव देता है:

    nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
  2. coc.nvim ( node.js की आवश्यकता है) मैपिंग का सुझाव देता है:

    " Remap for rename current word
    nmap <leader>rn <Plug>(coc-rename)
    
  3. अले है

    nnoremap <silent> <Plug>(ale_rename) :ALERename<Return>
    

    एएल किसी भी कीबाइंडिंग को परिभाषित नहीं करता है। यह उपयोगकर्ता द्वारा किया जाना है।

  4. vim-lsp निम्नलिखित कमांड प्रदान करता है

    :LspRename
    

    अले के समान कोई मानचित्रण नहीं सुझाया गया है। हालाँकि, निश्चित रूप से आप निम्न में से किसी एक को परिभाषित कर सकते हैं

    nmap <leader>r <plug>(lsp-rename)
    

    ( <leader>rआपकी पसंद से प्रतिस्थापित किया जाना है; मुझे नहीं पता कि अधिकांश प्लग इन किस पर सहमत हैं)

  5. vim-lsc में एक डिफ़ॉल्ट मैपिंग है:

    'Rename': 'gR'
    

YouCompleteMe भी देखें जो एलएसपी की सुविधा प्रदान करता है।

Neovim

13.11.2019 से नियोविम के पास एलएसपी के लिए प्रारंभिक बिलिन समर्थन है

एलएसपी के सामान्य विन्यास के लिए देखें https://github.com/neovim/nvim-lsp

हालाँकि, मैं यह नहीं पता लगा सका कि स्मार्ट नामकरण कैसे काम करता है। अगर किसी को यह पता है, तो कृपया इस अनुभाग को अपडेट करें।

अन्य Refactorings

मुझे नहीं पता कि एलएसपी प्रोटोकॉल के लिए और अधिक जटिल रिफ्लेक्टरिंग का समर्थन करने की योजना है, जैसे कि वर्ग संरचना को बदलना, विधियों / कार्यों के मापदंडों को जोड़ना या किसी अलग वर्ग में विधि को स्थानांतरित करना। Refactorings की सूची के लिए https://refactoring.com/catalog/ देखें


दुर्भाग्य से, एलएसपी में रिफैक्टिंग के लिए समर्थन वर्तमान में कला की स्थिति की तुलना में बहुत कमजोर है। github.com/Microsoft/language-server-protocol/issues/61
मिकेल

AFAIK है कि coc-renameकेवल मौजूदा बफर पर काम करने के लिए नाम बदल रहा है । इसने परियोजना में वैश्विक रूप से निर्यात किए गए नाम के उपयोग को अद्यतन नहीं किया (फाइलों के पार)।
ओलिगोफ़्रेन

15

अजगर

के लिए अजगर निम्न प्लग-इन प्रदान vim के लिए 'स्मार्ट' का नाम बदलने क्षमताओं भाषा:


13

सी-परिवार

  1. प्लगइन का प्रयास करें Clighter लिए रीनेम- लिए । यह क्लैंग पर आधारित है, लेकिन सीमाएं हैं और प्लगइन को पदावनत के रूप में चिह्नित किया गया है।

    क्लिटर द्वारा सुझाए गए मानचित्रण है

     nmap <silent> <Leader>r :call clighter#Rename()<CR>
    

    ध्यान दें, उत्तराधिकारी प्लगइन clighter8 ने प्रतिबद्ध 24927db42 में नाम बदलने की कार्यक्षमता को हटा दिया है ।

  2. यदि आप neovim का उपयोग करते हैं, तो आप प्लगइन क्लैंप पर एक नज़र डाल सकते हैं । यह सुझाव देता है

     nmap <silent> <Leader>r :call ClampRename()<CR>
    

5

मैंने इस प्लगइन को जेनेरिक रीफैक्टरिंग के लिए लिखा है। इसमें अभी भी कई सुधारों की आवश्यकता है। भविष्य में कभी-कभी मैं C & C ++ रिफ्लेक्टरिंग के लिए क्लैंग के पक्ष में ctags छोड़ने की कोशिश करूंगा।


4

शायद सबसे सुरुचिपूर्ण समाधान नहीं है, लेकिन मुझे यह बहुत आसान लगा: मैं वीसीएल और एक्लिप्स को जोड़ने के लिए ईसीएलआईएम का उपयोग करता हूं । बेशक मेरे सभी स्रोत कोड का संपादन वीआईएम में किया जाता है, लेकिन जब रिफ्लेक्टर का समय होता है, तो कोई इस मामले में ग्रहण की बेहतर क्षमताओं का लाभ उठा सकता है।

कोशिश करो।


3

प्लगिन फैक्टर

एक और vim प्लगइन बुलाया पुनर्रचना के लिए समर्पित है factorus जिस पर उपलब्ध है GitHub

वर्तमान में (2017-12), यह भाषाओं का समर्थन करता है

  • सी,
  • जावा, और
  • अजगर।

3

प्लगइन YouCompleteMe ( YCM ) (20k github पर सितारे)

http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand

:h RefactorRename-new-name

समर्थित फ़ाइल प्रकारों में, यह कमांड कर्सर के नीचे पहचानकर्ता का सिमेंटिक नाम बदलने का प्रयास करता है। इसमें पहचानकर्ता, या किसी अन्य भाषा-उपयुक्त कार्रवाई के नाम, घोषणाएं और परिभाषाएं शामिल हैं। विशिष्ट व्यवहार उपयोग में सिमेंटिक इंजन द्वारा परिभाषित किया गया है।

के समान FixItइस आदेश के , यह आदेश आपकी स्रोत फ़ाइलों पर स्वचालित संशोधन लागू करता है। नाम संचालन में कई फ़ाइलों में परिवर्तन शामिल हो सकते हैं, जो उस समय विम बफ़र्स में खुले या नहीं हो सकते हैं। YouCompleteMe आपके लिए यह सब संभालता है। व्यवहार निम्न अनुभाग में वर्णित है।

फ़िल्मपेट में समर्थित: c, cpp, objc, objcpp, cuda, java, javascript, टाइपस्क्रिप्ट, जंग, cs

डिफ़ॉल्ट रूप से कोई मैपिंग नहीं है।


तो अब के लिए यह केवल जावास्क्रिप्ट, टाइपस्क्रिप्ट और जावा के लिए काम करता है?
SR

2

रिफ्लेक्टर और टाइप करने के लिए नाम पर कर्सर रखें

gd(या gDयदि आप एक वैश्विक वैरिएबल को पुनःप्राप्त कर रहे हैं)।

फिर

cgn नया नाम esc

तथा

. अगली घटना को रिफ्लेक्टर करने के लिए एक या अधिक बार

या

:%norm . एक बार में बफर में सभी घटनाओं को प्रतिबिंबित करने के लिए।


1

मैं बहुत सारे C / C ++ कोड को vim में लिखता हूँ। सबसे आम रिफ़ेक्टिंग जो मैं करता हूं, वह चर, वर्ग के नाम, आदि का नाम बदल रहा है। आमतौर पर, मैं :bufdo :%s/source/dest/gफ़ाइलों में एक खोज / प्रतिस्थापन करने के लिए उपयोग करता हूं, जो लगभग वैसा ही है जैसा कि बड़ी आईडीई द्वारा प्रदान किया गया है।
हालाँकि, मेरे मामले में, मैंने पाया कि मैं आमतौर पर एक जैसी संस्थाओं का नाम बदल देता हूं, अलग-अलग मामलों (यानी कैमलकेस, स्नेककेस, इत्यादि) में नाम बदल दिया जाता है, इसलिए मैंने इस तरह के "स्मार्ट-केस" सर्च / के साथ मदद करने के लिए एक छोटी सी उपयोगिता लिखने का फैसला किया। प्रतिस्थापित करें, यह यहां होस्ट किया गया है । यह एक कमांड-लाइन उपयोगिता है, विम के लिए प्लगइन नहीं, मुझे आशा है कि आप इसे उपयोगी पा सकते हैं।


0

रिफैक्टरिंग के लिए, यदि आप यूनाइट (और आपको चाहिए) का उपयोग कर रहे हैं, तो आप फिर वीम-क्यूफ्रेल का उपयोग कर सकते हैं और इसे बेहद आसान बना सकते हैं। इस वीडियो को देखें जो यह प्रदर्शित करता है कि यह कैसे काम करता है। एक बार जब आपका वर्कफ़्लो सेट हो जाता है, तो आप इसे अनुकूलित करने के लिए कुछ मैपिंग कर सकते हैं (वीडियो में अधिकांश चीजों को टाइप करने के बजाय)।


0

दो प्लगइन्स का एक संयोजन: vim-ripgrep , फाइलों को खोजने और क्विकफिक्स विंडो में परिणाम डालने के लिए, और क्विकफिक्स-रिफ्लेक्टर को क्विकफिक्स विंडो में परिवर्तनों को सही तरीके से सहेजने के लिए है और इसे स्वचालित रूप से फाइलों में प्रत्येक परिवर्तन को बचाने के लिए है।


0

मैं emacs के spacemacs संस्करण का उपयोग करने पर विचार करूंगा। यह समान मोड और सबसे कीस्ट्रोक्स को विम के रूप में उपयोग करता है, लेकिन इसमें लिस्प प्रकृति के कारण कई और ऐड-ऑन हैं। यदि आप C ++ में प्रोग्राम करना चाहते हैं, तो आप सिर्फ c ++ लेयर जोड़ते हैं और IDE का अधिकांश भाग आपके लिए पहले से ही सेट है। अजगर या बैश जैसी अन्य व्याख्या की गई भाषाओं के लिए आपको उनका उपयोग करने के लिए स्पेसमैक्स छोड़ने की आवश्यकता नहीं है। यहां तक ​​कि उनके पास आपके पाठ के भीतर कोड के ब्लॉक को सीधे चलाने का एक तरीका है जो साक्षर प्रोग्रामिंग या प्रतिलिपि प्रस्तुत करने योग्य प्रोग्रामिंग के लिए शानदार काम करता है जहां कोड और डेटा एक ही फ़ाइल में हैं। दोनों ने पाठ के रूप में किया।

Spacemacs प्रारंभिक भार में बहुत अधिक भारी होता है, लेकिन अतिरिक्त सामान जो आप इसके साथ कर सकते हैं वह स्टार्टअप लागत के कुछ सेकंड के लायक है। एक परत ओआरजी-मोड इसे बाहर की जाँच करने के लायक है। यह सबसे अच्छा आउटलाइनर, प्रोग्रामर, दिन टाइमर / टूडू सूची है जिसका मैंने कभी उपयोग किया है।


0

जाओ

  1. उपकरण godoctor ( GitHub ) कई रिफैक्टरिंग क्षमताओं का समर्थन
  • नाम बदलें
  • समारोह निकालें
  • स्थानीय चर निकालें
  • टॉगल var ⇔: =
  • गोडॉक स्टब्स जोड़ें

एक vim plugin है https://github.com/godoctor/godoctor.vim जो उन्हें उपलब्ध कराता है

नाम बदलने के लिए कर्सर के साथ:

:Rename <newname>

निकालने के लिए हाइलाइटिंग ब्लॉक:

:Refactor extract newfunc
  1. vim-जाने

    • सटीक प्रकार के साथ सुरक्षित पहचानकर्ताओं का नाम बदलना :GoRename
  2. भाषा सर्वर gopls

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