X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=8ac9d7da20f70d85e085debcdddeb97cf1c107a1;hb=69255e617abd0d063240d11f975b2fecf94d758e;hp=0a7d730c5490ee3e8a626b0d9e57b568ac38c646;hpb=2c241ec8082ac5e826e2aaf29ff6d2eb94198c17;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 0a7d730..8ac9d7d 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 @@ -657,7 +717,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 @@ -672,10 +733,11 @@ COMPDUMPFILE=${COMPDUMPFILE:-${ZDOTDIR:-${HOME}}/.zcompdump} if zrcautoload compinit ; then typeset -a tmp zstyle -a ':grml:completion:compinit' arguments tmp - compinit -d ${COMPDUMPFILE} "${tmp[@]}" || print 'Notice: no compinit available :(' + compinit -d ${COMPDUMPFILE} "${tmp[@]}" + grml_status_feature compinit $? unset tmp else - print 'Notice: no compinit available :(' + grml_status_feature compinit 1 function compdef { } fi @@ -837,8 +899,11 @@ function grmlcomp () { _ssh_hosts=() _etc_hosts=() fi + + local localname + localname="$(uname -n)" hosts=( - $(hostname) + "${localname}" "$_ssh_config_hosts[@]" "$_ssh_hosts[@]" "$_etc_hosts[@]" @@ -1124,10 +1189,15 @@ zle -N grml-zsh-fg # run command line as user root via sudo: function sudo-command-line () { [[ -z $BUFFER ]] && zle up-history - if [[ $BUFFER != sudo\ * ]]; then - BUFFER="sudo $BUFFER" - CURSOR=$(( CURSOR+5 )) + local cmd="sudo " + if [[ ${BUFFER} == ${cmd}* ]]; then + CURSOR=$(( CURSOR-${#cmd} )) + BUFFER="${BUFFER#$cmd}" + else + BUFFER="${cmd}${BUFFER}" + CURSOR=$(( CURSOR+${#cmd} )) fi + zle reset-prompt } zle -N sudo-command-line @@ -1574,7 +1644,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 @@ -1856,7 +1932,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) @@ -2423,6 +2499,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. @@ -2430,7 +2507,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 @@ -2468,6 +2545,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 () { @@ -2492,7 +2572,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 @@ -2509,8 +2589,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 } @@ -2526,7 +2609,7 @@ function grml_cmd_to_screen_title () { function grml_control_xterm_title () { case $TERM in - (xterm*|rxvt*) + (xterm*|rxvt*|alacritty|foot) set_title "${(%):-"%n@%m:"}" "$2" ;; esac @@ -2593,6 +2676,11 @@ else alias l='command ls -l' fi +# use ip from iproute2 with color support +if ip --color=auto addr >/dev/null 2>&1; then + alias ip='command ip --color=auto' +fi + if [[ -r /proc/mdstat ]]; then alias mdstat='cat /proc/mdstat' fi @@ -2804,6 +2892,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 @@ -2928,9 +3027,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 () { @@ -2938,13 +3034,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." @@ -3201,7 +3312,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 @@ -3463,6 +3581,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 @@ -3508,6 +3636,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)) @@ -3794,6 +3932,8 @@ fi zrclocal +unfunction grml_status_feature + ## genrefcard.pl settings ### doc strings for external functions from files