我究竟该如何从获取 $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:)}
扩展为与终端宽度相同的空格字符串。这确保始终有足够的填充空格。