2 # Purpose: config file for zsh (z shell)
3 # Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports: see http://grml.org/bugs/
5 # License: This file is licensed under the GPL v2.
6 # Latest change: Son Jän 14 10:57:03 CET 2007 [mika]
7 ################################################################################
8 # This file is sourced only for interactive shells. It
9 # should contain commands to set up aliases, functions,
10 # options, key bindings, etc.
12 # Global Order: zshenv, zprofile, zshrc, zlogin
13 ################################################################################
16 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
17 if [[ -n $ZSH_PROFILE_RC ]] ; then
22 # {{{ check for version/system
23 # check for versions (compatibility reasons)
24 if autoload is-at-least && is-at-least 2>/dev/null ; then
25 is4() { is-at-least 4 }
26 is42() { is-at-least 4.2 }
29 [[ $ZSH_VERSION == 4.* ]] && return 0
33 [[ $ZSH_VERSION == 4.<2->* ]] && return 0
40 [ -f /etc/grml_version ] && return 0
45 [ -f /etc/grml_cd ] && return 0
51 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
54 isgrmlsmall() { return 1 }
57 # are we running within an utf environment?
59 case "$LANG $CHARSET $LANGUAGE" in
65 # check for user, if not running as root set $SUDO to sudo
66 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
68 # change directory to home on first invocation of zsh
69 # important for rungetty -> autologin
70 # Thanks go to Bart Schaefer!
71 isgrml && checkhome() {
72 if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
73 export ALREADY_DID_CD_HOME=$HOME
79 # {{{ set some variables
80 export EDITOR=${EDITOR:-vim}
81 export MAIL=${MAIL:-/var/mail/$USER}
82 [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
83 [[ -x /usr/bin/dircolors ]] && eval `dircolors -b`
85 # Search path for the cd comman
88 # Support our own site-functions
89 [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH
91 # automatically remove duplicates from these arrays
92 typeset -U path cdpath fpath manpath
96 if [[ "$TERM" != emacs ]]; then
97 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
98 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
99 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
100 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
101 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
102 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
103 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
104 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
105 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
106 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
107 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
108 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
110 [[ "$terminfo[kcuu1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
111 [[ "$terminfo[kcud1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
112 [[ "$terminfo[kcuf1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
113 [[ "$terminfo[kcub1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
114 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
115 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
116 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
117 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
120 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
121 # use emacs style per default:
126 #if [[ "$TERM" == screen ]]; then
127 bindkey '\e[1~' beginning-of-line # home
128 bindkey '\e[4~' end-of-line # end
129 bindkey "^[[A" up-line-or-search # cursor up
130 bindkey "^[[B" down-line-or-search # <ESC>-
131 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
132 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
133 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
134 # if terminal type is set to 'rxvt':
135 bindkey '\e[7~' beginning-of-line # home
136 bindkey '\e[8~' end-of-line # end
139 # bindkey '\eq' push-line-or-edit
142 # power completion - abbreviation expansion {{{
143 # power completion / abbreviation expansion / buffer expansion
144 # see http://zshwiki.org/home/examples/zleiab for details
145 # less risky than the global aliases but powerful as well
146 # just type the abbreviation key and afterwards ',.' to expand it
149 setopt interactivecomments
157 'G' '|& grep --color=auto'
159 'Hl' ' --help |& less -r'
164 'R' '| tr A-z N-za-m'
169 'hide' "echo -en '\033]50;nil2\007'"
170 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
171 'small' 'echo -en "\033]50;6x10\007"'
172 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
173 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
174 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
175 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
176 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
177 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
181 'co' "./configure && make && sudo make install"
182 'CH' "./configure --help"
183 'conkeror' 'firefox -chrome chrome://conkeror/content'
185 'lad' $'ls -d .*(/)\n# only show dot-directories'
186 'lsa' $'ls -a .*(.)\n# only show dot-files'
187 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
188 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
189 'lsx' $'ls -l *(*[1,10])\n# only executables'
190 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
191 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
192 'lsd' $'ls -d *(/)\n# only show directories'
193 'lse' $'ls -d *(/^F)\n# only show empty directories'
194 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
195 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
196 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
198 '600' 'chmod u+rw-x,g-rwx,o-rwx'
200 '700' 'chmod u+rwx,g-rwx,o-rwx'
201 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
202 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
203 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
205 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
206 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
207 'fblinks' 'links2 -driver fb'
208 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
209 'fori' 'for i ({..}) { }'
212 'se' 'setopt interactivecomments'
213 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
214 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
215 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
217 'D' 'export DISPLAY=:0.0'
218 'mp' 'mplayer -vo xv -fs -zoom'
223 matched_chars='[.-|_a-zA-Z0-9]#'
224 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
225 LBUFFER+=${abk[$MATCH]:-$MATCH}
229 bindkey ",." globalias
233 autoload -U zmv # who needs mmv or rename?
234 autoload history-search-end
236 # we don't want to quote/espace URLs on our own...
237 # avoid 'url-quote-magic: function definition file not found' on some older boxes
238 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Zle/url-quote-magic" ] && \
239 autoload -U url-quote-magic && zle -N self-insert url-quote-magic ; then
240 zle -N self-insert url-quote-magic
242 print 'Notice: no url-quote-magic available :('
245 alias run-help >&/dev/null && unalias run-help
246 autoload run-help # use via 'esc-h'
249 if autoload -U compinit && compinit 2>/dev/null ; then
250 compinit 2>/dev/null || print 'Notice: no compinit available :('
252 print 'Notice: no compinit available :('
257 is4 && autoload -U zed # use ZLE editor to edit a file or function
259 is4 && for mod in complist deltochar mathfunc ; do
260 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
263 # autoload zsh modules when they are referenced
264 is4 && for opt mod in a stat \
268 zmodload -${opt} zsh/${mod} ${mod}
271 is4 && autoload -U insert-files && \
272 zle -N insert-files && \
273 bindkey "^Xf" insert-files # C-x-f
275 bindkey ' ' magic-space # also do history expansion on space
276 bindkey '\ei' menu-complete # menu completion via esc-i
278 # press esc-e for editing command line in $EDITOR or $VISUAL
279 is4 && autoload -U edit-command-line && \
280 zle -N edit-command-line && \
281 bindkey '\ee' edit-command-line
283 # menu selection: pick item but stay in the menu (press esc-return)
284 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
286 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
287 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
288 bindkey '\C-ed' _bkdate
291 # press esc-m for inserting last typed word again (thanks to caphuso!)
292 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
293 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
295 # set command prediction from history, see 'man 1 zshcontrib'
296 # is4 && autoload -U predict-on && \
297 # zle -N predict-on && \
298 # zle -N predict-off && \
299 # bindkey "^X^Z" predict-on && \
300 # bindkey "^Z" predict-off
302 # put job into foreground via ctrl-z:
303 bindkey -s '^z' "fg\n"
305 # press ctrl-q to quote line:
307 # zle beginning-of-line
309 # # RBUFFER="'$RBUFFER'"
310 # RBUFFER=${(q)RBUFFER}
313 # zle -N mquote && bindkey '^q' mquote
315 # run command line as user root via sudo:
316 _sudo-command-line() {
317 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
319 zle -N sudo-command-line _sudo-command-line
320 bindkey "^Os" sudo-command-line
323 # {{{ set some important options
328 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
329 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
330 setopt extended_history # save each command's beginning timestamp and the duration to the history file
331 is4 && setopt histignorealldups # If a new command line being added to the history
332 # list duplicates an older one, the older command is removed from the list
333 setopt histignorespace # remove command lines from the history list when
334 # the first character on the line is a space
335 # setopt histallowclobber # add `|' to output redirections in the history
336 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
337 setopt auto_cd # if a command is issued that can't be executed as a normal command,
338 # and the command is the name of a directory, perform the cd command to that directory
339 setopt extended_glob # in order to use #, ~ and ^ for filename generation
340 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
341 # -> searches for word not in compressed files
342 # don't forget to quote '^', '~' and '#'!
343 setopt notify # report the status of backgrounds jobs immediately
344 setopt hash_list_all # Whenever a command completion is attempted, make sure \
345 # the entire command path is hashed first.
346 setopt completeinword # not just at the end
347 # setopt nocheckjobs # don't warn me about bg processes when exiting
348 setopt nohup # and don't kill them, either
349 # setopt printexitvalue # alert me if something failed
350 # setopt dvorak # with spelling correction, assume dvorak kb
351 setopt auto_pushd # make cd push the old directory onto the directory stack.
352 setopt nonomatch # try to avoid the 'zsh: no matches found...'
353 setopt nobeep # avoid "beep"ing
355 MAILCHECK=30 # mailchecks
356 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
357 watch=(notme root) # watch for everyone but me and root
359 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
360 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
362 # WORDCHARS='*?_[]~=&;!#$%^(){}'
363 # WORDCHARS='${WORDCHARS:s@/@}'
365 # only slash should be considered as a word separator:
366 slash-backward-kill-word() {
367 local WORDCHARS="${WORDCHARS:s@/@}"
369 zle backward-kill-word
371 zle -N slash-backward-kill-word
372 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
376 export ZSHDIR=$HOME/.zsh
377 HISTFILE=$HOME/.zsh_history
378 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
379 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
382 # dirstack handling {{{
384 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
385 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
386 # "cd -" won't work after login by just setting $OLDPWD, so
387 cd $dirstack[0] && cd $OLDPWD
390 builtin dirs -pl >! ~/.zdirs
394 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
395 if [ -n "$BATTERY" ] ; then
396 if [ -x =acpi ] ; then
397 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
398 [ -z "$PERCENT" ] && PERCENT='acpi not present'
399 if [ "${PERCENT%%%}" -lt 20 ] ; then
400 PERCENT="warning: ${PERCENT}%"
407 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Prompts/promptinit" ] && autoload promptinit && promptinit 2>/dev/null ; then
408 promptinit # people should be able to use their favourite prompt
410 print 'Notice: no promptinit available :('
413 # precmd() => a function which is executed just before each prompt
414 # use 'NOPRECMD=1' to disable the precmd + preexec commands
416 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
418 is4 && [[ -z $NOPRECMD ]] && precmd () {
419 [[ -n $NOPRECMD ]] && return 0
420 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
421 if [[ -z ${DONTSETRPROMPT} ]] ; then
422 if [ -n "$BATTERY" ] ; then
423 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
424 RPROMPT="${PERCENT}${SCREENTITLE}"
426 # RPROMPT="%(?..:()% ${SCREENTITLE}"
427 RPROMPT="${SCREENTITLE}"
430 # adjust title of xterm
431 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
432 case $TERM in (xterm*|rxvt)
433 print -Pn "\e]0;%n@%m: %~\a"
438 # chpwd () => a function which is executed whenever the directory is changed
440 # preexec() => a function running before every command
441 is4 && [[ -z $NOPRECMD ]] && preexec () {
442 [[ -n $NOPRECMD ]] && return 0
443 # set hostname if not running on host with name 'grml'
444 local HOSTNAME=$(hostname)
445 if [[ "$HOSTNAME" != grml ]] ; then
448 # get the name of the program currently running and hostname of local machine
449 # set screen window title if running in a screen
450 if [[ "$TERM" == screen* ]]; then
451 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
452 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
453 echo -ne "\ek$CMD\e\\"
455 # set the screen title to "zsh" when sitting at the command prompt:
456 if [[ "$TERM" == screen* ]]; then
457 SCREENTITLE=$'%{\ekzsh\e\\%}'
461 # adjust title of xterm
462 case $TERM in (xterm*|rxvt)
463 print -Pn "\e]0;%n@%m: $1\a"
469 if autoload colors && colors 2>/dev/null ; then
470 BLUE="%{${fg[blue]}%}"
471 RED="%{${fg_bold[red]}%}"
472 GREEN="%{${fg[green]}%}"
473 CYAN="%{${fg[cyan]}%}"
474 WHITE="%{${fg[white]}%}"
475 NO_COLOUR="%{${reset_color}%}"
482 NO_COLOUR="%{
\e[0m%}"
485 EXITCODE="%(?..%?%1v )"
486 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
487 PS3='?# ' # selection prompt used within a select loop.
488 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
490 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
491 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
492 debian_chroot=$(cat /etc/debian_chroot)
495 # don't use colors on dumb terminals (like emacs):
496 if [[ "$TERM" == dumb ]] ; then
497 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
499 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
500 # set variable identifying the chroot you work in (used in the prompt below)
501 if [[ -n "$GRMLPROMPT" ]]; then
502 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
503 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
505 if (( EUID != 0 )); then
506 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
508 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
513 # if we are inside a grml-chroot set a specific prompt theme
514 if [ -n "$GRML_CHROOT" ] ; then
515 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
519 # {{{ 'hash' some often used directories
520 hash -d deb=/var/cache/apt/archives
521 hash -d doc=/usr/share/doc
522 hash -d linux=/lib/modules/$(command uname -r)/build/
524 hash -d slog=/var/log/syslog
526 hash -d templ=/usr/share/doc/grml-templates
527 hash -d tt=/usr/share/doc/texttools-doc
532 if [ $UID = 0 ] ; then
533 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
534 elif [ -r $HOME/.screenrc ] ; then
535 alias screen="/usr/bin/screen -c $HOME/.screenrc"
537 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
540 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
541 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
542 alias la='ls -la --color=auto'
543 alias ll='ls -l --color=auto'
544 alias lh='ls -hAl --color=auto'
545 alias l='ls -lF --color=auto'
554 alias cp='nocorrect cp' # no spelling correction on cp
555 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
556 alias mv='nocorrect mv' # no spelling correction on mv
557 alias rm='nocorrect rm' # no spelling correction on rm
562 alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth.
564 # I like clean prompt, so provide simple way to get that
565 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
567 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
568 if [ -x /usr/sbin/truecrypt ] ; then
570 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
572 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
576 zsh-help(){print "$bg[white]$fg[black]
577 zsh-help - hints for use of zsh on grml
578 =======================================$reset_color
580 Main configuration of zsh happens in /etc/zsh/zshrc (global)
581 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
582 The files are part of the package grml-etc-core, if you want to
583 use them on a non-grml-system just get the tar.gz from
584 http://deb.grml.org/ or get the files from the mercurial
587 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
588 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
590 If you want to stay in sync with zsh configuration of grml
591 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
592 your own stuff in \$HOME/.zshrc.local. System wide configuration
593 without touching configuration files of grml can take place
594 in /etc/zsh/zshrc.local.
596 If you want to use the configuration of user grml also when
597 running as user root just run 'zshskel' which will source
598 the file /etc/skel/.zshrc.
600 For information regarding zsh start at http://grml.org/zsh/
602 Take a look at grml's zsh refcard:
603 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
605 Check out the main zsh refcard:
606 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
608 And of course visit the zsh-lovers:
611 You can adjust some options through environment variables when
612 invoking zsh without having to edit configuration files.
613 Basically meant for bash users who are not used to the power of
616 \"NOCOR=1 zsh\" => deactivate automatic correction
617 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
618 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
619 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
621 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
622 Enjoy your grml system with the zsh!$reset_color"
626 if [ -r /etc/debian_version ] ; then
627 alias acs='apt-cache search'
628 alias acsh='apt-cache show'
629 alias acp='apt-cache policy'
630 alias adg="$SUDO apt-get dist-upgrade"
631 alias agi="$SUDO apt-get install"
632 alias ag="$SUDO apt-get upgrade"
633 alias au="$SUDO apt-get update"
634 alias dbp='dpkg-buildpackage'
635 alias ge='grep-excuses'
639 if [ -z "$1" ] ; then
641 $SUDO apt-get -u upgrade
643 ssh $1 $SUDO apt-get update
644 # ask before the upgrade
646 ssh $1 $SUDO apt-get --no-act upgrade
647 echo -n 'Process the upgrade?'
649 if [[ $dummy == "y" ]] ; then
650 ssh $1 $SUDO apt-get -u upgrade --yes
655 isgrmlcd && alias su="sudo su" # change to user root
656 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
657 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
660 # sort installed Debian-packages by size
661 if [ -x /usr/bin/grep-status ] ; then
662 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
663 -n "install ok installed" | paste -sd " \n" | sort -rn'
666 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
667 if [ -L /usr/bin/cdrecord -o ! -x =cdrecord ] ; then
668 if [ -x =wodim ] ; then
669 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
670 See #377109 in the BTS of Debian for more details.
672 Please use the wodim binary instead' ; return 1"
676 # I hate lacking backward compability, so provide an alternative therefore
677 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
678 function apache2-ssl-certificate(){
680 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
681 print 'You might want to take a look at Debian the package ssl-cert as well.'
682 print 'To generate a certificate for use with apache2 follow the instructions:'
686 export RANDFILE=/dev/random
687 mkdir /etc/apache2/ssl/
688 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
689 chmod 600 /etc/apache2/ssl/apache.pem
691 Run "grml-tips ssl-certificate" if you need further instructions.
697 # {{{ Use hard limits, except for a smaller stack and no core dumps
700 isgrmlcd && limit core 0 # important for a live-cd-system
704 # {{{ completion stuff
706 # Where to look for autoloaded function definitions
707 if [ -d /etc/zsh/completion.d ] ; then
708 local comp=/etc/zsh/completion.d
709 for func in $comp/*(N-.:t); . ${comp}/${func}
712 # called later (via is4 && grmlcomp)
713 # notice: use 'zstyle' for getting current settings
714 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
717 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
718 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
719 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
720 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
721 zstyle ':completion:*:correct:*' original true #
722 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
723 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
724 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
725 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
726 zstyle ':completion:*:history-words' list false #
727 zstyle ':completion:*:history-words' menu yes # activate menu
728 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
729 zstyle ':completion:*:history-words' stop yes #
730 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
731 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
732 zstyle ':completion:*' group-name ''
733 if [[ -z "$NOMENU" ]] ; then
734 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
736 setopt no_auto_menu # don't use any menus at all
738 zstyle ':completion:*:messages' format '%d' #
739 zstyle ':completion:*:options' auto-description '%d' #
740 zstyle ':completion:*:options' description 'yes' # describe options in full
741 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
742 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
743 zstyle ':completion:*' verbose true # provide verbose completion information
744 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
745 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
746 zstyle ':completion:correct:' prompt 'correct to: %e' #
747 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
749 # complete manual by their section
750 zstyle ':completion:*:manuals' separate-sections true
751 zstyle ':completion:*:manuals.*' insert-sections true
752 zstyle ':completion:*:man:*' menu yes select
755 # run rehash on completion so new installed program are found automatically:
757 (( CURRENT == 1 )) && rehash
758 return 1 # Because we didn't really complete anything
760 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
761 if [[ -n "$NOCOR" ]] ; then
762 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete
763 setopt nocorrect # do not try to correct the spelling if possible
765 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate
766 setopt correct # try to correct the spelling if possible
767 zstyle -e ':completion:*' completer '
768 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
769 _last_try="$HISTNO$BUFFER$CURSOR"
770 reply=(_complete _match _prefix)
772 if [[ $words[1] = (rm|mv) ]]; then
775 reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
779 # zstyle ':completion:*' completer _complete _correct _approximate
780 # zstyle ':completion:*' expand prefix suffix
782 # automatic rehash? Credits go to Frank Terbeck
783 # function my_accept () {
785 # [[ -z ${BUFFER} ]] && zle accept-line && return
786 # buf=( ${(z)BUFFER} )
787 # [[ -z ${commands[${buf[1]}]} ]] && rehash
791 # bindkey "^M" my_accept
793 # command for process lists, the local web server details and host completion
794 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
797 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
798 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
800 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
802 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
803 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
815 zstyle ':completion:*:hosts' hosts $hosts
816 # zstyle '*' hosts $hosts
818 # specify your logins:
820 # {grml,grml1}@foo.invalid
821 # grml-devel@bar.invalid
824 # {fred,root}@foo.invalid
827 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
828 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
830 # specify specific port/service settings:
831 # telnet_users_hosts_ports=(
834 # @mail-server:{smtp,pop3}
838 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
840 # use generic completion system for programs not yet defined:
841 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
843 # see upgrade function in this file
844 compdef _hosts upgrade
850 # people should use 'grml-x'!
852 if [ -e /etc/X11/xorg.conf ] ; then
853 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
855 echo "Please use the script \"grml-x\" for starting the X Window System
856 because there does not exist /etc/X11/xorg.conf yet.
857 If you want to use startx anyway please call \"/usr/bin/startx\"."
863 if [ -e /etc/X11/xorg.conf ] ; then
864 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
866 echo "Please use the script \"grml-x\" for starting the X Window System.
867 because there does not exist /etc/X11/xorg.conf yet.
868 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
873 if [ -x /usr/sbin/915resolution ] ; then
874 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
877 alias grml-version='cat /etc/grml_version'
879 if [ -x /usr/sbin/rebuildfstab ] ; then
880 alias grml-rebuildfstab='rebuildfstab -v -r -config'
885 # {{{ now run the functions
887 is4 && isgrml && grmlstuff
892 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
895 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
896 # You use it as follows:
897 # $ NTREF=/reference/file
899 # This lists all the files in the current directory newer than the reference file.
900 # You can also specify the reference file inline; note quotes:
901 # $ ls -l *(e:'nt ~/.zshenv':)
906 [[ $REPLY -nt $NTREF ]]
910 # shell functions {{{
911 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
912 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
914 if [[ "$#*" -eq 0 ]]; then
915 [ -r ~/.zshrc ] && . ~/.zshrc
924 compdef _functions reload freload
927 if type -p qma &>/dev/null ; then
928 manzsh() { qma zshall "$1" }
931 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
932 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
933 # manzsh() { man zshall | $MYLESS -p $1 ; }
936 # use "dchange <package-name>" to view Debian's changelog of the package:
938 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
939 most /usr/share/doc/${1}/changelog.Debian.gz
941 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
942 most /usr/share/doc/${1}/changelog.gz
944 echo "No changelog for package $1 found, sorry."
949 _dchange() { _files -W /usr/share/doc -/ }
950 compdef _dchange dchange
952 # use "uchange <package-name>" to view upstream's changelog of the package:
954 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
955 most /usr/share/doc/${1}/changelog.gz
957 echo "No changelog for package $1 found, sorry."
961 _uchange() { _files -W /usr/share/doc -/ }
962 compdef _uchange uchange
966 ZSH_PROFILE_RC=1 $SHELL "$@"
969 # edit alias via zle:
971 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
973 compdef _aliases edalias
975 # edit function via zle:
977 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
979 compdef _functions edfunc
981 # use it e.g. via 'Restart apache2'
982 if [ -d /etc/init.d ] ; then
983 for i in Start Restart Stop Force-Reload Reload ; do
984 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
986 # now the completion for this:
987 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
990 # provide useful information on globbing
997 p named pipes (FIFOs)
998 * executable plain files (0100)
999 % device files (character or block special)
1000 %b block special files
1001 %c character special files
1002 r owner-readable files (0400)
1003 w owner-writable files (0200)
1004 x owner-executable files (0100)
1005 A group-readable files (0040)
1006 I group-writable files (0020)
1007 E group-executable files (0010)
1008 R world-readable files (0004)
1009 W world-writable files (0002)
1010 X world-executable files (0001)
1011 s setuid files (04000)
1012 S setgid files (02000)
1013 t files with the sticky bit (01000)
1015 print *(m-1) # Files modified up to a day ago
1016 print *(a1) # Files accessed a day ago
1017 print *(@) # Just symlinks
1018 print *(Lk+50) # Files bigger than 50 kilobytes
1019 print *(Lk-50) # Files smaller than 50 kilobytes
1020 print **/*.c # All *.c files recursively starting in \$PWD
1021 print **/*.c~file.c # Same as above, but excluding 'file.c'
1022 print (foo|bar).* # Files starting with 'foo' or 'bar'
1023 print *~*.* # All Files that do not contain a dot
1024 chmod 644 *(.^x) # make all plain non-executable files publically readable
1025 print -l *(.c|.h) # Lists *.c and *.h
1026 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1027 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1029 alias help-zshglob=H-Glob
1031 type -p qma &>/dev/null && alias ?='qma zshall'
1033 # grep for running process, like: 'any vim'
1035 if [ -z "$1" ] ; then
1036 echo "any - grep for process(es) by keyword" >&2
1037 echo "Usage: any <keyword>" >&2 ; return 1
1040 local LENGTH=$(expr length $STRING)
1041 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1042 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1043 ps xauwww| grep "[$FIRSCHAR]$REST"
1047 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1048 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1049 [ -r /proc/1/maps ] && deswap() {
1050 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1051 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1052 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1055 # print hex value of a number
1057 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1060 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1061 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1063 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1064 perl -e "print eval($CALC),\"\n\";"
1066 functions peval &>/dev/null && alias calc=peval
1068 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1070 # NO_SWITCH="yes" command bash "$@"
1073 # exec $SHELL $SHELL_ARGS "$@"
1078 # log out? set timeout in seconds {{{
1080 # do not log out in some specific terminals:
1081 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1086 # {{{ make sure our environment is clean regarding colors
1087 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1090 # source another config file if present {{{
1091 if [ -r /etc/zsh/zshrc.local ]; then
1092 source /etc/zsh/zshrc.local
1096 # "persistent history" {{{
1097 # just write important commands you always need to ~/.important_commands
1098 if [ -r ~/.important_commands ] ; then
1099 fc -R ~/.important_commands
1103 ## END OF FILE #################################################################
1104 # vim:foldmethod=marker expandtab