
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回タップ)後にカーソルが再び表示されることがわかりますruby
。zsh
タイミングの良い観点からは、で定義されている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
ディレクトリが存在している必要があります。$fpath
compinit
- 電話してもいい
compdef
compinit
設定した内容を上書きします。これは通話後に実行する必要があります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=
。