現在のターミナルライン(ユーザーが編集可能なライン)をどのように取得しますか?

現在のターミナルライン(ユーザーが編集可能なライン)をどのように取得しますか?

現在のユーザー入力行をシェル関数の変数として使用する方法が必要です。

私の現在のコードはctrl + rを介して呼び出すことができます。

zle -N search

bindkey "^R" search

search () {
read str;
fc -ln -30 | grep $(printf "%q\n" "$str");
}

それとも単に関数と呼んでください。

search () {
fc -ln -30 | grep $(printf "%q\n" "$1");
}

更新:ターゲット疑似コード(ctrl + rで呼び出される関数呼び出し)、追加の入力プロンプトは必要ありません

zle -N search

bindkey "^R" search

search ()
echo ""; #for better formatting because ctrl+R is not enter so the BUFFER(current line) gets corrupted and looks messy and the current input is not correctly shown
fc -ln -30 | grep $(printf "%q\n" "$BUFFER"); #edited to be the solution where $BUFFER is the current terminal line
}

答え1

zleウィジェットでは、編集バッファの内容を変数で使用できます$BUFFER$LBUFFERカーソルの左側の内容(と同じ$BUFFER[1,CURSOR-1])と$RBUFFER右側の内容(と同じ$BUFFER[CURSOR,-1])を含みます。

これまでに入力した文字列(最後の30文字)を含む以前のコマンドラインレポートを印刷するウィジェットの場合は、次のことができます。

search() {
  zle -I
  print -rC1 -- ${(M)${history:0:30}:#*$BUFFER*}
}
zle -N search
bindkey '^R' search

関連情報