मैं मौजूदा आदेश के नियमों के दूसरे तर्क (फ़ंक्शन) के लिए Zsh स्वतः पूर्ण नियम कैसे सेट करूं?


9

मेरे पास एक कस्टम Zsh फ़ंक्शन हैg :

function g() {
  # Handle arguments [...]
}

इसके भीतर, मैं छोटे तर्क को संभालता हूं जो Git कमांड को निष्पादित करता है। उदाहरण के लिए:

g ls # Executes git ls-files ...
g g  # Executes git grep ...

मुझे लघु तर्क के लिए गिट के नियमों के लिए स्वत: पूर्णता नियम निर्धारित करने में सक्षम होने की आवश्यकता है लेकिन मैं यह कैसे करना है, इसके बारे में अनिश्चित हूं।

उदाहरण के लिए, मुझे g ls <TAB>उन नियमों को पूरा git ls-files <TAB>करना होगा जिनके लिए मुझे तर्क देना होगा git ls-files:

$ g ls --<TAB>
--abbrev                 -- set minimum SHA1 display-length
--cached                 -- show cached files in output
--deleted                -- show deleted files in output
# Etc...

यह केवल gस्वत: पूर्ण करने के लिए सेटिंग नहीं है gitक्योंकि मैं अपने कस्टम शॉर्ट कमांड को Git कमांड में मैप कर रहा हूं।


1
यदि आपका कार्य केवल उप नामों के छोटे नामों को मैप करता है तो आप इसके लिए git उपनाम प्रणाली का उपयोग कर सकते हैं। मानचित्र में इसके बारे में पढ़ें man git-config:।
लुकस

जवाबों:


3

मैंने पाया /usr/share/zsh/functions/Completion/Unix/_gitकि इस तरह के उपनामों के लिए कुछ सुझाव दिए गए थे और एलियंस के लिए इन कार्यों को परिभाषित करना समाप्त कर दिया था:

_git-ls () {
  # Just return the _git-ls-files autocomplete function
  _git-ls-files
}

फिर, मैंने सीधा किया compdef g=git। स्वत: पूर्ण प्रणाली देखेगा कि आप चल रहे हैं, उदाहरण के लिए, g lsऔर _git-lsस्वतः पूर्ण फ़ंक्शन का उपयोग करें ।

सही दिशा में मुझे स्टीयरिंग के लिए user67060 के लिए धन्यवाद।


2

मुझे कुछ ऐसा ही करना था इसलिए यह आपकी समस्या का समाधान होना चाहिए।

_g () {
    case "${words[2]}" in
      ls) words[1,2]=(git ls-files);;
      g) words[1,2]=(git grep);;
      *) return 1;;
    esac

    _git # Delegate to completion
}
compdef _g g

एक बात ध्यान रखें कि यदि आप तर्कों की संख्या बदलते हैं तो आपको $CURRENTचर को समायोजित करने की आवश्यकता होगी ।


1

क्या यही मुझे करना होगा:

_tg () {
    local _ret=1
    local cur cword prev

    cur=${words[CURRENT]}
    prev=${words[CURRENT-1]}
    cmd=${words[2]}
    let cword=CURRENT-1

    case "$cmd" in
    ls)
        emulate ksh -c _git_ls_files
        ;;
    g)
        emulate ksh -c _git_grep
        ;;
    esac

    let _ret && _default && _ret=0
    return _ret
}

compdef _tg tg

हालाँकि, यह Git के पूरा होने का उपयोग कर रहा है, zsh के पूरा होने का नहीं:

https://git.kernel.org/cgit/git/git.git/tree/contrib/completion/git-completion.zsh


धन्यवाद, मैंने एक अलग रास्ता तय कर लिया क्योंकि मुझे नहीं पता था कि Git के पूरा होने के नियम कहां हैं और क्या गलतियां हो रही थीं। मेरा जवाब देखिए।
एरिक नोमिच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.