【问题标题】:Get current cursor position while drawing ZSH prompt绘制 ZSH 提示时获取当前光标位置
【发布时间】:2017-05-11 09:11:39
【问题描述】:

我正在尝试从绘制 ZSH shell 提示符的函数中将当前光标位置(当前行号和列)读入变量中。我的目标是在提示下方显示内容,前提是有足够的空行不会导致额外的滚动。

在交互式 shell 中,我可以使用以下命令:

echo -ne "\033[6n"
read -t 1 -s -d 'R' line
line="${line##*\[}"
line="${line%;*}"
echo "XX $line XX"
# Prints: XX 2 XX"

但是,如果我启动一个干净的zsh -f,并将其放入在呈现提示时执行的函数中,它将停止工作:

setopt prompt_subst
prompt_fn(){
  echo -ne "\033[6n"
  read -t 1 -s -d 'R' line
  line="${line##*\[}"
  line="${line%;*}"
  echo "XX $line XX"
}
PROMPT='`prompt_fn` '

终端返回的 ANSI 转义序列被附加到当前命令(就像我在键盘上键入一样),但不会被上面的 read -t 1 -s -d 'R' line 命令吞噬。我怀疑 ZSH 在绘制提示时禁用了对 STDIN 的访问,但我不知道如何暂时重新获得对它的访问(在绘制提示之前键入的正常键盘击键,或者在绘制提示的十分之一秒内不应该是截获),或如何使用 ZLE 访问该信息。

编辑:如果用户在显示提示之前已经键入了命令的开头,则不应丢弃该输入。到目前为止,我找到的解决方案(请参阅下面我自己的答案)不幸地读取并删除了这些字符。这很令人沮丧,因为当我打开一个新的终端窗口并立即开始输入时,在提示出现之前输入的字符会被丢弃。

【问题讨论】:

    标签: command-prompt zsh ansi-escape zsh-zle


    【解决方案1】:

    直接从/dev/tty 读取似乎主要工作,但它仍然吞噬在prompt_fn 开头和read 命令之间键入的任何输入。如果prompt_fn 在到达那个点之前做了一些工作,它可能会导致一些用户输入被丢弃。希望有人会提出更好的解决方案。

    setopt prompt_subst
    prompt_fn(){
      echo -ne "\033[6n" > /dev/tty
      read -t 1 -s -d 'R' line < /dev/tty
      line="${line##*\[}"
      line="${line%;*}"
      echo "XX $line XX"
    }
    PROMPT='`prompt_fn` '
    

    【讨论】:

      【解决方案2】:

      也许您想根据这些文档查看minibuffer

      http://zsh.sourceforge.net/Guide/zshguide04.html

      “minibuffer”是另一个 Emacs 概念;这是一个提示 出现在命令行下方,供您输入一些编辑 编辑器本身要求的。

      我在 zsh 插件中使用它来打印光标下命令的帮助。我只显示文本,但你应该可以用它做其他事情。

      cheat buffer example

      您还可以在zsh widgets here上找到一些信息

      这可能是相关的:

      BUFFERLINES(整数)

      当前在屏幕上显示的编辑缓冲区所需的屏幕行数(即在上次重新显示后没有对前面的参数进行任何更改);只读。

      【讨论】:

      • 感谢您的回答。 BUFFERLINES 表示提示的高度,而不是窗口剩余部分的高度。它也仅在 ZLE 内部可用,但带有prompt_subst 的提示不会在“zle 模式”下执行。我找不到cheatbuffer 的任何来源或网页。
      • 啊,我明白你在说什么。我指的cheatbuffer是我在试验zsh时写的一个小项目:github.com/trungng92/cheatbuffer但不幸的是我没有得到窗口剩余高度的答案。
      猜你喜欢
      • 2011-09-19
      • 2013-10-26
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多