我有一些属于云环境的实例。它们的名称以 UUID 为后缀,例如:
<name-of-host>-411a7a0e-b409-46a0-bf8f-546ffc50ee2b
我不想隐藏它,因为它可以帮助我知道我在哪台机器上,所以我只想看到前 20 个字符。
我的默认提示如下:
PROMPT="[%n@%m %1~]%(#.#.$) "
因此,我的第一次尝试是:
PROMPT="[%n@%20>...>%m %1~]%(#.#.$) "
然而,这并不起作用,因为它显示如下:
user@name-of-host...<command prompt is right here>
然后我尝试这样做:
PROMPT="[%n@%{%20>...>%m%} %1~]%(#.#.$) "
它正确显示提示,但是当我尝试类似 bck-i-search( CTRL-R) 的操作时,里面的部分%{...%}
被覆盖。
ZSH 文档解释了原因:
%{...%} Include a string as a literal escape sequence. The string within the braces should not change the cur- sor position. Brace pairs can nest.
还有其他方法可以实现我的愿望吗?
答案1
%>>
您可以使用或 来结束截断 - 如“仅截断到这里” %<<
:
PROMPT="[%n%20>...>%m%>> %1~]%(#.#.$) "
以下是ZSH 手册:
要截断的提示字符串部分运行到字符串的末尾,或者到下一个封闭组的末尾
`%('
构造,或在同一分组级别遇到的下一个截断(即`%('
是分开的),以先到者为准。特别是,参数为零的截断(例如,`%<<'
) 标记要截断的字符串范围的结束,并从那里关闭截断。例如,提示`%10<...<%~%<<%# '
将打印当前目录的截断表示,然后是`%'
或者`#'
,然后是空格。没有`%<<'
,这两个字符将包含在要截断的字符串中。
答案2
由于主机名在各个命令之间不会改变,因此您可以将其作为文字字符串包含在 PROMPT 中,而不必使用%m
。
也就是说,
short_hostname="$(hostname|sed -e 's/-.*//')"
PROMPT="[%n@${short_hostname} %1~]%(#.#.$) "