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