如何在 zsh 小部件的提示下方打印彩色文本?

Pom*_*oma 7 shell terminal zsh zsh-zle

我想创建一个绑定到热键的小部件,该热键在提示下方以富文本格式打印当前命令描述,然后在按键后将其删除。像这样(简化):

\n
widget() {\n  zle -R "ls - list files"\n  read -k 1\n}\nzle -N widget\nbindkey '\\eg' widget\n
Run Code Online (Sandbox Code Playgroud)\n

zle -R只能打印纯文本,甚至不支持换行。我想打印带有颜色和换行符的文本,例如^[[31mls^[[00m - list files.

\n

我可以使用什么方法来做到这一点?

\n

对于我的用例来说,仅将其打印到常规标准输出然后初始化新提示将是一个糟糕的用户界面。这将是一个不受欢迎的解决方案。

\n

我希望它出现在提示符下方,并且与 zsh-autocomplete、ctrl+R 或 fzf 类似地工作。输出没有任何复杂的交互,它只出现在热键上,然后在按键时消失。

\n

zsh-autocomplete 存储库的作用类似,但我不知道它是如何完成的。

\n

Jam*_*ner 3

当您使用时zle -R,您最终会调用内部的函数zsh。之后的第一个参数-R存储在 中statusline。此处进行了检查,并删除了可能会意外修改屏幕的任何字符。因此, 2011 年的邮件列表问题至今仍然存在。

在查看了zsh-autocomplete中的钩子和代码后,我现在明白这是通过在积极使用自动完成的同时使用 zsh 中对颜色突出显示的内置支持来实现的。

由于您只希望有一个按键绑定来显示状态行并等待击键,因此您需要编写(用 C 语言)一个模块来显示当前缓冲区并等待击键。这将要求您跟踪光标位置并保持 zsh 期望的相同状态。

示例模块是一个开始。您将需要使用 来编译它zsh,因为构建脚本使用.mdh/.pro.mdd模块创建文件所需的工具来构建所有模块。

这是一个更新的小部件,演示了各种选项:

widget() {
  autoload -Uz colors && colors
  PREDISPLAY="PRE:"
  POSTDISPLAY="${fg[red]}POST$reset_color"
  zle -R "$BUFFER" "${fg[red]}line below$reset_color"
  print "${fg[red]}print$reset_color"
  read -k 1
}
zle -N widget
Run Code Online (Sandbox Code Playgroud)

请注意,您无法控制状态行的显示,它已删除所有特殊字符。正确print地允许特殊字符,但仅限于输入行(而不是状态行)。PRE/POST 也仅适用于输入行,并且也会去除特殊字符。

我可以使用什么方法来做到这一点?

  • 编写您自己的模块。这是最好的办法。
  • 您可以根据print需要对其进行着色,但您仍然需要确保屏幕位置按zsh预期保持。