From 2dfd062a9183ace11d70f71650b8a69429e12e0f Mon Sep 17 00:00:00 2001 From: David Morgan Date: Fri, 9 Jul 2021 21:15:50 +0100 Subject: Switch from prezto to zsh4humans --- .zshrc | 254 +++++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 193 insertions(+), 61 deletions(-) (limited to '.zshrc') 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 +# 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 -- cgit 1.4.1-2-gfad0