X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=43cda0cd9f93be08c13d216a809f2f387b626bcd;hb=05add691b8590d4b4532f1e0111f32dc1723494a;hp=16804712409310750ffecd047c427401ae87cc78;hpb=b9bdbb1eff440c668c8fb8257f48da40fb3fdbac;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 1680471..43cda0c 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -431,11 +431,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 @@ -659,7 +670,10 @@ 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[@]}" || print 'Notice: no compinit available :(' + unset tmp else print 'Notice: no compinit available :(' function compdef { } @@ -823,8 +837,16 @@ function grmlcomp () { _ssh_hosts=() _etc_hosts=() fi + + local localname + if check_com hostname ; then + localname=$(hostname) + elif check_com hostnamectl ; then + localname=$(hostnamectl --static) + fi + hosts=( - $(hostname) + "${localname}" "$_ssh_config_hosts[@]" "$_ssh_hosts[@]" "$_etc_hosts[@]" @@ -881,7 +903,7 @@ zle -N end-of-somewhere beginning-or-end-of-somewhere # add a command line to the shells history without executing it function commit-to-history () { - print -s ${(z)BUFFER} + print -rs ${(z)BUFFER} zle send-break } zle -N commit-to-history @@ -1087,7 +1109,7 @@ function help-show-abk () { zle -N help-show-abk -# press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd +# 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 @@ -1186,7 +1208,7 @@ function 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" @@ -1208,7 +1230,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)" @@ -1239,7 +1261,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~/} @@ -1477,7 +1499,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} @@ -1582,7 +1604,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 @@ -1842,7 +1864,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) @@ -2063,7 +2085,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 } @@ -2255,6 +2277,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 @@ -2300,6 +2323,7 @@ function grml_prompt_addto () { zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" token new \ || new=${grml_prompt_token_default[$it]} if (( ${+grml_prompt_token_function[$it]} )); then + REPLY='' ${grml_prompt_token_function[$it]} $it else case $it in @@ -2493,8 +2517,15 @@ 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 + if check_com hostname ; then + localname=$(hostname) + elif check_com hostnamectl ; then + localname=$(hostnamectl --static) + fi + + # set hostname if not running on local machine + if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != "${localname}" ]] ; then NAME="@$HOSTNAME" fi } @@ -2511,14 +2542,14 @@ function grml_cmd_to_screen_title () { function grml_control_xterm_title () { case $TERM in (xterm*|rxvt*) - set_title "${(%):-"%n@%m:"}" "$1" + 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 @@ -2691,22 +2722,24 @@ 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' 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-get update} + #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" @@ -2844,7 +2877,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. @@ -2910,9 +2943,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 () { @@ -2920,13 +2950,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." @@ -3255,7 +3300,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 @@ -3312,14 +3357,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 @@ -3327,7 +3372,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 @@ -3344,7 +3389,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' @@ -3717,7 +3762,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. @@ -3727,7 +3775,9 @@ fi # end of check whether we have the 'hg'-executable if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then - unset abk[V] &> /dev/null + # Clean up + + unset "abk[V]" unalias 'V' &> /dev/null unfunction vman &> /dev/null unfunction viless &> /dev/null @@ -3737,6 +3787,36 @@ 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