【问题标题】:zsh new line prompt after each command每个命令后的 zsh 换行提示
【发布时间】:2023-03-08 19:09:01
【问题描述】:

我可以将提示配置为在每个命令后显示一个新行吗?

给你一个例子。在下面的屏幕截图中,我确实运行了cat .zshrc。我想在命令的最后一个输出行 . ~/.zsh_aliases~ $ 之间有一个新行。

【问题讨论】:

    标签: zsh zsh-zle


    【解决方案1】:

    编辑 ~/.zshrc 并添加行 precmd() { print "" }。这将在呈现 PROMPT 之前简单地打印一个空行。

    【讨论】:

    • 谢谢!完美的解决方案。
    • 这行得通,问题是它在每个提示之前打印一个新行,即使你启动了 shell!有什么办法吗??
    • @Sethen 我知道这已经有两年多了,但你的问题很常见。我已经提交了对此答案的修改(仍然是热门搜索结果),以解决这个问题。
    • @Ben 您的编辑未被接受,能否分享您的解决方案。
    • 在第一个提示中跳过空行的一种方法是将precmd() { print "" } 包装在precmd() { … } 中。请稍作解释,查看我对此效果的回答。
    【解决方案2】:

    一些现有解决方案的变体,我发现它比使用魔术变量和条件更简洁:

    precmd() {
        precmd() {
            echo
        }
    }
    

    这会在除第一个提示之外的每个提示之前放置一个空行:第一个 precmd 调用所做的只是将 precmd 替换为调用 echo 的函数。

    【讨论】:

    • 完美答案!当顶部不需要换行符时,是否有可能为“清除”设置例外?
    • 我不这么认为。您可以将clear 别名为可以通过这种方式重新定义precmd 的东西,但在这一点上,魔术变量和条件变量可能也会更清晰。您可能还需要以某种方式更改 zle 中的 Ctrl-L 行为,以便它也可以执行此操作。我不确定这是怎么做到的。
    【解决方案3】:

    另一种方法是在~/.zshrc 中设置一个包含换行符的自定义提示。例如:

    autoload -Uz promptinit
    promptinit
    
    PROMPT="
    %n@%m:%~ $ "
    

    【讨论】:

    • 这就是我最终避免在每个新提示之前换行的方式。
    【解决方案4】:

    接受的答案(由@abid-h-mujtaba 撰写)总是打印换行符,即使在第一次加载 shell 时也是如此。我提交了一个编辑,无论出于何种原因,都没有被接受。

    这是我在personal dotfiles 中使用的(参见zshrc 中的“窗口配置”):

    function precmd() {
        # Print a newline before the prompt, unless it's the
        # first prompt in the process.
        if [ -z "$NEW_LINE_BEFORE_PROMPT" ]; then
            NEW_LINE_BEFORE_PROMPT=1
        elif [ "$NEW_LINE_BEFORE_PROMPT" -eq 1 ]; then
            echo "\n"
        fi
    }
    

    【讨论】:

    • echo "\n" 似乎为我打印了两个空白行,但 echo "" 效果很好。
    • 非常感谢您的回答
    • 适用于“重置”、“清除”和命令之间,但它不会在 CTRL+l 之后添加换行符。
    【解决方案5】:

    以下作品:

    导出 PS1='
    其他文字 - blah$'

    【讨论】:

    • 这个答案对于那些希望在提示字符串添加换行符的人很有帮助。我的兴趣是在 $ 字符之前放置一个换行符。这会使提示文本保留一行,而实际的 $ 提示则保留在新行上。
    【解决方案6】:

    我知道这有点老了,但我找到了一种方法,即使它不是很干净,我也只是想分享一下:

    function precmd {
        if [[ "$NEW_LINE" = true ]] then
            if [[ "${ADD_NEW_LINE}" = true ]] then
                PROMPT=$'\n'"${PROMPT}"
                ADD_NEW_LINE=false
            fi
        else
            PROMPT="${PROMPT}"
            NEW_LINE=true
            ADD_NEW_LINE=true
        fi
    }
    

    希望对你有帮助

    【讨论】:

      【解决方案7】:

      用户926352

      接受的答案(由@abid-h-mujtaba 撰写)总是打印换行符,即使在第一次加载 shell 时也是如此。我提交了一个编辑,无论出于何种原因,都没有被接受。这是我在个人 dotfiles 中使用的(参见 zshrc 中的“窗口配置”):function precmd() { # Print a newline before the prompt, unless it's the # first prompt in the process. if [ -z "$NEW_LINE_BEFORE_PROMPT" ]; then NEW_LINE_BEFORE_PROMPT=1 elif [ "$NEW_LINE_BEFORE_PROMPT" -eq 1 ]; then echo "\n" fi }

      我使用了这个答案,但不想在清除后换行。所以我补充说:

      alias clear="unset NEW_LINE_BEFORE_PROMPT && clear"
      

      只是替换 clear 也取消设置新的 line 变量。

      注意: 编辑了上面的建议,因为我正在分配一个函数来清除,它先是未设置然后再清除。这使它成为递归的,所以我最终达到了嵌套函数的极限。哎呀:)。不过,您可以这样做,它更简单、更安全。抱歉,如果有人在编辑之前发现了此内容。

      【讨论】:

        【解决方案8】:

        在 Ubuntu 18.04 上使用 zsh 和 oh-my-zsh、git 支持和 ZSH Powerlevel9k 主题,如下所述安装: https://linuxhint.com/install_zsh_shell_ubuntu_1804/

        在新行打开时获得提示:

        /usr/share/powerlevel9k/powerlevel9k.zsh-theme

        寻找函数left_prompt_end()

        函数在 orig 中是这样的:

        # End the left prompt, closes the final segment.
        left_prompt_end() {
          if [[ -n $CURRENT_BG ]]; then
            echo -n "%k%F{$CURRENT_BG}$(print_icon 'LEFT_SEGMENT_SEPARATOR')"
          else
            echo -n "%k"
          fi
          echo -n "%f$(print_icon 'LEFT_SEGMENT_END_SEPARATOR')"
          CURRENT_BG=''
        }
        

        只需添加一个换行命令。该函数现在应该如下所示:

        # End the left prompt, closes the final segment.
        left_prompt_end() {
          if [[ -n $CURRENT_BG ]]; then
            echo -n "%k%F{$CURRENT_BG}$(print_icon 'LEFT_SEGMENT_SEPARATOR')\n"
          else
            echo -n "%k"
          fi
          echo -n "%f$(print_icon 'LEFT_SEGMENT_END_SEPARATOR')"
          CURRENT_BG=''
        }
        

        下一行是从:

        echo -n "%k%F{$CURRENT_BG}$(print_icon 'LEFT_SEGMENT_SEPARATOR')"
        

        收件人:

        echo -n "%k%F{$CURRENT_BG}$(print_icon 'LEFT_SEGMENT_SEPARATOR')\n"
        

        换行提示:

        【讨论】:

        • 新行多了一个空格。您能告诉我如何删除多余的行吗?
        【解决方案9】:

        仅在提示之间打印换行符:

        precmd() $funcstack[1]() echo
        

        或者如果您(想要)使用多个 precmd 钩子:

        autoload -Uz add-zsh-hook
        _precmd_newline_between_prompts() $funcstack[1]() echo
        add-zsh-hook precmd _precmd_newline_between_prompts
        

        说明:

        对于 zsh,简单函数的大括号是可选的,所以如果不清楚第一种方法等价于这个:

        precmd() {
          $funcstack[1]() {
            echo
          }
        }
        

        $funcstack[1] 是特殊的 zsh 参数,包含调用者/外部函数的名称。

        在第一次调用时(在第一个提示之前),内部方法 $funcstack[1]() echo 将不会运行,但会重新定义外部方法,因此它只会在进一步调用时打印一个换行符(在其他提示之前)。

        【讨论】:

          猜你喜欢
          • 2020-04-20
          • 1970-01-01
          • 1970-01-01
          • 2015-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多