(関数の)2番目の引数のZshオートコンプリートルールを既存のコマンドのルールに設定するにはどうすればよいですか?


9

私が持っているカスタムZshの機能をg

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

その中で、Gitコマンドを実行する短い引数を処理します。例えば:

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

オートコンプリートルールを短い引数のGitのルールに設定できるようにする必要がありますが、これを行う方法がわかりません。

たとえば、次の引数が得られる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...

カスタムの短いコマンドをGitコマンドにマッピングしているので、これは単にgオートコンプリートに設定するだけではありませんgit


1
関数が短い名前のみをgitサブコマンドにマッピングする場合は、これにgitエイリアスシステムを使用することもできます。それについては地図で読んでください:man git-config
Lucas

回答:


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

注意すべきことの1つは、引数の数を変更する場合、$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

ただし、これはzshの補完ではなく、Gitの補完を使用しています。

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


おかげで、Git完了ルールの場所がわからず、エラーが発生したため、別のルートを選択することになりました。私の答えを見てください。
エリックノミッチ2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.