文字列を文字単位で読み取って処理しますが、ユーザーが入力に対して簡単な行編集を実行できるようにします。

文字列を文字単位で読み取って処理しますが、ユーザーが入力に対して簡単な行編集を実行できるようにします。

端末から入力行を徐々に読み、ユーザーにINS、DEL、右、左、終了、バックスペース機能を許可したいと思います。

文字列が変更されるたびにそれを処理して、テキストファイルに対して増分正規表現検索を実行したいと思います。

これらの編集キーと他のキーは複数の入力文字を生成するため、
入力を解釈するのは非常に困難です。たとえば、C-Leftは6文字を生成します。

文字ごとに編集可能な入力を簡単に取得する方法はありますか?
残りの処理はbashで行われるので、bashでこれを行う方法を知りたいです。他の提案も歓迎します。

それで始めましたが、潜在的な制御コードが多すぎて少し余裕がありませんでした。

#!/bin/bash
IFS=$'\n' 
while true ;do
  read -n 1 c
  ((${#c}==0)) && break # Exit the loop. Input length is 0  
                        # ie. The user has pressed Enter
  echo "xx=$(echo -n "$c"|xxd -p)="
  # 1b 5b 32 7e  "INS"
  # 1b 5b 33 7e  "DEL"
  # 1b 5b 43     "RIGHT"
  # 1b 5b 44     "LEFT"
  # 1b 5b 46     "END"
  # 1b 5b 48     "HOME"
  # 7f           "BACKSPACE"
done

ベストアンサー1

一度に1文字ずつ読み込む場合は、read -nキーシーケンスパーサを実装する必要があります。以下を使用して、ほとんどの端末で動作する遅くて汚れたソリューションを構築できます。エスケープ文字で始まり、任意の数の文字で続くファンクションキーエスケープシーケンスを考慮して、この文字セットにない0-9;[]O最後の文字が続きます。

入力を読み取るより良い方法は、適切な入力ライブラリを使用することです。 Bashはこれを独自の目的に使用します(読書船)。組み込みを使用してbind独自のキーバインディングを宣言すると、bind -xキーを押したときにシェルコマンドを実行するように特別に設計された制限付きインターフェイスを取得できます。制限されたインターフェイスのために、必要なものを実装することは可能かもしれませんが、難しいです。

Zshには独自の入力ライブラリがあります。ズラー。インターフェイスはbashよりはるかに豊富です。 zleを使用すると、任意のキーマップを定義でき、シェルコードからzleの内部機能にアクセスできます。zleカスタムコマンド(ウィジェットと呼ばれる)にシェル機能を割り当て、bindkey独自のキーマップを作成および入力し、最後にvared選択したキーマップを使用して入力行を読み取るために使用されます。

おすすめ記事