summaryrefslogtreecommitdiff
path: root/plugins/z/z.plugin.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/z/z.plugin.zsh')
-rw-r--r--plugins/z/z.plugin.zsh62
1 files changed, 42 insertions, 20 deletions
diff --git a/plugins/z/z.plugin.zsh b/plugins/z/z.plugin.zsh
index 60a630624..39b832292 100644
--- a/plugins/z/z.plugin.zsh
+++ b/plugins/z/z.plugin.zsh
@@ -4,7 +4,7 @@
#
# https://github.com/agkozak/zsh-z
#
-# Copyright (c) 2018-2023 Alexandros Kozak
+# Copyright (c) 2018-2025 Alexandros Kozak
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -100,20 +100,29 @@ With no ARGUMENT, list the directory history in ascending rank.
}
# Load zsh/datetime module, if necessary
-(( $+EPOCHSECONDS )) || zmodload zsh/datetime
-
-# Load zsh/files, if necessary
-[[ ${builtins[zf_chown]} == 'defined' &&
- ${builtins[zf_mv]} == 'defined' &&
- ${builtins[zf_rm]} == 'defined' ]] ||
- zmodload -F zsh/files b:zf_chown b:zf_mv b:zf_rm
-
-# Load zsh/system, if necessary
-[[ ${modules[zsh/system]} == 'loaded' ]] || zmodload zsh/system &> /dev/null
+(( ${+EPOCHSECONDS} )) || zmodload zsh/datetime
# Global associative array for internal use
typeset -gA ZSHZ
+# Fallback utilities in case Zsh lacks zsh/files (as is the case with MobaXterm)
+ZSHZ[CHOWN]='chown'
+ZSHZ[MV]='mv'
+ZSHZ[RM]='rm'
+# Try to load zsh/files utilities
+if [[ ${builtins[zf_chown]-} != 'defined' ||
+ ${builtins[zf_mv]-} != 'defined' ||
+ ${builtins[zf_rm]-} != 'defined' ]]; then
+ zmodload -F zsh/files b:zf_chown b:zf_mv b:zf_rm &> /dev/null
+fi
+# Use zsh/files, if it is available
+[[ ${builtins[zf_chown]-} == 'defined' ]] && ZSHZ[CHOWN]='zf_chown'
+[[ ${builtins[zf_mv]-} == 'defined' ]] && ZSHZ[MV]='zf_mv'
+[[ ${builtins[zf_rm]-} == 'defined' ]] && ZSHZ[RM]='zf_rm'
+
+# Load zsh/system, if necessary
+[[ ${modules[zsh/system]-} == 'loaded' ]] || zmodload zsh/system &> /dev/null
+
# Make sure ZSHZ_EXCLUDE_DIRS has been declared so that other scripts can
# simply append to it
(( ${+ZSHZ_EXCLUDE_DIRS} )) || typeset -gUa ZSHZ_EXCLUDE_DIRS
@@ -145,7 +154,7 @@ is-at-least 5.3.0 && ZSHZ[PRINTV]=1
zshz() {
# Don't use `emulate -L zsh' - it breaks PUSHD_IGNORE_DUPS
- setopt LOCAL_OPTIONS NO_KSH_ARRAYS NO_SH_WORD_SPLIT EXTENDED_GLOB
+ setopt LOCAL_OPTIONS NO_KSH_ARRAYS NO_SH_WORD_SPLIT EXTENDED_GLOB UNSET
(( ZSHZ_DEBUG )) && setopt LOCAL_OPTIONS WARN_CREATE_GLOBAL
local REPLY
@@ -277,7 +286,7 @@ zshz() {
if (( ret != 0 )); then
# Avoid clobbering the datafile if the write to tempfile failed
- zf_rm -f "$tempfile"
+ ${ZSHZ[RM]} -f "$tempfile"
return $ret
fi
@@ -285,16 +294,26 @@ zshz() {
owner=${ZSHZ_OWNER:-${_Z_OWNER}}
if (( ZSHZ[USE_FLOCK] )); then
- zf_mv "$tempfile" "$datafile" 2> /dev/null || zf_rm -f "$tempfile"
+ # An unsual case: if inside Docker container where datafile could be bind
+ # mounted
+ if [[ -r '/proc/1/cgroup' && "$(< '/proc/1/cgroup')" == *docker* ]]; then
+ print "$(< "$tempfile")" > "$datafile" 2> /dev/null
+ ${ZSHZ[RM]} -f "$tempfile"
+ # All other cases
+ else
+ ${ZSHZ[MV]} "$tempfile" "$datafile" 2> /dev/null ||
+ ${ZSHZ[RM]} -f "$tempfile"
+ fi
if [[ -n $owner ]]; then
- zf_chown ${owner}:"$(id -ng ${owner})" "$datafile"
+ ${ZSHZ[CHOWN]} ${owner}:"$(id -ng ${owner})" "$datafile"
fi
else
if [[ -n $owner ]]; then
- zf_chown "${owner}":"$(id -ng "${owner}")" "$tempfile"
+ ${ZSHZ[CHOWN]} "${owner}":"$(id -ng "${owner}")" "$tempfile"
fi
- zf_mv -f "$tempfile" "$datafile" 2> /dev/null || zf_rm -f "$tempfile"
+ ${ZSHZ[MV]} -f "$tempfile" "$datafile" 2> /dev/null ||
+ ${ZSHZ[RM]} -f "$tempfile"
fi
# In order to make z -x work, we have to disable zsh-z's adding
@@ -306,7 +325,7 @@ zshz() {
}
############################################################
- # Read the curent datafile contents, update them, "age" them
+ # Read the current datafile contents, update them, "age" them
# when the total rank gets high enough, and print the new
# contents to STDOUT.
#
@@ -884,6 +903,9 @@ alias ${ZSHZ_CMD:-${_Z_CMD:-z}}='zshz 2>&1'
# ZSHZ
############################################################
_zshz_precmd() {
+ # Protect against `setopt NO_UNSET'
+ setopt LOCAL_OPTIONS UNSET
+
# Do not add PWD to datafile when in HOME directory, or
# if `z -x' has just been run
[[ $PWD == "$HOME" ]] || (( ZSHZ[DIRECTORY_REMOVED] )) && return
@@ -931,7 +953,7 @@ add-zsh-hook chpwd _zshz_chpwd
# Completion
############################################################
-# Standarized $0 handling
+# Standardized $0 handling
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
@@ -958,7 +980,7 @@ ZSHZ[FUNCTIONS]='_zshz_usage
# Enable WARN_NESTED_VAR for functions listed in
# ZSHZ[FUNCTIONS]
############################################################
-(( ZSHZ_DEBUG )) && () {
+(( ${+ZSHZ_DEBUG} )) && () {
if is-at-least 5.4.0; then
local x
for x in ${=ZSHZ[FUNCTIONS]}; do