PS1 是幽灵文本吗?

PS1 是幽灵文本吗?

我究竟该如何从获取 $PS1 的值开始,并在背景中首先放置带有文本的分隔符?我收到了一个建议,将文本输出到终端,然后发送 len(expanded_PS1) 非破坏性退格键。(最好在输入文本后也清除,甚至可能显示提示是否被清除)

答案1

你可以(误)使用RPROMPT而不是PROMPT(又名PS1)来实现这一点,或者至少是类似的东西

RPROMPT显示在提示符的同一行上,右对齐。如果您输入的命令足够长,可以到达提示符,RPROMPT则会自动隐藏(如果您删除了足够多的内容,也会重新出现)。

因此,您可以将 设置PROMPT为仅包含提示字符,并将其他所有内容放入RPROMPT。然后用RPROMPT空格填充,直到填满行的其余部分,以便它几乎接触PROMPT。例如

setopt PROMPT_SUBST
PROMPT='%# '
RPROMPT='%$((COLUMNS-4))>> %n@%m %~${(r:$COLUMNS:)}'

这应该显示类似

% ▒ user@machine ~

光标的位置在哪里。一旦您开始输入,其后的所有内容都会被隐藏。例如

% echo foo▒

解释:

  • setopt PROMPT_SUBST每次显示提示时都可以替换提示中的参数。
  • RPROMPT需要在单引号中定义,以便其中的参数不会在定义时立即展开,而只会在显示提示符后展开(启用PROMPT_SUBST)。这确保即使调整终端窗口大小,填充也能正常工作。
  • %#是提示字符:用于其他所有人的#根。%
  • $COLUMNS是终端的当前宽度。
  • %n>>将其右侧的所有内容截断为n字符,并在右侧进行剪切。
  • $((COLUMNS-4))计算左提示符 ( PROMPT) 后的剩余宽度。除了 中的两个字符外,PROMPT您还需要减去一个光标字符和一个因为RPROMPT不覆盖一行的最后一列的字符。(如果您想使用PROMPT可变长度的 ,则必须动态计算其长度。)
  • %n@%m %~仅仅是一个示例,显示用户名(%n)、机器名称(%m)和当前目录(%~)。
  • ${(r:$COLUMNS:)}扩展为与终端宽度相同的空格字符串。这确保始终有足够的填充空格。

相关内容