等号の後のパスを自動的に完成するbashコンプリートスクリプトを作成しますか?

等号の後のパスを自動的に完成するbashコンプリートスクリプトを作成しますか?

--arg引数を認識して設定できるbashコンプリートスクリプトを作成したいと思います--some-arg=file

読んだ後このチュートリアルのいくつかの例で、/usr/share/bash_completion/completions/次のスクリプトを作成しました(Chromiumを使用していくつかのフラグを入力する時間を節約するため)。

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=file
    if [[ ${cur} == "--"*"=" ]] ; then
        # Removed failures (is my logic OK?)
        return 0
    fi

    # Handle other options
    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _chromium chromium

に保存し、~/bash_completions/chromiumを使用してシンボリックリンクを作成しましたsudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
それから. /usr/share/bash_completions/completions/chromium

今、2つの問題があります。

  • chromium --u<TAB>chromium --user-data-dir=<SPACE>(このスペースは不要です)に展開します。
  • パス(ディレクトリとファイル)が完全ではなくなりました。

これらの問題をどのように解決できますか?

答え1

2つの問題の解決策を見つけました!

  1. スペースを追加したくない場合は、このnospaceオプションを使用してください。これは2つの方法で行うことができます。

    • 次のアドレスに転送してくださいcomplete
      complete -o nospace -F _chromium chromium
    • compopt組み込みの使用:(
      compopt -o nospaceこのオプションを有効にする)
      compopt +o nospace(このオプションを無効にする)

    私はgnu.orgのBashドキュメントでこれを見つけました。8.7 組み込み機能のプログラム可能な完成

  2. 文書を完成させてください。
    • Petervが提案した-fと一緒にロゴを使用してくださいcompgen。私はそのアドバイスに従ってそれをCOMPREPLY=( $(compgen -f "$cur") )
      スタックオーバーフローで見つけました。この回答完成リストを手動で作成することをお勧めします(使用しないcompgen)。この方法は非常に効果的です。
    • このfilenamesオプションを有効にすると、Readline compspecは次のことができるようにファイル名を生成するように指示します。
      • ファイル名別処理の実行(ディレクトリ名へのスラッシュの追加、特殊文字の引用、末尾のスペースの抑制など)
      • さまざまな色でファイル形式を表示(colored-stats有効)

の助けを借りてBashの文字列操作(スペースを拡張し~て処理するために)質問に記載されているすべての基準を満たすbashコンプリートスクリプトを作成しました。

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=
    if [[ ${prev} == "--"* && ${cur} == "=" ]] ; then
        compopt -o filenames
        COMPREPLY=(*)
        return 0
    fi
    # Handle --xxxxx=path
    if [[ ${prev} == '=' ]] ; then
        # Unescape space
        cur=${cur//\\ / }
        # Expand tilder to $HOME
        [[ ${cur} == "~/"* ]] && cur=${cur/\~/$HOME}
        # Show completion if path exist (and escape spaces)
        compopt -o filenames
        local files=("${cur}"*)
        [[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]// /\ }" )
        return 0
    fi

    # Handle other options
    COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
    if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != "--"*"=" ]] ; then
        # If there's only one option, without =, then allow a space
        compopt +o nospace
    fi
    return 0
}
complete -o nospace -F _chromium chromium

答え2

-fファイル名を完成させるには、に渡してくださいcompgen

オプションの後のスペースを削除できないか心配です。完成がうまくいく方法だからです。一意の一致を見つけると完全に完了します。

関連情報