zshプロンプトに入力したときの警告の書き込み

zshプロンプトに入力したときの警告の書き込み

私はあなたが入力するzshプロンプト「外部」にテキストを表示することが可能であることを知っています。一般的な例は、次のように実行されます。

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

を押してTab待つ:

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

私が興味を持っているのは以下のテキストです--file--。一種の「zsh_echo_below_zle」はありますか?私の目的は次のとおりですので、キーボードやショートカットは気にしません。走るzleの出力を使用してください。愛

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 --

答え1

tab_message特定のコマンド()の完了スクリプト()に示すように、ZSH完了システム内でこの関数を使用して、コマンドの特定のパラメーターを混在させるとカスタムメッセージを生成できます。_foofoo

#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(カスタムディレクトリを含めるように変更する場合は、常にこれを実行してください。今後注文するautoload -U compinit && compinit。 )

ただし、コマンドラインでecho $(foo bar)█完了は次_fooのようになります。いいえマッシングの場合、tabこれはコマンドの置き換えなのでいいえオートコンプリートのfoo

コマンド置換中に置き換えられたコマンドには、直接実行されたかコマンド置換で実行されたかは表示されません(ZSH_EVAL_CONTEXTエクスポートにはtoplevel関係がないことを示す特殊変数があるにもかかわらず)。端末に書き込んだ後にカーソル位置を復元するそれは複雑である:

% 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混乱の危険があります。しかし、それはより多くのことです。

zshのコードは、タスクに対して特別なタスクを実行していないSrc/exec.cように見え、コマンドを置き換えるためのフック機能を呼び出しません。したがって。cmdsubstpreexeczsh

関連情報