diff options
Diffstat (limited to 'home-manager/features/cli/shells/nushell')
6 files changed, 254 insertions, 0 deletions
diff --git a/home-manager/features/cli/shells/nushell/completion.nu b/home-manager/features/cli/shells/nushell/completion.nu new file mode 100644 index 0000000..b25d387 --- /dev/null +++ b/home-manager/features/cli/shells/nushell/completion.nu @@ -0,0 +1,17 @@ +# Carapace Autocomplete +let carapace_completer = {|spans| + carapace $spans.0 nushell ...$spans | from json +} +$env.config = { + completions: { + case_sensitive: false + quick: true + partial: true + algorithm: fuzzy + external: { + enable: true + max_results: 100 + completer: $carapace_completer + } + } +} diff --git a/home-manager/features/cli/shells/nushell/default.nix b/home-manager/features/cli/shells/nushell/default.nix new file mode 100644 index 0000000..7561fb1 --- /dev/null +++ b/home-manager/features/cli/shells/nushell/default.nix @@ -0,0 +1,109 @@ +{ + config, + pkgs, + lib, + ... +}: let + cfg = config.features.cli.shells.nushell; +in { + options.features.cli.shells.nushell.enable = lib.mkEnableOption "nushell"; + config = lib.mkIf cfg.enable { + home.packages = with pkgs; [ + television + gitprompt-rs + ]; + programs.nushell = { + enable = true; + plugins = with pkgs.nushellPlugins; [ + gstat + ]; + shellAliases = { + "nix-shell" = "nix-shell --command 'SHELL=nu nu'"; + "cd" = "z"; + "ze" = "zellij"; + "lg" = "lazygit"; + "bk" = "cd $env.OLDPWD"; + "fg" = "job unfreeze"; + }; + configFile.text = + /* + nu + */ + '' + # Source modularized configs. + source ${./prompt.nu} + source ${./completion.nu} + + # General Config + $env.config = { + show_banner: false + edit_mode: 'emacs' + + history: { + isolation: true # Isolate the history of each nushell session + file_format: sqlite # Required for isolation + } + } + $env.editor = "hx" + + # go should use a hidden directory + $env.gopath = "${config.home.homeDirectory}/.go" + + # Use direnv if present. + { || + if (which direnv | is-empty) { + return + } + direnv export json | from json | default {} | load-env + + } + + # define a function to initialize a direnv project + def projinit [path?: string] { # this code sucks but I'm tired of working on it + mut path = $path + if ($path == null) { + $path = "./" + } + let path = $path | path expand + let template_path = "${./direnv-project-template}" | path expand + let template_files = ls -a $template_path | get name + $template_files | each {|item| cp $item $path} + ls -a $path | get name | where {|name| $template_files | str contains ($name | path basename) | any {}} | each {|name| chmod +w $name} + if (try {git rev-parse --is-inside-work-tree e> /dev/null}) != null { + direnv allow + } else { + # git init + direnv allow + } + # git add $"($path)/." + # git commit -m "initialized" + } + + # Quickly create a nix shell. + def qs [...packages] { + if $packages == [] { + print "Please use a package name." + return + } + let packages_string = $packages + | each {|package| return $"nixpkgs#($package) "} + | str join + | str trim + nu -c $"nix shell ($packages_string)" + } + + # Quickly run a nix package. + def qr --wrapped [package: string ...arguments] { + nix run $"nixpkgs#($package)" -- ($arguments | str join " ") + } + ''; + }; + programs.zoxide.enable = true; + programs.carapace.enable = true; + programs.direnv = { + enable = true; + nix-direnv.enable = true; + silent = true; + }; + }; +} diff --git a/home-manager/features/cli/shells/nushell/direnv-project-template/.envrc b/home-manager/features/cli/shells/nushell/direnv-project-template/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/home-manager/features/cli/shells/nushell/direnv-project-template/.envrc @@ -0,0 +1 @@ +use flake diff --git a/home-manager/features/cli/shells/nushell/direnv-project-template/.gitignore b/home-manager/features/cli/shells/nushell/direnv-project-template/.gitignore new file mode 100644 index 0000000..92b2793 --- /dev/null +++ b/home-manager/features/cli/shells/nushell/direnv-project-template/.gitignore @@ -0,0 +1 @@ +.direnv diff --git a/home-manager/features/cli/shells/nushell/direnv-project-template/flake.nix b/home-manager/features/cli/shells/nushell/direnv-project-template/flake.nix new file mode 100644 index 0000000..4bab14a --- /dev/null +++ b/home-manager/features/cli/shells/nushell/direnv-project-template/flake.nix @@ -0,0 +1,29 @@ +{ + description = "Project flake"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + systems.url = "github:nix-systems/default"; + flake-utils = { + url = "github:numtide/flake-utils"; + inputs.systems.follows = "systems"; + }; + }; + + outputs = { + nixpkgs, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem ( + system: let + pkgs = nixpkgs.legacyPackages.${system}; + in { + devShells.default = pkgs.mkShell { + packages = with pkgs; [ + hello + ]; + }; + } + ); +} diff --git a/home-manager/features/cli/shells/nushell/prompt.nu b/home-manager/features/cli/shells/nushell/prompt.nu new file mode 100644 index 0000000..cfdd478 --- /dev/null +++ b/home-manager/features/cli/shells/nushell/prompt.nu @@ -0,0 +1,97 @@ +# +---------------+ +# | Prompt Config | +# +---------------+ + +# define segmants +def path_segment [] { + let current_dir = pwd + let truncated_current_dir = $current_dir + return (pwd | str replace $env.home '~') +} +def git_segment [] { + return (gitprompt-rs) +} +let do_newline = false # whether to do the newline thing +$env.PROMPT_COMMAND = {|| + # add a newline at the beginning if it isn't the first prompt + mut newline = "" + if ($env.CMD_DURATION_MS != '0823') and $do_newline { + $newline = "\n" + } + # define the prompt + return $"($newline)(ansi white) ╭ (ansi green_bold)(path_segment)(ansi reset) (git_segment)\n " +} + +# remove right prompt section +$env.PROMPT_COMMAND_RIGHT = { "" } + +# set default prompt indicator +$env.PROMPT_INDICATOR = $'(ansi white)╰ (ansi red_bold)> ' +# $env.TRANSIENT_PROMPT_INDICATOR = $' (ansi red_bold)> ' +$env.PROMPT_MULTILINE_INDICATOR = " : " + +# change prompt to a lambda if in a nix shell +let in_nix_shell = $env.path | str contains "/nix/store" | any {|el| $el} +if $in_nix_shell { + $env.PROMPT_INDICATOR = $'(ansi white)╰ (ansi red_bold)λ ' +} + +# replace vi insert and normal mode prompt indicators with cursor changes +$env.PROMPT_INDICATOR_VI_NORMAL = $env.PROMPT_INDICATOR +$env.PROMPT_INDICATOR_VI_INSERT = $env.PROMPT_INDICATOR +$env.config.cursor_shape.vi_insert = "line" +$env.config.cursor_shape.vi_normal = "block" + +$env.config.cursor_shape.emacs = "line" + +# customize menus to match +$env.config.menus = [ + { + name: help_menu + only_buffer_difference: true # Search is done on the text written after activating the menu + marker: $env.PROMPT_INDICATOR # Indicator that appears with the menu is active + type: { + layout: description # Type of menu + columns: 4 # Number of columns where the options are displayed + col_width: 20 # Optional value. If missing all the screen width is used to calculate column width + col_padding: 2 # Padding between columns + selection_rows: 4 # Number of rows allowed to display found options + description_rows: 10 # Number of rows allowed to display command description + } + style: { + text: green # Text style + selected_text: green_reverse # Text style for selected option + description_text: yellow # Text style for description + } + } + { + name: completion_menu + only_buffer_difference: false # Search is done on the text written after activating the menu + marker: $env.PROMPT_INDICATOR # Indicator that appears with the menu is active + type: { + layout: columnar # Type of menu + columns: 4 # Number of columns where the options are displayed + col_width: 20 # Optional value. If missing all the screen width is used to calculate column width + col_padding: 2 # Padding between columns + } + style: { + text: green # Text style + selected_text: green_reverse # Text style for selected option + description_text: yellow # Text style for description + } + } + { + name: history_menu + only_buffer_difference: true # Search is done on the text written after activating the menu + marker: $env.PROMPT_INDICATOR # Indicator that appears with the menu is active + type: { + layout: list # Type of menu + page_size: 10 # Number of entries that will presented when activating the menu + } + style: { + text: green # Text style + selected_text: green_reverse # Text style for selected option + description_text: yellow # Text style for description + } + } +] |
