X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=f07fb67a153880436a35f3a0d79d7b81c7e8b2aa;hb=ba50de94fa8728459333e95a5019d1cfbf23dd78;hp=efb6113b0d2fa1c5e72ff8fb0ad96ab16416f2d8;hpb=6f323a73d1a65855ba847d2f2c64a6ccc10542ba;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index efb6113..f07fb67 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 # }}} @@ -617,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 {{{ @@ -639,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 @@ -658,6 +669,7 @@ function Accept-Line() { } function Accept-Line-getdefault() { + emulate -L zsh local default_action zstyle -s ":acceptline:${alcontext}" default_action default_action @@ -672,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 @@ -1596,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]}..." @@ -1627,7 +1647,7 @@ VCS_INFO_git_getbranch () { #{{{ fi fi - printf '%s' "${gitbranch##refs/heads/}" + printf '%s' "${gitbranch##refs/[^/]##/}" return 0 } # }}} @@ -1719,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]} ]] && \ @@ -1840,6 +1861,7 @@ vcs_info_printsys () { # {{{ } # }}} vcs_info_lastmsg () { # {{{ + emulate -L zsh local -i i VCS_INFO_maxexports @@ -1855,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 @@ -1970,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 () { @@ -1979,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 @@ -1999,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 } @@ -2017,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 } @@ -2123,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 @@ -2158,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 @@ -2907,9 +2953,17 @@ iwclient() { salias dhclient "$(wavemon -d | awk '/device/{print $2}')" } -# spawn a minimally set up ksh - useful if you want to umount /usr/. +# spawn a minimally set up mksh - useful if you want to umount /usr/. minimal-shell() { - exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh + emulate -L zsh + local shell="/bin/mksh" + + if ! check_com -c ${shell}; then + printf '`%s'\'' not available, giving up.\n' ${shell} >&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 @@ -2985,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 @@ -3929,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 @@ -4379,3 +4458,6 @@ zrclocal ## END OF FILE ################################################################# # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4 +# Local variables: +# mode: sh +# End: