Specify a command search path for sudo completion [Closes: issue1207]
[grml-etc-core.git] / etc / zsh / zshrc
index a1778a6..b7cb2e5 100644 (file)
@@ -179,6 +179,11 @@ isdarwin(){
     return 1
 }
 
+isfreebsd(){
+    [[ $OSTYPE == freebsd* ]] && return 0
+    return 1
+}
+
 #f1# are we running within an utf environment?
 isutfenv() {
     case "$LANG $CHARSET $LANGUAGE" in
@@ -533,8 +538,9 @@ export SHELL='/bin/zsh'
 
 # color setup for ls:
 check_com -c dircolors && eval $(dircolors -b)
-# color setup for ls on OS X:
+# color setup for ls on OS X / FreeBSD:
 isdarwin && export CLICOLOR=1
+isfreebsd && export CLICOLOR=1
 
 # do MacPorts setup on darwin
 if isdarwin && [[ -d /opt/local ]]; then
@@ -898,7 +904,7 @@ abk=(
     '....' '../../..'
     'BG'   '& exit'
     'C'    '| wc -l'
-    'G'    '|& grep '${grep_options:+"${grep_options[*]} "}
+    'G'    '|& grep '${grep_options:+"${grep_options[*]}"}
     'H'    '| head'
     'Hl'   ' --help |& less -r'    #d (Display help in pager)
     'L'    '| less'
@@ -963,7 +969,6 @@ if zrcautoload compinit ; then
     compinit || print 'Notice: no compinit available :('
 else
     print 'Notice: no compinit available :('
-    function zstyle { }
     function compdef { }
 fi
 
@@ -1137,100 +1142,15 @@ chpwd() {
 
 if is433 ; then
 
-# chpwd_profiles(): Directory Profiles
-#
-# Say you want certain settings to be active in certain directories. This is
-# what you want.
+# chpwd_profiles(): Directory Profiles, Quickstart:
 #
-# To get it working you will need this function and something along the
-# following lines:
+# In .zshrc.local:
 #
-#   chpwd_functions+=( chpwd_profiles )
+#   zstyle ':chpwd:profiles:/usr/src/grml(|/|/*)'   profile grml
+#   zstyle ':chpwd:profiles:/usr/src/debian(|/|/*)' profile debian
 #   chpwd_profiles
 #
-# You will usually want to do that *after* you configured the system. That
-# configuration is described below.
-#
-# zstyle ':chpwd:profiles:/usr/src/grml(|/|/*)'   profile grml
-# zstyle ':chpwd:profiles:/usr/src/debian(|/|/*)' profile debian
-#
-# When that's done and you enter a directory that matches the pattern 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 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.
-#
-# Then there is the parameter $CHPWD_PROFILE is set to the profile, that was is
-# currently active (the default value is "default"). That way you can avoid
-# running code for a profile that is already active, by running code such as
-# the following at the start of your function:
-#
-# function chpwd_profile_grml() {
-#     [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
-#   ...
-# }
-#
-# If you know you are going to do that all the time for each and every
-# directory-profile function you are ever going to write, you may also set the
-# `re-execute' style to `false' (which only defaults to `true' for backwards
-# compatibility), like this:
-#
-#   zstyle ':chpwd:profiles:*' re-execute false
-#
-# If you use this feature and need to know whether it is active in your current
-# shell, there are several ways to do that. Here are two simple ways:
-#
-# a) If knowing if the profiles feature is active when zsh starts is good
-#    enough for you, you can use the following snippet:
-#
-# (( ${+functions[chpwd_profiles]} )) && print "directory profiles active"
-#
-# b) If that is not good enough, and you would prefer to be notified whenever a
-#    profile changes, you can solve that by making sure you start *every*
-#    profile function you create like this:
-#
-# function chpwd_profile_myprofilename() {
-#     [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
-#     print "chpwd(): Switching to profile: $profile"
-#   ...
-# }
-#
-# That makes sure you only get notified if a profile is *changed*, not
-# everytime you change directory. (To avoid this, you may also set the newer
-# `re-execute' style like described further above instead of the test on top of
-# the function.
-#
-# If you need to do initialisations the first time `chpwd_profiles' is called
-# (which should be in your configuration file), you can do that in a function
-# called "chpwd_profiles_init". That function needs to be defined *before*
-# `chpwd_profiles' is called for this to work.
-#
-# During the *first* call of `chpwd_profiles' (and therefore all its profile
-# functions) the parameter `$CHPWD_PROFILES_INIT' exists and is set to `1'. In
-# all other cases, the parameter does not exist at all.
-#
-# When the system switches from one profile to another, it executes a function
-# named "chpwd_leave_profile_<PREVIOUS-PROFILE-NAME>()" before calling the
-# profile-function for the new profile.
-#
-# There you go. Now have fun with that.
-#
-# Note: This feature requires zsh 4.3.3 or newer.
+# For details see the `grmlzshrc.5' manual page.
 function chpwd_profiles() {
     local profile context
     local -i reexecute
@@ -1513,15 +1433,15 @@ fi
 # do we have GNU ls with color-support?
 if [[ "$TERM" != dumb ]]; then
     #a1# execute \kbd{@a@}:\quad ls with colors
-    alias ls='ls -b -CF '${ls_options:+"${ls_options[*]} "}
+    alias ls='ls -b -CF '${ls_options:+"${ls_options[*]}"}
     #a1# execute \kbd{@a@}:\quad list all files, with colors
-    alias la='ls -la '${ls_options:+"${ls_options[*]} "}
+    alias la='ls -la '${ls_options:+"${ls_options[*]}"}
     #a1# long colored list, without dotfiles (@a@)
-    alias ll='ls -l '${ls_options:+"${ls_options[*]} "}
+    alias ll='ls -l '${ls_options:+"${ls_options[*]}"}
     #a1# long colored list, human readable sizes (@a@)
-    alias lh='ls -hAl '${ls_options:+"${ls_options[*]} "}
+    alias lh='ls -hAl '${ls_options:+"${ls_options[*]}"}
     #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
-    alias l='ls -lF '${ls_options:+"${ls_options[*]} "}
+    alias l='ls -lF '${ls_options:+"${ls_options[*]}"}
 else
     alias ls='ls -b -CF'
     alias la='ls -la'
@@ -1790,6 +1710,15 @@ grmlcomp() {
     zstyle ':completion:*:manuals.*'  insert-sections   true
     zstyle ':completion:*:man:*'      menu yes select
 
+    # Search path for sudo completion
+    zstyle ':completion:*:sudo:*' command-path /usr/local/sbin \
+                                               /usr/local/bin  \
+                                               /usr/sbin       \
+                                               /usr/bin        \
+                                               /sbin           \
+                                               /bin            \
+                                               /usr/X11R6/bin
+
     # provide .. as a completion
     zstyle ':completion:*' special-dirs ..
 
@@ -2005,6 +1934,7 @@ compdef _functions edfunc
 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
+#m# f6 Status() \kbd{/etc/init.d/\em{process}}\quad\kbd{status}
 if [[ -d /etc/init.d || -d /etc/service ]] ; then
     __start_stop() {
         local action_="${1:l}"  # e.g Start/Stop/Restart
@@ -2036,7 +1966,7 @@ if [[ -d /etc/init.d || -d /etc/service ]] ; then
         _describe "service startup script" scripts
     }
 
-    for i in Start Restart Stop Force-Reload Reload ; do
+    for i in Start Restart Stop Force-Reload Reload Status ; do
         eval "$i() { __start_stop $i \"\$1\" \"\$2\" ; }"
         compdef _grmlinitd $i
     done
@@ -2234,9 +2164,11 @@ deswap() {
 #           VIM_OPTIONS=( -p )
 #       This will cause vim to send every file given on the
 #       commandline to be send to it's own tab (needs vim7).
-vim() {
-    VIM_PLEASE_SET_TITLE='yes' command vim ${VIM_OPTIONS} "$@"
-}
+if check_com vim; then
+    vim() {
+        VIM_PLEASE_SET_TITLE='yes' command vim ${VIM_OPTIONS} "$@"
+    }
+fi
 
 # make a backup of a file
 bk() {
@@ -2465,7 +2397,7 @@ check_com new || alias new=modified
 
 # use colors when GNU grep with color-support
 #a2# Execute \kbd{grep -{}-color=auto}
-(( $#grep_options > 0 )) && alias grep='grep '${grep_options:+"${grep_options[*]} "}
+(( $#grep_options > 0 )) && alias grep='grep '${grep_options:+"${grep_options[*]}"}
 
 # Translate DE<=>EN
 # 'translate' looks up fot a word in a file with language-to-language
@@ -2504,62 +2436,62 @@ simple-extract() {
     zparseopts -D -E "d=DELETE_ORIGINAL"
     for ARCHIVE in "${@}"; do
         case $ARCHIVE in
-            *.(tar.bz2|tbz2|tbz))
+            *(tar.bz2|tbz2|tbz))
                 DECOMP_CMD="tar -xvjf -"
                 USES_STDIN=true
                 USES_STDOUT=false
                 ;;
-            *.(tar.gz|tgz))
+            *(tar.gz|tgz))
                 DECOMP_CMD="tar -xvzf -"
                 USES_STDIN=true
                 USES_STDOUT=false
                 ;;
-            *.(tar.xz|txz|tar.lzma))
+            *(tar.xz|txz|tar.lzma))
                 DECOMP_CMD="tar -xvJf -"
                 USES_STDIN=true
                 USES_STDOUT=false
                 ;;
-            *.tar)
+            *tar)
                 DECOMP_CMD="tar -xvf -"
                 USES_STDIN=true
                 USES_STDOUT=false
                 ;;
-            *.rar)
+            *rar)
                 DECOMP_CMD="unrar x"
                 USES_STDIN=false
                 USES_STDOUT=false
                 ;;
-            *.lzh)
+            *lzh)
                 DECOMP_CMD="lha x"
                 USES_STDIN=false
                 USES_STDOUT=false
                 ;;
-            *.7z)
+            *7z)
                 DECOMP_CMD="7z x"
                 USES_STDIN=false
                 USES_STDOUT=false
                 ;;
-            *.(zip|jar))
+            *(zip|jar))
                 DECOMP_CMD="unzip"
                 USES_STDIN=false
                 USES_STDOUT=false
                 ;;
-            *.deb)
+            *deb)
                 DECOMP_CMD="ar -x"
                 USES_STDIN=false
                 USES_STDOUT=false
                 ;;
-            *.bz2)
+            *bz2)
                 DECOMP_CMD="bzip2 -d -c -"
                 USES_STDIN=true
                 USES_STDOUT=true
                 ;;
-            *.(gz|Z))
+            *(gz|Z))
                 DECOMP_CMD="gzip -d -c -"
                 USES_STDIN=true
                 USES_STDOUT=true
                 ;;
-            *.(xz|lzma))
+            *(xz|lzma))
                 DECOMP_CMD="xz -d -c -"
                 USES_STDIN=true
                 USES_STDOUT=true