]> git.sev.monster Git - dotfiles.git/commitdiff
more zsh fixes
authorsev <git@sev.monster>
Fri, 20 Oct 2023 17:03:44 +0000 (12:03 -0500)
committersev <git@sev.monster>
Fri, 5 Apr 2024 21:27:41 +0000 (16:27 -0500)
- various comment updates
- moved some stuff out of zprofile and into zshenv for earlier use
- fixed zoxide bug until upstream fixes it
- PATH will now be updated twice, once in zshenv and once in zprofile
- rehash alias will update PATH before rehashing
- FPATH is now deduplicated like PATH is

Arch Linux and other systems (especially FreeBSD around version 10 and 11, last
I used it) do a lot of stuff to your shell environment via /etc/profile{,d},
and this may end up being sourced by the system zprofile for compatibility.
rather than shove everything into our local zprofile to override this aberrant
and often unwanted behavior as was previously done, let's just set things up in
zshenv as it should be, and if there are any problems, use load-site-dotfile
to fix things up instead. system profile scripts that make use of env vars will
also be taken care of with this approach, like flatpak-bindir.sh in the Arch
Linux flatpak package for example.

we also now update PATH twice so it can be set up early for our own purposes,
and so that any weird changes made by system profile scripts can be fixed.

etc/zsh/.zprofile
etc/zsh/.zshenv
etc/zsh/.zshrc

index 57c9ffc0bc5b7aca13baf5ecb0e176a1162c8982..a55b7e6e9ce6f2ef3d4782042255f602f679bfe1 100644 (file)
 # this file respects non-interactive sessions and will not intentionally emit
 # output.
 
-### cleanup
-# XXX: only call after relevant vars have been set up, defined early so that
-#      below code can utilize it after they do so
-function _sev_zcleanup {
-    ## gpg forwarding
-    if [[ -d $_sev_gpg_forward_dir && ( -z $1 || $1 == 'gpg-forward' ) ]] {
-        # clean up forward dirs if its session is dead or we ask for it
-        find $_sev_gpg_forward_dir -mindepth 1 -maxdepth 1 -type d |
-          while {read -r x} {
-            # NOTE: the only way we can get here is if we have not been
-            #       forwarded before, if the user asks for it, or during
-            #       logout. if our own pid already has a dir, it is most likely
-            #       stale, the user wants it removed, or something is very
-            #       broken—in all 3 of these cases the best choice is remove it.
-            p=$(basename $x)
-            if {[[ -v _sev_gpg_forward_clean || $$ == $p ]] ||
-                    ! kill -0 $p 2>/dev/null} {
-                find $x -mindepth 1 -maxdepth 1 | while {read -r y} {
-                    # XXX: real dirs will stop unlink, consider it a feature
-                    unlink $y
-                }
-                # don't force in case something important is still there
-                rmdir $x
-            }
-        }
-        # reset GNUPGHOME if we removed our own dir
-        if [[ $GNUPGHOME =~ '/.ssh_forward/\d+/*$' && ! -e $GNUPGHOME ]]
-            GNUPGHOME=${GNUPGHOME%$MATCH}
-    }
-
-    ## tmp
-    # NOTE: _sev_tmp is not unset so session dirs will not be recreated
-    # NOTE: XDG dirs that use our tmp are not unset here, they are in zlogout
-    if [[ -d $_sev_tmp && ( -z $1 || $1 == 'tmp' ) ]] {
-        # clean up tmp dirs if its session is dead or we ask for it
-        find $_sev_tmp -mindepth 1 -maxdepth 1 -name '.session.*' -type d |
-          while {read -r x} {
-            # NOTE: same rationale as above
-            p=${$(basename $x)#.session.}
-            if {[[ -v _sev_tmp_clean || $$ == $p ]] ||
-                    ! kill -0 $p 2>/dev/null} {
-                rm -rf $x
-            }
-        }
-    }
-
-    unset x p y
-}
-
-### xdg local dir
-# NOTE: need this for tmp, so confirm it exists.
-# XXX: perms are not specified for XDG dirs except runtime, but I think 760
-#      makes the most sense. shouldn't break anything since no one else should
-#      be poking around in our dir.
-[[ -e ~/.local ]] || mkdir -m760 ~/.local
-
-### tmp
-# NOTE: specs say that POSIX tmp and XDG runtime directories should exist
-#       until the last session is logged out (POSIX can exist for longer).
-#       since we can't reliably keep track of sessions in a cross-platform
-#       manner, the current implementation should use a separate directory per
-#       toplevel session (i.e. SHLVL=1). this should placate most applications,
-#       though it is not expressly spec compliant. this may also cause problems
-#       with disowned applications that still try to use the directories after
-#       the toplevel shell has already logged out and the dirs removed, but the
-#       chances of that are slim.
-if [[ ! -v _sev_tmp ]] {
-    # create personal TMPDIR under system tmp
-    t=${TMPDIR:-${TEMPDIR:-${TEMP:-${TMP:-/tmp}}}}/.home-$LOGNAME
-    [[ -e $t ]] || mkdir -m700 $t 2>/dev/null
-    _sev_tmp=~/.local/tmp
-    if [[ ! -d $t ]] {
-        # fallback TMPDIR to bare local directory or existing softlink
-        [[ -o interactive ]] &&
-          print -P "%F{orange}*** Can't create tmp dir $t, using $_sev_tmp%f"
-        [[ -h $_sev_tmp && ! -d _sev_tmp ]] && unlink $_sev_tmp 2>/dev/null
-        [[ ! -e $_sev_tmp ]] && mkdir -m700 $_sev_tmp 2>/dev/null
-        if [[ ! -d $_sev_tmp ]] {
-            _sev_tmp=${$(mktemp 2>/dev/null):/tmp}
-            [[ -o interactive ]] &&
-              print -P "%F{red}!!! Can't create tmp dir, using $_sev_tmp%f"
-        }
-    } elif [[ -f $_sev_tmp || ( -d $_sev_tmp && ! -h $_sev_tmp ) ]] {
-        # file or non-softlink directory is on our local dir
-        [[ -o interactive ]] &&
-          print -P "%F{orange}*** $_sev_tmp exists, can't link to tmp dir $t, ignoring it%f"
-        _sev_tmp=$t
-    } else {
-        # link local dir to tmp dir
-        if [[ -h $_sev_tmp && $_sev_tmp:P != $t:P ]] {
-            [[ -o interactive ]] &&
-              print -P "%F{orange}*** $_sev_tmp links to ${_sev_tmp:P} and not ${t:P}, unlinking it%f"
-            # XXX: race condition for existing sessions still using this dir
-            unlink $_sev_tmp 2>/dev/null
-        }
-        ln -s $t $_sev_tmp 2>/dev/null
-    }
-    if [[ -v _sev_tmp ]] {
-        # ensure dir is clean
-        _sev_zcleanup tmp
-        # finally create our subdir for this session
-        t=$_sev_tmp/.session.$$
-        if ! mkdir -m700 $t 2>/dev/null; then
-            [[ -o interactive ]] &&
-              print -P "%F{red}!!! Can't create session tmp subdir $t, using $_sev_tmp%f"
-            t=$_sev_tmp
-        fi
-        export _sev_tmp TMPDIR=$t TEMPDIR=$t TEMP=$t TMP=$t
-    }
-    unset t
-}
-
-### xdg
-if [[ ! -v _sev_setup_xdg ]] {
-    ## merge with any existing dirs and remove duplicates using unique arrays
-    # NOTE: we are accepting whatever value might be set for CONFIG and DATA;
-    #       if it wasn't set, we just use default and leave it unset
-    # NOTE: include and then remove CONFIG_HOME and DATA_HOME to ensure they
-    #       are not present in the array if it was added before we got to it
-
-    # source user dirs before other vars; technically it is against spec to
-    # include any of the below dirs there, but you never know what crazy shit
-    # people will do. I rather handle them sanely with our own code than let
-    # them override after the fact.
-    [[ -e $XDG_CONFIG_HOME/user-dirs.dirs ]] &&
-      emulate sh -c "source $XDG_CONFIG_HOME/user-dirs.dirs"
-
-    typeset -UT XDG_DATA_DIRS xdg_data_dirs
-    if [[ -v XDG_DATA_HOME ]] {
-        export XDG_DATA_HOME
-    } elif [[ ! -e ~/.local/share ]] {
-        mkdir -m760 ~/.local/share
-    }
-    xdg_data_dirs=($XDG_DATA_HOME /{opt,usr/local,usr/pkg,usr}/share
-      ${XDG_DATA_DIRS:+"$xdg_data_dirs[@]"})
-    # XXX: if colons are not escaped, could remove unintended part of string
-    # TODO: remove empty element via array not scalar
-    export XDG_DATA_DIRS=${XDG_DATA_DIRS#$XDG_DATA_HOME:}
-
-    typeset -UT XDG_CONFIG_DIRS xdg_config_dirs
-    if [[ -v XDG_CONFIG_HOME ]] {
-        export XDG_CONFIG_HOME
-    } elif [[ ! -e ~/.config ]] {
-        mkdir -m760 ~/.config
-    }
-    # I am of the belief .local should follow FHS /usr/local...
-    [[ -e ~/.local/etc ]] || ln -s ~/.config ~/.local/etc
-    xdg_config_dirs=($XDG_CONFIG_HOME ${XDG_CONFIG_DIRS:+"$xdg_config_dirs[@]"}
-      {/opt,/usr/local,/usr/pkg,}/etc/xdg)
-    # XXX: if colons are not escaped, could remove unintended part of string
-    # TODO: remove empty element via array not scalar
-    export XDG_CONFIG_DIRS=${XDG_CONFIG_DIRS#$XDG_CONFIG_HOME:}
-
-    if [[ -v XDG_STATE_HOME ]] {
-        export XDG_STATE_HOME
-    } elif [[ ! -e ~/.local/state ]] {
-        mkdir -m760 ~/.local/state
-    }
-
-    if [[ -v XDG_CACHE_HOME ]] {
-        export XDG_CACHE_HOME
-    } else {
-        if [[ -v _sev_tmp ]] {
-            export XDG_CACHE_HOME=$_sev_tmp/.xdg.cache
-            [[ -e $XDG_CACHE_HOME ]] || mkdir -m700 $XDG_CACHE_HOME
-        } elif [[ ! -e ~/.cache ]] {
-            mkdir -m700 ~/.cache
-        }
-    }
-
-    if [[ -v XDG_RUNTIME_DIR ]] {
-        # NOTE: this can be set by systemd or other pre-shell supervisor, and
-        #       if any services were started such as pipewire, we need to use
-        #       the existing runtime dir so that we can get any existing
-        #       program sockets or other data
-        export XDG_RUNTIME_DIR
-    } elif [[ -v TMPDIR ]] {
-        # make runtime dir in our session-specific tmpdir
-        export XDG_RUNTIME_DIR=$TMPDIR/.xdg.runtime
-        # same as in tmpdir creation, ensure dir doesn't exist
-        if [[ -h $XDG_RUNTIME_DIR ]] {
-            unlink $XDG_RUNTIME_DIR 2>/dev/null
-        } elif [[ -e $XDG_RUNTIME_DIR ]] {
-            rm -rf $XDG_RUNTIME_DIR 2>/dev/null
-        }
-        mkdir -m700 $XDG_RUNTIME_DIR 2>/dev/null
-    }
-
-    export _sev_setup_xdg=
+### fix path after system profile scripts have possibly mangled it
+if [[ ! -v _sev_setup_path || -o login ]] {
+    _sev_setpath
+    export _sev_setup_path=
 }
 
 ### dbus
@@ -207,15 +22,6 @@ if [[ ! -v DBUS_SESSION_BUS_ADDRESS && -v commands[dbus-launch] ]] {
     export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
 }
 
-### gpg home
-if [[ ! -v GNUPGHOME ]] {
-    export GNUPGHOME=${XDG_CONFIG_HOME:-~/.config}/gnupg
-    # move existing gnupg dir to our new home
-    if [[ -d ~/.gnupg && ! -d $GNUPGHOME ]] {
-        mv ~/.gnupg $GNUPGHOME
-    }
-}
-
 ### gpg agent + forwarding
 # NOTE: while ssh manages its auth sock in-protocol when ForwardSsh is enabled,
 #       GPG must be forwarded manually over Unix socket. to support this, we
@@ -416,11 +222,5 @@ if [[ ! -v _sev_setup_ssh ]] {
 }
 unfunction _gpg_socketpath
 
-### perl local lib
-[[ -v commands[perl] && -d $XDG_DATA_HOME/perl5/lib/perl5 &&
-   ! -v PERL_LOCAL_LIB_ROOT ]] &&
-  eval $(perl -I$XDG_DATA_HOME/perl5/lib/perl5 \
-              -Mlocal::lib=$XDG_DATA_HOME/perl5 2>/dev/null)
-
 ### load site-specific
 load-site-dotfile zprofile
index f14590ecae89d9a987c2e98a82be07f7b87ce0de..56f80dc83749a4ffcab265af94ead48dd31520bc 100644 (file)
@@ -1,28 +1,60 @@
-### critical exports, the rest are in zprofile
-export CHARSET=${CHARSET:-UTF-8}
-export LANG=${LANG:-en_US.UTF-8}
-## alternative home for pulling in bin & config, used for zsu
-[[ -v _sev_home ]] || export _sev_home=$HOME
+### functions
+## cleanup
+# XXX: only call after relevant vars have been set up, defined early so that
+#      below code can utilize it after they do so
+function _sev_zcleanup {
+    # gpg forwarding
+    if [[ -d $_sev_gpg_forward_dir && ( -z $1 || $1 == 'gpg-forward' ) ]] {
+        # clean up forward dirs if its session is dead or we ask for it
+        find $_sev_gpg_forward_dir -mindepth 1 -maxdepth 1 -type d |
+          while {read -r x} {
+            # NOTE: the only way we can get here is if we have not been
+            #       forwarded before, if the user asks for it, or during
+            #       logout. if our own pid already has a dir, it is most likely
+            #       stale, the user wants it removed, or something is very
+            #       broken—in all 3 of these cases the best choice is remove it.
+            p=$(basename $x)
+            if {[[ -v _sev_gpg_forward_clean || $$ == $p ]] ||
+                    ! kill -0 $p 2>/dev/null} {
+                find $x -mindepth 1 -maxdepth 1 | while {read -r y} {
+                    # XXX: real dirs will stop unlink, consider it a feature
+                    unlink $y
+                }
+                # don't force in case something important is still there
+                rmdir $x
+            }
+        }
+        # reset GNUPGHOME if we removed our own dir
+        if [[ $GNUPGHOME =~ '/.ssh_forward/\d+/*$' && ! -e $GNUPGHOME ]]
+            GNUPGHOME=${GNUPGHOME%$MATCH}
+    }
 
-## fix broken term
-# NOTE: we do this here instead of .zshrc since we might echo stuff
-if [[ -t 1 ]] { # only if stdout is tty
-    [[ ! -v TERM ]] && export TERM=xterm-256color >/dev/null 2>&1
-    if [[ $#terminfo -eq 0 ]] {
-        _oldterm=$TERM
-        export TERM=xterm >/dev/null 2>&1
-        [[ -o interactive ]] &&
-          print -P "%F{red}!!! Can't find terminfo for $_oldterm, using $TERM%f"
-        unset _oldterm
+    # custom tmp
+    # NOTE: _sev_tmp is not unset so session dirs will not be recreated if
+    #       called during runtime; unset _sev_tmp and re-source to fix
+    # NOTE: XDG dirs that use our tmp are not unset here, they are in zlogout
+    #       after this function is called
+    if [[ -d $_sev_tmp && ( -z $1 || $1 == 'tmp' ) ]] {
+        # clean up tmp dirs if its session is dead or we ask for it
+        find $_sev_tmp -mindepth 1 -maxdepth 1 -name '.session.*' -type d |
+          while {read -r x} {
+            # NOTE: same rationale as above
+            p=${$(basename $x)#.session.}
+            if {[[ -v _sev_tmp_clean || $$ == $p ]] ||
+                    ! kill -0 $p 2>/dev/null} {
+                rm -rf $x
+            }
+        }
     }
+
+    unset x p y
 }
 
-## path
-# NOTE: we utilize the fact that unique arrays keep the first occurrence and
-#       remove any further occurences to capture elements from the old PATH
-#       that we did not anticipate and shift them to the front, since they are
-#       probably important to the system
-if [[ ! -v _sev_setup_path || -o login ]] {
+function _sev_setpath {
+    # NOTE: we utilize the fact that unique arrays keep the first occurrence and
+    #       remove any further occurences to capture elements from the old PATH
+    #       that we did not anticipate and shift them to the front, since they are
+    #       probably important to the system
     typeset -U path fpath
     # add as many generic paths as possible to keep the order we want
     # NOTE: /usr/{local,pkg,games} are unix/bsdisms
@@ -31,7 +63,9 @@ if [[ ! -v _sev_setup_path || -o login ]] {
     #      executables, but we specify more; technically this is against spec
     syspath=("$path[@]")
     path=({{${_sev_home:-~},~}{/.local,},{$PREFIX,}{,/opt,/usr{,/local,/pkg}}}/{s,}bin
-          /usr/{X11R{7,6}/bin,games})
+          {$PREFIX,}/usr/{X11R{7,6}/bin,games}
+          # emulate Arch Linux flatpak-bindir.sh for use on other systems
+          {${XDG_DATA_HOME:-~/.local/share},{$PREFIX,}/var/lib}/flatpak/exports/bin)
     ((len=$#path))
     path=("$path[@]" "$syspath[@]")
     # remove bad paths
@@ -45,20 +79,219 @@ if [[ ! -v _sev_setup_path || -o login ]] {
     }
     # shift valid system paths to the front if there are any left
     ((len > 0 && len < $#path)) && path=("${(@)path[len + 1, -1]}" "${(@)path[1, len]}")
-    unset syspath len i
     # include our zsh dir in fpath. unlike above, we always prefer our paths
     fpath=({${ZDOTDIR:-~/.zsh},{${_sev_home:-~},~}/.zsh}/functions/**/*(/N) "$fpath[@]")
+    # remove bad paths
+    for (( i = 1; i <= $#fpath; i++ )) {
+        if [[ ! -d $fpath[$i] ]] {
+            fpath[$i]=()
+            ((i--))
+            continue
+        }
+    }
     # FPATH is not exported by default
     export FPATH
     typeset +U path fpath
-    export _sev_setup_path=
+    unset syspath len i
+}
+
+### common exports
+export CHARSET=${CHARSET:-UTF-8}
+export LANG=${LANG:-en_US.UTF-8}
+
+## alternative home for pulling in bin & config, used for zsu
+[[ -v _sev_home ]] || export _sev_home=$HOME
+
+## fix broken term
+# NOTE: we do this here instead of .zshrc since we might echo stuff
+if [[ -t 1 ]] { # only if stdout is tty
+    [[ ! -v TERM ]] && export TERM=xterm-256color >/dev/null 2>&1
+    if [[ $#terminfo -eq 0 ]] {
+        _oldterm=$TERM
+        export TERM=xterm >/dev/null 2>&1
+        [[ -o interactive ]] &&
+          print -P "%F{red}!!! Can't find terminfo for $_oldterm, using $TERM%f"
+        unset _oldterm
+    }
+}
+
+## path
+if [[ ! -v _sev_setup_path || -o login ]] {
+    _sev_setpath
+    # NOTE: do not set _sev_setup_path, it is set in zprofile
+}
+
+### home dir setup & exports
+# XXX: traditionally, zshenv should just contain exports, and not touch the
+#      filesystem. however, some system profile scripts that are sourced in the
+#      system zprofile may attempt to do things that rely on some of these
+#      vars. for example, `flatpak-bindir.sh` in the Arch Linux flatpak package
+#      references $XDG_DATA_HOME with no fallback. since we do special handling
+#      for these vars before we export them, we're forced to do it all here
+#      instead of zprofile.
+
+## xdg local dir
+# NOTE: need this for tmp, so confirm it exists.
+# XXX: perms are not specified for XDG dirs except runtime, but I think 760
+#      makes the most sense. shouldn't break anything since no one else should
+#      be poking around in our dir.
+[[ -e ~/.local ]] || mkdir -m760 ~/.local
+
+## tmp
+# NOTE: specs say that POSIX tmp and XDG runtime directories should exist
+#       until the last session is logged out (POSIX can exist for longer).
+#       since we can't reliably keep track of sessions in a cross-platform
+#       manner, the current implementation should use a separate directory per
+#       toplevel session (i.e. SHLVL=1). this should placate most applications,
+#       though it is not expressly spec compliant. this may also cause problems
+#       with disowned applications that still try to use the directories after
+#       the toplevel shell has already logged out and the dirs removed, but the
+#       chances of that are slim.
+if [[ ! -v _sev_tmp ]] {
+    # create personal TMPDIR under system tmp
+    t=${TMPDIR:-${TEMPDIR:-${TEMP:-${TMP:-/tmp}}}}/.home-$LOGNAME
+    [[ -e $t ]] || mkdir -m700 $t 2>/dev/null
+    _sev_tmp=~/.local/tmp
+    if [[ ! -d $t ]] {
+        # fallback TMPDIR to bare local directory or existing softlink
+        [[ -o interactive ]] &&
+          print -P "%F{orange}*** Can't create tmp dir $t, using $_sev_tmp%f"
+        [[ -h $_sev_tmp && ! -d _sev_tmp ]] && unlink $_sev_tmp 2>/dev/null
+        [[ ! -e $_sev_tmp ]] && mkdir -m700 $_sev_tmp 2>/dev/null
+        if [[ ! -d $_sev_tmp ]] {
+            _sev_tmp=${$(mktemp 2>/dev/null):/tmp}
+            [[ -o interactive ]] &&
+              print -P "%F{red}!!! Can't create tmp dir, using $_sev_tmp%f"
+        }
+    } elif [[ -f $_sev_tmp || ( -d $_sev_tmp && ! -h $_sev_tmp ) ]] {
+        # file or non-softlink directory is on our local dir
+        [[ -o interactive ]] &&
+          print -P "%F{orange}*** $_sev_tmp exists, can't link to tmp dir $t, ignoring it%f"
+        _sev_tmp=$t
+    } else {
+        # link local dir to tmp dir
+        if [[ -h $_sev_tmp && $_sev_tmp:P != $t:P ]] {
+            [[ -o interactive ]] &&
+              print -P "%F{orange}*** $_sev_tmp links to ${_sev_tmp:P} and not ${t:P}, unlinking it%f"
+            # XXX: race condition for existing sessions still using this dir
+            unlink $_sev_tmp 2>/dev/null
+        }
+        ln -s $t $_sev_tmp 2>/dev/null
+    }
+    if [[ -v _sev_tmp ]] {
+        # ensure dir is clean
+        _sev_zcleanup tmp
+        # finally create our subdir for this session
+        t=$_sev_tmp/.session.$$
+        if ! mkdir -m700 $t 2>/dev/null; then
+            [[ -o interactive ]] &&
+              print -P "%F{red}!!! Can't create session tmp subdir $t, using $_sev_tmp%f"
+            t=$_sev_tmp
+        fi
+        export _sev_tmp TMPDIR=$t TEMPDIR=$t TEMP=$t TMP=$t
+    }
+    unset t
 }
 
+## xdg
+if [[ ! -v _sev_setup_xdg ]] {
+    ## merge with any existing dirs and remove duplicates using unique arrays
+    # NOTE: we are accepting whatever value might be set for CONFIG and DATA;
+    #       if it wasn't set, we just use default and leave it unset
+    # NOTE: include and then remove CONFIG_HOME and DATA_HOME to ensure they
+    #       are not present in the array if it was added before we got to it
+
+    # source user dirs before other vars; technically it is against spec to
+    # include any of the below dirs there, but you never know what crazy shit
+    # people will do. I rather handle them sanely with our own code than let
+    # them override after the fact.
+    [[ -e $XDG_CONFIG_HOME/user-dirs.dirs ]] &&
+      emulate sh -c "source $XDG_CONFIG_HOME/user-dirs.dirs"
+
+    typeset -UT XDG_DATA_DIRS xdg_data_dirs
+    if [[ -v XDG_DATA_HOME ]] {
+        export XDG_DATA_HOME
+    } elif [[ ! -e ~/.local/share ]] {
+        mkdir -m760 ~/.local/share
+    }
+    xdg_data_dirs=($XDG_DATA_HOME /{opt,usr/local,usr/pkg,usr}/share
+      ${XDG_DATA_DIRS:+"$xdg_data_dirs[@]"})
+    xdg_data_dirs=${xdg_data_dirs:#}
+    export XDG_DATA_DIRS
+
+    typeset -UT XDG_CONFIG_DIRS xdg_config_dirs
+    if [[ -v XDG_CONFIG_HOME ]] {
+        export XDG_CONFIG_HOME
+    } elif [[ ! -e ~/.config ]] {
+        mkdir -m760 ~/.config
+    }
+    # I am of the belief .local should follow FHS /usr/local...
+    [[ -e ~/.local/etc ]] || ln -s ~/.config ~/.local/etc
+    xdg_config_dirs=($XDG_CONFIG_HOME ${XDG_CONFIG_DIRS:+"$xdg_config_dirs[@]"}
+      {/opt,/usr/local,/usr/pkg,}/etc/xdg)
+    xdg_config_dirs=${xdg_config_dirs:#}
+    export XDG_CONFIG_DIRS
+
+    if [[ -v XDG_STATE_HOME ]] {
+        export XDG_STATE_HOME
+    } elif [[ ! -e ~/.local/state ]] {
+        mkdir -m760 ~/.local/state
+    }
+
+    if [[ -v XDG_CACHE_HOME ]] {
+        export XDG_CACHE_HOME
+    } else {
+        if [[ -v _sev_tmp ]] {
+            export XDG_CACHE_HOME=$_sev_tmp/.xdg.cache
+            [[ -e $XDG_CACHE_HOME ]] || mkdir -m700 $XDG_CACHE_HOME
+        } elif [[ ! -e ~/.cache ]] {
+            mkdir -m700 ~/.cache
+        }
+    }
+
+    if [[ -v XDG_RUNTIME_DIR ]] {
+        # NOTE: this can be set by systemd or other pre-shell supervisor, and
+        #       if any services were started such as pipewire, we need to use
+        #       the existing runtime dir so that we can get any existing
+        #       program sockets or other data
+        export XDG_RUNTIME_DIR
+    } elif [[ -v TMPDIR ]] {
+        # make runtime dir in our session-specific tmpdir
+        export XDG_RUNTIME_DIR=$TMPDIR/.xdg.runtime
+        # same as in tmpdir creation, ensure dir doesn't exist
+        if [[ -h $XDG_RUNTIME_DIR ]] {
+            unlink $XDG_RUNTIME_DIR 2>/dev/null
+        } elif [[ -e $XDG_RUNTIME_DIR ]] {
+            rm -rf $XDG_RUNTIME_DIR 2>/dev/null
+        }
+        mkdir -m700 $XDG_RUNTIME_DIR 2>/dev/null
+    }
+
+    export _sev_setup_xdg=
+}
+
+### app setup & exports
+# NOTE: we set these up here since some scripts might need them
+## gpg home
+if [[ ! -v GNUPGHOME ]] {
+    export GNUPGHOME=${XDG_CONFIG_HOME:-~/.config}/gnupg
+    # move existing gnupg dir to our new home
+    if [[ -d ~/.gnupg && ! -d $GNUPGHOME ]] {
+        mv ~/.gnupg $GNUPGHOME
+    }
+}
+
+## perl local lib
+[[ ! -v PERL_LOCAL_LIB_ROOT && -v commands[perl] &&
+   -d $XDG_DATA_HOME/perl5/lib/perl5 ]] &&
+  eval $(perl -I$XDG_DATA_HOME/perl5/lib/perl5 \
+              -Mlocal::lib=$XDG_DATA_HOME/perl5 2>/dev/null)
+
 ### load zshenv site-specific
 autoload -Uz load-site-dotfile
 load-site-dotfile zshenv
 
-### source .zprofile early for non-login shells to fix issues
+### source .zprofile early for non-login shells that should be
 if [[ ! -v _sev_first_display && ( -v DISPLAY || -v WAYLAND_DISPLAY ) ]] {
     # most graphical login/session managers will spawn the user's shell as a
     # parent of all child processes for that session. however, if the parent shell
@@ -82,6 +315,6 @@ if [[ ! -v _sev_first_display && ( -v DISPLAY || -v WAYLAND_DISPLAY ) ]] {
     export _sev_first_display=
     [[ ! -o login ]] && source ${ZDOTDIR:-~}/.zprofile
 } elif [[ ${+TERMUX_VERSION} -eq 0 && ! -o login && $SHLVL -eq 1 ]] {
-    ## Termux first process isn't login shell, so source early
+    # Termux first process isn't login shell, so source early
     source ${ZDOTDIR:-~}/.zprofile
 }
index 2c04ca69043778fc7f66242bdccd959832baf2a3..2d3a672016a6e3ec2ae616e78ac7b3451313a680 100644 (file)
@@ -161,7 +161,10 @@ for k v in ${(kv)a}; do
 done
 unset a k v
 
-### abbreviation aliases
+### aliases
+## builtins
+alias rehash='_sev_setpath; rehash'
+## utils
 alias h='fc -l -25'
 alias j='jobs -l'
 alias l='ls -AF'
@@ -227,7 +230,8 @@ function up {
 }
 alias u=up
 if [[ -v commands[zoxide] ]] {
-    eval "$(zoxide init zsh)"
+    # https://github.com/ajeetdsouza/zoxide/issues/513
+    eval "${$(zoxide init zsh):s#_files -/#_cd#}"
     alias cd=z
 }
 
@@ -266,7 +270,7 @@ add-zsh-hook chpwd sev_chpwd
 ### system-specific configs and aliases
 case $OSTYPE; in
     freebsd*)
-        # colors
+        ## 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'
 
@@ -276,8 +280,8 @@ case $OSTYPE; in
 
         ## 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)
+        #      port name is different to package name
+        #      (eg. graphics/sdl20 == sdl2, devel/glib20 == glib2, etc)
         function portpkg {
             case "$1" {
             build|run)
This page took 0.085226 seconds and 4 git commands to generate.