🎃
NushellスクリプトだけでStarShipライクなプロンプトを実現する
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.nu
のcreate_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