我在 bash 提示符中显示完整的工作目录以及其他信息(git 等),有时它会变得很长。
我想在提示符末尾添加换行符,以便可以在下一行键入命令,但是仅当提示很长时例如超过 50 个字符。
| ~ $ Typing a command here is nice |
| ~/foo/longDirectoryName/longsubirectory/src/package (master +*) $ Typing here s|
| ucks. I want to just start on a new line |
显然,如果我想总是在下一行输入我的命令,我可以添加一个换行符PS1
(如这个帖子)。但我还没有找到有条件地执行此操作的方法,因为PS1
它只是一个格式字符串。
PS 我实际上正在使用 ZSH 尝试自定义 Agnoster 主题,但我想任何针对 bash 的解决方案通常都会有所帮助。
答案1
在 中zsh
,这就是%<number>(l:<yes>:<no>)
快速扩展的目的。当数字为负数时,如-30
,如果距离屏幕右边缘至少还剩下 30 个字符,则yes
输出文本,否则no
,所以:
PS1=$'%~%-30(l::\n)$ '
"$ "
如果该行上可供使用的字符少于 28 个(30 减去 ),则会插入换行符。
你可以做你的50个或以上和:
PS1=$'%~%50(l:\n:)$ '
但在我看来,保证最小可用空间比最大不可用空间更有用。
看手册了解详情。您会发现其他指令来截断长提示并用省略号替换,例如您可能也会发现这些指令很有用。
请注意,zsh 提示符扩展与bash
.它实际上更接近 的解tcsh
,因此 的解bash
不太可能对 有用zsh
,尽管反过来通常更正确。
答案2
在较新版本的 中bash
,您可以结合PROMPT_COMMAND
变量${var@P}
替换的形式(“像提示一样展开”)。
这是一种方法。您只需设置OPS1
而不是PS1
您想要的提示。这\-
逃进里面OPS1
会像软连字符: 当提示符长于COLUMNS / 2
;时,它将扩展为换行符。否则它将被删除:
generate_ps1(){
local ps1=${OPS1@P}
if [ "${#ps1}" -gt "$((COLUMNS / 2))" ]; then PS1=${OPS1//\\-/$'\n'}
else PS1=${OPS1//\\-/}
fi
}
OPS1=$PS1
PROMPT_COMMAND=generate_ps1
# after this, set OPS1 instead of PS1 to the prompt you want
$ OPS1='$long_var\-\$ '
$ long_var=$(printf 'foobar %.0s' {0..21})
foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foo
bar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar
$ _
$ long_var=$(printf 'foobar %.0s' {0..2})
foobar foobar foobar $ _
可以将其改进为像真正的软连字符一样,以考虑终端的自动边距和提示内已存在的换行符等;但这会让事情变得比它的价值更复杂。