summaryrefslogtreecommitdiff
path: root/features/user/cli/shells
diff options
context:
space:
mode:
Diffstat (limited to 'features/user/cli/shells')
-rw-r--r--features/user/cli/shells/nushell/completion.nu17
-rw-r--r--features/user/cli/shells/nushell/default.nix93
-rw-r--r--features/user/cli/shells/nushell/direnv-project-template/.envrc1
-rw-r--r--features/user/cli/shells/nushell/direnv-project-template/flake.nix29
-rw-r--r--features/user/cli/shells/nushell/prompt.nu95
5 files changed, 235 insertions, 0 deletions
diff --git a/features/user/cli/shells/nushell/completion.nu b/features/user/cli/shells/nushell/completion.nu
new file mode 100644
index 0000000..b25d387
--- /dev/null
+++ b/features/user/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/features/user/cli/shells/nushell/default.nix b/features/user/cli/shells/nushell/default.nix
new file mode 100644
index 0000000..7df34e8
--- /dev/null
+++ b/features/user/cli/shells/nushell/default.nix
@@ -0,0 +1,93 @@
+{
+ 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";
+ "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: 'vi'
+
+ 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] {
+ mut path = $path
+ if ($path == null) {
+ $path = "./"
+ }
+ let path = $path | path expand
+ cp -r ${./direnv-project-template}/* ./
+ direnv allow
+ }
+
+ # Quicker nix shells.
+ def qs [...pkgs] {
+ if $pkgs == [] {
+ print "Please use a package name"
+ return
+ }
+ let pkgs_string = $pkgs
+ | each {|pkg| return $"nixpkgs#($pkg) "}
+ | str join
+ | str trim
+ nu -c $"nix shell ($pkgs_string)"
+ }
+ '';
+ };
+ programs.zoxide.enable = true;
+ programs.carapace.enable = true;
+ programs.direnv = {
+ enable = true;
+ nix-direnv.enable = true;
+ silent = true;
+ };
+ };
+}
diff --git a/features/user/cli/shells/nushell/direnv-project-template/.envrc b/features/user/cli/shells/nushell/direnv-project-template/.envrc
new file mode 100644
index 0000000..3550a30
--- /dev/null
+++ b/features/user/cli/shells/nushell/direnv-project-template/.envrc
@@ -0,0 +1 @@
+use flake
diff --git a/features/user/cli/shells/nushell/direnv-project-template/flake.nix b/features/user/cli/shells/nushell/direnv-project-template/flake.nix
new file mode 100644
index 0000000..4bab14a
--- /dev/null
+++ b/features/user/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/features/user/cli/shells/nushell/prompt.nu b/features/user/cli/shells/nushell/prompt.nu
new file mode 100644
index 0000000..9e04ed5
--- /dev/null
+++ b/features/user/cli/shells/nushell/prompt.nu
@@ -0,0 +1,95 @@
+# +---------------+
+# | 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"
+
+# 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
+ }
+ }
+]