मैक्रो में शब्दों को कैमलकेस में कैसे बदल सकता हूं?


14

मेरे पास शब्दों की एक सूची है, जैसे:

these are
some
words that I want
to convert to
camel case

मैं उदाहरण के लिए चालू करने के लिए, एक तरह की जरूरत camel caseमें camelCaseएक मैक्रो (या एक तरह से ऊंट मामले में एक दृश्य लाइन चयन के हर लाइन चालू करने के लिए) के भीतर।

मैं wgUlhxआवश्यक रूप से कई बार कुछ का उपयोग कर सकता था , लेकिन समस्या यह है कि यह अलग-अलग लंबाई के शब्दों के लिए काम नहीं करता है (इसलिए, उदाहरण के लिए, wgUlhxwgUlhxइसके लिए काम करेगा convert this pleaseलेकिन नहीं convert these pretty please)।

उपरोक्त लाइनों के लिए वांछित आउटपुट होगा

theseAre
some
wordsThatIWant
toConvertTo
camelCase

क्या इसे स्वचालित करने का कोई तरीका है?

जवाबों:


16

एक लाइनर

मैंने एक साधारण नियमित अभिव्यक्ति प्रतिस्थापन पाया ('जादू' सेट है):

:s/ \([a-zA-Z]\)/\u\1/g

यह एक स्थान के बाद किसी भी एक अक्षर से मेल खाता है, पत्र को बचाता है। फिर, यह पंक्ति में प्रत्येक मैच के लिए ऊपरी अक्षर ( \u= ऊपरी मामला, \1= पहला सहेजा गया मैच) बनाए गए सहेजे गए पत्र के साथ बदल देता है ।

%बीच :- बीच में लगाकर पूरी फाइल पर लागू करें s

इस समाधान के लिए नकारात्मक पक्ष यह है कि यह linewise है (जो आपके उदाहरणों के लिए काम करता है), लेकिन कम होगा यदि आप केवल एक लाइन के भीतर कई में से कुछ शब्दों को ऊंट करना चाहते थे।

एक फुलर समाधान

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u\1/g
  let @/=searchsave
 endfunction

यह एक नया ऑपरेटर बनाता है जो गति पर काम कर सकता है। यदि आपके पास <leader>है \, तो निम्नलिखित पाठ ( |कर्सर के रूप में) दिया गया है:

This is some |example text to work with.

टाइपिंग \g~3wदेता है

This is some exampleTextTo work with.

यही कारण है कि, हमने ऊंट को 3 शब्दों में कैस किया।

उस प्रतिस्थापन का विवरण:

s/प्रतिस्थापन शुरू करता है।
\%>'\[थोड़ा दर्दनाक है। \%>'mएक निशान के अधिकार के लिए मैच के लिए कहते हैं। हम मार्क चाहते हैं [, लेकिन वह भी इस पैटर्न में बच जाना है। तो, यह ऑपरेटर को दिए गए प्रस्ताव के बाद मैच शुरू करता है।
\([a-zA-Z\)ऊपर के वन-लाइनर की तरह ही है।
\%<']यह दूसरा छोर है, जो गति के अंत से पहले मेल खाता है।
/\u\1/gऊपर के वन-लाइनर से प्रतिस्थापन है।


वास्तव में, यह एक मैक्रो नहीं है क्योंकि यह एक लाइनर है, लेकिन आप इसे एक प्रमुख संयोजन के लिए मैप कर सकते हैं।
जॉन ओ.एम.

इसे करने के लिए एक ऑपरेटर संस्करण जोड़ा गया। थोड़ा बेहतर काम करता है।
जॉन ओ.एम.

मुझे लगता है कि यह ठीक है अगर आपका जवाब विशेष रूप से एक मैक्रो का उपयोग नहीं करता है; प्रश्नकर्ता ने मेरी राय में, एक XY समस्या प्रस्तुत की ।
tommcdo

@tommcdo हां, आप सही कह रहे हैं; यह एक वास्तविक मैक्रो होना जरूरी नहीं है। इसके लिए बस किसी प्रकार की स्वचालित विधि का होना आवश्यक है।
डोरकनॉब

12

एक विकल्प के लिए, मैं vim-abज्जा प्लगइन का उपयोग करता हूं जो एक जबरदस्ती सुविधा प्रदान करता है:

fooBarमें बदलना चाहते हैं foo_bar? प्रेस crs(स्नेकर_केस के लिए जबरदस्ती)। मिश्रितकेस ( crm), कैमलकेस ( crc), स्नेक_केस ( crs), और UPPER_CASE ( cru) सभी केवल 3 कीस्ट्रोक्स हैं। ये आदेश दोहराने का समर्थन करते हैं


2
+1 क्योंकि हमेशा एक टिम पोप का प्लगइन होता है जिसके बारे में मुझे नहीं पता था।
11

5

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

qqqqqf xgUl@qq

(ध्यान दें कि fऔर xस्पेसबार के बीच का स्थान एक ठहराव नहीं है)

विस्तार से:

  1. Q रजिस्टर साफ़ करें। यह आवश्यक है क्योंकि हम एक पुनरावर्ती मैक्रो बना रहे हैं। (चरण 5 देखें):qqq

  2. रजिस्टर q में मैक्रो रिकॉर्ड करना शुरू करें: qq

  3. आप wयहाँ गति का उपयोग नहीं कर सकते हैं, क्योंकि आप चाहते हैं कि मैक्रो गर्भपात कर दे जब वह अगली पंक्ति में जाने के बजाय लाइन के अंत तक पहुंच जाए। इसके बजाय, fस्पेसबार के द्वारा की को दबाकर लाइन पर अगले स्पेस कैरेक्टर पर जाएं :f<space>

  4. निम्नलिखित पत्र को स्थान और ऊपरी स्थिति को हटाएं: xgUl

  5. Recurse। क्योंकि हमने qचरण 1 में रजिस्टर को मंजूरी दे दी है , इसमें अभी तक कुछ भी नहीं है, इसलिए यह कुछ भी नहीं करेगा:@q

  6. मैक्रो सहेजें: q

आप एक सीमा का उपयोग करके इस मैक्रो को कई लाइनों में लागू कर सकते हैं:

फ़ाइल में प्रत्येक पंक्ति में मैक्रो लागू करें:

:%normal @q

मैक्रो को लाइनों में शामिल करें 2-5 समावेशी:

:2,5normal @q

एक दृश्य चयन करें, और फिर टाइप करें :normal @q। जब आप :कुंजी दबाते हैं, तो यह कमांड लाइन को पूर्व-आबाद करेगा , जिसके परिणामस्वरूप चयन में हर लाइन पर मैक्रो लागू होता है:

:'<,'>normal @a

qरजिस्टर को साफ करना अनावश्यक है , जैसा qqकि इससे पहले किस्ट्रोक्स रिकॉर्ड करना शुरू करता है। वास्तव में, यही कारण है qqqकि qरजिस्टर को साफ करने के लिए काम करता है :)
tommcdo

बेशक, अगर आप कुछ कर रहे थे की आवश्यकता है कि जोड़कर करने के लिए qरजिस्टर (यानी का उपयोग कर qQ) तो यह समाशोधन पहले शायद आवश्यक हो जाता।
tommcdo

2
@tommcdo विम की मेरी प्रति में निश्चित रूप से सच नहीं है। (विम 7.3.३ vim -u NONE. V V, के साथ लागू )। मौजूदा सामग्री को केवल तब हटा दिया जाता है जब आप रजिस्टर को सहेजते हैं , चरण 6 में। रजिस्टर शुरू करने से पहले रजिस्टर को साफ करना इसलिए जरूरी है यदि आप पुनरावृत्ति करना चाहते हैं।
रिच

@tommcdo मैंने इसे और अधिक स्पष्ट करने के लिए उत्तर अपडेट किया है कि यह कदम क्यों आवश्यक है।
रिच

मेरी गलती है, मैं बंदूक वहाँ कूद गया। बहुत बढ़िया स्पष्टीकरण!
टोंकडो

1

Http://vim.wikia.com/wiki/Changing_case_with_ अनियमित_expressions देखें यह \ U, \ L, \ u, \ l संशोधक को बहुत स्पष्ट और संक्षिप्त रूप से समझाता है!

इसका सार निम्नलिखित है:

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

यह बैकरेफ़रेन्स के सामने \ U या \ L रखने जैसा ही सरल है, जिसे आप अंत में और \ E के मामले में बदलना चाहते हैं। विम बैकरेफेरेंस अपरकेस या लोअरकेस (क्रमशः) में टेक्स्ट बनाएगा। बैकरेस्ट में पहले वर्ण के मामले को बदलने के लिए \ u और \ l (अंत में \ E) का उपयोग करें।

(ए "बैकरेसेंस" एक नियमित अभिव्यक्ति का एक हिस्सा है जो एक नियमित अभिव्यक्ति के पिछले हिस्से को संदर्भित करता है। सबसे आम बैकरेफरेंस &, \ 1, \ 2, \ 3, ..., \ 9) हैं।

कुछ उदाहरण जो इस तकनीक की शक्ति को प्रदर्शित करते हैं:

पूरी फाइल को लोअरकेस करें

% S /.*/ \ एल एंड / जी

((एक आसान पश्चगामी है जो मैच के संपूर्ण पाठ को संदर्भित करता है।)

उन सभी शब्दों को अपरकेस करें जो एक <(यानी HTML टैग नाम खोलने से पहले) हैं:

:%s/<\(\w*\)/<\U\1/g

नोट भी gu और gU कमांड।

उदाहरण के लिए, ggguG पूरी फ़ाइल को कम कर देगा। (gg = to top, gu = लोअरकेस, G = EOF पर जाएं)।

नाम वाले लोगों के बजाय \ 0 सामान्य backref का उपयोग करके (\ 1, \ 2 आदि) आप रेगेक्स के स्टैंज़ा को बदलने के लिए कुछ टाइपिंग को बचा सकते हैं।

यह regex ऊपरी मामलों को एक फाइल में अपरकेस के लिए स्पष्ट सेट करता है:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\0/g

रॉकेट विज्ञान नहीं, लेकिन अन्यथा आपको यह करना होगा:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g

1
क्या आप अपने उत्तर में वर्णित लेख को संक्षेप में बता सकते हैं?
एवरग्रीनट्री

फिर मिलते हैं? यह बहुत महत्वपूर्ण है, अगर एकल-लिंक उत्तर ठीक होंगे, कुछ साल बाद यह साइट हटाए गए लिंक से भरी होगी। लेकिन अगर आप केवल आपके द्वारा संदर्भित लिंक के एक महत्वपूर्ण हिस्से की नकल करते हैं, और वह लिंक भी देते हैं जहां ओपी आगे infos प्राप्त कर सकता है, तो यह ठीक है।
पीटर -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.