zshell 中缩进执行结果

zshell 中缩进执行结果

我想自定义我的 zshell,使提示符像平常一样紧靠左边框。我还想让所有执行结果都缩进大约 2 个空格。有没有办法像这样缩进?

我正在尝试使用两行提示:

PROMPT='
%{$fg[gray]%}PWD:%{$reset_color%}%{$fg[cyan]%}%~ %{$reset_color%}
%{$fg[red]%}> '

让这个提示在其自己的专栏中脱颖而出就好了。

答案1

我认为这不像人们想象的那么简单。您必须拦截 STDOUT,因为外部程序会直接写入该通道。

以下是概念验证。请注意,这会破坏很多东西,即像 等交互式程序manless因此它不适用于日常使用,但可以轻松格式化 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_outputprecmd必须定义以避免竞争条件,否则会在执行命令的实际输出之前打印新的提示符。

以下是一个演示:

% 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

相关内容