293 lines
7.9 KiB
Plaintext
293 lines
7.9 KiB
Plaintext
|
autoload -Uz promptinit
|
|||
|
setopt appendhistory
|
|||
|
setopt extendedglob
|
|||
|
setopt correctall
|
|||
|
bindkey -v
|
|||
|
bindkey -v '^?' backward-delete-char
|
|||
|
|
|||
|
## --------------------------------------------------
|
|||
|
# autocompletion
|
|||
|
## --------------------------------------------------
|
|||
|
# Highlight the current autocomplete option
|
|||
|
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
|
|||
|
|
|||
|
# ignore full hostnames in ssh config file
|
|||
|
# the default ssh function does not seem to differentiate b/t
|
|||
|
# HOST and HOSTNAME directives
|
|||
|
zstyle ':completion:*:(ssh|scp|rsync|sshfs):*:hosts' ignored-patterns '*.yavin4.ch'
|
|||
|
|
|||
|
autoload -Uz compinit && compinit -i
|
|||
|
autoload -Uz bashcompinit && bashcompinit
|
|||
|
|
|||
|
## --------------------------------------------------
|
|||
|
# syntax highlighting a la fish
|
|||
|
## --------------------------------------------------
|
|||
|
for hlpath in zsh/plugins/zsh-syntax-highlighting zsh-syntax-highlighting; do
|
|||
|
if [[ -e "/usr/share/$hlpath/zsh-syntax-highlighting.zsh" ]]; then
|
|||
|
. "/usr/share/$hlpath/zsh-syntax-highlighting.zsh"
|
|||
|
break
|
|||
|
fi
|
|||
|
done
|
|||
|
|
|||
|
## --------------------------------------------------
|
|||
|
# history
|
|||
|
## --------------------------------------------------
|
|||
|
|
|||
|
setopt hist_expire_dups_first
|
|||
|
setopt hist_ignore_dups
|
|||
|
setopt hist_reduce_blanks
|
|||
|
setopt inc_append_history
|
|||
|
setopt share_history
|
|||
|
|
|||
|
autoload -Uz up-line-or-beginning-search
|
|||
|
autoload -Uz down-line-or-beginning-search
|
|||
|
zle -N up-line-or-beginning-search
|
|||
|
zle -N down-line-or-beginning-search
|
|||
|
bindkey '\eOA' up-line-or-beginning-search
|
|||
|
bindkey '\e[A' up-line-or-beginning-search
|
|||
|
bindkey '\eOB' down-line-or-beginning-search
|
|||
|
bindkey '\e[B' down-line-or-beginning-search
|
|||
|
|
|||
|
|
|||
|
## --------------------------------------------------
|
|||
|
# enable x11 clipboard sync
|
|||
|
## --------------------------------------------------
|
|||
|
function x11-clip-wrap-widgets() {
|
|||
|
# NB: Assume we are the first wrapper and that we only wrap native widgets
|
|||
|
# See zsh-autosuggestions.zsh for a more generic and more robust wrapper
|
|||
|
local copy_or_paste=$1
|
|||
|
shift
|
|||
|
|
|||
|
for widget in $@; do
|
|||
|
if [[ $copy_or_paste == "copy" ]]; then
|
|||
|
eval "
|
|||
|
function _x11-clip-wrapped-$widget() {
|
|||
|
zle .$widget
|
|||
|
xclip -in -selection clipboard <<<\$CUTBUFFER
|
|||
|
}
|
|||
|
"
|
|||
|
else
|
|||
|
eval "
|
|||
|
function _x11-clip-wrapped-$widget() {
|
|||
|
CUTBUFFER=\$(xclip -out -selection clipboard)
|
|||
|
zle .$widget
|
|||
|
}
|
|||
|
"
|
|||
|
fi
|
|||
|
|
|||
|
zle -N $widget _x11-clip-wrapped-$widget
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
local copy_widgets=(
|
|||
|
vi-yank vi-yank-eol vi-delete vi-backward-kill-word vi-change-whole-line
|
|||
|
)
|
|||
|
local paste_widgets=(
|
|||
|
vi-put-{before,after}
|
|||
|
)
|
|||
|
x11-clip-wrap-widgets copy $copy_widgets
|
|||
|
x11-clip-wrap-widgets paste $paste_widgets
|
|||
|
|
|||
|
|
|||
|
## --------------------------------------------------
|
|||
|
## PROMPT
|
|||
|
## --------------------------------------------------
|
|||
|
|
|||
|
setopt prompt_subst
|
|||
|
|
|||
|
if [[ ${EUID} -eq 0 ]]; then
|
|||
|
user_color="%F{red}"
|
|||
|
else
|
|||
|
user_color="%F{cyan}"
|
|||
|
fi
|
|||
|
|
|||
|
HOSTNAME=""
|
|||
|
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
|
|||
|
HOSTNAME="@%M"
|
|||
|
fi
|
|||
|
|
|||
|
PROMPT=""
|
|||
|
RPROMPT=""
|
|||
|
|
|||
|
git_info() {
|
|||
|
# Exit if not inside a Git repository
|
|||
|
! git rev-parse --is-inside-work-tree > /dev/null 2>&1 && return
|
|||
|
|
|||
|
# Git branch/tag, or name-rev if on detached head
|
|||
|
local GIT_LOCATION=$(git symbolic-ref -q HEAD || \
|
|||
|
git name-rev --name-only \
|
|||
|
--no-undefined --always HEAD)
|
|||
|
GIT_LOCATION=${GIT_LOCATION#(refs/heads/|tags/)}
|
|||
|
|
|||
|
local AHEAD="%F{red}⇡NUM%f"
|
|||
|
local BEHIND="%F{cyan}⇣NUM%f"
|
|||
|
local MERGING="%F{magenta⚡︎%f"
|
|||
|
local UNTRACKED="%F{red}●%f"
|
|||
|
local MODIFIED="%F{yellow}●%f"
|
|||
|
local STAGED="%F{green}●%f"
|
|||
|
|
|||
|
local -a DIVERGENCES
|
|||
|
local -a FLAGS
|
|||
|
|
|||
|
local NUM_AHEAD="$(git log --oneline @{u}.. 2> /dev/null | wc -l | tr -d ' ')"
|
|||
|
if [ "$NUM_AHEAD" -gt 0 ]; then
|
|||
|
DIVERGENCES+=( "${AHEAD//NUM/$NUM_AHEAD}" )
|
|||
|
fi
|
|||
|
|
|||
|
local NUM_BEHIND="$(git log --oneline ..@{u} 2> /dev/null | wc -l | tr -d ' ')"
|
|||
|
if [ "$NUM_BEHIND" -gt 0 ]; then
|
|||
|
DIVERGENCES+=( "${BEHIND//NUM/$NUM_BEHIND}" )
|
|||
|
fi
|
|||
|
|
|||
|
local GIT_DIR="$(git rev-parse --git-dir 2> /dev/null)"
|
|||
|
if [ -n $GIT_DIR ] && test -r $GIT_DIR/MERGE_HEAD; then
|
|||
|
FLAGS+=( "$MERGING" )
|
|||
|
fi
|
|||
|
|
|||
|
if [[ -n $(git ls-files --other --exclude-standard 2> /dev/null) ]]; then
|
|||
|
FLAGS+=( "$UNTRACKED" )
|
|||
|
fi
|
|||
|
|
|||
|
if ! git diff --quiet 2> /dev/null; then
|
|||
|
FLAGS+=( "$MODIFIED" )
|
|||
|
fi
|
|||
|
|
|||
|
if ! git diff --cached --quiet 2> /dev/null; then
|
|||
|
FLAGS+=( "$STAGED" )
|
|||
|
fi
|
|||
|
|
|||
|
local -a GIT_INFO
|
|||
|
[[ ${#DIVERGENCES[@]} -ne 0 ]] && GIT_INFO+=( "${(j::)DIVERGENCES}" )
|
|||
|
[[ ${#FLAGS[@]} -ne 0 ]] && GIT_INFO+=( "${(j::)FLAGS}" )
|
|||
|
GIT_INFO+=( "%F{green}$GIT_LOCATION%f" )
|
|||
|
echo "─(%B${(j: :)GIT_INFO}%b)"
|
|||
|
}
|
|||
|
|
|||
|
function zle-line-init zle-keymap-select {
|
|||
|
GIT=$(git_info)
|
|||
|
NORMAL="%F{yellow}N%f"
|
|||
|
INSERT="%F{cyan}I%f"
|
|||
|
VIMODE="─%B(${${KEYMAP/vicmd/$NORMAL}/(main|viins)/$INSERT})%b"
|
|||
|
USER="$user_color%n$HOSTNAME%f"
|
|||
|
TIME="%F{green}%*%f"
|
|||
|
WD="%F{green}%1~%f"
|
|||
|
PROMPT=$'\n%B┌($USER)─($TIME)$VIMODE$GIT\n└─($WD)─>%b '
|
|||
|
zle reset-prompt
|
|||
|
}
|
|||
|
|
|||
|
zle -N zle-line-init
|
|||
|
zle -N zle-keymap-select
|
|||
|
|
|||
|
export KEYTIMEOUT=1
|
|||
|
|
|||
|
## --------------------------------------------------
|
|||
|
## Title
|
|||
|
## --------------------------------------------------
|
|||
|
|
|||
|
precmd () { echo -ne "\033]0;urxvt: ${PWD}\007" }
|
|||
|
|
|||
|
## --------------------------------------------------
|
|||
|
## Aliases
|
|||
|
## --------------------------------------------------
|
|||
|
|
|||
|
alias als='alias | grep'
|
|||
|
alias hs='history 1 | grep'
|
|||
|
alias ls='ls --color'
|
|||
|
|
|||
|
alias grep='grep --color=auto'
|
|||
|
alias sudo='sudo '
|
|||
|
alias diff=colordiff
|
|||
|
alias ll='exa -alhg --group-directories-first'
|
|||
|
alias llt='exa -T'
|
|||
|
alias llg='ll --git'
|
|||
|
|
|||
|
setopt autopushd
|
|||
|
|
|||
|
alias d='dirs -v | head -10'
|
|||
|
alias d1='cd -'
|
|||
|
alias d2='cd -2'
|
|||
|
alias d3='cd -3'
|
|||
|
alias d4='cd -4'
|
|||
|
alias d5='cd -5'
|
|||
|
alias d6='cd -6'
|
|||
|
alias d7='cd -7'
|
|||
|
alias d8='cd -8'
|
|||
|
alias d9='cd -9'
|
|||
|
|
|||
|
alias u='cd ..'
|
|||
|
alias uu='cd ../..'
|
|||
|
alias uuu='cd ../../..'
|
|||
|
alias uuuu='cd ../../../..'
|
|||
|
alias uuuuu='cd ../../../../..'
|
|||
|
|
|||
|
alias reboot='sudo /sbin/reboot'
|
|||
|
alias poweroff='sudo /sbin/poweroff'
|
|||
|
alias halt='sudo /sbin/halt'
|
|||
|
alias shutdown='sudo /sbin/shutdown'
|
|||
|
|
|||
|
alias sc="sudo systemctl"
|
|||
|
alias sce="sudo systemctl enable"
|
|||
|
alias scd="sudo systemctl disable"
|
|||
|
alias scs="sudo systemctl start"
|
|||
|
alias sct="sudo systemctl stop"
|
|||
|
alias scr="sudo systemctl restart"
|
|||
|
alias sca="systemctl status"
|
|||
|
|
|||
|
alias scu="systemctl --user"
|
|||
|
alias scue="systemctl --user enable"
|
|||
|
alias scud="systemctl --user disable"
|
|||
|
alias scus="systemctl --user start"
|
|||
|
alias scut="systemctl --user stop"
|
|||
|
alias scur="systemctl --user restart"
|
|||
|
|
|||
|
alias g='git'
|
|||
|
alias gcl='git clone'
|
|||
|
alias ga='git add'
|
|||
|
alias grm='git rm'
|
|||
|
alias ga='git add'
|
|||
|
alias gus='git reset HEAD'
|
|||
|
alias gm="git merge"
|
|||
|
alias gmv='git mv'
|
|||
|
alias gs='git status -s -b'
|
|||
|
alias gp='git push'
|
|||
|
alias gpo='git push origin'
|
|||
|
alias gpom='git push origin master'
|
|||
|
alias gr='git remote'
|
|||
|
alias gd='git diff'
|
|||
|
alias gc='git commit -v'
|
|||
|
alias gca='git commit -v -a'
|
|||
|
alias gcm='git commit -v -m'
|
|||
|
alias gcam="git commit -v -am"
|
|||
|
alias gci='git commit --interactive'
|
|||
|
alias gb='git branch'
|
|||
|
alias gco='git checkout'
|
|||
|
alias gg="git log --graph --pretty=format:'%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%C(cyan)\\ [%cn]' --abbrev-commit --date=relative"
|
|||
|
alias ggs="gg --stat"
|
|||
|
alias gw="git whatchanged"
|
|||
|
alias gt="git tag"
|
|||
|
alias gnew="git log HEAD@{1}..HEAD@{0}"
|
|||
|
alias ggui="git gui"
|
|||
|
|
|||
|
## --------------------------------------------------
|
|||
|
## Manly Colors
|
|||
|
## --------------------------------------------------
|
|||
|
|
|||
|
man() {
|
|||
|
env LESS_TERMCAP_mb=$'\E[01;31m' \
|
|||
|
LESS_TERMCAP_md=$'\E[01;38;5;13m' \
|
|||
|
LESS_TERMCAP_me=$'\E[0m' \
|
|||
|
LESS_TERMCAP_se=$'\E[0m' \
|
|||
|
LESS_TERMCAP_so=$'\E[38;5;3m' \
|
|||
|
LESS_TERMCAP_ue=$'\E[0m' \
|
|||
|
LESS_TERMCAP_us=$'\E[04;38;5;10m' \
|
|||
|
man "$@"
|
|||
|
}
|
|||
|
|
|||
|
## --------------------------------------------------
|
|||
|
## Python
|
|||
|
## --------------------------------------------------
|
|||
|
if command -v pyenv 1>/dev/null 2>&1; then
|
|||
|
eval "$(pyenv init - | sed '/PATH/d' -)"
|
|||
|
eval "$(pyenv virtualenv-init - | sed '/PATH/d' -)"
|
|||
|
fi
|