🎃

NushellスクリプトだけでStarShipライクなプロンプトを実現する

2022/12/14に公開

Nushellでの色の扱い

Ansi Escapeによるターミナル上の色つけ

詳細はNu本のColoring and Theming in Nu参照ということで、ざっくりと説明。

ansiコマンドで指定色のANSI Escape文字を生成します。次の例のansi resetはもとの色設定(前景色、背景色、装飾)に戻します。

例:

〉$"(ansi blue)blue character(ansi reset)"

また色だけでなく、文字をblink(点滅),italic(斜体),reverse(反転),underline(下線)とすることができます。

ansiコマンドを使ってPowerline(Starship)ライクなプロンプトをNushellスクリプトだけで実現します。

下記コードを~/.config/nushell/env.nucreate_left_promptと入れ替えます。

現状カレントディレクトリとブランチ名表示だけですが、上記の結果は下記の通り。

Nushell Tips

まだNushellスクリプトの構文解析に問題があるようで、

if ($"($env.PWD)/.gitmodules" | path exists) {
    $"🪂(git branch | str replace '* ' '' -s)"
} else {
    $"🚀(git branch | str replace '* ' '' -s)"
}

上記のelseを下記のようにすると

if ($"($env.PWD)/.gitmodules" | path exists) {
    $"🪂(git branch | str replace '* ' '' -s)"
} 
else {
    $"🚀(git branch | str replace '* ' '' -s)"
}

下記のようにエラーとなってしまいます。気をつけてください。

Error: nu::shell::external_command (link)

  × External command failed
    ╭─[/home/kawa90/.config/nushell/env.nu:25:1]
 25 │                             } 
 26 │                             else {
 27 │                                 $"🚀(git branch | str replace '* ' '' -s)"
    ╰────
  help: No such file or directory (os error 2)

付録(ansiコマンドヘルプ)

Output ANSI codes to change color.

For escape sequences:
Escape: '\x1b[' is not required for --escape parameter
Format: #(;#)m
Example: 1;31m for bold red or 2;37;41m for dimmed white fg with red bg
There can be multiple text formatting sequence numbers
separated by a ; and ending with an m where the # is of the
following values:
    attribute_number, abbreviation, description
    0     reset / normal display
    1  b  bold or increased intensity
    2  d  faint or decreased intensity
    3  i  italic on (non-mono font)
    4  u  underline on
    5  l  slow blink on
    6     fast blink on
    7  r  reverse video on
    8  h  nondisplayed (invisible) on
    9  s  strike-through on

    foreground/bright colors    background/bright colors
    30/90    black              40/100    black
    31/91    red                41/101    red
    32/92    green              42/102    green
    33/93    yellow             43/103    yellow
    34/94    blue               44/104    blue
    35/95    magenta            45/105    magenta
    36/96    cyan               46/106    cyan
    37/97    white              47/107    white
    39       default            49        default
    https://en.wikipedia.org/wiki/ANSI_escape_code

OSC: '\x1b]' is not required for --osc parameter
Example: echo [(ansi -o '0') 'some title' (char bel)] | str join
Format: #
    0 Set window title and icon name
    1 Set icon name
    2 Set window title
    9 iTerm2 Grown notifications
    10 Set foreground color (x11 color spec)
    11 Set background color (x11 color spec)
    ... others

Search terms: text-color, text-style, colors

Usage:
  > ansi {flags} (code) 
Subcommands:
  ansi strip - Strip ANSI escape sequences from a string

Flags:
  -h, --help - Display the help message for this command
  -e, --escape - escape sequence without the escape character(s)
  -o, --osc - operating system command (ocs) escape sequence without the escape character(s)
  -l, --list - list available ansi code names

Signatures:
  <nothing> | ansi <any?> -> <string>

Parameters:
  (optional) code <any>: the name of the code to use like 'green' or 'reset' to reset the color

Examples:
  Change color to green
  > ansi green

  Reset the color
  > ansi reset

  Use ansi to color text (rb = red bold, gb = green bold, pb = purple bold)
  > $'(ansi rb)Hello (ansi gb)Nu (ansi pb)World(ansi reset)'

  Use ansi to color text (italic bright yellow on red 'Hello' with green bold 'Nu' and purple bold 'World')
  > [(ansi -e '3;93;41m') Hello (ansi reset) " " (ansi gb) Nu " " (ansi pb) World (ansi reset)] | str join

  Use ansi to color text with a style (blue on red in bold)
  > $"(ansi -e { fg: '#0000ff' bg: '#ff0000' attr: b })Hello Nu World(ansi reset)"

Discussion