zshrc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. # Device-specifig setup (ignored by git)
  2. # source local config first to overwrite default theme if wanted
  3. source ~/.zsh_local
  4. # activate plugin manager
  5. export ZPLUG_HOME=$HOME/.dotfiles/external/zplug
  6. source $ZPLUG_HOME/init.zsh
  7. zplug "romkatv/powerlevel10k", as:theme, use:"*10k.zsh-theme", depth:1
  8. zplug "zsh-users/zsh-syntax-highlighting", defer:2
  9. zplug "zsh-users/zsh-history-substring-search", defer:3
  10. zplug "junegunn/fzf", use:"shell/*.zsh"
  11. zplug "modules/git", from:prezto
  12. # Install plugins if there are plugins that have not been installed
  13. if ! zplug check --verbose; then
  14. printf "Install? [y/N]: "
  15. if read -q; then
  16. echo; zplug install
  17. fi
  18. fi
  19. ### U S E R C O N F I G ###
  20. zmodload zsh/complist
  21. zstyle ':completion:*' menu select
  22. zstyle ':completion:*' matcher-list '' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' '+l:|?=** r:|?=**'
  23. # vi mode
  24. bindkey -v
  25. export KEYTIMEOUT=1
  26. # Use vim keys in tab complete menu:
  27. bindkey -M menuselect 'h' vi-backward-char
  28. bindkey -M menuselect 'k' vi-up-line-or-history
  29. bindkey -M menuselect 'l' vi-forward-char
  30. bindkey -M menuselect 'j' vi-down-line-or-history
  31. bindkey -v '^?' backward-delete-char
  32. # random string function
  33. random-string()
  34. {
  35. LC_ALL=C tr -dc A-Za-z0-9 < /dev/urandom | fold -w ${1:-32} | head -n 1
  36. }
  37. # make code printable with pandocs
  38. # printable-code filename.ext [forced-extension]
  39. printable-code()
  40. {
  41. body=`cat ${1}`
  42. [[ ${1} =~ "([^.]+).([^.]+)" ]] && name=$match[1] && ext=$match[2]
  43. ext=`test -n "${2}" && echo ${2} || echo $ext`
  44. doc="# ${1}\n\`\`\`$ext\n$body\n\`\`\`"
  45. oformat=`test -n "${3}" && echo ${3} || echo "pdf"`
  46. echo $doc | pandoc -o "$name.$oformat"
  47. }
  48. # mount a remote's ($1) host dir ($2) at $3/$2 or ~/mounts/$2 if $3 is not set
  49. mountremote () {
  50. # set the root mount dir
  51. mountroot="${REMOTE_MOUNT_ROOT:-$HOME/mounts}";
  52. if [ -n "$3" ]; then
  53. mountpoint=$3
  54. elif [ -z "$2" ]; then
  55. mountpoint=$1-home
  56. else
  57. mountpoint=$1-`echo $2 | sed -E "s/\///g"`
  58. fi
  59. mkdir -p $mountroot/$mountpoint
  60. if [[ $(uname -a) == *"Darwin"* ]]; then
  61. # following line is apple-specific
  62. sshfs $1:$2 "$mountroot/$mountpoint" -o auto_cache,reconnect,volname=$mountpoint,no_readahead,noappledouble,nolocalcaches
  63. else
  64. sshfs $1:$2 "$mountroot/$mountpoint" -o auto_cache,reconnect,no_readahead
  65. fi
  66. unset mountroot
  67. unset mountpoint
  68. }
  69. # check number of tmux sessions running on list of ssh hosts
  70. function tmux-num-sessions () {
  71. if (( $# == 0 )) then;
  72. echo usage: tmux-num-sessions ssh-host-1 ssh-host-2 ...
  73. fi
  74. hosts=$@
  75. for i; do
  76. sessions=$(ssh $i tmux ls 2>/dev/null)
  77. if (( $? )) then;
  78. echo $i: No sessions
  79. else
  80. echo $i: $(echo $sessions | wc -l) sessions
  81. fi
  82. done
  83. }
  84. # help creating links to emails
  85. # in apple mail, go to viewing → Show message headers → Custom... → Add "Message-ID"
  86. function murl () {
  87. echo message://"%3c"$@"%3e"
  88. }
  89. # make the clipboard working on remote
  90. if [[ -n "$SSH_CLIENT" ]]; then
  91. SSH_IP=$(echo $SSH_CLIENT | awk '{print $1}')
  92. alias pbcopy="ssh $SSH_IP pbcopy"
  93. fi
  94. #
  95. # Aliases
  96. #
  97. # Git
  98. alias glol="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
  99. alias glola="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --all"
  100. alias imgcat="~/.dotfiles/imgcat"
  101. # Utility
  102. alias rm="nocorrect rm"
  103. #
  104. # Python
  105. #
  106. # virtualenvwrapper
  107. if [ -f ~/virtualenvwrapper.sh ]; then
  108. source ~/virtualenvwrapper.sh
  109. export VIRTUAL_ENV_DISABLE_PROMT=yes
  110. fi
  111. if [[ -n "$ITERM_INTEGRATION" && -f ~/.iterm2_shell_integration.zsh ]]; then
  112. test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"
  113. fi
  114. # a new attempt to forward ssh sockets to tmux
  115. if [[ -n "$SSH_AUTH_SOCK" ]]; then
  116. # based on/using http://stackoverflow.com/questions/21378569 and
  117. # https://gist.github.com/martijnvermaat/8070533
  118. # Fix SSH auth socket location so agent forwarding works with tmux
  119. if [[ -z "$TMUX" ]] ; then
  120. ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
  121. else
  122. export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
  123. fi
  124. fi
  125. # taskwarrior setup, stolen from https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/taskwarrior/taskwarrior.plugin.zsh
  126. zstyle ':completion:*:*:task:*' verbose yes
  127. zstyle ':completion:*:*:task:*:descriptions' format '%U%B%d%b%u'
  128. zstyle ':completion:*:*:task:*' group-name ''
  129. alias t=task
  130. compdef _task t=task
  131. # To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
  132. [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
  133. zplug load
  134. # use up and down keys for substring search (needs to be called after plugin loading)
  135. bindkey '^[[A' history-substring-search-up
  136. bindkey '^[[B' history-substring-search-down