web-dev-qa-db-ja.com

zshプロンプトの入力中に警告を書き込む

入力している場所にzshプロンプトの「外側」にテキストを表示できることを知っています。一般的な例は完了です。

myhost Wed 8 10:06 ~/sandlot 
$ e .py█

押す Tab、etvoilá:

myhost Wed 8 10:06 ~/sandlot 
$ e .py█
 -- file --
lenum.py           lexample.py        otherticks.py

私が興味を持っているのは、以下の--file--からのテキストです。なんらかの「zsh_echo_below_zle」か何かがありますか。私の意図はrunであり、zleで出力を使用することなので、キーボードやショートカットについては気にしません。 S.a.

myhost Wed 8 10:06 ~/sandlot 
$ some_command $(some_command_with_warning)█

押す Tab、および

myhost Wed 8 10:06 ~/sandlot 
$ some_command some_output█
 -- warning: some_output is about yadda yadda yadada --
3
Felipe Lema

ZSH完了システム内で、マッシング時のカスタムメッセージ tab コマンドの特定の引数については、特定のコマンド(foo)のこの完了スクリプト(__message_)に示すように、__foo_関数を介して可能です。

_#compdef foo

local curcontext="$curcontext" state

_arguments -C -s \
  '1: :->dofoo' \
  && return 0

case "$state" in
  dofoo)
    _message -r " -- warning: lp0 on fire"
    _values "parameters" $(_call_program getparam echo aaa bbb)
  ;;
esac
_

例えば。

_% ls $fpath[*]/_foo 2>/dev/null
/Users/jdoe/.zsh/functions/_foo
% rm ~/.zcompdump && exec zsh
% function foo () { echo "$@" }
% foo █
 -- warning: lp0 on fire
aaa  bbb          
_

(カスタムディレクトリを含めるように_$fpath_を変更する場合は、必ずbefore_autoload -U compinit && compinit_コマンドを実行してください。)

ただし、コマンドラインがecho $(foo bar)█の場合、補完__foo_はnot tab これはコマンド置換であり、notfooのオートコンプリートであるため、マッシュされます。

コマンド置換中、置換されるコマンドは、直接実行されているのか、コマンド置換として実行されているのかを示しません(エクスポートでは、toplevelのみを示す特別な_ZSH_EVAL_CONTEXT_変数があります)、および への書き込みターミナルからカーソル位置を復元する 複雑になります:

_% cat awkward 
#!/bin/zsh
echo -ne "\e7\n -- warning: lp0 on fire\e[F\e8" >/dev/tty; echo blat
% ./awkward 
blat
% echo $(./awkward)
_

...プロンプトが画面の下部に表示されているかのように、それはほとんど完璧ではありませんが、恐ろしいバグのあることが起こります。

_% echo -ne "\e[$LINES;0H"
...
% ./awkward 

blatwarning: lp0 on fire
% echo $(./awkward )
 -- warblat         fire
_

より複雑なプログラムは、ターミナルの下部にあることを適切に処理する必要があります。または、移植性のためにncursesを使用する必要があります。また、何らかの方法でzshに、書き込まれたカスタム行をクリアする必要があることを示す必要があります。表示は、後続のコマンドの出力で混乱するリスクはありません。しかし、それはもっと手間がかかります。

_Src/exec.c_のzshコードは、cmdsubstジョブに対して特別なことをしているようには見えません。また、コマンド置換のためにpreexecフック関数も呼び出されません。そのため、zshでのコマンド置換の実行中に、カスタムのプロンプト以下の端末メッセージングの単純なものは実際には見られません。

1
thrig