zshrc: alias remove current working diretory
[grml-etc-core.git] / etc / zsh / zshrc
index 9767008..65f457f 100644 (file)
@@ -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
@@ -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)$(</proc/mounts)[@]}" ) mountinfo["${cline[(w)1]:A}"]="${cline[(w)2,-1]}"
         for dev in "$disks[@]"; do
             print ${fg_bold[red]}${dev}${reset_color} /dev/disk/by-label/*(@e/'[[ ${REPLY:A} == $dev ]] && REPLY=${fg[blue]}LABEL=${REPLY:t}${reset_color}'/N) /dev/disk/by-uuid/*(@e/'[[ ${REPLY:A} == $dev ]] && REPLY=${fg[green]}UUID=${REPLY:t}${reset_color}'/N)
-            print -f "  %s\n" /dev/disk/by-id/*(@e/'[[ ${REPLY:A} == $dev ]]'/N:t)
+            [[ -n "${mountinfo["$dev"]}" ]] && print -f " Mount: %s -t %s -o %s\n" ${mountinfo["$dev"][(w)1]} ${mountinfo["$dev"][(w)2]} "${mountinfo["$dev"][(w)3,-5]}"
+            for sysdevsize ( /sys/block/${dev:t}/size(N) /sys/block/${${dev:t}%%<->}/${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 -xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr
                 else
-                    highlight --ansi --syntax ${lang} ${2} | less -SMr
+                    highlight -ansi --syntax ${lang} ${2} | less -SMr
                 fi
                 ;;
         esac