如何为GNOME Terminal+Zsh配置终端输出边距?
如何为终端输出设置顶部和左侧边距?
我当前使用gnome-terminal + zsh + oh-my-zsh,已经给自定义双行提示符添加了顶部(通过\n)和左侧(通过空格)边距,配置如下:
TOP_MARGIN=$'\n' LEFT_MARGIN=' ' PROMPT_FIRST_LINE=${TOP_MARGIN}${LEFT_MARGIN} PROMPT_FIRST_LINE+='┌─ ➜ ' PROMPT_SECOND_LINE=${TOP_MARGIN}${LEFT_MARGIN} PROMPT_SECOND_LINE+='└─ > ' PROMPT=${PROMPT_FIRST_LINE}${PROMPT_SECOND_LINE}
现在需要让所有命令的终端输出也匹配这个样式,添加对应的顶部和左侧边距,可通过以下方式实现:
1. 左侧边距:给每一行输出添加前缀空格
通过zsh的preexec和precmd钩子,对命令的标准输出和错误输出进行过滤,给每一行开头添加左侧边距:
# 定义输出过滤函数,给每一行添加左侧边距 add_left_margin() { sed "s/^/$LEFT_MARGIN/" } # 命令执行前,将输出重定向到过滤函数 preexec() { # 跳过空命令(比如直接按回车) if [[ -n "$1" ]]; then # 处理标准输出和标准错误 exec > >(add_left_margin) 2> >(add_left_margin >&2) fi } # 命令执行后,恢复默认输出流 precmd() { exec >&- 2>&- }
2. 顶部边距:命令输出前添加换行
如果需要在命令输出的顶部(即提示符之后、输出内容之前)添加换行,可以修改preexec钩子,在设置输出过滤前先输出TOP_MARGIN:
preexec() { if [[ -n "$1" ]]; then # 输出顶部边距 echo -n "$TOP_MARGIN" exec > >(add_left_margin) 2> >(add_left_margin >&2) fi }
完整配置整合
将上述代码添加到你的自定义zsh主题配置中,最终配置如下:
TOP_MARGIN=$'\n' LEFT_MARGIN=' ' # 定义输出过滤函数 add_left_margin() { sed "s/^/$LEFT_MARGIN/" } # 命令执行前钩子 preexec() { if [[ -n "$1" ]]; then echo -n "$TOP_MARGIN" exec > >(add_left_margin) 2> >(add_left_margin >&2) fi } # 命令执行后钩子 precmd() { exec >&- 2>&- } # 原有提示符配置 PROMPT_FIRST_LINE=${TOP_MARGIN}${LEFT_MARGIN} PROMPT_FIRST_LINE+='┌─ ➜ ' PROMPT_SECOND_LINE=${TOP_MARGIN}${LEFT_MARGIN} PROMPT_SECOND_LINE+='└─ > ' PROMPT=${PROMPT_FIRST_LINE}${PROMPT_SECOND_LINE}
注意事项
- 如果你使用了其他oh-my-zsh插件,可能需要调整钩子的执行顺序,确保上述
preexec和precmd优先执行。 - 对于某些交互式命令(比如vim、htop),上述过滤可能会导致显示异常,你可以在
preexec中添加判断,跳过这类命令:
preexec() { local cmd="$1" # 跳过交互式命令,根据需要添加更多 if [[ -n "$cmd" && ! "$cmd" =~ ^(vim|htop|nano|less)$ ]]; then echo -n "$TOP_MARGIN" exec > >(add_left_margin) 2> >(add_left_margin >&2) fi }
内容的提问来源于stack exchange,提问作者Victor Valente
相关产品推荐
相关产品推荐

