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: Sam Feb 24 19:06:28 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
66 # check for user, if not running as root set $SUDO to sudo
67 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
69 # change directory to home on first invocation of zsh
70 # important for rungetty -> autologin
71 # Thanks go to Bart Schaefer!
72 isgrml && checkhome() {
73 if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
74 export ALREADY_DID_CD_HOME=$HOME
80 # {{{ set some variables
81 export EDITOR=${EDITOR:-vim}
82 export MAIL=${MAIL:-/var/mail/$USER}
83 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
84 export SHELL='/bin/zsh'
85 [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
86 [[ -x /usr/bin/dircolors ]] && eval `dircolors -b`
88 # Search path for the cd comman
91 # Support our own site-functions
92 [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH
94 # automatically remove duplicates from these arrays
95 typeset -U path cdpath fpath manpath
99 if [[ "$TERM" != emacs ]]; then
100 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
101 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
102 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
103 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
104 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
105 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
106 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
107 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
108 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
109 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
110 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
111 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
113 [[ "$terminfo[kcuu1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
114 [[ "$terminfo[kcud1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
115 [[ "$terminfo[kcuf1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
116 [[ "$terminfo[kcub1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
117 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
118 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
119 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
120 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
123 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
124 # use emacs style per default:
129 #if [[ "$TERM" == screen ]]; then
130 bindkey '\e[1~' beginning-of-line # home
131 bindkey '\e[4~' end-of-line # end
132 bindkey "^[[A" up-line-or-search # cursor up
133 bindkey "^[[B" down-line-or-search # <ESC>-
134 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
135 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
136 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
137 # if terminal type is set to 'rxvt':
138 bindkey '\e[7~' beginning-of-line # home
139 bindkey '\e[8~' end-of-line # end
142 # bindkey '\eq' push-line-or-edit
145 # power completion - abbreviation expansion {{{
146 # power completion / abbreviation expansion / buffer expansion
147 # see http://zshwiki.org/home/examples/zleiab for details
148 # less risky than the global aliases but powerful as well
149 # just type the abbreviation key and afterwards ',.' to expand it
152 setopt interactivecomments
160 'G' '|& grep --color=auto'
162 'Hl' ' --help |& less -r'
167 'R' '| tr A-z N-za-m'
172 'hide' "echo -en '\033]50;nil2\007'"
173 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
174 'small' 'echo -en "\033]50;6x10\007"'
175 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
176 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
177 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
178 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
179 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
180 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
184 'co' "./configure && make && sudo make install"
185 'CH' "./configure --help"
186 'conkeror' 'firefox -chrome chrome://conkeror/content'
188 'lad' $'ls -d .*(/)\n# only show dot-directories'
189 'lsa' $'ls -a .*(.)\n# only show dot-files'
190 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
191 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
192 'lsx' $'ls -l *(*[1,10])\n# only executables'
193 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
194 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
195 'lsd' $'ls -d *(/)\n# only show directories'
196 'lse' $'ls -d *(/^F)\n# only show empty directories'
197 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
198 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
199 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
201 '600' 'chmod u+rw-x,g-rwx,o-rwx'
203 '700' 'chmod u+rwx,g-rwx,o-rwx'
204 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
205 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
206 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
208 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
209 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
210 'fblinks' 'links2 -driver fb'
211 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
212 'fori' 'for i ({..}) { }'
215 'se' 'setopt interactivecomments'
216 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
217 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
218 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
220 'D' 'export DISPLAY=:0.0'
221 'mp' 'mplayer -vo xv -fs -zoom'
226 matched_chars='[.-|_a-zA-Z0-9]#'
227 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
228 LBUFFER+=${abk[$MATCH]:-$MATCH}
232 bindkey ",." globalias
236 autoload -U zmv # who needs mmv or rename?
237 autoload history-search-end
239 # we don't want to quote/espace URLs on our own...
240 # avoid 'url-quote-magic: function definition file not found' on some older boxes
241 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Zle/url-quote-magic" ] && \
242 autoload -U url-quote-magic && zle -N self-insert url-quote-magic ; then
243 zle -N self-insert url-quote-magic
245 print 'Notice: no url-quote-magic available :('
248 alias run-help >&/dev/null && unalias run-help
249 autoload run-help # use via 'esc-h'
252 if autoload -U compinit && compinit 2>/dev/null ; then
253 compinit 2>/dev/null || print 'Notice: no compinit available :('
255 print 'Notice: no compinit available :('
260 is4 && autoload -U zed # use ZLE editor to edit a file or function
262 is4 && for mod in complist deltochar mathfunc ; do
263 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
266 # autoload zsh modules when they are referenced
267 is4 && for opt mod in a stat \
271 zmodload -${opt} zsh/${mod} ${mod}
274 is4 && autoload -U insert-files && \
275 zle -N insert-files && \
276 bindkey "^Xf" insert-files # C-x-f
278 bindkey ' ' magic-space # also do history expansion on space
279 bindkey '\ei' menu-complete # menu completion via esc-i
281 # press esc-e for editing command line in $EDITOR or $VISUAL
282 is4 && autoload -U edit-command-line && \
283 zle -N edit-command-line && \
284 bindkey '\ee' edit-command-line
286 # menu selection: pick item but stay in the menu (press esc-return)
287 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
289 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
290 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
291 bindkey '\C-ed' _bkdate
294 # press esc-m for inserting last typed word again (thanks to caphuso!)
295 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
296 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
298 # set command prediction from history, see 'man 1 zshcontrib'
299 # is4 && autoload -U predict-on && \
300 # zle -N predict-on && \
301 # zle -N predict-off && \
302 # bindkey "^X^Z" predict-on && \
303 # bindkey "^Z" predict-off
305 # put job into foreground via ctrl-z:
306 bindkey -s '^z' "fg\n"
308 # press ctrl-q to quote line:
310 # zle beginning-of-line
312 # # RBUFFER="'$RBUFFER'"
313 # RBUFFER=${(q)RBUFFER}
316 # zle -N mquote && bindkey '^q' mquote
318 # run command line as user root via sudo:
319 _sudo-command-line() {
320 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
322 zle -N sudo-command-line _sudo-command-line
323 bindkey "^Os" sudo-command-line
326 # {{{ set some important options
331 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
332 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
333 setopt extended_history # save each command's beginning timestamp and the duration to the history file
334 is4 && setopt histignorealldups # If a new command line being added to the history
335 # list duplicates an older one, the older command is removed from the list
336 setopt histignorespace # remove command lines from the history list when
337 # the first character on the line is a space
338 # setopt histallowclobber # add `|' to output redirections in the history
339 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
340 setopt auto_cd # if a command is issued that can't be executed as a normal command,
341 # and the command is the name of a directory, perform the cd command to that directory
342 setopt extended_glob # in order to use #, ~ and ^ for filename generation
343 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
344 # -> searches for word not in compressed files
345 # don't forget to quote '^', '~' and '#'!
346 setopt notify # report the status of backgrounds jobs immediately
347 setopt hash_list_all # Whenever a command completion is attempted, make sure \
348 # the entire command path is hashed first.
349 setopt completeinword # not just at the end
350 # setopt nocheckjobs # don't warn me about bg processes when exiting
351 setopt nohup # and don't kill them, either
352 # setopt printexitvalue # alert me if something failed
353 # setopt dvorak # with spelling correction, assume dvorak kb
354 setopt auto_pushd # make cd push the old directory onto the directory stack.
355 setopt nonomatch # try to avoid the 'zsh: no matches found...'
356 setopt nobeep # avoid "beep"ing
358 MAILCHECK=30 # mailchecks
359 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
360 watch=(notme root) # watch for everyone but me and root
362 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
363 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
365 # WORDCHARS='*?_[]~=&;!#$%^(){}'
366 # WORDCHARS='${WORDCHARS:s@/@}'
368 # only slash should be considered as a word separator:
369 slash-backward-kill-word() {
370 local WORDCHARS="${WORDCHARS:s@/@}"
372 zle backward-kill-word
374 zle -N slash-backward-kill-word
375 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
379 export ZSHDIR=$HOME/.zsh
380 HISTFILE=$HOME/.zsh_history
381 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
382 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
385 # dirstack handling {{{
387 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
388 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
389 # "cd -" won't work after login by just setting $OLDPWD, so
390 cd $dirstack[0] && cd $OLDPWD
393 builtin dirs -pl >! ~/.zdirs
397 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
398 if [ -n "$BATTERY" ] ; then
399 if [ -x $(which acpi) ] ; then
400 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
401 [ -z "$PERCENT" ] && PERCENT='acpi not present'
402 if [ "${PERCENT%%%}" -lt 20 ] ; then
403 PERCENT="warning: ${PERCENT}%"
410 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Prompts/promptinit" ] && autoload promptinit && promptinit 2>/dev/null ; then
411 promptinit # people should be able to use their favourite prompt
413 print 'Notice: no promptinit available :('
416 # precmd() => a function which is executed just before each prompt
417 # use 'NOPRECMD=1' to disable the precmd + preexec commands
419 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
421 is4 && [[ -z $NOPRECMD ]] && precmd () {
422 [[ -n $NOPRECMD ]] && return 0
423 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
424 if [[ -z ${DONTSETRPROMPT} ]] ; then
425 if [ -n "$BATTERY" ] ; then
426 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
427 RPROMPT="${PERCENT}${SCREENTITLE}"
429 # RPROMPT="%(?..:()% ${SCREENTITLE}"
430 RPROMPT="${SCREENTITLE}"
433 # adjust title of xterm
434 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
435 case $TERM in (xterm*|rxvt)
436 print -Pn "\e]0;%n@%m: %~\a"
441 # chpwd () => a function which is executed whenever the directory is changed
443 # preexec() => a function running before every command
444 is4 && [[ -z $NOPRECMD ]] && preexec () {
445 [[ -n $NOPRECMD ]] && return 0
446 # set hostname if not running on host with name 'grml'
447 local HOSTNAME=$(hostname)
448 if [[ "$HOSTNAME" != grml ]] ; then
451 # get the name of the program currently running and hostname of local machine
452 # set screen window title if running in a screen
453 if [[ "$TERM" == screen* ]]; then
454 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
455 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
456 echo -ne "\ek$CMD\e\\"
458 # set the screen title to "zsh" when sitting at the command prompt:
459 if [[ "$TERM" == screen* ]]; then
460 SCREENTITLE=$'%{\ekzsh\e\\%}'
464 # adjust title of xterm
465 case $TERM in (xterm*|rxvt)
466 print -Pn "\e]0;%n@%m: $1\a"
472 if autoload colors && colors 2>/dev/null ; then
473 BLUE="%{${fg[blue]}%}"
474 RED="%{${fg_bold[red]}%}"
475 GREEN="%{${fg[green]}%}"
476 CYAN="%{${fg[cyan]}%}"
477 WHITE="%{${fg[white]}%}"
478 NO_COLOUR="%{${reset_color}%}"
485 NO_COLOUR="%{
\e[0m%}"
488 EXITCODE="%(?..%?%1v )"
489 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
490 PS3='?# ' # selection prompt used within a select loop.
491 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
493 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
494 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
495 debian_chroot=$(cat /etc/debian_chroot)
498 # don't use colors on dumb terminals (like emacs):
499 if [[ "$TERM" == dumb ]] ; then
500 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
502 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
503 # set variable identifying the chroot you work in (used in the prompt below)
504 if [[ -n "$GRMLPROMPT" ]]; then
505 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
506 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
508 if (( EUID != 0 )); then
509 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
511 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
516 # if we are inside a grml-chroot set a specific prompt theme
517 if [ -n "$GRML_CHROOT" ] ; then
518 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
522 # {{{ 'hash' some often used directories
523 hash -d deb=/var/cache/apt/archives
524 hash -d doc=/usr/share/doc
525 hash -d linux=/lib/modules/$(command uname -r)/build/
527 hash -d slog=/var/log/syslog
529 hash -d templ=/usr/share/doc/grml-templates
530 hash -d tt=/usr/share/doc/texttools-doc
535 if [ $UID = 0 ] ; then
536 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
537 elif [ -r $HOME/.screenrc ] ; then
538 alias screen="/usr/bin/screen -c $HOME/.screenrc"
540 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
543 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
544 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
545 alias la='ls -la --color=auto'
546 alias ll='ls -l --color=auto'
547 alias lh='ls -hAl --color=auto'
548 alias l='ls -lF --color=auto'
557 alias cp='nocorrect cp' # no spelling correction on cp
558 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
559 alias mv='nocorrect mv' # no spelling correction on mv
560 alias rm='nocorrect rm' # no spelling correction on rm
565 alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth.
567 # I like clean prompt, so provide simple way to get that
568 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
570 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
571 if [ -x /usr/sbin/truecrypt ] ; then
573 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
575 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
579 zsh-help(){print "$bg[white]$fg[black]
580 zsh-help - hints for use of zsh on grml
581 =======================================$reset_color
583 Main configuration of zsh happens in /etc/zsh/zshrc (global)
584 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
585 The files are part of the package grml-etc-core, if you want to
586 use them on a non-grml-system just get the tar.gz from
587 http://deb.grml.org/ or get the files from the mercurial
590 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
591 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
593 If you want to stay in sync with zsh configuration of grml
594 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
595 your own stuff in \$HOME/.zshrc.local. System wide configuration
596 without touching configuration files of grml can take place
597 in /etc/zsh/zshrc.local.
599 If you want to use the configuration of user grml also when
600 running as user root just run 'zshskel' which will source
601 the file /etc/skel/.zshrc.
603 For information regarding zsh start at http://grml.org/zsh/
605 Take a look at grml's zsh refcard:
606 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
608 Check out the main zsh refcard:
609 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
611 And of course visit the zsh-lovers:
614 You can adjust some options through environment variables when
615 invoking zsh without having to edit configuration files.
616 Basically meant for bash users who are not used to the power of
619 \"NOCOR=1 zsh\" => deactivate automatic correction
620 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
621 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
622 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
624 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
625 Enjoy your grml system with the zsh!$reset_color"
629 if [ -r /etc/debian_version ] ; then
630 alias acs='apt-cache search'
631 alias acsh='apt-cache show'
632 alias acp='apt-cache policy'
633 alias adg="$SUDO apt-get dist-upgrade"
634 alias agi="$SUDO apt-get install"
635 alias ag="$SUDO apt-get upgrade"
636 alias au="$SUDO apt-get update"
637 alias dbp='dpkg-buildpackage'
638 alias ge='grep-excuses'
642 if [ -z "$1" ] ; then
644 $SUDO apt-get -u upgrade
646 ssh $1 $SUDO apt-get update
647 # ask before the upgrade
649 ssh $1 $SUDO apt-get --no-act upgrade
650 echo -n 'Process the upgrade?'
652 if [[ $dummy == "y" ]] ; then
653 ssh $1 $SUDO apt-get -u upgrade --yes
658 isgrmlcd && alias su="sudo su" # change to user root
659 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
660 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
663 # sort installed Debian-packages by size
664 if [ -x /usr/bin/grep-status ] ; then
665 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
666 -n "install ok installed" | paste -sd " \n" | sort -rn'
669 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
670 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
671 if [ -x $(which wodim) ] ; then
672 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
673 See #377109 in the BTS of Debian for more details.
675 Please use the wodim binary instead' ; return 1"
679 # I hate lacking backward compability, so provide an alternative therefore
680 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
681 function apache2-ssl-certificate(){
683 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
684 print 'You might want to take a look at Debian the package ssl-cert as well.'
685 print 'To generate a certificate for use with apache2 follow the instructions:'
689 export RANDFILE=/dev/random
690 mkdir /etc/apache2/ssl/
691 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
692 chmod 600 /etc/apache2/ssl/apache.pem
694 Run "grml-tips ssl-certificate" if you need further instructions.
700 # {{{ Use hard limits, except for a smaller stack and no core dumps
703 isgrmlcd && limit core 0 # important for a live-cd-system
707 # {{{ completion stuff
709 # Where to look for autoloaded function definitions
710 if [ -d /etc/zsh/completion.d ] ; then
711 local comp=/etc/zsh/completion.d
712 for func in $comp/*(N-.:t); . ${comp}/${func}
715 # called later (via is4 && grmlcomp)
716 # notice: use 'zstyle' for getting current settings
717 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
720 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
721 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
722 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
723 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
724 zstyle ':completion:*:correct:*' original true #
725 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
726 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
727 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
728 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
729 zstyle ':completion:*:history-words' list false #
730 zstyle ':completion:*:history-words' menu yes # activate menu
731 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
732 zstyle ':completion:*:history-words' stop yes #
733 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
734 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
735 zstyle ':completion:*' group-name ''
736 if [[ -z "$NOMENU" ]] ; then
737 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
739 setopt no_auto_menu # don't use any menus at all
741 zstyle ':completion:*:messages' format '%d' #
742 zstyle ':completion:*:options' auto-description '%d' #
743 zstyle ':completion:*:options' description 'yes' # describe options in full
744 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
745 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
746 zstyle ':completion:*' verbose true # provide verbose completion information
747 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
748 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
749 zstyle ':completion:correct:' prompt 'correct to: %e' #
750 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
752 # complete manual by their section
753 zstyle ':completion:*:manuals' separate-sections true
754 zstyle ':completion:*:manuals.*' insert-sections true
755 zstyle ':completion:*:man:*' menu yes select
758 # run rehash on completion so new installed program are found automatically:
760 (( CURRENT == 1 )) && rehash
761 return 1 # Because we didn't really complete anything
763 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
764 if [[ -n "$NOCOR" ]] ; then
765 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete
766 setopt nocorrect # do not try to correct the spelling if possible
768 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate
769 setopt correct # try to correct the spelling if possible
770 zstyle -e ':completion:*' completer '
771 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
772 _last_try="$HISTNO$BUFFER$CURSOR"
773 reply=(_complete _match _prefix)
775 if [[ $words[1] = (rm|mv) ]]; then
778 reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
782 # zstyle ':completion:*' completer _complete _correct _approximate
783 # zstyle ':completion:*' expand prefix suffix
785 # automatic rehash? Credits go to Frank Terbeck
786 # function my_accept () {
788 # [[ -z ${BUFFER} ]] && zle accept-line && return
789 # buf=( ${(z)BUFFER} )
790 # [[ -z ${commands[${buf[1]}]} ]] && rehash
794 # bindkey "^M" my_accept
796 # command for process lists, the local web server details and host completion
797 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
800 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
801 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
803 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
805 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
806 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
818 zstyle ':completion:*:hosts' hosts $hosts
819 # zstyle '*' hosts $hosts
821 # specify your logins:
823 # {grml,grml1}@foo.invalid
824 # grml-devel@bar.invalid
827 # {fred,root}@foo.invalid
830 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
831 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
833 # specify specific port/service settings:
834 # telnet_users_hosts_ports=(
837 # @mail-server:{smtp,pop3}
841 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
843 # use generic completion system for programs not yet defined:
844 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
846 # see upgrade function in this file
847 compdef _hosts upgrade
853 # people should use 'grml-x'!
855 if [ -e /etc/X11/xorg.conf ] ; then
856 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
858 echo "Please use the script \"grml-x\" for starting the X Window System
859 because there does not exist /etc/X11/xorg.conf yet.
860 If you want to use startx anyway please call \"/usr/bin/startx\"."
866 if [ -e /etc/X11/xorg.conf ] ; then
867 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
869 echo "Please use the script \"grml-x\" for starting the X Window System.
870 because there does not exist /etc/X11/xorg.conf yet.
871 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
876 if [ -x /usr/sbin/915resolution ] ; then
877 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
880 alias grml-version='cat /etc/grml_version'
882 if [ -x /usr/sbin/rebuildfstab ] ; then
883 alias grml-rebuildfstab='rebuildfstab -v -r -config'
888 # {{{ now run the functions
890 is4 && isgrml && grmlstuff
895 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
898 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
899 # You use it as follows:
900 # $ NTREF=/reference/file
902 # This lists all the files in the current directory newer than the reference file.
903 # You can also specify the reference file inline; note quotes:
904 # $ ls -l *(e:'nt ~/.zshenv':)
909 [[ $REPLY -nt $NTREF ]]
913 # shell functions {{{
914 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
915 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
917 if [[ "$#*" -eq 0 ]]; then
918 [ -r ~/.zshrc ] && . ~/.zshrc
927 compdef _functions reload freload
930 if type -p qma &>/dev/null ; then
931 manzsh() { qma zshall "$1" }
934 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
935 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
936 # manzsh() { man zshall | $MYLESS -p $1 ; }
939 # use "dchange <package-name>" to view Debian's changelog of the package:
941 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
942 most /usr/share/doc/${1}/changelog.Debian.gz
944 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
945 most /usr/share/doc/${1}/changelog.gz
947 echo "No changelog for package $1 found, sorry."
952 _dchange() { _files -W /usr/share/doc -/ }
953 compdef _dchange dchange
955 # use "uchange <package-name>" to view upstream's changelog of the package:
957 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
958 most /usr/share/doc/${1}/changelog.gz
960 echo "No changelog for package $1 found, sorry."
964 _uchange() { _files -W /usr/share/doc -/ }
965 compdef _uchange uchange
969 ZSH_PROFILE_RC=1 $SHELL "$@"
972 # edit alias via zle:
974 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
976 compdef _aliases edalias
978 # edit function via zle:
980 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
982 compdef _functions edfunc
984 # use it e.g. via 'Restart apache2'
985 if [ -d /etc/init.d ] ; then
986 for i in Start Restart Stop Force-Reload Reload ; do
987 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
989 # now the completion for this:
990 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
993 # provide useful information on globbing
1000 p named pipes (FIFOs)
1001 * executable plain files (0100)
1002 % device files (character or block special)
1003 %b block special files
1004 %c character special files
1005 r owner-readable files (0400)
1006 w owner-writable files (0200)
1007 x owner-executable files (0100)
1008 A group-readable files (0040)
1009 I group-writable files (0020)
1010 E group-executable files (0010)
1011 R world-readable files (0004)
1012 W world-writable files (0002)
1013 X world-executable files (0001)
1014 s setuid files (04000)
1015 S setgid files (02000)
1016 t files with the sticky bit (01000)
1018 print *(m-1) # Files modified up to a day ago
1019 print *(a1) # Files accessed a day ago
1020 print *(@) # Just symlinks
1021 print *(Lk+50) # Files bigger than 50 kilobytes
1022 print *(Lk-50) # Files smaller than 50 kilobytes
1023 print **/*.c # All *.c files recursively starting in \$PWD
1024 print **/*.c~file.c # Same as above, but excluding 'file.c'
1025 print (foo|bar).* # Files starting with 'foo' or 'bar'
1026 print *~*.* # All Files that do not contain a dot
1027 chmod 644 *(.^x) # make all plain non-executable files publically readable
1028 print -l *(.c|.h) # Lists *.c and *.h
1029 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1030 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1032 alias help-zshglob=H-Glob
1034 type -p qma &>/dev/null && alias ?='qma zshall'
1036 # grep for running process, like: 'any vim'
1038 if [ -z "$1" ] ; then
1039 echo "any - grep for process(es) by keyword" >&2
1040 echo "Usage: any <keyword>" >&2 ; return 1
1043 local LENGTH=$(expr length $STRING)
1044 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1045 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1046 ps xauwww| grep "[$FIRSCHAR]$REST"
1050 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1051 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1052 [ -r /proc/1/maps ] && deswap() {
1053 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1054 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1055 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1058 # print hex value of a number
1060 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1063 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1064 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1066 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1067 perl -e "print eval($CALC),\"\n\";"
1069 functions peval &>/dev/null && alias calc=peval
1071 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1073 # NO_SWITCH="yes" command bash "$@"
1076 # exec $SHELL $SHELL_ARGS "$@"
1081 # log out? set timeout in seconds {{{
1083 # do not log out in some specific terminals:
1084 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1089 # {{{ make sure our environment is clean regarding colors
1090 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1093 # source another config file if present {{{
1094 if [ -r /etc/zsh/zshrc.local ]; then
1095 source /etc/zsh/zshrc.local
1099 # "persistent history" {{{
1100 # just write important commands you always need to ~/.important_commands
1101 if [ -r ~/.important_commands ] ; then
1102 fc -R ~/.important_commands
1106 ## END OF FILE #################################################################
1107 # vim:foldmethod=marker expandtab