VIM - यह केवल एक संपादक नहीं है, यह आपके सभी कामकाजी वातावरण के साथ एकीकरण है

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


प्रस्तावना


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


व्यापार करने के लिए


यहाँ, उदाहरण के लिए, कोड का ऐसा एक टुकड़ा लें (हास्केल प्रोजेक्ट कॉन्फिगर से), पैकेज निर्भरता की सूची (निर्वात में उदाहरण):


build-depends: X11 , base , directory , extra , GLFW-b , safe , aeson , containers , data-default , text , process , time , dbus 

हम क्या चाहते हैं?


  1. वर्णानुक्रम में निर्भरता को क्रमबद्ध करें
  2. सॉर्ट केस-असंवेदनशील ( X11 और GLFW-b सब कुछ ऊपर नहीं जाना चाहिए)
  3. कॉमा को पुनर्स्थापित करें ( aeson बहुत ऊपर जाएगा और उसे बाईं ओर अल्पविराम नहीं होना चाहिए, लेकिन X11 को बाईं ओर कॉमा होना चाहिए)
  4. इंडेंटेशन को पुनर्स्थापित करें (ताकि आप इतिहास से भी कमांड प्राप्त कर सकें और इसे अलग नेस्टिंग स्तर के साथ किसी अन्य कॉन्फ़िगरेशन में पुनः उपयोग कर सकें, या हॉटम कमांड को विम कॉन्फिग में बाँध सकें)

निर्णय


सबसे पहले, build-depends की पहली पंक्ति को छोड़कर निर्भरता की सूची का चयन करें (दृश्य हाइलाइटिंग द्वारा)। आप निश्चित रूप से केवल V दबा सकते हैं (लाइन-बाय-लाइन चयन के साथ दृश्य मोड) और jk या ऊपर और नीचे तीर के माध्यम से आवश्यक लाइनों का चयन करें। मेरे मामले में, मैं दृश्य मोड के लिए कस्टम हॉटकी का उपयोग करके अपने हाथ की एक लहर के साथ ऐसा करता हूं:


 xn iz <esc>[zV]z 

उदाहरण के लिए, निर्भरता की सूची के बीच में होने के नाते, मैं सिर्फ प्रेस करता हूं और सभी निर्भरताएं उजागर होती हैं, क्योंकि संपूर्ण तह को हाइलाइट किया गया है, जो बदले में वर्तमान घोंसले के शिकार ब्लॉक है (जब से मैंने foldmethod को indent रूप में परिभाषित किया है)। लेकिन आप मैन्युअल रूप से बिना कस्टम हॉटकी ( [z की शुरुआत में जंप, a से ]z अंत तक) के बिना, [zV]z क्रमिक रूप से टाइप कर सकते हैं, लेकिन तब से मेरे लिए इस तरह के एक ऑपरेशन का उपयोग अक्सर किया जाता है, फिर मैंने इसे संक्षिप्त कर दिया - कोई बदलाव की तरह कोई संशोधक नहीं है और यह पल में पलटा पर संपीड़ित करता है (निकटतम मानक लाइनों को निकटतम खाली लाइनों के लिए एक ब्लॉक का चयन करने के लिए vip है)।


फिर प्रेस : (कोलन) कमांड मोड में प्रवेश करने के लिए वर्तमान दृश्य हाइलाइट के सापेक्ष कमांड निष्पादित करने के लिए। वास्तव में, सामान्य कमांड मोड, लेकिन तुरंत चयनित चयन मार्कर के साथ, अर्थात। इस तरह दिखेगा :'<,'> जहां '<,'> चयन की सीमा है, जहां '< दृश्य चयन की पहली पंक्ति है, और '> अंतिम है।


हम क्लिक करने के बाद ! (विस्मयादिबोधक चिह्न) कीबोर्ड पर, इसका मतलब यह होगा कि जो कुछ भी आगे बढ़ता है वह एक शेल / बैश (सेटिंग्स के आधार पर) कमांड है। यह ऐसा दिखेगा :'<,'>! । वास्तव में, हाइलाइट करने के बाद, आप तुरंत क्लिक कर सकते हैं ! और एक ही परिणाम प्राप्त करें - :'<,'>!


यह ऑपरेशन हाइलाइट की गई लाइनों को STDIN कमांड पर रीडायरेक्ट करेगा और हाइलाइट की गई लाइनों को इस कमांड से STDOUT निकास से बदल देगा। उदाहरण के लिए, आप sort कमांड का उपयोग कर सकते हैं, विशुद्ध रूप से सत्यापन के लिए, परिणाम वह नहीं है जो हमें चाहिए - '<,'>!sort और एंटर दबाएं , हमें मिलता है:


  build-depends: , aeson , base , containers , data-default , dbus , directory , extra , GLFW-b , process , safe , text , time X11 

कोरुटिल्स और सामान्य टॉवर के साथ फैशन


पिछले चयन को पुनर्स्थापित करें (आप अंतिम चयन को पुनर्स्थापित करने के लिए gv दबा सकते हैं) और दबाएं ! और फिर ऊपर तीर - यह इतिहास से अंतिम कमांड को पुनर्स्थापित करेगा, इसलिए हमें फिर से लिखने की ज़रूरत नहीं है, हम सिर्फ पिछली कमांड को इतिहास से निकालते हैं और इसे बदलते हैं। कमांड को और अधिक आरामदायक बनाने के लिए, आप Ctrl + f दबा सकते हैं - यह अतिरिक्त खुल जाएगा। कमांड के सामान्य मानक संपादन के साथ एक खिड़की, विम की सभी क्षमताओं के साथ, वैसे, इतिहास से पिछली सभी टीमें अलग-अलग लाइनों के रूप में दिखाई देंगी, जिसे चुना, संपादित और निष्पादित भी किया जा सकता है।


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


पहले हम अल्पविराम को हटाते हैं (और पहली पंक्ति में एक अतिरिक्त इंडेंट होता है ताकि सभी पंक्तियों में समान इंडेंट हो) एक नियमित अभिव्यक्ति ( [, ] - एक अल्पविराम या स्थान के साथ sed कमांड का उपयोग करके, और फिर एक और स्थान, \(\w\) _ \(\w\) को उजागर करने के लिए ब्रैकेट बच गए। प्रतिस्थापन के लिए ब्लॉक करें, ताकि यह तब \1 रूप में उपलब्ध हो, \w पहला अक्षर वर्ण है, प्रतिस्थापन में हम \1 को प्रतिस्थापित करके वर्णमाला वर्ण को पुनर्स्थापित करेंगे):


 :'<,'>!sed 's/[, ] \(\w\)/\1/' 

हम निम्नलिखित प्राप्त करते हैं:


  build-depends: X11 base directory extra GLFW-b safe aeson containers data-default text process time dbus 

अगला, हम सॉर्ट करने के लिए पाइप (प्रतीक के माध्यम से | बैश की एक विशेषता है) सॉर्ट | लिए, असंवेदनशीलता के लिए -f पास करना:


 :'<,'>!sed 's/[, ] \(\w\)/\1/' | sort -f 

हमें मिलता है:


  build-depends: aeson base containers data-default dbus directory extra GLFW-b process safe text time X11 

लगभग किया! यह केवल अल्पविराम जोड़ने के लिए बनी हुई है, और पहली पंक्ति - रिक्त स्थान की एक जोड़ी। हम एक ही sed उपयोग करते हैं, इसके संचालन के सिंटैक्स में आप स्ट्रिंग्स और स्ट्रिंग्स की सीमाओं को निर्दिष्ट कर सकते हैं (जैसा कि विम में ही है, सिंटैक्स एक ही है, ठीक है, या लगभग समान है)। उपसर्ग 1 का अर्थ होगा पहली पंक्ति, 2,$ अर्थ है 2 पंक्ति से अंत तक की सीमा ( $ , जैसे ^ अर्थ है फ़ाइल की शुरुआत, नियमित अभिव्यक्तियों में समान वर्णों के साथ सादृश्य द्वारा जिसका अर्थ है पंक्ति का अंत और शुरुआत)। हम इंडेंटेशन को छोड़ने के लिए \w का उपयोग करेंगे और तुरंत पहले अल्फ़ाबेटिक कैरेक्टर का चयन करेंगे: 1s/\w/ &/ - यहाँ हम पहली लाइन के लिए एक रिप्लेसमेंट करते हैं, & माध्यम से पहले अल्फ़ाबेटिक कैरेक्टर को पुनर्स्थापित करते हैं (to \1 समान, केवल & इसका मतलब है सब कुछ) पूरे रेगेक्स के तहत, जबकि \1 अर्थ है कोष्ठक में लिपटे पहले ब्लॉक), इसके सामने कुछ रिक्त स्थान जोड़ते हैं। शेष लाइनों के लिए, दो स्थानों के बजाय, एक अल्पविराम + स्थान जोड़ें: 2,$s/\w/, &/ , पूरा कमांड इस तरह होगा: sed -e '1s/\w/ &/' -e '2,$s/\w/, &/' , - -e हम एक दूसरे से 2 ऑपरेशन को अलग करने के लिए उपयोग करते हैं। विम में, पूरे ऑपरेशन की तरह दिखेगा:


 :'<,'>!sed 's/[, ] \([^, ]\)/\1/' | sort -f | sed -e '1s/\w/ &/' -e '2,$s/\w/, &/' 

हम आवेदन करते हैं और प्राप्त करते हैं:


  build-depends: aeson , base , containers , data-default , dbus , directory , extra , GLFW-b , process , safe , text , time , X11 

हो गया! दूसरी बार लिखना आवश्यक नहीं है, बस पहले कुछ अक्षर टाइप करें, उदाहरण के लिए :: :'<,'>!se (वास्तव में, आपको केवल प्रेस करने की आवश्यकता है !se ), और इतिहास से वांछित कमांड प्राप्त करने के लिए ऊपर तीर का उपयोग करें। एक तरह से या किसी अन्य, मैं अक्सर ऐसी चीजों को लिखने का अभ्यास करने की सलाह देता हूं। इस प्रकार, आप दोनों अपने दैनिक कार्य कौशल को बाश और विम में ही पंप करेंगे, जैसा कि अनिवार्य रूप से आप एक ही काम कर रहे हैं।


अंत में, इस पूरे आदेश को एक हॉटकी को सौंपा जा सकता है, या एक फ़ंक्शन में सार किया जा सकता है, और एक या दो के लिए हर जगह पुन: उपयोग किया जा सकता है।


तृतीय-पक्ष पीएल का उपयोग करना


कोरुटिल्स से कुछ लॉन्च करने के बजाय, आप किसी प्रकार की भाषा की व्याख्या कर सकते हैं, जो आपके लिए सुविधाजनक हो, मैं पर्ल्ल 6 के माध्यम से ऐसी चीजें करना पसंद करता हूं (हाल ही में इसका नाम बदलकर रकु रखा गया):


 :'<,'>!perl6 -e 'my @x=lines.map(*.subst(/<[,\s]>\s(\w)/,{$0})).sort(*.lc); @x.shift.subst(/\w/,{q/ /~$_}).say; .subst(/\w/,{q/, /~$_}).say for @x' 

हां, कम से कम ज़ोस्कोस्क्रिप्ट (नोड.जेएस) पर:


 :'<,'>!node -e 'let fs=require("fs"), x=fs.readFileSync(process.stdin.fd).toString().replace(/\n$/,'').split(/\n/).map(x=>x.replace(/[, ] (\w)/,"$1")).sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())); console.log(x.shift().replace(/(\w)/," $1")); process.stdout.write(x.map(x=>x.replace(/(\w)/,", $1")).join("\n"))' 

यह बाहरी आदेशों को कॉल किए बिना, विम के अंदर VimL / Vimscript पर भी किया जा सकता है। लेकिन यह पोस्ट उस बारे में नहीं है।


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


 :'<,'>!~/my-program-or-script 

इस प्रकार, जब आप विम में कोड लिखते हैं, तो न केवल विम आपके निपटान में है, बल्कि आपके पूरे काम के माहौल में भी है।


सबसे आसान उदाहरणों में से एक JSON फ़ाइल को अस्वीकार करना है:


 :%!jq 

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

Source: https://habr.com/ru/post/hi483580/


All Articles