मुझे अपने शेल फ़ंक्शंस कैसे प्राप्त करने के लिए मौजूदा ऑटोकॉमप्लेक्शन का उपयोग zsh में करना चाहिए?


10

मेरे पास कुछ शेल फंक्शन्स हैं .zshrcजो मेरे में टाइप करते हैं और स्क्रीन के साथ एकीकरण की अनुमति देते हैं। उदाहरण के लिए:

function s()
{
     screen -t "$1" ssh "$@"
}

हालाँकि, जब मैं इन शेल फ़ंक्शंस का उपयोग करता हूं, तो मैं कमांड के पूरा होने की विशेषताओं में zsh के अंतर्निहित का लाभ नहीं उठा सकता। (SSH के मामले में, जाने-माने और ssh_config के आधार पर स्वचालित रूप से होस्टनामों को पूरा करना)। मैंने जिन आदेशों के लिए रैपर बनाए हैं, उनके लिए मौजूदा पूर्ण तंत्र में हुक करने का पसंदीदा तरीका क्या है?

संपादित करें:

उसके जवाब के लिए गिल्स को धन्यवाद। कॉम्पडे का उपयोग करना ऐसा करने का तरीका प्रतीत होता है, लेकिन दिलचस्प बात यह है कि यह समान रूप से काम नहीं करता है। इस मामले में, मेरे पास निम्न सेटअप है:

function s()
{
    screen -t "$1" ssh "$@"
}

function m()
{
    screen -t "man.$1" man "$1"
}

compdef $_comps[man] m
compdef $_comps[ssh] s

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

जवाबों:


9

मैं कहना है एक समारोह या उपनाम या आवरण स्क्रिप्ट (जैसे कि निम्न फ़ंक्शन का उपयोग करें s) है (उदाहरण के लिए एक मौजूदा आदेश की तरह पूरा किया जाना ssh):

compdefas () {
  local a
  a="$1"
  shift
  compdef "$_comps[$a]" "${(@)*}=$a"
}
compdefas xterm cxterm uxterm xterm-color

कुछ पूर्ण कमांड कार्यों के एक परिवार पर लागू होते हैं और कमांड लाइन के पहले शब्द को यह निर्धारित करने के लिए पढ़ते हैं कि किस विशेष कमांड को पूरा करना है। उदाहरण के लिए, आदेशों ssh, scp, sftpऔर कुछ और सब समारोह से पूरा कर रहे हैं _ssh। उस स्थिति में, आपको पूरा होने वाले फ़ंक्शन को बताना होगा कि आपका फ़ंक्शन "सेवा" कैसा है (डिफ़ॉल्ट रूप से, सेवा निष्पादन योग्य नाम है, यहां आपके फ़ंक्शन का नाम है)।

_s () {
  local service=ssh
  _ssh "$@"
}
compdef _s s

धन्यवाद - मुझे लगता है मैं क्या उपयोग करना चाहता था compdef था। ब्याज से बाहर, क्या कोई कारण है कि आप एक स्थानीय चर और बदलाव का निर्माण करने के बजाय $ 1 और $ 2 को कॉल करने के लिए संकलित करें?
मुरली सूरिार

@ मुरली: ऐसा है तो मैं कुछ लिख सकता हूं compdefas xterm cxterm uxterm xterm-color
गिलेस एसओ- बुराई को रोकना '23

1
दिलचस्प है - इसलिए मैंने दो रैपर को परिभाषित किया है, एक 'मैन' के लिए और दूसरा 'एसश' के लिए। Compdef का उपयोग करना, मेरे 'मैन' रैपर के काम को पूरा करना, लेकिन मेरे 'ssh' रैपर के लिए पूरा नहीं करना। क्या आप पहले भी इस तरह के किसी मुद्दे पर भाग चुके हैं? क्या कुछ और है जो मुझे अपने उपनाम / आवरण के साथ काम करने के लिए _ssh के लिए प्रहार करना होगा?
मुरली सूरियार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.