X-Git-Url: https://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=f87f59aa28afe649e2348ffb4b02d44ade6d19ca;hb=ca792aa8f7931be3775f6fb1ca6d56c9830dea6c;hp=89c9ed81ffc59a165f70ad77f86178615157cff2;hpb=19166a4c4d50b58cbd7688f23f0463f2a860236c;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 89c9ed8..f87f59a 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -3,7 +3,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Don Nov 30 16:15:06 CET 2006 [mika] +# Latest change: Mon Nov 05 12:20:29 CET 2007 [mika] ################################################################################ # This file is sourced only for interactive shells. It # should contain commands to set up aliases, functions, @@ -12,10 +12,131 @@ # 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#
+# #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: +# +# #
# +# +# Where
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 + zmodload zsh/zprof + fi +# }}} + +# locale setup {{{ + if [ -n "$LANG" ] ; then + export LANG + else + [ -r /etc/default/locale ] && source /etc/default/locale + fi + [ -n "$LANG" ] && export LANG || export LANG="en_US.iso885915" + [ -n "$LC_ALL" ] && export LC_ALL + [ -n "$LC_MESSAGES" ] && export LC_MESSAGES + + [ -r /etc/sysconfig/keyboard ] && source /etc/sysconfig/keyboard + [ -r /etc/timezone ] && TZ=$(cat /etc/timezone) +# }}} + +# check for potentially old files in 'completion.d' {{{ + setopt extendedglob + xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N)) + if (( ${#xof} > 0 )) ; then + printf '\n -!- INFORMATION\n\n' + printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof} + printf ' -!- /etc/zsh/completion.d/.\n\n' + printf ' -!- While this has been the case in old versions of grml-etc-core,\n' + printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n' + printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n' + printf ' -!- named _* to that directory.\n\n' + printf ' -!- If you added functions to completion.d yourself, please consider\n' + printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n' + printf ' -!- starting with an underscore are marked for automatic loading\n' + printf ' -!- by default (so that is quite convenient).\n\n' + printf ' -!- If there are files *not* starting with an underscore from an older\n' + printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n' + printf ' -!- Delete the files for example via running:\n\n' + printf " rm ${xof}\n\n" + printf ' -!- Note, that this message will *not* go away, unless you yourself\n' + printf ' -!- resolve the situation manually.\n\n' + BROKEN_COMPLETION_DIR=1 + fi + unset xof +# }}} + # {{{ check for version/system # check for versions (compatibility reasons) if autoload is-at-least && is-at-least 2>/dev/null ; then is4() { is-at-least 4 } + is41() { is-at-least 4.1 } is42() { is-at-least 4.2 } else is4(){ @@ -29,28 +150,32 @@ fi # grml specific stuff +#f1# Checks whether or not you're running grml isgrml(){ [ -f /etc/grml_version ] && return 0 return 1 } +#f1# Checks whether or not you're running a grml cd isgrmlcd(){ [ -f /etc/grml_cd ] && return 0 return 1 } if isgrml ; then + #f1# Checks whether or not you're running grml-small isgrmlsmall() { [[ ${${${(f)"$(\n' + printf ' -h shows this help text.\n' + printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n' + printf ' be careful using this option.\n' + printf ' -o only sets an alias if a preceding sudo would be needed.\n' + return 0 + ;; + (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;; + esac + shift + done + if (( ${#argv} > 1 )) ; then + printf 'Too many arguments %s\n' "${#argv}" + return 1 + fi + key="${1%%\=*}" ; val="${1#*\=}" + if (( EUID == 0 )) && (( only == 0 )); then + alias -- "${key}=${val}" + elif (( EUID > 0 )) ; then + (( multi > 0 )) && val="${val// ; / ; sudo }" + alias -- "${key}=sudo ${val}" + fi + return 0 + } + # change directory to home on first invocation of zsh # important for rungetty -> autologin # Thanks go to Bart Schaefer! @@ -70,16 +230,35 @@ # }}} # {{{ set some variables - export EDITOR=${EDITOR:-vim} + #v# + if type -p vim &>/dev/null ; then + export EDITOR=${EDITOR:-vim} + else + export EDITOR=${EDITOR:-vi} + fi + #v# export MAIL=${MAIL:-/var/mail/$USER} - [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less' - [[ -x /usr/bin/dircolors ]] && eval `dircolors -b` + # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/ + export SHELL='/bin/zsh' + [ -x $(which dircolors) ] && eval `dircolors -b` -# Search path for the cd comman +# Search path for the cd command # cdpath=(.. ~) -# Support our own site-functions - [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH +# completion functions go to /etc/zsh/completion.d +# function files may be put into /etc/zsh/functions.d, from where they +# will be automatically autoloaded. + if [ -n "$BROKEN_COMPLETION_DIR" ] ; then + print 'Warning: not setting completion directories because broken files have been found.'>&2 + else + [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d ) + if [[ -d /etc/zsh/functions.d ]] ; then + fpath+=( /etc/zsh/functions.d ) + for func in /etc/zsh/functions.d/[^_]*[^~] ; do + autoload -U ${func:t} + done + fi + fi # automatically remove duplicates from these arrays typeset -U path cdpath fpath manpath @@ -100,14 +279,14 @@ [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char # ncurses stuff: - [[ "$terminfo[kcuu1]" == "O"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history - [[ "$terminfo[kcud1]" == "O"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history - [[ "$terminfo[kcuf1]" == "O"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char - [[ "$terminfo[kcub1]" == "O"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char - [[ "$terminfo[khome]" == "O"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line - [[ "$terminfo[kend]" == "O"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line - [[ "$terminfo[khome]" == "O"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line - [[ "$terminfo[kend]" == "O"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line + [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history + [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history + [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char + [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char + [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line + [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line + [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line + [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line fi ## keybindings (run 'bindkeys' for details, more details via man zshzle) @@ -119,8 +298,8 @@ fi #if [[ "$TERM" == screen ]]; then bindkey '\e[1~' beginning-of-line # home bindkey '\e[4~' end-of-line # end - bindkey "^[[A" up-line-or-search # cursor up - bindkey "^[[B" down-line-or-search # - + bindkey '\e[A' up-line-or-search # cursor up + bindkey '\e[B' down-line-or-search # - bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history # bindkey -s '^L' "|less\n" # ctrl-L pipes to less # bindkey -s '^B' " &\n" # ctrl-B runs it in the background @@ -129,6 +308,25 @@ fi bindkey '\e[8~' end-of-line # end #fi +# insert unicode character +# usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an ยง +# See for example http://unicode.org/charts/ for unicode characters code + autoload insert-unicode-char + zle -N insert-unicode-char + #k# Insert Unicode character + bindkey '^Xi' insert-unicode-char + +# just type 'cd ...' to get 'cd ../..' +# rationalise-dot() { +# if [[ $LBUFFER = *.. ]]; then +# LBUFFER+=/.. +# else +# LBUFFER+=. +# fi +# } +# zle -N rationalise-dot +# bindkey . rationalise-dot + # bindkey '\eq' push-line-or-edit # }}} @@ -141,24 +339,25 @@ fi setopt extendedglob setopt interactivecomments abk=( - # key # value - 'C' '| wc -l' + # key # value (#d additional doc string) +#A# start '...' '../..' '....' '../../..' 'BG' '& exit' - 'C' '|wc -l' + 'C' '| wc -l' 'G' '|& grep --color=auto' - 'H' '|head' - 'Hl' ' --help |& less -r' - 'L' '|less' + 'H' '| head' + 'Hl' ' --help |& less -r' #d (Display help in pager) + 'L' '| less' 'LL' '|& less -r' - 'M' '|most' - 'N' '&>/dev/null' - 'R' '| tr A-z N-za-m' + 'M' '| most' + 'N' '&>/dev/null' #d (No Output) + 'R' '| tr A-z N-za-m' #d (ROT13) 'SL' '| sort | less' 'S' '| sort -u' - 'T' '|tail' + 'T' '| tail' 'V' '|& vim -' +#A# end 'hide' "echo -en '\033]50;nil2\007'" 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"' 'small' 'echo -en "\033]50;6x10\007"' @@ -199,6 +398,7 @@ fi 'fbmplayer' 'mplayer -vo -fs -zoom fbdev' 'fblinks' 'links2 -driver fb' 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"' + 'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"' 'fori' 'for i ({..}) { }' 'cx' 'chmod +x' 'e' 'print -l' @@ -227,63 +427,78 @@ fi autoload history-search-end # we don't want to quote/espace URLs on our own... - # avoid 'url-quote-magic: function definition file not found' on some older boxes - if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Zle/url-quote-magic" ] && \ - autoload -U url-quote-magic && zle -N self-insert url-quote-magic ; then - zle -N self-insert url-quote-magic - else - print 'Notice: no url-quote-magic available :(' - fi - + # if autoload -U url-quote-magic ; then + # zle -N self-insert url-quote-magic + # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}=' + # else + # print 'Notice: no url-quote-magic available :(' + # 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 command line alias run-help >&/dev/null && unalias run-help autoload run-help # use via 'esc-h' # completion system - if autoload -U compinit && [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Completion/compinit" ] && compinit 2>/dev/null ; then - compinit + if autoload -U compinit && compinit 2>/dev/null ; then + compinit 2>/dev/null || print 'Notice: no compinit available :(' else print 'Notice: no compinit available :(' function zstyle { } function compdef { } fi - is4 && autoload -U zed # use ZLE editor to edit a file or function + is4 && autoload -U zed # use ZLE editor to edit a file or function is4 && for mod in complist deltochar mathfunc ; do - zmodload -i zsh/${mod} + zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :(" done # autoload zsh modules when they are referenced - is4 && for opt mod in a stat \ - a zpty \ - a zprof \ - ap mapfile ; do - zmodload -${opt} zsh/${mod} ${mod} - done ; unset opt mod + if is4 ; then + tmpargs=( + a stat + a zpty + ap zprof + ap mapfile + ) + + while (( ${#tmpargs} > 0 )) ; do + zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]} + shift 2 tmpargs + done + unset tmpargs + fi is4 && autoload -U insert-files && \ zle -N insert-files && \ + #k# Insert files bindkey "^Xf" insert-files # C-x-f bindkey ' ' magic-space # also do history expansion on space + #k# Trigger menu-complete bindkey '\ei' menu-complete # menu completion via esc-i # press esc-e for editing command line in $EDITOR or $VISUAL is4 && autoload -U edit-command-line && \ zle -N edit-command-line && \ + #k# Edit the current line in \kbd{\$EDITOR} bindkey '\ee' edit-command-line -# menu selection: pick item but stay in the menu (press esc-return) +#k# menu selection: pick item but stay in the menu is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; } - 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!) insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \ - zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word + zle -N insert-last-typed-word; + #k# Insert last typed word + bindkey "\em" insert-last-typed-word # set command prediction from history, see 'man 1 zshcontrib' # is4 && autoload -U predict-on && \ @@ -292,7 +507,7 @@ fi # bindkey "^X^Z" predict-on && \ # bindkey "^Z" predict-off -# put job into foreground via ctrl-z: +#k# Shortcut for \kbd{fg} bindkey -s '^z' "fg\n" # press ctrl-q to quote line: @@ -306,16 +521,37 @@ 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 + 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. +### useful to add options. + function jump_after_first_word() { + local words + words=(${(z)BUFFER}) + if (( ${#words} <= 1 )) ; then + CURSOR=${#BUFFER} + else + CURSOR=${#${words[1]}} + fi + } + zle -N jump_after_first_word + bindkey '^x1' jump_after_first_word + # }}} # {{{ set some important options - # umask 022 - umask 002 +# 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!) @@ -344,9 +580,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,..) @@ -362,19 +599,34 @@ fi zle backward-kill-word } zle -N slash-backward-kill-word - bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!) +# press esc-v to delete a word until its last '/' (not the same as ctrl-w!) +#k# Kill everything in a word up to its last \kbd{/} + bindkey '\ev' slash-backward-kill-word # }}} # {{{ history export ZSHDIR=$HOME/.zsh + #v# HISTFILE=$HOME/.zsh_history isgrmlcd && HISTSIZE=500 || HISTSIZE=5000 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history # }}} +# dirstack handling {{{ + DIRSTACKSIZE=20 + if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then + dirstack=( ${(f)"$(< ~/.zdirs)"} ) + # "cd -" won't work after login by just setting $OLDPWD, so + [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD + fi + chpwd() { + builtin dirs -pl >! ~/.zdirs + } +# }}} + # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh' if [ -n "$BATTERY" ] ; then - if [ -x =acpi ] ; then + if [ -x $(which acpi) ] ; then PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}" [ -z "$PERCENT" ] && PERCENT='acpi not present' if [ "${PERCENT%%%}" -lt 20 ] ; then @@ -384,29 +636,101 @@ fi fi # }}} +# display version control information on right side of prompt if $VCS is set {{{ +# based on Mike Hommey's http://web.glandium.org/blog/?p=170 + __vcs_dir() { + local vcs base_dir sub_dir ref + sub_dir() { + local sub_dir + sub_dir=$(readlink -f "${PWD}") + sub_dir=${sub_dir#$1} + echo ${sub_dir#/} + } + + git_dir() { + base_dir=$(git-rev-parse --show-cdup 2>/dev/null) || return 1 + base_dir=$(readlink -f "$base_dir/..") + sub_dir=$(git-rev-parse --show-prefix) + sub_dir=${sub_dir%/} + ref=$(git-symbolic-ref -q HEAD || git-name-rev --name-only HEAD 2>/dev/null) + ref=${ref#refs/heads/} + vcs="git" + } + + svn_dir() { + [ -d ".svn" ] || return 1 + base_dir="." + while [ -d "$base_dir/../.svn" ]; do base_dir="$base_dir/.."; done + base_dir=$(readlink -f "$base_dir") + sub_dir=$(sub_dir "${base_dir}") + ref=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }') + vcs="svn" + } + + svk_dir() { + [ -f ~/.svk/config ] || return 1 + base_dir=$(awk '/: *$/ { sub(/^ */,"",$0); sub(/: *$/,"",$0); if (match("'${PWD}'", $0"(/|$)")) { print $0; d=1; } } /depotpath/ && d == 1 { sub(".*/","",$0); r=$0 } /revision/ && d == 1 { print r ":" $2; exit 1 }' ~/.svk/config) && return 1 + ref=${base_dir##* + } + base_dir=${base_dir%% + *} + sub_dir=$(sub_dir "${base_dir}") + vcs="svk" + } + + hg_dir() { + base_dir="." + while [ ! -d "$base_dir/.hg" ]; do base_dir="$base_dir/.."; [ $(readlink -f "${base_dir}") = "/" ] && return 1; done + base_dir=$(readlink -f "$base_dir") + sub_dir=$(sub_dir "${base_dir}") + ref=$(< "${base_dir}/.hg/branch") + vcs="hg" + } + + hg_dir || + git_dir || + svn_dir || + svk_dir # || + # base_dir="$PWD" + # echo "${vcs:+($vcs)}${base_dir/$HOME/~}${vcs:+[$ref]${sub_dir}}" + echo "${vcs:+($vcs)}${base_dir}${vcs:+[$ref]${sub_dir}}" + } +# }}} + # {{{ set prompt - if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Prompts/promptinit" ] && autoload promptinit && promptinit 2>/dev/null ; then + if autoload promptinit && promptinit 2>/dev/null ; then promptinit # people should be able to use their favourite prompt else print 'Notice: no promptinit available :(' fi + # precmd() => a function which is executed just before each prompt # use 'NOPRECMD=1' to disable the precmd + preexec commands # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l; - is4 && ! [[ -n "$NOPRECMD" ]] && precmd () { - (( NOPRECMD > 0 )) && return 0 + # make sure to use right prompt only when not running a command + is41 && setopt transient_rprompt + + is4 && [[ -z $NOPRECMD ]] && precmd () { + [[ -n $NOPRECMD ]] && return 0 + # allow manual overwriting of RPROMPT + if [[ -n $RPROMPT ]] ; then + [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\' + # return 0 + fi # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT - if [[ -z ${DONTSETRPROMPT} ]] ; then - if [ -n "$BATTERY" ] ; then - # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}" - RPROMPT="${PERCENT}${SCREENTITLE}" - else - # RPROMPT="%(?..:()% ${SCREENTITLE}" - RPROMPT="${SCREENTITLE}" - fi + if [[ -z $DONTSETRPROMPT ]] ; then + if [[ -n $BATTERY ]] ; then + RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}" + # RPROMPT="${PERCENT}${SCREENTITLE}" + elif [[ -n $VCS ]] ; then + RPROMPT="%(?..:()% $(__vcs_dir)${SCREENTITLE}" + else + RPROMPT="%(?..:()% ${SCREENTITLE}" + # RPROMPT="${SCREENTITLE}" + fi fi # adjust title of xterm # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html @@ -419,8 +743,8 @@ fi # chpwd () => a function which is executed whenever the directory is changed # preexec() => a function running before every command - is4 && ! [[ -n "$NOPRECMD" ]] && preexec () { - (( NOPRECMD > 0 )) && return 0 + is4 && [[ -z $NOPRECMD ]] && preexec () { + [[ -n $NOPRECMD ]] && return 0 # set hostname if not running on host with name 'grml' local HOSTNAME=$(hostname) if [[ "$HOSTNAME" != grml ]] ; then @@ -429,15 +753,15 @@ 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|-*)]}$NAME" # use hostname - echo -ne "\ek$CMD\e\\" + # 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 # set the screen title to "zsh" when sitting at the command prompt: if [[ "$TERM" == screen* ]]; then - SCREENTITLE=$'%{\ekzsh\e\\%}' + SCREENTITLE=$'%{\ekzsh\e\\%}' else - SCREENTITLE='' + SCREENTITLE='' fi # adjust title of xterm case $TERM in (xterm*|rxvt) @@ -455,12 +779,12 @@ fi WHITE="%{${fg[white]}%}" NO_COLOUR="%{${reset_color}%}" else - BLUE="%{%}" - RED="%{%}" - GREEN="%{%}" - CYAN="%{%}" - WHITE="%{%}" - NO_COLOUR="%{%}" + BLUE=$'%{\e[1;34m%}' + RED=$'%{\e[1;31m%}' + GREEN=$'%{\e[1;32m%}' + CYAN=$'%{\e[1;36m%}' + WHITE=$'%{\e[1;37m%}' + NO_COLOUR=$'%{\e[0m%}' fi EXITCODE="%(?..%?%1v )" @@ -475,11 +799,11 @@ fi # don't use colors on dumb terminals (like emacs): if [[ "$TERM" == dumb ]] ; then - PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# " + PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# " else # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt # set variable identifying the chroot you work in (used in the prompt below) - if [[ -n "$GRMLPROMPT" ]]; then + if [[ -n $GRMLPROMPT ]]; then PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " else @@ -498,6 +822,7 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # }}} # {{{ 'hash' some often used directories + #d# start hash -d deb=/var/cache/apt/archives hash -d doc=/usr/share/doc hash -d linux=/lib/modules/$(command uname -r)/build/ @@ -507,6 +832,7 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " hash -d templ=/usr/share/doc/grml-templates hash -d tt=/usr/share/doc/texttools-doc hash -d www=/var/www + #d# end # }}} # {{{ some aliases @@ -518,11 +844,17 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml' fi + # do we have GNU ls with color-support? if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then - alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support? + #a1# execute \kbd{@a@}:\quad ls with colors + alias ls='ls -b -CF --color=auto' + #a1# execute \kbd{@a@}:\quad list all files, with colors alias la='ls -la --color=auto' + #a1# long colored list, without dotfiles (@a@) alias ll='ls -l --color=auto' + #a1# long colored list, human readable sizes (@a@) alias lh='ls -hAl --color=auto' + #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...) alias l='ls -lF --color=auto' else alias ls='ls -b -CF' @@ -532,18 +864,76 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " alias l='ls -lF' fi + 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 alias rm='nocorrect rm' # no spelling correction on rm + #a1# Execute \kbd{rmdir} alias rd='rmdir' + #a1# Execute \kbd{rmdir} alias md='mkdir' - alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth. + # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details + 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 + 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 + } + + # make sure it is not assigned yet + [[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf + 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=' + aumix -w 90 -v 90 -p 90 -m 90 + 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 + ' + +# I like clean prompt, so provide simple way to get that + alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0' -# truecrypt; use e.g. via 'truec /dev/ice' /mnt/ice' or 'truec -i' - if [ -x /usr/sbin/truecrypt ] ; then +# 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 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" ' else @@ -551,6 +941,7 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " fi fi +#f1# Hints for the use of zsh on grml zsh-help(){print "$bg[white]$fg[black] zsh-help - hints for use of zsh on grml =======================================$reset_color @@ -602,17 +993,31 @@ Enjoy your grml system with the zsh!$reset_color" # debian stuff if [ -r /etc/debian_version ] ; then + #a3# Execute \kbd{apt-cache search} alias acs='apt-cache search' + #a3# Execute \kbd{apt-cache show} alias acsh='apt-cache show' + #a3# Execute \kbd{apt-cache policy} alias acp='apt-cache policy' - alias adg="$SUDO apt-get dist-upgrade" - alias agi="$SUDO apt-get install" - alias ag="$SUDO apt-get upgrade" - alias au="$SUDO apt-get update" + #a3# Execute \kbd{apt-get dist-upgrade} + salias adg="apt-get dist-upgrade" + #a3# Execute \kbd{apt-get install} + salias agi="apt-get install" + #a3# Execute \kbd{aptitude install} + salias ati="aptitude install" + #a3# Execute \kbd{apt-get upgrade} + salias ag="apt-get upgrade" + #a3# Execute \kbd{apt-get update} + salias au="apt-get update" + #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} alias ge='grep-excuses' # debian upgrade + #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade} upgrade () { if [ -z "$1" ] ; then $SUDO apt-get update @@ -630,14 +1035,24 @@ Enjoy your grml system with the zsh!$reset_color" fi } - isgrmlcd && alias su="sudo su" # change to user root - alias tlog="tail -f /var/log/syslog" # take a look at the syslog + isgrmlcd && alias su="sudo -s" # get a root shell + #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 + #a1# (Re)-source \kbd{/etc/skel/.zshrc} alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc fi +# sort installed Debian-packages by size + if [ -x $(which grep-status) ] ; 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' + fi + # if cdrecord is a symlink (to wodim) or isn't present at all warn: - if [ -L /usr/bin/cdrecord -o ! -x =cdrecord ] ; then - if [ -x =wodim ] ; then + if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then + if [ -x $(which wodim) ] ; then alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore. See #377109 in the BTS of Debian for more details. @@ -645,6 +1060,33 @@ Please use the wodim binary instead' ; return 1" fi fi +# get_tw_cli has been renamed into get_3ware + if [ -x $(which get_3ware) ] ; then + get_tw_cli() { + echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2 + get_3ware + } + fi + +# I hate lacking backward compatibility, so provide an alternative therefore + if ! [ -x $(which apache2-ssl-certificate) ] ; then + apache2-ssl-certificate(){ + + print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :(' + print 'You might want to take a look at Debian the package ssl-cert as well.' + print 'To generate a certificate for use with apache2 follow the instructions:' + + echo ' + +export RANDFILE=/dev/random +mkdir /etc/apache2/ssl/ +openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem +chmod 600 /etc/apache2/ssl/apache.pem + +Run "grml-tips ssl-certificate" if you need further instructions. +' + } + fi # }}} # {{{ Use hard limits, except for a smaller stack and no core dumps @@ -656,19 +1098,13 @@ Please use the wodim binary instead' ; return 1" # {{{ completion stuff -# Where to look for autoloaded function definitions - if [ -d /etc/zsh/completion.d ] ; then - local comp=/etc/zsh/completion.d - for func in $comp/*(N-.:t); . ${comp}/${func} - fi - # called later (via is4 && grmlcomp) # notice: use 'zstyle' for getting current settings # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output 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 # @@ -680,8 +1116,6 @@ grmlcomp() { zstyle ':completion:*:history-words' menu yes # activate menu zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries zstyle ':completion:*:history-words' stop yes # - zstyle ':completion:*:*:linda:*' file-patterns '*.deb' # complete debian packages for command 'linda' - zstyle ':completion:*:*:lintian:*' file-patterns '*.deb' # complete debian packages for command 'lintian' zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase zstyle ':completion:*:matches' group 'yes' # separate matches into groups zstyle ':completion:*' group-name '' @@ -714,20 +1148,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 + 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 +# 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) + reply=(_complete _match _ignored _prefix _files) else if [[ $words[1] = (rm|mv) ]]; then - reply=(_complete) + reply=(_complete _files) else - reply=(_oldlist _expand _force_rehash _complete _correct _approximate) + reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files) fi fi' fi @@ -735,7 +1169,7 @@ grmlcomp() { # zstyle ':completion:*' expand prefix suffix # automatic rehash? Credits go to Frank Terbeck -# function my_accept () { +# my_accept() { # local buf # [[ -z ${BUFFER} ]] && zle accept-line && return # buf=( ${(z)BUFFER} ) @@ -746,22 +1180,54 @@ grmlcomp() { # bindkey "^M" my_accept # command for process lists, the local web server details and host completion - hosts=(`hostname` grml.org) - zstyle '*' hosts $hosts zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html' # caching [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \ zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/ -# use ~/.ssh/known_hosts for completion [does not work with hashing of new ssh versions anymore] - if [ -f "$HOME/.ssh/known_hosts" ] ; then - hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) - zstyle ':completion:*:hosts' hosts $hosts +# host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */ + if is42 ; then + [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=() + [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(" to view Debian's changelog of the package: - dchange() { - if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then - most /usr/share/doc/${1}/changelog.Debian.gz - else - if [ -r /usr/share/doc/${1}/changelog.gz ] ; then - most /usr/share/doc/${1}/changelog.gz - else - echo "No changelog for package $1 found, sorry." - return 1 - fi - fi + #f1# Reload zsh setup + reload () { + if [[ "$#*" -eq 0 ]]; then + [ -r ~/.zshrc ] && . ~/.zshrc + else + local fn + for fn in "$@"; do + unfunction $fn + autoload -U $fn + done + fi + } + compdef _functions reload freload + + #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s') + sll() { + [ -z "$1" ] && printf 'Usage: %s \n' "$0" && return 1 + for i in "$@" ; do + file=$i + while [ -h "$file" ] ; do + ls -l $file + file=$(readlink "$file") + done + done } - _dchange() { _files -W /usr/share/doc -/ } - compdef _dchange dchange -# use "uchange " to view upstream's changelog of the package: - uchange() { - if [ -r /usr/share/doc/${1}/changelog.gz ] ; then - most /usr/share/doc/${1}/changelog.gz - else - echo "No changelog for package $1 found, sorry." - return 1 - fi + # fast manual access + if type -p qma &>/dev/null ; then + #f1# View the zsh manual + manzsh() { qma zshall "$1" } + compdef _man qma + 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 + + if [ -x $(which most) ] ; then + #f1# View Debian's changelog of a given package + 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 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 + fi + fi + } + _dchange() { _files -W /usr/share/doc -/ } + compdef _dchange dchange + + #f1# View Debian's NEWS of a given package + dnews() { + if [ -r /usr/share/doc/${1}/NEWS.Debian.gz ] ; then + most /usr/share/doc/${1}/NEWS.Debian.gz + else + if [ -r /usr/share/doc/${1}/NEWS.gz ] ; then + most /usr/share/doc/${1}/NEWS.gz + else + echo "No NEWS file for package $1 found, sorry." + return 1 + fi + fi + } + _dnews() { _files -W /usr/share/doc -/ } + compdef _dnews dnews + + #f1# View upstream's changelog of a given package + uchange() { + if [ -r /usr/share/doc/${1}/changelog.gz ] ; then + most /usr/share/doc/${1}/changelog.gz + else + echo "No changelog for package $1 found, sorry." + return 1 + fi + } + _uchange() { _files -W /usr/share/doc -/ } + compdef _uchange uchange + fi + +# zsh profiling + profile () { + ZSH_PROFILE_RC=1 $SHELL "$@" } - _uchange() { _files -W /usr/share/doc -/ } - compdef _uchange uchange -# edit alias via zle: +#f1# Edit an alias via zle edalias() { [ -z "$1" ] && { echo "Usage: edalias " ; return 1 } || vared aliases'[$1]' ; } compdef _aliases edalias -# edit function via zle: - edfun() { +#f1# Edit a function via zle + edfunc() { [ -z "$1" ] && { echo "Usage: edfun " ; return 1 } || zed -f "$1" ; } - compdef _functions edfun + compdef _functions edfunc # use it e.g. via 'Restart apache2' +#m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start} +#m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart} +#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} if [ -d /etc/init.d ] ; then 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 -# provide useful information on globbing + #f1# Provides useful information on globbing H-Glob() { echo -e " / directories @@ -927,7 +1468,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." } alias help-zshglob=H-Glob - type -p fma &>/dev/null && alias ?='fma zshall' + type -p qma &>/dev/null && alias ?='qma zshall' # grep for running process, like: 'any vim' any() { @@ -939,10 +1480,128 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." local LENGTH=$(expr length $STRING) local FIRSCHAR=$(echo $(expr substr $STRING 1 1)) local REST=$(echo $(expr substr $STRING 2 $LENGTH)) - ps xauwww| grep [$FIRSCHAR]$REST + ps xauwww| grep "[$FIRSCHAR]$REST" fi } + # 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.' + cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null + print 'Finished, running "swapoff -a; swapon -a" may also be useful.' + } + + # print hex value of a number + hex() { + [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex ' ; return 1 } + } + + # calculate (or eval at all ;-)) with perl => p[erl-]eval + # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC' + peval() { + [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]" + perl -e "print eval($CALC),\"\n\";" + } + 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: ' + [ -z "$DISPLAY" ] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null + echo 'Done' + } + asdf() { + echo -n 'Switching to dvorak keyboard layout: ' + [ -z "$DISPLAY" ] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null + echo 'Done' + } + # just press 'asdf' key to toggle from neon layout to us keyboard layout + uiae() { + echo -n 'Switching to us keyboard layout: ' + setxkbmap us && echo 'Done' || echo 'Failed' + } + + # set up an ipv6 tunnel + ipv6-tunnel() { + case $1 in + start) + if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then + print 'ipv6 tunnel already set up, nothing to be done.' + print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1 + else + [ -n "$PUBLIC_IP" ] || local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \ + awk '/inet addr:/ {print $2}' | tr -d 'addr:') + [ -n "$PUBLIC_IP" ] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 } + local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ })) + print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: " + ifconfig sit0 tunnel ::192.88.99.1 up + ifconfig sit1 add "$IPV6ADDR" && print done || print failed + fi + ;; + status) + if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then + print 'ipv6 tunnel available' ; return 0 + else + print 'ipv6 tunnel not available' ; return 1 + fi + ;; + stop) + if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then + print -n 'Stopping ipv6 tunnel (sit0 + sit1): ' + ifconfig sit1 down ; ifconfig sit0 down && print done || print failed + else + print 'No ipv6 tunnel found, nothing to be done.' ; return 1 + fi + ;; + *) + print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1 + ;; + esac + } + + # run dhclient for wireless device + iwclient() { + salias dhclient "$(wavemon -d | awk '/device/{print $2}')" + } + + # spawn a minimally set up ksh - useful if you want to umount /usr/. + minimal-shell() { + exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh + } + + # make a backup of a file + bk() { + cp -a "$1" "${1}_$(date --iso-8601=seconds)" + } + + # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html + # bash() { + # NO_SWITCH="yes" command bash "$@" + # } + # restart () { + # exec $SHELL $SHELL_ARGS "$@" + # } + +# }}} + +# log out? set timeout in seconds {{{ +# TMOUT=1800 +# do not log out in some specific terminals: +# if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then +# unset TMOUT +# fi # }}} # {{{ make sure our environment is clean regarding colors @@ -962,5 +1621,14 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"." fi # }}} +## genrefcard.pl settings {{{ +### example: split functions-search 8,16,24,32 +#@# split functions-search 8 +## }}} + +# add variable to be able to check whether the file has been read {{{ + ZSHRC_GLOBAL_HAS_BEEN_READ=1 +# }}} + ## END OF FILE ################################################################# -# vim:foldmethod=marker +# vim:foldmethod=marker expandtab