Farben und Themen in Nu

In vielen Teilen von Nushells Oberfläche sind die Farben anpassbar. Dies wird in der Konfigurationsdatei config.nu erstellt. Ein Hashtag in der Konfigurationsdatei kommentiert den danach folgenden Text aus.

  1. Tabellen Rahmen
  2. Werte einfacher Typen
  3. Formen (Kommandozeilen Syntax)
  4. Prompt
  5. LS_COLORS

Tabellen Rahmen


Tabellen Rahmen werden mit der Einstellung table_mode in der config.nu konfiguriert. Hier ein Beispiel:

> let $config = {
    table_mode: rounded
}

Dies sind die aktuellen Optionen für table_mode:

  • rounded # das ist natürlich der beste 😃
  • basic
  • compact
  • compact_double
  • light
  • thin
  • with_love
  • reinforced
  • heavy
  • none
  • other

Farb-Symbolik


  • r - Normale Farbe Abkürzung für rot
  • rb - Normale Farbe rot mit b für bold, fette Schrift
  • red - Normale Farbe rot
  • red_bold - Normale Farbe rot mit fetter Schrift
  • "#ff0000" - "#hex" Format Vordergrund-Farbe rot (Anführungszeichen benötigt)
  • { fg: "#ff0000" bg: "#0000ff" attr: b } - "komplettes #hex" Format Vordergrund rot in "#hex" Format mit einem blauen Hintergund in "#hex" Format mit b als Abkürzung für fette Schrift.

Attribute


CodeBedeutung
lblink
bbold
ddimmed
hhidden
iitalic
rreverse
sstrikethrough
uunderline
nnothing
defaults to nothing

Normale Farben and Abkürzungen

CodeName
ggreen
gbgreen_bold
gugreen_underline
gigreen_italic
gdgreen_dimmed
grgreen_reverse
gblgreen_blink
gstgreen_strike
lglight_green
lgblight_green_bold
lgulight_green_underline
lgilight_green_italic
lgdlight_green_dimmed
lgrlight_green_reverse
lgbllight_green_blink
lgstlight_green_strike
rred
rbred_bold
rured_underline
rired_italic
rdred_dimmed
rrred_reverse
rblred_blink
rstred_strike
lrlight_red
lrblight_red_bold
lrulight_red_underline
lrilight_red_italic
lrdlight_red_dimmed
lrrlight_red_reverse
lrbllight_red_blink
lrstlight_red_strike
ublue
ubblue_bold
uublue_underline
uiblue_italic
udblue_dimmed
urblue_reverse
ublblue_blink
ustblue_strike
lulight_blue
lublight_blue_bold
luulight_blue_underline
luilight_blue_italic
ludlight_blue_dimmed
lurlight_blue_reverse
lubllight_blue_blink
lustlight_blue_strike
bblack
bbblack_bold
bublack_underline
biblack_italic
bdblack_dimmed
brblack_reverse
bblblack_blink
bstblack_strike
ligrlight_gray
ligrblight_gray_bold
ligrulight_gray_underline
ligrilight_gray_italic
ligrdlight_gray_dimmed
ligrrlight_gray_reverse
ligrbllight_gray_blink
ligrstlight_gray_strike
yyellow
ybyellow_bold
yuyellow_underline
yiyellow_italic
ydyellow_dimmed
yryellow_reverse
yblyellow_blink
ystyellow_strike
lylight_yellow
lyblight_yellow_bold
lyulight_yellow_underline
lyilight_yellow_italic
lydlight_yellow_dimmed
lyrlight_yellow_reverse
lybllight_yellow_blink
lystlight_yellow_strike
ppurple
pbpurple_bold
pupurple_underline
pipurple_italic
pdpurple_dimmed
prpurple_reverse
pblpurple_blink
pstpurple_strike
lplight_purple
lpblight_purple_bold
lpulight_purple_underline
lpilight_purple_italic
lpdlight_purple_dimmed
lprlight_purple_reverse
lpbllight_purple_blink
lpstlight_purple_strike
ccyan
cbcyan_bold
cucyan_underline
cicyan_italic
cdcyan_dimmed
crcyan_reverse
cblcyan_blink
cstcyan_strike
lclight_cyan
lcblight_cyan_bold
lculight_cyan_underline
lcilight_cyan_italic
lcdlight_cyan_dimmed
lcrlight_cyan_reverse
lcbllight_cyan_blink
lcstlight_cyan_strike
wwhite
wbwhite_bold
wuwhite_underline
wiwhite_italic
wdwhite_dimmed
wrwhite_reverse
wblwhite_blink
wstwhite_strike
dgrdark_gray
dgrbdark_gray_bold
dgrudark_gray_underline
dgridark_gray_italic
dgrddark_gray_dimmed
dgrrdark_gray_reverse
dgrbldark_gray_blink
dgrstdark_gray_strike

"#hex" Format


Das "#hex" Format ist gebräuchlich um Farben zu repräsentieren. Es besteht immer aus dem # gefolgt von 6 Zeichen. Die ersten zwei sind für rot, die nächsten zwei für grün und die letzten zwei für blau. Es ist wichtig, dass dieser Text mit Anführungszeichen geschrieben wird, damit Nushell es nicht für einen Kommentar hält.

Beispiel: Die primäre Farbe rot ist "#ff0000" oder "#FF0000". Gross- und Kleinschreibung sollten hier keine Rolle spielen.

Dieses "#hex" Format erlaubt es, 24-bit Echtfarben für verschiedene Bereiche von Nushell zu spezifizieren.

Volles "#hex" Format


Das volle "#hex" Format ist eine Interpretation des "#hex" Formats, welches den Vordergrund, Hintergrund und Attribute in einer Zeile spezifizieren kann.

Beispiel: { fg: "#ff0000" bg: "#0000ff" attr: b }

  • Vordergrund rot in "#hex" format
  • Hiuntergund blau in "#hex" format
  • Attribute in fetter Schrift als Abkürzung spezifiziert

Primitive Typen


Werte primitiver Typen sind z.B. int und string. Primitive Typen und Formen können ebenfalls mit verschiedenster Farben symbolisiert werden.

Hier die aktuelle Liste von Primitiven Typen. Nicht alle davon sind konfigurierbar. Die konfigurierbaren sind mit * markiert.

primitivedefault colorconfigurable
any
binaryColor::White.normal()*
blockColor::White.normal()*
boolColor::White.normal()*
cellpathColor::White.normal()*
condition
custom
dateColor::White.normal()*
durationColor::White.normal()*
expression
filesizeColor::White.normal()*
floatColor::White.normal()*
glob
import
intColor::White.normal()*
listColor::White.normal()*
nothingColor::White.normal()*
number
operator
path
rangeColor::White.normal()*
recordColor::White.normal()*
signature
stringColor::White.normal()*
table
var
vardecl
variable

Spezielle "primitives" (keine wirklichen Primitiven Typen, denn sie existieren nur für die Farbgebung)

primitivedefault colorconfigurable
leading_trailing_space_bgColor::Rgb(128, 128, 128))*
headerColor::Green.bold()*
emptyColor::Blue.normal()*
row_indexColor::Green.bold()*
hintsColor::DarkGray.normal()*

Hier ein kleines Beispiel, wie diese Werte angewendet werden können.

> let config = {
    color_config: {
        separator: purple
        leading_trailing_space_bg: "#ffffff"
        header: gb
        date: wd
        filesize: c
        row_index: cb
        bool: red
        int: green
        duration: blue_bold
        range: purple
        float: red
        string: white
        nothing: red
        binary: red
        cellpath: cyan
        hints: dark_gray
    }
}

Hier ein anderes Beispiel, welches mehrere Farben Schreibweisen sowie Kommentare verwendet.

> let config = {
    color_config: {
        separator: "#88b719" # Dies setzt nur die Vordergrundsfarbe wie in PR #486
        leading_trailing_space_bg: white # Dies setzt nur die Vordergrundsfarbe im ursprünglichen Stil
        header: { # Analog PR #489
            fg: "#B01455", # Hinweis, Bei Werten mit hex Farben, werden Anführungszeichen benötigt
            bg: "#ffb900",# Hinweis, Kommas werden nicht benötigt, es könnte auch alles auf eine Zeile passen
            attr: bli # Hinweis, Um diesen Wert sind keine Anführungszeichen, hier geht es auch ohne
        }
        date: "#75507B"
        filesize: "#729fcf"
        row_index: {
            # Hinweis, Dies ist eine andere Möglichkeit, nur den Vordergrund anzugeben, ohne Angabe von bg oder attr
            fg: "#e50914"
        }
    }
}

Formen Werte

Wie oben bereits erwähnt, ist Formen oder shapes ein Begriff, der angibt, wie Syntax eingefärbt wird.

Hier die aktuelle Formen Liste.

shapedefault styleconfigurable
shape_blockfg(Color::Blue).bold()*
shape_boolfg(Color::LightCyan)*
shape_custombold()*
shape_externalfg(Color::Cyan)*
shape_externalargfg(Color::Green).bold()*
shape_filepathfg(Color::Cyan)*
shape_flagfg(Color::Blue).bold()*
shape_floatfg(Color::Purple).bold()*
shape_garbagefg(Color::White).on(Color::Red).bold()*
shape_globpatternfg(Color::Cyan).bold()*
shape_intfg(Color::Purple).bold()*
shape_internalcallfg(Color::Cyan).bold()*
shape_listfg(Color::Cyan).bold()*
shape_literalfg(Color::Blue)*
shape_nothingfg(Color::LightCyan)*
shape_operatorfg(Color::Yellow)*
shape_rangefg(Color::Yellow).bold()*
shape_recordfg(Color::Cyan).bold()*
shape_signaturefg(Color::Green).bold()*
shape_stringfg(Color::Green)*
shape_string_interpolationfg(Color::Cyan).bold()*
shape_tablefg(Color::Blue).bold()*
shape_variablefg(Color::Purple)*

Hier ein kleines Beispiel wie Farben auf diese Teile angewendet werden. Was nicht spezifiziert wird, erhält die Standardfarbe.

> let $config = {
    color_config: {
        shape_garbage: { fg: "#FFFFFF" bg: "#FF0000" attr: b}
        shape_bool: green
        shape_int: { fg: "#0000ff" attr: b}
    }
}

Prompt Konfiguration und Farbgebung

Der Nushell Prompt ist konfigurierbar mit diesen Umgebungsvariablen:

  • PROMPT_COMMAND: Code der ausgeführt wird beim Aufsetzen des Prompts (Block)
  • PROMPT_COMMAND_RIGHT: Code um die rechte Seite, RIGHT prompt (Block), auf zu setzen. (Siehe auch oh-my.nu in nu_scripts)
  • PROMPT_INDICATOR = "〉": Der Indikator, welcher nach dem Prompt ausgegeben wird (Standardmässig das ">" Unicode Symbol)
  • PROMPT_INDICATOR_VI_INSERT = ": "
  • PROMPT_INDICATOR_VI_NORMAL = "v "
  • PROMPT_MULTILINE_INDICATOR = "::: "

Beispiel: Für einen einfachen Prompt wäre folgendes mögllich. Hinweis PROMPT_COMMAND benötigt einen block wogegen die anderen einen string erwarten.

> let-env PROMPT_COMMAND = { build-string (date now | date format '%m/%d/%Y %I:%M:%S%.3f') ': ' (pwd | path basename) }

Soll der standard PROMPT_INDICATOR geändert werden, sieht das so aus.

> let-env PROMPT_INDICATOR = "> "

Den Prompt einfärben wird duch den block PROMPT_COMMAND kontrolliert und individualisiert. In nu_scripts repoopen in new window wurde ein recht ausgefallener geschrieben, welcher den git Status darstellt.

LS_COLORS Farben für den ls Befehl

Nushell wird die Umgebungsvariable LS_COLORS auf Linu, Mac und Windows respektieren. Diese Einstellung erlaubt es Farben anhand ihres Dateityps zu definieren, wenn ein ls ausgeführt wird. Zum Beispiel können Verzeichnisse in einer Farbe, _.md Markdown Dateien in einer anderen Farbe, _.toml Dateien in einer dritten Farbe usw. dargestellt werden.

Es gibt verschiedenste Wege um Dateitypen ein zu färben.

Hieropen in new window findet sich eine ausführliche Liste, welche ein rudimentäres Verständnis bietet, wie eine ls_colors Datei ein dircolors in eine LS_COLORS Umgebungsvariable überführt.

Diesopen in new window ist eine sehr gute Einführung in LS_COLORS. Es finden sich sicher noch viele mehr im Internet.

Freunde der vivid Anwendung finden Informationen hieropen in new window. Die Konfiguration in config.nu erfolgt so:

let-env LS_COLORS = (vivid generate molokai | str trim)

Ist LS_COLORS nicht gesetzt, wird Nushell auf die eingebaute LS_COLORS Einstellung zurückgreifen, welche auf den erweiterten 8-bit ANSI Farben aufbaut.

Theming

Theming kombiniert all die eben beschriebene Farbgebung. Hier ein einfaches Beispiel, welches die Fähigkeiten des Themings demonstriert. Dies ist nur ein Ausschnitt der base16 Themes, welche im Internet weit verbreitet sind.

Entscheidend damit Theming funktioniert ist, dass alle Farben und Themen in der config.nu definiert werden bevor die let config = Zeile definiert wird.

# Definition von einigen Farben

let base00 = "#181818" # Standard Hinergrund
let base01 = "#282828" # Heller Hintergrund (Verwendet für Status Bar, Linien Nummern und Faltmarken)
let base02 = "#383838" # Auswahl Hintergrund
let base03 = "#585858" # Kommentare, Verstecktes, Zeilen Hervorhebungen
let base04 = "#b8b8b8" # Dunkler Vordergrund (Für Status Bars)
let base05 = "#d8d8d8" # Standard Vordergrund, Einfügebarken, Trennzeichen, Operatoren
let base06 = "#e8e8e8" # Heller Vordergrund (Nicht oft verwendet)
let base07 = "#f8f8f8" # Heller Hintergrund (Nicht oft verwendet)
let base08 = "#ab4642" # Variablen, XML Tags, Markup Link Text, Markup Listen, Diff gelöscht
let base09 = "#dc9656" # Ganzzahlen, Boolean, Konstanten, XML Attribute, Markup Link Url
let base0a = "#f7ca88" # Klassen, Markup fett, Such-Text Hintergrund
let base0b = "#a1b56c" # Strings, vererbte Klasse, Markup Code, Diff eingefügt
let base0c = "#86c1b9" # Support, Reguläre Ausdrücke, Escape Zeichen, Markup Quotes
let base0d = "#7cafc2" # Funktionen, Methoden, Attribut IDs, Überschriften
let base0e = "#ba8baf" # Keywörter, Speicher, Selectoren, Markup Italic, Diff geändert
let base0f = "#a16946" # Veraltet, Öffnende/Schliessende eingebettete Sprach Tags, z.B. <?php ?>

# und nund wird das Theme mit diesen Farbdefinitionen erstellt.

let base16_theme = {
    separator: $base03
    leading_trailing_space_bg: $base04
    header: $base0b
    date: $base0e
    filesize: $base0d
    row_index: $base0c
    bool: $base08
    int: $base0b
    duration: $base08
    range: $base08
    float: $base08
    string: $base04
    nothing: $base08
    binary: $base08
    cellpath: $base08
    hints: dark_gray

    # shape_garbage: { fg: $base07 bg: $base08 attr: b} # base16 white on red
    # but i like the regular white on red for parse errors
    shape_garbage: { fg: "#FFFFFF" bg: "#FF0000" attr: b}
    shape_bool: $base0d
    shape_int: { fg: $base0e attr: b}
    shape_float: { fg: $base0e attr: b}
    shape_range: { fg: $base0a attr: b}
    shape_internalcall: { fg: $base0c attr: b}
    shape_external: $base0c
    shape_externalarg: { fg: $base0b attr: b}
    shape_literal: $base0d
    shape_operator: $base0a
    shape_signature: { fg: $base0b attr: b}
    shape_string: $base0b
    shape_filepath: $base0d
    shape_globpattern: { fg: $base0d attr: b}
    shape_variable: $base0e
    shape_flag: { fg: $base0d attr: b}
    shape_custom: {attr: b}
}

# nun werden die regulären Konfigurations Einstellungen sowie das "color_config:" Theme angewendet.

let config = {
  filesize_metric: true
  table_mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other
  use_ls_colors: true
  color_config: $base16_theme # <-- this is the theme
  use_grid_icons: true
  footer_mode: always #always, never, number_of_rows, auto
  animate_prompt: false
  float_precision: 2
  use_ansi_coloring: true
  filesize_format: "b" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, zb, zib, auto
  edit_mode: emacs # vi
  max_history_size: 10000
  log_level: error
}

Wer in Sachen Theming aufs ganze gehen will, will bestimmt alle Parameter von LS_COLORS und den Prompt konfigurieren, viel Glück!