X-Git-Url: http://git.grml.org/?p=grml-etc-core.git;a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=22263e23ef4e20912c8f8e13daed58ab0895c3cc;hp=22b1f1ad2413a699d4e5eb3e8d9f84fd6e4af8bd;hb=HEAD;hpb=6b946fefb2878781305176a307933ef2931c48ca diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 22b1f1a..22263e2 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -108,11 +108,75 @@ if [[ $ZSH_PROFILE_RC -gt 0 ]] ; then zmodload zsh/zprof fi +typeset -A GRML_STATUS_FEATURES + +function grml_status_feature () { + emulate -L zsh + local f=$1 + local -i success=$2 + if (( success == 0 )); then + GRML_STATUS_FEATURES[$f]=success + else + GRML_STATUS_FEATURES[$f]=failure + fi + return 0 +} + +function grml_status_features () { + emulate -L zsh + local mode=${1:-+-} + local this + if [[ $mode == -h ]] || [[ $mode == --help ]]; then + cat <* ]] && return 0 + return 1 +} + function is4 () { [[ $ZSH_VERSION == <4->* ]] && return 0 return 1 @@ -368,10 +432,6 @@ is4 && setopt share_history # save each command's beginning timestamp and the duration to the history file setopt extended_history -# If a new command line being added to the history list duplicates an older -# one, the older command is removed from the list -is4 && setopt histignorealldups - # remove command lines from the history list when the first character on the # line is a space setopt histignorespace @@ -421,6 +481,7 @@ setopt unset # setting some default values NOCOR=${NOCOR:-0} +NOETCHOSTS=${NOETCHOSTS:-0} NOMENU=${NOMENU:-0} NOPRECMD=${NOPRECMD:-0} COMMAND_NOT_FOUND=${COMMAND_NOT_FOUND:-0} @@ -431,11 +492,22 @@ ZSH_NO_DEFAULT_LOCALE=${ZSH_NO_DEFAULT_LOCALE:-0} typeset -ga ls_options typeset -ga grep_options + +# Colors on GNU ls(1) if ls --color=auto / >/dev/null 2>&1; then ls_options+=( --color=auto ) +# Colors on FreeBSD and OSX ls(1) elif ls -G / >/dev/null 2>&1; then ls_options+=( -G ) fi + +# Natural sorting order on GNU ls(1) +# OSX and IllumOS have a -v option that is not natural sorting +if ls --version |& grep -q 'GNU' >/dev/null 2>&1 && ls -v / >/dev/null 2>&1; then + ls_options+=( -v ) +fi + +# Color on GNU and FreeBSD grep(1) if grep --color=auto -q "a" <<< "a" >/dev/null 2>&1; then grep_options+=( --color=auto ) fi @@ -615,13 +687,11 @@ isdarwin && xsource /sw/bin/init.sh # load our function and completion directories for fdir in /usr/share/grml/zsh/completion /usr/share/grml/zsh/functions; do fpath=( ${fdir} ${fdir}/**/*(/N) ${fpath} ) - if [[ ${fdir} == '/usr/share/grml/zsh/functions' ]] ; then - for func in ${fdir}/**/[^_]*[^~](N.) ; do - zrcautoload ${func:t} - done - fi done -unset fdir func +typeset -aU ffiles +ffiles=(/usr/share/grml/zsh/functions/**/[^_]*[^~](N.:t)) +(( ${#ffiles} > 0 )) && autoload -U "${ffiles[@]}" +unset -v fdir ffiles # support colors in less export LESS_TERMCAP_mb=$'\E[01;31m' @@ -648,7 +718,8 @@ typeset -U path PATH cdpath CDPATH fpath FPATH manpath MANPATH # Load a few modules is4 && \ for mod in parameter complist deltochar mathfunc ; do - zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :(" + zmodload -i zsh/${mod} 2>/dev/null + grml_status_feature mod:$mod $? done && builtin unset -v mod # autoload zsh modules when they are referenced @@ -661,9 +732,13 @@ fi # completion system COMPDUMPFILE=${COMPDUMPFILE:-${ZDOTDIR:-${HOME}}/.zcompdump} if zrcautoload compinit ; then - compinit -d ${COMPDUMPFILE} || print 'Notice: no compinit available :(' + typeset -a tmp + zstyle -a ':grml:completion:compinit' arguments tmp + compinit -d ${COMPDUMPFILE} "${tmp[@]}" + grml_status_feature compinit $? + unset tmp else - print 'Notice: no compinit available :(' + grml_status_feature compinit 1 function compdef { } fi @@ -816,17 +891,27 @@ function grmlcomp () { fi # host completion + _etc_hosts=() + _ssh_config_hosts=() + _ssh_hosts=() if is42 ; then - [[ -r ~/.ssh/config ]] && _ssh_config_hosts=(${${(s: :)${(ps:\t:)${${(@M)${(f)"$(<$HOME/.ssh/config)"}:#Host *}#Host }}}:#*[*?]*}) || _ssh_config_hosts=() - [[ -r ~/.ssh/known_hosts ]] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=() - [[ -r /etc/hosts ]] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(@']="set MARK" @@ -1210,7 +1300,7 @@ function help_zle_parse_keybindings () { help_zle_keybindings['']="repeat next cmd/char times (-10a -> -10 times 'a')" help_zle_keybindings['u']="make next word Uppercase" help_zle_keybindings['l']="make next word lowercase" - help_zle_keybindings['xd']="preview expansion under cursor" + help_zle_keybindings['xG']="preview expansion under cursor" help_zle_keybindings['q']="push current CL into background, freeing it. Restore on next CL" help_zle_keybindings['.']="insert (and interate through) last word from prev CLs" help_zle_keybindings[',']="complete word from newer history (consecutive hits)" @@ -1241,7 +1331,7 @@ function help_zle_parse_keybindings () { # ignores lines that are commentend out # grabs first in '' or "" enclosed string with length between 1 and 6 characters elif [[ "$cline" == [^#]#(bind2maps[[:space:]](*)-s|bindkey|compdef -k)[[:space:]](*)(#b)(\"((?)(#c1,6))\"|\'((?)(#c1,6))\')(#B)(*) ]]; then - #description prevously found ? description not more than 2 lines away ? keybinding not empty ? + #description previously found ? description not more than 2 lines away ? keybinding not empty ? if [[ -n $lastkeybind_desc && $num_lines_elapsed -lt 2 && -n $match[1] ]]; then #substitute keybinding string with something readable k=${${${${${${${match[1]/\\e\^h/}/\\e\^\?/}/\\e\[5~/}/\\e\[6~/}//(\\e|\^\[)/}//\^/}/3~/} @@ -1291,7 +1381,6 @@ zle -N help-zle ## complete word from currently visible Screen or Tmux buffer. if check_com -c screen || check_com -c tmux; then function _complete_screen_display () { - [[ "$TERM" != "screen" ]] && return 1 local TMPFILE=$(mktemp) local -U -a _screen_display_wordlist @@ -1302,8 +1391,9 @@ if check_com -c screen || check_com -c tmux; then #works, but crashes tmux below version 1.4 #luckily tmux -V option to ask for version, was also added in 1.4 tmux -V &>/dev/null || return - tmux -q capture-pane \; save-buffer -b 0 $TMPFILE \; delete-buffer -b 0 + tmux -q capture-pane -b 0 \; save-buffer -b 0 $TMPFILE \; delete-buffer -b 0 else + [[ "$TERM" != "screen" ]] && return screen -X hardcopy $TMPFILE # screen sucks, it dumps in latin1, apparently always. so recode it # to system charset @@ -1479,7 +1569,7 @@ bind2maps emacs viins -- -s ' ' magic-space #k# Trigger menu-complete bind2maps emacs viins -- -s '\ei' menu-complete # menu completion via esc-i #k# Insert a timestamp on the command line (yyyy-mm-dd) -bind2maps emacs viins -- -s '^ed' insert-datestamp +bind2maps emacs viins -- -s '^xd' insert-datestamp #k# Insert last typed word bind2maps emacs viins -- -s "\em" insert-last-typed-word #k# A smart shortcut for \kbd{fg} @@ -1562,7 +1652,13 @@ zrcautoload zed # else # print 'Notice: no url-quote-magic available :(' # fi -alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic' +if is51 ; then + # url-quote doesn't work without bracketed-paste-magic since Zsh 5.1 + alias url-quote='autoload -U bracketed-paste-magic url-quote-magic; + zle -N bracketed-paste bracketed-paste-magic; zle -N self-insert url-quote-magic' +else + alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic' +fi #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line alias run-help >&/dev/null && unalias run-help @@ -1584,7 +1680,7 @@ function command_not_found_handler () { # history #v# -HISTFILE=${ZDOTDIR:-${HOME}}/.zsh_history +HISTFILE=${HISTFILE:-${ZDOTDIR:-${HOME}}/.zsh_history} isgrmlcd && HISTSIZE=500 || HISTSIZE=5000 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history @@ -1844,7 +1940,7 @@ done function batterydarwin () { GRML_BATTERY_LEVEL='' local -a table -table=( ${$(pmset -g ps)[(w)7,8]%%(\%|);} ) +table=( ${$(pmset -g ps)[(w)8,9]%%(\%|);} ) if [[ -n $table[2] ]] ; then case $table[2] in charging) @@ -2003,6 +2099,19 @@ function prompt_grml_help () { accordingly. Default (left): rc change-root user at host path vcs percent; Default (right): sad-smiley + - strip-sensitive-characters (boolean): If the \`prompt_subst' option + is active in zsh, the shell performs lots of expansions on prompt + variable strings, including command substitution. So if you don't + control where some of your prompt strings is coming from, this is + an exploitable weakness. Grml's zsh setup does not set this option + and it is off in the shell in zsh-mode by default. If it *is* turned + on however, this style becomes active, and there are two flavours of + it: On per default is a global variant in the '*:setup' context. This + strips characters after the whole prompt string was constructed. There + is a second variant in the '*:items:', that is off by default. + It allows fine grained control over which items' data is stripped. + The characters that are stripped are: \$ and \`. + Available styles in 'items:' are: pre, post. These are strings that are inserted before (pre) and after (post) the item in question. Thus, the following would cause the user name to be printed in red instead of the @@ -2052,7 +2161,7 @@ function grml_prompt_setup () { autoload -Uz vcs_info # The following autoload is disabled for now, since this setup includes a # static version of the ‘add-zsh-hook’ function above. It needs to be - # reenabled as soon as that static definition is removed again. + # re-enabled as soon as that static definition is removed again. #autoload -Uz add-zsh-hook add-zsh-hook precmd prompt_$1_precmd } @@ -2244,6 +2353,7 @@ grml_theme_add_token: Token `%s'\'' exists! Giving up!\n\n' $name return 2 fi if (( init )); then + REPLY='' $token $name token=$REPLY fi @@ -2257,7 +2367,7 @@ grml_theme_add_token: Token `%s'\'' exists! Giving up!\n\n' $name fi } -function grml_typeset_and_wrap () { +function grml_wrap_reply () { emulate -L zsh local target="$1" local new="$2" @@ -2265,14 +2375,16 @@ function grml_typeset_and_wrap () { local right="$4" if (( ${+parameters[$new]} )); then - typeset -g "${target}=${(P)target}${left}${(P)new}${right}" + REPLY="${left}${(P)new}${right}" + else + REPLY='' fi } function grml_prompt_addto () { emulate -L zsh local target="$1" - local lr it apre apost new v + local lr it apre apost new v REPLY local -a items shift @@ -2286,21 +2398,22 @@ function grml_prompt_addto () { || apost=${grml_prompt_post_default[$it]} zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" token new \ || new=${grml_prompt_token_default[$it]} - typeset -g "${target}=${(P)target}${apre}" if (( ${+grml_prompt_token_function[$it]} )); then + REPLY='' ${grml_prompt_token_function[$it]} $it - typeset -g "${target}=${(P)target}${REPLY}" else case $it in battery) - grml_typeset_and_wrap $target $new '' '' + grml_wrap_reply $target $new '' '' ;; change-root) - grml_typeset_and_wrap $target $new '(' ')' + grml_wrap_reply $target $new '(' ')' ;; grml-chroot) if [[ -n ${(P)new} ]]; then - typeset -g "${target}=${(P)target}(CHROOT)" + REPLY="$CHROOT" + else + REPLY='' fi ;; vcs) @@ -2310,14 +2423,33 @@ function grml_prompt_addto () { vcscalled=1 fi if (( ${+parameters[$v]} )) && [[ -n "${(P)v}" ]]; then - typeset -g "${target}=${(P)target}${(P)v}" + REPLY="${(P)v}" + else + REPLY='' fi ;; - *) typeset -g "${target}=${(P)target}${new}" ;; + *) REPLY="$new" ;; esac fi - typeset -g "${target}=${(P)target}${apost}" + # Strip volatile characters per item. This is off by default. See the + # global stripping code a few lines below for details. + if [[ -o prompt_subst ]] && zstyle -t ":prompt:${grmltheme}:${lr}:items:$it" \ + strip-sensitive-characters + then + REPLY="${REPLY//[$\`]/}" + fi + typeset -g "${target}=${(P)target}${apre}${REPLY}${apost}" done + + # Per default, strip volatile characters (in the prompt_subst case) + # globally. If the option is off, the style has no effect. For more + # control, this can be turned off and stripping can be configured on a + # per-item basis (see above). + if [[ -o prompt_subst ]] && zstyle -T ":prompt:${grmltheme}:${lr}:setup" \ + strip-sensitive-characters + then + typeset -g "${target}=${${(P)target}//[$\`]/}" + fi } function prompt_grml_precmd () { @@ -2375,6 +2507,7 @@ function grml_prompt_fallback () { } if zrcautoload promptinit && promptinit 2>/dev/null ; then + grml_status_feature promptinit 0 # Since we define the required functions in here and not in files in # $fpath, we need to stick the theme's name into `$prompt_themes' # ourselves, since promptinit does not pick them up otherwise. @@ -2382,7 +2515,7 @@ if zrcautoload promptinit && promptinit 2>/dev/null ; then # Also, keep the array sorted... prompt_themes=( "${(@on)prompt_themes}" ) else - print 'Notice: no promptinit available :(' + grml_status_feature promptinit 1 grml_prompt_fallback function precmd () { (( ${+functions[vcs_info]} )) && vcs_info; } fi @@ -2420,6 +2553,9 @@ else function precmd () { (( ${+functions[vcs_info]} )) && vcs_info; } fi +# make sure to use right prompt only when not running a command +is41 && setopt transient_rprompt + # Terminal-title wizardry function ESC_print () { @@ -2444,7 +2580,7 @@ function grml_reset_screen_title () { # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html [[ ${NOTITLE:-} -gt 0 ]] && return 0 case $TERM in - (xterm*|rxvt*) + (xterm*|rxvt*|alacritty|foot) set_title ${(%):-"%n@%m: %~"} ;; esac @@ -2461,8 +2597,11 @@ function grml_vcs_to_screen_title () { } function grml_maintain_name () { - # set hostname if not running on host with name 'grml' - if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != $(hostname) ]] ; then + local localname + localname="$(uname -n)" + + # set hostname if not running on local machine + if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != "${localname}" ]] ; then NAME="@$HOSTNAME" fi } @@ -2478,15 +2617,15 @@ function grml_cmd_to_screen_title () { function grml_control_xterm_title () { case $TERM in - (xterm*|rxvt*) - set_title "${(%):-"%n@%m:"}" "$1" + (xterm*|rxvt*|alacritty|foot) + set_title "${(%):-"%n@%m:"}" "$2" ;; esac } # The following autoload is disabled for now, since this setup includes a # static version of the ‘add-zsh-hook’ function above. It needs to be -# reenabled as soon as that static definition is removed again. +# re-enabled as soon as that static definition is removed again. #zrcautoload add-zsh-hook || add-zsh-hook () { :; } if [[ $NOPRECMD -eq 0 ]]; then add-zsh-hook precmd grml_reset_screen_title @@ -2545,6 +2684,11 @@ else alias l='command ls -l' fi +# use ip from iproute2 with color support +if ip -color=auto addr show dev lo >/dev/null 2>&1; then + alias ip='command ip -color=auto' +fi + if [[ -r /proc/mdstat ]]; then alias mdstat='cat /proc/mdstat' fi @@ -2659,22 +2803,31 @@ Enjoy your grml system with the zsh!$reset_color" # debian stuff if [[ -r /etc/debian_version ]] ; then if [[ -z "$GRML_NO_APT_ALIASES" ]]; then - #a3# Execute \kbd{apt-cache search} - alias acs='apt-cache search' - #a3# Execute \kbd{apt-cache show} - alias acsh='apt-cache show' #a3# Execute \kbd{apt-cache policy} alias acp='apt-cache policy' - #a3# Execute \kbd{apt-get dist-upgrade} - salias adg="apt-get dist-upgrade" - #a3# Execute \kbd{apt-get install} - salias agi="apt-get install" + if check_com -c apt ; then + #a3# Execute \kbd{apt search} + alias acs='apt search' + #a3# Execute \kbd{apt show} + alias acsh='apt show' + #a3# Execute \kbd{apt dist-upgrade} + salias adg="apt dist-upgrade" + #a3# Execute \kbd{apt upgrade} + salias ag="apt upgrade" + #a3# Execute \kbd{apt install} + salias agi="apt install" + #a3# Execute \kbd{apt update} + salias au="apt update" + else + alias acs='apt-cache search' + alias acsh='apt-cache show' + salias adg="apt-get dist-upgrade" + salias ag="apt-get upgrade" + salias agi="apt-get install" + salias au="apt-get update" + fi #a3# Execute \kbd{aptitude install} salias ati="aptitude install" - #a3# Execute \kbd{apt-get upgrade} - salias ag="apt-get upgrade" - #a3# Execute \kbd{apt-get update} - salias au="apt-get update" #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade} salias -a up="aptitude update ; aptitude safe-upgrade" #a3# Execute \kbd{dpkg-buildpackage} @@ -2695,7 +2848,7 @@ if [ -e /var/log/syslog ] ; then #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog || journalctl} salias llog="$PAGER /var/log/syslog" # take a look at the syslog #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog || journalctl} - salias tlog="tail -f /var/log/syslog" # follow the syslog + salias tlog="tail --follow=name /var/log/syslog" # follow the syslog elif check_com -c journalctl ; then salias llog="journalctl" salias tlog="journalctl -f" @@ -2747,6 +2900,17 @@ graphic chipset." return 1 } fi + + if check_com -c tmate && check_com -c qrencode ; then + function grml-remote-support() { + tmate -L grml-remote-support new -s grml-remote-support -d + tmate -L grml-remote-support wait tmate-ready + tmate -L grml-remote-support display -p '#{tmate_ssh}' | qrencode -t ANSI + echo "tmate session: $(tmate -L grml-remote-support display -p '#{tmate_ssh}')" + echo + echo "Scan this QR code and send it to your support team." + } + fi } # now run the functions @@ -2805,7 +2969,7 @@ compdef _functions freload # Module zstat is loaded by default in grml zshrc, no extra action needed for that. # # Known bugs: -# If you happen to come accross a symlink that points to a destination on an other partition +# If you happen to come across a symlink that points to a destination on another partition # with the same inode number, that will be marked as symlink loop though it is not. # Two hints for this situation: # I) Play lottery the same day, as you seem to be rather lucky right now. @@ -2871,9 +3035,6 @@ function sll () { return ${RTN} } -# TODO: Is it supported to use pager settings like this? -# PAGER='less -Mr' - If so, the use of $PAGER here needs fixing -# with respect to wordsplitting. (ie. ${=PAGER}) if check_com -c $PAGER ; then #f3# View Debian's changelog of given package(s) function dchange () { @@ -2881,13 +3042,28 @@ if check_com -c $PAGER ; then [[ -z "$1" ]] && printf 'Usage: %s \n' "$0" && return 1 local package + + # `less` as $PAGER without e.g. `|lesspipe %s` inside $LESSOPEN can't properly + # read *.gz files, try to detect this to use vi instead iff available + local viewer + + if [[ ${$(typeset -p PAGER)[2]} = -a ]] ; then + viewer=($PAGER) # support PAGER=(less -Mr) but leave array untouched + else + viewer=(${=PAGER}) # support PAGER='less -Mr' + fi + + if [[ ${viewer[1]:t} = less ]] && [[ -z "${LESSOPEN}" ]] && check_com vi ; then + viewer='vi' + fi + for package in "$@" ; do if [[ -r /usr/share/doc/${package}/changelog.Debian.gz ]] ; then - $PAGER /usr/share/doc/${package}/changelog.Debian.gz + $viewer /usr/share/doc/${package}/changelog.Debian.gz elif [[ -r /usr/share/doc/${package}/changelog.gz ]] ; then - $PAGER /usr/share/doc/${package}/changelog.gz + $viewer /usr/share/doc/${package}/changelog.gz elif [[ -r /usr/share/doc/${package}/changelog ]] ; then - $PAGER /usr/share/doc/${package}/changelog + $viewer /usr/share/doc/${package}/changelog else if check_com -c aptitude ; then echo "No changelog for package $package found, using aptitude to retrieve it." @@ -3144,7 +3320,14 @@ zrcautoload lookupinit && lookupinit # variables # set terminal property (used e.g. by msgid-chooser) -export COLORTERM="yes" +case "${COLORTERM}" in + truecolor) + # do not overwrite + ;; + *) + export COLORTERM="yes" + ;; +esac # aliases @@ -3216,7 +3399,7 @@ fi #f5# Backup \kbd{file_or_folder {\rm to} file_or_folder\_timestamp} function bk () { emulate -L zsh - local current_date=$(date -u "+%Y-%m-%dT%H:%M:%SZ") + local current_date=$(date -u "+%Y%m%dT%H%M%SZ") local clean keep move verbose result all to_bk setopt extended_glob keep=1 @@ -3273,14 +3456,14 @@ return 0;; elif (( clean > 0 )); then if (( $# > 0 )); then for to_bk in "$@"; do - rm $verbose -rf "${to_bk%/}"_[0-9](#c4,)-(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3])(:[0-5][0-9])(#c2)Z + rm $verbose -rf "${to_bk%/}"_[0-9](#c8)T([0-1][0-9]|2[0-3])([0-5][0-9])(#c2)Z (( result += $? )) done else if (( all > 0 )); then - rm $verbose -rf *_[0-9](#c4,)-(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3])(:[0-5][0-9])(#c2)Z(D) + rm $verbose -rf *_[0-9](#c8)T([0-1][0-9]|2[0-3])([0-5][0-9])(#c2)Z(D) else - rm $verbose -rf *_[0-9](#c4,)-(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3])(:[0-5][0-9])(#c2)Z + rm $verbose -rf *_[0-9](#c8)T([0-1][0-9]|2[0-3])([0-5][0-9])(#c2)Z fi (( result += $? )) fi @@ -3288,7 +3471,7 @@ return 0;; return $result } -#f5# cd to directoy and list files +#f5# cd to directory and list files function cl () { emulate -L zsh cd $1 && ls -a @@ -3305,7 +3488,7 @@ function cd () { fi } -#f5# Create Directoy and \kbd{cd} to it +#f5# Create Directory and \kbd{cd} to it function mkcd () { if (( ARGC != 1 )); then printf 'usage: mkcd \n' @@ -3406,6 +3589,16 @@ function simple-extract () { USES_STDIN=true USES_STDOUT=false ;; + *tar.zst) + DECOMP_CMD="tar --zstd -xvf -" + USES_STDIN=true + USES_STDOUT=false + ;; + *tar.lrz) + DECOMP_CMD="lrzuntar" + USES_STDIN=false + USES_STDOUT=false + ;; *tar) DECOMP_CMD="tar -xvf -" USES_STDIN=true @@ -3451,6 +3644,16 @@ function simple-extract () { USES_STDIN=true USES_STDOUT=true ;; + *zst) + DECOMP_CMD="zstd -d -c -" + USES_STDIN=true + USES_STDOUT=true + ;; + *lrz) + DECOMP_CMD="lrunzip -" + USES_STDIN=true + USES_STDOUT=true + ;; *) print "ERROR: '$ARCHIVE' has unrecognized archive type." >&2 RC=$((RC+1)) @@ -3678,7 +3881,10 @@ if check_com -c hg ; then fi # end of check whether we have the 'hg'-executable -# grml-small cleanups +# disable bracketed paste mode for dumb terminals +[[ "$TERM" == dumb ]] && unset zle_bracketed_paste + +# grml-small cleanups and workarounds # The following is used to remove zsh-config-items that do not work # in grml-small by default. @@ -3688,7 +3894,9 @@ fi # end of check whether we have the 'hg'-executable if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then - unset abk[V] + # Clean up + + unset "abk[V]" unalias 'V' &> /dev/null unfunction vman &> /dev/null unfunction viless &> /dev/null @@ -3698,10 +3906,42 @@ if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then unfunction manzsh &> /dev/null unfunction man2 &> /dev/null + # Workarounds + + # See https://github.com/grml/grml/issues/56 + if ! [[ -x ${commands[dig]} ]]; then + function dig_after_all () { + unfunction dig + unfunction _dig + autoload -Uz _dig + unfunction dig_after_all + } + function dig () { + if [[ -x ${commands[dig]} ]]; then + dig_after_all + command dig "$@" + return "$!" + fi + printf 'This installation does not include `dig'\'' for size reasons.\n' + printf 'Try `drill'\'' as a light weight alternative.\n' + return 0 + } + function _dig () { + if [[ -x ${commands[dig]} ]]; then + dig_after_all + zle -M 'Found `dig'\'' installed. ' + else + zle -M 'Try `drill'\'' instead of `dig'\''.' + fi + } + compdef _dig dig + fi fi zrclocal +unfunction grml_status_feature + ## genrefcard.pl settings ### doc strings for external functions from files