zshrc: Set options a lot earlier and include no_sh_wordsplit
[grml-etc-core.git] / etc / zsh / zshrc
index c12227e..12a6100 100644 (file)
 # Global Order: zshenv, zprofile, zshrc, zlogin
 ################################################################################
 
+# Contributing:
+# If you want to help to improve grml's zsh setup, clone the grml-etc-core
+# repository from git.grml.org:
+#   git clone git://git.grml.org/grml-etc-core.git
+#
+# Make your changes, commit them; use 'git format-patch' to create a series
+# of patches and send those to the following address via 'git send-email':
+#   grml-etc-core@grml.org
+#
+# Doing so makes sure the right people get your patches for review and
+# possibly inclusion.
+
 # zsh-refcard-tag documentation: {{{
 #   You may notice strange looking comments in this file.
 #   These are there for a purpose. grml's zsh-refcard can now be
@@ -230,6 +242,42 @@ zrcautoload is-at-least || is-at-least() { return 1 }
 
 # }}}
 
+# {{{ set some important options (as early as possible)
+# Please update these tags, if you change the umask settings below.
+#o# r_umask     002
+#o# r_umaskstr  rwxrwxr-x
+#o# umask       022
+#o# umaskstr    rwxr-xr-x
+(( EUID != 0 )) && umask 002 || umask 022
+
+setopt append_history       # append history list to the history file (important for multiple parallel zsh sessions!)
+is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
+setopt extended_history     # save each command's beginning timestamp and the duration to the history file
+is4 && setopt histignorealldups # If  a  new  command  line being added to the history
+                            # list duplicates an older one, the older command is removed from the list
+setopt histignorespace      # remove command lines from the history list when
+                            # the first character on the line is a space
+setopt auto_cd              # if a command is issued that can't be executed as a normal command,
+                            # and the command is the name of a directory, perform the cd command to that directory
+setopt extended_glob        # in order to use #, ~ and ^ for filename generation
+                            # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
+                            # -> searches for word not in compressed files
+                            # don't forget to quote '^', '~' and '#'!
+setopt longlistjobs         # display PID when suspending processes as well
+setopt notify               # report the status of backgrounds jobs immediately
+setopt hash_list_all        # Whenever a command completion is attempted, make sure \
+                            # the entire command path is hashed first.
+setopt completeinword       # not just at the end
+setopt nohup                # and don't kill them, either
+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.
+setopt noglobdots           # * shouldn't match dotfiles. ever.
+setopt noshwordsplit        # use zsh style word splitting
+
+# }}}
+
 # setting some default values {{{
 
 NOCOR=${NOCOR:-0}
@@ -240,6 +288,7 @@ GRML_ZSH_CNF_HANDLER=${GRML_ZSH_CNF_HANDLER:-/usr/share/command-not-found/comman
 BATTERY=${BATTERY:-0}
 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}
@@ -320,14 +369,20 @@ fi # GRML_WARN_SKEL
 # this function checks if a command exists and returns either true
 # or false. This avoids using 'which' and 'whence', which will
 # avoid problems with aliases for which on certain weird systems. :-)
+# Usage: check_com [-c|-g] word
+#   -c  only checks for external commands
+#   -g  does the usual tests and also checks for global aliases
 check_com() {
-    local -i comonly
+    local -i comonly gatoo
 
     if [[ ${1} == '-c' ]] ; then
         (( comonly = 1 ))
         shift
+    elif [[ ${1} == '-g' ]] ; then
+        (( gatoo = 1 ))
     else
         (( comonly = 0 ))
+        (( gatoo = 0 ))
     fi
 
     if (( ${#argv} != 1 )) ; then
@@ -348,6 +403,10 @@ check_com() {
         return 0
     fi
 
+    if (( gatoo > 0 )) && [[ -n ${galiases[$1]} ]] ; then
+        return 0
+    fi
+
     return 1
 }
 
@@ -461,7 +520,9 @@ zrclocal() {
 #}}}
 
 # locale setup {{{
-xsource "/etc/default/locale"
+if (( ZSH_NO_DEFAULT_LOCALE == 0 )); then
+    xsource "/etc/default/locale"
+fi
 
 for var in LANG LC_ALL LC_MESSAGES ; do
     [[ -n ${(P)var} ]] && export $var
@@ -547,6 +608,19 @@ else
     fi
 fi
 
+# support colors in less
+export LESS_TERMCAP_mb=$'\E[01;31m'
+export LESS_TERMCAP_md=$'\E[01;31m'
+export LESS_TERMCAP_me=$'\E[0m'
+export LESS_TERMCAP_se=$'\E[0m'
+export LESS_TERMCAP_so=$'\E[01;44;33m'
+export LESS_TERMCAP_ue=$'\E[0m'
+export LESS_TERMCAP_us=$'\E[01;32m'
+
+MAILCHECK=30       # mailchecks
+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
+
 # automatically remove duplicates from these arrays
 typeset -U path cdpath fpath manpath
 # }}}
@@ -643,6 +717,17 @@ commit-to-history() {
 zle -N commit-to-history
 bindkey "^x^h" commit-to-history
 
+# only slash should be considered as a word separator:
+slash-backward-kill-word() {
+    local WORDCHARS="${WORDCHARS:s@/@}"
+    # zle backward-word
+    zle backward-kill-word
+}
+zle -N slash-backward-kill-word
+
+#k# Kill everything in a word up to its last \kbd{/}
+bindkey '\ev' slash-backward-kill-word
+
 # }}}
 
 # a generic accept-line wrapper {{{
@@ -853,8 +938,8 @@ alias run-help >&/dev/null && unalias run-help
 zrcautoload run-help # use via 'esc-h'
 
 # completion system
-if zrcautoload compinit && compinit 2>/dev/null ; then
-    compinit 2>/dev/null || print 'Notice: no compinit available :('
+if zrcautoload compinit ; then
+    compinit || print 'Notice: no compinit available :('
 else
     print 'Notice: no compinit available :('
     function zstyle { }
@@ -953,57 +1038,6 @@ bindkey '^x1' jump_after_first_word
 
 # }}}
 
-# {{{ set some important options
-# Please update these tags, if you change the umask settings below.
-#o# r_umask     002
-#o# r_umaskstr  rwxrwxr-x
-#o# umask       022
-#o# umaskstr    rwxr-xr-x
-(( EUID != 0 )) && umask 002 || umask 022
-
-# history:
-setopt append_history       # append history list to the history file (important for multiple parallel zsh sessions!)
-is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
-setopt extended_history     # save each command's beginning timestamp and the duration to the history file
-is4 && setopt histignorealldups # If  a  new  command  line being added to the history
-                            # list duplicates an older one, the older command is removed from the list
-setopt histignorespace      # remove command lines from the history list when
-                            # the first character on the line is a space
-setopt auto_cd              # if a command is issued that can't be executed as a normal command,
-                            # and the command is the name of a directory, perform the cd command to that directory
-setopt extended_glob        # in order to use #, ~ and ^ for filename generation
-                            # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
-                            # -> searches for word not in compressed files
-                            # don't forget to quote '^', '~' and '#'!
-setopt longlistjobs         # display PID when suspending processes as well
-setopt notify               # report the status of backgrounds jobs immediately
-setopt hash_list_all        # Whenever a command completion is attempted, make sure \
-                            # the entire command path is hashed first.
-setopt completeinword       # not just at the end
-setopt nohup                # and don't kill them, either
-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.
-setopt noglobdots           # * shouldn't match dotfiles. ever.
-
-MAILCHECK=30       # mailchecks
-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
-
-# only slash should be considered as a word separator:
-slash-backward-kill-word() {
-    local WORDCHARS="${WORDCHARS:s@/@}"
-    # zle backward-word
-    zle backward-kill-word
-}
-zle -N slash-backward-kill-word
-
-#k# Kill everything in a word up to its last \kbd{/}
-bindkey '\ev' slash-backward-kill-word
-
-# }}}
-
 # {{{ history
 
 ZSHDIR=$HOME/.zsh
@@ -1052,10 +1086,20 @@ function chpwd_profiles() {
     # in the third part of the context, a function called chpwd_profile_grml,
     # for example, is called (if it exists).
     #
-    # If no pattern patches (read: no profile is detected) the profile is
+    # If no pattern matches (read: no profile is detected) the profile is
     # set to 'default', which means chpwd_profile_default is attempted to
     # be called.
     #
+    # A word about the context (the ':chpwd:profiles:*' stuff in the zstyle
+    # command) which is used: The third part in the context is matched against
+    # ${PWD}. That's why using a pattern such as /foo/bar(|/|/*) makes sense.
+    # Because that way the profile is detected for all these values of ${PWD}:
+    #   /foo/bar
+    #   /foo/bar/
+    #   /foo/bar/baz
+    # So, if you want to make double damn sure a profile works in /foo/bar
+    # and everywhere deeper in that tree, just use (|/|/*) and be happy.
+    #
     # The name of the detected profile will be available in a variable called
     # 'profile' in your functions. You don't need to do anything, it'll just
     # be there.
@@ -2192,8 +2236,7 @@ alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
 
 # make sure it is not assigned yet
-[[ $(whence -w utf2iso &>/dev/null) == 'utf2iso: alias' ]] && unalias utf2iso
-
+[[ -n ${aliases[utf2iso]} ]] && unalias utf2iso
 utf2iso() {
     if isutfenv ; then
         for ENV in $(env | command grep -i '.utf') ; do
@@ -2203,7 +2246,7 @@ utf2iso() {
 }
 
 # make sure it is not assigned yet
-[[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf
+[[ -n ${aliases[iso2utf]} ]] && unalias iso2utf
 iso2utf() {
     if ! isutfenv ; then
         for ENV in $(env | command grep -i '\.iso') ; do
@@ -2582,7 +2625,8 @@ grmlcomp() {
 
     # use generic completion system for programs not yet defined; (_gnu_generic works
     # with commands that provide a --help option with "standard" gnu-like output.)
-    for compcom in tail head feh cp mv df stow uname ipacsum fetchipac; do
+    for compcom in cp deborphan df feh fetchipac head hnb ipacsum mv \
+                   pal stow tail uname ; do
         [[ -z ${_comps[$compcom]} ]] && compdef _gnu_generic ${compcom}
     done; unset compcom
 
@@ -3188,11 +3232,6 @@ check_com -c python && alias http="python -m SimpleHTTPServer"
 # Use 'g' instead of 'git':
 check_com g || alias g='git'
 
-# use colors when browsing man pages, but only if not using LESS_TERMCAP_* from /etc/zsh/zshenv:
-if [[ -z "$LESS_TERMCAP_md" ]] ; then
-    [[ -d ~/.terminfo/ ]] && alias man='TERMINFO=~/.terminfo/ LESS=C TERM=mostlike PAGER=less man'
-fi
-
 # check whether Debian's package management (dpkg) is running
 if check_com salias ; then
     #a2# Check whether a dpkg instance is currently running
@@ -3392,11 +3431,8 @@ greph() { history 0 | grep $1 }
 #a2# Execute \kbd{grep -i -{}-color=auto}
 alias GREP='grep -i --color=auto'
 
-# one blank line between each line
-if [[ -r ~/.terminfo/m/mostlike ]] ; then
-    #f5# Watch manpages in a stretched style
-    man2() { PAGER='dash -c "sed G | /usr/bin/less"' TERM=mostlike /usr/bin/man "$@" ; }
-fi
+#f5# Watch manpages in a stretched style
+man2() { PAGER='dash -c "sed G | /usr/bin/less"' command man "$@" ; }
 
 # d():Copyright 2005 Nikolai Weibull <nikolai@bitwi.se>
 # note: option AUTO_PUSHD has to be set