diff --git a/modules/home-manager/reo101-shell/default.nix b/modules/home-manager/reo101-shell/default.nix index ba8a96b..da0d0a5 100644 --- a/modules/home-manager/reo101-shell/default.nix +++ b/modules/home-manager/reo101-shell/default.nix @@ -2,9 +2,42 @@ let cfg = config.reo101.shell; + inherit (lib) mkEnableOption mkOption types - mkIf optionals optionalString; + mkIf optionals optionalString + mkMerge; + + shellAliases = { + cp = "${pkgs.advcpmv}/bin/advcp -rvi"; + mv = "${pkgs.advcpmv}/bin/advmv -vi"; + rebuild = let + rebuild_script = pkgs.writeShellScript "rebuild" '' + ${ + let + inherit (lib.strings) + hasInfix; + inherit (pkgs.hostPlatform) + isx86_64 isAarch64 + isLinux isDarwin; + in + if isx86_64 && isLinux then + "sudo --validate && sudo nixos-rebuild" + else if isDarwin then + "darwin-rebuild" + else if isAarch64 then + "nix-on-droid" + else + "home-manager" + } --flake ${ + if cfg.hostname != null + then "${cfg.flakePath}#${cfg.hostname}" + else "${cfg.flakePath}" + } ''$''\{1:-switch''\} "''$''\{@:2''\}" |& nix run nixpkgs#nix-output-monitor + ''; + in + "${rebuild_script}"; + }; in { imports = @@ -14,7 +47,7 @@ in options = { reo101.shell = { - enable = mkEnableOption "reo101 zsh setup"; + enable = mkEnableOption "reo101 shell setup"; username = mkOption { description = "Username to be used (for prompt)"; type = types.str; @@ -25,6 +58,25 @@ in type = types.nullOr types.str; default = null; }; + shells = mkOption { + description = "Shells to be configured (first one is used for $SHELL)"; + type = + lib.pipe + [ + "nushell" + "zsh" + ] + [ + types.enum + types.listOf + ]; + default = [ "nushell" "zsh" ]; + }; + starship = mkOption { + description = "Use starship prompt"; + type = types.bool; + default = true; + }; atuin = mkOption { description = "Integrate with atuin"; type = types.bool; @@ -45,12 +97,6 @@ in type = types.str; default = "${config.xdg.configHome}/rix101"; }; - extraConfig = mkOption { - description = "Extra zsh config"; - type = types.str; - default = '' - ''; - }; }; }; @@ -58,10 +104,12 @@ in mkIf cfg.enable { home.packages = with pkgs; builtins.concatLists [ - [ - zsh + (builtins.map + (lib.flip builtins.getAttr pkgs) + cfg.shells) + (optionals cfg.starship [ starship - ] + ]) (optionals cfg.atuin [ atuin ]) @@ -84,26 +132,104 @@ in programs.direnv = mkIf cfg.direnv { enable = true; + enableNushellIntegration = builtins.elem "nushell" cfg.shells; + enableZshIntegration = builtins.elem "zsh" cfg.shells; + nix-direnv = { enable = true; }; }; # Starship - programs.starship = { + programs.starship = mkIf cfg.starship { enable = true; + package = pkgs.starship; + settings = import ./starship.nix { inherit (cfg) username; }; }; - # Zsh - home.sessionVariables = { - SHELL = "${pkgs.zsh}/bin/zsh"; + # Zoxide + programs.zoxide = mkIf cfg.zoxide { + enable = true; + + package = pkgs.zoxide; + + enableNushellIntegration = builtins.elem "nushell" cfg.shells; + enableZshIntegration = builtins.elem "zsh" cfg.shells; }; - programs.zsh = { + # Shell + home.sessionVariables = { + SHELL = + let + shellPackage = builtins.getAttr (builtins.head cfg.shells) pkgs; + in + "${shellPackage}/${shellPackage.shellPath}"; + }; + + # Nushell + programs.nushell/* -reo101 */ = mkMerge [ + (mkIf (builtins.elem "nushell" cfg.shells) { + enable = true; + + package = pkgs.nushell; + + configFile.source = ./nushell/config.nu; + envFile.source = ./nushell/env.nu; + loginFile.source = ./nushell/login.nu; + + inherit shellAliases; + + environmentVariables = {}; + }) + (mkIf cfg.atuin { + extraEnv = '' + let atuin_cache = "${config.xdg.cacheHome}/atuin" + if not ($atuin_cache | path exists) { + mkdir $atuin_cache + } + ${pkgs.atuin}/bin/atuin init nu | save --force ${config.xdg.cacheHome}/atuin/init.nu + ''; + + extraConfig = '' + source ${config.xdg.cacheHome}/atuin/init.nu + + # Ctrl-R + $env.config = ( + $env.config | upsert keybindings ( + $env.config.keybindings + | append { + name: atuin + modifier: control + keycode: char_r + mode: [emacs, vi_normal, vi_insert] + event: { send: executehostcommand cmd: (_atuin_search_cmd) } + } + ) + ) + + # Up + $env.config = ( + $env.config | upsert keybindings ( + $env.config.keybindings + | append { + name: atuin + modifier: none + keycode: up + mode: [emacs, vi_normal, vi_insert] + event: { send: executehostcommand cmd: (_atuin_search_cmd '--shell-up-key-binding') } + } + ) + ) + ''; + }) + ]; + + # Zsh + programs.zsh = mkIf (builtins.elem "zsh" cfg.shells) { enable = true; package = pkgs.zsh; @@ -111,10 +237,8 @@ in dotDir = ".config/zsh"; - shellAliases = { + shellAliases = shellAliases // { ls = "${pkgs.lsd}/bin/lsd"; - cp = "${pkgs.advcpmv}/bin/advcp -rvi"; - mv = "${pkgs.advcpmv}/bin/advmv -vi"; mkdir = "mkdir -vp"; }; @@ -127,28 +251,8 @@ in builtins.concatStringsSep "\n" [ '' - rebuild () { - ${ - let - inherit (lib.strings) - hasInfix; - inherit (pkgs.hostPlatform) - isx86_64 isAarch64 - isLinux isDarwin; - in - if isx86_64 && isLinux then - "sudo --validate && sudo nixos-rebuild" - else if isDarwin then - "darwin-rebuild" - else if isAarch64 then - "nix-on-droid" - else - "home-manager" - } --flake ${ - if cfg.hostname != null - then "${cfg.flakePath}#${cfg.hostname}" - else "${cfg.flakePath}" - } ''$''\{1:-switch''\} "''$''\{@:2''\}" |& nix run nixpkgs#nix-output-monitor + function take() { + mkdir -p "''$''\{@''\}" && cd "''$''\{@''\}" } '' (optionalString cfg.atuin '' @@ -163,10 +267,11 @@ in # (optionalString cfg.direnv '' # eval "$(${pkgs.direnv}/bin/direnv hook zsh)" # '') - (optionalString cfg.zoxide '' - eval "$(${pkgs.zoxide}/bin/zoxide init zsh)" - '') - cfg.extraConfig + # NOTE: done by `programs.zoxide` + # (optionalString cfg.zoxide '' + # eval "$(${pkgs.zoxide}/bin/zoxide init zsh)" + # '') + # cfg.extraConfig ]; plugins = [ diff --git a/modules/home-manager/reo101-shell/nushell/config.nu b/modules/home-manager/reo101-shell/nushell/config.nu new file mode 100644 index 0000000..5361dbf --- /dev/null +++ b/modules/home-manager/reo101-shell/nushell/config.nu @@ -0,0 +1,768 @@ +# Nushell Config File +# +# version = "0.84.0" + +# For more information on defining custom themes, see +# https://www.nushell.sh/book/coloring_and_theming.html +# And here is the theme collection +# https://github.com/nushell/nu_scripts/tree/main/themes +let dark_theme = { + # color for nushell primitives + separator: white + leading_trailing_space_bg: { attr: n } # no fg, no bg, attr none effectively turns this off + header: green_bold + empty: blue + # Closures can be used to choose colors for specific values. + # The value (in this case, a bool) is piped into the closure. + # eg) {|| if $in { 'light_cyan' } else { 'light_gray' } } + bool: light_cyan + int: white + filesize: cyan + duration: white + date: purple + range: white + float: white + string: white + nothing: white + binary: white + cellpath: white + row_index: green_bold + record: white + list: white + block: white + hints: dark_gray + search_result: {bg: red fg: white} + shape_and: purple_bold + shape_binary: purple_bold + shape_block: blue_bold + shape_bool: light_cyan + shape_closure: green_bold + shape_custom: green + shape_datetime: cyan_bold + shape_directory: cyan + shape_external: cyan + shape_externalarg: green_bold + shape_filepath: cyan + shape_flag: blue_bold + shape_float: purple_bold + # shapes are used to change the cli syntax highlighting + shape_garbage: { fg: white bg: red attr: b} + shape_globpattern: cyan_bold + shape_int: purple_bold + shape_internalcall: cyan_bold + shape_list: cyan_bold + shape_literal: blue + shape_match_pattern: green + shape_matching_brackets: { attr: u } + shape_nothing: light_cyan + shape_operator: yellow + shape_or: purple_bold + shape_pipe: purple_bold + shape_range: yellow_bold + shape_record: cyan_bold + shape_redirection: purple_bold + shape_signature: green_bold + shape_string: green + shape_string_interpolation: cyan_bold + shape_table: blue_bold + shape_variable: purple + shape_vardecl: purple +} + +let light_theme = { + # color for nushell primitives + separator: dark_gray + leading_trailing_space_bg: { attr: n } # no fg, no bg, attr none effectively turns this off + header: green_bold + empty: blue + # Closures can be used to choose colors for specific values. + # The value (in this case, a bool) is piped into the closure. + # eg) {|| if $in { 'dark_cyan' } else { 'dark_gray' } } + bool: dark_cyan + int: dark_gray + filesize: cyan_bold + duration: dark_gray + date: purple + range: dark_gray + float: dark_gray + string: dark_gray + nothing: dark_gray + binary: dark_gray + cellpath: dark_gray + row_index: green_bold + record: white + list: white + block: white + hints: dark_gray + search_result: {fg: white bg: red} + shape_and: purple_bold + shape_binary: purple_bold + shape_block: blue_bold + shape_bool: light_cyan + shape_closure: green_bold + shape_custom: green + shape_datetime: cyan_bold + shape_directory: cyan + shape_external: cyan + shape_externalarg: green_bold + shape_filepath: cyan + shape_flag: blue_bold + shape_float: purple_bold + # shapes are used to change the cli syntax highlighting + shape_garbage: { fg: white bg: red attr: b} + shape_globpattern: cyan_bold + shape_int: purple_bold + shape_internalcall: cyan_bold + shape_list: cyan_bold + shape_literal: blue + shape_match_pattern: green + shape_matching_brackets: { attr: u } + shape_nothing: light_cyan + shape_operator: yellow + shape_or: purple_bold + shape_pipe: purple_bold + shape_range: yellow_bold + shape_record: cyan_bold + shape_redirection: purple_bold + shape_signature: green_bold + shape_string: green + shape_string_interpolation: cyan_bold + shape_table: blue_bold + shape_variable: purple + shape_vardecl: purple +} + +# External completer example +# let carapace_completer = {|spans| +# carapace $spans.0 nushell $spans | from json +# } + +# The default config record. This is where much of your global configuration is setup. +$env.config = { + 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 + clickable_links: true # enable or disable clickable links. Your terminal has to support links. + } + + rm: { + always_trash: false # always act as if -t was given. Can be overridden with -p + } + + cd: { + abbreviations: false # allows `cd s/o/f` to expand to `cd some/other/folder` + } + + table: { + mode: rounded # 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 + trim: { + methodology: wrapping # wrapping or truncating + wrapping_try_keep_words: true # A strategy used by the 'wrapping' methodology + truncating_suffix: "..." # A suffix used by the 'truncating' methodology + } + header_on_separator: false # show header text on separator/border line + } + + # datetime_format determines what a datetime rendered in the shell would look like. + # Behavior without this configuration point will be to "humanize" the datetime display, + # showing something like "a day ago." + datetime_format: { + # normal: '%a, %d %b %Y %H:%M:%S %z' # shows up in displays of variables or other datetime's outside of tables + # table: '%m/%d/%y %I:%M:%S%p' # generally shows up in tabular outputs such as ls. commenting this out will change it to the default human readable datetime format + } + + explore: { + try: { + border_color: {fg: "white"} + }, + status_bar_background: {fg: "#1D1F21", bg: "#C4C9C6"}, + command_bar_text: {fg: "#C4C9C6"}, + highlight: {fg: "black", bg: "yellow"}, + status: { + error: {fg: "white", bg: "red"}, + warn: {} + info: {} + }, + table: { + split_line: {fg: "#404040"}, + selected_cell: {}, + selected_row: {}, + selected_column: {}, + show_cursor: true, + line_head_top: true, + line_head_bottom: true, + line_shift: true, + line_index: true, + }, + config: { + border_color: {fg: "white"} + cursor_color: {fg: "black", bg: "light_yellow"} + }, + } + + history: { + max_size: 100_000 # Session has to be reloaded for this to take effect + sync_on_enter: true # Enable to share history between multiple sessions, else you have to close the session to write history to file + file_format: "plaintext" # "sqlite" or "plaintext" + isolation: false # only available with sqlite file_format. true enables history isolation, false disables it. true will allow the history to be isolated to the current session using up/down arrows. false will allow the history to be shared across all sessions. + } + + completions: { + case_sensitive: false # set to true to enable case-sensitive completions + quick: true # set this to false to prevent auto-selecting completions when only one remains + partial: true # set this to false to prevent partial filling of the prompt + algorithm: "prefix" # prefix or fuzzy + external: { + enable: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up may be very slow + max_results: 100 # setting it lower can improve completion performance at the cost of omitting some options + completer: null # check 'carapace_completer' above as an example + } + } + + filesize: { + metric: true # true => KB, MB, GB (ISO standard), false => KiB, MiB, GiB (Windows standard) + format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, auto + } + + cursor_shape: { + emacs: line # block, underscore, line, blink_block, blink_underscore, blink_line (line is the default) + vi_insert: line # block, underscore, line , blink_block, blink_underscore, blink_line (block is the default) + vi_normal: block # block, underscore, line, blink_block, blink_underscore, blink_line (underscore is the default) + } + + color_config: $dark_theme # if you want a more interesting theme, you can replace the empty record with `$dark_theme`, `$light_theme` or another custom record + use_grid_icons: true + footer_mode: "25" # always, never, number_of_rows, auto + float_precision: 2 # the precision for displaying floats in tables + buffer_editor: "" # command that will be used to edit the current line buffer with ctrl+o, if unset fallback to $env.EDITOR and $env.VISUAL + use_ansi_coloring: true + bracketed_paste: true # enable bracketed paste, currently useless on windows + edit_mode: vi # emacs, vi + shell_integration: false # 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. + + hooks: { + pre_prompt: [{ null }] # run before the prompt is shown + pre_execution: [{ null }] # run before the repl input is run + env_change: { + PWD: [{|before, after| null }] # run if the PWD environment is different since the last repl input + } + display_output: "if (term size).columns >= 100 { table -e } else { table }" # run to display the output of a pipeline + command_not_found: { null } # return an error message when a command is not found + } + + menus: [ + # Configuration for default nushell menus + # Note the lack of source parameter + { + name: completion_menu + only_buffer_difference: false + marker: "| " + type: { + layout: columnar + columns: 4 + col_width: 20 # Optional value. If missing all the screen width is used to calculate column width + col_padding: 2 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + } + { + name: history_menu + only_buffer_difference: true + marker: "? " + type: { + layout: list + page_size: 10 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + } + { + name: help_menu + only_buffer_difference: true + marker: "? " + type: { + layout: description + columns: 4 + col_width: 20 # Optional value. If missing all the screen width is used to calculate column width + col_padding: 2 + selection_rows: 4 + description_rows: 10 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + } + ] + + keybindings: [ + { + name: completion_menu + modifier: none + keycode: tab + mode: [emacs vi_normal vi_insert] + event: { + until: [ + { send: menu name: completion_menu } + { send: menunext } + ] + } + } + { + name: history_menu + modifier: control + keycode: char_r + mode: [emacs, vi_insert, vi_normal] + event: { send: menu name: history_menu } + } + { + name: help_menu + modifier: none + keycode: f1 + mode: [emacs, vi_insert, vi_normal] + event: { send: menu name: help_menu } + } + { + name: completion_previous_menu + modifier: shift + keycode: backtab + mode: [emacs, vi_normal, vi_insert] + event: { send: menuprevious } + } + { + name: next_page_menu + modifier: control + keycode: char_x + mode: emacs + event: { send: menupagenext } + } + { + name: undo_or_previous_page_menu + modifier: control + keycode: char_z + mode: emacs + event: { + until: [ + { send: menupageprevious } + { edit: undo } + ] + } + } + { + name: escape + modifier: none + keycode: escape + mode: [emacs, vi_normal, vi_insert] + event: { send: esc } # NOTE: does not appear to work + } + { + name: cancel_command + modifier: control + keycode: char_c + mode: [emacs, vi_normal, vi_insert] + event: { send: ctrlc } + } + { + name: quit_shell + modifier: control + keycode: char_d + mode: [emacs, vi_normal, vi_insert] + event: { send: ctrld } + } + { + name: clear_screen + modifier: control + keycode: char_l + mode: [emacs, vi_normal, vi_insert] + event: { send: clearscreen } + } + { + name: search_history + modifier: control + keycode: char_q + mode: [emacs, vi_normal, vi_insert] + event: { send: searchhistory } + } + { + name: open_command_editor + modifier: control + keycode: char_o + mode: [emacs, vi_normal, vi_insert] + event: { send: openeditor } + } + { + name: move_up + modifier: none + keycode: up + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menuup} + {send: up} + ] + } + } + { + name: move_down + modifier: none + keycode: down + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menudown} + {send: down} + ] + } + } + { + name: move_left + modifier: none + keycode: left + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menuleft} + {send: left} + ] + } + } + { + name: move_right_or_take_history_hint + modifier: none + keycode: right + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: historyhintcomplete} + {send: menuright} + {send: right} + ] + } + } + { + name: move_one_word_left + modifier: control + keycode: left + mode: [emacs, vi_normal, vi_insert] + event: {edit: movewordleft} + } + { + name: move_one_word_right_or_take_history_hint + modifier: control + keycode: right + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: historyhintwordcomplete} + {edit: movewordright} + ] + } + } + { + name: move_to_line_start + modifier: none + keycode: home + mode: [emacs, vi_normal, vi_insert] + event: {edit: movetolinestart} + } + { + name: move_to_line_start + modifier: control + keycode: char_a + mode: [emacs, vi_normal, vi_insert] + event: {edit: movetolinestart} + } + { + name: move_to_line_end_or_take_history_hint + modifier: none + keycode: end + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: historyhintcomplete} + {edit: movetolineend} + ] + } + } + { + name: move_to_line_end_or_take_history_hint + modifier: control + keycode: char_e + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: historyhintcomplete} + {edit: movetolineend} + ] + } + } + { + name: move_to_line_start + modifier: control + keycode: home + mode: [emacs, vi_normal, vi_insert] + event: {edit: movetolinestart} + } + { + name: move_to_line_end + modifier: control + keycode: end + mode: [emacs, vi_normal, vi_insert] + event: {edit: movetolineend} + } + { + name: move_up + modifier: control + keycode: char_p + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menuup} + {send: up} + ] + } + } + { + name: move_down + modifier: control + keycode: char_t + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menudown} + {send: down} + ] + } + } + { + name: delete_one_character_backward + modifier: none + keycode: backspace + mode: [emacs, vi_insert] + event: {edit: backspace} + } + { + name: delete_one_word_backward + modifier: control + keycode: backspace + mode: [emacs, vi_insert] + event: {edit: backspaceword} + } + { + name: delete_one_character_forward + modifier: none + keycode: delete + mode: [emacs, vi_insert] + event: {edit: delete} + } + { + name: delete_one_character_forward + modifier: control + keycode: delete + mode: [emacs, vi_insert] + event: {edit: delete} + } + { + name: delete_one_character_forward + modifier: control + keycode: char_h + mode: [emacs, vi_insert] + event: {edit: backspace} + } + { + name: delete_one_word_backward + modifier: control + keycode: char_w + mode: [emacs, vi_insert] + event: {edit: backspaceword} + } + { + name: move_left + modifier: none + keycode: backspace + mode: vi_normal + event: {edit: moveleft} + } + { + name: newline_or_run_command + modifier: none + keycode: enter + mode: emacs + event: {send: enter} + } + { + name: move_left + modifier: control + keycode: char_b + mode: emacs + event: { + until: [ + {send: menuleft} + {send: left} + ] + } + } + { + name: move_right_or_take_history_hint + modifier: control + keycode: char_f + mode: emacs + event: { + until: [ + {send: historyhintcomplete} + {send: menuright} + {send: right} + ] + } + } + { + name: redo_change + modifier: control + keycode: char_g + mode: emacs + event: {edit: redo} + } + { + name: undo_change + modifier: control + keycode: char_z + mode: emacs + event: {edit: undo} + } + { + name: paste_before + modifier: control + keycode: char_y + mode: emacs + event: {edit: pastecutbufferbefore} + } + { + name: cut_word_left + modifier: control + keycode: char_w + mode: emacs + event: {edit: cutwordleft} + } + { + name: cut_line_to_end + modifier: control + keycode: char_k + mode: emacs + event: {edit: cuttoend} + } + { + name: cut_line_from_start + modifier: control + keycode: char_u + mode: emacs + event: {edit: cutfromstart} + } + { + name: swap_graphemes + modifier: control + keycode: char_t + mode: emacs + event: {edit: swapgraphemes} + } + { + name: move_one_word_left + modifier: alt + keycode: left + mode: emacs + event: {edit: movewordleft} + } + { + name: move_one_word_right_or_take_history_hint + modifier: alt + keycode: right + mode: emacs + event: { + until: [ + {send: historyhintwordcomplete} + {edit: movewordright} + ] + } + } + { + name: move_one_word_left + modifier: alt + keycode: char_b + mode: emacs + event: {edit: movewordleft} + } + { + name: move_one_word_right_or_take_history_hint + modifier: alt + keycode: char_f + mode: emacs + event: { + until: [ + {send: historyhintwordcomplete} + {edit: movewordright} + ] + } + } + { + name: delete_one_word_forward + modifier: alt + keycode: delete + mode: emacs + event: {edit: deleteword} + } + { + name: delete_one_word_backward + modifier: alt + keycode: backspace + mode: emacs + event: {edit: backspaceword} + } + { + name: delete_one_word_backward + modifier: alt + keycode: char_m + mode: emacs + event: {edit: backspaceword} + } + { + name: cut_word_to_right + modifier: alt + keycode: char_d + mode: emacs + event: {edit: cutwordright} + } + { + name: upper_case_word + modifier: alt + keycode: char_u + mode: emacs + event: {edit: uppercaseword} + } + { + name: lower_case_word + modifier: alt + keycode: char_l + mode: emacs + event: {edit: lowercaseword} + } + { + name: capitalize_char + modifier: alt + keycode: char_c + mode: emacs + event: {edit: capitalizechar} + } + ] +} diff --git a/modules/home-manager/reo101-shell/nushell/env.nu b/modules/home-manager/reo101-shell/nushell/env.nu new file mode 100644 index 0000000..0d321b6 --- /dev/null +++ b/modules/home-manager/reo101-shell/nushell/env.nu @@ -0,0 +1,82 @@ +# Nushell Environment Config File +# +# version = "0.84.0" + +## def create_left_prompt [] { +## mut home = "" +## try { +## if $nu.os-info.name == "windows" { +## $home = $env.USERPROFILE +## } else { +## $home = $env.HOME +## } +## } +## +## let dir = ([ +## ($env.PWD | str substring 0..($home | str length) | str replace $home "~"), +## ($env.PWD | str substring ($home | str length)..) +## ] | str 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)" +## +## $path_segment | str replace --all (char path_sep) $"($separator_color)/($path_color)" +## } +## +## 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 '%Y/%m/%d %r') +## ] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" | +## str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}") +## +## let last_exit_code = if ($env.LAST_EXIT_CODE != 0) {([ +## (ansi rb) +## ($env.LAST_EXIT_CODE) +## ] | str join) +## } else { "" } +## +## ([$last_exit_code, (char space), $time_segment] | str join) +## } +## +## # Use nushell functions to define your right and left prompt +## $env.PROMPT_COMMAND = {|| create_left_prompt } +## # $env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt } +## +## # The prompt indicators are environmental variables that represent +## # the state of the prompt +## $env.PROMPT_INDICATOR = {|| "> " } +## $env.PROMPT_INDICATOR_VI_INSERT = {|| ": " } +## $env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " } +## $env.PROMPT_MULTILINE_INDICATOR = {|| "::: " } + +# Specifies how environment variables are: +# - converted from a string to a value on Nushell startup (from_string) +# - converted from a value back to a string when running external commands (to_string) +# Note: The conversions happen *after* config.nu is loaded +$env.ENV_CONVERSIONS = { + "PATH": { + from_string: { |s| $s | split row (char esep) | path expand --no-symlink } + to_string: { |v| $v | path expand --no-symlink | str join (char esep) } + } + "Path": { + from_string: { |s| $s | split row (char esep) | path expand --no-symlink } + to_string: { |v| $v | path expand --no-symlink | str join (char esep) } + } +} + +# Directories to search for scripts when calling source or use +$env.NU_LIB_DIRS = [ + # ($nu.default-config-dir | path join 'scripts') # add /scripts +] + +# Directories to search for plugin binaries when calling register +$env.NU_PLUGIN_DIRS = [ + # ($nu.default-config-dir | path join 'plugins') # add /plugins +] + +# To add entries to PATH (on Windows you might use Path), you can use the following pattern: +# $env.PATH = ($env.PATH | split row (char esep) | prepend '/some/path') diff --git a/modules/home-manager/reo101-shell/nushell/login.nu b/modules/home-manager/reo101-shell/nushell/login.nu new file mode 100644 index 0000000..e69de29