/etc/zsh/zshrc: unalias utf2iso and iso2utf only it it is set
[grml-etc-core.git] / etc / zsh / zshrc
index 038ab43..0f43289 100644 (file)
@@ -3,7 +3,7 @@
 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Mit Jun 20 10:28:28 CEST 2007 [mika]
+# Latest change: Sam Sep 15 10:24:10 CEST 2007 [mika]
 ################################################################################
 # This file is sourced only for interactive shells. It
 # should contain commands to set up aliases, functions,
 # Global Order: zshenv, zprofile, zshrc, zlogin
 ################################################################################
 
+# zsh-refcard-tag documentation: {{{
+#   You may notice strange looking comments in the zshrc (and ~/.zshrc as
+#   well). These are there for a purpose. grml's zsh-refcard can now be
+#   automatically generated from the contents of the actual configuration
+#   files. However, we need a little extra information on which comments
+#   and what lines of code to take into account (and for what purpose).
+#
+# Here is what they mean:
+#
+# List of tags (comment types) used:
+#   #a#     Next line contains an important alias, that should
+#           be included in the grml-zsh-refcard.
+#           (placement tag: @@INSERT-aliases@@)
+#   #f#     Next line contains the beginning of an important function.
+#           (placement tag: @@INSERT-functions@@)
+#   #v#     Next line contains an important variable.
+#           (placement tag: @@INSERT-variables@@)
+#   #k#     Next line contains an important keybinding.
+#           (placement tag: @@INSERT-keybindings@@)
+#   #d#     Hashed directories list generation:
+#               start   denotes the start of a list of 'hash -d'
+#                       definitions.
+#               end     denotes its end.
+#           (placement tag: @@INSERT-hasheddirs@@)
+#   #A#     Abbreviation expansion list generation:
+#               start   denotes the beginning of abbreviations.
+#               end     denotes their end.
+#           Lines within this section that end in '#d .*' provide
+#           extra documentation to be included in the refcard.
+#           (placement tag: @@INSERT-abbrev@@)
+#   #m#     This tag allows you to manually generate refcard entries
+#           for code lines that are hard/impossible to parse.
+#               Example:
+#                   #m# k ESC-h Call the run-help function
+#               That would add a refcard entry in the keybindings table
+#               for 'ESC-h' with the given comment.
+#           So the syntax is: #m# <section> <argument> <comment>
+#   #o#     This tag lets you insert entries to the 'other' hash.
+#           Generally, this should not be used. It is there for
+#           things that cannot be done easily in another way.
+#           (placement tag: @@INSERT-other-foobar@@)
+#
+#   All of these tags (except for m and o) take two arguments, the first
+#   within the tag, the other after the tag:
+#
+#   #<tag><section># <comment>
+#
+#   Where <section> is really just a number, which are defined by the
+#   @secmap array on top of 'genrefcard.pl'. The reason for numbers
+#   instead of names is, that for the reader, the tag should not differ
+#   much from a regular comment. For zsh, it is a regular comment indeed.
+#   The numbers have got the following meanings:
+#         0 -> "default"
+#         1 -> "system"
+#         2 -> "user"
+#         3 -> "debian"
+#         4 -> "search"
+#         5 -> "shortcuts"
+#         6 -> "services"
+#
+#   So, the following will add an entry to the 'functions' table in the
+#   'system' section, with a (hopefully) descriptive comment:
+#       #f1# Edit an alias via zle
+#       edalias() {
+#
+#   It will then show up in the @@INSERT-aliases-system@@ replacement tag
+#   that can be found in 'grml-zsh-refcard.tex.in'.
+#   If the section number is omitted, the 'default' section is assumed.
+#   Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
+#   exactly the same as @@INSERT-aliases-default@@. If you want a list of
+#   *all* aliases, for example, use @@INSERT-aliases-all@@.
+#}}}
+
 # zsh profiling {{{
 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
   if [[ -n $ZSH_PROFILE_RC ]] ; then
   #f1# Checks whether or not you're running grml-small
     isgrmlsmall() {
     [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
-  }
+    }
   else
     isgrmlsmall() { return 1 }
   fi
   export MAIL=${MAIL:-/var/mail/$USER}
   # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
   export SHELL='/bin/zsh'
-  [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
   [ -x $(which dircolors) ] && eval `dircolors -b`
 
-# Search path for the cd comman
+# Search path for the cd command
 #  cdpath=(.. ~)
 
 # completion functions go to /etc/zsh/completion.d
@@ -358,7 +430,7 @@ fi
   # fi
   alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
 
-  #m# k ESC-h Call \kbd{run-help} for the 1st word on the commandline
+  #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
   alias run-help >&/dev/null && unalias run-help
   autoload run-help # use via 'esc-h'
 
@@ -405,8 +477,8 @@ fi
 
 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
   _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
-  #k# Insert a timestamp on the commandline (yyyy-mm-dd)
-  bindkey '\C-ed' _bkdate
+  #k# Insert a timestamp on the command line (yyyy-mm-dd)
+  bindkey '^Ed' _bkdate
   zle -N _bkdate
 
 # press esc-m for inserting last typed word again (thanks to caphuso!)
@@ -436,11 +508,12 @@ fi
 #  zle -N mquote && bindkey '^q' mquote
 
 # run command line as user root via sudo:
-  _sudo-command-line() {
-    [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
+  sudo-command-line() {
+    [[ -z $BUFFER ]] && zle up-history
+    [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
   }
-  zle -N sudo-command-line _sudo-command-line
-#k# Put the current commandline into a \kbd{sudo} call
+  zle -N sudo-command-line
+#k# Put the current command line into a \kbd{sudo} call
   bindkey "^Os" sudo-command-line
 
 ### jump behind the first word on the cmdline.
@@ -494,9 +567,10 @@ fi
   setopt auto_pushd           # make cd push the old directory onto the directory stack.
   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.
 
   MAILCHECK=30       # mailchecks
-  REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 secondes
+  REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 seconds
   watch=(notme root) # watch for everyone but me and root
 
 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
@@ -528,7 +602,7 @@ fi
 # dirstack handling {{{
   DIRSTACKSIZE=20
   if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
-     dirstack=( ${(uf)"$(< ~/.zdirs)"} )
+     dirstack=( ${(f)"$(< ~/.zdirs)"} )
      # "cd -" won't work after login by just setting $OLDPWD, so
      [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
   fi
@@ -602,7 +676,7 @@ fi
   # get the name of the program currently running and hostname of local machine
   # set screen window title if running in a screen
       if [[ "$TERM" == screen* ]]; then
-         # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # dont't use hostname
+         # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # don't use hostname
          local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
          echo -ne "\ek$CMD\e\\"
       fi
@@ -716,6 +790,11 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
   alias mdstat='cat /proc/mdstat'
   alias ...='cd ../../'
 
+  # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
+  if [ -x /sbin/kexec -a -r /proc/cmdline ] ; then
+     alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
+  fi
+
   alias cp='nocorrect cp'         # no spelling correction on cp
   alias mkdir='nocorrect mkdir'   # no spelling correction on mkdir
   alias mv='nocorrect mv'         # no spelling correction on mv
@@ -730,16 +809,23 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
   alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
   alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
 
-  alias utf2iso='if isutfenv ; then
-   for ENV in `env | grep UTF` ; do
-       eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
-   done
-   fi'
-  alias iso2utf='if isutfenv ; then
-   for ENV in `env | grep '\.iso'` ; do
-       eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
-   done
-   fi'
+  type utf2iso &>/dev/null && unalias utf2iso # make sure it is not assigned yet
+  utf2iso() {
+    if isutfenv ; then
+       for ENV in $(env | command grep -i '.utf') ; do
+           eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
+       done
+     fi
+  }
+
+  type iso2utf &>/dev/null && unalias iso2utf # make sure it is not assigned yet
+  iso2utf() {
+   if ! isutfenv ; then
+      for ENV in $(env | command grep -i '\.iso') ; do
+          eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
+      done
+   fi
+ }
 
 # set up software synthesizer via speakup
   alias swspeak='
@@ -760,6 +846,13 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
 # I like clean prompt, so provide simple way to get that
   alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
 
+# for really lazy people like mika:
+  type S &>/dev/null || alias S='screen'
+  type s &>/dev/null || alias s='ssh'
+
+# get top 10 shell commands:
+  alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
+
 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
   if [ -x $(which truecrypt) ] ; then
      if isutfenv ; then
@@ -837,8 +930,8 @@ Enjoy your grml system with the zsh!$reset_color"
     salias ag="apt-get upgrade"
     #a3# Execute \kbd{apt-get update}
     salias au="apt-get update"
-    #a3# Execute \kbd{aptitude update ; aptitude upgrade}
-    salias -a up="aptitude update ; aptitude upgrade"
+    #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
+    salias -a up="aptitude update ; aptitude safe-upgrade"
     #a3# Execute \kbd{dpkg-buildpackage}
     alias dbp='dpkg-buildpackage'
     #a3# Execute \kbd{grep-excuses}
@@ -864,7 +957,7 @@ Enjoy your grml system with the zsh!$reset_color"
     }
 
     isgrmlcd && alias su="sudo -s"          # get a root shell
-    #a1# Take a look at the syslog: \kbd{$PAGER /var/log/syslog}
+    #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
     alias llog="$PAGER /var/log/syslog"     # take a look at the syslog
     #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
     alias tlog="tail -f /var/log/syslog"    # follow the syslog
@@ -896,7 +989,7 @@ Please use the wodim binary instead' ; return 1"
      }
   fi
 
-# I hate lacking backward compability, so provide an alternative therefore
+# I hate lacking backward compatibility, so provide an alternative therefore
   if ! [ -x $(which apache2-ssl-certificate) ] ; then
      apache2-ssl-certificate(){
 
@@ -932,7 +1025,7 @@ Run "grml-tips ssl-certificate" if you need further instructions.
 grmlcomp() {
 ## completion system
   zstyle ':completion:*:approximate:'    max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
-  zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
+  zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)' # don't complete backup files as executables
   zstyle ':completion:*:correct:*'       insert-unambiguous true             # start menu completion only if it could find no unambiguous initial string
   zstyle ':completion:*:corrections'     format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
   zstyle ':completion:*:correct:*'       original true                       #
@@ -976,20 +1069,20 @@ grmlcomp() {
     }
 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
   if [[ -n "$NOCOR" ]] ; then
-    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
+    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
     setopt nocorrect # do not try to correct the spelling if possible
   else
-#    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
+#    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _ignored _correct _approximate _files
     setopt correct  # try to correct the spelling if possible
     zstyle -e ':completion:*' completer '
         if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
           _last_try="$HISTNO$BUFFER$CURSOR"
-          reply=(_complete _match _prefix _files)
+          reply=(_complete _match _ignored _prefix _files)
         else
           if [[ $words[1] = (rm|mv) ]]; then
             reply=(_complete _files)
           else
-            reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
+            reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
           fi
         fi'
   fi
@@ -1067,7 +1160,7 @@ grmlstuff() {
 # people should use 'grml-x'!
   startx() {
     if [ -e /etc/X11/xorg.conf ] ; then
-       [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
+       [ -x /usr/bin/startx ] && /usr/bin/startx "$@" || /usr/X11R6/bin/startx "$@"
     else
       echo "Please use the script \"grml-x\" for starting the X Window System
 because there does not exist /etc/X11/xorg.conf yet.
@@ -1169,6 +1262,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
   else
      manzsh()  { /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
      # manzsh()  { /usr/bin/man zshall |  most +/"$1" ; }
+     # [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
      # manzsh()  { man zshall | $MYLESS -p $1 ; }
   fi
 
@@ -1177,9 +1271,16 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
     dchange() {
       if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
          most /usr/share/doc/${1}/changelog.Debian.gz
+      elif [ -r /usr/share/doc/${1}/changelog.gz ] ; then
+         most /usr/share/doc/${1}/changelog.gz
       else
-         if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
-            most /usr/share/doc/${1}/changelog.gz
+         if type -p aptitude &>/dev/null ; then
+            echo "No changelog for package $1 found, using aptitude to retrieve it."
+            if isgrml ; then
+              aptitude -t unstable changelog ${1}
+            else
+              aptitude changelog ${1}
+            fi
          else
             echo "No changelog for package $1 found, sorry."
             return 1
@@ -1245,8 +1346,6 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
   for i in Start Restart Stop Force-Reload Reload ; do
     eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
   done
-  # now the completion for this:
-  compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
  fi
 
   #f1# Provides useful information on globbing
@@ -1306,7 +1405,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
   fi
   }
 
-  # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
+  # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
   # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
   [ -r /proc/1/maps ] && deswap() {
      print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
@@ -1340,13 +1439,8 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 
   # just press 'asdf' keys to toggle between dvorak and us keyboard layout
   aoeu() {
-     if [ -n "$XKEYBOARD" -a -n "$KEYTABLE" ] ; then
-        echo -n "Switching to $KEYTABLE keyboard layout: "
-        [ -z "$DISPLAY" ] && $SUDO loadkeys $KEYTABLE &>/dev/null || setxkbmap $XKEYBOARD &>/dev/null
-     else
-        echo -n 'Switching to us keyboard layout: '
-        [ -z "$DISPLAY" ] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
-     fi
+     echo -n 'Switching to us keyboard layout: '
+     [ -z "$DISPLAY" ] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
      echo 'Done'
   }
   asdf() {
@@ -1444,7 +1538,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 # }}}
 
 ## genrefcard.pl settings {{{
-### example: split funtions-search 8,16,24,32
+### example: split functions-search 8,16,24,32
 #@# split functions-search 8
 ## }}}