プロンプトに入力される文字ごとに bash または zsh で関数を実行するにはどうすればよいでしょうか?

プロンプトに入力される文字ごとに bash または zsh で関数を実行するにはどうすればよいでしょうか?

私は知っている事前実行()zsh のフックと、これを bash で実現する方法。(リンク

でも、現在の入力まだ入力中ですか?

この質問の背後にある考え方は次のとおりです。

コマンド、引数、ショートカットをより早く習得できるようにするために、入力中のコマンドを「ヘルプ / 知っておくと便利な情報 / ショートカット」のヒントを提供する「データベース」で検索し、他のセッションで入力中に screen/tmux を使用してこれらのヒントを別のセッションに表示したいと考えています。

現在入力されているコマンドを確認することは可能ですか? キー入力ごとに機能しない場合は、タイマー ループも機能する可能性があります。

答え1

私がお答えできるのはzsh、これが実行可能な場合のみです。

まず、すでにいくつかのウィジェットがあります増分完了最初のものは藤井勇二氏のものらしい。そのサイト日本語なので、日本語を話さなくても、仕組みや使い方を簡単に理解できます。 オートフーオリジナルのスクリプトの拡張です。

zshここまでは参考文献です。zsh ラインエディタ( zle) はコマンドラインの対話的な使用を担当します。ウィジェットに提供される他の多くの変数とは別に ( を参照man zshzle)、これらは、現在のコマンドライン:

$バッファ: 編集バッファの内容全体。

$Lバッファ: カーソル位置の左側にあるバッファの部分。

$Rバッファ: カーソル位置の右側にあるバッファの部分。

これらの変数は書き込み可能であり、現在のコマンド ラインが変更されます。

各キーストロークをキャプチャするには、または をself-insert除くすべてのキーストロークに対して (デフォルトで) 実行されるウィジェットを変更します。次の例は、特に役に立つことは何もしませんが、キーストロークごとに にドットを追加します。これは、これがどのように機能するかを示すためです。LFCR$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.shBash の場合は次のスクリプトを作成できます。

#!/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

関連情報