我知道可以在您键入的 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
( ) 的完成脚本 ( ) 中所示:_foo
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
以包含自定义目录时,请始终这样做前命令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
.