Bashスクリプトで$READLINE_LINEと$READLINE_POINTの値を変更する

Bashスクリプトで$READLINE_LINEと$READLINE_POINTの値を変更する

stackoverflowにこんな質問をしました。しかし、答えがなく、コメントもほとんどありません。私はより多くのbashユーザーがいる必要があり、誰かがこの問題を偶然見つけたかもしれないので、ここに投稿すると思いました。 ~によるとSO元、クロスサイトの投稿にリンクを掛けておくと大丈夫でしょう。私が間違っている場合は、お知らせください。質問を削除します。


カスタムスクリプトをキーにバインドして、パスオートコンプリートksh機能を使用していくつかの機能を実装しようとしています。bashこれを行うには、私のスクリプトはbind変数から情報を読み取り、$READLINE_LINE$READLINE_POINTを更新しようとします。問題なく行バッファを読み取ることはできますが、これらの変数を変更して現在の行を更新することはできません。

バインディングのマニュアルページを引用すると、次のように動作します。

シェルコマンドが実行されると、シェルはREADLINE_LINE変数をreadlineラインバッファの内容に設定し、READLINE_POINT変数を挿入ポイントの現在位置に設定します。実行されたコマンドがREADLINE_LINEまたはREADLINE_POINTの値を変更すると、これらの新しい値は編集状態に反映されます。

私のスクリプトをと組み合わせて、bind -x '"\t":autocomplete.sh'次のことをしました。

#!/bin/bash
#autocomplete.sh
echo $READLINE_LINE $READLINE_POINT   #I can read the current line values
EXPANSION=($(magical_autocomplete $READLINE_LINE))
#we store the desired value for the line in ${EXPANSION[0]}
[[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1} #we echo the match if there are more than 1

READLINE_LINE=${EXPANSION[0]}
READLINE_POINT=${#READLINE_LINE}
#echo READLINE_LINE READLINE_POINT echoes the correct values found by magical_autocomplete
#however the current line & the current point is not updated

一部の情報をエコーすると、スクリプト出力を呼び出しにリダイレクトでき$READLINE_LINEませんbind。変数を読み取ることはできますが、書き込めないのはなぜですか?

ベストアンサー1

同じ理由でこれは機能しません。

$ export a=1
$ bash -c 'echo $a; let a++'
1
$ echo $a
1

環境変数は遺伝学、共有できません。新しい子プロセスとして実行されるため、autocomplete.sh親プロセスのすべての変数を読み取ることができますが、新しい値をプッシュバックすることはできません。

READLINE_LINEを変更するには、READLINE_POINT同じプロセスでオートコンプリートを実行する必要があります。sourceこの機能が役に立ちます。

# autocomplete.sh
# should be sourced from ~/.bashrc or something

autocomplete() {
    echo $READLINE_LINE $READLINE_POINT
    EXPANSION=($(magical_autocomplete $READLINE_LINE))
    #we store the desired value for the line in ${EXPANSION[0]}
    [[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1}

    READLINE_LINE=${EXPANSION[0]}
    READLINE_POINT=${#READLINE_LINE}
}

束:

if [[ -s "$HOME/.bashrc.d/autocomplete.sh" ]]; then
    source "$HOME/.bashrc.d/autocomplete.sh" 
    bind -x '"\t" : autocomplete'
fi

おすすめ記事