X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=e30f5118465931c7c5666c9972a9216b43e4946a;hb=e7f84863ff37d54cc2b99e259b4aa2698543a767;hp=f7c332b624d2f03c0299d155e4846f5a209c8983;hpb=b5070ac43c7fc3a280526aaa172a901862198c8b;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index f7c332b..e30f511 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -134,7 +134,12 @@ is43(){ } is433(){ - [[ $ZSH_VERSION == 4.3.<3->* || $ZSH_VERSION == <5->* ]] && return 0 + [[ $ZSH_VERSION == 4.3.<3->* || $ZSH_VERSION == 4.<4->* || $ZSH_VERSION == <5->* ]] && return 0 + return 1 +} + +is439(){ + [[ $ZSH_VERSION == 4.3.<9->* || $ZSH_VERSION == 4.<4->* || $ZSH_VERSION == <5->* ]] && return 0 return 1 } @@ -276,6 +281,7 @@ setopt nobeep # avoid "beep"ing setopt pushd_ignore_dups # don't push the same dir twice. setopt noglobdots # * shouldn't match dotfiles. ever. setopt noshwordsplit # use zsh style word splitting +setopt unset # don't error out when unset parameters are used # }}} @@ -291,79 +297,6 @@ GRMLSMALL_SPECIFIC=${GRMLSMALL_SPECIFIC:-1} GRML_ALWAYS_LOAD_ALL=${GRML_ALWAYS_LOAD_ALL:-0} ZSH_NO_DEFAULT_LOCALE=${ZSH_NO_DEFAULT_LOCALE:-0} -if isgrmlcd ; then - GRML_WARN_SKEL=${GRML_WARN_SKEL:-0} -else - GRML_WARN_SKEL=${GRML_WARN_SKEL:-1} -fi - -if (( GRML_WARN_SKEL != 0 )) ; then - -function grml_warn_skel_main() { - printf ' -Dear user, - -You updated grml'\''s zshrc which brings a major change. -The configuration is kept only in one file, being the global zshrc. -In the past, the configuration was split in two files, with the -second file being the .zshrc file from /etc/skel. - -If you have a .zshrc file in your home directory that originally -came from the skel directory, please remove it. This is also the case -if you followed earlier instructions from the grml-zsh-refcard or -from on non-grml systems. - -Please see the current grml-zsh-refcard (available at -) for updated installation information. In short, -you don'\''t want a .zshrc.global file. Install the global zshrc to -~/.zshrc and be done. - -If you need changes to the configuration, use ~/.zshrc.pre and -~/.zshrc.local. - -' -} - -function grml_warn_skel_remove() { - printf 'To remove this warning execute '\''grml_do_not_warn_skel'\''.\n\n' -} - -function grml_do_not_warn_skel() { - printf '# Do not warn about old skel dot-files anymore\n' >>! ~/.zshrc.pre - printf 'GRML_WARN_SKEL=0\n' >>! ~/.zshrc.pre -} - -# let's try to guess how the user uses us. -if is-at-least 4.3.7 ; then - # funcsourcetrace requires at least version 4.3.7 of zsh. - GRML_SRC_FILE="${${funcsourcetrace[1]}%:*}" - - grml_warn_skel_main - case ${GRML_SRC_FILE} in - (${HOME}/.zshrc.global) - grml_warn_skel_remove - printf '\nIt looks like you copied the grml zshrc to '\''~/.zshrc.global'\''.\n' - printf 'Nowadays you just copy the global zshrc to '\''~/.zshrc'\'' to use\n' - printf 'it on a non-grml-system.\n' - ;; - (${HOME}/.zshrc) - printf '\nIt looks like you copied the grml zshrc to '\''~/.zshrc'\''.\n' - printf 'We'\''ll disable this warning automatically for later sessions.\n' - grml_do_not_warn_skel - ;; - (*) - grml_do_not_warn_skel - ;; - esac -else - grml_warn_skel_main - grml_warn_skel_remove -fi - -unfunction grml_warn_skel_remove grml_warn_skel_main - -fi # GRML_WARN_SKEL - # }}} # utility functions {{{ @@ -540,32 +473,6 @@ xsource "/etc/sysconfig/keyboard" TZ=$(xcat /etc/timezone) # }}} -# check for potentially old files in 'completion.d' {{{ -setopt extendedglob -xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N)) -if (( ${#xof} > 0 )) ; then - printf '\n -!- INFORMATION\n\n' - printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof} - printf ' -!- /etc/zsh/completion.d/.\n\n' - printf ' -!- While this has been the case in old versions of grml-etc-core,\n' - printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n' - printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n' - printf ' -!- named _* to that directory.\n\n' - printf ' -!- If you added functions to completion.d yourself, please consider\n' - printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n' - printf ' -!- starting with an underscore are marked for automatic loading\n' - printf ' -!- by default (so that is quite convenient).\n\n' - printf ' -!- If there are files *not* starting with an underscore from an older\n' - printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n' - printf ' -!- Delete the files for example via running:\n\n' - printf " rm ${xof}\n\n" - printf ' -!- Note, that this message will *not* go away, unless you yourself\n' - printf ' -!- resolve the situation manually.\n\n' - BROKEN_COMPLETION_DIR=1 -fi -unset xof -# }}} - # {{{ set some variables if check_com -c vim ; then #v# @@ -680,19 +587,6 @@ zle -N insert-unicode-char #k# Insert Unicode character bindkey '^Xi' insert-unicode-char -# just type 'cd ...' to get 'cd ../..' -# rationalise-dot() { -# if [[ $LBUFFER == *.. ]] ; then -# LBUFFER+=/.. -# else -# LBUFFER+=. -# fi -# } -# zle -N rationalise-dot -# bindkey . rationalise-dot - -# bindkey '\eq' push-line-or-edit - ## toggle the ,. abbreviation feature on/off # NOABBREVIATION: default abbreviation-state # 0 - enabled (default) @@ -729,6 +623,11 @@ zle -N slash-backward-kill-word #k# Kill everything in a word up to its last \kbd{/} bindkey '\ev' slash-backward-kill-word +# use the new *-pattern-* widgets for incremental history search +if is439 ; then + bindkey '^r' history-incremental-pattern-search-backward + bindkey '^s' history-incremental-pattern-search-forward +fi # }}} # a generic accept-line wrapper {{{ @@ -751,7 +650,7 @@ bindkey '\ev' slash-backward-kill-word zstyle ':acceptline:*' rehash true function Accept-Line() { - setopt localoptions noksharrays + emulate -L zsh local -a subs local -xi aldone local sub @@ -770,6 +669,7 @@ function Accept-Line() { } function Accept-Line-getdefault() { + emulate -L zsh local default_action zstyle -s ":acceptline:${alcontext}" default_action default_action @@ -784,7 +684,7 @@ function Accept-Line-getdefault() { } function accept-line() { - setopt localoptions noksharrays + emulate -L zsh local -a cmdline local -x alcontext local buf com fname format msg default_action @@ -938,7 +838,9 @@ 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 -zrcautoload run-help # use via 'esc-h' +for rh in run-help{,-git,-svk,-svn}; do + zrcautoload $rh +done; unset rh # completion system if zrcautoload compinit ; then @@ -1064,10 +966,12 @@ if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then fi chpwd() { + local -ax my_stack + my_stack=( ${PWD} ${dirstack} ) if is42 ; then - builtin print -l ${(u)dirstack} >! ${DIRSTACKFILE} + builtin print -l ${(u)my_stack} >! ${DIRSTACKFILE} else - uprint dirstack >! ${DIRSTACKFILE} + uprint my_stack >! ${DIRSTACKFILE} fi } @@ -1704,30 +1608,38 @@ VCS_INFO_git_getaction () { #{{{ } # }}} VCS_INFO_git_getbranch () { #{{{ - local gitbranch gitdir=$1 + local gitbranch gitdir=$1 tmp actiondir local gitsymref='git symbolic-ref HEAD' - if [[ -d "${gitdir}/rebase-apply" ]] \ - || [[ -d "${gitdir}/rebase" ]] \ - || [[ -d "${gitdir}/../.dotest" ]] \ - || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then + actiondir='' + for tmp in "${gitdir}/rebase-apply" \ + "${gitdir}/rebase" \ + "${gitdir}/../.dotest"; do + if [[ -d ${tmp} ]]; then + actiondir=${tmp} + break + fi + done + if [[ -n ${actiondir} ]]; then + gitbranch="$(${(z)gitsymref} 2> /dev/null)" + [[ -z ${gitbranch} ]] && [[ -r ${actiondir}/head-name ]] \ + && gitbranch="$(< ${actiondir}/head-name)" + + elif [[ -f "${gitdir}/MERGE_HEAD" ]] ; then gitbranch="$(${(z)gitsymref} 2> /dev/null)" - [[ -z ${gitbranch} ]] && [[ -r ${gitdir}/rebase-apply/head-name ]] \ - && gitbranch="$(< ${gitdir}/rebase-apply/head-name)" + [[ -z ${gitbranch} ]] && gitbranch="$(< ${gitdir}/MERGE_HEAD)" - elif [[ -f "${gitdir}/rebase-merge/interactive" ]] \ - || [[ -d "${gitdir}/rebase-merge" ]] ; then + elif [[ -d "${gitdir}/rebase-merge" ]] ; then gitbranch="$(< ${gitdir}/rebase-merge/head-name)" - elif [[ -f "${gitdir}/.dotest-merge/interactive" ]] \ - || [[ -d "${gitdir}/.dotest-merge" ]] ; then + elif [[ -d "${gitdir}/.dotest-merge" ]] ; then gitbranch="$(< ${gitdir}/.dotest-merge/head-name)" else gitbranch="$(${(z)gitsymref} 2> /dev/null)" if [[ $? -ne 0 ]] ; then - gitbranch="$(git describe --exact-match HEAD 2>/dev/null)" + gitbranch="refs/tags/$(git describe --exact-match HEAD 2>/dev/null)" if [[ $? -ne 0 ]] ; then gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..." @@ -1735,7 +1647,7 @@ VCS_INFO_git_getbranch () { #{{{ fi fi - printf '%s' "${gitbranch##refs/heads/}" + printf '%s' "${gitbranch##refs/[^/]##/}" return 0 } # }}} @@ -1827,6 +1739,7 @@ VCS_INFO_detect_by_dir() { #{{{ realbasedir="$(VCS_INFO_realpath ${basedir})" while [[ ${realbasedir} != '/' ]]; do + [[ -r ${realbasedir} ]] || return 1 if [[ -n ${vcs_comm[detect_need_file]} ]] ; then [[ -d ${basedir}/${dirname} ]] && \ [[ -e ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \ @@ -1948,6 +1861,7 @@ vcs_info_printsys () { # {{{ } # }}} vcs_info_lastmsg () { # {{{ + emulate -L zsh local -i i VCS_INFO_maxexports @@ -1963,6 +1877,11 @@ vcs_info_lastmsg () { # {{{ } # }}} vcs_info () { # {{{ + emulate -L zsh + setopt extendedglob + + [[ -r . ]] || return 1 + local pat local -i found local -a VCSs disabled dps @@ -2078,6 +1997,26 @@ setopt prompt_subst # make sure to use right prompt only when not running a command is41 && setopt transient_rprompt + +function ESC_print () { + info_print $'\ek' $'\e\\' "$@" +} +function set_title () { + info_print $'\e]0;' $'\a' "$@" +} + +function info_print () { + local esc_begin esc_end + esc_begin="$1" + esc_end="$2" + shift 2 + printf '%s' ${esc_begin} + for item in "$@" ; do + printf '%s ' "$item" + done + printf '%s' "${esc_end}" +} + # TODO: revise all these NO* variables and especially their documentation # in zsh-help() below. is4 && [[ $NOPRECMD -eq 0 ]] && precmd () { @@ -2087,9 +2026,9 @@ is4 && [[ $NOPRECMD -eq 0 ]] && precmd () { if [[ $TERM == screen* ]] ; then if [[ -n ${VCS_INFO_message_1_} ]] ; then - print -nP "\ek${VCS_INFO_message_1_}\e\\" + ESC_print ${VCS_INFO_message_1_} else - print -nP "\ekzsh\e\\" + ESC_print "zsh" fi fi # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT @@ -2107,7 +2046,7 @@ is4 && [[ $NOPRECMD -eq 0 ]] && precmd () { [[ ${NOTITLE} -gt 0 ]] && return 0 case $TERM in (xterm*|rxvt*) - print -Pn "\e]0;%n@%m: %~\a" + set_title ${(%):-"%n@%m: %~"} ;; esac } @@ -2125,13 +2064,13 @@ preexec () { if [[ "$TERM" == screen* ]] ; then # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # don't use hostname local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname - echo -ne "\ek$CMD\e\\" + ESC_print ${CMD} fi # adjust title of xterm [[ ${NOTITLE} -gt 0 ]] && return 0 case $TERM in (xterm*|rxvt*) - print -Pn "\e]0;%n@%m: $1\a" + set_title "${(%):-"%n@%m:"}" "$1" ;; esac } @@ -2154,7 +2093,7 @@ else # set variable identifying the chroot you work in (used in the prompt below) if [[ $GRMLPROMPT -gt 0 ]] ; then PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D -${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " +${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# " else # This assembles the primary prompt string if (( EUID != 0 )); then @@ -2231,7 +2170,7 @@ alias rm='nocorrect rm' # no spelling correction on rm #a1# Execute \kbd{rmdir} alias rd='rmdir' -#a1# Execute \kbd{rmdir} +#a1# Execute \kbd{mkdir} alias md='mkdir' # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details @@ -2266,7 +2205,6 @@ swspeak() { export PS1="%m%# " /usr/sbin/swspeak-setup $@ else # old version: - aumix -w 90 -v 90 -p 90 -m 90 if ! [[ -r /dev/softsynth ]] ; then flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?" return 1 @@ -2433,12 +2371,17 @@ if check_com -c grep-status ; then 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 - alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore. +if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord; then + if check_com -c wodim; then + cdrecord() { + cat <&2 + return 1 + fi + + exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ${shell} } # a wrapper for vim, that deals with title setting @@ -3097,6 +3039,41 @@ exit 0; return $? } +ssl_hashes=( sha512 sha256 sha1 md5 ) + +for sh in ${ssl_hashes}; do + ssl-cert-${sh}() { + emulate -L zsh + if [[ -z $1 ]] ; then + printf 'usage: %s \n' "ssh-cert-${sh}" + return 1 + fi + openssl x509 -noout -fingerprint -${sh} -in $1 + } +done; unset sh + +ssl-cert-fingerprints() { + emulate -L zsh + local i + if [[ -z $1 ]] ; then + printf 'usage: ssl-cert-fingerprints \n' + return 1 + fi + for i in ${ssl_hashes} + do ssl-cert-$i $1; + done +} + +ssl-cert-info() { + emulate -L zsh + if [[ -z $1 ]] ; then + printf 'usage: ssl-cert-info \n' + return 1 + fi + openssl x509 -noout -text -in $1 + ssl-cert-fingerprints $1 +} + # }}} # {{{ make sure our environment is clean regarding colors @@ -3171,20 +3148,6 @@ alias CO="./configure" #a2# Execute \kbd{./configure --help} alias CH="./configure --help" -# arch/tla stuff -if check_com -c tla ; then - #a2# Execute \kbd{tla what-changed --diffs | less} - alias tdi='tla what-changed --diffs | less' - #a2# Execute \kbd{tla-buildpackage} - alias tbp='tla-buildpackage' - #a2# Execute \kbd{tla archive-mirror} - alias tmi='tla archive-mirror' - #a2# Execute \kbd{tla commit} - alias tco='tla commit' - #a2# Execute \kbd{tla star-merge} - alias tme='tla star-merge' -fi - # listing stuff #a2# Execute \kbd{ls -lSrah} alias dir="ls -lSrah" @@ -3195,9 +3158,9 @@ alias lsa='ls -a .*(.)' # only show dot-files #a2# Only files with setgid/setuid/sticky flag alias lss='ls -l *(s,S,t)' # only files with setgid/setuid/sticky flag #a2# Only show 1st ten symlinks -alias lsl='ls -l *(@[1,10])' # only symlinks +alias lsl='ls -l *(@)' # only symlinks #a2# Display only executables -alias lsx='ls -l *(*[1,10])' # only executables +alias lsx='ls -l *(*)' # only executables #a2# Display world-{readable,writable,executable} files alias lsw='ls -ld *(R,W,X.^ND/)' # world-{readable,writable,executable} files #a2# Display the ten biggest files @@ -3227,8 +3190,6 @@ alias r-x='chmod 755' #a2# Execute \kbd{mkdir -o} alias md='mkdir -p' -check_com -c ipython && alias ips='ipython -p sh' - # console stuff #a2# Execute \kbd{mplayer -vo fbdev} alias cmplayer='mplayer -vo fbdev' @@ -3247,12 +3208,6 @@ check_com -c python && alias http="python -m SimpleHTTPServer" # Use 'g' instead of 'git': check_com g || alias g='git' -# check whether Debian's package management (dpkg) is running -if check_com salias ; then - #a2# Check whether a dpkg instance is currently running - salias check_dpkg_running="dpkg_running" -fi - # work around non utf8 capable software in utf environment via $LANG and luit if check_com isutfenv && check_com luit ; then if check_com -c mrxvt ; then @@ -3422,7 +3377,11 @@ disassemble(){ } #f5# Firefox remote control - open given URL fir() { - firefox -a firefox -remote "openURL($1)" + if [ -e /etc/debian_version ]; then + firefox -a iceweasel -remote "openURL($1)" || firefox ${1}& + else + firefox -a firefox -remote "openURL($1)" || firefox ${1}& + fi } #f5# Create Directoy and \kbd{cd} to it mcd() { @@ -3436,26 +3395,16 @@ mdiff() { memusage() { ps aux | awk '{if (NR > 1) print $5; if (NR > 2) print "+"} END { print "p" }' | dc } -#f5# Show contents of tar file +#f5# Show contents of gzipped tar file shtar() { emulate -L zsh gunzip -c $1 | tar -tf - -- | $PAGER } -#f5# Show contents of tgz file -shtgz() { - emulate -L zsh - tar -ztf $1 | $PAGER -} #f5# Show contents of zip file shzip() { emulate -L zsh unzip -l $1 | $PAGER } -#f5# Greps signature from file -sig() { - emulate -L zsh - agrep -d '^-- $' "$*" ~/.Signature -} #f5# Unified diff udiff() { emulate -L zsh @@ -3467,17 +3416,6 @@ viless() { vim --cmd 'let no_plugin_maps = 1' -c "so \$VIMRUNTIME/macros/less.vim" "${@:--}" } -# download video from youtube -ytdl() { - emulate -L zsh - if ! [[ -n "$2" ]] ; then - print "Usage: ydtl http://youtube.com/watch?v=.... outputfile.flv">&2 - return 1 - else - wget -O${2} "http://youtube.com/get_video?"${${${"$(wget -o/dev/null -O- "${1}" | grep -e watch_fullscreen)"}##*watch_fullscreen\?}%%\&fs=*} - fi -} - # Function Usage: uopen $URL/$file #f5# Download a file and display it locally uopen() { @@ -3517,7 +3455,7 @@ limg() { if [[ $#images -eq 0 ]] ; then print "No image files found" else - ls "$@" "$images[@]" + ls "$images[@]" fi } @@ -3606,7 +3544,7 @@ purge() { rm ${FILES} echo ">> $PWD purged, $NBFILES files removed" else - echo "Ok. .. than not.." + echo "Ok. .. then not.." fi fi } @@ -3774,19 +3712,8 @@ ansi-colors() { done } -# suidfind() { ls -latg $path | grep '^...s' } #f5# Find all files in \$PATH with setuid bit set -suidfind() { ls -latg $path/*(sN) } - -# See above but this is /better/ ... anywise .. -findsuid() { - print 'Output will be written to ~/suid_* ...' - $SUDO find / -type f \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suidfiles.`date "+%Y-%m-%d"`.out 2>&1 - $SUDO find / -type d \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suiddirs.`date "+%Y-%m-%d"`.out 2>&1 - $SUDO find / -type f \( -perm -2 -o -perm -20 \) -ls > ~/suid_writefiles.`date "+%Y-%m-%d"`.out 2>&1 - $SUDO find / -type d \( -perm -2 -o -perm -20 \) -ls > ~/suid_writedirs.`date "+%Y-%m-%d"`.out 2>&1 - print 'Finished' -} +suidfind() { ls -latg $path | grep '^...s' } # TODO: So, this is the third incarnation of this function!? #f5# Reload given functions @@ -4091,16 +4018,6 @@ exirename() { fi } -# open file in vim and jump to line -# http://www.downgra.de/archives/2007/05/08/T19_21_11/ -j2v() { - emulate -L zsh - local -a params - params=(${*//(#m):[0-9]*:/\\n+${MATCH//:/}}) # replace ':23:' to '\n+23' - params=(${(s|\n|)${(j|\n|)params}}) # join array using '\n', then split on all '\n' - vim ${params} -} - # get_ic() - queries imap servers for capabilities; real simple. no imaps ic_get() { emulate -L zsh @@ -4516,15 +4433,11 @@ if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then unset abk[V] unalias 'V' &> /dev/null unfunction vman &> /dev/null - unfunction vimpm &> /dev/null - unfunction vimhelp &> /dev/null unfunction viless &> /dev/null unfunction 2html &> /dev/null # manpages are not in grmlsmall unfunction manzsh &> /dev/null - unalias man2 &> /dev/null - unalias man &> /dev/null unfunction man2 &> /dev/null fi @@ -4545,3 +4458,6 @@ zrclocal ## END OF FILE ################################################################# # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4 +# Local variables: +# mode: sh +# End: