コロンをエイリアスとして使用すると、オートコンプリート機能が中断されます。

コロンをエイリアスとして使用すると、オートコンプリート機能が中断されます。

.NETでは、エイリアスとしてコロンまたは他のプレフィックスを使用します.bashrc

私がしばらく使っていたショートカットは次のようになりました。

alias :t="tmux"
alias :www="google-chrome --use-gl=desktop &>/dev/null &"
alias :ide="bash ~/netbeans-11.3/netbeans/bin/netbeans &>/dev/null &"
alias :bsh="/bin/bash"
alias :c="clear"
alias :d="docker"
alias :dc="docker-compose"

効果がありました。しかし、コロンが原因でオートコンプリートが機能しないという問題が発生しました。

complete -F _docker :d

完了を呼び出すと、:d何も表示されません。

衝突でしたか?どうすれば解決できますか?衝突がもっと起こると思いますか?私は何が間違っていましたか?

答え1

Bashでは、コロンは違法ではありません。ニックネーム名前。明示的に禁止される文字は\、、、、、、、、、、、、、、、、、、、、、、です。​​​ ​​"'<space><tab><newline>|&;()<>/$`=

あなたが持っていると仮定バッシュ完了インストール後に2つの問題が発生する可能性があります。最初の問題は通常、名前にコロンがあるかどうかにかかわらず、別名に関連しています。

  1. 完了関数は遅延ロードされます。

      # In a freshly opened shell
    $ alias bar='docker'
    $ complete -F _docker bar
    $ declare -pF _docker
    bash: declare: _docker: not found
      # Typing "bar", TAB, TAB:
    $ bar bash: completion: function `_docker' not found
    

    この問題を解決するには、必要な関数を明示的にロードすることができます(または、デフォルトの完成関数の周りにラッパーを作成し、_completion_loaderエイリアスも処理することができます)。

      # ...continue
    $ _completion_loader docker
    $ declare -pF _docker
    declare -f _docker
      # Typing "bar", TAB, TAB:
    $ bar 
    attach     container  ...
    
  2. 読書船(ライン編集とプログラム可能な完成Bash)に含まれる項目を処理します。COMP_WORDBREAKS変数は単語区切り文字として機能し、デフォルトでは:コロンPATHで区切られたパスのリストを含む変数への割り当てなどのユースケースをサポートするためにその中に配置されます。したがって、コマンドラインを
    完成しようとすると、完成関数に完成する必要がある誤った単語の配列が提供されます。:foo具体的には、COMP_WORDS1つの空の文字列の代わりに空の文字列に:なります。foo:foo

    これはbash-completionで言及されました。GitHubのよくある質問。 「問題。コロンを含む操作を完了しようとすると、完了エラーが発生します。」を参照してください。

    このFAQで提案されている唯一の解決策は、コマンドラインからコロンをバックスラッシュにエスケープすることです。

      # In a freshly opened shell
    $ alias :foo='docker'
    $ complete -F _docker :foo
    $ _completion_loader docker
      # Typing "\:foo", TAB, TAB:
    $ \:foo 
    attach     container  ...
    

    残念ながら、コマンドの前にバックスラッシュを追加すると、Bashはエイリアス拡張を実行できず、「コマンドが見つかりません」というエラーが発生します。ただし、エイリアスの代わりに関数(たとえば)を定義するオプションがある場合、:d () { docker "$@"; }このソリューションは機能します。

    もちろん、:fromを削除することもできますが、これにより、次のようにコマンドラインのオートコンプリートがCOMP_WORDBREAKS中断されます。PATH

    $ COMP_WORDBREAKS=${COMP_WORDBREAKS/:/}
      #  Typing "PATH=/bin:/", TAB doesn't complete any further:
    $ PATH=/bin:/
    

関連情報