zshrc: Remove zurl's dependency on =~ type regexp conditions
[grml-etc-core.git] / etc / zsh / zshrc
index a1778a6..7bd4416 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
@@ -237,7 +242,7 @@ function zrcautoload() {
     local -i ffound
 
     ffile=$1
-    (( found = 0 ))
+    (( ffound = 0 ))
     for fdir in ${fpath} ; do
         [[ -e ${fdir}/${ffile} ]] && (( ffound = 1 ))
     done
@@ -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
@@ -549,7 +555,7 @@ isdarwin && xsource /sw/bin/init.sh
 # load our function and completion directories
 for fdir in /usr/share/grml/zsh/completion /usr/share/grml/zsh/functions; do
     fpath=( ${fdir} ${fdir}/**/*(/N) ${fpath} )
-    if [[ ${fpath} == '/usr/share/grml/zsh/functions' ]] ; then
+    if [[ ${fdir} == '/usr/share/grml/zsh/functions' ]] ; then
         for func in ${fdir}/**/[^_]*[^~](N.) ; do
             zrcautoload ${func:t}
         done
@@ -579,6 +585,22 @@ watch=(notme root)
 # automatically remove duplicates from these arrays
 typeset -U path cdpath fpath manpath
 
+# Remove zle-line-{init,finish} if it looks like it turns smkx. This would be
+# better fixed by working with those modes too, but we use way too many
+# hardcoded bindings for now.
+function remove_widget () {
+    local name=$1
+    local cap=$2
+    if (( ${+functions[$name]} )) && [[ ${functions[$name]} == *${cap}* ]]; then
+        local w=${widgets[$name]}
+        zle -D $name
+        [[ $w == user:* ]] && unfunction ${w#*:}
+    fi
+}
+remove_widget zle-line-init smkx
+remove_widget zle-line-finish rmkx
+unfunction remove_widget
+
 # keybindings
 if [[ "$TERM" != emacs ]] ; then
     [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
@@ -898,7 +920,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 +985,6 @@ if zrcautoload compinit ; then
     compinit || print 'Notice: no compinit available :('
 else
     print 'Notice: no compinit available :('
-    function zstyle { }
     function compdef { }
 fi
 
@@ -1137,100 +1158,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 +1449,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 +1726,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 +1950,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 +1982,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 +2180,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 +2413,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 +2452,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
@@ -2684,12 +2632,15 @@ xtrename() {
 # API reference: https://code.google.com/apis/urlshortener/
 function zurl() {
     emulate -L zsh
+    setopt extended_glob
+
     if [[ -z $1 ]]; then
         print "USAGE: zurl <URL>"
         return 1
     fi
 
-    local PN url prog api json data
+    local PN url prog api json contenttype item
+    local -a data
     PN=$0
     url=$1
 
@@ -2707,11 +2658,19 @@ function zurl() {
     api='https://www.googleapis.com/urlshortener/v1/url'
     contenttype="Content-Type: application/json"
     json="{\"longUrl\": \"${url}\"}"
-    data=$($prog --silent -H ${contenttype} -d ${json} $api)
-    # Match against a regex and print it
-    if [[ $data =~ '"id": "(http://goo.gl/[[:alnum:]]+)"' ]]; then
-        print $match;
-    fi
+    data=(${(f)"$($prog --silent -H ${contenttype} -d ${json} $api)"})
+    # Parse the response
+    for item in "${data[@]}"; do
+        case "$item" in
+            ' '#'"id":'*)
+                item=${item#*: \"}
+                item=${item%\",*}
+                printf '%s\n' "$item"
+                return 0
+                ;;
+        esac
+    done
+    return 1
 }
 
 #f2# Find history events by search pattern and list them by date.