在 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在 ZSH 完成系统内部,可以通过该函数在混合命令的特定参数时生成自定义消息,如特定命令_message( ) 的完成脚本 ( ) 中所示:_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并没有为cmdsubst作业做任何特殊的事情,并且preexec也没有调用钩子函数来进行命令替换。因此,在zsh.

相关内容