{pkgs, ...}: { programs.nushell = { enable = true; settings = { show_banner = false; completions = { algorithm = "fuzzy"; case_sensitive = false; }; history = { file_format = "sqlite"; }; use_ls_colors = true; }; environmentVariables = { COLORTERM = "truecolor"; COLORFGBG = "15;0"; TERM_BACKGROUND = "light"; }; extraEnv = '' $env.LS_COLORS = (${pkgs.vivid}/bin/vivid generate catppuccin-latte) ''; extraConfig = '' # --- Catppuccin Latte Theme --- let theme = { rosewater: "#dc8a78" flamingo: "#dd7878" pink: "#ea76cb" mauve: "#8839ef" red: "#d20f39" maroon: "#e64553" peach: "#fe640b" yellow: "#df8e1d" green: "#40a02b" teal: "#179299" sky: "#04a5e5" sapphire: "#209fb5" blue: "#1e66f5" lavender: "#7287fd" text: "#4c4f69" subtext1: "#5c5f77" subtext0: "#6c6f85" overlay2: "#7c7f93" overlay1: "#8c8fa1" overlay0: "#9ca0b0" surface2: "#acb0be" surface1: "#bcc0cc" surface0: "#ccd0da" base: "#eff1f5" mantle: "#e6e9ef" crust: "#dce0e8" } let scheme = { recognized_command: $theme.blue unrecognized_command: $theme.text constant: $theme.peach punctuation: $theme.overlay2 operator: $theme.sky string: $theme.green virtual_text: $theme.surface2 variable: { fg: $theme.flamingo attr: i } filepath: $theme.yellow } $env.config.color_config = { separator: { fg: $theme.surface2 attr: b } leading_trailing_space_bg: { fg: $theme.lavender attr: u } header: { fg: $theme.text attr: b } row_index: $scheme.virtual_text record: $theme.text list: $theme.text hints: $scheme.virtual_text search_result: { fg: $theme.base bg: $theme.yellow } shape_closure: $theme.teal closure: $theme.teal shape_flag: { fg: $theme.maroon attr: i } shape_matching_brackets: { attr: u } shape_garbage: $theme.red shape_keyword: $theme.mauve shape_match_pattern: $theme.green shape_signature: $theme.teal shape_table: $scheme.punctuation cell-path: $scheme.punctuation shape_list: $scheme.punctuation shape_record: $scheme.punctuation shape_vardecl: $scheme.variable shape_variable: $scheme.variable empty: { attr: n } filesize: {|| if $in < 1kb { $theme.teal } else if $in < 10kb { $theme.green } else if $in < 100kb { $theme.yellow } else if $in < 10mb { $theme.peach } else if $in < 100mb { $theme.maroon } else if $in < 1gb { $theme.red } else { $theme.mauve } } duration: {|| if $in < 1day { $theme.teal } else if $in < 1wk { $theme.green } else if $in < 4wk { $theme.yellow } else if $in < 12wk { $theme.peach } else if $in < 24wk { $theme.maroon } else if $in < 52wk { $theme.red } else { $theme.mauve } } datetime: {|| (date now) - $in | if $in < 1day { $theme.teal } else if $in < 1wk { $theme.green } else if $in < 4wk { $theme.yellow } else if $in < 12wk { $theme.peach } else if $in < 24wk { $theme.maroon } else if $in < 52wk { $theme.red } else { $theme.mauve } } shape_external: $scheme.unrecognized_command shape_internalcall: $scheme.recognized_command shape_external_resolved: $scheme.recognized_command shape_block: $scheme.recognized_command block: $scheme.recognized_command shape_custom: $theme.pink custom: $theme.pink background: $theme.base foreground: $theme.text cursor: { bg: $theme.rosewater fg: $theme.base } shape_range: $scheme.operator range: $scheme.operator shape_pipe: $scheme.operator shape_operator: $scheme.operator shape_redirection: $scheme.operator glob: $scheme.filepath shape_directory: $scheme.filepath shape_filepath: $scheme.filepath shape_glob_interpolation: $scheme.filepath shape_globpattern: $scheme.filepath shape_int: $scheme.constant int: $scheme.constant bool: $scheme.constant float: $scheme.constant nothing: $scheme.constant binary: $scheme.constant shape_nothing: $scheme.constant shape_bool: $scheme.constant shape_float: $scheme.constant shape_binary: $scheme.constant shape_datetime: $scheme.constant shape_literal: $scheme.constant string: $scheme.string shape_string: $scheme.string shape_string_interpolation: $theme.flamingo shape_raw_string: $scheme.string shape_externalarg: $scheme.string } $env.config.highlight_resolved_externals = true $env.config.explore = { status_bar_background: { fg: $theme.text, bg: $theme.mantle }, command_bar_text: { fg: $theme.text }, highlight: { fg: $theme.base, bg: $theme.yellow }, status: { error: $theme.red, warn: $theme.yellow, info: $theme.blue, }, selected_cell: { bg: $theme.blue fg: $theme.base }, } # --- Custom Commands --- def --env open_project [] { let base = ($env.HOME | path join "Projects") let choice = ( ${pkgs.fd}/bin/fd -t d -d 1 -a . ($base | path join "Personal") ($base | path join "Work") | lines | each {|p| $p | str replace $"($base)/" "" } | str join "\n" | ${pkgs.fzf}/bin/fzf --prompt "project > " ) if ($choice | str trim | is-not-empty) { cd ($base | path join ($choice | str trim)) } } # --- Keybinding: Ctrl+O for open_project --- $env.config.keybindings = ($env.config.keybindings | append [ { name: open_project modifier: control keycode: char_o mode: [emacs vi_insert vi_normal] event: { send: executehostcommand cmd: "open_project" } } ]) ''; }; }