X-Git-Url: https://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=8a836cd2f0a18066a15f837d565dcc14f174d738;hb=dd303d12e21ef67be7076604879299b896a8fa83;hp=61e86e59fdcb98fa3c7fc6d6f391074b912367a9;hpb=8c13f49a31fb01dafa85309149a2894874b52d76;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 61e86e5..8a836cd 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -230,6 +230,8 @@ zrcautoload is-at-least || is-at-least() { return 1 } NOCOR=${NOCOR:-0} NOMENU=${NOMENU:-0} NOPRECMD=${NOPRECMD:-0} +COMMAND_NOT_FOUND=${COMMAND_NOT_FOUND:-0} +GRML_ZSH_CNF_HANDLER=${GRML_ZSH_CNF_HANDLER:-/usr/share/command-not-found/command-not-found} BATTERY=${BATTERY:-0} GRMLSMALL_SPECIFIC=${GRMLSMALL_SPECIFIC:-1} GRML_ALWAYS_LOAD_ALL=${GRML_ALWAYS_LOAD_ALL:-0} @@ -443,12 +445,17 @@ xunfunction() { return 0 } +# this allows us to stay in sync with grml's zshrc and put own +# modifications in ~/.zshrc.local +zrclocal() { + xsource "${HOME}/.zshrc.local" + return 0 +} + #}}} # locale setup {{{ -if [[ -z "$LANG" ]] ; then - xsource "/etc/default/locale" -fi +xsource "/etc/default/locale" export LANG=${LANG:-en_US.iso885915} for var in LC_ALL LC_MESSAGES ; do @@ -623,6 +630,14 @@ grml_toggle_abbrev() { zle -N grml_toggle_abbrev bindkey '^xA' grml_toggle_abbrev +# add a command line to the shells history without executing it +commit-to-history() { + print -s ${(z)BUFFER} + zle send-break +} +zle -N commit-to-history +bindkey "^x^h" commit-to-history + # }}} # a generic accept-line wrapper {{{ @@ -776,76 +791,26 @@ declare -A abk setopt extendedglob setopt interactivecomments abk=( -# key # value (#d additional doc string) +# key # value (#d additional doc string) #A# start - '...' '../..' + '...' '../..' '....' '../../..' - 'BG' '& exit' - 'C' '| wc -l' - 'G' '|& grep --color=auto' - 'H' '| head' - 'Hl' ' --help |& less -r' #d (Display help in pager) - 'L' '| less' - 'LL' '|& less -r' - 'M' '| most' - 'N' '&>/dev/null' #d (No Output) - 'R' '| tr A-z N-za-m' #d (ROT13) - 'SL' '| sort | less' - 'S' '| sort -u' - 'T' '| tail' - 'V' '|& vim -' + 'BG' '& exit' + 'C' '| wc -l' + 'G' '|& grep --color=auto ' + 'H' '| head' + 'Hl' ' --help |& less -r' #d (Display help in pager) + 'L' '| less' + 'LL' '|& less -r' + 'M' '| most' + 'N' '&>/dev/null' #d (No Output) + 'R' '| tr A-z N-za-m' #d (ROT13) + 'SL' '| sort | less' + 'S' '| sort -u' + 'T' '| tail' + 'V' '|& vim -' #A# end - 'hide' "echo -en '\033]50;nil2\007'" - 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"' - 'small' 'echo -en "\033]50;6x10\007"' - 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"' - 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"' - 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"' - 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"' - 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"' - 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"' - 'da' 'du -sch' - 'j' 'jobs -l' - 'u' 'translate -i' - 'co' "./configure && make && sudo make install" - 'CH' "./configure --help" - 'conkeror' 'firefox -chrome chrome://conkeror/content' - 'dir' 'ls -lSrah' - 'lad' $'ls -d .*(/)\n# only show dot-directories' - 'lsa' $'ls -a .*(.)\n# only show dot-files' - 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag' - 'lsl' $'ls -l *(@[1,10])\n# only symlinks' - 'lsx' $'ls -l *(*[1,10])\n# only executables' - 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files' - 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files' - 'lsd' $'ls -d *(/)\n# only show directories' - 'lse' $'ls -d *(/^F)\n# only show empty directories' - 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files' - 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files' - 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files' - 'rw-' 'chmod 600' - '600' 'chmod u+rw-x,g-rwx,o-rwx' - 'rwx' 'chmod u+rwx' - '700' 'chmod u+rwx,g-rwx,o-rwx' - 'r--' 'chmod u+r-wx,g-rwx,o-rwx' - '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x' - '755' 'chmod u+rwx,g+r-w+x,o+r-w+x' - 'md' 'mkdir -p ' - 'cmplayer' 'mplayer -vo -fs -zoom fbdev' - 'fbmplayer' 'mplayer -vo -fs -zoom fbdev' - 'fblinks' 'links2 -driver fb' - 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"' - 'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"' - 'fori' 'for i ({..}) { }' - 'cx' 'chmod +x' - 'e' 'print -l' - 'se' 'setopt interactivecomments' - 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala' - 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2' - 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3' - 'ci' 'centericq' - 'D' 'export DISPLAY=:0.0' - 'mp' 'mplayer -vo xv -fs -zoom' + 'co' './configure && make && sudo make install' ) globalias() { @@ -1015,6 +980,7 @@ setopt auto_pushd # make cd push the old directory onto the directory setopt nonomatch # try to avoid the 'zsh: no matches found...' setopt nobeep # avoid "beep"ing setopt pushd_ignore_dups # don't push the same dir twice. +setopt noglobdots # * shouldn't match dotfiles. ever. MAILCHECK=30 # mailchecks REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 seconds @@ -1074,7 +1040,7 @@ fi battery() { if [[ $BATTERY -gt 0 ]] ; then - PERCENT="${${"$(acpi 2>/dev/null)"}/(#b)[[:space:]]##Battery <->: [^0-9]##, (<->)%*/${match[1]}}" + PERCENT="${${"$(acpi 2>/dev/null)"}/(#b)[[:space:]]#Battery <->: [^0-9]##, (<->)%*/${match[1]}}" if [[ -z "$PERCENT" ]] ; then PERCENT='acpi not present' else @@ -1128,8 +1094,8 @@ fi # from , # which distributed under the same terms as zsh itself. -# we will only be using one variable, so let the code know now. -zstyle ':vcs_info:*' max-exports 1 +# we will be using two variables, so let the code know now. +zstyle ':vcs_info:*' max-exports 2 # vcs_info() documentation: #{{{ @@ -1417,17 +1383,21 @@ VCS_INFO_formats () { # {{{ (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b]-' fi - (( ${#msgs} > maxexports )) && msgs[${maxexports},-1]=() + (( ${#msgs} > maxexports )) && msgs[$(( maxexports + 1 )),-1]=() for i in {1..${#msgs}} ; do - zformat -f msg ${msgs[$i]} a:${action} b:${branch} s:${vcs} r:${base:t} R:${base} S:"$(VCS_INFO_reposub ${base})" + zformat -f msg ${msgs[$i]} \ + a:${action} \ + b:${branch} \ + r:${base:t} \ + s:${vcs} \ + R:${base} \ + S:"$(VCS_INFO_reposub ${base})" msgs[$i]=${msg} done return 0 } # }}} VCS_INFO_maxexports () { #{{{ - local -ix maxexports - zstyle -s ":vcs_info:${vcs}:${usercontext}" "max-exports" maxexports || maxexports=2 if [[ ${maxexports} != <-> ]] || (( maxexports < 1 )); then printf 'vcs_info(): expecting numeric arg >= 1 for max-exports (got %s).\n' ${maxexports} @@ -1859,6 +1829,7 @@ vcs_info () { # {{{ local -i found local -a VCSs disabled dps local -x vcs usercontext + local -ix maxexports local -ax msgs local -Ax vcs_comm @@ -1925,19 +1896,38 @@ vcs_info () { # {{{ VCS_INFO_set --nvcs preinit # }}} -# change vcs_info formats for the grml prompt +# Change vcs_info formats for the grml prompt. The 2nd format sets up +# $vcs_info_msg_1_ to contain "zsh: repo-name" used to set our screen title. +# TODO: The included vcs_info() version still uses $VCS_INFO_message_N_. +# That needs to be the use of $VCS_INFO_message_N_ needs to be changed +# to $vcs_info_msg_N_ as soon as we use the included version. if [[ "$TERM" == dumb ]] ; then - zstyle ':vcs_info:*' actionformats "(%s%)-[%b|%a] " - zstyle ':vcs_info:*' formats "(%s%)-[%b] " + zstyle ':vcs_info:*' actionformats "(%s%)-[%b|%a] " "zsh: %r" + zstyle ':vcs_info:*' formats "(%s%)-[%b] " "zsh: %r" else # these are the same, just with a lot of colours: - zstyle ':vcs_info:*' actionformats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOUR} " - zstyle ':vcs_info:*' formats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOUR}%} " + zstyle ':vcs_info:*' actionformats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOUR} " \ + "zsh: %r" + zstyle ':vcs_info:*' formats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOUR}%} " \ + "zsh: %r" zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YELLOW}%r" fi # }}} +# command not found handling {{{ + +(( ${COMMAND_NOT_FOUND} == 1 )) && +function command_not_found_handler() { + setopt localoptions no_sh_wordsplit + if [[ -x ${GRML_ZSH_CNF_HANDLER} ]] ; then + ${GRML_ZSH_CNF_HANDLER} $1 + fi + return 1 +} + +# }}} + # {{{ set prompt if zrcautoload promptinit && promptinit 2>/dev/null ; then promptinit # people should be able to use their favourite prompt @@ -1950,30 +1940,33 @@ setopt prompt_subst # make sure to use right prompt only when not running a command is41 && setopt transient_rprompt +# TODO: revise all these NO* variables and especially their documentation +# in zsh-help() below. is4 && [[ $NOPRECMD -eq 0 ]] && precmd () { [[ $NOPRECMD -gt 0 ]] && return 0 # update VCS information vcs_info - # allow manual overwriting of RPROMPT - if [[ -n $RPROMPT ]] ; then - [[ $TERM == screen* ]] && print -nP "\ekzsh\e\\" - # return 0 + if [[ $TERM == screen* ]] ; then + if [[ -n ${VCS_INFO_message_1_} ]] ; then + print -nP "\ek${VCS_INFO_message_1_}\e\\" + else + print -nP "\ekzsh\e\\" + fi fi # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT if [[ $DONTSETRPROMPT -eq 0 ]] ; then if [[ $BATTERY -gt 0 ]] ; then - # update BATTERY information + # update battery (dropped into $PERCENT) information battery - RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}" - # RPROMPT="${PERCENT}${SCREENTITLE}" + RPROMPT="%(?..:() ${PERCENT}" else - RPROMPT="%(?..:()% ${SCREENTITLE}" - # RPROMPT="${SCREENTITLE}" + RPROMPT="%(?..:() " fi fi # adjust title of xterm # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html + [[ ${NOTITLE} -gt 0 ]] && return 0 case $TERM in (xterm*|rxvt*) print -Pn "\e]0;%n@%m: %~\a" @@ -1996,13 +1989,8 @@ preexec () { local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname echo -ne "\ek$CMD\e\\" fi -# set the screen title to "zsh" when sitting at the command prompt: - if [[ "$TERM" == screen* ]] ; then - SCREENTITLE=$'%{\ekzsh\e\\%}' - else - SCREENTITLE='' - fi # adjust title of xterm + [[ ${NOTITLE} -gt 0 ]] && return 0 case $TERM in (xterm*|rxvt) print -Pn "\e]0;%n@%m: $1\a" @@ -2225,7 +2213,14 @@ the zsh yet. :) "NOCOR=1 zsh" => deactivate automatic correction "NOMENU=1 zsh" => do not use auto menu completion (note: use ctrl-d for completion instead!) "NOPRECMD=1 zsh" => disable the precmd + preexec commands (set GNU screen title) + "NOTITLE=1 zsh" => disable setting the title of xterms without disabling + preexec() and precmd() completely "BATTERY=1 zsh" => activate battery status (via acpi) on right side of prompt + "COMMAND_NOT_FOUND=1 zsh" + => Enable a handler if an external command was not found + The command called in the handler can be altered by setting + the GRML_ZSH_CNF_HANDLER variable, the default is: + "/usr/share/command-not-found/command-not-found" A value greater than 0 is enables a feature; a value equal to zero disables it. If you like one or the other of these settings, you can @@ -2496,7 +2491,9 @@ grmlcomp() { # use generic completion system for programs not yet defined; (_gnu_generic works # with commands that provide a --help option with "standard" gnu-like output.) - compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac + for compcom in tail head feh cp mv df stow uname ipacsum fetchipac; do + [[ -z ${_comps[$compcom]} ]] && compdef _gnu_generic ${compcom} + done; unset compcom # see upgrade function in this file compdef _hosts upgrade @@ -2877,6 +2874,17 @@ minimal-shell() { exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh } +# a wrapper for vim, that deals with title setting +# VIM_OPTIONS +# set this array to a set of options to vim you always want +# to have set when calling vim (in .zshrc.local), like: +# VIM_OPTIONS=( -p ) +# This will cause vim to send every file given on the +# commandline to be send to it's own tab (needs vim7). +vim() { + VIM_PLEASE_SET_TITLE='yes' command vim ${VIM_OPTIONS} "$@" +} + # make a backup of a file bk() { cp -a "$1" "${1}_$(date --iso-8601=seconds)" @@ -2960,7 +2968,11 @@ fi ### non-root (EUID != 0) code below ### -(( GRML_ALWAYS_LOAD_ALL == 0 )) && (( $EUID == 0 )) && return 0 +if (( GRML_ALWAYS_LOAD_ALL == 0 )) && (( $EUID == 0 )) ; then + zrclocal + return 0 +fi + # variables {{{ @@ -4240,14 +4252,7 @@ fi #}}} -# finally source a local zshrc {{{ - -# this allows us to stay in sync with grml's zshrc and put own -# modifications in ~/.zshrc.local - -xsource "${HOME}/.zshrc.local" - -# }}} +zrclocal ## genrefcard.pl settings {{{