dotfiles

My configuration files
git clone git://git.finwo.net/misc/dotfiles
Log | Files | Refs

.zshrc (11114B)


      1 # vim:fdm=marker:fdl=0
      2 # set -ex
      3 
      4 # Path /usr/local fix {{{
      5 if ! echo $PATH | tr ':' '\n' | grep -q '/usr/local/bin/' ; then
      6   export PATH="/usr/local/bin:$PATH"
      7 fi
      8 if ! echo $PATH | tr ':' '\n' | grep -q '/usr/local/sbin/' ; then
      9   export PATH="/usr/local/sbin:$PATH"
     10 fi
     11 # }}}
     12 # Homebrew {{{
     13 
     14 # Linuxbrew
     15 if [ -d /home/linuxbrew/.linuxbrew ]; then
     16   # eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
     17   export HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew";
     18   export HOMEBREW_CELLAR="/home/linuxbrew/.linuxbrew/Cellar";
     19   export HOMEBREW_REPOSITORY="/home/linuxbrew/.linuxbrew/Homebrew";
     20   export PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin${PATH+:$PATH}";
     21   export MANPATH="/home/linuxbrew/.linuxbrew/share/man${MANPATH+:$MANPATH}:";
     22   export INFOPATH="/home/linuxbrew/.linuxbrew/share/info${INFOPATH+:$INFOPATH}";
     23 fi
     24 
     25 # openjdk on osx
     26 if [ -d "/opt/homebrew/opt/openjdk@17/bin" ]; then
     27   export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"
     28 elif [ -d "/opt/homebrew/opt/openjdk@11/bin" ]; then
     29   export PATH="/opt/homebrew/opt/openjdk@11/bin:$PATH"
     30 fi
     31 
     32 # Homebrew on M1 mac
     33 if [ -x "/opt/homebrew/bin/brew" ]; then
     34   eval "$(/opt/homebrew/bin/brew shellenv)"
     35   export HOMEBREW_NO_AUTO_UPDATE=1
     36 fi
     37 
     38 # Brew-installed libs
     39 if [ -d "/opt/homebrew/lib" ]; then
     40   export LIBRARY_PATH="$LIBRARY_PATH:/opt/homebrew/lib"
     41 fi
     42 if [ -d "/opt/homebrew/opt/libiconv/lib" ]; then
     43   export LIBRARY_PATH="$LIBRARY_PATH:/opt/homebrew/opt/libiconv/lib"
     44 fi
     45 
     46 # }}}
     47 # History {{{
     48 
     49 # Track
     50 HISTFILE=~/.histfile
     51 HISTSIZE=1000000000
     52 SAVEHIST=1000000000
     53 setopt HIST_IGNORE_DUPS
     54 bindkey -v
     55 
     56 # Search
     57 [[ -n "${key[PageUp]}"   ]] && bindkey "${key[PageUp]}"   history-beginning-search-backward
     58 [[ -n "${key[PageDown]}" ]] && bindkey "${key[PageDown]}" history-beginning-search-forward
     59 
     60 
     61 # Keep secrets out of there
     62 # Source: https://github.com/jgogstad/passwordless-history
     63 HISTORY_EXCLUDE_PATTERN='^ |//([^/]+:[^/]+)@|KEY[=:] *([^ ]+)|TOKEN[=:] *([^ ]+)|BEARER[=:] *([^ ]+)|PASSWO?R?D?[=:] *([^ ]+)|Authorization[=:] *([^'"'"'\"]+)|-us?e?r? ([^:]+:[^:]+) '
     64 
     65 # See
     66 # - https://zsh.sourceforge.io/Doc/Release/Functions.html for docs on zshaddhistory
     67 # - https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html for docs on print
     68 function zshaddhistory() {
     69   emulate -L zsh
     70   unsetopt case_match
     71 
     72   input="${1%%$'\n'}"
     73   if ! [[ "$input" =~ "$HISTORY_EXCLUDE_PATTERN" ]]; then
     74     print -Sr -- "$input"
     75   else
     76     nonempty=($match)
     77 
     78     if [[ $#nonempty -gt 0 ]]; then
     79       for m in "$nonempty[@]"; do
     80         n="${m##[\"\']}"
     81         input="${input/${n%%[\"\']}/...}"
     82       done
     83 
     84       print -Sr -- "$input"
     85     fi
     86     unset match
     87     return 1
     88   fi
     89 }
     90 
     91 # }}}
     92 # Custom commands {{{
     93 
     94 # https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c
     95 function version() {
     96     curl --silent "https://api.github.com/repos/$1/releases/latest" | # Get latest release from GitHub api
     97       grep '"tag_name":' |                                            # Get tag line
     98       sed -E 's/.*"([^"]+)".*/\1/'                                    # Pluck JSON value
     99 }
    100 
    101 # }}}
    102 # User .local bin path {{{
    103 if [ -d "${HOME}/.local/bin" ]; then
    104   export PATH="${HOME}/.local/bin:${PATH}"
    105 fi
    106 # }}}
    107 # OSX coreutil fixes {{{
    108 
    109 command -v gcp   &>/dev/null && alias cp="gcp"
    110 command -v gls   &>/dev/null && alias ls="gls"
    111 command -v gmv   &>/dev/null && alias mv="gmv"
    112 command -v grm   &>/dev/null && alias rm="grm"
    113 command -v gmake &>/dev/null && alias make="gmake"
    114 
    115 command -v nproc &>/dev/null || alias nproc="sysctl -n hw.ncpu"
    116 
    117 command -v kitten &>/dev/null && alias icat="kitten icat"
    118 
    119 # }}}
    120 # Aliases {{{
    121 
    122 # VI
    123 command -v "nvim" &>/dev/null && alias vim="nvim"
    124 command -v "vim"  &>/dev/null && alias vi="vim"
    125 
    126 # vim-like quit
    127 alias :q="exit"
    128 
    129 # LS
    130 alias ls="ls --color=always"
    131 alias ll="ls -lsa"
    132 
    133 # OSX LS fix
    134 command -v gls &>/dev/null && alias ls="gls --color=always"
    135 
    136 # $EDITOR
    137 command -v nano &>/dev/null && export EDITOR=nano
    138 command -v vi   &>/dev/null && export EDITOR=vi
    139 command -v vim  &>/dev/null && export EDITOR=vim
    140 command -v nvim &>/dev/null && export EDITOR=nvim
    141 
    142 # Debugger
    143 alias gd="gdb -tui -q --args"
    144 
    145 # Git shorthands
    146 alias gc="git commit --no-verify"
    147 
    148 # }}}
    149 # Auto-correct {{{
    150 
    151 # Correction
    152 setopt correct
    153 setopt correctall
    154 
    155 # Command not found
    156 if [[ -s '/etc/zsh_command_not_found' ]]; then
    157   source '/etc/zsh_command_not_found'
    158 fi
    159 
    160 # Typo corrector
    161 if command -v thefuck &>/dev/null; then
    162   eval "$(thefuck --alias)"
    163 fi
    164 
    165 # }}}
    166 # Tab-completion {{{
    167 
    168 # Command & folder completion
    169 autoload -Uz compinit promptinit && compinit && promptinit
    170 zstyle ':completion:*' menu select
    171 setopt completealiases
    172 
    173 # Known_hosts
    174 if [ -f "~/.ssh/known_hosts" ]; then
    175   local knownhosts
    176   knownhosts=( ${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[0-9]*}%%\ *}%%,*} )
    177   zstyle ':completion:*:(ping|dig|ssh|scp|sftp|mosh|nc|ncat):*' hosts $knownhosts
    178 fi
    179 
    180 # }}}
    181 # Fixes {{{
    182 
    183 # TERM
    184 if [[ $TERM == screen* ]]; then
    185   export TERM=${TERM#screen.}
    186   export SCREEN=yes
    187 fi
    188 
    189 # Fix for kitty term
    190 if [[ $TERM == "xterm-kitty" ]]; then
    191   export TERM=xterm-color
    192 fi
    193 
    194 # # TERM
    195 # # nvim has issues with xterm-256color
    196 # if [[ $TERM == xterm-256color ]]; then
    197 #   export TERM=xterm-color
    198 # fi
    199 
    200 # Auto-cd
    201 setopt autocd
    202 
    203 # GPG
    204 export GPG_TTY=$(tty)
    205 
    206 # npm-gyp performance
    207 export npm_config_jobs=$(( $(nproc) + 1 ))
    208 
    209 # }}}
    210 # Prompt {{{
    211 
    212 autoload -U colors && colors
    213 autoload -U promptinit && promptinit
    214 prompt="[%{$fg[white]%}%D{%H:%M}%{$reset_color%}] %(?..[%{$fg[red]%}%?%{$reset_color%}] )%{$fg[yellow]%}%n%{$reset_color%}:%{$fg[green]%}%c%{$reset_color%}%# "
    215 PROMPT_COMMAND=
    216 
    217 # }}}
    218 # Titles {{{
    219 
    220 [[ -e ~/src/jreese/zsh-titles/titles.plugin.zsh ]] && source ~/src/jreese/zsh-titles/titles.plugin.zsh
    221 
    222 # }}}
    223 # FuzzyFinder {{{
    224 [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
    225 # }}}
    226 # Google Cloud SDK {{{
    227 
    228 # The next line updates PATH for the Google Cloud SDK.
    229 if [ -f '/home/finwo/google-cloud-sdk/path.zsh.inc' ]; then
    230   . '/home/finwo/google-cloud-sdk/path.zsh.inc'
    231 fi
    232 
    233 # The next line enables shell command completion for gcloud.
    234 if [ -f '/home/finwo/google-cloud-sdk/completion.zsh.inc' ]; then
    235   . '/home/finwo/google-cloud-sdk/completion.zsh.inc'
    236 fi
    237 
    238 # The next line updates PATH for the Google Cloud SDK.
    239 if [ -f '/home/finwo/Downloads/google-cloud-sdk/path.zsh.inc' ]; then
    240   . '/home/finwo/Downloads/google-cloud-sdk/path.zsh.inc'
    241 fi
    242 
    243 # The next line enables shell command completion for gcloud.
    244 if [ -f '/home/finwo/Downloads/google-cloud-sdk/completion.zsh.inc' ]; then
    245   . '/home/finwo/Downloads/google-cloud-sdk/completion.zsh.inc'
    246 fi
    247 
    248 # }}}
    249 # Go binaries {{{
    250 if [ -d "${HOME}/go/bin" ]; then
    251   export PATH="${HOME}/go/bin:${PATH}"
    252 fi
    253 # }}}
    254 # Symfony {{{
    255 if [ -d "${HOME}/.symfony/bin" ]; then
    256   export PATH="${HOME}/.symfony/bin:${PATH}"
    257 fi
    258 # }}}
    259 # Rust support {{{
    260 if [ -d "${HOME}/.cargo/bin" ]; then
    261   export PATH="${HOME}/.cargo/bin:${PATH}"
    262 fi
    263 # }}}
    264 # Global composer {{{
    265 
    266 # Simple composer fetcher
    267 function getComposer {
    268   curl https://getcomposer.org/installer | php
    269 }
    270 
    271 # Auto-detects where composer(.phar) is installed
    272 function composer {
    273   for p in $(echo $PATH | tr ':' '\n'); do
    274     for i in $(echo composer{.phar,}); do
    275       [ -f "$p/$i" ] || continue
    276       php "$p/$i" "$@"
    277       return $?
    278     done
    279   done
    280   for i in $(echo {,\~/,{/usr,/opt}{/local,}/bin/}composer{.phar,}); do
    281     [ -f "$i" ] || continue
    282     php "$i" "$@"
    283     return $?
    284   done
    285   echo "composer is not installed on this system"
    286   return 1
    287 }
    288 
    289 # Use composer-installed binaries
    290 if [ -d "${HOME}/.config/composer/vendor/bin" ]; then
    291   export PATH="${HOME}/.config/composer/vendor/bin:${PATH}"
    292 fi
    293 
    294 # }}}
    295 # Node Version Manager {{{
    296 
    297 if [ ! -f "${HOME}/.nvm/nvm.sh" ]; then
    298   curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$(version nvm-sh/nvm)/install.sh" | bash
    299 fi
    300 
    301 export NVM_DIR="$HOME/.nvm"
    302 [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
    303 [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
    304 
    305 # }}}
    306 # PHPBrew {{{
    307 
    308 [[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc
    309 
    310 # }}}
    311 # qemu-create {{{
    312 function qemu-create () {
    313 
    314   # Detect the VM settings
    315   NAME="${1:-machine}"
    316   HDSIZE="${2:-40G}"
    317 
    318   # Create a directory for it
    319   mkdir -p "${NAME}"
    320 
    321   # Write run.sh
    322   cat <<EOF > "${NAME}/run.sh"
    323 #!/usr/bin/env bash
    324 cd \$(dirname \$0)
    325 if [ -f config ]; then
    326   source config
    327 fi
    328 ARGS=()
    329 ARGS+=" -display gtk"
    330 ARGS+=" -smp \${cpus:-2}"
    331 ARGS+=" -soundhw all"
    332 ARGS+=" -m \${mem:-2048}"
    333 ARGS+=" -name \${name:-\$(basename \$(pwd))}"
    334 ARGS+=" -nic user"
    335 command -v 'kvm-ok' &>/dev/null && kvm-ok &>/dev/null && ARGS+=" --enable-kvm"
    336 if [ ! -z "\${kernel}" ]; then ARGS+=" -kernel \${kernel}"; fi
    337 if [ ! -z "\${initrd}" ]; then ARGS+=" -kernel \${initrd}"; fi
    338 if [ -z "\${kernel}" ]; then
    339   [ -f boot.efi   ] && ARGS+=" -kernel boot.efi"
    340   [ -f kernel.bin ] && ARGS+=" -kernel kernel.bin"
    341   [ -f vmlinuz    ] && ARGS+=" -kernel vmlinuz"
    342 fi
    343 if [ -z "\${initrd}" ]; then
    344   [ -f initrd     ] && ARGS+=" -initrd initrd"
    345   [ -f initrd.gz  ] && ARGS+=" -initrd initrd.gz"
    346 fi
    347 [ -f sda.qcow   ] && ARGS+=" -hda sda.qcow"
    348 [ -f sda.img    ] && ARGS+=" -hda sda.img"
    349 [ -f cdrom.iso  ] && ARGS+=" -cdrom cdrom.iso -boot d"
    350 qemu-system-x86_64 \${ARGS}
    351 EOF
    352 
    353   # Make run.sh executable
    354   chmod +x "${NAME}/run.sh"
    355 
    356   # Create the drive image
    357   qemu-img create -f qcow2 "${NAME}/sda.qcow" "${HDSIZE}"
    358 
    359 }
    360 # }}}
    361 # nativescript {{{
    362 if [ -f /home/finwo/.tnsrc ]; then
    363     source /home/finwo/.tnsrc
    364 fi
    365 # }}}
    366 # pnpm {{{
    367 export PNPM_HOME="/home/finwo/.local/share/pnpm"
    368 export PATH="$PNPM_HOME:$PATH"
    369 # }}}
    370 # Android development {{{
    371 
    372 # Android-studio on a mac
    373 if [ -d ~/Library/Android/sdk ]; then
    374   export ANDROID_HOME=~/Library/Android/sdk
    375   export ANDROID_SDK_ROOT=~/Library/Android/sdk
    376   export ANDROID_AVD_HOME=~/.android/avd
    377 fi
    378 
    379 # Android-studio on linux
    380 if [ -d ~/Android/Sdk ]; then
    381   export ANDROID_HOME=~/Android/Sdk
    382   export ANDROID_SDK_ROOT=~/Android/Sdk
    383   export ANDROID_AVD_HOME=~/.android/avd
    384 fi
    385 
    386 # Android-sdk on linux
    387 if [ -d ~/android-sdk ]; then
    388   export ANDROID_HOME=~/android-sdk
    389   export ANDROID_SDK_ROOT=~/android-sdk
    390 fi
    391 
    392 # Link to platform tools & emulator for android
    393 if [ -d ${ANDROID_HOME}/platform-tools ]; then
    394   export PATH="$PATH:$ANDROID_HOME/platform-tools"
    395 fi
    396 if [ -d ${ANDROID_HOME}/emulator ]; then
    397   export PATH="$PATH:$ANDROID_HOME/emulator"
    398 fi
    399 
    400 # }}}
    401 # Difftastic in git {{{
    402 if command -v difft &>/dev/null; then
    403   export GIT_EXTERNAL_DIFF=difft
    404 fi
    405 # }}}
    406 # osx clang {{{
    407 if [ -d /opt/homebrew/opt/llvm/bin ]; then
    408   export PATH="/opt/homebrew/opt/llvm/bin:${PATH}"
    409 fi
    410 # }}}
    411 # Rust cargo {{{
    412 if [ -f $HOME/.cargo/env ]; then
    413   . $HOME/.cargo/env
    414 fi
    415 # }}}
    416 # KubeCTL {{{
    417 
    418 [[ $commands[kubectl] ]] && source <(kubectl completion zsh) || echo -n
    419 
    420 # }}}
    421 # Oracle Cloud Interface {{{
    422 
    423 if [[ -e "${HOME}/.local/lib/oracle-cli/lib/python3.11/site-packages/oci_cli/bin/oci_autocomplete.sh" ]]; then
    424   source "${HOME}/.local/lib/oracle-cli/lib/python3.11/site-packages/oci_cli/bin/oci_autocomplete.sh"
    425 fi
    426 
    427 # }}}
    428 # OPAM bin support {{{
    429 
    430 # opam configuration
    431 [[ ! -r /home/finwo/.opam/opam-init/init.zsh ]] || source /home/finwo/.opam/opam-init/init.zsh  > /dev/null 2> /dev/null
    432 
    433 # }}}