विम में बाहरी कमांड को बफरिंग पाइपिंग


92

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


STDINशेल कमांड के रूप में चयनित पाठ प्रदान करने के लिए संबंधित प्रश्न : शेल को पाइप करें और
इंफो

जवाबों:


130

आप :w !cmdवर्तमान बफ़र को बाहरी कमांड के स्टड पर लिखने के लिए उपयोग कर सकते हैं । से :help :w_c:

[सीमा] w [संस्कार] [++ ऑप्ट]! {cmd}

मानक इनपुट के रूप में लाइनों के {cmd}साथ निष्पादित करें [range](सामने की जगह पर ध्यान दें '!')। {cmd}के साथ क्रियान्वित किया जाता है ":!{cmd}", किसी भी '!'पिछले आदेश के साथ बदल दिया जाता है |:!|

एक संबंधित कमांड :%!cmdजो एक ही काम करता है और फिर कमांड के आउटपुट के साथ वर्तमान बफर को बदल देता है। इसलिए :%!sortवर्तमान बफर को जगह में छांटने के लिए बाहरी सॉर्ट कमांड को लागू करेगा।


6
यह json को प्रारूपित करने के लिए उपयोगी है जैसे: :'<,'>!python -mjson.toolया:%!python -mjson.tool
TrinitronX

1
फ़ॉर्मेटिंग के लिए, :%!gofmtअंतिम के बिना उपयोग करें %, क्योंकि इससे सहेजे गए संस्करण (जो वर्तमान बफर से भिन्न हो सकते हैं) का उपयोग करना होगा
thomasrutter

क्या इसके लिए कोई रास्ता है कि वर्तमान बफर को केवल सफलता पर कमांड आउटपुट से बदल दिया जाए ? यदि आदेश गैर-शून्य देता है, तो बफर को प्रतिस्थापित न करें?
थोमसट्रेटर

@thomasrutter यदि बफर को इच्छित आउटपुट के बजाय एक त्रुटि संदेश के साथ बदल दिया जाता है, तो आप बस uपूर्ववत के लिए दबा सकते हैं
törzsmókus

1

यहाँ उदाहरण है कि कैसे मौजूदा बफर को कमांड लाइन से बाहरी स्टड पर भेजा जाए:

vim -es +"w >> /dev/stdout" -cq! /etc/hosts

यह स्क्रिप्टिंग उद्देश्यों के लिए उपयोगी है।

अधिक कमांड-लाइन ट्रिक्स के लिए, देखें:

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