私は知っている事前実行()zsh のフックと、これを bash で実現する方法。(リンク)
でも、現在の入力まだ入力中ですか?
この質問の背後にある考え方は次のとおりです。
コマンド、引数、ショートカットをより早く習得できるようにするために、入力中のコマンドを「ヘルプ / 知っておくと便利な情報 / ショートカット」のヒントを提供する「データベース」で検索し、他のセッションで入力中に screen/tmux を使用してこれらのヒントを別のセッションに表示したいと考えています。
現在入力されているコマンドを確認することは可能ですか? キー入力ごとに機能しない場合は、タイマー ループも機能する可能性があります。
答え1
私がお答えできるのはzsh
、これが実行可能な場合のみです。
まず、すでにいくつかのウィジェットがあります増分完了最初のものは藤井勇二氏のものらしい。そのサイト日本語なので、日本語を話さなくても、仕組みや使い方を簡単に理解できます。 オートフーオリジナルのスクリプトの拡張です。
zsh
ここまでは参考文献です。zsh ラインエディタ( zle
) はコマンドラインの対話的な使用を担当します。ウィジェットに提供される他の多くの変数とは別に ( を参照man zshzle
)、これらは、現在のコマンドライン:
$バッファ: 編集バッファの内容全体。
$Lバッファ: カーソル位置の左側にあるバッファの部分。
$Rバッファ: カーソル位置の右側にあるバッファの部分。
これらの変数は書き込み可能であり、現在のコマンド ラインが変更されます。
各キーストロークをキャプチャするには、または をself-insert
除くすべてのキーストロークに対して (デフォルトで) 実行されるウィジェットを変更します。次の例は、特に役に立つことは何もしませんが、キーストロークごとに にドットを追加します。これは、これがどのように機能するかを示すためです。LF
CR
$RBUFFER
function self-insert() {
RBUFFER+="."
# execute some other command, but ensure they don't produce any output.
zle .self-insert
}
zle -N self-insert
.self-insert
組み込みウィジェットなので、無限ループに陥ることはありません。
したがって、最初から始めることも、Fujii のスクリプトから始めてそれを修正することもできます。後者の利点の 1 つは、ここでは省略したキーストロークの削除の処理も実行できることです。
答え2
test.sh
Bash の場合は次のスクリプトを作成できます。
#!/usr/bin/env bash
ARRAY=('1' '2' '3' '4' '5' '6' '7' '8' '9' '0' '-' '=' 'BACKSPACE' ''
'q' 'w' 'e' 'r' 't' 'y' 'u' 'i' 'o' 'p' '[' ']' 'NEWLINE' ''
'a' 's' 'd' 'f' 'g' 'h' 'j' 'k' 'l' ';' "'" '' '' '' 'z' 'x' 'c'
'v' 'b' 'n' 'm' '0' ',' '.' '/' '' '' 'SPACE')
while read row
do
if [[ "$row" == *press* ]]
then
index=$((${row/key press /}-10))
if [[ "${ARRAY[$index]}" == 'NEWLINE' ]]
then
printf "\n"
elif [[ "${ARRAY[$index]}" == 'BACKSPACE' ]]
then
echo -ne "\b \b"
elif [[ "${ARRAY[$index]}" == 'SPACE' ]]
then
printf " "
else
printf "%s" "${ARRAY[$index]}"
fi
fi
done
これは、いくつかのキーボード コードを受信し、それを画面に表示する単純なスクリプトです。キーボード コードをスクリプトに渡します。
$ stdbuf -o0 xinput test 'AT Translated Set 2 keyboard' | bash test.sh
これで、別の端末で入力すると、キー値が受信されるはずです。キー コードを ASCII 値にマッピングする賢い方法があるかどうかはわかりませんので、ここでは単純なマッピングだけを行います。このコードを改良して、他のキーにも反応するようにすることもできます。ただし、スクリプトは、特定の端末に渡されるだけでなく、すべてのキーボード入力を受信することに注意してください。
タスク自体(現在入力されているコマンドの確認)に関しては、compgen -c
渡された引数に基づいて可能な補完のリストを生成するために使用できます。
$ compgen -c 'ls' | head -1
ls
$ compgen -c 'lsp' | head -1
lspci