gemコマンドのzsh「インテリジェント」オートコンプリートを無効にしますが、通常のパスの完成は維持します。

gemコマンドのzsh「インテリジェント」オートコンプリートを無効にしますが、通常のパスの完成は維持します。

bash私のMacでmacOS 12.0.1を実行していますから、に切り替えようとしていますzsh。次のコマンドを実行しようとしています。

gem install pg -v 1.2.3 -- --with-pg_config=/opt/homebrew/opt/libpq/bin/pg_config

触れることができれば

gem install pg -v 1.2.3 -- --with-pg_config=

その後、をクリックしてもTAB完了しませんでした。ターミナルウィンドウのタイトルで、約3秒(および3回タップ)後にカーソルが再び表示されることがわかりますrubyzsh

タイミングの良い観点からは、で定義されているctrl-Cシェル関数を呼び出すように見えます。_gem/usr/share/zsh/5.8/functions/_gem

zsh私はここで賢いことをしようとしていると思いましたが、それが何でも機能せず必要なく、なぜ私の特定のユースケースやこの特定の環境で動作しないのか気にしません。システム(自作、RVMなど)。私は通常のファイル/ディレクトリの完成を望んでいます。

zshこの特定の機能を削除せずに無効にする方法はありますか/usr/share/zsh? (おそらく次のOSアップデートに再び含まれます。)

ベストアンサー1

compinit「新しい」(1990年代)完成システムを使用するとします。つまり、.zshrcあなた(またはそれを使用している場合はzsh構成フレームワーク)に呼び出しがあると仮定すると、次の2つの方法で標準補完を上書きできます。

  • _gemに同じ名前の関数を配置することでこれを行うことができます。呼び出される前に$fpathディレクトリが存在している必要があります。$fpathcompinit
  • 電話してもいいcompdefcompinit設定した内容を上書きします。これは通話後に実行する必要がありますcompinit

したがって、後でファイル名を完成させるには、gem呼び出し後に次のコマンドを実行しますcompinit

compdef _files gem

しかし、そのような大胆な措置を取る必要はありません。 zshがコンテキストに何かが必要だと思っていても、ファイルを完成させる方法があります。

概念的には、最も単純で最も便利な方法ではありませんが、一時的にコンテキストを変更することです。たとえば、と入力し、;l ファイル名を入力して削除します;l 。またはHome 0 Endファイル名を入力してくださいHome Del End

あなたは縛ることができます_bash_complete-word/たとえば、キーバインディングを終了し^X/てから任意の^X/場所をタップしてファイル名を完成させます。あなたの場合、--with-pg_configこのウィジェットは区切り文字とは見なされず、等号の代わりにスペースを入れた場合にのみ機能します=

あなたは利点を享受することができます_most_recent_file、デフォルトではバインドされています^Xm。コンテキストに関係なく、最新のファイル名が完成します。あなたの場合、--with-pg_configこのウィジェットは区切り文字とは見なされず、等号の代わりにスペースを入れた場合にのみ機能します=。例えば: --with-pg_config /o ^Xm /h ^Xm /o ^Xm /*pq ^Xm

あなたはできます定義あなた自身ウィジェットの完成ファイルを完成させ、キーにバインドします。

_complete_files () {
  if [[ $PREFIX == [-0-9A-Z_a-z]##=* ]]; then
    IPREFIX+=${PREFIX%%\=*}=
    PREFIX=${PREFIX#*=}
  fi
  _main_complete _files
}
zle -C _complete_files complete-word _complete_files
bindkey '\e^F' _complete_files

その後、任意の場所をタップしてCtrl+Alt+Fファイル名を完成させることができます。この関数はコンテキストに関係なく現在のシェルワードを完成させますが、そのような接頭辞は無視します--option=

おすすめ記事