about summary refs log tree commit diff stats
path: root/.zshrc
diff options
context:
space:
mode:
authorDavid Morgan <djm_uk@protonmail.com>2021-07-09 21:15:50 +0100
committerDavid Morgan <djm_uk@protonmail.com>2021-07-09 21:15:50 +0100
commit2dfd062a9183ace11d70f71650b8a69429e12e0f (patch)
tree057f4692468ce409f5d8ca4ac41a654b6be1c164 /.zshrc
parent02f72d1f9f14ae3c04dc60d99cc5e0c86d064bdf (diff)
downloaddotfiles-2dfd062a9183ace11d70f71650b8a69429e12e0f.tar.gz
Switch from prezto to zsh4humans
Diffstat (limited to '.zshrc')
-rw-r--r--.zshrc254
1 files changed, 193 insertions, 61 deletions
diff --git a/.zshrc b/.zshrc
index 423e799..0eed466 100644
--- a/.zshrc
+++ b/.zshrc
@@ -1,77 +1,209 @@
+# Personal Zsh configuration file. It is strongly recommended to keep all
+# shell customization and configuration (including exported environment
+# variables such as PATH) in this file or in files source by it.
 #
-# Executes commands at the start of an interactive session.
+# Documentation: https://github.com/romkatv/zsh4humans/blob/v5/README.md.
+
+# Periodic auto-update on Zsh startup: 'ask' or 'no'.
+# You can manually run `z4h update` to update everything.
+zstyle ':z4h:' auto-update      'no'
+# Ask whether to auto-update this often; has no effect if auto-update is 'no'.
+zstyle ':z4h:' auto-update-days '28'
+
+# Automaticaly wrap TTY with a transparent tmux ('integrated'), or start a
+# full-fledged tmux ('system'), or disable features that require tmux ('no').
+if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] || [ -n "$INSIDE_EMACS" ]; then
+  zstyle ':z4h:' start-tmux       'no'
+else
+  zstyle ':z4h:' start-tmux       'system'
+fi
+# Move prompt to the bottom when zsh starts up so that it's always in the
+# same position. Has no effect if start-tmux is 'no'.
+zstyle ':z4h:' prompt-at-bottom 'yes'
+
+# Keyboard type: 'mac' or 'pc'.
+if [ "$(uname 2> /dev/null)" = "Darwin" ]; then
+  zstyle ':z4h:bindkey' keyboard  'mac'
+  zstyle ':z4h:'                  iterm2-integration yes
+else
+  zstyle ':z4h:bindkey' keyboard  'pc'
+fi
+
+# Right-arrow key accepts one character ('partial-accept') from
+# command autosuggestions or the whole thing ('accept')?
+zstyle ':z4h:autosuggestions' forward-char 'accept'
+
+# Recursively traverse directories when TAB-completing files.
+zstyle ':z4h:fzf-complete' recurse-dirs 'yes'
+
+# Enable ('yes') or disable ('no') automatic teleportation of z4h over
+# ssh when connecting to these hosts.
+#zstyle ':z4h:ssh:example-hostname1'   enable 'yes'
+#zstyle ':z4h:ssh:*.example-hostname2' enable 'no'
+# The default value if none of the overrides above match the hostname.
+zstyle ':z4h:ssh:*'                   enable 'no'
+
+# Send these files over to the remote host when connecting over ssh to the
+# enabled hosts.
+#zstyle ':z4h:ssh:*' send-extra-files '~/.nanorc' '~/.env.zsh'
+
+# Clone additional Git repositories from GitHub.
 #
-# Authors:
-#   Sorin Ionescu <sorin.ionescu@gmail.com>
+# This doesn't do anything apart from cloning the repository and keeping it
+# up-to-date. Cloned files can be used after `z4h init`. This is just an
+# example. If you don't plan to use Oh My Zsh, delete this line.
+z4h install ohmyzsh/ohmyzsh || return
+z4h install wfxr/forgit
+z4h install hlissner/zsh-autopair
+#z4h install marlonrichert/zsh-edit@main
+
+zstyle ':z4h:ssh-agent:' start yes
+
+# Install or update core components (fzf, zsh-autosuggestions, etc.) and
+# initialize Zsh. After this point console I/O is unavailable until Zsh
+# is fully initialized. Everything that requires user interaction or can
+# perform network I/O must be done above. Everything else is best done below.
+z4h init || return
+
+# Extend PATH.
+path=(~/bin $path)
+
+# Export environment variables.
+export GPG_TTY=$TTY
+
+# Source additional local files if they exist.
+z4h source ~/.env.zsh
+
+# Use additional Git repositories pulled in with `z4h install`.
 #
+# This is just an example that you should delete. It does nothing useful.
+#z4h source $Z4H/ohmyzsh/ohmyzsh/lib/diagnostics.zsh
+#z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/emoji-clock/emoji-clock.plugin.zsh
+#fpath+=($Z4H/ohmyzsh/ohmyzsh/plugins/supervisor)
 
-# Source Prezto.
-if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
-  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
-fi
+# Define key bindings.
+z4h bindkey z4h-backward-kill-word  Ctrl+Backspace Ctrl+H
+z4h bindkey z4h-backward-kill-zword Ctrl+Alt+Backspace
 
-# Customize to your needs...
-#export TERM=xterm-256color
-export EDITOR=vim
+z4h bindkey undo Ctrl+/  # undo the last command line change
+z4h bindkey redo Alt+/   # redo the last undone command line change
 
-export GOPATH=~/go
-export PATH=$GOPATH/bin:"${PATH}"
+z4h bindkey z4h-cd-back    Alt+Left   # cd into the previous directory
+z4h bindkey z4h-cd-forward Alt+Right  # cd into the next directory
+z4h bindkey z4h-cd-up      Alt+Up     # cd into the parent directory
+z4h bindkey z4h-cd-down    Alt+Down   # cd into a child directory
 
-if [ -d "$HOME/bin" ] ; then
-    PATH="$HOME/bin:$PATH"
-fi
+# Autoload functions.
+autoload -Uz zmv
 
-if [ -d "$HOME/.local/bin" ] ; then
-    PATH="$HOME/.local/bin:$PATH"
-fi
+# Define functions and completions.
+function md() { [[ $# == 1 ]] && mkdir -p -- "$1" && cd -- "$1" }
+compdef _directories md
 
-[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
-export FZF_DEFAULT_COMMAND='rg --files --no-ignore --hidden --follow -g "!{.git,node_modules}/*" 2> /dev/null'
-export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
-#bind -x '"\C-p": vim $(fzf -m);'
-#export FZF_ALT_C_COMMAND="cd ~/; bfs -type d -nohidden | sed s/^\./~/"
-export FZF_ALT_C_COMMAND="rg --hidden --files --sort-files --null | xargs -0 dirname | sort -u"
-source ~/fzf-git/functions.sh
-source ~/fzf-git/key-binding.zsh
-source ~/fzf-git/forgit.plugin.zsh
+# Define named directories: ~w <=> Windows home directory on WSL.
+[[ -n $z4h_win_home ]] && hash -d w=$z4h_win_home
 
-alias cp="cp -iv"
-alias mv="mv -iv"
-alias mkdir="mkdir -v"
-alias vi="vim"
-alias pp='pushbullet push "Pixel" link "${1}" "${1}"'
+# Define aliases.
+alias tree='tree -a -I .git'
 
-alias f='fasd -f'
-alias v='f -e vim'
-
-# some extra git aliases, based on the omz git plugin
-alias glgg='git log --graph'
-alias glgga='git log --graph --decorate --all'
-alias glgm='git log --graph --max-count=10'
-alias gl1='git log --oneline --decorate'
-alias glol="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"
-alias glols="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --stat"
-alias glod="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'"
-alias glods="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short"
-alias glola="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all"
-alias glog='git log --oneline --decorate --graph'
-alias gloga='git log --oneline --decorate --graph --all'
-
-#autoload -Uz compinit
-compinit
-
-#prompt sorin
-export PATH=$HOME/.cargo/bin:$PATH
-eval "$(starship init zsh)"
-eval "$(zoxide init zsh)"
-eval "$(direnv hook zsh)"
+# Add flags to existing aliases.
+alias ls="${aliases[ls]:-ls} -A"
+
+# Set shell options: http://zsh.sourceforge.net/Doc/Release/Options.html.
+setopt glob_dots     # no special treatment for file names with a leading dot
+setopt no_auto_menu  # require an extra TAB press to open the completion menu
 
-function google() {
-    w3m 'https://www.google.co.uk/search?q='"${@}"
+# https://gist.github.com/junegunn/8b572b8d4b5eddd8b85e5f4d40f17236
+# GIT heart FZF (functions)
+# -------------
+is_in_git_repo() {
+  git rev-parse HEAD > /dev/null 2>&1
 }
 
-#fpath=(~/.zsh.d/ $fpath)
-(( $+commands[doctl] )) && source <(doctl completion zsh)
+fzf-down() {
+  fzf --height 50% "$@" --border
+}
+
+_gf() {
+  is_in_git_repo || return
+  git -c color.status=always status --short |
+  fzf-down -m --ansi --nth 2..,.. \
+    --preview '(git diff --color=always -- {-1} | sed 1,4d; cat {-1}) | head -500' |
+  cut -c4- | sed 's/.* -> //'
+}
+
+_gb() {
+  is_in_git_repo || return
+  git branch -a --color=always | grep -v '/HEAD\s' | sort |
+  fzf-down --ansi --multi --tac --preview-window right:70% \
+    --preview 'git log --oneline --graph --date=short --color=always --pretty="format:%C(auto)%cd %h%d %s" $(sed s/^..// <<< {} | cut -d" " -f1) | head -'$LINES |
+  sed 's/^..//' | cut -d' ' -f1 |
+  sed 's#^remotes/##'
+}
+
+_gt() {
+  is_in_git_repo || return
+  git tag --sort -version:refname |
+  fzf-down --multi --preview-window right:70% \
+    --preview 'git show --color=always {} | head -'$LINES
+}
+
+_gh() {
+  is_in_git_repo || return
+  git log --date=short --format="%C(green)%C(bold)%cd %C(auto)%h%d %s (%an)" --graph --color=always |
+  fzf-down --ansi --no-sort --reverse --multi --bind 'ctrl-s:toggle-sort' \
+    --header 'Press CTRL-S to toggle sort' \
+    --preview 'grep -o "[a-f0-9]\{7,\}" <<< {} | xargs git show --color=always | head -'$LINES |
+  grep -o "[a-f0-9]\{7,\}"
+}
+
+_gr() {
+  is_in_git_repo || return
+  git remote -v | awk '{print $1 "\t" $2}' | uniq |
+  fzf-down --tac \
+    --preview 'git log --oneline --graph --date=short --pretty="format:%C(auto)%cd %h%d %s" {1} | head -200' |
+  cut -d$'\t' -f1
+}
+
+# fzf git keybindings
+join-lines() {
+  local item
+  while read item; do
+    echo -n "${(q)item} "
+  done
+}
 
-enable-fzf-tab
+bindkey -r '^g'
+
+bind-git-helper() {
+  local c
+  for c in $@; do
+    eval "fzf-g$c-widget() { local result=\$(_g$c | join-lines); zle reset-prompt; LBUFFER+=\$result }"
+    eval "zle -N fzf-g$c-widget"
+    eval "bindkey '^g^$c' fzf-g$c-widget"
+  done
+}
+bind-git-helper f b t r h
+unset -f bind-git-helper
+
+z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/git/git.plugin.zsh
+z4h source $Z4H/wfxr/forgit/forgit.plugin.zsh
+z4h source $Z4H/hlissner/zsh-autopair/autopair.zsh
+#z4h source $Z4H/marlonrichert/zsh-edit/zsh-edit.plugin.zsh
+
+eval "$(zoxide init zsh)"
+eval "$(direnv hook zsh)"
+#eval "$(gopass completion zsh)"
+
+alias cp="cp -iv"
+alias mv="mv -iv"
+alias ln="ln -iv"
+alias mkdir="mkdir -v"
+alias rm="rm -iv"
+alias pp='pushbullet push "Pixel" link "${1}" "${1}"'
+
+if [[ -f ~/.nix-profile/etc/profile.d/nix.sh ]] ; then
+    source ~/.nix-profile/etc/profile.d/nix.sh
+    #export fpath=(~/.nix-profile/share/zsh/vendor-completions ${fpath})
+fi