क्या यह विम को कमांड करने के लिए पाइप करना संभव है?


18

मैं निम्नलिखित शेल चलाना चाहता हूं।

wea-this is the end of the second word | vim j
exit 0

जो मुझे आशा थी कि कुंजी स्ट्रोक w(एक शब्द को आगे बढ़ाएं) तब e(शब्द का अंत) तब a(परिशिष्ट) फिर -this is the end of the second word(पाठ) नाम के विम दस्तावेज़ में होगा jजिसमें पहले से ही शब्द हैं।

शेल स्क्रिप्ट चलाने के बाद निम्न त्रुटि हुई।

/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal

मैं Ubuntu 14.04 चला रहा हूं। दो प्रकार के उत्तरों की सराहना की जाएगी:

  1. इस वांछित परिणाम को प्राप्त करने के लिए पाइपिंग का उपयोग कैसे करें।
  2. एक अन्य विधि जिसके द्वारा मैं शेल स्क्रिप्ट से टेक्स्ट डॉक्यूमेंट को एडिट करने के लिए "विम कमांड्स" (एड या सेड कमांड नहीं) का उपयोग कर सकता हूं।

1
|चरित्र पाइप एक से दूसरे आदेश के उत्पादन में। wea-thisएक कमांड नहीं है। पाइपिंग का उपयोग उस चीज को प्राप्त करने के लिए नहीं किया जा सकता है जिसे आप या तो करना चाहते हैं; यह कीबोर्ड के नहीं, बाएं हाथ के अनुप्रयोग के विम का कारण होगा। यदि आप vim में एक बफर में स्टड प्राप्त करना चाहते हैं, तो इसे फ़ाइल नाम के लिए ऋण के साथ शुरू करें echo Hello, world! | vim -:।
डैश-टॉम-बैंग

जवाबों:


16

"hello"फ़ाइल की पहली पंक्ति पर स्ट्रिंग डालने के लिए j, आप अपने शेल में निम्न कमांड टाइप कर सकते हैं:

vim +"1 | put! ='hello'" j

  • :1 कर्सर को बफ़र की पहली पंक्ति में ले जाता है
  • :put! ='hello' वर्तमान लाइन के ऊपर स्ट्रिंग "हैलो" चिपकाता है

स्ट्रिंग डालने के लिए "hello"और फिर फ़ाइल को सहेजें और छोड़ें:

vim +"1 | put! ='hello' | x" j

पहले की तरह ही, हमने अभी-अभी एक्स कमांड को जोड़ा है :xजो सेव करता है और छोड़ता है।

आम तौर पर आप एक फ़ाइल पर पूर्व कमांड के किसी भी क्रम को निष्पादित कर सकते हैं, एक इंटरैक्टिव शेल से या एक बैश स्क्रिप्ट से, जैसे:

vim +'Ex command1 | Ex command2 | ...' file

यदि आपके पास बहुत से पूर्व कमांड हैं, तो आप उन सभी को एक समर्पित फ़ाइल के अंदर लिख सकते हैं (उदाहरण के लिए कहा जाता है myExCommands.vim), प्रति पंक्ति एक कमांड, और फिर शेल या एक स्क्रिप्ट से आप इसे स्रोत कर सकते हैं (पूर्व कमांड :sourceया लघु संस्करण के साथ) :so) इस तरह:

vim +'so myExCommands.vim' file

संपादित करें

मुझे लगता है कि आपने अपना प्रश्न संपादित कर लिया है।
मुझे लगता है कि पिछला उत्तर अभी भी लागू होता है, क्योंकि आप Ex मोड से किसी भी सामान्य कमांड को Ex कमांड से निष्पादित कर सकते हैं :normalऔर :execute

उदाहरण के लिए, मान लें कि आप चाहते हैं:

  • बफर की पहली पंक्ति पर अपने कर्सर को स्थानांतरित करें ( 1G)
  • अपने कर्सर को लाइन पर पहले गैर व्हाट्सएप चरित्र पर ले जाएँ ( _)
  • अपने कर्सर को एक शब्द आगे बढ़ाएं ( w)
  • अपने कर्सर को नए शब्द के अंत में ले जाएँ ( e)
  • कर्सर के नीचे वर्ण के बाद इन्सर्ट मोड में जाएँ ( a)
  • तार डालें hello
  • सहेजें और छोड़ें ( :x)

फ़ाइल पर ऐसा करने के लिए j, शेल से टाइप करें:

vim +"execute 'normal! 1G_weahello' | x" j

अधिक जानकारी के लिए देखें:

:help +cmd
:help :normal
:help :execute

मैं अपने लक्ष्य को पूरी तरह से स्पष्ट करने में विफल रहा। मैं एक शब्द और इस तरह आगे बढ़ने के लिए w जैसे कमांड का उपयोग करने में सक्षम होना चाहता हूं। मैं अपने प्रश्न को सही करने के लिए संपादित करूंगा।
जेसन बसानी

@JasonBasanese मैंने अपना उत्तर संपादित कर दिया है, Ex कमांड कर रहा हूं :normalऔर :executeजो आप चाहते हैं वह करते हैं?
19

10

यहाँ एक तरीका है जो आप सामान्य पूर्व-मोड कमांड का उपयोग कर सकते हैं, केवल पूर्व कमांड के बजाय, स्टिम से विम को प्रस्तुत स्ट्रीम को संपादित करने के लिए। यह बहुत उपयोगी उदाहरण नहीं है, लेकिन इसमें शामिल तकनीकों का चित्रण है। यह मानता है कि आपका खोल बैश है।

echo "The brown fox jumped." | vim -s <(printf 'wcwred\e:wq! foo\n') -

-अंत में विम बताता पाठ (नहीं कमांड) stdin से पढ़ने के लिए। -sविम बताता निर्दिष्ट फ़ाइल से कीस्ट्रोक्स निष्पादित करने के लिए। इस स्थिति में, फ़ाइल एक बैश प्रक्रिया प्रतिस्थापन का आउटपुट है। <(...)एक नामित पाइप के नाम से बदल दिया है। पाइप का आउटपुट कोष्ठक के भीतर कमांड का आउटपुट है। wcwred\eचाल कर्सर एक शब्द से और परिवर्तन है कि अगले शब्द पर red:wq! foo\nफ़ाइल के लिए परिणाम की बचत होती है fooभले ही उस फ़ाइल पहले से मौजूद। अंतिम परिणाम एक फाइल है जिसका नाम fooटेक्स्ट हैThe red fox jumped.

उन विषयों में से कुछ पर अधिक के लिए, देखें

:help -file
:help -s

मैन पेज Process Substitutionका अनुभाग भी देखें bash(1)


1
मेरे ~ / .zshrc में जोड़ा गया vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }:। अब मैं कर सकता हूं vimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo। साफ!
लियोनार्ड

@ लियोनार्डपौली: उपयोगी लगता है! क्या त्रुटि आउटपुट प्रयोग करने योग्य नहीं है? यह /dev/nullएड क्यों है ?
माइलोज़ omyakomy


4

मैंने प्रोग्राम के आउटपुट को उप-शेल से पुनर्निर्देशित करने की विधि को बहुत आसान माना है:

vim <( program )

उदाहरण:

 vim <( grep -nH  hello  myFile.cpp )
 vim <( find . -name '*.cpp' -exec grep -nH code_expr {} \+ )

4

मुझे आपकी जैसी ही इच्छा थी: मैं सामान्य विम कमांड लिखना चाहता था और उन लोगों को एक पाइपलाइन स्ट्रीम संपादित करना था। मैं इस तरह (इतने सारे झंडे!) में सामान्य विम का उपयोग करने की कठिनाई से निराश था, जैसा कि डिफ़ॉल्ट विम विकल्पों द्वारा प्रदान किया गया था।

इसलिए, मैंने इसे करने के लिए विम पर एक छोटा आवरण लिखा: https://github.com/MilesCranmer/vim-stream/ । इसे कहते हैं vims

आवरण का दिल निम्न आदेश है:

vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2

इसका उपयोग करते हुए, मैं जो कमांड जेनरेशन करता हूं, वह काफी संक्षिप्त रूप से काम करता है, और क्योंकि विम एक मोडल एडिटर है, इसलिए मैंने vimsएक मोडल स्ट्रीम एडिटर बनाया । तीन मुख्य मोड हैं जो पाइपलाइन-संपादन मानसिकता के लिए उपयोगी हैं:

[-t|--turn-off-mode] - (Default mode)
                       Every string is a vim command line, e.g., '%g/foo/d' deletes
                       all lines with foo.
[-e|--exe-mode] -      Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] -   Like exe-mode, but runs on 1st line only

इसे देखो:

$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World

तो, eके अंत में जाता है Hello, फिर aशुरू होता है।

कुछ प्रशंसक, एक्स-मोड में, युक्त लाइनों पर टिप्पणी करने my_bad_varऔर पूर्ववर्ती लाइन को हटाने के लिए।

cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'

जो अनुवाद करता है vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'- Iलाइन के शुरू में सम्मिलित करने के लिए कमांड //होने के नाते , और टिप्पणी अनुक्रम होने के नाते। \<esc>kddभागने की कुंजी को धक्का देता है, एक रेखा को ऊपर ले जाता है, फिर रेखा को हटाता है।

रेपो पर मेरे कुल 11 उदाहरण हैं, मैं आपको उन्हें जांचने के लिए प्रोत्साहित करता हूं। फिर से, यह विम के शीर्ष पर चल रहा है, यह धारा इनपुट के लिए sed की तरह अधिक विम बनाने का एक तरीका है (लेकिन आपके सभी प्रिय विम मैक्रोज़ को संरक्षित करना है!)।


3

यह एक काफी पुराना प्रश्न है, लेकिन मुझे लगा कि यह योगदान देने लायक था कि अगर आपके दिए गए डिस्ट्रो / ओएस तक पहुंच है moreutils, तो आप इसे स्थापित कर सकते हैं और बस vipeएक मानक जोड़ के रूप में उपयोग कर सकते हैं vim:

echo foo | vipe # Now you can edit "foo" to be "bar"!

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

moreutilsआमतौर पर एक पैकेज प्रबंधक के माध्यम से और मैक पर Homebrew के माध्यम से अधिकांश * निक्स-जैसे डिस्ट्रोस के लिए उपलब्ध होना चाहिए । उदाहरण के लिए...

# Arch Linux and MSYS2 (more below) as part of the `community` repo
pacman -Sy moreutils


# Mac OS and Homebrew
brew install moreutils

moreutilsMSYS2 पैकेज रिपॉजिटरी का एक हिस्सा भी है , इसलिए आप इसे तकनीकी रूप से विंडोज पर भी उपयोग कर सकते हैं। :)

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