### options
-setopt NO_BEEP NO_CLOBBER \
- AUTO_CD CDABLE_VARS \
- EXTENDED_GLOB GLOB_DOTS GLOB_STAR_SHORT MARK_DIRS NUMERIC_GLOB_SORT \
- CORRECT_ALL INTERACTIVE_COMMENTS \
- GLOB_COMPLETE \
- AUTO_CONTINUE LONG_LIST_JOBS \
- NO_HIST_SAVE_BY_COPY HIST_IGNORE_DUPS SHARE_HISTORY HIST_REDUCE_BLANKS
+setopts=(
+ ## 16.2.1 Changing Directories
+ AUTO_CD CDABLE_VARS
+ ## 16.2.2 Completion
+ COMPLETE_IN_WORD GLOB_COMPLETE REC_EXACT
+ ## 16.2.3 Expansion and Globbing
+ EXTENDED_GLOB GLOB_DOTS GLOB_STAR_SHORT MAGIC_EQUAL_SUBST MARK_DIRS
+ NUMERIC_GLOB_SORT
+ ## 16.2.4 History
+ # NOTE: NO_HIST_SAVE_BY_COPY to allow saving histfile if updating another
+ # user's histfile. this is for compatibility with zsu.
+ HIST_FCNTL_LOCK HIST_IGNORE_DUPS HIST_IGNORE_SPACE HIST_LEX_WORDS
+ HIST_NO_STORE HIST_REDUCE_BLANKS NO_HIST_SAVE_BY_COPY SHARE_HISTORY
+ ## 16.2.6 Input/Output
+ NO_CLOBBER CLOBBER_EMPTY CORRECT_ALL INTERACTIVE_COMMENTS
+ HASH_EXECUTABLES_ONLY
+ ## 16.2.7 Job Control
+ AUTO_CONTINUE LONG_LIST_JOBS
+ ## 16.2.12 Zle
+ NO_BEEP
+)
+setopt $setopts
+unset setopts
### exports
## common
export GREP_OPTIONS=--color=auto
## histfile
export HISTFILE=~/.histfile
-export HISTSIZE=1000
-export SAVEHIST=1000
+export HISTSIZE=10000
+export SAVEHIST=$HISTSIZE
## python
export PYTHONSTARTUP=${XDG_CONFIG_HOME:-~/.config}/pythonrc
## vim
if [[ -n $keymap ]] {
source $keymap
} else {
- echo "Failed to source keymap file $keymap" >&2
+ echo -E "Failed to source keymap file $keymap" >&2
}
unfunction find_keymap; unset keymap
}
}
unset a k v
+## fzf
+# bash-style reverse-search-history (i.e. reverse-i-search)
+if [[ -v commands[fzf] ]] {
+ function _history-incremental-pattern-search-fzf {
+ l=(${(f)"$(fc -li -1 0 | fzf -emn 1 +s --preview-window=hidden ${BUFFER:+-q $BUFFER})"})
+ l=$(for x ("${l[@]}") { echo ${${=x}:3}; })
+ BUFFER="$l"
+ }
+ zle -N _history-incremental-pattern-search-fzf
+ bindkey '^R' _history-incremental-pattern-search-fzf
+} else {
+ bindkey '^R' history-incremental-pattern-search-backward
+}
+
### aliases
## builtins
alias rehash='_sev_setpath; rehash'
alias p=\$PAGER
alias e=\$EDITOR
alias se=sudoedit
+alias syncwatch='sync & watch -d grep -Fe Dirty: -e Writeback: /proc/meminfo'
+if [[ -v commands[grep] ]] {
+ [[ -v commands[fgrep] ]] || alias fgrep='grep -F'
+ [[ -v commands[egrep] ]] || alias fgrep='grep -E'
+}
+for x (cat cmp diff grep test update) {
+ [[ -v commands[zutils-z$x] ]] || alias z$x=zutils-z$x
+}
# be paranoid
alias cp='cp -ip'
alias mv='mv -i'
+# zsh zmv with noglob wildcards
alias zm='noglob zmv -WiM'
alias zc='noglob zmv -WiC'
alias zl='noglob zmv -WiL'
alias rm='rm -i'
}
[[ -v commands[trash-put] ]] && alias t=trash-put
-## py venv
-alias va='source bin/activate'
-alias vd=deactivate
-## ps
-source ~/.local/bin/.check-busybox
-if [[ -v commands[pstree] ]] && ! check-busybox pstree; then
+# ps
+if [[ -v commands[pstree] && $commands[pstree]:A:t != busybox ]] {
# use pstree, but NOT busybox pstree because it kinda sucks
- ps="pstree -wg3"
-elif [[ "$OSTYPE" =~ '^freebsd' ]]; then
- ps="ps -aSdfxwwouser=USR -ogroup=GRP -opid,nice=NI \
- -o%cpu,%mem,tty,stat,start=START -oetime,command"
-elif check-busybox ps; then
+ ps='pstree -wg3'
+} elif [[ "$OSTYPE" =~ '^freebsd' ]] {
+ ps='ps -aSdfxwwouser=USR -ogroup=GRP -opid,nice=NI \
+ -o%cpu,%mem,tty,stat,start=START -oetime,command'
+} elif [[ $commands[ps]:A:t == busybox ]] {
# busybox compatible
ps="ps -eouser='USR ' -ogroup='GRP ' \
-opid=' PID' -onice=' NI' -ovsz=' MEM' \
-otty,stat,etime,comm"
-else
+} else {
# XXX: untested, posix
# TODO: support gnu ps
- ps="ps -eouser=USR -ogroup=GRP -opid,nice=NI \
- -opcpu=CPU -ovsz=MEM -otty,stat,etime,comm"
-fi
-unfunction check-busybox
+ ps='ps -eouser=USR -ogroup=GRP -opid,nice=NI \
+ -opcpu=CPU -ovsz=MEM -otty,stat,etime,comm'
+}
if [[ "$(basename "$PAGER")" = "less" ]] {
ps="$ps | less -S"
} else {
alias pa=$ps
alias spa="sudo $ps"
unset ps
+## py venv
+alias va='source bin/activate'
+alias vd=deactivate
+alias vu="python3 -mvenv --upgrade"
+alias svu="sudo python3 -mvenv --upgrade"
## git
+alias g=git
alias gd='git diff'
alias gdh='git diff HEAD'
+alias gds='git diff --staged'
alias ga='git add'
alias ga.='git add .'
+alias gai='git add -i'
+alias gap='git add -p'
alias gc='git commit'
alias gca='git commit --amend'
alias gp='git push'
alias gu='git pull'
+alias gl='git log'
+alias gt='git tree' # from gitconfig
+alias gs='git show'
+alias gst='git stash'
+alias gsp='git stash pop'
## cd/zoxide
function up {
\cd $(printf '../%.0s' {1..${1:-1}})
}
alias cd..=up
## dotfiles
-alias dfu='d=${$(echo ~/.zshenv):P:h:h};GIT_DIR=$d/.git GIT_WORK_TREE=$d git pull'
+alias dfu='function {
+ pushd -q ${$(echo -E - ~/.zshenv):P:h:h}
+ git pull &&
+ git submodule init &&
+ git submodule sync &&
+ git submodule update
+ popd -q
+}'
+## nocorrect
+# zsh doesnt really handle sudo very well, so ignore it
+alias sudo='nocorrect sudo'
+## docker compose
+alias dcp='sudo docker compose pull'
+alias dcu='sudo docker compose up -d'
+alias dcr='sudo docker compose restart'
+alias dcl='sudo docker compose logs -f'
### hooks
autoload -Uz add-zsh-hook
-_sev_exectime=
+typeset -gi _sev_exectime
function sev_preexec {
# change terminal title to show command
print -n "\e]2;$(print -P '%#')${SSH_CLIENT+$USER@$HOST:}$1\e\\"
function vol {
if [[ -z "$1" ]] {
for x in $(mixerctl -a | grep 'outputs\.master'); do
- echo $x
+ echo -E - $x
done
return
}
autoload -Uz promptinit && promptinit
prompt arrows
+### plugins
+load-plugins zshrc
+
### load site-specific
load-site-dotfile zshrc