summaryrefslogblamecommitdiff
path: root/zshrc
blob: a85085b45ad9e4564b7f3510229731cea5b3c32e (plain) (tree)
1
2
3
4
5
6
7
8
9

                   
 



                                        

                                           

                               





                                                
                    
                                          
 





                                                                            
                
                                                  
                        
                                                             




                  
 

         
                                       
                                   

                                                                                                              
                                                              
 
 

                
                                                               
              

                



                        




                    
                

                        
 
 














                            

                
                  
                           
                          
 
 

             
                                 









                                                     



                                      
 



                                
 



                                           
 









                                     

 
 
         




                  
 
            



                                                        



                                                                                        
 

                                                            
 
 

              


                         


                                                                                  

                                                     
 
            
 











                                                                                              


                                               
                                                               

         
 



                                                           



                                                  



                                                            
 

                                                                  
 

                                                       
                                                               
 
 




                                                   



                   
 
 
























                                                                              
 

        




                                                                             




                                             
                    
                    

                       


                     
                                                                                         
 


                           




                                                    
 
                                                                                                                    
                                        






                           




                               
                       
 
 
                           
                                           
 
 

























                                                                                 
 
                                                
# dotfiles -- zshrc
# author: johannst


ZDOTDIR=$HOME/.cache/zsh
[[ ! -d $ZDOTDIR ]] && mkdir -p $ZDOTDIR

# zshPlug -- simple GitHub plugin installer

function zshPlug() {
   local install=$HOME/.zshplug

   # Positinal:
   #   $1:            Github repository.
   # Arguments:
   #   -i <fname>     Init file name (optional).
   zparseopts -D -E -- i:=init
   local git_repo=$1
   local init_file=${init[2]:-*plugin.zsh}

   # download
   [[ ! -d $install/$git_repo ]] && {
      echo "[zshPlug]: installing $git_repo"
      git clone https://github.com/$git_repo $install/$git_repo &> /dev/null
   }

   # load plugin
   local init=$(ls $install/$git_repo/$~init_file)
   [[ ! -f $init ]] && {
      echo "No plugin file found for $git_repo, skipping ..."
   } || {
      source $init
   }
}


# Plugins

zshPlug 'zsh-users/zsh-autosuggestions'
zshPlug 'chriskempson/base16-shell'
# MesloLGS font: https://github.com/romkatv/powerlevel10k#manual-font-installation
#   eg: wget -P ~/.fonts https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf
zshPlug 'romkatv/powerlevel10k.git' -i powerlevel10k.zsh-theme


# Key definition

# Use `Ctrl-v` + key-combination of interest to find key codes.
typeset -A key
key[Up]="\e[A"
key[Down]="\e[B"
key[CtrlLeft]="\e[1;5D"
key[CtrlRight]="\e[1;5C"
key[AltLeft]="\e[1;3D"
key[AltRight]="\e[1;3C"
key[ShiftTab]="\e[Z"
key[CtrlA]="\Ca"
key[CtrlE]="\Ce"
key[CtrlR]="\Cr"
key[CtrlS]="\Cs"
key[CtrlW]="\Cw"
key[Backspace]="\C?"
key[CtrlBackspace]="\CH"


# Color definition

typeset -A color
color[noColor]='%f'
color[darkGray]='%F{242}'
color[mediumGray]='%F{246}'
color[lightGray]='%F{252}'
color[brightRed]='%F{196}'
color[pinkRed]='%F{125}'
color[babyBlue]='%F{38}'
color[darkBlue]='%F{26}'
color[green]='%F{2}'
color[lightOrange]='%F{222}'


# Basic settings

#setopt correctall
setopt hist_ignore_all_dups
setopt interactivecomments


# Basic alias

if ! which exa &> /dev/null; then
   alias ls='ls --color=auto'
   alias ll='ls --color=auto -l'
   alias la='ls --color=auto -a'
   alias lt='ls --color=auto -l -t --reverse'
else
   alias ls='exa --color=auto --git'
   alias ll='exa --color=auto --git -l'
   alias la='exa --color=auto --git -a'
   alias lt='exa --color=auto --git -l --sort newest'
fi
alias grep='\grep --color=auto -Hn'

alias fd="fd --color auto --no-ignore"
alias rg="rg --color auto --no-ignore"

if which nvim &> /dev/null; then
    alias vim='nvim'
fi


# Basic environment

export PS_FORMAT='pid,pgid,etime,user,comm'


# Colorful man pages

man() {
    LESS_TERMCAP_md=$'\e[01;35m' \
    LESS_TERMCAP_me=$'\e[0m' \
    LESS_TERMCAP_se=$'\e[0m' \
    LESS_TERMCAP_so=$'\e[01;31;33m' \
    LESS_TERMCAP_ue=$'\e[0m' \
    LESS_TERMCAP_us=$'\e[01;32m' \
    command man "$@"
}


# History

HISTFILE=~/.zshist
HISTSIZE=1000
SAVEHIST=1000


# Completion

autoload -Uz compinit && compinit
zstyle ':completion:*' list-colors "${(@s.:.)LS_COLORS}"
zstyle ':completion:*' menu select
# keep matches of same type in separate lists
zstyle ':completion:*' group-name ''
# description for each match list (%d expdanded to short desc)
zstyle ':completion:*:descriptions' format "$color[lightOrange] -- %d --$color[noColor]"

zmodload zsh/complist
bindkey -M menuselect "$key[ShiftTab]" reverse-menu-complete


# Key mappings

# Set vim as default mode
bindkey -v

autoload -Uz up-line-or-beginning-search && zle -N up-line-or-beginning-search
autoload -Uz down-line-or-beginning-search && zle -N down-line-or-beginning-search

bindkey -- "$key[Up]" up-line-or-beginning-search
bindkey -- "$key[Down]" down-line-or-beginning-search

# Emacs mode

# Backward delete word without treating '/' as part of a word. Convenient when deleting paths.
function emacs-backward-kill-word() {
    # WORDCHARS
    #   A list of non-alphanumeric characters considered part of a word by the line editor.

    # Remove '/' from WORDCHARS
    local WORDCHARS=${WORDCHARS/\//}
    zle backward-kill-word
}
zle -N emacs-backward-kill-word

bindkey -M emacs "$key[CtrlLeft]" backward-word
bindkey -M emacs "$key[AltLeft]" backward-word
bindkey -M emacs "$key[CtrlRight]" forward-word
bindkey -M emacs "$key[AltRight]" forward-word
bindkey -M emacs "$key[CtrlBackspace]" emacs-backward-kill-word

# Vi mode

bindkey -M vicmd "$key[Up]" up-line-or-beginning-search
bindkey -M viins "$key[Up]" up-line-or-beginning-search
bindkey -M vicmd "$key[Down]" down-line-or-beginning-search
bindkey -M viins "$key[Down]" down-line-or-beginning-search
bindkey -M vicmd "k" up-line-or-beginning-search
bindkey -M vicmd "j" down-line-or-beginning-search
bindkey -M viins "jj" vi-cmd-mode

bindkey -M vicmd "$key[CtrlA]" vi-digit-or-beginning-of-line
bindkey -M viins "$key[CtrlA]" vi-digit-or-beginning-of-line
bindkey -M vicmd "$key[CtrlE]" vi-end-of-line
bindkey -M viins "$key[CtrlE]" vi-end-of-line

bindkey -M viins "$key[CtrlR]" history-incremental-search-backward
bindkey -M viins "$key[CtrlS]" history-incremental-search-forward

bindkey -M viins "$key[CtrlW]" backward-kill-word
bindkey -M viins "$key[Backspace]" backward-delete-char
bindkey -M viins "$key[CtrlBackspace]" emacs-backward-kill-word


# Dirstack

DIRSTACKSIZE=8
setopt autopushd pushdminus pushdsilent pushdtohome
alias dh='dirs -v'
alias d='_goDir'
function _goDir() {
   cd -$1
}


# Prompt: git helper

function git_info() {
   # check if in git repo, can this be cheaper?
   if ! git rev-parse --git-dir &> /dev/null; then return; fi

   # get current branch
   local branch=$(command git symbolic-ref --short HEAD 2> /dev/null)
   # check if tree is dirty
   local dirty=$(command git status --porcelain 2> /dev/null | wc -l)
   [[ $dirty -ne 0 ]] && {
      dirty="$GIT_PROMPT_DIRTY+$dirty"
   } || {
      dirty=$GIT_PROMPT_CLEAN
   }
   # check if branch is ahead
   local ahead
   [[ -n $(command git rev-list origin/${branch}..HEAD 2> /dev/null) ]] && {
      ahead=$GIT_PROMPT_AHEAD
   }

   # assemble git prompt info
   echo -n "${GIT_PROMPT_PREFIX}${branch}${dirty}${ahead}${GIT_PROMPT_SUFFIX}"
}


# Prompt

# https://github.com/ohmyzsh/ohmyzsh/issues/5068
function shpwd() {
  echo ${${:-/${(j:/:)${(M)${(s:/:)${(D)PWD:h}}#(|.)[^.]}}/${PWD:t}}//\/~/\~}
}

function _installMyPromptBase16() {
   function zle-line-init zle-keymap-select {
       vinorm='n'
       viins='i'
       c_del='%F{7}'
       c_usr='%F{2}'
       c_tty='%F{8}'
       c_dir='%F{14}'
       c_dir2='%F{242}'
       c_ret='%F{1}'
       c_vii='%F{14}'
       c_vic='%F{16}'
       vimode="${${KEYMAP/vicmd/$c_vic$vinorm}/(main|viins)/$c_vii$viins}$color[noColor]"

       c_git_branch='%F{5}'
       c_git_dirty='%F{9}'
       c_git_ahead='%F{4}'
       GIT_PROMPT_PREFIX="${c_del}(${c_git_branch}"
       GIT_PROMPT_DIRTY="${c_del}:${c_git_dirty}Δ"
       GIT_PROMPT_CLEAN=""
       GIT_PROMPT_AHEAD="${c_del}:${c_git_ahead}↑"
       GIT_PROMPT_SUFFIX="${c_del})$color[noColor] "

       PS1="$c_usr%n@%m:$c_dir$(shpwd)$color[noColor] ::<$vimode> $(git_info)$c_ret%(?..%? )$c_del$color[noColor]> "
       RPS1="%F$c_dir2%~$color[noColor]"
       zle reset-prompt
   }

   zle -N zle-line-init
   zle -N zle-keymap-select
}

function _uninstallMyPrompt() {
   zle -D zle-line-init
   zle -D zle-keymap-select
}

#_installMyPromptBase16


# need to do after compinit
zshPlug 'zsh-users/zsh-syntax-highlighting'


# fzf
function load_fzf() {
    [[ $- == *i* ]] || return

    local fzf_dir=(
        /usr/share/fzf
        $FZF_BASE
        $FZF_BASE/shell
    )

    local found=0
    for dir in $fzf_dir; do
        [[ -f $dir/key-bindings.zsh ]] && {
            source "$dir/key-bindings.zsh"
            source "$dir/completion.zsh"
            found=1
            break
        }
    done
    [[ $found == 0 ]] && echo "[WARN]: Failed to setup fzf, try setting FZF_BASE"
}

if which fzf &> /dev/null; then
    load_fzf
fi


#% vim:et:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1