我可以配置提示符以在每个命令后显示一个新行吗?
举个例子,在下面的屏幕截图中,我运行了cat .zshrc
。我想在命令的最后输出行. ~/.zsh_aliases
和~ $
之间有一个新行。
编辑~/.zshrc
文件并添加以下代码:precmd() { print "" }
。这将在渲染PROMPT之前简单地打印一行空白。
某些现有解决方案的一种变体,我发现比使用神奇变量和条件语句更为简洁:
precmd() {
precmd() {
echo
}
}
这会在每个提示符前面放置一个空行,除了第一个提示符之外:所有第一个precmd
调用所做的只是将precmd
替换为调用echo
的函数。
clear
别名到某个会以这种方式重新定义precmd
的东西,但此时使用一个魔术变量和条件可能更清晰。你可能还需要在zle中以某种方式改变Ctrl-L的行为,以便它也进行这种调整。我不确定该如何实现。 - Chris Morgan另一种方法是在〜/ .zshrc
中设置自定义提示符,其中包含一个换行符。例如:
另一种方法是通过在〜/ .zshrc
中设置一个自定义提示符,来包含一个换行符。例如:
autoload -Uz promptinit
promptinit
PROMPT="
%n@%m:%~ $ "
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
}
以下是有效的内容:
导出 PS1='
其他文本-嗯$'
用户926352
被@abid-h-mujtaba撰写的被采纳答案总是会打印一个换行符,即使在shell的第一次加载时也是如此。我提交了一个编辑,但不知何故没有被接受。这是我在个人dotfiles中使用的内容(请参见zshrc中的“Window Configuration”):
function precmd() { #在提示符之前打印一个换行符,除非它是#进程中的第一个提示符。 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函数的小技巧,同时也会取消新行变量。
注意: 以上建议已经进行了编辑,因为我将一个包含取消变量和清空内容的函数赋给了clear函数。这使得函数递归调用,最终超出了嵌套函数的极限。您可以使用以下代码,它更加简单和安全。如果在编辑之前有人发现这个问题,非常抱歉。
我知道这篇文章有点旧了,但我找到了一种方法,虽然不是很完美,但我想分享一下:
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
}
要在提示之间仅打印一个换行符:
precmd() $funcstack[1]() echo
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
不会运行,但会重新定义外部方法,因此在进一步调用(在额外提示之前)时只会打印一个换行符。
使用oh-my-zsh、git支持和ZSH Powerlevel9k主题的zsh,在Ubuntu 18.04上安装方法如下:https://linuxhint.com/install_zsh_shell_ubuntu_1804/
要在新行打开提示符,请执行以下操作:
/usr/share/powerlevel9k/powerlevel9k.zsh-theme
请查找 left_prompt_end() 函数。
在原始代码中,该函数如下所示:
# 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')"
To:
echo -n "%k%F{$CURRENT_BG}$(print_icon 'LEFT_SEGMENT_SEPARATOR')\n"
precmd() {
precmd() {
echo
}
}
这将在每个命令后回显一个新行,但不会在启动时回显
但我们仍然有另一个问题 - 当终端被清除时,会回显一个换行符。为了解决这个问题,将别名'clear'设置为:
alias clear="precmd() {precmd() {echo }} && clear"
对我来说,“Ctrl + L”会清除屏幕,但不带换行符。但是如果有人遇到问题,只需将此代码添加到您的.zshrc文件中。
bindkey -s '^L' 'clear^M'
precmd() { print "" }
包装在precmd() { … }
中。请参见我的回答,其中包含一些解释。 - Chris Morgan