每个命令后的zsh新行提示符

每个命令后的zsh新行提示符,zsh,zsh-zle,Zsh,Zsh Zle,我可以将提示符配置为在每个命令后显示新行吗 给你举个例子。在下面的屏幕截图中,我确实运行了cat.zshrc。我希望在命令的最后一个输出行之间有一个新行,~/。zsh_别名,和~$ 编辑~/.zshrc并添加行precmd(){print”“}。这将在显示提示之前简单地打印一行空行。我知道这有点旧,但我找到了一种方法,即使它不是很干净,我只想分享它: function precmd { if [[ "$NEW_LINE" = true ]] then if [[ "${A

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

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


编辑
~/.zshrc
并添加行
precmd(){print”“}
。这将在显示提示之前简单地打印一行空行。

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

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
}

希望它有帮助

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

autoload -Uz promptinit
promptinit

PROMPT="
%n@%m:%~ $ "
被接受的答案(由@abid-h-mujtaba编写)总是打印一条换行符,即使是在第一次装入shell时也是如此。我提交了一份无论出于何种原因都不被接受的编辑

这是我在中使用的(请参阅中的“窗口配置”):

以下工作:

导出PS1='

其他文本-blah$'

在Ubuntu 18.04上使用带有oh my zsh、git支持和zsh Powerlevel9k主题的zsh,安装如下所述:

要在新行打开时获得提示,请执行以下操作:

/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')"
致:

换行提示:

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

precmd(){
precmd(){
回声
}
}

这将在每个提示前放置一个空行,第一个提示除外:第一个
precmd
调用所做的全部工作是用一个调用
echo
的函数替换
precmd
,以便仅在提示之间打印换行:

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将不会运行,但会重新定义外部方法,因此它只会在进一步调用时(在附加提示之前)打印换行符。

user926352

被接受的答案(由@abid-h-mujtaba编写)总是打印一条换行符,即使是在第一次装入shell时也是如此。我提交了一份无论出于何种原因都不被接受的编辑。这是我在个人点文件中使用的(请参见zshrc中的“窗口配置”):
function precmd(){在提示符前打印一个换行符,除非它是该过程中的第一个提示符。如果[-z”$NEW_LINE_before_prompt”];那么在提示符前的新行符=1 elif[“$NEW_LINE_before_prompt”-eq 1];然后回显“\n”fi

我使用了这个答案,但不想在一个明确的答案后使用新行。所以我补充说:

alias clear="unset NEW_LINE_BEFORE_PROMPT && clear"
只需替换clear,也可以取消设置新行变量

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

谢谢!完美的解决方案。这是可行的,问题是它在每次提示之前打印一行新行,即使在启动shell时也是如此!我知道这已经两年多了,但你的问题很普遍。我已经提交了对此答案的编辑(这仍然是一个顶级搜索结果),解决了这个问题。@Ben您的编辑尚未被接受,请分享您的解决方案。跳过第一个提示上的空行的一种技巧是在
precmd(){print”“}
中包装
precmd(){…}
。请看我对此的回答,并做一点解释。这就是为什么在每次新提示之前,我都会避免使用新行。新行上有一个额外的空间。您能告诉我如何删除多余的那一行吗?
echo“\n”
似乎为我打印了两行空白,但是
echo“
工作得很好。非常感谢您的回答,用于“重置”、“清除”和命令之间的工作,但是,它不会在CTRL+l之后添加换行符。这个答案对于那些希望在提示字符串中添加换行符的人很有帮助。我的兴趣是在$character前面加一个换行符。这会将提示文本保留一行,实际的$prompt保留在新行。完美答案!当顶部不需要换行符时,是否有可能对“清除”进行例外处理?我一般不这么认为。您可以将
clear
别名为某种可以用这种方式重新定义
precmd
的东西,但在这一点上,一个神奇的变量和条件也可能更清晰。您可能还需要以某种方式更改zle中的Ctrl-L行为,以便它也可以进行这种旋转。我不知道是怎么做到的。
precmd() {
  $funcstack[1]() {
    echo
  }
}
alias clear="unset NEW_LINE_BEFORE_PROMPT && clear"