about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2022-05-15 14:53:30 -0700
committerFranck Cuny <franck@fcuny.net>2022-05-15 14:53:30 -0700
commit52e42f959abb15e425b34ffbd31d7f32a6129636 (patch)
tree52f7d15a6f6ba821572629e2c28b1536d6c1752d
parenthome: run abcde in `~/import` (diff)
downloadworld-52e42f959abb15e425b34ffbd31d7f32a6129636.tar.gz
zsh: switch to zsh as the default shell
`zsh' is available everywhere and is compatible with bash. When using
`fish' I need to remember how to do things. While the completion style
is nicer, I don't care about the rest. I prefer to have a consistent
experience in the shell, no matter where am I.

This is an initial configuration, I might need to make a few changes as
I go.
-rw-r--r--home/default.nix1
-rw-r--r--home/zsh/completion-style.zsh34
-rw-r--r--home/zsh/default.nix42
-rw-r--r--home/zsh/options.zsh23
-rw-r--r--home/zsh/prompt.zsh4
-rw-r--r--hosts/aptos/home.nix2
-rw-r--r--hosts/carmel/home.nix2
-rw-r--r--hosts/tahoe/home.nix2
-rw-r--r--modules/system/users/default.nix2
9 files changed, 108 insertions, 4 deletions
diff --git a/home/default.nix b/home/default.nix
index 3cdce3c..435baed 100644
--- a/home/default.nix
+++ b/home/default.nix
@@ -36,5 +36,6 @@
     ./wm
     ./xdg
     ./yt-dlp
+    ./zsh
   ];
 }
diff --git a/home/zsh/completion-style.zsh b/home/zsh/completion-style.zsh
new file mode 100644
index 0000000..32bd6f4
--- /dev/null
+++ b/home/zsh/completion-style.zsh
@@ -0,0 +1,34 @@
+# Style the completion a bit
+zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
+
+# Show a prompt on selection
+zstyle ':completion:*' select-prompt '%SScrolling active: current selection at %p%s'
+
+# Use arrow keys in completion list
+zstyle ':completion:*' menu select
+
+# Group results by category
+zstyle ':completion:*' group-name ''
+
+# Keep directories and files separated
+zstyle ':completion:*' list-dirs-first true
+
+# Add colors to processes for kill completion
+zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'
+
+# match uppercase from lowercase
+zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
+
+# Filename suffixes to ignore during completion (except after rm command)
+zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.old'
+
+# command for process lists, the local web server details and host completion
+# on processes completion complete all user processes
+zstyle ':completion:*:processes' command 'ps -au$USER'
+
+# Completion formatting and messages
+zstyle ':completion:*' verbose yes
+zstyle ':completion:*:descriptions' format '%B%d%b'
+zstyle ':completion:*:messages' format '%d'
+zstyle ':completion:*:warnings' format 'No matches for: %d'
+zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
diff --git a/home/zsh/default.nix b/home/zsh/default.nix
new file mode 100644
index 0000000..cc19579
--- /dev/null
+++ b/home/zsh/default.nix
@@ -0,0 +1,42 @@
+{ config, pkgs, lib, ... }:
+let cfg = config.my.home.zsh;
+in {
+  options.my.home.zsh = with lib; {
+    enable = mkEnableOption "zsh configuration";
+  };
+
+  config = lib.mkIf cfg.enable {
+    home.packages = with pkgs; [ zsh-completions ];
+
+    programs.zsh = {
+      enable = true;
+      dotDir = ".config/zsh";
+      enableCompletion = true;
+
+      history = {
+        size = 500000;
+        save = 500000;
+        extended = false;
+        ignoreSpace = true;
+        ignoreDups = true;
+        share = false;
+        path = "${config.xdg.dataHome}/zsh/zsh_history";
+      };
+
+      localVariables = {
+        # Print timing statistics for everything which takes longer than 5 seconds of
+        # user + system time.
+        REPORTTIME = 5;
+      };
+
+      defaultKeymap = "emacs";
+      initExtra = lib.concatMapStrings builtins.readFile [
+        ./completion-style.zsh
+        ./options.zsh
+        ./prompt.zsh
+      ];
+
+    };
+    programs.dircolors = { enable = true; };
+  };
+}
diff --git a/home/zsh/options.zsh b/home/zsh/options.zsh
new file mode 100644
index 0000000..84ae8da
--- /dev/null
+++ b/home/zsh/options.zsh
@@ -0,0 +1,23 @@
+# Show an error when a globbing expansion doesn't find any match
+setopt nomatch
+
+# List on ambiguous completion and Insert first match immediately
+setopt autolist menucomplete
+
+# Use pushd when cd-ing around
+setopt autopushd pushdminus pushdsilent
+
+# Use single quotes in string without the weird escape tricks
+setopt rcquotes
+
+# Single word commands can resume an existing job
+setopt autoresume
+
+# Append commands to history as they are exectuted
+setopt inc_append_history_time
+
+# Remove useless whitespace from commands
+setopt hist_reduce_blanks
+
+# Those options aren't wanted
+unsetopt beep extendedglob notify
diff --git a/home/zsh/prompt.zsh b/home/zsh/prompt.zsh
new file mode 100644
index 0000000..1f92aa3
--- /dev/null
+++ b/home/zsh/prompt.zsh
@@ -0,0 +1,4 @@
+fg_green=$'%{\e[1;32m%}'
+fg_no_colour=$'%{\e[0m%}'
+
+PROMPT="%K{cyan}%F{black}%m%k%f ${fg_green}%~${fg_no_colour} %% "
diff --git a/hosts/aptos/home.nix b/hosts/aptos/home.nix
index 1bfd236..b3c226f 100644
--- a/hosts/aptos/home.nix
+++ b/hosts/aptos/home.nix
@@ -2,7 +2,7 @@
   my.home = {
     packages.enable = true;
     element.enable = true;
-    fish.enable = true;
+    zsh.enable = true;
     git.enable = true;
     go.enable = true;
     python.enable = true;
diff --git a/hosts/carmel/home.nix b/hosts/carmel/home.nix
index eaf3185..231aebd 100644
--- a/hosts/carmel/home.nix
+++ b/hosts/carmel/home.nix
@@ -3,7 +3,7 @@
 {
   my.home = {
     packages.enable = true;
-    fish.enable = true;
+    zsh.enable = true;
     git.enable = true;
     go.enable = true;
     python.enable = true;
diff --git a/hosts/tahoe/home.nix b/hosts/tahoe/home.nix
index 7ea3830..2e56275 100644
--- a/hosts/tahoe/home.nix
+++ b/hosts/tahoe/home.nix
@@ -6,7 +6,7 @@
     tmux.enable = true;
     git.enable = true;
     ssh.enable = true;
-    fish.enable = true;
+    zsh.enable = true;
     beets = {
       enable = true;
       musicDirectory = "/data/fast/music";
diff --git a/modules/system/users/default.nix b/modules/system/users/default.nix
index fb8e1f1..3086f18 100644
--- a/modules/system/users/default.nix
+++ b/modules/system/users/default.nix
@@ -13,7 +13,7 @@ in {
     uid = 1000;
     group = "fcuny";
     home = "/home/fcuny";
-    shell = pkgs.fish;
+    shell = pkgs.zsh;
     extraGroups = groupsIfExist [
       "docker"
       "users"