每个命令后zsh new line prompt

时间:2013-12-11 07:24:07

标签: zsh zsh-zle

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

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

enter image description here

9 个答案:

答案 0 :(得分:18)

修改~/.zshrc并添加第precmd() { print "" }行。这将只是在呈现PROMPT之前打印一个空行。

答案 1 :(得分:5)

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

%PATH%

这会在除第一个提示之外的每个提示之前放置一个空白行:所有第一个setx调用所做的都是将precmd() { precmd() { echo } } 替换为调用precmd的函数。

答案 2 :(得分: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
}

希望有所帮助

答案 3 :(得分:2)

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

autoload -Uz promptinit
promptinit

PROMPT="
%n@%m:%~ $ "

答案 4 :(得分:2)

接受的答案(由@ 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
}

答案 5 :(得分:2)

user926352

<块引用>

接受的答案(由@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 的下降,也会取消设置新的行变量。

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

答案 6 :(得分:0)

以下作品:

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

答案 7 :(得分:0)

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

要获得换行提示,请打开:

/usr/share/powerlevel9k/powerlevel9k.zsh-主题

寻找函数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"

在新行上提示: enter image description here

答案 8 :(得分:0)

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

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尚未运行,但是将重新定义外部方法,因此它将仅在后续调用(在其他提示之前)上打印换行符。