]> git.sev.monster Git - dotfiles.git/commitdiff
partially revert zsh refactor, fix zsh conf bugs
authorsev <git@sev.monster>
Tue, 23 Feb 2021 11:51:04 +0000 (05:51 -0600)
committersev <git@sev.monster>
Tue, 23 Feb 2021 13:16:02 +0000 (07:16 -0600)
some systems do not like having everything in zprofile due to how their
system configs are laid out, and some things that were assumed to carry
over into subshells did not actually do so. partially revert zsh
refactor by moving affected stuff back into .zshrc, such as promptinit,
compinit, vcs_info, bindkeys, etc.

this commit also fixes a bug in preexec that caused unnecessary
expansion due to using incorrect opts for print.

ssh-agent setup was also cleaned up a bit.

base/.zprofile
base/.zshrc

index acdd19198e4605fcd319624f2aef9aa9bc7f43f8..f02872800c6c44d36fb806f664cf9fdef6e1f75c 100644 (file)
@@ -1,6 +1,3 @@
-### imports
-source ~/bin/.check-busybox
-
 ### exports
 ## reset PATH to prevent /etc/zprofile from changing it
 # some distros put non-interactive PATH in env and interactive PATH in profile;
@@ -37,8 +34,8 @@ if [[ ! -v SSH_AUTH_SOCK && ( -v commands[okc-ssh-agent] ||
     if [[ -f "$agentfile" ]] {
         IFS=$'\0' read -r sock pid <"$agentfile"
     }
-    if [[ -S "$sock" && $pid -gt 0 ]] && kill -0 $pid; then
-        echo "Reusing ${okc+okc-ssh-}agent pid $pid"
+    if [[ -S "$sock" && $pid > 0 ]] && kill -0 $pid; then
+        echo "Reusing agent pid $pid"
         export SSH_AUTH_SOCK="$sock"
         export SSH_AGENT_PID=$pid
     else
@@ -52,7 +49,9 @@ if [[ ! -v SSH_AUTH_SOCK && ( -v commands[okc-ssh-agent] ||
           ( ! -v SSH_AUTH_SOCK || -v DISPLAY ) ]] {
     export GPG_TTY=$(tty)
     export PINENTRY_USER_DATA=USE_TTY=$((!${+DISPLAY}))
-    gpg-connect-agent UPDATESTARTUPTTY /BYE >/dev/null 2>&1
+    gpg-connect-agent UPDATESTARTUPTTY /bye >/dev/null 2>&1
+    gpg-connect-agent /subst /serverpid \
+        '/echo GPG agent pid ${get serverpid}' /bye
     [[ ! -v SSH_AUTH_SOCK ]] && \
         export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
 }
@@ -63,285 +62,7 @@ if [[ -v _GNUPG_SOCK_SRC && -v _GNUPG_SOCK_DEST && -S $_GNUPG_SOCK_DEST ]] {
     mv $_GNUPG_SOCK_DEST $_GNUPG_SOCK_SRC >/dev/null
 }
 
-### options
-setopt NO_BEEP NO_CLOBBER
-## cd
-setopt AUTO_CD CDABLE_VARS
-## completion
-setopt GLOB_COMPLETE
-## line
-setopt EXTENDED_GLOB GLOB_DOTS MARK_DIRS NOMATCH NUMERIC_GLOB_SORT
-## prompt
-setopt PROMPT_SUBST
-## jobs
-setopt AUTO_CONTINUE
-## history
-setopt NO_HIST_SAVE_BY_COPY HIST_IGNORE_DUPS SHARE_HISTORY
-
-### keys
-# TODO: investigate "^[[200~" bracketed-paste
-bindkey -v
-KEYTIMEOUT=10
-## populate key array
-if (( $#terminfo == 0 )) {
-    # terminfo is not set or empty
-    function find_keymap {
-        for f in ${ZDOTDIR:-$HOME}/.zkbd/${TERM}{-${DISPLAY:-${VENDOR}-${OSTYPE}},}
-            [[ -f $f ]] && keymap=$f && break
-    }
-    find_keymap
-    if [[ -z $keymap ]] {
-        if read -q "?Can't read terminfo. Add new zkbd keymap? [y/N]"; then
-            echo
-            autoload -Uz zkbd && zkbd
-            unfunction zkbd
-            find_keymap
-        fi
-        echo
-    }
-    if [[ -n $keymap ]] {
-        source $keymap
-    } else {
-        echo "Failed to source file $keymap" >&2
-    }
-    unfunction find_keymap; unset keymap
-} else {
-    # activate application mode for zle so terminfo keys work
-    # don't do this for zkbd since application mode shouldn't have ben enabled
-    if [[ -v terminfo[smkx] && -v terminfo[rmkx] ]] {
-        autoload -Uz add-zle-hook-widget
-        function _enter-application-mode { echoti smkx }
-        add-zle-hook-widget line-init _enter-application-mode
-        function _exit-application-mode { echoti rmkx }
-        add-zle-hook-widget line-finish _exit-application-mode
-        trap _exit-application-mode EXIT
-    }
-    # match zkbd hash as best we can to terminfo
-    typeset -gA key
-    key[F1]=$terminfo[kf1]
-    key[F2]=$terminfo[kf2]
-    key[F3]=$terminfo[kf3]
-    key[F4]=$terminfo[kf4]
-    key[F5]=$terminfo[kf5]
-    key[F6]=$terminfo[kf6]
-    key[F7]=$terminfo[kf7]
-    key[F8]=$terminfo[kf8]
-    key[F9]=$terminfo[kf9]
-    key[F10]=$terminfo[kf10]
-    key[F11]=$terminfo[kf11]
-    key[F12]=$terminfo[kf12]
-    key[Backspace]=$terminfo[kbs]
-    key[Insert]=$terminfo[kich1]
-    key[Home]=$terminfo[khome]
-    key[PageUp]=$terminfo[kpp]
-    key[Delete]=$terminfo[kdch1]
-    key[End]=$terminfo[kend]
-    key[PageDown]=$terminfo[knp]
-    key[Up]=$terminfo[kcuu1]
-    key[Down]=$terminfo[kcud1]
-    key[Left]=$terminfo[kcub1]
-    key[Right]=$terminfo[kcuf1]
-    #key[Menu]=$terminfo[] #TODO: not in termcap?
-}
-
-## bind keys in both viins and vicmd modes
-function multibind {
-    local k=$key[$1]
-    if [[ -n $k ]] {
-        bindkey -- $k $2
-        if [[ -v 3 ]] {
-            # - will use same command as viins
-            bindkey -a -- $k ${3:/-/$2}
-        }
-    }
-}
-multibind Backspace backward-delete-char vi-backward-char
-multibind Insert    overwrite-mode       vi-insert
-multibind Home      beginning-of-line    -
-multibind PageUp    up-line-or-history   -
-multibind Delete    delete-char          vi-delete-char
-multibind End       end-of-line          -
-multibind PageDown  down-line-or-history -
-multibind Left      backward-char        vi-backward-char
-multibind Right     forward-char         vi-forward-char
-## history search
-autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
-zle -N up-line-or-beginning-search
-multibind Up        up-line-or-beginning-search -
-zle -N down-line-or-beginning-search
-multibind Down      down-line-or-beginning-search -
-unfunction multibind
-
-### aliases
-alias h="history -25"
-alias j="jobs -l"
-alias l="ls -AF"
-alias p="${PAGER:-more}" # TODO: make sure more is there or use safe default
-alias e="${EDITOR:-vi}"  # TODO: make sure vi is there or use safe default
-if [[ "$OSTYPE" =~ '^(free|net)bsd' ]] {
-    alias ll="ls -lAFho"
-} else {
-    alias ll="ls -lAFh"
-}
-alias se=sudoedit
-## ps
-local p=
-if which pstree >/dev/null 2>&1 && ! check-busybox pstree; then
-    # use pstree, but NOT busybox pstree because it kinda sucks
-    p="pstree -wg3"
-elif [[ "$OSTYPE" =~ '^freebsd' ]]; then
-    p="ps -aSdfxwwouser=USR -ogroup=GRP -opid,nice=NI \
-       -o%cpu,%mem,tty,stat,start=START -oetime,command"
-elif check-busybox ps; then
-    # busybox compatible
-    p="ps -eouser='USR     ' -ogroup='GRP     ' \
-       -opid='  PID' -onice=' NI' -ovsz=' MEM' \
-       -otty,stat,etime,comm"
-else
-    # XXX: untested, posix
-    # TODO: support gnu ps
-    p="ps -eouser=USR -ogroup=GRP -opid,nice=NI \
-       -opcpu=CPU -ovsz=MEM -otty,stat,etime,comm"
-fi
-if [[ "$(basename "$PAGER")" = "less" ]] {
-    p="$p | less -SE"
-} else {
-    p="$p | \"${PAGER:-more}\""
-}
-alias pa="$p"
-alias spa="sudo $p"
-unset p
-## py venv
-alias va="source bin/activate"
-alias vd="deactivate"
-## be paranoid
-alias cp='cp -ip'
-alias mv='mv -i'
-if [[ "$OSTYPE" =~ '^freebsd' ]] {
-    # don't confirm if only a few files are deleted
-    alias rm='rm -I'
-} else {
-    # TODO: similar behavior for non-freebsd, or impliment in zsh
-    alias rm='rm -i'
-}
-## go up directories
-function up {
-    cd $(printf '../%.0s' {1..${1:-1}})
-}
-
-### hooks
-autoload -Uz add-zsh-hook
-_sev_exectime=
-function sev_precmd {
-    # change terminal title
-    # TODO: update and send BEL when job status changes
-    print -Pn "\e]2;%(1j,%j,)%#${SSH_CLIENT+$USER@$HOST:}%~\e\\"
-    # bell if exec takes 5s
-    if (( SECONDS - _sev_exectime >= 5 )) print "\a"
-    # we could update vcs_info here, but let prompt take care of it
-    # if it doesn't use vcs, it can be ignored safely
-}
-add-zsh-hook precmd sev_precmd
-function sev_preexec {
-    # change terminal title to show command
-    print -Pnf "\e]2;%s\e\\" "%#${SSH_CLIENT+$USER@$HOST:}$1"
-    # save last exec time for bell
-    # XXX: does not run for blank cmdline
-    _sev_exectime=$SECONDS
-}
-add-zsh-hook preexec sev_preexec
-function sev_chpwd {
-    # echo dir on cwd change
-    ls -AF
-}
-add-zsh-hook chpwd sev_chpwd
-
-### system-specific configs and aliases
-case "$OSTYPE"; in
-    freebsd*)
-        # colors
-        export CLICOLOR=
-        export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
-
-        ## sound
-        function s { sysctl hw.snd.default_unit${1:+\=$1} }
-        alias vol mixer
-
-        ## install port dependencies from pkg (like pkgsrc `bmake bin-install')
-        # XXX: should probably use package-depends where possible, breaks when
-        #     port name is different to package name
-        #     (eg. graphics/sdl20 == sdl2, devel/glib20 == glib2, etc)
-        function portpkg {
-            case "$1" {
-            build|run)
-                sudo pkg install -AU $(make ${1}-depends-list |
-                           sed 's_/usr/ports/_ _' | tr -d '\n')
-                ;;
-            *)  echo "Usage: \`portpkg <build|run>' in a port directory"
-                return 1;;
-            }
-        };;
-    netbsd)
-        ## sound
-        function s {
-            if [[ -z "$1" ]] {
-                ll /dev/mixer /dev/sound /dev/audio
-                return
-            }
-            for x in mixer sound audio; do
-                ln -sf /dev/$x"$1" /dev/$x
-            done
-        }
-        function vol {
-            if [[ -z "$1" ]] {
-                for x in $(mixerctl -a | grep 'outputs\.master'); do
-                    echo $x
-                done
-                return
-            }
-            mixerctl -w outputs.master"$2"="$1"
-        };;
-    *)
-        ## sound
-        # TODO: test alsa/oss/sndio/portaudio/pulse in order of importance
-        function s {}
-        function vol {}
-esac
-
-### modules & styles
-## vcs
-zstyle ':vcs_info:*' enable git
-#zstyle ':vcs_info:git*' check-for-changes true #too slow
-zstyle ':vcs_info:git*:dotfiles' check-for-changes true
-zstyle ':vcs_info:git*' check-for-staged-changes true
-autoload -Uz vcs_info
-
-## compinit
-zstyle ':completion:*' auto-description '[arg] %d'
-zstyle ':completion:*' expand suffix
-zstyle ':completion:*' format '# %d'
-zstyle ':completion:*' group-name ''
-zstyle ':completion:*' ignore-parents parent
-zstyle ':completion:*' insert-unambiguous false
-zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
-zstyle ':completion:*' list-prompt '%B%i%b'
-zstyle ':completion:*' list-suffixes true
-zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} r:|[._-]=* r:|=*' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*'
-zstyle ':completion:*' menu select=1
-zstyle ':completion:*' original false
-zstyle ':completion:*' select-prompt '%B%l%b'
-zstyle ':completion:*' verbose true
-autoload -Uz compinit && compinit
-
-## prompt
-# do this last so prompt can potentially override other settings
-autoload -Uz promptinit && promptinit
-prompt arrows
-
 ### load site-specific
 if [[ -f ~/.zprofile.local ]] { source ~/.zprofile.local }
 
-### unset imports
-unfunction check-busybox
-
 # vim: set et sts=4 sw=4 ts=8 tw=79 :
index af0becff16191c651bf615f486e93a40781c9c84..090d7fa5c9714b003c4ba58c4474a7818b62ff8c 100644 (file)
@@ -1,3 +1,280 @@
+### options
+setopt NO_BEEP NO_CLOBBER
+## cd
+setopt AUTO_CD CDABLE_VARS
+## completion
+setopt GLOB_COMPLETE
+## line
+setopt EXTENDED_GLOB GLOB_DOTS MARK_DIRS NOMATCH NUMERIC_GLOB_SORT
+## prompt
+setopt PROMPT_SUBST
+## jobs
+setopt AUTO_CONTINUE
+## history
+setopt NO_HIST_SAVE_BY_COPY HIST_IGNORE_DUPS SHARE_HISTORY
+
+### keys
+# TODO: investigate "^[[200~" bracketed-paste
+bindkey -v
+KEYTIMEOUT=10
+## populate key array
+if (( $#terminfo == 0 )) {
+    # terminfo is not set or empty
+    function find_keymap {
+        for f in ${ZDOTDIR:-$HOME}/.zkbd/${TERM}{-${DISPLAY:-${VENDOR}-${OSTYPE}},}
+            [[ -f $f ]] && keymap=$f && break
+    }
+    find_keymap
+    if [[ -z $keymap ]] {
+        if read -q "?Can't read terminfo. Add new zkbd keymap? [y/N]"; then
+            echo
+            autoload -Uz zkbd && zkbd
+            unfunction zkbd
+            find_keymap
+        fi
+        echo
+    }
+    if [[ -n $keymap ]] {
+        source $keymap
+    } else {
+        echo "Failed to source file $keymap" >&2
+    }
+    unfunction find_keymap; unset keymap
+} else {
+    # activate application mode for zle so terminfo keys work
+    # don't do this for zkbd since application mode shouldn't have ben enabled
+    if [[ -v terminfo[smkx] && -v terminfo[rmkx] ]] {
+        autoload -Uz add-zle-hook-widget
+        function _enter-application-mode { echoti smkx }
+        add-zle-hook-widget line-init _enter-application-mode
+        function _exit-application-mode { echoti rmkx }
+        add-zle-hook-widget line-finish _exit-application-mode
+        trap _exit-application-mode EXIT
+    }
+    # match zkbd hash as best we can to terminfo
+    typeset -gA key
+    key[F1]=$terminfo[kf1]
+    key[F2]=$terminfo[kf2]
+    key[F3]=$terminfo[kf3]
+    key[F4]=$terminfo[kf4]
+    key[F5]=$terminfo[kf5]
+    key[F6]=$terminfo[kf6]
+    key[F7]=$terminfo[kf7]
+    key[F8]=$terminfo[kf8]
+    key[F9]=$terminfo[kf9]
+    key[F10]=$terminfo[kf10]
+    key[F11]=$terminfo[kf11]
+    key[F12]=$terminfo[kf12]
+    key[Backspace]=$terminfo[kbs]
+    key[Insert]=$terminfo[kich1]
+    key[Home]=$terminfo[khome]
+    key[PageUp]=$terminfo[kpp]
+    key[Delete]=$terminfo[kdch1]
+    key[End]=$terminfo[kend]
+    key[PageDown]=$terminfo[knp]
+    key[Up]=$terminfo[kcuu1]
+    key[Down]=$terminfo[kcud1]
+    key[Left]=$terminfo[kcub1]
+    key[Right]=$terminfo[kcuf1]
+    #key[Menu]=$terminfo[] #TODO: not in termcap?
+}
+
+## bind keys in both viins and vicmd modes
+function multibind {
+    local k=$key[$1]
+    if [[ -n $k ]] {
+        bindkey -- $k $2
+        if [[ -v 3 ]] {
+            # - will use same command as viins
+            bindkey -a -- $k ${3:/-/$2}
+        }
+    }
+}
+multibind Backspace backward-delete-char vi-backward-char
+multibind Insert    overwrite-mode       vi-insert
+multibind Home      beginning-of-line    -
+multibind PageUp    up-line-or-history   -
+multibind Delete    delete-char          vi-delete-char
+multibind End       end-of-line          -
+multibind PageDown  down-line-or-history -
+multibind Left      backward-char        vi-backward-char
+multibind Right     forward-char         vi-forward-char
+## history search
+autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
+zle -N up-line-or-beginning-search
+multibind Up        up-line-or-beginning-search -
+zle -N down-line-or-beginning-search
+multibind Down      down-line-or-beginning-search -
+unfunction multibind
+
+### aliases
+## generic abbreviations
+alias h="history -25"
+alias j="jobs -l"
+alias l="ls -AF"
+alias p="${PAGER:-more}" # TODO: make sure more is there or use safe default
+alias e="${EDITOR:-vi}"  # TODO: make sure vi is there or use safe default
+if [[ "$OSTYPE" =~ '^(free|net)bsd' ]] {
+    alias ll="ls -lAFho"
+} else {
+    alias ll="ls -lAFh"
+}
+alias se=sudoedit
+## be paranoid
+alias cp='cp -ip'
+alias mv='mv -i'
+if [[ "$OSTYPE" =~ '^freebsd' ]] {
+    # don't confirm if only a few files are deleted
+    alias rm='rm -I'
+} else {
+    # TODO: similar behavior for non-freebsd, or impliment in zsh
+    alias rm='rm -i'
+}
+## go up directories
+function up {
+    cd $(printf '../%.0s' {1..${1:-1}})
+}
+## py venv
+alias va="source bin/activate"
+alias vd="deactivate"
+## ps
+# source helper function
+source ~/bin/.check-busybox
+if which pstree >/dev/null 2>&1 && ! check-busybox pstree; then
+    # 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
+    # busybox compatible
+    ps="ps -eouser='USR     ' -ogroup='GRP     ' \
+       -opid='  PID' -onice=' NI' -ovsz=' MEM' \
+       -otty,stat,etime,comm"
+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
+if [[ "$(basename "$PAGER")" = "less" ]] {
+    ps="$ps | less -SE"
+} else {
+    ps="$ps | \"${PAGER:-more}\""
+}
+alias pa="$ps"
+alias spa="sudo $ps"
+unset ps
+
+### hooks
+autoload -Uz add-zsh-hook
+_sev_exectime=
+function sev_preexec {
+    # change terminal title to show command
+    print -n "\e]2;$(print -P '%#')${SSH_CLIENT+$USER@$HOST:}$1\e\\"
+    # save last exec time for bell
+    # XXX: does not run for blank cmdline
+    _sev_exectime=$SECONDS
+}
+add-zsh-hook preexec sev_preexec
+function sev_precmd {
+    # change terminal title
+    # TODO: update and send BEL when job status changes
+    print -Pn "\e]2;%(1j,%j,)%#${SSH_CLIENT+$USER@$HOST:}%~\e\\"
+    # bell if exec takes 5s
+    if (( SECONDS - _sev_exectime >= 5 )) print "\a"
+    # we could update vcs_info here, but let prompt take care of it
+    # if it doesn't use vcs, it can be ignored safely
+}
+add-zsh-hook precmd sev_precmd
+function sev_chpwd {
+    # echo dir on cwd change
+    ls -AF
+}
+add-zsh-hook chpwd sev_chpwd
+
+### system-specific configs and aliases
+case "$OSTYPE"; in
+    freebsd*)
+        # colors
+        export CLICOLOR=
+        export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
+
+        ## sound
+        function s { sysctl hw.snd.default_unit${1:+\=$1} }
+        alias vol mixer
+
+        ## install port dependencies from pkg (like pkgsrc `bmake bin-install')
+        # XXX: should probably use package-depends where possible, breaks when
+        #     port name is different to package name
+        #     (eg. graphics/sdl20 == sdl2, devel/glib20 == glib2, etc)
+        function portpkg {
+            case "$1" {
+            build|run)
+                sudo pkg install -AU $(make ${1}-depends-list |
+                           sed 's_/usr/ports/_ _' | tr -d '\n')
+                ;;
+            *)  echo "Usage: \`portpkg <build|run>' in a port directory"
+                return 1;;
+            }
+        };;
+    netbsd)
+        ## sound
+        function s {
+            if [[ -z "$1" ]] {
+                ll /dev/mixer /dev/sound /dev/audio
+                return
+            }
+            for x in mixer sound audio; do
+                ln -sf /dev/$x"$1" /dev/$x
+            done
+        }
+        function vol {
+            if [[ -z "$1" ]] {
+                for x in $(mixerctl -a | grep 'outputs\.master'); do
+                    echo $x
+                done
+                return
+            }
+            mixerctl -w outputs.master"$2"="$1"
+        };;
+    *)
+        ## sound
+        # TODO: test alsa/oss/sndio/portaudio/pulse in order of importance
+        function s {}
+        function vol {}
+esac
+
+### modules & styles
+## vcs
+zstyle ':vcs_info:*' enable git
+#zstyle ':vcs_info:git*' check-for-changes true #too slow
+zstyle ':vcs_info:git*:dotfiles' check-for-changes true
+zstyle ':vcs_info:git*' check-for-staged-changes true
+autoload -Uz vcs_info
+
+## compinit
+zstyle ':completion:*' auto-description '[arg] %d'
+zstyle ':completion:*' expand suffix
+zstyle ':completion:*' format '# %d'
+zstyle ':completion:*' group-name ''
+zstyle ':completion:*' ignore-parents parent
+zstyle ':completion:*' insert-unambiguous false
+zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
+zstyle ':completion:*' list-prompt '%B%i%b'
+zstyle ':completion:*' list-suffixes true
+zstyle ':completion:*' matcher-list '' 'm:{[:lower:]}={[:upper:]}' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} r:|[._-]=* r:|=*' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*'
+zstyle ':completion:*' menu select=1
+zstyle ':completion:*' original false
+zstyle ':completion:*' select-prompt '%B%l%b'
+zstyle ':completion:*' verbose true
+autoload -Uz compinit && compinit
+
+### prompt
+autoload -Uz promptinit && promptinit
+prompt arrows
+
 ### load site-specific
 if [[ -f ~/.zshrc.local ]] { source ~/.zshrc.local }
 
This page took 0.060297 seconds and 4 git commands to generate.