X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=65f457ff22f938fae1866a3d7a745c985c7006a6;hb=5173aead615141e4e777e692cef94ae86d6a74d6;hp=3c472d638af4fb1e2a9b8221b7ad2a8c73876bc0;hpb=95eeb86221ce6741286b1b15b7e1ce353b04c9ad;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 3c472d6..65f457f 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -715,10 +715,11 @@ fi zstyle ':acceptline:*' rehash true function Accept-Line() { - emulate -L zsh + setopt localoptions noksharrays local -a subs local -xi aldone local sub + local alcontext=${1:-$alcontext} zstyle -a ":acceptline:${alcontext}" actions subs @@ -748,9 +749,17 @@ function Accept-Line-getdefault() { esac } +function Accept-Line-HandleContext() { + zle Accept-Line + + default_action=$(Accept-Line-getdefault) + zstyle -T ":acceptline:${alcontext}" call_default \ + && zle ${default_action} +} + function accept-line() { - emulate -L zsh - local -a cmdline + setopt localoptions noksharrays + local -ax cmdline local -x alcontext local buf com fname format msg default_action @@ -760,11 +769,14 @@ function accept-line() { com="${cmdline[1]}" fname="_${com}" + Accept-Line 'preprocess' + zstyle -t ":acceptline:${alcontext}" rehash \ && [[ -z ${commands[$com]} ]] \ && rehash - if [[ -n ${reswords[(r)$com]} ]] \ + if [[ -n ${com} ]] \ + && [[ -n ${reswords[(r)$com]} ]] \ || [[ -n ${aliases[$com]} ]] \ || [[ -n ${functions[$com]} ]] \ || [[ -n ${builtins[$com]} ]] \ @@ -772,11 +784,8 @@ function accept-line() { # there is something sensible to execute, just do it. alcontext='normal' - zle Accept-Line + Accept-Line-HandleContext - default_action=$(Accept-Line-getdefault) - zstyle -T ":acceptline:${alcontext}" call_default \ - && zle ${default_action} return fi @@ -792,49 +801,45 @@ function accept-line() { # Okay, we warned the user before, he called us again, # so have it his way. alcontext='force' - zle Accept-Line + Accept-Line-HandleContext - default_action=$(Accept-Line-getdefault) - zstyle -T ":acceptline:${alcontext}" call_default \ - && zle ${default_action} return fi - # prepare warning message for the user, configurable via zstyle. - zstyle -s ":acceptline:${alcontext}" compwarnfmt msg + if zstyle -t ":acceptline:${alcontext}" nocompwarn ; then + alcontext='normal' + Accept-Line-HandleContext + else + # prepare warning message for the user, configurable via zstyle. + zstyle -s ":acceptline:${alcontext}" compwarnfmt msg - if [[ -z ${msg} ]] ; then - msg="%c will not execute and completion %f exists." - fi + if [[ -z ${msg} ]] ; then + msg="%c will not execute and completion %f exists." + fi - zformat -f msg "${msg}" "c:${com}" "f:${fname}" + zformat -f msg "${msg}" "c:${com}" "f:${fname}" - zle -M -- "${msg}" + zle -M -- "${msg}" + fi return elif [[ -n ${buf//[$' \t\n']##/} ]] ; then # If we are here, the commandline contains something that is not # executable, which is neither subject to _command_name correction # and is not empty. might be a variable assignment alcontext='misc' - zle Accept-Line + Accept-Line-HandleContext - default_action=$(Accept-Line-getdefault) - zstyle -T ":acceptline:${alcontext}" call_default \ - && zle ${default_action} return fi # If we got this far, the commandline only contains whitespace, or is empty. alcontext='empty' - zle Accept-Line - - default_action=$(Accept-Line-getdefault) - zstyle -T ":acceptline:${alcontext}" call_default \ - && zle ${default_action} + Accept-Line-HandleContext } zle -N accept-line zle -N Accept-Line +zle -N Accept-Line-HandleContext # }}} @@ -1072,7 +1077,7 @@ DIRSTACKFILE=${DIRSTACKFILE:-${HOME}/.zdirs} if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then dirstack=( ${(f)"$(< $DIRSTACKFILE)"} ) # "cd -" won't work after login by just setting $OLDPWD, so - [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD + [[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD fi chpwd() { @@ -1491,28 +1496,6 @@ iso2utf() { fi } -# set up software synthesizer via speakup -swspeak() { - if [ -x /usr/sbin/swspeak-setup ] ; then - setopt singlelinezle - unsetopt prompt_cr - export PS1="%m%# " - /usr/sbin/swspeak-setup $@ - else # old version: - if ! [[ -r /dev/softsynth ]] ; then - flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?" - return 1 - else - setopt singlelinezle - unsetopt prompt_cr - export PS1="%m%# " - nice -n -20 speechd-up - sleep 2 - flite -o play -t "Finished setting up software synthesizer" - fi - fi -} - # I like clean prompt, so provide simple way to get that check_com 0 || alias 0='return 0' @@ -1665,9 +1648,9 @@ if [[ -r /etc/debian_version ]] ; then fi # sort installed Debian-packages by size -if check_com -c grep-status ; then +if check_com -c dpkg-query ; then #a3# List installed Debian-packages sorted by size - alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd " \n" | sort -rn' + alias debs-by-size="dpkg-query -Wf 'x \${Installed-Size} \${Package} \${Status}\n' | sed -ne '/^x /d' -e '/^x \(.*\) install ok installed$/s//\1/p' | sort -nr" fi # if cdrecord is a symlink (to wodim) or isn't present at all warn: @@ -2126,6 +2109,8 @@ alias help-zshglob=H-Glob #v1# set number of lines to display per page HELP_LINES_PER_PAGE=20 +#v1# set location of help-zle cache file +HELP_ZLE_CACHE_FILE=~/.cache/zsh_help_zle_lines.zsh #f1# helper function for help-zle, actually generates the help text help_zle_parse_keybindings() { @@ -2136,6 +2121,12 @@ help_zle_parse_keybindings() #v1# choose files that help-zle will parse for keybindings ((${+HELPZLE_KEYBINDING_FILES})) || HELPZLE_KEYBINDING_FILES=( /etc/zsh/zshrc ~/.zshrc.pre ~/.zshrc ~/.zshrc.local ) + if [[ -r $HELP_ZLE_CACHE_FILE ]]; then + local load_cache=0 + for f ($KEYBINDING_FILES) [[ $f -nt $HELP_ZLE_CACHE_FILE ]] && load_cache=1 + [[ $load_cache -eq 0 ]] && . $HELP_ZLE_CACHE_FILE && return + fi + #fill with default keybindings, possibly to be overwriten 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 @@ -2214,6 +2205,9 @@ help_zle_parse_keybindings() done #sort lines alphabetically help_zle_lines=("${(i)help_zle_lines[@]}") + [[ -d ${HELP_ZLE_CACHE_FILE:h} ]] || mkdir -p "${HELP_ZLE_CACHE_FILE:h}" + echo "help_zle_lines=(${(q)help_zle_lines[@]})" >| $HELP_ZLE_CACHE_FILE + zcompile $HELP_ZLE_CACHE_FILE } typeset -g help_zle_sln typeset -g -a help_zle_lines @@ -2245,7 +2239,7 @@ any() { echo "any - grep for process(es) by keyword" >&2 echo "Usage: any " >&2 ; return 1 else - ps xauwww | grep --color=auto "[${1[1]}]${1[2,-1]}" + ps xauwww | grep -i --color=auto "[${1[1]}]${1[2,-1]}" fi } @@ -2273,17 +2267,6 @@ peval() { } functions peval &>/dev/null && alias calc=peval -# brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under -# certain circumstances, so work around it, no matter which environment we have -brltty() { - if [[ -z "$DISPLAY" ]] ; then - consolechars -f /usr/share/consolefonts/default8x16.psf.gz - command brltty "$@" - else - command brltty "$@" - fi -} - # just press 'asdf' keys to toggle between dvorak and us keyboard layout aoeu() { echo -n 'Switching to us keyboard layout: ' @@ -2583,8 +2566,10 @@ alias r--='chmod 644' alias r-x='chmod 755' # some useful aliases -#a2# Execute \kbd{mkdir -o} +#a2# Execute \kbd{mkdir -p} alias md='mkdir -p' +#a2# Remove current empty directory. Execute \kbd{cd ..; rmdir $OLDCWD} +alias rmcdir='cd ..; rmdir $OLDPWD || cd $OLDPWD' # console stuff #a2# Execute \kbd{mplayer -vo fbdev} @@ -2781,12 +2766,12 @@ fir() { } # smart cd function, allows switching to /etc when running 'cd /etc/fstab' cd() { - if [[ -f ${1} ]]; then + if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then [[ ! -e ${1:h} ]] && return 1 print "Correcting ${1} to ${1:h}" builtin cd ${1:h} else - builtin cd ${1} + builtin cd "$@" fi } @@ -2827,7 +2812,7 @@ inplaceMkDirs() { bufwords=(${(z)LBUFFER}) iword=${#bufwords} bufwords=(${(z)BUFFER}) - PATHTOMKDIR="$bufwords[iword]" + PATHTOMKDIR="${(Q)bufwords[iword]}" fi [[ -z "${PATHTOMKDIR}" ]] && return 1 if [[ -e "${PATHTOMKDIR}" ]]; then @@ -2979,8 +2964,9 @@ purge() { TEXTEMPFILES=(*.tex(N:s/%tex/'(log|toc|aux|nav|snm|out|tex.backup|bbl|blg|bib.backup|vrb|lof|lot|hd|idx)(N)'/)) GHCTEMPFILES=(*.(hs|lhs)(N:r:s/%/'.(hi|hc|(p|u|s)_(o|hi))(N)'/)) PYTEMPFILES=(*.py(N:s/%py/'(pyc|pyo)(N)'/)) - LONELY_MOOD_FILES=((*.mood)(NDe:'local -a AF;AF=( ${${REPLY#.}%mood}(mp3|flac|ogg|asf|wmv|aac)(N) ); [[ -z "$AF" ]]':)) - FILES=(*~(.N) \#*\#(.N) *.o(.N) a.out(.N) (*.|)core(.N) *.cmo(.N) *.cmi(.N) .*.swp(.N) *.(orig|rej)(.DN) *.dpkg-(old|dist|new)(DN) ._(cfg|mrg)[0-9][0-9][0-9][0-9]_*(N) ${~TEXTEMPFILES} ${~GHCTEMPFILES} ${~PYTEMPFILES} ${LONELY_MOOD_FILES}) + LONELY_MOOD_FILES=((*.mood)(.NDe:'local -a AF;AF=( ${${REPLY#.}%mood}(mp3|flac|ogg|asf|wmv|aac)(N) ); [[ -z "$AF" ]]':)) + ZSH_COMPILED=(*.zwc(.NDe:'[[ -f ${REPLY%.zwc} && ${REPLY%.zwc} -nt ${REPLY} ]]':)) + FILES=(*~(.N) \#*\#(.N) *.o(.N) a.out(.N) (*.|)core(.N) *.cmo(.N) *.cmi(.N) .*.swp(.N) *.(orig|rej)(.DN) *.dpkg-(old|dist|new)(DN) ._(cfg|mrg)[0-9][0-9][0-9][0-9]_*(N) ${~TEXTEMPFILES} ${~GHCTEMPFILES} ${~PYTEMPFILES} ${LONELY_MOOD_FILES} ${ZSH_COMPILED} ) local NBFILES=${#FILES} local CURDIRSUDO="" [[ ! -w ./ ]] && CURDIRSUDO=$SUDO @@ -2988,7 +2974,7 @@ purge() { print -l $FILES local ans echo -n "Remove these files? [y/n] " - read -q ans + read -q ans; echo if [[ $ans == "y" ]] ; then $CURDIRSUDO rm ${FILES} echo ">> $PWD purged, $NBFILES files removed" @@ -3004,10 +2990,16 @@ if is439 && [[ -d /dev/disk/by-id/ ]]; then emulate -L zsh setopt extendedglob local -a -U disks + local -A mountinfo disks=( /dev/disk/by-id/*(@:A) ) + [[ -r /proc/mounts ]] && for cline ( "${(f)$(}/${dev:t}/size(N) ) \ + print -f " Size: %.3f GiB (%d Byte)\n" $(($(<$sysdevsize)/(2.0*1024.0*1024.0))) $(($(<$sysdevsize)*512)) + + print -f " Id: %s\n" /dev/disk/by-id/*(@e/'[[ ${REPLY:A} == $dev ]]'/N:t) done } fi @@ -3290,8 +3282,9 @@ vman() { #f5# View all README-like files in current directory in pager readme() { emulate -L zsh + setopt extendedglob local files - files=(./(#i)*(read*me|lue*m(in|)ut)*(ND)) + files=(./(#i)*(read*me|lue*m(in|)ut|lies*mich)*(NDr^/=p%)) if (($#files)) ; then $PAGER $files else @@ -3465,53 +3458,6 @@ allulimit() { ulimit -t unlimited } -# 2mp3 transcodes flac and ogg to mp3 with bitrate of 192 while preserving basic tags -if check_com lame; then - 2mp3_192() { - emulate -L zsh - setopt extendedglob - unsetopt ksharrays - - local -a DECODE id3tags - local -A tagmap - local tagdata - local RC=0 - tagmap=("(#l)title" --tt "(#l)artist" --ta "(#l)tracknumber" --tn "(#l)genre" --tg "(#l)album" --tl) - - if [[ ${@[(i)*.ogg]} -le ${#@} ]] && ! check_com oggdec; then - echo "ERROR: please install oggdec" >&2 - return 1 - fi - if [[ ${@[(i)*.flac]} -le ${#@} ]] && ! check_com flac; then - echo "ERROR: please install flac" >&2 - return 1 - fi - - for af in "$@"; do - id3tags=() - case "$af" in - (*.flac) - DECODE=(flac -d -c "$af") - tagdata="$(metaflac --export-tags-to=- "$af")" - ;; - (*.ogg) - DECODE=(oggdec -Q -o - "$af") - tagdata="$(ogginfo "$af")" - ;; - (*) continue ;; - esac - for line (${(f)tagdata}) \ - [[ "$line" == (#s)[[:space:]]#(#b)([^=]##)=(*)(#e) && -n $tagmap[(k)$match[1]] ]] && \ - id3tags+=($tagmap[(k)$match[1]] "$match[2]") - [[ ${#id3tags} -gt 0 ]] && id3tags=(--add-id3v2 --ignore-tag-errors $id3tags) - $DECODE[*] | lame -b 192 -v -h --replaygain-fast "${id3tags[@]}" - "${af:r}.mp3" || {RC=$?; print "Error transcoding" "${af}"; } - done - # return 0 if no error or exit code if at least one error happened - return $RC - } - alias ogg2mp3_192 2mp3_192 -fi - #f5# RFC 2396 URL encoding in Z-Shell urlencode() { emulate -L zsh @@ -3633,9 +3579,9 @@ if check_com -c highlight ; then lang=${1%:*} [[ ${1} == *:* ]] && [[ -n ${1#*:} ]] && theme=${1#*:} if [[ -n ${theme} ]] ; then - highlight --xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr + highlight -O xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr else - highlight --ansi --syntax ${lang} ${2} | less -SMr + highlight -O ansi --syntax ${lang} ${2} | less -SMr fi ;; esac