次の簡単なウィジェットを作成しました。
function my_widget() { ... }
zle -N my_widget
bindkey '^P' my_widget
問題は、このキーバインディングが常に機能していないことです。たとえば、スクリプトがパスread
または入力を待っている間はvared
ウィジェットを呼び出すことはできません。いつでも呼び出すことができるようにしたい(たとえば、^U
または^W
)。
すべてのキーマップにキーバインディングを追加してみました(書き込み.safe
禁止になっているので除く)。
ZLEウィジェットでなくても、どこからでもショートカットを使用できるようにしたいです。
私が達成したいことを達成できますか?
答え1
zle
/はbindkey
現在シェルを構成するz
Shine Ditorですl
。e
対話型シェルまたはそのコマンドを使用してvared
コマンドラインをed
編集するには、zleを呼び出しますvar
。どちらの場合も、zleは1行に限定されず、すべてのテキストを編集できます。
read
ラインエディタを使用する代わりに、読む-d
stdin(または他の行記述子)から単一の行(または他の種類のレコード)を取得し、端末デバイスである必要はなく、そのレコード-u
の単語を指定された変数に保存します。
ユーザーがスクリプトにいくつかのテキストを入力してzleを使用して編集できるようにするには、以下を使用する必要がありますvared
。
var=; vared var
代わりにIFS= read -r var
、stdinがその端末ではない場合でも、入力は常に端末のユーザーから読み取られることに注意してください。
zshインスタンスの行エディタがデフォルト値とは異なるキーバインディングを持つようにスクリプトを解釈し始めるには、zshインスタンスでこれらのコマンドを実行し、コマンドを使用してこれらのウィジェットを定義してzle
バインドbindkey
する必要があります。
これらのウィジェットを に追加して~/.zshenv
すべてzsh
^W
との場合、^U
zlezsh
ウィジェットがありますが、そのウィジェットを模倣(および強化)します。小さな部品ラインエディタ(and)の端末デバイスラインルール(カーネルのttyデバイスドライバにあります)erase
。kill
ラインエディタ(アプリケーションが独自のラインエディタを実装せずに端末から読み取るときに使用されます)は非常に基本的であり、コマンドを使用してバインドできるいくつかのウィジェット(、、、、... kill
)しかありません。より構成可能です。erase
eol
eof
stty