X-Git-Url: http://git.grml.org/?p=grml-etc-core.git;a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=96869cc07a73ea7468c68353a22127778f621cc6;hp=a09361cde054c29544c71112c6e22eafeb5bf2f8;hb=a5eb2feca052396d5b923979118f68f626ac9d69;hpb=1fa194ecab5c43405e800d81f1f6ba5e1fa68049 diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index a09361c..96869cc 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -113,97 +113,97 @@ fi # check for version/system # check for versions (compatibility reasons) -is4(){ +function is4 () { [[ $ZSH_VERSION == <4->* ]] && return 0 return 1 } -is41(){ +function is41 () { [[ $ZSH_VERSION == 4.<1->* || $ZSH_VERSION == <5->* ]] && return 0 return 1 } -is42(){ +function is42 () { [[ $ZSH_VERSION == 4.<2->* || $ZSH_VERSION == <5->* ]] && return 0 return 1 } -is425(){ +function is425 () { [[ $ZSH_VERSION == 4.2.<5->* || $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0 return 1 } -is43(){ +function is43 () { [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0 return 1 } -is433(){ +function is433 () { [[ $ZSH_VERSION == 4.3.<3->* || $ZSH_VERSION == 4.<4->* \ || $ZSH_VERSION == <5->* ]] && return 0 return 1 } -is437(){ +function is437 () { [[ $ZSH_VERSION == 4.3.<7->* || $ZSH_VERSION == 4.<4->* \ || $ZSH_VERSION == <5->* ]] && return 0 return 1 } -is439(){ +function is439 () { [[ $ZSH_VERSION == 4.3.<9->* || $ZSH_VERSION == 4.<4->* \ || $ZSH_VERSION == <5->* ]] && return 0 return 1 } #f1# Checks whether or not you're running grml -isgrml(){ +function isgrml () { [[ -f /etc/grml_version ]] && return 0 return 1 } #f1# Checks whether or not you're running a grml cd -isgrmlcd(){ +function isgrmlcd () { [[ -f /etc/grml_cd ]] && return 0 return 1 } if isgrml ; then #f1# Checks whether or not you're running grml-small - isgrmlsmall() { + function isgrmlsmall () { if [[ ${${${(f)"$( autologin # Thanks go to Bart Schaefer! -isgrml && checkhome() { +isgrml && function checkhome () { if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then export ALREADY_DID_CD_HOME=$HOME cd @@ -247,13 +247,13 @@ if ! [[ ${ZSH_VERSION} == 3.1.<7->* \ printf '-!- Ye been warned!\n' printf '-!-\n' - function zstyle() { : } + function zstyle () { : } fi # autoload wrapper - use this one instead of autoload directly # We need to define this function as early as this, because autoloading # 'is-at-least()' needs it. -function zrcautoload() { +function zrcautoload () { emulate -L zsh setopt extended_glob local fdir ffile @@ -281,7 +281,7 @@ function zrcautoload() { # with just a few adjustments in coding style to make the function look more # compact. This definition can be removed as soon as we raise the minimum # version requirement to 4.3.7 or newer. -function add-zsh-hook() { +function add-zsh-hook () { # Add to HOOK the given FUNCTION. # HOOK is one of chpwd, precmd, preexec, periodic, zshaddhistory, # zshexit, zsh_directory_name (the _functions subscript is not required). @@ -354,7 +354,7 @@ function add-zsh-hook() { # Load is-at-least() for more precise version checks Note that this test will # *always* fail, if the is-at-least function could not be marked for # autoloading. -zrcautoload is-at-least || is-at-least() { return 1 } +zrcautoload is-at-least || function is-at-least () { return 1 } # set some important options (as early as possible) @@ -458,39 +458,38 @@ fi # Usage: check_com [-c|-g] word # -c only checks for external commands # -g does the usual tests and also checks for global aliases -check_com() { +function check_com () { emulate -L zsh local -i comonly gatoo + comonly=0 + gatoo=0 if [[ $1 == '-c' ]] ; then - (( comonly = 1 )) - shift + comonly=1 + shift 1 elif [[ $1 == '-g' ]] ; then - (( gatoo = 1 )) - else - (( comonly = 0 )) - (( gatoo = 0 )) + gatoo=1 + shift 1 fi if (( ${#argv} != 1 )) ; then - printf 'usage: check_com [-c] \n' >&2 + printf 'usage: check_com [-c|-g] \n' >&2 return 1 fi if (( comonly > 0 )) ; then - [[ -n ${commands[$1]} ]] && return 0 + (( ${+commands[$1]} )) && return 0 return 1 fi - if [[ -n ${commands[$1]} ]] \ - || [[ -n ${functions[$1]} ]] \ - || [[ -n ${aliases[$1]} ]] \ - || [[ -n ${reswords[(r)$1]} ]] ; then - + if (( ${+commands[$1]} )) \ + || (( ${+functions[$1]} )) \ + || (( ${+aliases[$1]} )) \ + || (( ${+reswords[(r)$1]} )) ; then return 0 fi - if (( gatoo > 0 )) && [[ -n ${galiases[$1]} ]] ; then + if (( gatoo > 0 )) && (( ${+galiases[$1]} )) ; then return 0 fi @@ -499,7 +498,7 @@ check_com() { # creates an alias and precedes the command with # sudo if $EUID is not zero. -salias() { +function salias () { emulate -L zsh local only=0 ; local multi=0 local key val @@ -537,7 +536,7 @@ salias() { } # Check if we can read given files and source those we can. -xsource() { +function xsource () { if (( ${#argv} < 1 )) ; then printf 'usage: xsource FILE(s)...\n' >&2 return 1 @@ -551,7 +550,7 @@ xsource() { } # Check if we can read a given file and 'cat(1)' it. -xcat() { +function xcat () { emulate -L zsh if (( ${#argv} != 1 )) ; then printf 'usage: xcat FILE\n' >&2 @@ -564,7 +563,7 @@ xcat() { # Remove these functions again, they are of use only in these # setup files. This should be called at the end of .zshrc. -xunfunction() { +function xunfunction () { emulate -L zsh local -a funcs local func @@ -578,7 +577,7 @@ xunfunction() { # this allows us to stay in sync with grml's zshrc and put own # modifications in ~/.zshrc.local -zrclocal() { +function zrclocal () { xsource "/etc/zsh/zshrc.local" xsource "${ZDOTDIR:-${HOME}}/.zshrc.local" return 0 @@ -627,13 +626,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' @@ -655,7 +652,7 @@ REPORTTIME=5 watch=(notme root) # automatically remove duplicates from these arrays -typeset -U path cdpath fpath manpath +typeset -U path PATH cdpath CDPATH fpath FPATH manpath MANPATH # Load a few modules is4 && \ @@ -684,7 +681,7 @@ fi # called later (via is4 && grmlcomp) # note: use 'zstyle' for getting current settings # press ^xh (control-x h) for getting tags in context; ^x? (control-x ?) to run complete_debug with trace output -grmlcomp() { +function grmlcomp () { # TODO: This could use some additional information # Make sure the completion system is initialised @@ -787,7 +784,7 @@ grmlcomp() { zstyle ':completion:*' special-dirs .. # run rehash on completion so new installed program are found automatically: - _force_rehash() { + function _force_rehash () { (( CURRENT == 1 )) && rehash return 1 } @@ -878,7 +875,7 @@ bindkey -e ## beginning-of-line OR beginning-of-buffer OR beginning of history ## by: Bart Schaefer , Bernhard Tittelbach -beginning-or-end-of-somewhere() { +function beginning-or-end-of-somewhere () { local hno=$HISTNO if [[ ( "${LBUFFER[-1]}" == $'\n' && "${WIDGET}" == beginning-of* ) || \ ( "${RBUFFER[1]}" == $'\n' && "${WIDGET}" == end-of* ) ]]; then @@ -894,14 +891,14 @@ zle -N beginning-of-somewhere beginning-or-end-of-somewhere zle -N end-of-somewhere beginning-or-end-of-somewhere # add a command line to the shells history without executing it -commit-to-history() { +function commit-to-history () { print -s ${(z)BUFFER} zle send-break } zle -N commit-to-history # only slash should be considered as a word separator: -slash-backward-kill-word() { +function slash-backward-kill-word () { local WORDCHARS="${WORDCHARS:s@/@}" # zle backward-word zle backward-kill-word @@ -927,7 +924,7 @@ zle -N slash-backward-kill-word # find the first word on the command line in the $command[] hash. zstyle ':acceptline:*' rehash true -function Accept-Line() { +function Accept-Line () { setopt localoptions noksharrays local -a subs local -xi aldone @@ -947,7 +944,7 @@ function Accept-Line() { done } -function Accept-Line-getdefault() { +function Accept-Line-getdefault () { emulate -L zsh local default_action @@ -962,7 +959,7 @@ function Accept-Line-getdefault() { esac } -function Accept-Line-HandleContext() { +function Accept-Line-HandleContext () { zle Accept-Line default_action=$(Accept-Line-getdefault) @@ -970,7 +967,7 @@ function Accept-Line-HandleContext() { && zle ${default_action} } -function accept-line() { +function accept-line () { setopt localoptions noksharrays local -a cmdline local -x alcontext @@ -1084,7 +1081,7 @@ abk=( 'co' './configure && make && sudo make install' ) -zleiab() { +function zleiab () { emulate -L zsh setopt extendedglob local MATCH @@ -1095,22 +1092,21 @@ zleiab() { zle -N zleiab -help-show-abk() -{ +function help-show-abk () { zle -M "$(print "Available abbreviations for expansion:"; print -a -C 2 ${(kv)abk})" } zle -N help-show-abk -# press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd -insert-datestamp() { LBUFFER+=${(%):-'%D{%Y-%m-%d}'}; } +# press "ctrl-x d" to insert the actual date in the form yyyy-mm-dd +function insert-datestamp () { LBUFFER+=${(%):-'%D{%Y-%m-%d}'}; } zle -N insert-datestamp # press esc-m for inserting last typed word again (thanks to caphuso!) -insert-last-typed-word() { zle insert-last-word -- 0 -1 }; +function insert-last-typed-word () { zle insert-last-word -- 0 -1 }; zle -N insert-last-typed-word; -function grml-zsh-fg() { +function grml-zsh-fg () { if (( ${#jobstates} )); then zle .push-input [[ -o hist_ignore_space ]] && BUFFER=' ' || BUFFER='' @@ -1123,7 +1119,7 @@ function grml-zsh-fg() { zle -N grml-zsh-fg # run command line as user root via sudo: -sudo-command-line() { +function sudo-command-line () { [[ -z $BUFFER ]] && zle up-history if [[ $BUFFER != sudo\ * ]]; then BUFFER="sudo $BUFFER" @@ -1134,7 +1130,7 @@ zle -N sudo-command-line ### jump behind the first word on the cmdline. ### useful to add options. -function jump_after_first_word() { +function jump_after_first_word () { local words words=(${(z)BUFFER}) @@ -1147,7 +1143,7 @@ function jump_after_first_word() { zle -N jump_after_first_word #f5# Create directory under cursor or the selected area -inplaceMkDirs() { +function inplaceMkDirs () { # Press ctrl-xM to create the directory under the cursor or the selected area. # To select an area press ctrl-@ or ctrl-space and use the cursor. # Use case: you type "mv abc ~/testa/testb/testc/" and remember that the @@ -1186,8 +1182,7 @@ HELP_LINES_PER_PAGE=20 #v1# set location of help-zle cache file HELP_ZLE_CACHE_FILE=~/.cache/zsh_help_zle_lines.zsh # helper function for help-zle, actually generates the help text -help_zle_parse_keybindings() -{ +function help_zle_parse_keybindings () { emulate -L zsh setopt extendedglob unsetopt ksharrays #indexing starts at 1 @@ -1202,7 +1197,7 @@ help_zle_parse_keybindings() [[ $load_cache -eq 0 ]] && . $HELP_ZLE_CACHE_FILE && return fi - #fill with default keybindings, possibly to be overwriten in a file later + #fill with default keybindings, possibly to be overwritten in a file later #Note that due to zsh inconsistency on escaping assoc array keys, we encase the key in '' which we will remove later local -A help_zle_keybindings help_zle_keybindings['@']="set MARK" @@ -1255,7 +1250,7 @@ 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~/} @@ -1288,8 +1283,7 @@ typeset -g help_zle_sln typeset -g -a help_zle_lines # Provides (partially autogenerated) help on keybindings and the zsh line editor -help-zle() -{ +function help-zle () { emulate -L zsh unsetopt ksharrays #indexing starts at 1 #help lines already generated ? no ? then do it @@ -1305,7 +1299,7 @@ zle -N help-zle ## complete word from currently visible Screen or Tmux buffer. if check_com -c screen || check_com -c tmux; then - _complete_screen_display() { + function _complete_screen_display () { [[ "$TERM" != "screen" ]] && return 1 local TMPFILE=$(mktemp) @@ -1336,17 +1330,17 @@ fi # Load a few more functions and tie them to widgets, so they can be bound: -function zrcautozle() { +function zrcautozle () { emulate -L zsh local fnc=$1 zrcautoload $fnc && zle -N $fnc } -function zrcgotwidget() { +function zrcgotwidget () { (( ${+widgets[$1]} )) } -function zrcgotkeymap() { +function zrcgotkeymap () { [[ -n ${(M)keymaps:#$1} ]] } @@ -1365,7 +1359,7 @@ zstyle ':completion:hist-complete:*' completer _history # An array to note missing features to ease diagnosis in case of problems. typeset -ga grml_missing_features -function zrcbindkey() { +function zrcbindkey () { if (( ARGC )) && zrcgotwidget ${argv[-1]}; then bindkey "$@" fi @@ -1494,7 +1488,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} @@ -1581,14 +1575,14 @@ alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magi #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line alias run-help >&/dev/null && unalias run-help -for rh in run-help{,-git,-svk,-svn}; do +for rh in run-help{,-git,-ip,-openssl,-p4,-sudo,-svk,-svn}; do zrcautoload $rh done; unset rh # command not found handling (( ${COMMAND_NOT_FOUND} == 1 )) && -function command_not_found_handler() { +function command_not_found_handler () { emulate -L zsh if [[ -x ${GRML_ZSH_CNF_HANDLER} ]] ; then ${GRML_ZSH_CNF_HANDLER} $1 @@ -1599,7 +1593,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 @@ -1608,50 +1602,53 @@ isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history DIRSTACKSIZE=${DIRSTACKSIZE:-20} DIRSTACKFILE=${DIRSTACKFILE:-${ZDOTDIR:-${HOME}}/.zdirs} -typeset -gaU GRML_PERSISTENT_DIRSTACK -function grml_dirstack_filter() { - local -a exclude - local filter entry - if zstyle -s ':grml:chpwd:dirstack' filter filter; then - $filter $1 && return 0 - fi - if zstyle -a ':grml:chpwd:dirstack' exclude exclude; then - for entry in "${exclude[@]}"; do - [[ $1 == ${~entry} ]] && return 0 - done - fi - return 1 -} - -chpwd() { - (( $DIRSTACKSIZE <= 0 )) && return - [[ -z $DIRSTACKFILE ]] && return - grml_dirstack_filter $PWD && return - GRML_PERSISTENT_DIRSTACK=( - $PWD "${(@)GRML_PERSISTENT_DIRSTACK[1,$DIRSTACKSIZE]}" - ) - builtin print -l ${GRML_PERSISTENT_DIRSTACK} >! ${DIRSTACKFILE} -} +if zstyle -T ':grml:chpwd:dirstack' enable; then + typeset -gaU GRML_PERSISTENT_DIRSTACK + function grml_dirstack_filter () { + local -a exclude + local filter entry + if zstyle -s ':grml:chpwd:dirstack' filter filter; then + $filter $1 && return 0 + fi + if zstyle -a ':grml:chpwd:dirstack' exclude exclude; then + for entry in "${exclude[@]}"; do + [[ $1 == ${~entry} ]] && return 0 + done + fi + return 1 + } -if [[ -f ${DIRSTACKFILE} ]]; then - # Enabling NULL_GLOB via (N) weeds out any non-existing - # directories from the saved dir-stack file. - dirstack=( ${(f)"$(< $DIRSTACKFILE)"}(N) ) - # "cd -" won't work after login by just setting $OLDPWD, so - [[ -d $dirstack[1] ]] && cd -q $dirstack[1] && cd -q $OLDPWD -fi + function chpwd () { + (( ZSH_SUBSHELL )) && return + (( $DIRSTACKSIZE <= 0 )) && return + [[ -z $DIRSTACKFILE ]] && return + grml_dirstack_filter $PWD && return + GRML_PERSISTENT_DIRSTACK=( + $PWD "${(@)GRML_PERSISTENT_DIRSTACK[1,$DIRSTACKSIZE]}" + ) + builtin print -l ${GRML_PERSISTENT_DIRSTACK} >! ${DIRSTACKFILE} + } -if zstyle -T ':grml:chpwd:dirstack' filter-on-load; then - for i in "${dirstack[@]}"; do - if ! grml_dirstack_filter "$i"; then - GRML_PERSISTENT_DIRSTACK=( - "${GRML_PERSISTENT_DIRSTACK[@]}" - $i - ) - fi - done -else - GRML_PERSISTENT_DIRSTACK=( "${dirstack[@]}" ) + if [[ -f ${DIRSTACKFILE} ]]; then + # Enabling NULL_GLOB via (N) weeds out any non-existing + # directories from the saved dir-stack file. + dirstack=( ${(f)"$(< $DIRSTACKFILE)"}(N) ) + # "cd -" won't work after login by just setting $OLDPWD, so + [[ -d $dirstack[1] ]] && cd -q $dirstack[1] && cd -q $OLDPWD + fi + + if zstyle -t ':grml:chpwd:dirstack' filter-on-load; then + for i in "${dirstack[@]}"; do + if ! grml_dirstack_filter "$i"; then + GRML_PERSISTENT_DIRSTACK=( + "${GRML_PERSISTENT_DIRSTACK[@]}" + $i + ) + fi + done + else + GRML_PERSISTENT_DIRSTACK=( "${dirstack[@]}" ) + fi fi # directory based profiles @@ -1667,7 +1664,7 @@ if is433 ; then # chpwd_profiles # # For details see the `grmlzshrc.5' manual page. -function chpwd_profiles() { +function chpwd_profiles () { local profile context local -i reexecute @@ -1747,7 +1744,7 @@ PS4='+%N:%i:%_> ' # display battery status on right side of prompt using 'GRML_DISPLAY_BATTERY=1' in .zshrc.pre -battery() { +function battery () { if [[ $GRML_DISPLAY_BATTERY -gt 0 ]] ; then if islinux ; then batterylinux @@ -1764,13 +1761,19 @@ if [[ $GRML_DISPLAY_BATTERY -gt 0 ]] ; then fi } -batterylinux(){ +function batterylinux () { GRML_BATTERY_LEVEL='' local batteries bat capacity batteries=( /sys/class/power_supply/BAT*(N) ) if (( $#batteries > 0 )) ; then for bat in $batteries ; do - capacity=$(< $bat/capacity) + if [[ -e $bat/capacity ]]; then + capacity=$(< $bat/capacity) + else + typeset -F energy_full=$(< $bat/energy_full) + typeset -F energy_now=$(< $bat/energy_now) + typeset -i capacity=$(( 100 * $energy_now / $energy_full)) + fi case $(< $bat/status) in Charging) GRML_BATTERY_LEVEL+=" ^" @@ -1791,7 +1794,7 @@ if (( $#batteries > 0 )) ; then fi } -batteryopenbsd(){ +function batteryopenbsd () { GRML_BATTERY_LEVEL='' local bat batfull batwarn batnow num for num in 0 1 ; do @@ -1820,7 +1823,7 @@ for num in 0 1 ; do done } -batteryfreebsd(){ +function batteryfreebsd () { GRML_BATTERY_LEVEL='' local num local -A table @@ -1847,7 +1850,7 @@ for num in 0 1 ; do done } -batterydarwin(){ +function batterydarwin () { GRML_BATTERY_LEVEL='' local -a table table=( ${$(pmset -g ps)[(w)7,8]%%(\%|);} ) @@ -1913,7 +1916,7 @@ grml_vcs_coloured_formats=( typeset GRML_VCS_COLOUR_MODE=xxx -grml_vcs_info_toggle_colour () { +function grml_vcs_info_toggle_colour () { emulate -L zsh if [[ $GRML_VCS_COLOUR_MODE == plain ]]; then grml_vcs_info_set_formats coloured @@ -1923,7 +1926,7 @@ grml_vcs_info_toggle_colour () { return 0 } -grml_vcs_info_set_formats () { +function grml_vcs_info_set_formats () { emulate -L zsh #setopt localoptions xtrace local mode=$1 AF F BF @@ -2009,6 +2012,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 @@ -2058,7 +2074,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 } @@ -2263,7 +2279,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" @@ -2271,14 +2287,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 @@ -2292,21 +2310,21 @@ 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 ${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) @@ -2316,14 +2334,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 () { @@ -2367,11 +2404,9 @@ function prompt_grml_precmd_worker () { fi } -grml_prompt_fallback() { +function grml_prompt_fallback () { setopt prompt_subst - precmd() { - (( ${+functions[vcs_info]} )) && vcs_info - } + local p0 p1 p0="${RED}%(?..%? )${WHITE}${debian_chroot:+($debian_chroot)}" p1="${BLUE}%n${NO_COLOR}@%m %40<...<%B%~%b%<< "'${vcs_info_msg_0_}'"%# " @@ -2380,7 +2415,6 @@ grml_prompt_fallback() { else PROMPT="${RED}${p0}${BLUE}${p1}" fi - unset p0 p1 } if zrcautoload promptinit && promptinit 2>/dev/null ; then @@ -2393,6 +2427,7 @@ if zrcautoload promptinit && promptinit 2>/dev/null ; then else print 'Notice: no promptinit available :(' grml_prompt_fallback + function precmd () { (( ${+functions[vcs_info]} )) && vcs_info; } fi if is437; then @@ -2425,6 +2460,7 @@ if is437; then fi else grml_prompt_fallback + function precmd () { (( ${+functions[vcs_info]} )) && vcs_info; } fi # Terminal-title wizardry @@ -2493,7 +2529,7 @@ function grml_control_xterm_title () { # 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 @@ -2552,7 +2588,10 @@ else alias l='command ls -l' fi -alias mdstat='cat /proc/mdstat' +if [[ -r /proc/mdstat ]]; then + alias mdstat='cat /proc/mdstat' +fi + alias ...='cd ../../' # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec: @@ -2566,7 +2605,7 @@ alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'" # make sure it is not assigned yet [[ -n ${aliases[utf2iso]} ]] && unalias utf2iso -utf2iso() { +function utf2iso () { if isutfenv ; then local ENV for ENV in $(env | command grep -i '.utf') ; do @@ -2577,7 +2616,7 @@ utf2iso() { # make sure it is not assigned yet [[ -n ${aliases[iso2utf]} ]] && unalias iso2utf -iso2utf() { +function iso2utf () { if ! isutfenv ; then local ENV for ENV in $(env | command grep -i '\.iso') ; do @@ -2588,12 +2627,12 @@ iso2utf() { # especially for roadwarriors using GNU screen and ssh: if ! check_com asc &>/dev/null ; then - asc() { autossh -t "$@" 'screen -RdU' } + function asc () { autossh -t "$@" 'screen -RdU' } compdef asc=ssh fi #f1# Hints for the use of zsh on grml -zsh-help() { +function zsh-help () { print "$bg[white]$fg[black] zsh-help - hints for use of zsh on grml =======================================$reset_color" @@ -2662,38 +2701,56 @@ Enjoy your grml system with the zsh!$reset_color" # debian stuff if [[ -r /etc/debian_version ]] ; 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" - #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} - alias dbp='dpkg-buildpackage' - #a3# Execute \kbd{grep-excuses} - alias ge='grep-excuses' + if [[ -z "$GRML_NO_APT_ALIASES" ]]; then + #a3# Execute \kbd{apt-cache policy} + alias acp='apt-cache policy' + 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{aptitude update ; aptitude safe-upgrade} + salias -a up="aptitude update ; aptitude safe-upgrade" + #a3# Execute \kbd{dpkg-buildpackage} + alias dbp='dpkg-buildpackage' + #a3# Execute \kbd{grep-excuses} + alias ge='grep-excuses' + fi # get a root shell as normal user in live-cd mode: if isgrmlcd && [[ $UID -ne 0 ]] ; then alias su="sudo su" fi - #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog} - 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} - salias tlog="tail -f /var/log/syslog" # follow the syslog +fi + +# use /var/log/syslog iff present, fallback to journalctl otherwise +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 +elif check_com -c journalctl ; then + salias llog="journalctl" + salias tlog="journalctl -f" fi # sort installed Debian-packages by size @@ -2705,7 +2762,7 @@ fi # if cdrecord is a symlink (to wodim) or isn't present at all warn: if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord; then if check_com -c wodim; then - cdrecord() { + function cdrecord () { <<__EOF0__ cdrecord is not provided under its original name by Debian anymore. See #377109 in the BTS of Debian for more details. @@ -2723,10 +2780,10 @@ if isgrmlcd; then fi # grmlstuff -grmlstuff() { +function grmlstuff () { # people should use 'grml-x'! if check_com -c 915resolution; then - 855resolution() { + function 855resolution () { echo "Please use 915resolution as resolution modifying tool for Intel \ graphic chipset." return -1 @@ -2737,7 +2794,7 @@ graphic chipset." alias grml-version='cat /etc/grml_version' if check_com -c grml-debootstrap ; then - debian2hd() { + function debian2hd () { echo "Installing debian to harddisk is possible by using grml-debootstrap." return 1 } @@ -2759,7 +2816,7 @@ is4 && xsource "/etc/zsh/keephack" # This lists all the files in the current directory newer than the reference file. # You can also specify the reference file inline; note quotes: # $ ls -l *(e:'nt ~/.zshenv':) -is4 && nt() { +is4 && function nt () { if [[ -n $1 ]] ; then local NTREF=${~1} fi @@ -2769,7 +2826,7 @@ is4 && nt() { # shell functions #f1# Reload an autoloadable function -freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done } +function freload () { while (( $# )); do; unfunction $1; autoload -U $1; shift; done } compdef _functions freload # @@ -2800,7 +2857,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. @@ -2812,15 +2869,15 @@ compdef _functions freload # 2 symlink loop detected # #f1# List symlinks in detail (more detailed version of 'readlink -f', 'whence -s' and 'namei -l') -sll() { +function sll () { if [[ -z ${1} ]] ; then printf 'Usage: %s \n' "${0}" return 1 fi local file jumpd curdir - local -i RTN LINODE i - local -a SEENINODES + local -i 10 RTN LINODE i + local -a SEENINODES curdir="${PWD}" RTN=0 @@ -2833,8 +2890,8 @@ sll() { LINODE=$(zstat -L +inode "${file}") for i in ${SEENINODES} ; do if (( ${i} == ${LINODE} )) ; then - builtin cd "${curdir}" - print "link loop detected, aborting!" + builtin cd -q "${curdir}" + print 'link loop detected, aborting!' return 2 fi done @@ -2844,7 +2901,7 @@ sll() { file="${file:t}" if [[ -d ${jumpd} ]] ; then - builtin cd "${jumpd}" || RTN=1 + builtin cd -q "${jumpd}" || RTN=1 fi file=$(readlink "$file") @@ -2852,7 +2909,7 @@ sll() { file="${file:t}" if [[ -d ${jumpd} ]] ; then - builtin cd "${jumpd}" || RTN=1 + builtin cd -q "${jumpd}" || RTN=1 fi ls -l "${PWD}/${file}" || RTN=1 @@ -2861,7 +2918,7 @@ sll() { if (( ${#} >= 1 )) ; then print "" fi - builtin cd "${curdir}" + builtin cd -q "${curdir}" done return ${RTN} } @@ -2871,7 +2928,7 @@ sll() { # with respect to wordsplitting. (ie. ${=PAGER}) if check_com -c $PAGER ; then #f3# View Debian's changelog of given package(s) - dchange() { + function dchange () { emulate -L zsh [[ -z "$1" ]] && printf 'Usage: %s \n' "$0" && return 1 @@ -2896,11 +2953,11 @@ if check_com -c $PAGER ; then fi done } - _dchange() { _files -W /usr/share/doc -/ } + function _dchange () { _files -W /usr/share/doc -/ } compdef _dchange dchange #f3# View Debian's NEWS of a given package - dnews() { + function dnews () { emulate -L zsh if [[ -r /usr/share/doc/$1/NEWS.Debian.gz ]] ; then $PAGER /usr/share/doc/$1/NEWS.Debian.gz @@ -2913,11 +2970,11 @@ if check_com -c $PAGER ; then fi fi } - _dnews() { _files -W /usr/share/doc -/ } + function _dnews () { _files -W /usr/share/doc -/ } compdef _dnews dnews #f3# View Debian's copyright of a given package - dcopyright() { + function dcopyright () { emulate -L zsh if [[ -r /usr/share/doc/$1/copyright ]] ; then $PAGER /usr/share/doc/$1/copyright @@ -2926,11 +2983,11 @@ if check_com -c $PAGER ; then return 1 fi } - _dcopyright() { _files -W /usr/share/doc -/ } + function _dcopyright () { _files -W /usr/share/doc -/ } compdef _dcopyright dcopyright #f3# View upstream's changelog of a given package - uchange() { + function uchange () { emulate -L zsh if [[ -r /usr/share/doc/$1/changelog.gz ]] ; then $PAGER /usr/share/doc/$1/changelog.gz @@ -2939,23 +2996,23 @@ if check_com -c $PAGER ; then return 1 fi } - _uchange() { _files -W /usr/share/doc -/ } + function _uchange () { _files -W /usr/share/doc -/ } compdef _uchange uchange fi # zsh profiling -profile() { +function profile () { ZSH_PROFILE_RC=1 zsh "$@" } #f1# Edit an alias via zle -edalias() { +function edalias () { [[ -z "$1" ]] && { echo "Usage: edalias " ; return 1 } || vared aliases'[$1]' ; } compdef _aliases edalias #f1# Edit a function via zle -edfunc() { +function edfunc () { [[ -z "$1" ]] && { echo "Usage: edfunc " ; return 1 } || zed -f "$1" ; } compdef _functions edfunc @@ -2968,7 +3025,7 @@ compdef _functions edfunc #m# f6 Force-Reload() \kbd{service \em{process}}\quad\kbd{force-reload} #m# f6 Status() \kbd{service \em{process}}\quad\kbd{status} if [[ -d /etc/init.d || -d /etc/service ]] ; then - __start_stop() { + function __start_stop () { local action_="${1:l}" # e.g Start/Stop/Restart local service_="$2" local param_="$3" @@ -2996,21 +3053,21 @@ if [[ -d /etc/init.d || -d /etc/service ]] ; then fi } - _grmlinitd() { + function _grmlinitd () { local -a scripts scripts=( /etc/init.d/*(x:t) ) _describe "service startup script" scripts } for i in Start Restart Stop Force-Reload Reload Status ; do - eval "$i() { __start_stop $i \"\$1\" \"\$2\" ; }" + eval "function $i () { __start_stop $i \"\$1\" \"\$2\" ; }" compdef _grmlinitd $i done builtin unset -v i fi #f1# Provides useful information on globbing -H-Glob() { +function H-Glob () { echo -e " / directories . plain files @@ -3051,7 +3108,7 @@ H-Glob() { alias help-zshglob=H-Glob # grep for running process, like: 'any vim' -any() { +function any () { emulate -L zsh unsetopt KSH_ARRAYS if [[ -z "$1" ]] ; then @@ -3066,7 +3123,7 @@ any() { # After resuming from suspend, system is paging heavily, leading to very bad interactivity. # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt [[ -r /proc/1/maps ]] && \ -deswap() { +function deswap () { print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.' cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null print 'Finished, running "swapoff -a; swapon -a" may also be useful.' @@ -3080,7 +3137,7 @@ deswap() { # This will cause vim to send every file given on the # commandline to be send to it's own tab (needs vim7). if check_com vim; then - vim() { + function vim () { VIM_PLEASE_SET_TITLE='yes' command vim ${VIM_OPTIONS} "$@" } fi @@ -3098,7 +3155,7 @@ for sh in ${ssl_hashes}; do }' done; unset sh -ssl-cert-fingerprints() { +function ssl-cert-fingerprints () { emulate -L zsh local i if [[ -z $1 ]] ; then @@ -3110,7 +3167,7 @@ ssl-cert-fingerprints() { done } -ssl-cert-info() { +function ssl-cert-info () { emulate -L zsh if [[ -z $1 ]] ; then printf 'usage: ssl-cert-info \n' @@ -3121,14 +3178,17 @@ ssl-cert-info() { } # make sure our environment is clean regarding colors -for var in BLUE RED GREEN CYAN YELLOW MAGENTA WHITE ; unset $var -builtin unset -v var +builtin unset -v BLUE RED GREEN CYAN YELLOW MAGENTA WHITE NO_COLOR # "persistent history" -# just write important commands you always need to ~/.important_commands +# just write important commands you always need to $GRML_IMPORTANT_COMMANDS +# defaults for backward compatibility to ~/.important_commands if [[ -r ~/.important_commands ]] ; then - fc -R ~/.important_commands + GRML_IMPORTANT_COMMANDS=~/.important_commands +else + GRML_IMPORTANT_COMMANDS=${GRML_IMPORTANT_COMMANDS:-${ZDOTDIR:-${HOME}}/.important_commands} fi +[[ -r ${GRML_IMPORTANT_COMMANDS} ]] && builtin fc -R ${GRML_IMPORTANT_COMMANDS} # load the lookup subsystem if it's available on the system zrcautoload lookupinit && lookupinit @@ -3142,7 +3202,7 @@ export COLORTERM="yes" # general #a2# Execute \kbd{du -sch} -alias da='du -sch' +[[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias da='du -sch' # listing stuff #a2# Execute \kbd{ls -lSrah} @@ -3206,7 +3266,7 @@ fi # useful functions #f5# Backup \kbd{file_or_folder {\rm to} file_or_folder\_timestamp} -bk() { +function bk () { emulate -L zsh local current_date=$(date -u "+%Y-%m-%dT%H:%M:%SZ") local clean keep move verbose result all to_bk @@ -3280,14 +3340,14 @@ return 0;; return $result } -#f5# cd to directoy and list files -cl() { +#f5# cd to directory and list files +function cl () { emulate -L zsh cd $1 && ls -a } # smart cd function, allows switching to /etc when running 'cd /etc/fstab' -cd() { +function cd () { if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then [[ ! -e ${1:h} ]] && return 1 print "Correcting ${1} to ${1:h}" @@ -3297,8 +3357,8 @@ cd() { fi } -#f5# Create Directoy and \kbd{cd} to it -mkcd() { +#f5# Create Directory and \kbd{cd} to it +function mkcd () { if (( ARGC != 1 )); then printf 'usage: mkcd \n' return 1; @@ -3312,25 +3372,25 @@ mkcd() { } #f5# Create temporary directory and \kbd{cd} to it -cdt() { +function cdt () { builtin cd "$(mktemp -d)" builtin pwd } #f5# List files which have been accessed within the last {\it n} days, {\it n} defaults to 1 -accessed() { +function accessed () { emulate -L zsh print -l -- *(a-${1:-1}) } #f5# List files which have been changed within the last {\it n} days, {\it n} defaults to 1 -changed() { +function changed () { emulate -L zsh print -l -- *(c-${1:-1}) } #f5# List files which have been modified within the last {\it n} days, {\it n} defaults to 1 -modified() { +function modified () { emulate -L zsh print -l -- *(m-${1:-1}) } @@ -3356,7 +3416,7 @@ fi # $ awk -F ':' '{ print $2" : "$1" "$3 }' \ # /usr/local/lib/words/en-de.ISO-8859-1.vok > ~/.translate/de-en.ISO-8859-1.vok #f5# Translates a word -trans() { +function trans () { emulate -L zsh case "$1" in -[dD]*) @@ -3375,7 +3435,7 @@ trans() { # Usage: simple-extract # Using option -d deletes the original archive file. #f5# Smart archive extractor -simple-extract() { +function simple-extract () { emulate -L zsh setopt extended_glob noclobber local ARCHIVE DELETE_ORIGINAL DECOMP_CMD USES_STDIN USES_STDOUT GZTARGET WGET_CMD @@ -3512,24 +3572,22 @@ simple-extract() { return $RC } -__archive_or_uri() -{ +function __archive_or_uri () { _alternative \ 'files:Archives:_files -g "*.(#l)(tar.bz2|tbz2|tbz|tar.gz|tgz|tar.xz|txz|tar.lzma|tar|rar|lzh|7z|zip|jar|deb|bz2|gz|Z|xz|lzma)"' \ '_urls:Remote Archives:_urls' } -_simple_extract() -{ +function _simple_extract () { _arguments \ '-d[delete original archivefile after extraction]' \ '*:Archive Or Uri:__archive_or_uri' } compdef _simple_extract simple-extract -alias se=simple-extract +[[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias se=simple-extract #f5# Change the xterm title from within GNU-screen -xtrename() { +function xtrename () { emulate -L zsh if [[ $1 != "-f" ]] ; then if [[ -z ${DISPLAY} ]] ; then @@ -3552,7 +3610,7 @@ xtrename() { # Create small urls via http://goo.gl using curl(1). # API reference: https://code.google.com/apis/urlshortener/ -function zurl() { +function zurl () { emulate -L zsh setopt extended_glob @@ -3596,7 +3654,7 @@ function zurl() { } #f2# Find history events by search pattern and list them by date. -whatwhen() { +function whatwhen () { emulate -L zsh local usage help ident format_l format_s first_char remain first last usage='USAGE: whatwhen [options] ' @@ -3648,7 +3706,7 @@ if check_com -c hg ; then # gnu like diff for mercurial # http://www.selenic.com/mercurial/wiki/index.cgi/TipsAndTricks #f5# GNU like diff for mercurial - hgdi() { + function hgdi () { emulate -L zsh local i for i in $(hg status -marn "$@") ; diff -ubwd <(hg cat "$i") "$i" @@ -3659,13 +3717,13 @@ if check_com -c hg ; then alias hbp='hg-buildpackage' # execute commands on the versioned patch-queue from the current repos - alias mq='hg -R $(readlink -f $(hg root)/.hg/patches)' + [[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias mq='hg -R $(readlink -f $(hg root)/.hg/patches)' # diffstat for specific version of a mercurial repository # hgstat => display diffstat between last revision and tip # hgstat 1234 => display diffstat between revision 1234 and tip #f5# Diffstat for specific version of a mercurial repos - hgstat() { + function hgstat () { emulate -L zsh [[ -n "$1" ]] && hg diff -r $1 -r tip | diffstat || hg export tip | diffstat } @@ -3682,7 +3740,7 @@ fi # end of check whether we have the 'hg'-executable if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then - unset abk[V] + unset "abk[V]" unalias 'V' &> /dev/null unfunction vman &> /dev/null unfunction viless &> /dev/null