如果太长则添加换行提示

如果太长则添加换行提示

我在 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 $ _

可以将其改进为像真正的软连字符一样,以考虑终端的自动边距和提示内已存在的换行符等;但这会让事情变得比它的价值更复杂。

相关内容