about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatryk Niedźwiedziński <pniedzwiedzinski19@gmail.com>2020-09-26 11:51:36 +0200
committerPatryk Niedźwiedziński <pniedzwiedzinski19@gmail.com>2020-09-26 11:51:36 +0200
commit8d22fcabcc9e5a6c1ca15a51def7059060ececad (patch)
tree865f874c842f78668aebfd47fa95a27d7e54086a
parent97cf939f17abc850f642f668a286c85b31bf2b41 (diff)
downloaddots-8d22fcabcc9e5a6c1ca15a51def7059060ececad.tar.gz
dots-8d22fcabcc9e5a6c1ca15a51def7059060ececad.zip
Add vi in zsh
-rw-r--r--programs/zsh/default.nix7
-rw-r--r--programs/zsh/postcomp.zshrc56
2 files changed, 59 insertions, 4 deletions
diff --git a/programs/zsh/default.nix b/programs/zsh/default.nix
index 0e19da1..a593fed 100644
--- a/programs/zsh/default.nix
+++ b/programs/zsh/default.nix
@@ -4,7 +4,8 @@ let
   isDarwin = builtins.currentSystem == "x86_64-darwin";
   platformAliases =
     if isDarwin then ../../platforms/darwin/aliases.nix
-    else ../../platforms/linux/aliases.nix
+    else ../../platforms/linux/aliases.nix;
+in
 {
   programs.zsh = {
     enable = true;
@@ -20,9 +21,7 @@ let
     shellAliases = import ../aliases.nix // import platformAliases;
     defaultKeymap = "viins";
     initExtraBeforeCompInit = builtins.readFile ./precomp.zshrc;
-    initExtra = ''
-      _comp_options+=(globdots)
-    '';
+    initExtra = builtins.readFile ./postcomp.zshrc;
 
     sessionVariables = rec {
       PROMPT="%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]%{$reset_color%}$%b ";
diff --git a/programs/zsh/postcomp.zshrc b/programs/zsh/postcomp.zshrc
new file mode 100644
index 0000000..178240f
--- /dev/null
+++ b/programs/zsh/postcomp.zshrc
@@ -0,0 +1,56 @@
+_comp_options+=(globdots)		# Include hidden files.
+
+export KEYTIMEOUT=1
+
+# Use vim keys in tab complete menu:
+bindkey -M menuselect 'h' vi-backward-char
+bindkey -M menuselect 'k' vi-up-line-or-history
+bindkey -M menuselect 'l' vi-forward-char
+bindkey -M menuselect 'j' vi-down-line-or-history
+bindkey -v '^?' backward-delete-char
+
+# Change cursor shape for different vi modes.
+function zle-keymap-select {
+  if [[ ${KEYMAP} == vicmd ]] ||
+     [[ $1 = 'block' ]]; then
+    echo -ne '\e[1 q'
+  elif [[ ${KEYMAP} == main ]] ||
+       [[ ${KEYMAP} == viins ]] ||
+       [[ ${KEYMAP} = '' ]] ||
+       [[ $1 = 'beam' ]]; then
+    echo -ne '\e[5 q'
+  fi
+}
+zle -N zle-keymap-select
+zle-line-init() {
+    zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
+    echo -ne "\e[5 q"
+}
+zle -N zle-line-init
+echo -ne '\e[5 q' # Use beam shape cursor on startup.
+preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.
+
+# Use lf to switch directories and bind it to ctrl-o
+lfcd () {
+    tmp="$(mktemp)"
+    lf -last-dir-path="$tmp" "$@"
+    if [ -f "$tmp" ]; then
+        dir="$(cat "$tmp")"
+        rm -f "$tmp" >/dev/null
+        [ -d "$dir" ] && [ "$dir" != "$(pwd)" ] && cd "$dir"
+    fi
+}
+bindkey -s '^o' 'lfcd\n'
+
+bindkey -s '^a' 'bc -l\n'
+
+bindkey -s '^f' 'cd "$(dirname "$(fzf)")"\n'
+
+bindkey '^[[P' delete-char
+
+# Edit line in vim with ctrl-e:
+autoload edit-command-line; zle -N edit-command-line
+bindkey '^e' edit-command-line
+
+# Load syntax highlighting; should be last.
+source /usr/share/zsh/plugins/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh 2>/dev/null