चयनित शब्दों और लाइनों को संशोधित करने के लिए विम में एक बाहरी कमांड का उपयोग कैसे करें?


22

अन्य संपादकों में जो कुछ मुझे उपयोगी लगा वह है:

  • चयनित पाठ लें
  • एक बाहरी कमांड चलाएं और चयन को पास करें stdin
  • बाहरी कमांड लें stdoutऔर वर्तमान चयन को इसके साथ बदलें।

इस तरह से आप उपयोगी टेक्स्ट टूल लिख सकते हैं जो किसी भी भाषा का उपयोग करके चयन पर काम करते हैं जो मूल io कर सकते हैं।

यह चयन का उपयोग करके विम के साथ कैसे किया जा सकता है? ... एक एकल वर्ण, शब्द, पैराग्राफ ... आदि।

(सीधे कमांड लाइन में, या एक महत्वपूर्ण बंधन के माध्यम से?)


ध्यान दें

जैसे कमांड !sortलाइन-स्तर पर काम करते हैं, कारण मैं इस सवाल पूछ रहा हूँ क्योंकि मैं चयन पर संचालित करने के लिए चाहते हैं। (अर्थात, यदि xदबाया गया था तो वह पाठ हटा दिया जाएगा )।

जवाबों:


17

मुझे लगता है कि अक्सर सबसे आसान तरीका दृश्य मोड का उपयोग करना है v(या Vपूरी पंक्तियों का चयन करने के लिए पूंजी ), और उस पाठ का चयन करें जिसे आप पाइप करना चाहते हैं।

फिर टाइप करें:

:!cat

यह कुछ भी उपयोगी नहीं है, इस तरह के रूप में। एक उपयोगी आदेश जिसका मैं अक्सर उपयोग करता हूं:

:!python -m json.tool

प्रारूप JSON के लिए।

आप भी केवल (दृश्य विधा के बिना) टाइप कर सकते हैं:

:<range>!command

उदाहरण के लिए, संपूर्ण फ़ाइल के लिए:

:%!python -m json.tool

या वर्तमान लाइन के लिए:

:.!python -m json.tool

इसके साथ उपयोग करने के लिए एक और वास्तव में उपयोगी उपकरण sortकमांड है।
कोडी पोल

4
@CodyPoll विम के साथ क्या गलत है :sort?
मार्टिन टूरनोइज

5
@Carpetsmoker बाहरी सॉर्ट कमांड के पास बहुत अधिक विकल्प हैं और (स्थानीय, आदि के आधार पर) एक अलग क्रम बनाता है।
derobert

1
यह एक पंक्ति में एक शब्द का चयन करने के लिए काम नहीं करता है। (देखें प्रश्न शब्द स्तर चयन का उल्लेख करें)
ideasman42

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

7

मैंने express.vim नामक एक प्लगइन लिखा है जो इस के साथ मदद कर सकता है। प्लगइन एक ऑपरेटर को परिभाषित करता g=है जो आपको मोशन (या विजुअल सिलेक्शन) पर एक विम्स्क्रिप्ट अभिव्यक्ति का मूल्यांकन करने देता है। यह एक अभिव्यक्ति के लिए संकेत देता है, जिसमें आप v:valगति द्वारा कवर किए गए पाठ के लिए प्लेसहोल्डर के रूप में उपयोग कर सकते हैं (या, फिर से, दृश्य चयन)।

इस मामले में, एक उपयोगी अभिव्यक्ति system()फ़ंक्शन का उपयोग करेगी , जो एक बाहरी कमांड चलाता है।

system('tr a-z A-Z', v:val)

(यहां मैं trएक साधारण उदाहरण बाहरी कमांड के रूप में उपयोग किया जाता है।)

इस समस्या के लिए एक्सप्रेस .vim का उपयोग करने का तरीका दृश्य मोड के साथ पाठ का चयन करना होगा, फिर g=उस अभिव्यक्ति के बाद टाइप करें , फिर हिट करें Enter:

g=system('tr a-z A-Z', v:val)<CR>

मैं मानता हूँ, इसका उपयोग करना आसान नहीं है। (वास्तव में, मैं शायद ही कभी इस प्लगइन का उपयोग करता हूं!) मैं एक बाहरी कमांड को लागू करने के लिए शॉर्टकट जोड़ने पर विचार कर रहा हूं, जैसे कि अभिव्यक्ति शुरू करना !। अगर मैं ऐसा कर रहा हूं तो मैं यहां एक अपडेट पोस्ट करूंगा।

संपादित करें

मैंने एक्सप्रेस .vim को !एक्सटर्नल कमांड के साथ शुरू होने वाले एक्सप्रेशन के लिए संशोधित किया है । तो, trउदाहरण के साथ चिपके हुए , ऊपर एक बहुत सरल हो जाता है। दृश्य चयन के बाद, निम्न टाइप करें:

g=!tr a-z A-Z<CR>

स्पष्टीकरण:

  1. एक्सप्रेस ऑपरेटर से संपर्क करें g=
  2. !tr a-z A-Zअभिव्यक्ति के रूप में दर्ज करें
  3. दबाएँ Enter

4

आप Vim में फ़िल्टर कमांड देख रहे हैं। देख लो :help filter। यहाँ प्रासंगिक दस्तावेज है:

!{motion}{filter}   Filter {motion} text lines through the external
                    program {filter}.
!!{filter}          Filter [count] lines through the external program
                    {filter}.
{Visual}!{filter}   Filter the highlighted lines through the external
                    program {filter} (for {Visual} see |Visual-mode|).
                    {not in Vi}

:{range}![!]{filter} [!][arg]               *:range!*
                    Filter {range} lines through the external program
                   {filter}.  ...[See documentation for details]

इसलिए टाइपिंग 5!!sortकर्सर से शुरू होने वाली अगली 5 लाइनों को सॉर्ट करेगी।


क्या किसी एक शब्द को फ़िल्टर करना संभव है? (लाइन लेवल नहीं)
ideasman42

हाँ। तीसरा विकल्प (विजुअल मोड) जो भी हाइलाइट किया गया है उसके लिए काम करता है (शब्द, आंशिक रेखा, कई लाइनें, आयताकार ब्लॉक, आदि)।
समीर

1
तीसरा विकल्प संपूर्ण लाइनों को भी फ़िल्टर करता है। यदि आप किसी एक शब्द का चयन करते हैं और उसे फ़िल्टर करते हैं, उदाहरण के लिए, के माध्यम से tr [:lower:] [:upper], विम केवल इस शब्द को नहीं बल्कि पूरी रेखा को ऊपर उठाएगा।
मारिया

0

ध्यान दें कि इसके साथ किया जा सकता है:

  1. जो आप चाहते हैं, उसे नेत्रहीन चुनें
  2. s^R=system('tr a-z A-Z', @")[:-2]^M( ^RCTRL + R होने के साथ , और ^ M ENTER हो रहा है)

यह ऐसी किसी भी चीज़ के साथ भी काम कर सकता है जो चयन + की तरह करती है ci"^R=...


मल्टी लाइन टेक्स्ट सिलेक्शन ( vकर्सर को दबाने और हिलाने के बाद ) पर इसे चलाने पर मुझे त्रुटि मिलती है E16: Invalid range\nE16: Invalid range\nE476: Invalid command(लिनक्स पर तो trऔर अन्य बेसिक कमांड मौजूद हैं)।
विचारमान 42

क्या आपने डाला है sजो इन्सर्ट मोड या :sकमांड में जाता है?
ल्यूक हरमिट

संदेह नहीं है, लेकिन यह भी सुनिश्चित नहीं है कि आप कैसे मतलब है, शायद उदाहरण दिखा सकता है कि यह एक कुंजी को कैसे बांध सकता है?
विचारमान 42

क्या आप sविजुअल मोड से सीधे हिट करते हैं, या आप :पहले हिट करते हैं ? :मेरे द्वारा लिखी गई चाबियों के अनुक्रम में कोई शामिल नहीं है। एक मानचित्रण होगा: vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>
ल्यूक हरमिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.