gpt4 book ai didi

command-prompt - 绘制ZSH提示时获取当前光标位置

转载 作者:行者123 更新时间:2023-12-03 22:27:02 27 4
gpt4 key购买 nike

我正在尝试从绘制 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 访问该信息。
编辑:如果用户在显示提示之前已经输入了命令的开头,则不应丢弃该输入。到目前为止,我找到的解决方案(请参阅下面我自己的答案)很不幸地读取并删除了这些字符。这令人沮丧,因为当我打开一个新的终端窗口并立即开始输入时,在提示出现之前输入的字符将被丢弃。

最佳答案

直接阅读 /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` '

关于command-prompt - 绘制ZSH提示时获取当前光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43911175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com