22

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

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

在此处输入图像描述

4

9 回答 9

37

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

于 2013-12-16T16:23:25.677 回答
12

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

precmd() {
    precmd() {
        echo
    }
}

这会在除第一个提示之外的每个提示之前放置一个空行:第一次precmd调用所做的所有事情都是precmd用调用echo.

于 2020-01-03T10:32:51.613 回答
11

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

autoload -Uz promptinit
promptinit

PROMPT="
%n@%m:%~ $ "
于 2017-06-01T08:09:58.637 回答
5

接受的答案(由@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
}
于 2018-04-30T15:48:36.853 回答
5

以下作品:

export PS1='
其他文字 - blah$'

于 2019-04-20T16:57:26.870 回答
2

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

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
}

希望能帮助到你

于 2017-02-28T12:52:02.653 回答
2

用户926352

接受的答案(由@abid-h-mujtaba 撰写)总是打印一个换行符,即使在第一次加载 shell 时也是如此。我提交了一个编辑,无论出于何种原因,都没有被接受。这是我在我的个人点文件中使用的(参见 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 变量。

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

于 2021-04-27T09:59:27.557 回答
1

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

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-03-21T16:09:20.870 回答
1

在 Ubuntu 18.04 上使用带有 oh-my-zsh、git 支持和 ZSH Powerlevel9k 主题的 zsh,如下所述安装: 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"

提示换行: 在此处输入图像描述

于 2019-06-16T23:34:03.363 回答