すべてのエイリアスに対して補完機能が機能しないのはなぜですか?

すべてのエイリアスに対して補完機能が機能しないのはなぜですか?

私の.bash_aliasesファイルには、次のようないくつかのエイリアスがあります。

shopt -s expand_aliases
alias emx='emacs'
alias em='emacs -nw'
alias gv='gvim'
alias v='vi'
alias ev='evince'

私はそれを使用し、オートコンプリートのために[タブ]を押すと動作します。

:~/$ emx main-0 [press tab]
main-04.cpp       main-05.cpp       main-06.cpp       main-06-test.cpp 

または

:~/$ em main-0 [press tab]
main-04.cpp       main-05.cpp       main-06.cpp       main-06-test.cpp 

それは働きます(また働きます) 。emxただし、使用しようとすると機能しません。emevgvv

:~/$ gv main-0 [press tab]
<nothing happens>

なぜ? ?

答え1

これが混乱している場合は、expand_aliasesコマンドを処理するときにエイリアスを確認するかどうかを判断するのはまったく異なる問題です。終わる

各コマンドに対して完了を設定したようです。complete(引数なし)出力を確認してください。gv条約によると、蜃気楼gvコマンドを実行するので、PS/EPS/PDFファイルのみを検索すると完了することができます。

答え2

まず、Bashオートコンプリートは、エイリアスを解析せずにコマンドラインに入力した内容のみを読み取ります。命令名を入力すると命令名が読み出されます。エイリアスを入力すると、エイリアスが読み込まれます。したがって、完了に関する限り、あなたの出来事とは何の関係もありませんgvgvim実際には、gv次の定義があります。バッシュ完了スクリプトは次のとおりです。

_install_xspec '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))' gv ggv kghostview
complete -F _filedir_xspec gv

したがって、デフォルトでは圧縮されていないpsファイルとpdfファイルとのみ一致します。

AFAIKこれを処理する方法は2つあります。

  1. エイリアスの完成をgv別の関数に設定してください。たとえば、_longoptあなたの場合:

    complete -F _longopt gv
    
  2. 一般的なエイリアス補完関数を作成してから実行してみてくださいgv。幸いなことに、誰かがすでにこれを行っています。https://github.com/cykerway/complete-alias

関連情報