From 607eb41d72c39d27b00baca4ed020e14ec8ff0da Mon Sep 17 00:00:00 2001 From: emilis Date: Sat, 9 Mar 2024 17:32:45 +0000 Subject: [PATCH] set up nushell --- nushell/config.nu | 6 ++--- nushell/env.nu | 59 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/nushell/config.nu b/nushell/config.nu index 4e7d3a2..5a342f9 100644 --- a/nushell/config.nu +++ b/nushell/config.nu @@ -143,7 +143,7 @@ let light_theme = { # The default config record. This is where much of your global configuration is setup. $env.config = { - show_banner: true # true or false to enable or disable the welcome banner at startup + show_banner: false # true or false to enable or disable the welcome banner at startup ls: { use_ls_colors: true # use the LS_COLORS environment variable to colorize output @@ -155,7 +155,7 @@ $env.config = { } table: { - mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other + mode: dots # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other index_mode: always # "always" show indexes, "never" show indexes, "auto" = show indexes when a table has "index" column show_empty: true # show 'empty list' and 'empty record' placeholders for command output padding: { left: 1, right: 1 } # a left right padding of each column in a table @@ -234,7 +234,7 @@ $env.config = { use_ansi_coloring: true bracketed_paste: true # enable bracketed paste, currently useless on windows edit_mode: emacs # emacs, vi - shell_integration: false # enables terminal shell integration. Off by default, as some terminals have issues with this. + shell_integration: true # enables terminal shell integration. Off by default, as some terminals have issues with this. render_right_prompt_on_last_line: false # true or false to enable or disable right prompt to be rendered on last line of the prompt. use_kitty_protocol: false # enables keyboard enhancement protocol implemented by kitty console, only if your terminal support this. highlight_resolved_externals: false # true enables highlighting of external commands in the repl resolved by which. diff --git a/nushell/env.nu b/nushell/env.nu index 6d9672d..645a587 100644 --- a/nushell/env.nu +++ b/nushell/env.nu @@ -2,6 +2,50 @@ # # version = "0.91.1" +def git_prompt [] { + if (do --ignore-errors { git rev-parse --abbrev-ref HEAD } | is-empty) { + return + } + + let status = git --no-optional-locks status --porcelain=2 --branch | lines + + let head = $status | where ($it | str starts-with '# branch.head') | str join | parse '# branch.head {branch}' | get branch | first + let result = [$"(ansi magenta2a)($head)"]; + + let ahead_behind = $status | where ($it | str starts-with '# branch.ab') | str join | parse "# branch.ab +{ahead} -{behind}" + let ahead = $ahead_behind | get ahead | first + let behind = $ahead_behind | get behind | first + let ahead = if ($ahead != '0') { $"↑($ahead)" } else {} + let behind = if ($behind != '0') { $"↓($behind)" } else {} + let result = $result | append ([$ahead, $behind] | where not ($it | is-empty) | str join (char space)) + + let untracked = $status | where ($it | str starts-with '?') | length + let unstaged = $status | where ($it =~ '1 \..+' ) | length + let staged = $status | where ($it =~ '1 .\..+' ) | length + let file_states = file_state_to_string [ + [value, str, color]; + [$untracked, $"…($untracked)", (ansi paleturquoise1)], + [$unstaged, $"✚($unstaged)", (ansi orange3)], + [$staged, $"●($staged)", (ansi darkseagreen1b)] + ] + let result = $result | append $file_states + + let result = $result | where not ($it | is-empty) | str join $" (ansi reset)" + $"(ansi lub)\(($result)(ansi lub)\)" +} + +def file_state_to_string [$states: table] -> string { + $states | each {|itm| + if ($itm.value != 0) { + let str = $itm.str + let color = $itm.color + $"($color)($str)" + } else { + "" + } + } | where not ($it | is-empty) | str join ' ' +} + def create_left_prompt [] { let dir = match (do --ignore-shell-errors { $env.PWD | path relative-to $nu.home-path }) { null => $env.PWD @@ -9,19 +53,24 @@ def create_left_prompt [] { $relative_pwd => ([~ $relative_pwd] | path join) } - let path_color = (if (is-admin) { ansi red_bold } else { ansi green_bold }) - let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi light_green_bold }) - let path_segment = $"($path_color)($dir)" + let path_color = (if (is-admin) { ansi red_bold } else { ansi pb }) + let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi pb }) + let user_color = (if (is-admin) {ansi red} else { ansi xterm_magenta1 }) + let path_segment = $"($user_color)[($env.USER)] ($path_color)($dir)(git_prompt)" $path_segment | str replace --all (char path_sep) $"($separator_color)(char path_sep)($path_color)" } +def hostname [] -> string { + $"(ansi lmi)((sys).host | get hostname)(ansi reset)" +} + def create_right_prompt [] { # create a right prompt in magenta with green separators and am/pm underlined let time_segment = ([ (ansi reset) (ansi magenta) - (date now | format date '%x %X') # try to respect user's locale + (date now | format date '%H:%M') # try to respect user's locale ] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" | str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}") @@ -31,7 +80,7 @@ def create_right_prompt [] { ] | str join) } else { "" } - ([$last_exit_code, (char space), $time_segment] | str join) + ([$last_exit_code, (hostname), $time_segment] | str join (char space)) } # Use nushell functions to define your right and left prompt