about summary refs log tree commit diff
path: root/home/zsh
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 /home/zsh
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.
Diffstat (limited to 'home/zsh')
-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
4 files changed, 103 insertions, 0 deletions
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} %% "