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 --- .zpreztorc | 250 ------------------------------------------------------------ .zshrc | 254 ++++++++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 193 insertions(+), 311 deletions(-) delete mode 100644 .zpreztorc diff --git a/.zpreztorc b/.zpreztorc deleted file mode 100644 index 0dce929..0000000 --- a/.zpreztorc +++ /dev/null @@ -1,250 +0,0 @@ -# -# Sets Prezto options. -# -# Authors: -# Sorin Ionescu -# - -# -# General -# - -# Set case-sensitivity for completion, history lookup, etc. -# zstyle ':prezto:*:*' case-sensitive 'yes' - -# Color output (auto set to 'no' on dumb terminals). -zstyle ':prezto:*:*' color 'yes' - -# Add additional directories to load prezto modules from -# zstyle ':prezto:load' pmodule-dirs $HOME/.zprezto-contrib - -# Allow module overrides when pmodule-dirs causes module name collisions -# zstyle ':prezto:load' pmodule-allow-overrides 'yes' - -# Set the Zsh modules to load (man zshmodules). -# zstyle ':prezto:load' zmodule 'attr' 'stat' - -# Set the Zsh functions to load (man zshcontrib). -# zstyle ':prezto:load' zfunction 'zargs' 'zmv' - -# Set the Prezto modules to load (browse modules). -# The order matters. -zstyle ':prezto:load' pmodule \ - 'environment' \ - 'terminal' \ - 'editor' \ - 'history' \ - 'directory' \ - 'spectrum' \ - 'utility' \ - 'completion' \ - 'fasd' \ - 'gpg' \ - 'git' \ - 'omz-git' \ - 'ssh' \ - 'fzf-tab' \ - 'fast-syntax-highlighting' \ - 'history-substring-search' \ - 'autosuggestions' \ - 'prompt' - -# -# Autosuggestions -# - -# Set the query found color. -# zstyle ':prezto:module:autosuggestions:color' found '' - -# -# Completions -# - -# Set the entries to ignore in static */etc/hosts* for host completion. -# zstyle ':prezto:module:completion:*:hosts' etc-host-ignores \ -# '0.0.0.0' '127.0.0.1' - -# -# Editor -# - -# Set the key mapping style to 'emacs' or 'vi'. -zstyle ':prezto:module:editor' key-bindings 'emacs' - -# Auto convert .... to ../.. -# zstyle ':prezto:module:editor' dot-expansion 'yes' - -# Allow the zsh prompt context to be shown. -#zstyle ':prezto:module:editor' ps-context 'yes' - -# -# Git -# - -# Ignore submodules when they are 'dirty', 'untracked', 'all', or 'none'. -# zstyle ':prezto:module:git:status:ignore' submodules 'all' - -# -# GNU Utility -# - -# Set the command prefix on non-GNU systems. -# zstyle ':prezto:module:gnu-utility' prefix 'g' - -# -# History Substring Search -# - -# Set the query found color. -# zstyle ':prezto:module:history-substring-search:color' found '' - -# Set the query not found color. -# zstyle ':prezto:module:history-substring-search:color' not-found '' - -# Set the search globbing flags. -zstyle ':prezto:module:history-substring-search' globbing-flags '' - -# -# macOS -# - -# Set the keyword used by `mand` to open man pages in Dash.app -# zstyle ':prezto:module:osx:man' dash-keyword 'manpages' - -# -# Pacman -# - -# Set the Pacman frontend. -# zstyle ':prezto:module:pacman' frontend 'yaourt' - -# -# Prompt -# - -# Set the prompt theme to load. -# Setting it to 'random' loads a random theme. -# Auto set to 'off' on dumb terminals. -#zstyle ':prezto:module:prompt' theme 'sorin' -zstyle :prezto:module:prompt theme powerlevel10k - -# Set the working directory prompt display length. -# By default, it is set to 'short'. Set it to 'long' (without '~' expansion) -# for longer or 'full' (with '~' expansion) for even longer prompt display. -# zstyle ':prezto:module:prompt' pwd-length 'short' - -# Set the prompt to display the return code along with an indicator for non-zero -# return codes. This is not supported by all prompts. -# zstyle ':prezto:module:prompt' show-return-val 'yes' - -# -# Python -# - -# Auto switch the Python virtualenv on directory change. -# zstyle ':prezto:module:python:virtualenv' auto-switch 'yes' - -# Automatically initialize virtualenvwrapper if pre-requisites are met. -# zstyle ':prezto:module:python:virtualenv' initialize 'yes' - -# -# Ruby -# - -# Auto switch the Ruby version on directory change. -# zstyle ':prezto:module:ruby:chruby' auto-switch 'yes' - -# -# Screen -# - -# Auto start a session when Zsh is launched in a local terminal. -# zstyle ':prezto:module:screen:auto-start' local 'yes' - -# Auto start a session when Zsh is launched in a SSH connection. -# zstyle ':prezto:module:screen:auto-start' remote 'yes' - -# -# SSH -# - -# Set the SSH identities to load into the agent. -# zstyle ':prezto:module:ssh:load' identities 'id_rsa' 'id_rsa2' 'id_github' -zstyle ':prezto:module:ssh:load' identities 'id_rsa' 'id_ed25519' - -# -# Syntax Highlighting -# - -# Set syntax highlighters. -# By default, only the main highlighter is enabled. -zstyle ':prezto:module:syntax-highlighting' highlighters \ - 'main' \ - 'brackets' \ - 'pattern' \ - 'line' \ - 'cursor' \ - 'root' -# -# Set syntax highlighting styles. -# zstyle ':prezto:module:syntax-highlighting' styles \ -# 'builtin' 'bg=blue' \ -# 'command' 'bg=blue' \ -# 'function' 'bg=blue' -# -# Set syntax pattern styles. -# zstyle ':prezto:module:syntax-highlighting' pattern \ -# 'rm*-rf*' 'fg=white,bold,bg=red' - -# -# Terminal -# - -# Auto set the tab and window titles. -# zstyle ':prezto:module:terminal' auto-title 'yes' - -# Set the window title format. -# zstyle ':prezto:module:terminal:window-title' format '%n@%m: %s' - -# Set the tab title format. -# zstyle ':prezto:module:terminal:tab-title' format '%m: %s' - -# Set the terminal multiplexer title format. -# zstyle ':prezto:module:terminal:multiplexer-title' format '%s' - -# -# Tmux -# - -# Auto start a session when Zsh is launched in a local terminal. -# zstyle ':prezto:module:tmux:auto-start' local 'yes' - -# Auto start a session when Zsh is launched in a SSH connection. -# zstyle ':prezto:module:tmux:auto-start' remote 'yes' - -# Integrate with iTerm2. -# zstyle ':prezto:module:tmux:iterm' integrate 'yes' - -# Set the default session name: -# zstyle ':prezto:module:tmux:session' name 'YOUR DEFAULT SESSION NAME' - -# -# Utility -# - -# Enabled safe options. This aliases cp, ln, mv and rm so that they prompt -# before deleting or overwriting files. Set to 'no' to disable this safer -# behavior. -# zstyle ':prezto:module:utility' safe-ops 'yes' - -# fzf-tab -# disable sort when completing `git checkout` -zstyle ':completion:*:git-checkout:*' sort false -# set descriptions format to enable group support -zstyle ':completion:*:descriptions' format '[%d]' -# set list-colors to enable filename colorizing -zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} -# preview directory's content with exa when completing cd -zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath' -# switch group using `,` and `.` -zstyle ':fzf-tab:*' switch-group ',' '.' 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