bash
実行できる端末ウィンドウがあります。ただコマンドを発行してくださいfoo
。だから私はすべての行(もちろんプロンプトの後)が「foo」で始まり、関数名の代わりに関数のオプションとパラメータを入力するだけです。もちろん、自動的に挿入された文字列を変更できればと思いますが、これは必要ない私のため。
はい
何も入力せずに端末を開くと、私が見たい内容は次のとおりです。
user@host:~/ $ foo
次に、を入力して--option argument
キーを押すと、指定されたEnter合計で関数が呼び出されます。foo
--option
argument
私が試したこと
私はあちこちを見て使ってみましたが、驚くべきことに実際に動作しますが、$PS1
残念ながら「foo」も印刷されます。$PROMPT_COMMAND
xdotool type "foo "
今後プロンプトは非常に醜いです。
user@host:~/ $ PROMPT_COMMAND='xdotool type "foo "'
foo user@host:~/ $ foo
私もそのpreexec
機能を見つけて使ってみましたRyan Calorasのbash-preexecスクリプトしかし、まったく同じ問題があります。
行末でカーソルが点滅するようにプロンプトに((実行可能)文字列)をエコーします.関連していますが、そこに答えると、--option argument
実行するコマンドに何か()を追加できませんでした。まだテストしたことはありません。このように簡単なこともzsh
解決策があるべきではないでしょうか?bash
答え1
の場合は、zsh
次の事項に関する質問でなければなりません。
precmd() print -z 'foo '
または、ユーザーの待機中のコマンドを上書きしないようにするには、次のようにしますAlt+q。
zle-line-init() { [ -n "$BUFFER" ] || LBUFFER='foo '; }
zle -N zle-line-init
bash
代わりに、xdotool
次のことができますTIOCSTI
ioctl
。
insert() {
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV' -- "$@"
}
PROMPT_COMMAND='insert "foo "'
これは、読み取っているデバイスの入力バッファxdotool
にこれらの文字を直接挿入するため、これが望ましいです。bash
これは、Xサーバーが実行されている場合にのみ機能します(たとえば、コンソールまたは物理端末で、またはそうでxdotool
ない場合)。これは識別されたサーバーであり、対話するサーバーです。そして端末が実行するエミュレータです。実行中です。評価時に焦点が合っています。ssh
-X
$DISPLAY
bash
$PROMPT_COMMAND
これで、あなたのxdotool
場合と同様に、プロンプトが表示される前にこれがioctl()
完了し、ttyターミナルラインルールがモードで読み取られるので、icanon+echo
次のことがわかります。エコfoo
ttyラインルールがディスプレイを混乱させた場合。
文字列を挿入することでこの問題を解決できます。エコ表示されず(Unicodeロケールのみを使用している場合はU + 200Bと同様)、挿入されたジョブにバインドされます"foo "
。
insert() {
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV' -- "$@"
}
bind $'"\u200b":"foo "'
PROMPT_COMMAND="insert $'\u200b'"
TIOCSTI
あるいは、readlineが初期化する時間を持つようにioctlを十分に長く遅延させることもできます。
insert_with_delay() {
perl -le 'require "sys/ioctl.ph";
$delay = shift @ARGV;
unless(fork) {
select undef, undef, undef, $delay;
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV;
}' -- "$@";
}
PROMPT_COMMAND='insert_with_delay 0.05 "foo "'
メソッドのようにzsh
プロンプトを表示する前にユーザーがテキストを入力する状況を処理するには、次のようにします。
- 流れる
tcflush(0, TCIFLUSH)
ioctlperl
の前にaを実行して(オプションTIOCSTI
も必要です-MPOSIX
)、または 同様に、
zsh
前(最後に移動)と後((デフォルト)編集モード)を使用すると仮定し、カーソルを行の先頭に移動してfoo
バッファの先頭に挿入する必要があります。^A
emacs
foo
^E
insert_with_delay 0.05 $'\1foo \5'
または
bind $'"\u200b":"\1foo \5"'
答え2
あなたが要求するものは一般的ではないと聞こえるので、これを行う簡単な方法がないことは驚くべきことではありません。
純粋なbashを使用すると、組み込みread
関数を使用して行を読み取ってeval
実行できます。模擬チップ(以下におおよそのヒントを示します)。
#!/bin/bash
PROMPT=$'\e[1m'$USER@$HOSTNAME:$PWD$' $ \e[0m'
IFS= read -r -e -i "foo " -p "$PROMPT" line
eval "$line"
exit
これをスクリプトに入れ、端末エミュレータにスクリプトを実行するように指示します。
または、ターミナルエミュレータでScreenを実行してください。そのstuff
コマンドを使用して入力をシミュレートできます。