我想自定义我的 zshell,使提示符像平常一样紧靠左边框。我还想让所有执行结果都缩进大约 2 个空格。有没有办法像这样缩进?
我正在尝试使用两行提示:
PROMPT='
%{$fg[gray]%}PWD:%{$reset_color%}%{$fg[cyan]%}%~ %{$reset_color%}
%{$fg[red]%}> '
让这个提示在其自己的专栏中脱颖而出就好了。
答案1
我认为这不像人们想象的那么简单。您必须拦截 STDOUT,因为外部程序会直接写入该通道。
以下是概念验证。请注意,这会破坏很多东西,即像 等交互式程序man
。less
因此它不适用于日常使用,但可以轻松格式化 shell 会话以用于 SU 等上的帖子。
此方法由 Atom Smasher 发布在zsh-users
邮件列表上2009 年 5 月 16 日星期六着色STDERR
。我根据您的要求采用了它:
# ## indent_output.zsh ##
zmodload zsh/terminfo zsh/system
autoload is-at-least
indent_output() {
while sysread line
do
testline=${line//$'\n'/$'\n' }
syswrite " ${testline}"
done
}
precmd() { sleep 0 }
## i'm not sure exactly how far back it's safe to go with this
## 4.3.4 works; 4.2.1 hangs.
is-at-least 4.3.4 && exec > >(indent_output)
棘手的部分是exec > >(indent_output)
通过函数处理替换 shell 的完整输出indent_output
。precmd
必须定义以避免竞争条件,否则会在执行命令的实际输出之前打印新的提示符。
以下是一个演示:
% source indent_output.zsh
% ls /bin | head
[.exe
2to3
2to3-3.2
411toppm.exe
7z
7za
7zr
a2p.exe
aaflip.exe
aclocal
%
% date
Sat, Nov 08, 2014 5:58:29 PM
%
% cat /usr/share/doc/foo
cat : /usr/share/doc/foo : No such file or directory
%
% cat /usr/share/doc/zsh-5.0.6/INSTALL| head
++++++++++++++
INSTALLING ZSH
++++++++++++++
This file is divided into two parts: making and installing the shell, a
note on the script run to set up the environment for new users, and
a description of various additional configuration options. You should
have a look at the items in the second and third parts before following the
instructions in the first.
%
%
您可以使用以下两个选项去掉%
每个提示前的符号(表示最后一行不以 结尾):CR
setopt PROMPT_CR NO_PROMPT_SP