Zsh颜色内部命令替换

时间:2018-07-27 22:18:24

标签: bash zsh

在zsh中为命令的输出着色很简单。考虑一下zsh提示符中的以下示例:

print -P "%F{cyan}$(date +'%H:%M:%S')$reset"

您将得到预期的青色HH:MM:SS。它也可以按预期及时运行。现在假设我要用不同的颜色给分钟和秒上色。我没有使用%F{color}来实现它,这有可能吗?

我可以使用ANSI代码使其工作,但即使如此,它也可以与print一起使用,并且在〜/ .zshrc中用作提示时不起作用:

print -P "%F{cyan}$(date +'%H:\e[38;5;82m%M:%S')"-在zsh中工作

RPS1="%F{cyan}$(date +'%H:\e[38;5;82m%M:%S')"作为正确提示会给出17:\e[38;5;82m14:11

我想念什么?我该如何转义颜色代码,甚至更好地使用zsh %F{color}构造?

3 个答案:

答案 0 :(得分:2)

它将存在一些报价问题。

不能将其用作双quo; $(date...)部分将被扩展,RPS1不会针对每个提示进行更新。
可以未转义任何转义(\e)。 (尤其是\e[38;5;82m命令的date部分)

因此,对于类似PS的字符串,使用$'...'这样的形式进行引用将很有用:

setopt promptsubst
RPS1=$'%F{cyan}$(date +"%H:%%{\e[38;5;82m%%}%M:%S")%{\e[0m%}'

如果可以找到\e[38;5;82m的颜色索引:

RPS1=$'%F{cyan}$(date +"%H:%%{%%F{82}%%}%M:%S")%{\e[0m%}'

可以通过https://en.wikipedia.org/wiki/ANSI_escape_code#Colors之类的一些工具找到它


注意:\e[38;5;82m\e[0m%{...%}包围。

  

%{...%}
  包括一个字符串作为文字转义序列。花括号中的字符串不应更改光标位置。括号对可以嵌套。

     

--- zshmisc(1), Visual Effects, Prompt Expansion

注2:setopt promptsubst。如果没有此选项,则print -P ...RPS1=...均无效。

  

PROMPT_SUBST

     

如果设置,则在提示中执行参数扩展,命令替换和算术扩展。提示中的替换不会影响命令状态。

     

--- zshoptions(1), PROMPT_SUBST, zsh options

setopt promptsubst
print -P $'%F{cyan}$(date +"%H:%%{\e[38;5;82m%%}%M:%S")%{\e[0m%}'
;# => 23:54:18

PS:%F{color}构造将变量复制粘贴到屏幕上会更容易。

> print $RPS1 ;# this output could not been used for copy-pasting
%F{cyan}$(date +"%H:%%{%%}%M:%S")%{%}
> print $RPS1 | cat -v ;# this either (but close to)
%F{cyan}$(date +"%H:%%{^[[38;5;82m%%}%M:%S")%{^[[0m%}

答案 1 :(得分:1)

版本1-仅一次调用date

d=$(date +'%H:%M:%S');h=${d:0:2};ms=${d:3:5};
RPS1="%F{cyan}$h:%F{green}$ms%F{default}"

版本2-调用date 两次

RPS1="%F{cyan}$(date +'%H'):%F{green}$(date +'%M:%S')%F{default}"

答案 2 :(得分:0)

无需使用外部命令 var xmlDoc = XDocument.Load(args[0]); var institution = xmlDoc.Descendants("institution"); var roles = institution.Where(x => x.Attribute("institution").Value.ToLower() == "division1").Elements(); foreach (var xElement in roles) { // Do your business here working with ======>> xElement.Value } :Zsh内置了prompt escapes for displaying date and time

  

[…]

     

date

     

字符串使用%D{string}函数格式化。有关更多详细信息,请参见手册页strftime(3)。

     

[…]

因此,可以使用

实现简单的着色
strftime

要具有两种颜色,您可以仅使用两个RPS1='%F{cyan}%D{%H:%M:%S}%f' 块并对其进行不同的着色

%D{…}

这可能很复杂(想要):

RPS1="%F{cyan}%D{%H}:%F{82}%D{%M:%S}"