Última actividad 1765272910

Modified .zshrc files based on Grml's defaults

jce revisó este gist 1765272910. Ir a la revisión

2 files changed, 3798 insertions, 492 deletions

.zshrc

@@ -170,56 +170,6 @@ EOF
170 170 # load .zshrc.pre to give the user the chance to overwrite the defaults
171 171 [[ -r ${ZDOTDIR:-${HOME}}/.zshrc.pre ]] && source ${ZDOTDIR:-${HOME}}/.zshrc.pre
172 172
173 - # check for version/system
174 - # check for versions (compatibility reasons)
175 - function is51 () {
176 - [[ $ZSH_VERSION == 5.<1->* ]] && return 0
177 - return 1
178 - }
179 -
180 - function is4 () {
181 - [[ $ZSH_VERSION == <4->* ]] && return 0
182 - return 1
183 - }
184 -
185 - function is41 () {
186 - [[ $ZSH_VERSION == 4.<1->* || $ZSH_VERSION == <5->* ]] && return 0
187 - return 1
188 - }
189 -
190 - function is42 () {
191 - [[ $ZSH_VERSION == 4.<2->* || $ZSH_VERSION == <5->* ]] && return 0
192 - return 1
193 - }
194 -
195 - function is425 () {
196 - [[ $ZSH_VERSION == 4.2.<5->* || $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
197 - return 1
198 - }
199 -
200 - function is43 () {
201 - [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
202 - return 1
203 - }
204 -
205 - function is433 () {
206 - [[ $ZSH_VERSION == 4.3.<3->* || $ZSH_VERSION == 4.<4->* \
207 - || $ZSH_VERSION == <5->* ]] && return 0
208 - return 1
209 - }
210 -
211 - function is437 () {
212 - [[ $ZSH_VERSION == 4.3.<7->* || $ZSH_VERSION == 4.<4->* \
213 - || $ZSH_VERSION == <5->* ]] && return 0
214 - return 1
215 - }
216 -
217 - function is439 () {
218 - [[ $ZSH_VERSION == 4.3.<9->* || $ZSH_VERSION == 4.<4->* \
219 - || $ZSH_VERSION == <5->* ]] && return 0
220 - return 1
221 - }
222 -
223 173 #f1# Checks whether or not you're running grml
224 174 function isgrml () {
225 175 [[ -f /etc/grml_version ]] && return 0
@@ -262,10 +212,6 @@ function isopenbsd () {
262 212 [[ $GRML_OSTYPE == "OpenBSD" ]]
263 213 }
264 214
265 - function issolaris () {
266 - [[ $GRML_OSTYPE == "SunOS" ]]
267 - }
268 -
269 215 #f1# are we running within an utf environment?
270 216 function isutfenv () {
271 217 case "$LANG $CHARSET $LANGUAGE" in
@@ -278,32 +224,21 @@ function isutfenv () {
278 224 # check for user, if not running as root set $SUDO to sudo
279 225 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
280 226
281 - # change directory to home on first invocation of zsh
282 - # important for rungetty -> autologin
283 - # Thanks go to Bart Schaefer!
284 - isgrml && function checkhome () {
285 - if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then
286 - export ALREADY_DID_CD_HOME=$HOME
287 - cd
288 - fi
289 - }
290 -
291 - # check for zsh v3.1.7+
227 + # check for zsh v5.1+
292 228
293 - if ! [[ ${ZSH_VERSION} == 3.1.<7->* \
294 - || ${ZSH_VERSION} == 3.<2->.<->* \
295 - || ${ZSH_VERSION} == <4->.<->* ]] ; then
229 + if ! [[ ${ZSH_VERSION} == 5.<1->* \
230 + || ${ZSH_VERSION} == <6->.<->* ]] ; then
296 231
297 232 printf '-!-\n'
298 - printf '-!- In this configuration we try to make use of features, that only\n'
299 - printf '-!- require version 3.1.7 of the shell; That way this setup can be\n'
233 + printf '-!- In this configuration we try to make use of features, that\n'
234 + printf '-!- require version 5.1 of the shell; That way this setup can be\n'
300 235 printf '-!- used with a wide range of zsh versions, while using fairly\n'
301 236 printf '-!- advanced features in all supported versions.\n'
302 237 printf '-!-\n'
303 238 printf '-!- However, you are running zsh version %s.\n' "$ZSH_VERSION"
304 239 printf '-!-\n'
305 240 printf '-!- While this *may* work, it might as well fail.\n'
306 - printf '-!- Please consider updating to at least version 3.1.7 of zsh.\n'
241 + printf '-!- Please consider updating to at least version 5.1 of zsh.\n'
307 242 printf '-!-\n'
308 243 printf '-!- DO NOT EXPECT THIS TO WORK FLAWLESSLY!\n'
309 244 printf '-!- If it does today, you'\''ve been lucky.\n'
@@ -330,90 +265,12 @@ function zrcautoload () {
330 265 done
331 266
332 267 (( ffound == 0 )) && return 1
333 - if [[ $ZSH_VERSION == 3.1.<6-> || $ZSH_VERSION == <4->* ]] ; then
334 - autoload -U ${ffile} || return 1
335 - else
336 - autoload ${ffile} || return 1
337 - fi
268 + autoload -U ${ffile} || return 1
338 269 return 0
339 270 }
340 271
341 - # The following is the ‘add-zsh-hook’ function from zsh upstream. It is
342 - # included here to make the setup work with older versions of zsh (prior to
343 - # 4.3.7) in which this function had a bug that triggers annoying errors during
344 - # shell startup. This is exactly upstreams code from f0068edb4888a4d8fe94def,
345 - # with just a few adjustments in coding style to make the function look more
346 - # compact. This definition can be removed as soon as we raise the minimum
347 - # version requirement to 4.3.7 or newer.
348 - function add-zsh-hook () {
349 - # Add to HOOK the given FUNCTION.
350 - # HOOK is one of chpwd, precmd, preexec, periodic, zshaddhistory,
351 - # zshexit, zsh_directory_name (the _functions subscript is not required).
352 - #
353 - # With -d, remove the function from the hook instead; delete the hook
354 - # variable if it is empty.
355 - #
356 - # -D behaves like -d, but pattern characters are active in the function
357 - # name, so any matching function will be deleted from the hook.
358 - #
359 - # Without -d, the FUNCTION is marked for autoload; -U is passed down to
360 - # autoload if that is given, as are -z and -k. (This is harmless if the
361 - # function is actually defined inline.)
362 - emulate -L zsh
363 - local -a hooktypes
364 - hooktypes=(
365 - chpwd precmd preexec periodic zshaddhistory zshexit
366 - zsh_directory_name
367 - )
368 - local usage="Usage: $0 hook function\nValid hooks are:\n $hooktypes"
369 - local opt
370 - local -a autoopts
371 - integer del list help
372 - while getopts "dDhLUzk" opt; do
373 - case $opt in
374 - (d) del=1 ;;
375 - (D) del=2 ;;
376 - (h) help=1 ;;
377 - (L) list=1 ;;
378 - ([Uzk]) autoopts+=(-$opt) ;;
379 - (*) return 1 ;;
380 - esac
381 - done
382 - shift $(( OPTIND - 1 ))
383 - if (( list )); then
384 - typeset -mp "(${1:-${(@j:|:)hooktypes}})_functions"
385 - return $?
386 - elif (( help || $# != 2 || ${hooktypes[(I)$1]} == 0 )); then
387 - print -u$(( 2 - help )) $usage
388 - return $(( 1 - help ))
389 - fi
390 - local hook="${1}_functions"
391 - local fn="$2"
392 - if (( del )); then
393 - # delete, if hook is set
394 - if (( ${(P)+hook} )); then
395 - if (( del == 2 )); then
396 - set -A $hook ${(P)hook:#${~fn}}
397 - else
398 - set -A $hook ${(P)hook:#$fn}
399 - fi
400 - # unset if no remaining entries --- this can give better
401 - # performance in some cases
402 - if (( ! ${(P)#hook} )); then
403 - unset $hook
404 - fi
405 - fi
406 - else
407 - if (( ${(P)+hook} )); then
408 - if (( ${${(P)hook}[(I)$fn]} == 0 )); then
409 - set -A $hook ${(P)hook} $fn
410 - fi
411 - else
412 - set -A $hook $fn
413 - fi
414 - autoload $autoopts -- $fn
415 - fi
416 - }
272 + # Autoload zsh's hook system early, so we can use it whenever we need.
273 + zrcautoload add-zsh-hook || add-zsh-hook () { :; }
417 274
418 275 # Load is-at-least() for more precise version checks Note that this test will
419 276 # *always* fail, if the is-at-least function could not be marked for
@@ -427,7 +284,7 @@ zrcautoload is-at-least || function is-at-least () { return 1 }
427 284 setopt append_history
428 285
429 286 # import new commands from the history file also in other zsh-session
430 - is4 && setopt share_history
287 + setopt share_history
431 288
432 289 # save each command's beginning timestamp and the duration to the history file
433 290 setopt extended_history
@@ -483,6 +340,7 @@ setopt unset
483 340 NOCOR=${NOCOR:-0}
484 341 NOETCHOSTS=${NOETCHOSTS:-0}
485 342 NOMENU=${NOMENU:-0}
343 + NOPATHHELPER=${NOPATHHELPER:-0}
486 344 NOPRECMD=${NOPRECMD:-0}
487 345 COMMAND_NOT_FOUND=${COMMAND_NOT_FOUND:-0}
488 346 GRML_ZSH_CNF_HANDLER=${GRML_ZSH_CNF_HANDLER:-/usr/share/command-not-found/command-not-found}
@@ -622,20 +480,6 @@ function xcat () {
622 480 return 0
623 481 }
624 482
625 - # Remove these functions again, they are of use only in these
626 - # setup files. This should be called at the end of .zshrc.
627 - function xunfunction () {
628 - emulate -L zsh
629 - local -a funcs
630 - local func
631 - funcs=(salias xcat xsource xunfunction zrcautoload zrcautozle)
632 - for func in $funcs ; do
633 - [[ -n ${functions[$func]} ]] \
634 - && unfunction $func
635 - done
636 - return 0
637 - }
638 -
639 483 # this allows us to stay in sync with grml's zshrc and put own
640 484 # modifications in ~/.zshrc.local
641 485 function zrclocal () {
@@ -649,7 +493,7 @@ if (( ZSH_NO_DEFAULT_LOCALE == 0 )); then
649 493 xsource "/etc/default/locale"
650 494 fi
651 495
652 - for var in LANG LC_ALL LC_MESSAGES ; do
496 + for var in LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME ; do
653 497 [[ -n ${(P)var} ]] && export $var
654 498 done
655 499 builtin unset -v var
@@ -670,19 +514,16 @@ export MAIL=${MAIL:-/var/mail/$USER}
670 514
671 515 # color setup for ls:
672 516 check_com -c dircolors && eval $(dircolors -b)
673 - # color setup for ls on OS X / FreeBSD:
674 - isdarwin && export CLICOLOR=1
675 - isfreebsd && export CLICOLOR=1
676 517
677 - # do MacPorts setup on darwin
518 + # Setup PATH from system defaults on macOS.
519 + if [[ -x /usr/libexec/path_helper ]] && [[ "$NOPATHHELPER" -eq 0 ]] ; then
520 + eval $(/usr/libexec/path_helper -s)
521 + fi
522 + # Add MacPorts PATH on darwin/macOS.
678 523 if isdarwin && [[ -d /opt/local ]]; then
679 - # Note: PATH gets set in /etc/zprofile on Darwin, so this can't go into
680 - # zshenv.
681 524 PATH="/opt/local/bin:/opt/local/sbin:$PATH"
682 525 MANPATH="/opt/local/share/man:$MANPATH"
683 526 fi
684 - # do Fink setup on darwin
685 - isdarwin && xsource /sw/bin/init.sh
686 527
687 528 # load our function and completion directories
688 529 for fdir in /usr/share/grml/zsh/completion /usr/share/grml/zsh/functions; do
@@ -716,18 +557,15 @@ watch=(notme root)
716 557 typeset -U path PATH cdpath CDPATH fpath FPATH manpath MANPATH
717 558
718 559 # Load a few modules
719 - is4 && \
720 560 for mod in parameter complist deltochar mathfunc ; do
721 561 zmodload -i zsh/${mod} 2>/dev/null
722 562 grml_status_feature mod:$mod $?
723 563 done && builtin unset -v mod
724 564
725 565 # autoload zsh modules when they are referenced
726 - if is4 ; then
727 - zmodload -a zsh/stat zstat
728 - zmodload -a zsh/zpty zpty
729 - zmodload -ap zsh/mapfile mapfile
730 - fi
566 + zmodload -a zsh/stat zstat
567 + zmodload -a zsh/zpty zpty
568 + zmodload -ap zsh/mapfile mapfile
731 569
732 570 # completion system
733 571 COMPDUMPFILE=${COMPDUMPFILE:-${ZDOTDIR:-${HOME}}/.zcompdump}
@@ -744,7 +582,7 @@ fi
744 582
745 583 # completion system
746 584
747 - # called later (via is4 && grmlcomp)
585 + # called later (via grmlcomp)
748 586 # note: use 'zstyle' for getting current settings
749 587 # press ^xh (control-x h) for getting tags in context; ^x? (control-x ?) to run complete_debug with trace output
750 588 function grmlcomp () {
@@ -891,27 +729,21 @@ function grmlcomp () {
891 729 fi
892 730
893 731 # host completion
894 - _etc_hosts=()
895 732 _ssh_config_hosts=()
733 + if [[ -r ~/.ssh/config ]] ; then
734 + _ssh_config_hosts=(${${(s: :)${(ps:\t:)${${(@M)${(f)"$(<$HOME/.ssh/config)"}:#Host *}#Host }}}:#*[*?]*})
735 + fi
896 736 _ssh_hosts=()
897 - if is42 ; then
898 - if [[ -r ~/.ssh/config ]] ; then
899 - _ssh_config_hosts=(${${(s: :)${(ps:\t:)${${(@M)${(f)"$(<$HOME/.ssh/config)"}:#Host *}#Host }}}:#*[*?]*})
900 - fi
901 -
902 - if [[ -r ~/.ssh/known_hosts ]] ; then
903 - _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*})
904 - fi
905 -
906 - if [[ -r /etc/hosts ]] && [[ "$NOETCHOSTS" -eq 0 ]] ; then
907 - : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(grep -v '^0\.0\.0\.0\|^127\.0\.0\.1\|^::1 ' /etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}}
908 - fi
737 + if [[ -r ~/.ssh/known_hosts ]] ; then
738 + _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*})
739 + fi
740 + _etc_hosts=()
741 + if [[ -r /etc/hosts ]] && [[ "$NOETCHOSTS" -eq 0 ]] ; then
742 + : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(grep -v '^0\.0\.0\.0\|^127\.0\.0\.1\|^::1 ' /etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}}
909 743 fi
910 744
911 - local localname
912 - localname="$(uname -n)"
913 745 hosts=(
914 - "${localname}"
746 + "$HOST"
915 747 "$_ssh_config_hosts[@]"
916 748 "$_ssh_hosts[@]"
917 749 "$_etc_hosts[@]"
@@ -1144,6 +976,8 @@ abk=(
1144 976 'G' '|& grep '${grep_options:+"${grep_options[*]}"}
1145 977 'H' '| head'
1146 978 'Hl' ' --help |& less -r' #d (Display help in pager)
979 + 'J' '| jq'
980 + 'K' '| keep'
1147 981 'L' '| less'
1148 982 'LL' '|& less -r'
1149 983 'M' '| most'
@@ -1152,6 +986,7 @@ abk=(
1152 986 'SL' '| sort | less'
1153 987 'S' '| sort -u'
1154 988 'T' '| tail'
989 + 'TS' '| ts "%F %H:%M:%.S"'
1155 990 'V' '|& vim -'
1156 991 #A# end
1157 992 'co' './configure && make && sudo make install'
@@ -1652,13 +1487,8 @@ zrcautoload zed
1652 1487 # else
1653 1488 # print 'Notice: no url-quote-magic available :('
1654 1489 # fi
1655 - if is51 ; then
1656 - # url-quote doesn't work without bracketed-paste-magic since Zsh 5.1
1657 - alias url-quote='autoload -U bracketed-paste-magic url-quote-magic;
1658 - zle -N bracketed-paste bracketed-paste-magic; zle -N self-insert url-quote-magic'
1659 - else
1660 - alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
1661 - fi
1490 + alias url-quote='autoload -U bracketed-paste-magic url-quote-magic;
1491 + zle -N bracketed-paste bracketed-paste-magic; zle -N self-insert url-quote-magic'
1662 1492
1663 1493 #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
1664 1494 alias run-help >&/dev/null && unalias run-help
@@ -1681,8 +1511,11 @@ function command_not_found_handler () {
1681 1511
1682 1512 #v#
1683 1513 HISTFILE=${HISTFILE:-${ZDOTDIR:-${HOME}}/.zsh_history}
1684 - isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
1685 - isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
1514 + # override settings only if the defaults from zsh are in place
1515 + if [[ -z $HISTSIZE || $HISTSIZE -eq 30 ]] ; then
1516 + HISTSIZE=5000
1517 + SAVEHIST=10000 # useful for setopt append_history
1518 + fi
1686 1519
1687 1520 # dirstack handling
1688 1521
@@ -1707,6 +1540,7 @@ if zstyle -T ':grml:chpwd:dirstack' enable; then
1707 1540
1708 1541 function chpwd () {
1709 1542 (( ZSH_SUBSHELL )) && return
1543 + [[ -z $DIRSTACKSIZE ]] && return
1710 1544 (( $DIRSTACKSIZE <= 0 )) && return
1711 1545 [[ -z $DIRSTACKFILE ]] && return
1712 1546 grml_dirstack_filter $PWD && return
@@ -1740,8 +1574,6 @@ fi
1740 1574
1741 1575 # directory based profiles
1742 1576
1743 - if is433 ; then
1744 -
1745 1577 # chpwd_profiles(): Directory Profiles, Quickstart:
1746 1578 #
1747 1579 # In .zshrc.local:
@@ -1777,41 +1609,17 @@ function chpwd_profiles () {
1777 1609
1778 1610 chpwd_functions=( ${chpwd_functions} chpwd_profiles )
1779 1611
1780 - fi # is433
1781 -
1782 1612 # Prompt setup for grml:
1783 1613
1784 - # set colors for use in prompts (modern zshs allow for the use of %F{red}foo%f
1785 - # in prompts to get a red "foo" embedded, but it's good to keep these for
1786 - # backwards compatibility).
1787 - if is437; then
1788 - BLUE="%F{blue}"
1789 - RED="%F{red}"
1790 - GREEN="%F{green}"
1791 - CYAN="%F{cyan}"
1792 - MAGENTA="%F{magenta}"
1793 - YELLOW="%F{yellow}"
1794 - WHITE="%F{white}"
1795 - NO_COLOR="%f"
1796 - elif zrcautoload colors && colors 2>/dev/null ; then
1797 - BLUE="%{${fg[blue]}%}"
1798 - RED="%{${fg_bold[red]}%}"
1799 - GREEN="%{${fg[green]}%}"
1800 - CYAN="%{${fg[cyan]}%}"
1801 - MAGENTA="%{${fg[magenta]}%}"
1802 - YELLOW="%{${fg[yellow]}%}"
1803 - WHITE="%{${fg[white]}%}"
1804 - NO_COLOR="%{${reset_color}%}"
1805 - else
1806 - BLUE=$'%{\e[1;34m%}'
1807 - RED=$'%{\e[1;31m%}'
1808 - GREEN=$'%{\e[1;32m%}'
1809 - CYAN=$'%{\e[1;36m%}'
1810 - WHITE=$'%{\e[1;37m%}'
1811 - MAGENTA=$'%{\e[1;35m%}'
1812 - YELLOW=$'%{\e[1;33m%}'
1813 - NO_COLOR=$'%{\e[0m%}'
1814 - fi
1614 + # set colors for use in prompts.
1615 + BLUE="%F{blue}"
1616 + RED="%F{red}"
1617 + GREEN="%F{green}"
1618 + CYAN="%F{cyan}"
1619 + MAGENTA="%F{magenta}"
1620 + YELLOW="%F{yellow}"
1621 + WHITE="%F{white}"
1622 + NO_COLOR="%f"
1815 1623
1816 1624 # First, the easy ones: PS2..4:
1817 1625
@@ -1969,16 +1777,6 @@ fi
1969 1777 # gather version control information for inclusion in a prompt
1970 1778
1971 1779 if zrcautoload vcs_info; then
1972 - # `vcs_info' in zsh versions 4.3.10 and below have a broken `_realpath'
1973 - # function, which can cause a lot of trouble with our directory-based
1974 - # profiles. So:
1975 - if [[ ${ZSH_VERSION} == 4.3.<-10> ]] ; then
1976 - function VCS_INFO_realpath () {
1977 - setopt localoptions NO_shwordsplit chaselinks
1978 - ( builtin cd -q $1 2> /dev/null && pwd; )
1979 - }
1980 - fi
1981 -
1982 1780 zstyle ':vcs_info:*' max-exports 2
1983 1781
1984 1782 if [[ -o restricted ]]; then
@@ -2159,10 +1957,6 @@ __EOF0__
2159 1957 function grml_prompt_setup () {
2160 1958 emulate -L zsh
2161 1959 autoload -Uz vcs_info
2162 - # The following autoload is disabled for now, since this setup includes a
2163 - # static version of the ‘add-zsh-hook’ function above. It needs to be
2164 - # re-enabled as soon as that static definition is removed again.
2165 - #autoload -Uz add-zsh-hook
2166 1960 add-zsh-hook precmd prompt_$1_precmd
2167 1961 }
2168 1962
@@ -2520,41 +2314,34 @@ else
2520 2314 function precmd () { (( ${+functions[vcs_info]} )) && vcs_info; }
2521 2315 fi
2522 2316
2523 - if is437; then
2524 - # The prompt themes use modern features of zsh, that require at least
2525 - # version 4.3.7 of the shell. Use the fallback otherwise.
2526 - if [[ $GRML_DISPLAY_BATTERY -gt 0 ]]; then
2527 - zstyle ':prompt:grml:right:setup' items sad-smiley battery
2528 - add-zsh-hook precmd battery
2529 - fi
2530 - if [[ "$TERM" == dumb ]] ; then
2531 - zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" pre ''
2532 - zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" post ' '
2533 - for i in rc user path jobs history date time shell-level; do
2534 - zstyle ":prompt:grml(|-large|-chroot):*:items:$i" pre ''
2535 - zstyle ":prompt:grml(|-large|-chroot):*:items:$i" post ''
2536 - done
2537 - unset i
2538 - zstyle ':prompt:grml(|-large|-chroot):right:setup' use-rprompt false
2539 - elif (( EUID == 0 )); then
2540 - zstyle ':prompt:grml(|-large|-chroot):*:items:user' pre '%B%F{red}'
2541 - fi
2317 + if [[ $GRML_DISPLAY_BATTERY -gt 0 ]]; then
2318 + zstyle ':prompt:grml:right:setup' items sad-smiley battery
2319 + add-zsh-hook precmd battery
2320 + fi
2321 + if [[ "$TERM" == dumb ]] ; then
2322 + zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" pre ''
2323 + zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" post ' '
2324 + for i in rc user path jobs history date time shell-level; do
2325 + zstyle ":prompt:grml(|-large|-chroot):*:items:$i" pre ''
2326 + zstyle ":prompt:grml(|-large|-chroot):*:items:$i" post ''
2327 + done
2328 + unset i
2329 + zstyle ':prompt:grml(|-large|-chroot):right:setup' use-rprompt false
2330 + elif (( EUID == 0 )); then
2331 + zstyle ':prompt:grml(|-large|-chroot):*:items:user' pre '%B%F{red}'
2332 + fi
2542 2333
2543 - # Finally enable one of the prompts.
2544 - if [[ -n $GRML_CHROOT ]]; then
2545 - prompt grml-chroot
2546 - elif [[ $GRMLPROMPT -gt 0 ]]; then
2547 - prompt grml-large
2548 - else
2549 - prompt grml
2550 - fi
2334 + # Finally enable one of the prompts.
2335 + if [[ -n $GRML_CHROOT ]]; then
2336 + prompt grml-chroot
2337 + elif [[ $GRMLPROMPT -gt 0 ]]; then
2338 + prompt grml-large
2551 2339 else
2552 - grml_prompt_fallback
2553 - function precmd () { (( ${+functions[vcs_info]} )) && vcs_info; }
2340 + prompt grml
2554 2341 fi
2555 2342
2556 2343 # make sure to use right prompt only when not running a command
2557 - is41 && setopt transient_rprompt
2344 + setopt transient_rprompt
2558 2345
2559 2346 # Terminal-title wizardry
2560 2347
@@ -2596,21 +2383,11 @@ function grml_vcs_to_screen_title () {
2596 2383 fi
2597 2384 }
2598 2385
2599 - function grml_maintain_name () {
2600 - local localname
2601 - localname="$(uname -n)"
2602 -
2603 - # set hostname if not running on local machine
2604 - if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != "${localname}" ]] ; then
2605 - NAME="@$HOSTNAME"
2606 - fi
2607 - }
2608 -
2609 2386 function grml_cmd_to_screen_title () {
2610 - # get the name of the program currently running and hostname of local
2611 - # machine set screen window title if running in a screen
2387 + # get the name of the currently running program to set screen window title
2388 + # if running in a screen.
2612 2389 if [[ "$TERM" == screen* ]] ; then
2613 - local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME"
2390 + local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}"
2614 2391 ESC_print ${CMD}
2615 2392 fi
2616 2393 }
@@ -2623,14 +2400,9 @@ function grml_control_xterm_title () {
2623 2400 esac
2624 2401 }
2625 2402
2626 - # The following autoload is disabled for now, since this setup includes a
2627 - # static version of the ‘add-zsh-hook’ function above. It needs to be
2628 - # re-enabled as soon as that static definition is removed again.
2629 - #zrcautoload add-zsh-hook || add-zsh-hook () { :; }
2630 2403 if [[ $NOPRECMD -eq 0 ]]; then
2631 2404 add-zsh-hook precmd grml_reset_screen_title
2632 2405 add-zsh-hook precmd grml_vcs_to_screen_title
2633 - add-zsh-hook preexec grml_maintain_name
2634 2406 add-zsh-hook preexec grml_cmd_to_screen_title
2635 2407 if [[ $NOTITLE -eq 0 ]]; then
2636 2408 add-zsh-hook preexec grml_control_xterm_title
@@ -2700,38 +2472,6 @@ if [[ -x /sbin/kexec ]] && [[ -r /proc/cmdline ]] ; then
2700 2472 alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
2701 2473 fi
2702 2474
2703 - # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
2704 - alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
2705 - alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
2706 -
2707 - # make sure it is not assigned yet
2708 - [[ -n ${aliases[utf2iso]} ]] && unalias utf2iso
2709 - function utf2iso () {
2710 - if isutfenv ; then
2711 - local ENV
2712 - for ENV in $(env | command grep -i '.utf') ; do
2713 - eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
2714 - done
2715 - fi
2716 - }
2717 -
2718 - # make sure it is not assigned yet
2719 - [[ -n ${aliases[iso2utf]} ]] && unalias iso2utf
2720 - function iso2utf () {
2721 - if ! isutfenv ; then
2722 - local ENV
2723 - for ENV in $(env | command grep -i '\.iso') ; do
2724 - eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
2725 - done
2726 - fi
2727 - }
2728 -
2729 - # especially for roadwarriors using GNU screen and ssh:
2730 - if ! check_com asc &>/dev/null ; then
2731 - function asc () { autossh -t "$@" 'screen -RdU' }
2732 - compdef asc=ssh
2733 - fi
2734 -
2735 2475 #f1# Hints for the use of zsh on grml
2736 2476 function zsh-help () {
2737 2477 print "$bg[white]$fg[black]
@@ -2826,14 +2566,24 @@ if [[ -r /etc/debian_version ]] ; then
2826 2566 salias agi="apt-get install"
2827 2567 salias au="apt-get update"
2828 2568 fi
2829 - #a3# Execute \kbd{aptitude install}
2830 - salias ati="aptitude install"
2831 - #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
2832 - salias -a up="aptitude update ; aptitude safe-upgrade"
2833 - #a3# Execute \kbd{dpkg-buildpackage}
2834 - alias dbp='dpkg-buildpackage'
2835 - #a3# Execute \kbd{grep-excuses}
2836 - alias ge='grep-excuses'
2569 + if check_com -c aptitude ; then
2570 + #a3# Execute \kbd{aptitude install}
2571 + salias ati="aptitude install"
2572 + #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
2573 + salias -a up="aptitude update ; aptitude safe-upgrade"
2574 + fi
2575 + if check_com -c dpkg-buildpackage ; then
2576 + #a3# Execute \kbd{dpkg-buildpackage}
2577 + alias dbp='dpkg-buildpackage'
2578 + fi
2579 + if check_com -c grep-excuses ; then
2580 + #a3# Execute \kbd{grep-excuses}
2581 + alias ge='grep-excuses'
2582 + fi
2583 + if check_com -c apt-file ; then
2584 + alias afs='apt-file search'
2585 + alias afl='apt-file list'
2586 + fi
2837 2587 fi
2838 2588
2839 2589 # get a root shell as normal user in live-cd mode:
@@ -2860,21 +2610,6 @@ if check_com -c dpkg-query ; then
2860 2610 alias debs-by-size="dpkg-query -Wf 'x \${Installed-Size} \${Package} \${Status}\n' | sed -ne '/^x /d' -e '/^x \(.*\) install ok installed$/s//\1/p' | sort -nr"
2861 2611 fi
2862 2612
2863 - # if cdrecord is a symlink (to wodim) or isn't present at all warn:
2864 - if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord; then
2865 - if check_com -c wodim; then
2866 - function cdrecord () {
2867 - <<__EOF0__
2868 - cdrecord is not provided under its original name by Debian anymore.
2869 - See #377109 in the BTS of Debian for more details.
2870 -
2871 - Please use the wodim binary instead
2872 - __EOF0__
2873 - return 1
2874 - }
2875 - fi
2876 - fi
2877 -
2878 2613 if isgrmlcd; then
2879 2614 # No core dumps: important for a live-cd-system
2880 2615 limit -s core 0
@@ -2882,18 +2617,11 @@ fi
2882 2617
2883 2618 # grmlstuff
2884 2619 function grmlstuff () {
2885 - # people should use 'grml-x'!
2886 - if check_com -c 915resolution; then
2887 - function 855resolution () {
2888 - echo "Please use 915resolution as resolution modifying tool for Intel \
2889 - graphic chipset."
2890 - return -1
2891 - }
2620 + if [ -r /etc/grml_version ]; then
2621 + #a1# Output version of running grml
2622 + alias grml-version='cat /etc/grml_version'
2892 2623 fi
2893 2624
2894 - #a1# Output version of running grml
2895 - alias grml-version='cat /etc/grml_version'
2896 -
2897 2625 if check_com -c grml-debootstrap ; then
2898 2626 function debian2hd () {
2899 2627 echo "Installing debian to harddisk is possible by using grml-debootstrap."
@@ -2914,12 +2642,11 @@ graphic chipset."
2914 2642 }
2915 2643
2916 2644 # now run the functions
2917 - isgrml && checkhome
2918 - is4 && isgrml && grmlstuff
2919 - is4 && grmlcomp
2645 + isgrml && grmlstuff
2646 + grmlcomp
2920 2647
2921 2648 # keephack
2922 - is4 && xsource "/etc/zsh/keephack"
2649 + xsource "/etc/zsh/keephack"
2923 2650
2924 2651 # wonderful idea of using "e" glob qualifier by Peter Stephenson
2925 2652 # You use it as follows:
@@ -2928,7 +2655,7 @@ is4 && xsource "/etc/zsh/keephack"
2928 2655 # This lists all the files in the current directory newer than the reference file.
2929 2656 # You can also specify the reference file inline; note quotes:
2930 2657 # $ ls -l *(e:'nt ~/.zshenv':)
2931 - is4 && function nt () {
2658 + function nt () {
2932 2659 if [[ -n $1 ]] ; then
2933 2660 local NTREF=${~1}
2934 2661 fi
@@ -2962,8 +2689,7 @@ compdef _functions freload
2962 2689 # that the displayed information does make any sense on your OS.
2963 2690 # We leave that decission to the user.
2964 2691 #
2965 - # The zstat module is used to detect symlink loops. zstat is available since zsh4.
2966 - # With an older zsh you will need to abort with <C-c> in that case.
2692 + # The zstat module is used to detect symlink loops.
2967 2693 # When a symlink loop is detected, a warning ist printed and further processing is stopped.
2968 2694 #
2969 2695 # Module zstat is loaded by default in grml zshrc, no extra action needed for that.
@@ -2998,17 +2724,16 @@ function sll () {
2998 2724 ls -l "${file:a}" || RTN=1
2999 2725
3000 2726 while [[ -h "$file" ]] ; do
3001 - if is4 ; then
3002 - LINODE=$(zstat -L +inode "${file}")
3003 - for i in ${SEENINODES} ; do
3004 - if (( ${i} == ${LINODE} )) ; then
3005 - builtin cd -q "${curdir}"
3006 - print 'link loop detected, aborting!'
3007 - return 2
3008 - fi
3009 - done
3010 - SEENINODES+=${LINODE}
3011 - fi
2727 + LINODE=$(zstat -L +inode "${file}")
2728 + for i in ${SEENINODES} ; do
2729 + if (( ${i} == ${LINODE} )) ; then
2730 + builtin cd -q "${curdir}"
2731 + print 'link loop detected, aborting!'
2732 + return 2
2733 + fi
2734 + done
2735 + SEENINODES+=${LINODE}
2736 +
3012 2737 jumpd="${file:h}"
3013 2738 file="${file:t}"
3014 2739
@@ -3148,32 +2873,16 @@ compdef _functions edfunc
3148 2873 #m# f6 Reload() \kbd{service \em{process}}\quad\kbd{reload}
3149 2874 #m# f6 Force-Reload() \kbd{service \em{process}}\quad\kbd{force-reload}
3150 2875 #m# f6 Status() \kbd{service \em{process}}\quad\kbd{status}
3151 - if [[ -d /etc/init.d || -d /etc/service ]] ; then
2876 + if [[ -d /etc/init.d ]] ; then
3152 2877 function __start_stop () {
3153 2878 local action_="${1:l}" # e.g Start/Stop/Restart
3154 2879 local service_="$2"
3155 2880 local param_="$3"
3156 2881
3157 - local service_target_="$(readlink /etc/init.d/$service_)"
3158 - if [[ $service_target_ == "/usr/bin/sv" ]]; then
3159 - # runit
3160 - case "${action_}" in
3161 - start) if [[ ! -e /etc/service/$service_ ]]; then
3162 - $SUDO ln -s "/etc/sv/$service_" "/etc/service/"
3163 - else
3164 - $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
3165 - fi ;;
3166 - # there is no reload in runits sysv emulation
3167 - reload) $SUDO "/etc/init.d/$service_" "force-reload" "$param_" ;;
3168 - *) $SUDO "/etc/init.d/$service_" "${action_}" "$param_" ;;
3169 - esac
2882 + if check_com -c service ; then
2883 + $SUDO service "$service_" "${action_}" "$param_"
3170 2884 else
3171 - # sysv/sysvinit-utils, upstart
3172 - if check_com -c service ; then
3173 - $SUDO service "$service_" "${action_}" "$param_"
3174 - else
3175 - $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
3176 - fi
2885 + $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
3177 2886 fi
3178 2887 }
3179 2888
@@ -3227,7 +2936,7 @@ function H-Glob () {
3227 2936 chmod 644 *(.^x) # make all plain non-executable files publically readable
3228 2937 print -l *(.c|.h) # Lists *.c and *.h
3229 2938 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
3230 - echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
2939 + echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print \$1}'<"
3231 2940 }
3232 2941 alias help-zshglob=H-Glob
3233 2942
@@ -3376,23 +3085,8 @@ alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/nu
3376 3085 #a2# scp with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
3377 3086 alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3378 3087
3379 - # work around non utf8 capable software in utf environment via $LANG and luit
3380 - if check_com isutfenv && check_com luit ; then
3381 - if check_com -c mrxvt ; then
3382 - isutfenv && [[ -n "$LANG" ]] && \
3383 - alias mrxvt="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit mrxvt"
3384 - fi
3385 -
3386 - if check_com -c aterm ; then
3387 - isutfenv && [[ -n "$LANG" ]] && \
3388 - alias aterm="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit aterm"
3389 - fi
3390 -
3391 - if check_com -c centericq ; then
3392 - isutfenv && [[ -n "$LANG" ]] && \
3393 - alias centericq="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit centericq"
3394 - fi
3395 - fi
3088 + #a2# lsblk (list block devices) with the most useful columns
3089 + alias llblk="lsblk -o +LABEL,PARTLABEL,UUID,FSTYPE,SERIAL"
3396 3090
3397 3091 # useful functions
3398 3092
@@ -3504,7 +3198,17 @@ function mkcd () {
3504 3198
3505 3199 #f5# Create temporary directory and \kbd{cd} to it
3506 3200 function cdt () {
3507 - builtin cd "$(mktemp -d)"
3201 + local -a cdttemplate
3202 + if [ "$#" -eq 1 ]; then
3203 + if isfreebsd; then
3204 + # mktemp(1) on FreeBSD doesn't behave the same, cf.
3205 + # https://man.freebsd.org/cgi/man.cgi?query=mktemp#OPTIONS
3206 + cdttemplate=(-t "$1")
3207 + else
3208 + cdttemplate=(-t "$1".XXXXXXX)
3209 + fi
3210 + fi
3211 + builtin cd "$(mktemp -d ${cdttemplate[@]})"
3508 3212 builtin pwd
3509 3213 }
3510 3214
@@ -3547,21 +3251,23 @@ fi
3547 3251 # $ awk -F ':' '{ print $2" : "$1" "$3 }' \
3548 3252 # /usr/local/lib/words/en-de.ISO-8859-1.vok > ~/.translate/de-en.ISO-8859-1.vok
3549 3253 #f5# Translates a word
3550 - function trans () {
3551 - emulate -L zsh
3552 - case "$1" in
3553 - -[dD]*)
3554 - translate -l de-en $2
3555 - ;;
3556 - -[eE]*)
3557 - translate -l en-de $2
3558 - ;;
3559 - *)
3560 - echo "Usage: $0 { -D | -E }"
3561 - echo " -D == German to English"
3562 - echo " -E == English to German"
3563 - esac
3564 - }
3254 + if ! check_com -c trans; then
3255 + function trans () {
3256 + emulate -L zsh
3257 + case "$1" in
3258 + -[dD]*)
3259 + translate -l de-en $2
3260 + ;;
3261 + -[eE]*)
3262 + translate -l en-de $2
3263 + ;;
3264 + *)
3265 + echo "Usage: $0 { -D | -E }"
3266 + echo " -D == German to English"
3267 + echo " -E == English to German"
3268 + esac
3269 + }
3270 + fi
3565 3271
3566 3272 # Usage: simple-extract <file>
3567 3273 # Using option -d deletes the original archive file.
@@ -3759,51 +3465,6 @@ function xtrename () {
3759 3465 return 0
3760 3466 }
3761 3467
3762 - # Create small urls via http://goo.gl using curl(1).
3763 - # API reference: https://code.google.com/apis/urlshortener/
3764 - function zurl () {
3765 - emulate -L zsh
3766 - setopt extended_glob
3767 -
3768 - if [[ -z $1 ]]; then
3769 - print "USAGE: zurl <URL>"
3770 - return 1
3771 - fi
3772 -
3773 - local PN url prog api json contenttype item
3774 - local -a data
3775 - PN=$0
3776 - url=$1
3777 -
3778 - # Prepend 'http://' to given URL where necessary for later output.
3779 - if [[ ${url} != http(s|)://* ]]; then
3780 - url='http://'${url}
3781 - fi
3782 -
3783 - if check_com -c curl; then
3784 - prog=curl
3785 - else
3786 - print "curl is not available, but mandatory for ${PN}. Aborting."
3787 - return 1
3788 - fi
3789 - api='https://www.googleapis.com/urlshortener/v1/url'
3790 - contenttype="Content-Type: application/json"
3791 - json="{\"longUrl\": \"${url}\"}"
3792 - data=(${(f)"$($prog --silent -H ${contenttype} -d ${json} $api)"})
3793 - # Parse the response
3794 - for item in "${data[@]}"; do
3795 - case "$item" in
3796 - ' '#'"id":'*)
3797 - item=${item#*: \"}
3798 - item=${item%\",*}
3799 - printf '%s\n' "$item"
3800 - return 0
3801 - ;;
3802 - esac
3803 - done
3804 - return 1
3805 - }
3806 -
3807 3468 #f2# Find history events by search pattern and list them by date.
3808 3469 function whatwhen () {
3809 3470 emulate -L zsh
@@ -3863,10 +3524,6 @@ if check_com -c hg ; then
3863 3524 for i in $(hg status -marn "$@") ; diff -ubwd <(hg cat "$i") "$i"
3864 3525 }
3865 3526
3866 - # build debian package
3867 - #a2# Alias for \kbd{hg-buildpackage}
3868 - alias hbp='hg-buildpackage'
3869 -
3870 3527 # execute commands on the versioned patch-queue from the current repos
3871 3528 [[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias mq='hg -R $(readlink -f $(hg root)/.hg/patches)'
3872 3529
@@ -3956,6 +3613,15 @@ unfunction grml_status_feature
3956 3613 # mode: sh
3957 3614 # End:
3958 3615
3616 + # History configuration
3617 + HISTFILE=~/.histfile
3618 + HISTSIZE=3000
3619 + SAVEHIST=5000
3620 +
3621 + # ZSH plugins
3622 + source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
3623 + source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
3624 +
3959 3625 # Make Flatpaks accessible via the shell
3960 3626 export PATH="$PATH:/var/lib/flatpak/exports/bin"
3961 3627
@@ -3964,4 +3630,7 @@ prompt default
3964 3630 PROMPT='%# '
3965 3631
3966 3632 # Load Headline ZSH theme
3967 - source ~/.config/headline.zsh-theme
3633 + source ~/.config/headline.zsh-theme
3634 +
3635 + fastfetch
3636 + fortune | cowsay -f tux

.zshrc-solus(archivo creado)

@@ -0,0 +1,3637 @@
1 + # Filename: /etc/zsh/zshrc
2 + # Purpose: config file for zsh (z shell)
3 + # Authors: grml-team (grml.org), (c) Michael Prokop <[email protected]>
4 + # Bug-Reports: see http://grml.org/bugs/
5 + # License: This file is licensed under the GPL v2.
6 + ################################################################################
7 + # This file is sourced only for interactive shells. It
8 + # should contain commands to set up aliases, functions,
9 + # options, key bindings, etc.
10 + #
11 + # Global Order: zshenv, zprofile, zshrc, zlogin
12 + ################################################################################
13 +
14 + # USAGE
15 + # If you are using this file as your ~/.zshrc file, please use ~/.zshrc.pre
16 + # and ~/.zshrc.local for your own customisations. The former file is read
17 + # before ~/.zshrc, the latter is read after it. Also, consider reading the
18 + # refcard and the reference manual for this setup, both available from:
19 + # <http://grml.org/zsh/>
20 +
21 + # Contributing:
22 + # If you want to help to improve grml's zsh setup, clone the grml-etc-core
23 + # repository from git.grml.org:
24 + # git clone git://git.grml.org/grml-etc-core.git
25 + #
26 + # Make your changes, commit them; use 'git format-patch' to create a series
27 + # of patches and send those to the following address via 'git send-email':
28 + # [email protected]
29 + #
30 + # Doing so makes sure the right people get your patches for review and
31 + # possibly inclusion.
32 +
33 + # zsh-refcard-tag documentation:
34 + # You may notice strange looking comments in this file.
35 + # These are there for a purpose. grml's zsh-refcard can now be
36 + # automatically generated from the contents of the actual configuration
37 + # file. However, we need a little extra information on which comments
38 + # and what lines of code to take into account (and for what purpose).
39 + #
40 + # Here is what they mean:
41 + #
42 + # List of tags (comment types) used:
43 + # #a# Next line contains an important alias, that should
44 + # be included in the grml-zsh-refcard.
45 + # (placement tag: @@INSERT-aliases@@)
46 + # #f# Next line contains the beginning of an important function.
47 + # (placement tag: @@INSERT-functions@@)
48 + # #v# Next line contains an important variable.
49 + # (placement tag: @@INSERT-variables@@)
50 + # #k# Next line contains an important keybinding.
51 + # (placement tag: @@INSERT-keybindings@@)
52 + # #d# Hashed directories list generation:
53 + # start denotes the start of a list of 'hash -d'
54 + # definitions.
55 + # end denotes its end.
56 + # (placement tag: @@INSERT-hasheddirs@@)
57 + # #A# Abbreviation expansion list generation:
58 + # start denotes the beginning of abbreviations.
59 + # end denotes their end.
60 + # Lines within this section that end in '#d .*' provide
61 + # extra documentation to be included in the refcard.
62 + # (placement tag: @@INSERT-abbrev@@)
63 + # #m# This tag allows you to manually generate refcard entries
64 + # for code lines that are hard/impossible to parse.
65 + # Example:
66 + # #m# k ESC-h Call the run-help function
67 + # That would add a refcard entry in the keybindings table
68 + # for 'ESC-h' with the given comment.
69 + # So the syntax is: #m# <section> <argument> <comment>
70 + # #o# This tag lets you insert entries to the 'other' hash.
71 + # Generally, this should not be used. It is there for
72 + # things that cannot be done easily in another way.
73 + # (placement tag: @@INSERT-other-foobar@@)
74 + #
75 + # All of these tags (except for m and o) take two arguments, the first
76 + # within the tag, the other after the tag:
77 + #
78 + # #<tag><section># <comment>
79 + #
80 + # Where <section> is really just a number, which are defined by the
81 + # @secmap array on top of 'genrefcard.pl'. The reason for numbers
82 + # instead of names is, that for the reader, the tag should not differ
83 + # much from a regular comment. For zsh, it is a regular comment indeed.
84 + # The numbers have got the following meanings:
85 + # 0 -> "default"
86 + # 1 -> "system"
87 + # 2 -> "user"
88 + # 3 -> "debian"
89 + # 4 -> "search"
90 + # 5 -> "shortcuts"
91 + # 6 -> "services"
92 + #
93 + # So, the following will add an entry to the 'functions' table in the
94 + # 'system' section, with a (hopefully) descriptive comment:
95 + # #f1# Edit an alias via zle
96 + # edalias() {
97 + #
98 + # It will then show up in the @@INSERT-aliases-system@@ replacement tag
99 + # that can be found in 'grml-zsh-refcard.tex.in'.
100 + # If the section number is omitted, the 'default' section is assumed.
101 + # Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
102 + # exactly the same as @@INSERT-aliases-default@@. If you want a list of
103 + # *all* aliases, for example, use @@INSERT-aliases-all@@.
104 +
105 + # zsh profiling
106 + # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
107 + if [[ $ZSH_PROFILE_RC -gt 0 ]] ; then
108 + zmodload zsh/zprof
109 + fi
110 +
111 + typeset -A GRML_STATUS_FEATURES
112 +
113 + function grml_status_feature () {
114 + emulate -L zsh
115 + local f=$1
116 + local -i success=$2
117 + if (( success == 0 )); then
118 + GRML_STATUS_FEATURES[$f]=success
119 + else
120 + GRML_STATUS_FEATURES[$f]=failure
121 + fi
122 + return 0
123 + }
124 +
125 + function grml_status_features () {
126 + emulate -L zsh
127 + local mode=${1:-+-}
128 + local this
129 + if [[ $mode == -h ]] || [[ $mode == --help ]]; then
130 + cat <<EOF
131 + grml_status_features [-h|--help|-|+|+-|FEATURE]
132 +
133 + Prints a summary of features the grml setup is trying to load. The
134 + result of loading a feature is recorded. This function lets you query
135 + the result.
136 +
137 + The function takes one argument: "-h" or "--help" to display this help
138 + text, "+" to display a list of all successfully loaded features, "-" for
139 + a list of all features that failed to load. "+-" to show a list of all
140 + features with their statuses.
141 +
142 + Any other word is considered to by a feature and prints its status.
143 +
144 + The default mode is "+-".
145 + EOF
146 + return 0
147 + fi
148 + if [[ $mode != - ]] && [[ $mode != + ]] && [[ $mode != +- ]]; then
149 + this="${GRML_STATUS_FEATURES[$mode]}"
150 + if [[ -z $this ]]; then
151 + printf 'unknown\n'
152 + return 1
153 + else
154 + printf '%s\n' $this
155 + fi
156 + return 0
157 + fi
158 + for key in ${(ok)GRML_STATUS_FEATURES}; do
159 + this="${GRML_STATUS_FEATURES[$key]}"
160 + if [[ $this == success ]] && [[ $mode == *+* ]]; then
161 + printf '%-16s %s\n' $key $this
162 + fi
163 + if [[ $this == failure ]] && [[ $mode == *-* ]]; then
164 + printf '%-16s %s\n' $key $this
165 + fi
166 + done
167 + return 0
168 + }
169 +
170 + # load .zshrc.pre to give the user the chance to overwrite the defaults
171 + [[ -r ${ZDOTDIR:-${HOME}}/.zshrc.pre ]] && source ${ZDOTDIR:-${HOME}}/.zshrc.pre
172 +
173 + #f1# Checks whether or not you're running grml
174 + function isgrml () {
175 + [[ -f /etc/grml_version ]] && return 0
176 + return 1
177 + }
178 +
179 + #f1# Checks whether or not you're running a grml cd
180 + function isgrmlcd () {
181 + [[ -f /etc/grml_cd ]] && return 0
182 + return 1
183 + }
184 +
185 + if isgrml ; then
186 + #f1# Checks whether or not you're running grml-small
187 + function isgrmlsmall () {
188 + if [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]]; then
189 + return 0
190 + fi
191 + return 1
192 + }
193 + else
194 + function isgrmlsmall () { return 1 }
195 + fi
196 +
197 + GRML_OSTYPE=$(uname -s)
198 +
199 + function islinux () {
200 + [[ $GRML_OSTYPE == "Linux" ]]
201 + }
202 +
203 + function isdarwin () {
204 + [[ $GRML_OSTYPE == "Darwin" ]]
205 + }
206 +
207 + function isfreebsd () {
208 + [[ $GRML_OSTYPE == "FreeBSD" ]]
209 + }
210 +
211 + function isopenbsd () {
212 + [[ $GRML_OSTYPE == "OpenBSD" ]]
213 + }
214 +
215 + #f1# are we running within an utf environment?
216 + function isutfenv () {
217 + case "$LANG $CHARSET $LANGUAGE" in
218 + *utf*) return 0 ;;
219 + *UTF*) return 0 ;;
220 + *) return 1 ;;
221 + esac
222 + }
223 +
224 + # check for user, if not running as root set $SUDO to sudo
225 + (( EUID != 0 )) && SUDO='sudo' || SUDO=''
226 +
227 + # check for zsh v5.1+
228 +
229 + if ! [[ ${ZSH_VERSION} == 5.<1->* \
230 + || ${ZSH_VERSION} == <6->.<->* ]] ; then
231 +
232 + printf '-!-\n'
233 + printf '-!- In this configuration we try to make use of features, that\n'
234 + printf '-!- require version 5.1 of the shell; That way this setup can be\n'
235 + printf '-!- used with a wide range of zsh versions, while using fairly\n'
236 + printf '-!- advanced features in all supported versions.\n'
237 + printf '-!-\n'
238 + printf '-!- However, you are running zsh version %s.\n' "$ZSH_VERSION"
239 + printf '-!-\n'
240 + printf '-!- While this *may* work, it might as well fail.\n'
241 + printf '-!- Please consider updating to at least version 5.1 of zsh.\n'
242 + printf '-!-\n'
243 + printf '-!- DO NOT EXPECT THIS TO WORK FLAWLESSLY!\n'
244 + printf '-!- If it does today, you'\''ve been lucky.\n'
245 + printf '-!-\n'
246 + printf '-!- Ye been warned!\n'
247 + printf '-!-\n'
248 +
249 + function zstyle () { : }
250 + fi
251 +
252 + # autoload wrapper - use this one instead of autoload directly
253 + # We need to define this function as early as this, because autoloading
254 + # 'is-at-least()' needs it.
255 + function zrcautoload () {
256 + emulate -L zsh
257 + setopt extended_glob
258 + local fdir ffile
259 + local -i ffound
260 +
261 + ffile=$1
262 + (( ffound = 0 ))
263 + for fdir in ${fpath} ; do
264 + [[ -e ${fdir}/${ffile} ]] && (( ffound = 1 ))
265 + done
266 +
267 + (( ffound == 0 )) && return 1
268 + autoload -U ${ffile} || return 1
269 + return 0
270 + }
271 +
272 + # Autoload zsh's hook system early, so we can use it whenever we need.
273 + zrcautoload add-zsh-hook || add-zsh-hook () { :; }
274 +
275 + # Load is-at-least() for more precise version checks Note that this test will
276 + # *always* fail, if the is-at-least function could not be marked for
277 + # autoloading.
278 + zrcautoload is-at-least || function is-at-least () { return 1 }
279 +
280 + # set some important options (as early as possible)
281 +
282 + # append history list to the history file; this is the default but we make sure
283 + # because it's required for share_history.
284 + setopt append_history
285 +
286 + # import new commands from the history file also in other zsh-session
287 + setopt share_history
288 +
289 + # save each command's beginning timestamp and the duration to the history file
290 + setopt extended_history
291 +
292 + # remove command lines from the history list when the first character on the
293 + # line is a space
294 + setopt histignorespace
295 +
296 + # if a command is issued that can't be executed as a normal command, and the
297 + # command is the name of a directory, perform the cd command to that directory.
298 + setopt auto_cd
299 +
300 + # in order to use #, ~ and ^ for filename generation grep word
301 + # *~(*.gz|*.bz|*.bz2|*.zip|*.Z) -> searches for word not in compressed files
302 + # don't forget to quote '^', '~' and '#'!
303 + setopt extended_glob
304 +
305 + # display PID when suspending processes as well
306 + setopt longlistjobs
307 +
308 + # report the status of backgrounds jobs immediately
309 + setopt notify
310 +
311 + # whenever a command completion is attempted, make sure the entire command path
312 + # is hashed first.
313 + setopt hash_list_all
314 +
315 + # not just at the end
316 + setopt completeinword
317 +
318 + # Don't send SIGHUP to background processes when the shell exits.
319 + setopt nohup
320 +
321 + # make cd push the old directory onto the directory stack.
322 + setopt auto_pushd
323 +
324 + # avoid "beep"ing
325 + setopt nobeep
326 +
327 + # don't push the same dir twice.
328 + setopt pushd_ignore_dups
329 +
330 + # * shouldn't match dotfiles. ever.
331 + setopt noglobdots
332 +
333 + # use zsh style word splitting
334 + setopt noshwordsplit
335 +
336 + # don't error out when unset parameters are used
337 + setopt unset
338 +
339 + # setting some default values
340 + NOCOR=${NOCOR:-0}
341 + NOETCHOSTS=${NOETCHOSTS:-0}
342 + NOMENU=${NOMENU:-0}
343 + NOPATHHELPER=${NOPATHHELPER:-0}
344 + NOPRECMD=${NOPRECMD:-0}
345 + COMMAND_NOT_FOUND=${COMMAND_NOT_FOUND:-0}
346 + GRML_ZSH_CNF_HANDLER=${GRML_ZSH_CNF_HANDLER:-/usr/share/command-not-found/command-not-found}
347 + GRML_DISPLAY_BATTERY=${GRML_DISPLAY_BATTERY:-${BATTERY:-0}}
348 + GRMLSMALL_SPECIFIC=${GRMLSMALL_SPECIFIC:-1}
349 + ZSH_NO_DEFAULT_LOCALE=${ZSH_NO_DEFAULT_LOCALE:-0}
350 +
351 + typeset -ga ls_options
352 + typeset -ga grep_options
353 +
354 + # Colors on GNU ls(1)
355 + if ls --color=auto / >/dev/null 2>&1; then
356 + ls_options+=( --color=auto )
357 + # Colors on FreeBSD and OSX ls(1)
358 + elif ls -G / >/dev/null 2>&1; then
359 + ls_options+=( -G )
360 + fi
361 +
362 + # Natural sorting order on GNU ls(1)
363 + # OSX and IllumOS have a -v option that is not natural sorting
364 + if ls --version |& grep -q 'GNU' >/dev/null 2>&1 && ls -v / >/dev/null 2>&1; then
365 + ls_options+=( -v )
366 + fi
367 +
368 + # Color on GNU and FreeBSD grep(1)
369 + if grep --color=auto -q "a" <<< "a" >/dev/null 2>&1; then
370 + grep_options+=( --color=auto )
371 + fi
372 +
373 + # utility functions
374 + # this function checks if a command exists and returns either true
375 + # or false. This avoids using 'which' and 'whence', which will
376 + # avoid problems with aliases for which on certain weird systems. :-)
377 + # Usage: check_com [-c|-g] word
378 + # -c only checks for external commands
379 + # -g does the usual tests and also checks for global aliases
380 + function check_com () {
381 + emulate -L zsh
382 + local -i comonly gatoo
383 + comonly=0
384 + gatoo=0
385 +
386 + if [[ $1 == '-c' ]] ; then
387 + comonly=1
388 + shift 1
389 + elif [[ $1 == '-g' ]] ; then
390 + gatoo=1
391 + shift 1
392 + fi
393 +
394 + if (( ${#argv} != 1 )) ; then
395 + printf 'usage: check_com [-c|-g] <command>\n' >&2
396 + return 1
397 + fi
398 +
399 + if (( comonly > 0 )) ; then
400 + (( ${+commands[$1]} )) && return 0
401 + return 1
402 + fi
403 +
404 + if (( ${+commands[$1]} )) \
405 + || (( ${+functions[$1]} )) \
406 + || (( ${+aliases[$1]} )) \
407 + || (( ${+reswords[(r)$1]} )) ; then
408 + return 0
409 + fi
410 +
411 + if (( gatoo > 0 )) && (( ${+galiases[$1]} )) ; then
412 + return 0
413 + fi
414 +
415 + return 1
416 + }
417 +
418 + # creates an alias and precedes the command with
419 + # sudo if $EUID is not zero.
420 + function salias () {
421 + emulate -L zsh
422 + local only=0 ; local multi=0
423 + local key val
424 + while getopts ":hao" opt; do
425 + case $opt in
426 + o) only=1 ;;
427 + a) multi=1 ;;
428 + h)
429 + printf 'usage: salias [-hoa] <alias-expression>\n'
430 + printf ' -h shows this help text.\n'
431 + printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
432 + printf ' be careful using this option.\n'
433 + printf ' -o only sets an alias if a preceding sudo would be needed.\n'
434 + return 0
435 + ;;
436 + *) salias -h >&2; return 1 ;;
437 + esac
438 + done
439 + shift "$((OPTIND-1))"
440 +
441 + if (( ${#argv} > 1 )) ; then
442 + printf 'Too many arguments %s\n' "${#argv}"
443 + return 1
444 + fi
445 +
446 + key="${1%%\=*}" ; val="${1#*\=}"
447 + if (( EUID == 0 )) && (( only == 0 )); then
448 + alias -- "${key}=${val}"
449 + elif (( EUID > 0 )) ; then
450 + (( multi > 0 )) && val="${val// ; / ; sudo }"
451 + alias -- "${key}=sudo ${val}"
452 + fi
453 +
454 + return 0
455 + }
456 +
457 + # Check if we can read given files and source those we can.
458 + function xsource () {
459 + if (( ${#argv} < 1 )) ; then
460 + printf 'usage: xsource FILE(s)...\n' >&2
461 + return 1
462 + fi
463 +
464 + while (( ${#argv} > 0 )) ; do
465 + [[ -r "$1" ]] && source "$1"
466 + shift
467 + done
468 + return 0
469 + }
470 +
471 + # Check if we can read a given file and 'cat(1)' it.
472 + function xcat () {
473 + emulate -L zsh
474 + if (( ${#argv} != 1 )) ; then
475 + printf 'usage: xcat FILE\n' >&2
476 + return 1
477 + fi
478 +
479 + [[ -r $1 ]] && cat $1
480 + return 0
481 + }
482 +
483 + # this allows us to stay in sync with grml's zshrc and put own
484 + # modifications in ~/.zshrc.local
485 + function zrclocal () {
486 + xsource "/etc/zsh/zshrc.local"
487 + xsource "${ZDOTDIR:-${HOME}}/.zshrc.local"
488 + return 0
489 + }
490 +
491 + # locale setup
492 + if (( ZSH_NO_DEFAULT_LOCALE == 0 )); then
493 + xsource "/etc/default/locale"
494 + fi
495 +
496 + for var in LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME ; do
497 + [[ -n ${(P)var} ]] && export $var
498 + done
499 + builtin unset -v var
500 +
501 + # set some variables
502 + if check_com -c vim ; then
503 + #v#
504 + export EDITOR=${EDITOR:-vim}
505 + else
506 + export EDITOR=${EDITOR:-vi}
507 + fi
508 +
509 + #v#
510 + export PAGER=${PAGER:-less}
511 +
512 + #v#
513 + export MAIL=${MAIL:-/var/mail/$USER}
514 +
515 + # color setup for ls:
516 + check_com -c dircolors && eval $(dircolors -b)
517 +
518 + # Setup PATH from system defaults on macOS.
519 + if [[ -x /usr/libexec/path_helper ]] && [[ "$NOPATHHELPER" -eq 0 ]] ; then
520 + eval $(/usr/libexec/path_helper -s)
521 + fi
522 + # Add MacPorts PATH on darwin/macOS.
523 + if isdarwin && [[ -d /opt/local ]]; then
524 + PATH="/opt/local/bin:/opt/local/sbin:$PATH"
525 + MANPATH="/opt/local/share/man:$MANPATH"
526 + fi
527 +
528 + # load our function and completion directories
529 + for fdir in /usr/share/grml/zsh/completion /usr/share/grml/zsh/functions; do
530 + fpath=( ${fdir} ${fdir}/**/*(/N) ${fpath} )
531 + done
532 + typeset -aU ffiles
533 + ffiles=(/usr/share/grml/zsh/functions/**/[^_]*[^~](N.:t))
534 + (( ${#ffiles} > 0 )) && autoload -U "${ffiles[@]}"
535 + unset -v fdir ffiles
536 +
537 + # support colors in less
538 + export LESS_TERMCAP_mb=$'\E[01;31m'
539 + export LESS_TERMCAP_md=$'\E[01;31m'
540 + export LESS_TERMCAP_me=$'\E[0m'
541 + export LESS_TERMCAP_se=$'\E[0m'
542 + export LESS_TERMCAP_so=$'\E[01;44;33m'
543 + export LESS_TERMCAP_ue=$'\E[0m'
544 + export LESS_TERMCAP_us=$'\E[01;32m'
545 +
546 + # mailchecks
547 + MAILCHECK=30
548 +
549 + # report about cpu-/system-/user-time of command if running longer than
550 + # 5 seconds
551 + REPORTTIME=5
552 +
553 + # watch for everyone but me and root
554 + watch=(notme root)
555 +
556 + # automatically remove duplicates from these arrays
557 + typeset -U path PATH cdpath CDPATH fpath FPATH manpath MANPATH
558 +
559 + # Load a few modules
560 + for mod in parameter complist deltochar mathfunc ; do
561 + zmodload -i zsh/${mod} 2>/dev/null
562 + grml_status_feature mod:$mod $?
563 + done && builtin unset -v mod
564 +
565 + # autoload zsh modules when they are referenced
566 + zmodload -a zsh/stat zstat
567 + zmodload -a zsh/zpty zpty
568 + zmodload -ap zsh/mapfile mapfile
569 +
570 + # completion system
571 + COMPDUMPFILE=${COMPDUMPFILE:-${ZDOTDIR:-${HOME}}/.zcompdump}
572 + if zrcautoload compinit ; then
573 + typeset -a tmp
574 + zstyle -a ':grml:completion:compinit' arguments tmp
575 + compinit -d ${COMPDUMPFILE} "${tmp[@]}"
576 + grml_status_feature compinit $?
577 + unset tmp
578 + else
579 + grml_status_feature compinit 1
580 + function compdef { }
581 + fi
582 +
583 + # completion system
584 +
585 + # called later (via grmlcomp)
586 + # note: use 'zstyle' for getting current settings
587 + # press ^xh (control-x h) for getting tags in context; ^x? (control-x ?) to run complete_debug with trace output
588 + function grmlcomp () {
589 + # TODO: This could use some additional information
590 +
591 + # Make sure the completion system is initialised
592 + (( ${+_comps} )) || return 1
593 +
594 + # allow one error for every three characters typed in approximate completer
595 + zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )'
596 +
597 + # don't complete backup files as executables
598 + zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)'
599 +
600 + # start menu completion only if it could find no unambiguous initial string
601 + zstyle ':completion:*:correct:*' insert-unambiguous true
602 + zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}'
603 + zstyle ':completion:*:correct:*' original true
604 +
605 + # activate color-completion
606 + zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
607 +
608 + # format on completion
609 + zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'
610 +
611 + # automatically complete 'cd -<tab>' and 'cd -<ctrl-d>' with menu
612 + # zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
613 +
614 + # insert all expansions for expand completer
615 + zstyle ':completion:*:expand:*' tag-order all-expansions
616 + zstyle ':completion:*:history-words' list false
617 +
618 + # activate menu
619 + zstyle ':completion:*:history-words' menu yes
620 +
621 + # ignore duplicate entries
622 + zstyle ':completion:*:history-words' remove-all-dups yes
623 + zstyle ':completion:*:history-words' stop yes
624 +
625 + # match uppercase from lowercase
626 + zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
627 +
628 + # separate matches into groups
629 + zstyle ':completion:*:matches' group 'yes'
630 + zstyle ':completion:*' group-name ''
631 +
632 + if [[ "$NOMENU" -eq 0 ]] ; then
633 + # if there are more than 5 options allow selecting from a menu
634 + zstyle ':completion:*' menu select=5
635 + else
636 + # don't use any menus at all
637 + setopt no_auto_menu
638 + fi
639 +
640 + zstyle ':completion:*:messages' format '%d'
641 + zstyle ':completion:*:options' auto-description '%d'
642 +
643 + # describe options in full
644 + zstyle ':completion:*:options' description 'yes'
645 +
646 + # on processes completion complete all user processes
647 + zstyle ':completion:*:processes' command 'ps -au$USER'
648 +
649 + # offer indexes before parameters in subscripts
650 + zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
651 +
652 + # provide verbose completion information
653 + zstyle ':completion:*' verbose true
654 +
655 + # recent (as of Dec 2007) zsh versions are able to provide descriptions
656 + # for commands (read: 1st word in the line) that it will list for the user
657 + # to choose from. The following disables that, because it's not exactly fast.
658 + zstyle ':completion:*:-command-:*:' verbose false
659 +
660 + # set format for warnings
661 + zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d'
662 +
663 + # define files to ignore for zcompile
664 + zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)'
665 + zstyle ':completion:correct:' prompt 'correct to: %e'
666 +
667 + # Ignore completion functions for commands you don't have:
668 + zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'
669 +
670 + # Provide more processes in completion of programs like killall:
671 + zstyle ':completion:*:processes-names' command 'ps c -u ${USER} -o command | uniq'
672 +
673 + # complete manual by their section
674 + zstyle ':completion:*:manuals' separate-sections true
675 + zstyle ':completion:*:manuals.*' insert-sections true
676 + zstyle ':completion:*:man:*' menu yes select
677 +
678 + # Search path for sudo completion
679 + zstyle ':completion:*:sudo:*' command-path /usr/local/sbin \
680 + /usr/local/bin \
681 + /usr/sbin \
682 + /usr/bin \
683 + /sbin \
684 + /bin \
685 + /usr/X11R6/bin
686 +
687 + # provide .. as a completion
688 + zstyle ':completion:*' special-dirs ..
689 +
690 + # run rehash on completion so new installed program are found automatically:
691 + function _force_rehash () {
692 + (( CURRENT == 1 )) && rehash
693 + return 1
694 + }
695 +
696 + ## correction
697 + # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
698 + if [[ "$NOCOR" -gt 0 ]] ; then
699 + zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
700 + setopt nocorrect
701 + else
702 + # try to be smart about when to use what completer...
703 + setopt correct
704 + zstyle -e ':completion:*' completer '
705 + if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
706 + _last_try="$HISTNO$BUFFER$CURSOR"
707 + reply=(_complete _match _ignored _prefix _files)
708 + else
709 + if [[ $words[1] == (rm|mv) ]] ; then
710 + reply=(_complete _files)
711 + else
712 + reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
713 + fi
714 + fi'
715 + fi
716 +
717 + # command for process lists, the local web server details and host completion
718 + zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
719 +
720 + # Some functions, like _apt and _dpkg, are very slow. We can use a cache in
721 + # order to speed things up
722 + if [[ ${GRML_COMP_CACHING:-yes} == yes ]]; then
723 + GRML_COMP_CACHE_DIR=${GRML_COMP_CACHE_DIR:-${ZDOTDIR:-$HOME}/.cache}
724 + if [[ ! -d ${GRML_COMP_CACHE_DIR} ]]; then
725 + command mkdir -p "${GRML_COMP_CACHE_DIR}"
726 + fi
727 + zstyle ':completion:*' use-cache yes
728 + zstyle ':completion:*:complete:*' cache-path "${GRML_COMP_CACHE_DIR}"
729 + fi
730 +
731 + # host completion
732 + _ssh_config_hosts=()
733 + if [[ -r ~/.ssh/config ]] ; then
734 + _ssh_config_hosts=(${${(s: :)${(ps:\t:)${${(@M)${(f)"$(<$HOME/.ssh/config)"}:#Host *}#Host }}}:#*[*?]*})
735 + fi
736 + _ssh_hosts=()
737 + if [[ -r ~/.ssh/known_hosts ]] ; then
738 + _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*})
739 + fi
740 + _etc_hosts=()
741 + if [[ -r /etc/hosts ]] && [[ "$NOETCHOSTS" -eq 0 ]] ; then
742 + : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(grep -v '^0\.0\.0\.0\|^127\.0\.0\.1\|^::1 ' /etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}}
743 + fi
744 +
745 + hosts=(
746 + "$HOST"
747 + "$_ssh_config_hosts[@]"
748 + "$_ssh_hosts[@]"
749 + "$_etc_hosts[@]"
750 + localhost
751 + )
752 + zstyle ':completion:*:hosts' hosts $hosts
753 + # TODO: so, why is this here?
754 + # zstyle '*' hosts $hosts
755 +
756 + # use generic completion system for programs not yet defined; (_gnu_generic works
757 + # with commands that provide a --help option with "standard" gnu-like output.)
758 + for compcom in cp deborphan df feh fetchipac gpasswd head hnb ipacsum mv \
759 + pal stow uname ; do
760 + [[ -z ${_comps[$compcom]} ]] && compdef _gnu_generic ${compcom}
761 + done; unset compcom
762 +
763 + # see upgrade function in this file
764 + compdef _hosts upgrade
765 + }
766 +
767 + # Keyboard setup: The following is based on the same code, we wrote for
768 + # debian's setup. It ensures the terminal is in the right mode, when zle is
769 + # active, so the values from $terminfo are valid. Therefore, this setup should
770 + # work on all systems, that have support for `terminfo'. It also requires the
771 + # zsh in use to have the `zsh/terminfo' module built.
772 + #
773 + # If you are customising your `zle-line-init()' or `zle-line-finish()'
774 + # functions, make sure you call the following utility functions in there:
775 + #
776 + # - zle-line-init(): zle-smkx
777 + # - zle-line-finish(): zle-rmkx
778 +
779 + # Use emacs-like key bindings by default:
780 + bindkey -e
781 +
782 + # Custom widgets:
783 +
784 + ## beginning-of-line OR beginning-of-buffer OR beginning of history
785 + ## by: Bart Schaefer <[email protected]>, Bernhard Tittelbach
786 + function beginning-or-end-of-somewhere () {
787 + local hno=$HISTNO
788 + if [[ ( "${LBUFFER[-1]}" == $'\n' && "${WIDGET}" == beginning-of* ) || \
789 + ( "${RBUFFER[1]}" == $'\n' && "${WIDGET}" == end-of* ) ]]; then
790 + zle .${WIDGET:s/somewhere/buffer-or-history/} "$@"
791 + else
792 + zle .${WIDGET:s/somewhere/line-hist/} "$@"
793 + if (( HISTNO != hno )); then
794 + zle .${WIDGET:s/somewhere/buffer-or-history/} "$@"
795 + fi
796 + fi
797 + }
798 + zle -N beginning-of-somewhere beginning-or-end-of-somewhere
799 + zle -N end-of-somewhere beginning-or-end-of-somewhere
800 +
801 + # add a command line to the shells history without executing it
802 + function commit-to-history () {
803 + print -rs ${(z)BUFFER}
804 + zle send-break
805 + }
806 + zle -N commit-to-history
807 +
808 + # only slash should be considered as a word separator:
809 + function slash-backward-kill-word () {
810 + local WORDCHARS="${WORDCHARS:s@/@}"
811 + # zle backward-word
812 + zle backward-kill-word
813 + }
814 + zle -N slash-backward-kill-word
815 +
816 + # a generic accept-line wrapper
817 +
818 + # This widget can prevent unwanted autocorrections from command-name
819 + # to _command-name, rehash automatically on enter and call any number
820 + # of builtin and user-defined widgets in different contexts.
821 + #
822 + # For a broader description, see:
823 + # <http://bewatermyfriend.org/posts/2007/12-26.11-50-38-tooltime.html>
824 + #
825 + # The code is imported from the file 'zsh/functions/accept-line' from
826 + # <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>, which
827 + # distributed under the same terms as zsh itself.
828 +
829 + # A newly added command will may not be found or will cause false
830 + # correction attempts, if you got auto-correction set. By setting the
831 + # following style, we force accept-line() to rehash, if it cannot
832 + # find the first word on the command line in the $command[] hash.
833 + zstyle ':acceptline:*' rehash true
834 +
835 + function Accept-Line () {
836 + setopt localoptions noksharrays
837 + local -a subs
838 + local -xi aldone
839 + local sub
840 + local alcontext=${1:-$alcontext}
841 +
842 + zstyle -a ":acceptline:${alcontext}" actions subs
843 +
844 + (( ${#subs} < 1 )) && return 0
845 +
846 + (( aldone = 0 ))
847 + for sub in ${subs} ; do
848 + [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
849 + zle ${sub}
850 +
851 + (( aldone > 0 )) && break
852 + done
853 + }
854 +
855 + function Accept-Line-getdefault () {
856 + emulate -L zsh
857 + local default_action
858 +
859 + zstyle -s ":acceptline:${alcontext}" default_action default_action
860 + case ${default_action} in
861 + ((accept-line|))
862 + printf ".accept-line"
863 + ;;
864 + (*)
865 + printf ${default_action}
866 + ;;
867 + esac
868 + }
869 +
870 + function Accept-Line-HandleContext () {
871 + zle Accept-Line
872 +
873 + default_action=$(Accept-Line-getdefault)
874 + zstyle -T ":acceptline:${alcontext}" call_default \
875 + && zle ${default_action}
876 + }
877 +
878 + function accept-line () {
879 + setopt localoptions noksharrays
880 + local -a cmdline
881 + local -x alcontext
882 + local buf com fname format msg default_action
883 +
884 + alcontext='default'
885 + buf="${BUFFER}"
886 + cmdline=(${(z)BUFFER})
887 + com="${cmdline[1]}"
888 + fname="_${com}"
889 +
890 + Accept-Line 'preprocess'
891 +
892 + zstyle -t ":acceptline:${alcontext}" rehash \
893 + && [[ -z ${commands[$com]} ]] \
894 + && rehash
895 +
896 + if [[ -n ${com} ]] \
897 + && [[ -n ${reswords[(r)$com]} ]] \
898 + || [[ -n ${aliases[$com]} ]] \
899 + || [[ -n ${functions[$com]} ]] \
900 + || [[ -n ${builtins[$com]} ]] \
901 + || [[ -n ${commands[$com]} ]] ; then
902 +
903 + # there is something sensible to execute, just do it.
904 + alcontext='normal'
905 + Accept-Line-HandleContext
906 +
907 + return
908 + fi
909 +
910 + if [[ -o correct ]] \
911 + || [[ -o correctall ]] \
912 + && [[ -n ${functions[$fname]} ]] ; then
913 +
914 + # nothing there to execute but there is a function called
915 + # _command_name; a completion widget. Makes no sense to
916 + # call it on the commandline, but the correct{,all} options
917 + # will ask for it nevertheless, so warn the user.
918 + if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
919 + # Okay, we warned the user before, he called us again,
920 + # so have it his way.
921 + alcontext='force'
922 + Accept-Line-HandleContext
923 +
924 + return
925 + fi
926 +
927 + if zstyle -t ":acceptline:${alcontext}" nocompwarn ; then
928 + alcontext='normal'
929 + Accept-Line-HandleContext
930 + else
931 + # prepare warning message for the user, configurable via zstyle.
932 + zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
933 +
934 + if [[ -z ${msg} ]] ; then
935 + msg="%c will not execute and completion %f exists."
936 + fi
937 +
938 + zformat -f msg "${msg}" "c:${com}" "f:${fname}"
939 +
940 + zle -M -- "${msg}"
941 + fi
942 + return
943 + elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
944 + # If we are here, the commandline contains something that is not
945 + # executable, which is neither subject to _command_name correction
946 + # and is not empty. might be a variable assignment
947 + alcontext='misc'
948 + Accept-Line-HandleContext
949 +
950 + return
951 + fi
952 +
953 + # If we got this far, the commandline only contains whitespace, or is empty.
954 + alcontext='empty'
955 + Accept-Line-HandleContext
956 + }
957 +
958 + zle -N accept-line
959 + zle -N Accept-Line
960 + zle -N Accept-Line-HandleContext
961 +
962 + # power completion / abbreviation expansion / buffer expansion
963 + # see http://zshwiki.org/home/examples/zleiab for details
964 + # less risky than the global aliases but powerful as well
965 + # just type the abbreviation key and afterwards 'ctrl-x .' to expand it
966 + declare -A abk
967 + setopt extendedglob
968 + setopt interactivecomments
969 + abk=(
970 + # key # value (#d additional doc string)
971 + #A# start
972 + '...' '../..'
973 + '....' '../../..'
974 + 'BG' '& exit'
975 + 'C' '| wc -l'
976 + 'G' '|& grep '${grep_options:+"${grep_options[*]}"}
977 + 'H' '| head'
978 + 'Hl' ' --help |& less -r' #d (Display help in pager)
979 + 'J' '| jq'
980 + 'K' '| keep'
981 + 'L' '| less'
982 + 'LL' '|& less -r'
983 + 'M' '| most'
984 + 'N' '&>/dev/null' #d (No Output)
985 + 'R' '| tr A-z N-za-m' #d (ROT13)
986 + 'SL' '| sort | less'
987 + 'S' '| sort -u'
988 + 'T' '| tail'
989 + 'TS' '| ts "%F %H:%M:%.S"'
990 + 'V' '|& vim -'
991 + #A# end
992 + 'co' './configure && make && sudo make install'
993 + )
994 +
995 + function zleiab () {
996 + emulate -L zsh
997 + setopt extendedglob
998 + local MATCH
999 +
1000 + LBUFFER=${LBUFFER%%(#m)[.\-+:|_a-zA-Z0-9]#}
1001 + LBUFFER+=${abk[$MATCH]:-$MATCH}
1002 + }
1003 +
1004 + zle -N zleiab
1005 +
1006 + function help-show-abk () {
1007 + zle -M "$(print "Available abbreviations for expansion:"; print -a -C 2 ${(kv)abk})"
1008 + }
1009 +
1010 + zle -N help-show-abk
1011 +
1012 + # press "ctrl-x d" to insert the actual date in the form yyyy-mm-dd
1013 + function insert-datestamp () { LBUFFER+=${(%):-'%D{%Y-%m-%d}'}; }
1014 + zle -N insert-datestamp
1015 +
1016 + # press esc-m for inserting last typed word again (thanks to caphuso!)
1017 + function insert-last-typed-word () { zle insert-last-word -- 0 -1 };
1018 + zle -N insert-last-typed-word;
1019 +
1020 + function grml-zsh-fg () {
1021 + if (( ${#jobstates} )); then
1022 + zle .push-input
1023 + [[ -o hist_ignore_space ]] && BUFFER=' ' || BUFFER=''
1024 + BUFFER="${BUFFER}fg"
1025 + zle .accept-line
1026 + else
1027 + zle -M 'No background jobs. Doing nothing.'
1028 + fi
1029 + }
1030 + zle -N grml-zsh-fg
1031 +
1032 + # run command line as user root via sudo:
1033 + function sudo-command-line () {
1034 + [[ -z $BUFFER ]] && zle up-history
1035 + local cmd="sudo "
1036 + if [[ ${BUFFER} == ${cmd}* ]]; then
1037 + CURSOR=$(( CURSOR-${#cmd} ))
1038 + BUFFER="${BUFFER#$cmd}"
1039 + else
1040 + BUFFER="${cmd}${BUFFER}"
1041 + CURSOR=$(( CURSOR+${#cmd} ))
1042 + fi
1043 + zle reset-prompt
1044 + }
1045 + zle -N sudo-command-line
1046 +
1047 + ### jump behind the first word on the cmdline.
1048 + ### useful to add options.
1049 + function jump_after_first_word () {
1050 + local words
1051 + words=(${(z)BUFFER})
1052 +
1053 + if (( ${#words} <= 1 )) ; then
1054 + CURSOR=${#BUFFER}
1055 + else
1056 + CURSOR=${#${words[1]}}
1057 + fi
1058 + }
1059 + zle -N jump_after_first_word
1060 +
1061 + #f5# Create directory under cursor or the selected area
1062 + function inplaceMkDirs () {
1063 + # Press ctrl-xM to create the directory under the cursor or the selected area.
1064 + # To select an area press ctrl-@ or ctrl-space and use the cursor.
1065 + # Use case: you type "mv abc ~/testa/testb/testc/" and remember that the
1066 + # directory does not exist yet -> press ctrl-XM and problem solved
1067 + local PATHTOMKDIR
1068 + if ((REGION_ACTIVE==1)); then
1069 + local F=$MARK T=$CURSOR
1070 + if [[ $F -gt $T ]]; then
1071 + F=${CURSOR}
1072 + T=${MARK}
1073 + fi
1074 + # get marked area from buffer and eliminate whitespace
1075 + PATHTOMKDIR=${BUFFER[F+1,T]%%[[:space:]]##}
1076 + PATHTOMKDIR=${PATHTOMKDIR##[[:space:]]##}
1077 + else
1078 + local bufwords iword
1079 + bufwords=(${(z)LBUFFER})
1080 + iword=${#bufwords}
1081 + bufwords=(${(z)BUFFER})
1082 + PATHTOMKDIR="${(Q)bufwords[iword]}"
1083 + fi
1084 + [[ -z "${PATHTOMKDIR}" ]] && return 1
1085 + PATHTOMKDIR=${~PATHTOMKDIR}
1086 + if [[ -e "${PATHTOMKDIR}" ]]; then
1087 + zle -M " path already exists, doing nothing"
1088 + else
1089 + zle -M "$(mkdir -p -v "${PATHTOMKDIR}")"
1090 + zle end-of-line
1091 + fi
1092 + }
1093 +
1094 + zle -N inplaceMkDirs
1095 +
1096 + #v1# set number of lines to display per page
1097 + HELP_LINES_PER_PAGE=20
1098 + #v1# set location of help-zle cache file
1099 + HELP_ZLE_CACHE_FILE=~/.cache/zsh_help_zle_lines.zsh
1100 + # helper function for help-zle, actually generates the help text
1101 + function help_zle_parse_keybindings () {
1102 + emulate -L zsh
1103 + setopt extendedglob
1104 + unsetopt ksharrays #indexing starts at 1
1105 +
1106 + #v1# choose files that help-zle will parse for keybindings
1107 + ((${+HELPZLE_KEYBINDING_FILES})) || HELPZLE_KEYBINDING_FILES=( /etc/zsh/zshrc ~/.zshrc.pre ~/.zshrc ~/.zshrc.local )
1108 +
1109 + if [[ -r $HELP_ZLE_CACHE_FILE ]]; then
1110 + local load_cache=0
1111 + local f
1112 + for f ($HELPZLE_KEYBINDING_FILES) [[ $f -nt $HELP_ZLE_CACHE_FILE ]] && load_cache=1
1113 + [[ $load_cache -eq 0 ]] && . $HELP_ZLE_CACHE_FILE && return
1114 + fi
1115 +
1116 + #fill with default keybindings, possibly to be overwritten in a file later
1117 + #Note that due to zsh inconsistency on escaping assoc array keys, we encase the key in '' which we will remove later
1118 + local -A help_zle_keybindings
1119 + help_zle_keybindings['<Ctrl>@']="set MARK"
1120 + help_zle_keybindings['<Ctrl>x<Ctrl>j']="vi-join lines"
1121 + help_zle_keybindings['<Ctrl>x<Ctrl>b']="jump to matching brace"
1122 + help_zle_keybindings['<Ctrl>x<Ctrl>u']="undo"
1123 + help_zle_keybindings['<Ctrl>_']="undo"
1124 + help_zle_keybindings['<Ctrl>x<Ctrl>f<c>']="find <c> in cmdline"
1125 + help_zle_keybindings['<Ctrl>a']="goto beginning of line"
1126 + help_zle_keybindings['<Ctrl>e']="goto end of line"
1127 + help_zle_keybindings['<Ctrl>t']="transpose charaters"
1128 + help_zle_keybindings['<Alt>t']="transpose words"
1129 + help_zle_keybindings['<Alt>s']="spellcheck word"
1130 + help_zle_keybindings['<Ctrl>k']="backward kill buffer"
1131 + help_zle_keybindings['<Ctrl>u']="forward kill buffer"
1132 + help_zle_keybindings['<Ctrl>y']="insert previously killed word/string"
1133 + help_zle_keybindings["<Alt>'"]="quote line"
1134 + help_zle_keybindings['<Alt>"']="quote from mark to cursor"
1135 + help_zle_keybindings['<Alt><arg>']="repeat next cmd/char <arg> times (<Alt>-<Alt>1<Alt>0a -> -10 times 'a')"
1136 + help_zle_keybindings['<Alt>u']="make next word Uppercase"
1137 + help_zle_keybindings['<Alt>l']="make next word lowercase"
1138 + help_zle_keybindings['<Ctrl>xG']="preview expansion under cursor"
1139 + help_zle_keybindings['<Alt>q']="push current CL into background, freeing it. Restore on next CL"
1140 + help_zle_keybindings['<Alt>.']="insert (and interate through) last word from prev CLs"
1141 + help_zle_keybindings['<Alt>,']="complete word from newer history (consecutive hits)"
1142 + help_zle_keybindings['<Alt>m']="repeat last typed word on current CL"
1143 + help_zle_keybindings['<Ctrl>v']="insert next keypress symbol literally (e.g. for bindkey)"
1144 + help_zle_keybindings['!!:n*<Tab>']="insert last n arguments of last command"
1145 + help_zle_keybindings['!!:n-<Tab>']="insert arguments n..N-2 of last command (e.g. mv s s d)"
1146 + help_zle_keybindings['<Alt>h']="show help/manpage for current command"
1147 +
1148 + #init global variables
1149 + unset help_zle_lines help_zle_sln
1150 + typeset -g -a help_zle_lines
1151 + typeset -g help_zle_sln=1
1152 +
1153 + local k v f cline
1154 + local lastkeybind_desc contents #last description starting with #k# that we found
1155 + local num_lines_elapsed=0 #number of lines between last description and keybinding
1156 + #search config files in the order they a called (and thus the order in which they overwrite keybindings)
1157 + for f in $HELPZLE_KEYBINDING_FILES; do
1158 + [[ -r "$f" ]] || continue #not readable ? skip it
1159 + contents="$(<$f)"
1160 + for cline in "${(f)contents}"; do
1161 + #zsh pattern: matches lines like: #k# ..............
1162 + if [[ "$cline" == (#s)[[:space:]]#\#k\#[[:space:]]##(#b)(*)[[:space:]]#(#e) ]]; then
1163 + lastkeybind_desc="$match[*]"
1164 + num_lines_elapsed=0
1165 + #zsh pattern: matches lines that set a keybinding using bind2map, bindkey or compdef -k
1166 + # ignores lines that are commentend out
1167 + # grabs first in '' or "" enclosed string with length between 1 and 6 characters
1168 + elif [[ "$cline" == [^#]#(bind2maps[[:space:]](*)-s|bindkey|compdef -k)[[:space:]](*)(#b)(\"((?)(#c1,6))\"|\'((?)(#c1,6))\')(#B)(*) ]]; then
1169 + #description previously found ? description not more than 2 lines away ? keybinding not empty ?
1170 + if [[ -n $lastkeybind_desc && $num_lines_elapsed -lt 2 && -n $match[1] ]]; then
1171 + #substitute keybinding string with something readable
1172 + k=${${${${${${${match[1]/\\e\^h/<Alt><BS>}/\\e\^\?/<Alt><BS>}/\\e\[5~/<PageUp>}/\\e\[6~/<PageDown>}//(\\e|\^\[)/<Alt>}//\^/<Ctrl>}/3~/<Alt><Del>}
1173 + #put keybinding in assoc array, possibly overwriting defaults or stuff found in earlier files
1174 + #Note that we are extracting the keybinding-string including the quotes (see Note at beginning)
1175 + help_zle_keybindings[${k}]=$lastkeybind_desc
1176 + fi
1177 + lastkeybind_desc=""
1178 + else
1179 + ((num_lines_elapsed++))
1180 + fi
1181 + done
1182 + done
1183 + unset contents
1184 + #calculate length of keybinding column
1185 + local kstrlen=0
1186 + for k (${(k)help_zle_keybindings[@]}) ((kstrlen < ${#k})) && kstrlen=${#k}
1187 + #convert the assoc array into preformated lines, which we are able to sort
1188 + for k v in ${(kv)help_zle_keybindings[@]}; do
1189 + #pad keybinding-string to kstrlen chars and remove outermost characters (i.e. the quotes)
1190 + help_zle_lines+=("${(r:kstrlen:)k[2,-2]}${v}")
1191 + done
1192 + #sort lines alphabetically
1193 + help_zle_lines=("${(i)help_zle_lines[@]}")
1194 + [[ -d ${HELP_ZLE_CACHE_FILE:h} ]] || mkdir -p "${HELP_ZLE_CACHE_FILE:h}"
1195 + echo "help_zle_lines=(${(q)help_zle_lines[@]})" >| $HELP_ZLE_CACHE_FILE
1196 + zcompile $HELP_ZLE_CACHE_FILE
1197 + }
1198 + typeset -g help_zle_sln
1199 + typeset -g -a help_zle_lines
1200 +
1201 + # Provides (partially autogenerated) help on keybindings and the zsh line editor
1202 + function help-zle () {
1203 + emulate -L zsh
1204 + unsetopt ksharrays #indexing starts at 1
1205 + #help lines already generated ? no ? then do it
1206 + [[ ${+functions[help_zle_parse_keybindings]} -eq 1 ]] && {help_zle_parse_keybindings && unfunction help_zle_parse_keybindings}
1207 + #already displayed all lines ? go back to the start
1208 + [[ $help_zle_sln -gt ${#help_zle_lines} ]] && help_zle_sln=1
1209 + local sln=$help_zle_sln
1210 + #note that help_zle_sln is a global var, meaning we remember the last page we viewed
1211 + help_zle_sln=$((help_zle_sln + HELP_LINES_PER_PAGE))
1212 + zle -M "${(F)help_zle_lines[sln,help_zle_sln-1]}"
1213 + }
1214 + zle -N help-zle
1215 +
1216 + ## complete word from currently visible Screen or Tmux buffer.
1217 + if check_com -c screen || check_com -c tmux; then
1218 + function _complete_screen_display () {
1219 +
1220 + local TMPFILE=$(mktemp)
1221 + local -U -a _screen_display_wordlist
1222 + trap "rm -f $TMPFILE" EXIT
1223 +
1224 + # fill array with contents from screen hardcopy
1225 + if ((${+TMUX})); then
1226 + #works, but crashes tmux below version 1.4
1227 + #luckily tmux -V option to ask for version, was also added in 1.4
1228 + tmux -V &>/dev/null || return
1229 + tmux -q capture-pane -b 0 \; save-buffer -b 0 $TMPFILE \; delete-buffer -b 0
1230 + else
1231 + [[ "$TERM" != "screen" ]] && return
1232 + screen -X hardcopy $TMPFILE
1233 + # screen sucks, it dumps in latin1, apparently always. so recode it
1234 + # to system charset
1235 + check_com recode && recode latin1 $TMPFILE
1236 + fi
1237 + _screen_display_wordlist=( ${(QQ)$(<$TMPFILE)} )
1238 + # remove PREFIX to be completed from that array
1239 + _screen_display_wordlist[${_screen_display_wordlist[(i)$PREFIX]}]=""
1240 + compadd -a _screen_display_wordlist
1241 + }
1242 + #m# k CTRL-x\,\,\,S Complete word from GNU screen buffer
1243 + bindkey -r "^xS"
1244 + compdef -k _complete_screen_display complete-word '^xS'
1245 + fi
1246 +
1247 + # Load a few more functions and tie them to widgets, so they can be bound:
1248 +
1249 + function zrcautozle () {
1250 + emulate -L zsh
1251 + local fnc=$1
1252 + zrcautoload $fnc && zle -N $fnc
1253 + }
1254 +
1255 + function zrcgotwidget () {
1256 + (( ${+widgets[$1]} ))
1257 + }
1258 +
1259 + function zrcgotkeymap () {
1260 + [[ -n ${(M)keymaps:#$1} ]]
1261 + }
1262 +
1263 + zrcautozle insert-files
1264 + zrcautozle edit-command-line
1265 + zrcautozle insert-unicode-char
1266 + if zrcautoload history-search-end; then
1267 + zle -N history-beginning-search-backward-end history-search-end
1268 + zle -N history-beginning-search-forward-end history-search-end
1269 + fi
1270 + zle -C hist-complete complete-word _generic
1271 + zstyle ':completion:hist-complete:*' completer _history
1272 +
1273 + # The actual terminal setup hooks and bindkey-calls:
1274 +
1275 + # An array to note missing features to ease diagnosis in case of problems.
1276 + typeset -ga grml_missing_features
1277 +
1278 + function zrcbindkey () {
1279 + if (( ARGC )) && zrcgotwidget ${argv[-1]}; then
1280 + bindkey "$@"
1281 + fi
1282 + }
1283 +
1284 + function bind2maps () {
1285 + local i sequence widget
1286 + local -a maps
1287 +
1288 + while [[ "$1" != "--" ]]; do
1289 + maps+=( "$1" )
1290 + shift
1291 + done
1292 + shift
1293 +
1294 + if [[ "$1" == "-s" ]]; then
1295 + shift
1296 + sequence="$1"
1297 + else
1298 + sequence="${key[$1]}"
1299 + fi
1300 + widget="$2"
1301 +
1302 + [[ -z "$sequence" ]] && return 1
1303 +
1304 + for i in "${maps[@]}"; do
1305 + zrcbindkey -M "$i" "$sequence" "$widget"
1306 + done
1307 + }
1308 +
1309 + if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
1310 + function zle-smkx () {
1311 + emulate -L zsh
1312 + printf '%s' ${terminfo[smkx]}
1313 + }
1314 + function zle-rmkx () {
1315 + emulate -L zsh
1316 + printf '%s' ${terminfo[rmkx]}
1317 + }
1318 + function zle-line-init () {
1319 + zle-smkx
1320 + }
1321 + function zle-line-finish () {
1322 + zle-rmkx
1323 + }
1324 + zle -N zle-line-init
1325 + zle -N zle-line-finish
1326 + else
1327 + for i in {s,r}mkx; do
1328 + (( ${+terminfo[$i]} )) || grml_missing_features+=($i)
1329 + done
1330 + unset i
1331 + fi
1332 +
1333 + typeset -A key
1334 + key=(
1335 + Home "${terminfo[khome]}"
1336 + End "${terminfo[kend]}"
1337 + Insert "${terminfo[kich1]}"
1338 + Delete "${terminfo[kdch1]}"
1339 + Up "${terminfo[kcuu1]}"
1340 + Down "${terminfo[kcud1]}"
1341 + Left "${terminfo[kcub1]}"
1342 + Right "${terminfo[kcuf1]}"
1343 + PageUp "${terminfo[kpp]}"
1344 + PageDown "${terminfo[knp]}"
1345 + BackTab "${terminfo[kcbt]}"
1346 + )
1347 +
1348 + # Guidelines for adding key bindings:
1349 + #
1350 + # - Do not add hardcoded escape sequences, to enable non standard key
1351 + # combinations such as Ctrl-Meta-Left-Cursor. They are not easily portable.
1352 + #
1353 + # - Adding Ctrl characters, such as '^b' is okay; note that '^b' and '^B' are
1354 + # the same key.
1355 + #
1356 + # - All keys from the $key[] mapping are obviously okay.
1357 + #
1358 + # - Most terminals send "ESC x" when Meta-x is pressed. Thus, sequences like
1359 + # '\ex' are allowed in here as well.
1360 +
1361 + bind2maps emacs -- Home beginning-of-somewhere
1362 + bind2maps viins vicmd -- Home vi-beginning-of-line
1363 + bind2maps emacs -- End end-of-somewhere
1364 + bind2maps viins vicmd -- End vi-end-of-line
1365 + bind2maps emacs viins -- Insert overwrite-mode
1366 + bind2maps vicmd -- Insert vi-insert
1367 + bind2maps emacs -- Delete delete-char
1368 + bind2maps viins vicmd -- Delete vi-delete-char
1369 + bind2maps emacs viins vicmd -- Up up-line-or-search
1370 + bind2maps emacs viins vicmd -- Down down-line-or-search
1371 + bind2maps emacs -- Left backward-char
1372 + bind2maps viins vicmd -- Left vi-backward-char
1373 + bind2maps emacs -- Right forward-char
1374 + bind2maps viins vicmd -- Right vi-forward-char
1375 + #k# Perform abbreviation expansion
1376 + bind2maps emacs viins -- -s '^x.' zleiab
1377 + #k# Display list of abbreviations that would expand
1378 + bind2maps emacs viins -- -s '^xb' help-show-abk
1379 + #k# mkdir -p <dir> from string under cursor or marked area
1380 + bind2maps emacs viins -- -s '^xM' inplaceMkDirs
1381 + #k# display help for keybindings and ZLE
1382 + bind2maps emacs viins -- -s '^xz' help-zle
1383 + #k# Insert files and test globbing
1384 + bind2maps emacs viins -- -s "^xf" insert-files
1385 + #k# Edit the current line in \kbd{\$EDITOR}
1386 + bind2maps emacs viins -- -s '\ee' edit-command-line
1387 + #k# search history backward for entry beginning with typed text
1388 + bind2maps emacs viins -- -s '^xp' history-beginning-search-backward-end
1389 + #k# search history forward for entry beginning with typed text
1390 + bind2maps emacs viins -- -s '^xP' history-beginning-search-forward-end
1391 + #k# search history backward for entry beginning with typed text
1392 + bind2maps emacs viins -- PageUp history-beginning-search-backward-end
1393 + #k# search history forward for entry beginning with typed text
1394 + bind2maps emacs viins -- PageDown history-beginning-search-forward-end
1395 + bind2maps emacs viins -- -s "^x^h" commit-to-history
1396 + #k# Kill left-side word or everything up to next slash
1397 + bind2maps emacs viins -- -s '\ev' slash-backward-kill-word
1398 + #k# Kill left-side word or everything up to next slash
1399 + bind2maps emacs viins -- -s '\e^h' slash-backward-kill-word
1400 + #k# Kill left-side word or everything up to next slash
1401 + bind2maps emacs viins -- -s '\e^?' slash-backward-kill-word
1402 + # Do history expansion on space:
1403 + bind2maps emacs viins -- -s ' ' magic-space
1404 + #k# Trigger menu-complete
1405 + bind2maps emacs viins -- -s '\ei' menu-complete # menu completion via esc-i
1406 + #k# Insert a timestamp on the command line (yyyy-mm-dd)
1407 + bind2maps emacs viins -- -s '^xd' insert-datestamp
1408 + #k# Insert last typed word
1409 + bind2maps emacs viins -- -s "\em" insert-last-typed-word
1410 + #k# A smart shortcut for \kbd{fg<enter>}
1411 + bind2maps emacs viins -- -s '^z' grml-zsh-fg
1412 + #k# prepend the current command with "sudo"
1413 + bind2maps emacs viins -- -s "^os" sudo-command-line
1414 + #k# jump to after first word (for adding options)
1415 + bind2maps emacs viins -- -s '^x1' jump_after_first_word
1416 + #k# complete word from history with menu
1417 + bind2maps emacs viins -- -s "^x^x" hist-complete
1418 +
1419 + # insert unicode character
1420 + # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
1421 + # See for example http://unicode.org/charts/ for unicode characters code
1422 + #k# Insert Unicode character
1423 + bind2maps emacs viins -- -s '^xi' insert-unicode-char
1424 +
1425 + # use the new *-pattern-* widgets for incremental history search
1426 + if zrcgotwidget history-incremental-pattern-search-backward; then
1427 + for seq wid in '^r' history-incremental-pattern-search-backward \
1428 + '^s' history-incremental-pattern-search-forward
1429 + do
1430 + bind2maps emacs viins vicmd -- -s $seq $wid
1431 + done
1432 + builtin unset -v seq wid
1433 + fi
1434 +
1435 + if zrcgotkeymap menuselect; then
1436 + #m# k Shift-tab Perform backwards menu completion
1437 + bind2maps menuselect -- BackTab reverse-menu-complete
1438 +
1439 + #k# menu selection: pick item but stay in the menu
1440 + bind2maps menuselect -- -s '\e^M' accept-and-menu-complete
1441 + # also use + and INSERT since it's easier to press repeatedly
1442 + bind2maps menuselect -- -s '+' accept-and-menu-complete
1443 + bind2maps menuselect -- Insert accept-and-menu-complete
1444 +
1445 + # accept a completion and try to complete again by using menu
1446 + # completion; very useful with completing directories
1447 + # by using 'undo' one's got a simple file browser
1448 + bind2maps menuselect -- -s '^o' accept-and-infer-next-history
1449 + fi
1450 +
1451 + # Finally, here are still a few hardcoded escape sequences; Special sequences
1452 + # like Ctrl-<Cursor-key> etc do suck a fair bit, because they are not
1453 + # standardised and most of the time are not available in a terminals terminfo
1454 + # entry.
1455 + #
1456 + # While we do not encourage adding bindings like these, we will keep these for
1457 + # backward compatibility.
1458 +
1459 + ## use Ctrl-left-arrow and Ctrl-right-arrow for jumping to word-beginnings on
1460 + ## the command line.
1461 + # URxvt sequences:
1462 + bind2maps emacs viins vicmd -- -s '\eOc' forward-word
1463 + bind2maps emacs viins vicmd -- -s '\eOd' backward-word
1464 + # These are for xterm:
1465 + bind2maps emacs viins vicmd -- -s '\e[1;5C' forward-word
1466 + bind2maps emacs viins vicmd -- -s '\e[1;5D' backward-word
1467 + ## the same for alt-left-arrow and alt-right-arrow
1468 + # URxvt again:
1469 + bind2maps emacs viins vicmd -- -s '\e\e[C' forward-word
1470 + bind2maps emacs viins vicmd -- -s '\e\e[D' backward-word
1471 + # Xterm again:
1472 + bind2maps emacs viins vicmd -- -s '^[[1;3C' forward-word
1473 + bind2maps emacs viins vicmd -- -s '^[[1;3D' backward-word
1474 + # Also try ESC Left/Right:
1475 + bind2maps emacs viins vicmd -- -s '\e'${key[Right]} forward-word
1476 + bind2maps emacs viins vicmd -- -s '\e'${key[Left]} backward-word
1477 +
1478 + # autoloading
1479 +
1480 + zrcautoload zmv
1481 + zrcautoload zed
1482 +
1483 + # we don't want to quote/espace URLs on our own...
1484 + # if autoload -U url-quote-magic ; then
1485 + # zle -N self-insert url-quote-magic
1486 + # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
1487 + # else
1488 + # print 'Notice: no url-quote-magic available :('
1489 + # fi
1490 + alias url-quote='autoload -U bracketed-paste-magic url-quote-magic;
1491 + zle -N bracketed-paste bracketed-paste-magic; zle -N self-insert url-quote-magic'
1492 +
1493 + #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
1494 + alias run-help >&/dev/null && unalias run-help
1495 + for rh in run-help{,-git,-ip,-openssl,-p4,-sudo,-svk,-svn}; do
1496 + zrcautoload $rh
1497 + done; unset rh
1498 +
1499 + # command not found handling
1500 +
1501 + (( ${COMMAND_NOT_FOUND} == 1 )) &&
1502 + function command_not_found_handler () {
1503 + emulate -L zsh
1504 + if [[ -x ${GRML_ZSH_CNF_HANDLER} ]] ; then
1505 + ${GRML_ZSH_CNF_HANDLER} $1
1506 + fi
1507 + return 1
1508 + }
1509 +
1510 + # history
1511 +
1512 + #v#
1513 + HISTFILE=${HISTFILE:-${ZDOTDIR:-${HOME}}/.zsh_history}
1514 + # override settings only if the defaults from zsh are in place
1515 + if [[ -z $HISTSIZE || $HISTSIZE -eq 30 ]] ; then
1516 + HISTSIZE=5000
1517 + SAVEHIST=10000 # useful for setopt append_history
1518 + fi
1519 +
1520 + # dirstack handling
1521 +
1522 + DIRSTACKSIZE=${DIRSTACKSIZE:-20}
1523 + DIRSTACKFILE=${DIRSTACKFILE:-${ZDOTDIR:-${HOME}}/.zdirs}
1524 +
1525 + if zstyle -T ':grml:chpwd:dirstack' enable; then
1526 + typeset -gaU GRML_PERSISTENT_DIRSTACK
1527 + function grml_dirstack_filter () {
1528 + local -a exclude
1529 + local filter entry
1530 + if zstyle -s ':grml:chpwd:dirstack' filter filter; then
1531 + $filter $1 && return 0
1532 + fi
1533 + if zstyle -a ':grml:chpwd:dirstack' exclude exclude; then
1534 + for entry in "${exclude[@]}"; do
1535 + [[ $1 == ${~entry} ]] && return 0
1536 + done
1537 + fi
1538 + return 1
1539 + }
1540 +
1541 + function chpwd () {
1542 + (( ZSH_SUBSHELL )) && return
1543 + [[ -z $DIRSTACKSIZE ]] && return
1544 + (( $DIRSTACKSIZE <= 0 )) && return
1545 + [[ -z $DIRSTACKFILE ]] && return
1546 + grml_dirstack_filter $PWD && return
1547 + GRML_PERSISTENT_DIRSTACK=(
1548 + $PWD "${(@)GRML_PERSISTENT_DIRSTACK[1,$DIRSTACKSIZE]}"
1549 + )
1550 + builtin print -l ${GRML_PERSISTENT_DIRSTACK} >! ${DIRSTACKFILE}
1551 + }
1552 +
1553 + if [[ -f ${DIRSTACKFILE} ]]; then
1554 + # Enabling NULL_GLOB via (N) weeds out any non-existing
1555 + # directories from the saved dir-stack file.
1556 + dirstack=( ${(f)"$(< $DIRSTACKFILE)"}(N) )
1557 + # "cd -" won't work after login by just setting $OLDPWD, so
1558 + [[ -d $dirstack[1] ]] && cd -q $dirstack[1] && cd -q $OLDPWD
1559 + fi
1560 +
1561 + if zstyle -t ':grml:chpwd:dirstack' filter-on-load; then
1562 + for i in "${dirstack[@]}"; do
1563 + if ! grml_dirstack_filter "$i"; then
1564 + GRML_PERSISTENT_DIRSTACK=(
1565 + "${GRML_PERSISTENT_DIRSTACK[@]}"
1566 + $i
1567 + )
1568 + fi
1569 + done
1570 + else
1571 + GRML_PERSISTENT_DIRSTACK=( "${dirstack[@]}" )
1572 + fi
1573 + fi
1574 +
1575 + # directory based profiles
1576 +
1577 + # chpwd_profiles(): Directory Profiles, Quickstart:
1578 + #
1579 + # In .zshrc.local:
1580 + #
1581 + # zstyle ':chpwd:profiles:/usr/src/grml(|/|/*)' profile grml
1582 + # zstyle ':chpwd:profiles:/usr/src/debian(|/|/*)' profile debian
1583 + # chpwd_profiles
1584 + #
1585 + # For details see the `grmlzshrc.5' manual page.
1586 + function chpwd_profiles () {
1587 + local profile context
1588 + local -i reexecute
1589 +
1590 + context=":chpwd:profiles:$PWD"
1591 + zstyle -s "$context" profile profile || profile='default'
1592 + zstyle -T "$context" re-execute && reexecute=1 || reexecute=0
1593 +
1594 + if (( ${+parameters[CHPWD_PROFILE]} == 0 )); then
1595 + typeset -g CHPWD_PROFILE
1596 + local CHPWD_PROFILES_INIT=1
1597 + (( ${+functions[chpwd_profiles_init]} )) && chpwd_profiles_init
1598 + elif [[ $profile != $CHPWD_PROFILE ]]; then
1599 + (( ${+functions[chpwd_leave_profile_$CHPWD_PROFILE]} )) \
1600 + && chpwd_leave_profile_${CHPWD_PROFILE}
1601 + fi
1602 + if (( reexecute )) || [[ $profile != $CHPWD_PROFILE ]]; then
1603 + (( ${+functions[chpwd_profile_$profile]} )) && chpwd_profile_${profile}
1604 + fi
1605 +
1606 + CHPWD_PROFILE="${profile}"
1607 + return 0
1608 + }
1609 +
1610 + chpwd_functions=( ${chpwd_functions} chpwd_profiles )
1611 +
1612 + # Prompt setup for grml:
1613 +
1614 + # set colors for use in prompts.
1615 + BLUE="%F{blue}"
1616 + RED="%F{red}"
1617 + GREEN="%F{green}"
1618 + CYAN="%F{cyan}"
1619 + MAGENTA="%F{magenta}"
1620 + YELLOW="%F{yellow}"
1621 + WHITE="%F{white}"
1622 + NO_COLOR="%f"
1623 +
1624 + # First, the easy ones: PS2..4:
1625 +
1626 + # secondary prompt, printed when the shell needs more information to complete a
1627 + # command.
1628 + PS2='\`%_> '
1629 + # selection prompt used within a select loop.
1630 + PS3='?# '
1631 + # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
1632 + PS4='+%N:%i:%_> '
1633 +
1634 + # Some additional features to use with our prompt:
1635 + #
1636 + # - battery status
1637 + # - debian_chroot
1638 + # - vcs_info setup and version specific fixes
1639 +
1640 + # display battery status on right side of prompt using 'GRML_DISPLAY_BATTERY=1' in .zshrc.pre
1641 +
1642 + function battery () {
1643 + if [[ $GRML_DISPLAY_BATTERY -gt 0 ]] ; then
1644 + if islinux ; then
1645 + batterylinux
1646 + elif isopenbsd ; then
1647 + batteryopenbsd
1648 + elif isfreebsd ; then
1649 + batteryfreebsd
1650 + elif isdarwin ; then
1651 + batterydarwin
1652 + else
1653 + #not yet supported
1654 + GRML_DISPLAY_BATTERY=0
1655 + fi
1656 + fi
1657 + }
1658 +
1659 + function batterylinux () {
1660 + GRML_BATTERY_LEVEL=''
1661 + local batteries bat capacity
1662 + batteries=( /sys/class/power_supply/BAT*(N) )
1663 + if (( $#batteries > 0 )) ; then
1664 + for bat in $batteries ; do
1665 + if [[ -e $bat/capacity ]]; then
1666 + capacity=$(< $bat/capacity)
1667 + else
1668 + typeset -F energy_full=$(< $bat/energy_full)
1669 + typeset -F energy_now=$(< $bat/energy_now)
1670 + typeset -i capacity=$(( 100 * $energy_now / $energy_full))
1671 + fi
1672 + case $(< $bat/status) in
1673 + Charging)
1674 + GRML_BATTERY_LEVEL+=" ^"
1675 + ;;
1676 + Discharging)
1677 + if (( capacity < 20 )) ; then
1678 + GRML_BATTERY_LEVEL+=" !v"
1679 + else
1680 + GRML_BATTERY_LEVEL+=" v"
1681 + fi
1682 + ;;
1683 + *) # Full, Unknown
1684 + GRML_BATTERY_LEVEL+=" ="
1685 + ;;
1686 + esac
1687 + GRML_BATTERY_LEVEL+="${capacity}%%"
1688 + done
1689 + fi
1690 + }
1691 +
1692 + function batteryopenbsd () {
1693 + GRML_BATTERY_LEVEL=''
1694 + local bat batfull batwarn batnow num
1695 + for num in 0 1 ; do
1696 + bat=$(sysctl -n hw.sensors.acpibat${num} 2>/dev/null)
1697 + if [[ -n $bat ]]; then
1698 + batfull=${"$(sysctl -n hw.sensors.acpibat${num}.amphour0)"%% *}
1699 + batwarn=${"$(sysctl -n hw.sensors.acpibat${num}.amphour1)"%% *}
1700 + batnow=${"$(sysctl -n hw.sensors.acpibat${num}.amphour3)"%% *}
1701 + case "$(sysctl -n hw.sensors.acpibat${num}.raw0)" in
1702 + *" discharging"*)
1703 + if (( batnow < batwarn )) ; then
1704 + GRML_BATTERY_LEVEL+=" !v"
1705 + else
1706 + GRML_BATTERY_LEVEL+=" v"
1707 + fi
1708 + ;;
1709 + *" charging"*)
1710 + GRML_BATTERY_LEVEL+=" ^"
1711 + ;;
1712 + *)
1713 + GRML_BATTERY_LEVEL+=" ="
1714 + ;;
1715 + esac
1716 + GRML_BATTERY_LEVEL+="${$(( 100 * batnow / batfull ))%%.*}%%"
1717 + fi
1718 + done
1719 + }
1720 +
1721 + function batteryfreebsd () {
1722 + GRML_BATTERY_LEVEL=''
1723 + local num
1724 + local -A table
1725 + for num in 0 1 ; do
1726 + table=( ${=${${${${${(M)${(f)"$(acpiconf -i $num 2>&1)"}:#(State|Remaining capacity):*}%%( ##|%)}//:[ $'\t']##/@}// /-}//@/ }} )
1727 + if [[ -n $table ]] && [[ $table[State] != "not-present" ]] ; then
1728 + case $table[State] in
1729 + *discharging*)
1730 + if (( $table[Remaining-capacity] < 20 )) ; then
1731 + GRML_BATTERY_LEVEL+=" !v"
1732 + else
1733 + GRML_BATTERY_LEVEL+=" v"
1734 + fi
1735 + ;;
1736 + *charging*)
1737 + GRML_BATTERY_LEVEL+=" ^"
1738 + ;;
1739 + *)
1740 + GRML_BATTERY_LEVEL+=" ="
1741 + ;;
1742 + esac
1743 + GRML_BATTERY_LEVEL+="$table[Remaining-capacity]%%"
1744 + fi
1745 + done
1746 + }
1747 +
1748 + function batterydarwin () {
1749 + GRML_BATTERY_LEVEL=''
1750 + local -a table
1751 + table=( ${$(pmset -g ps)[(w)8,9]%%(\%|);} )
1752 + if [[ -n $table[2] ]] ; then
1753 + case $table[2] in
1754 + charging)
1755 + GRML_BATTERY_LEVEL+=" ^"
1756 + ;;
1757 + discharging)
1758 + if (( $table[1] < 20 )) ; then
1759 + GRML_BATTERY_LEVEL+=" !v"
1760 + else
1761 + GRML_BATTERY_LEVEL+=" v"
1762 + fi
1763 + ;;
1764 + *)
1765 + GRML_BATTERY_LEVEL+=" ="
1766 + ;;
1767 + esac
1768 + GRML_BATTERY_LEVEL+="$table[1]%%"
1769 + fi
1770 + }
1771 +
1772 + # set variable debian_chroot if running in a chroot with /etc/debian_chroot
1773 + if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
1774 + debian_chroot=$(</etc/debian_chroot)
1775 + fi
1776 +
1777 + # gather version control information for inclusion in a prompt
1778 +
1779 + if zrcautoload vcs_info; then
1780 + zstyle ':vcs_info:*' max-exports 2
1781 +
1782 + if [[ -o restricted ]]; then
1783 + zstyle ':vcs_info:*' enable NONE
1784 + fi
1785 + fi
1786 +
1787 + typeset -A grml_vcs_coloured_formats
1788 + typeset -A grml_vcs_plain_formats
1789 +
1790 + grml_vcs_plain_formats=(
1791 + format "(%s%)-[%b] " "zsh: %r"
1792 + actionformat "(%s%)-[%b|%a] " "zsh: %r"
1793 + rev-branchformat "%b:%r"
1794 + )
1795 +
1796 + grml_vcs_coloured_formats=(
1797 + format "${MAGENTA}(${NO_COLOR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOR} "
1798 + actionformat "${MAGENTA}(${NO_COLOR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOR} "
1799 + rev-branchformat "%b${RED}:${YELLOW}%r"
1800 + )
1801 +
1802 + typeset GRML_VCS_COLOUR_MODE=xxx
1803 +
1804 + function grml_vcs_info_toggle_colour () {
1805 + emulate -L zsh
1806 + if [[ $GRML_VCS_COLOUR_MODE == plain ]]; then
1807 + grml_vcs_info_set_formats coloured
1808 + else
1809 + grml_vcs_info_set_formats plain
1810 + fi
1811 + return 0
1812 + }
1813 +
1814 + function grml_vcs_info_set_formats () {
1815 + emulate -L zsh
1816 + #setopt localoptions xtrace
1817 + local mode=$1 AF F BF
1818 + if [[ $mode == coloured ]]; then
1819 + AF=${grml_vcs_coloured_formats[actionformat]}
1820 + F=${grml_vcs_coloured_formats[format]}
1821 + BF=${grml_vcs_coloured_formats[rev-branchformat]}
1822 + GRML_VCS_COLOUR_MODE=coloured
1823 + else
1824 + AF=${grml_vcs_plain_formats[actionformat]}
1825 + F=${grml_vcs_plain_formats[format]}
1826 + BF=${grml_vcs_plain_formats[rev-branchformat]}
1827 + GRML_VCS_COLOUR_MODE=plain
1828 + fi
1829 +
1830 + zstyle ':vcs_info:*' actionformats "$AF" "zsh: %r"
1831 + zstyle ':vcs_info:*' formats "$F" "zsh: %r"
1832 + zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "$BF"
1833 + return 0
1834 + }
1835 +
1836 + # Change vcs_info formats for the grml prompt. The 2nd format sets up
1837 + # $vcs_info_msg_1_ to contain "zsh: repo-name" used to set our screen title.
1838 + if [[ "$TERM" == dumb ]] ; then
1839 + grml_vcs_info_set_formats plain
1840 + else
1841 + grml_vcs_info_set_formats coloured
1842 + fi
1843 +
1844 + # Now for the fun part: The grml prompt themes in `promptsys' mode of operation
1845 +
1846 + # This actually defines three prompts:
1847 + #
1848 + # - grml
1849 + # - grml-large
1850 + # - grml-chroot
1851 + #
1852 + # They all share the same code and only differ with respect to which items they
1853 + # contain. The main source of documentation is the `prompt_grml_help' function
1854 + # below, which gets called when the user does this: prompt -h grml
1855 +
1856 + function prompt_grml_help () {
1857 + <<__EOF0__
1858 + prompt grml
1859 +
1860 + This is the prompt as used by the grml-live system <http://grml.org>. It is
1861 + a rather simple one-line prompt, that by default looks something like this:
1862 +
1863 + <user>@<host> <current-working-directory>[ <vcs_info-data>]%
1864 +
1865 + The prompt itself integrates with zsh's prompt themes system (as you are
1866 + witnessing right now) and is configurable to a certain degree. In
1867 + particular, these aspects are customisable:
1868 +
1869 + - The items used in the prompt (e.g. you can remove \`user' from
1870 + the list of activated items, which will cause the user name to
1871 + be omitted from the prompt string).
1872 +
1873 + - The attributes used with the items are customisable via strings
1874 + used before and after the actual item.
1875 +
1876 + The available items are: at, battery, change-root, date, grml-chroot,
1877 + history, host, jobs, newline, path, percent, rc, rc-always, sad-smiley,
1878 + shell-level, time, user, vcs
1879 +
1880 + The actual configuration is done via zsh's \`zstyle' mechanism. The
1881 + context, that is used while looking up styles is:
1882 +
1883 + ':prompt:grml:<left-or-right>:<subcontext>'
1884 +
1885 + Here <left-or-right> is either \`left' or \`right', signifying whether the
1886 + style should affect the left or the right prompt. <subcontext> is either
1887 + \`setup' or 'items:<item>', where \`<item>' is one of the available items.
1888 +
1889 + The styles:
1890 +
1891 + - use-rprompt (boolean): If \`true' (the default), print a sad smiley
1892 + in $RPROMPT if the last command a returned non-successful error code.
1893 + (This in only valid if <left-or-right> is "right"; ignored otherwise)
1894 +
1895 + - items (list): The list of items used in the prompt. If \`vcs' is
1896 + present in the list, the theme's code invokes \`vcs_info'
1897 + accordingly. Default (left): rc change-root user at host path vcs
1898 + percent; Default (right): sad-smiley
1899 +
1900 + - strip-sensitive-characters (boolean): If the \`prompt_subst' option
1901 + is active in zsh, the shell performs lots of expansions on prompt
1902 + variable strings, including command substitution. So if you don't
1903 + control where some of your prompt strings is coming from, this is
1904 + an exploitable weakness. Grml's zsh setup does not set this option
1905 + and it is off in the shell in zsh-mode by default. If it *is* turned
1906 + on however, this style becomes active, and there are two flavours of
1907 + it: On per default is a global variant in the '*:setup' context. This
1908 + strips characters after the whole prompt string was constructed. There
1909 + is a second variant in the '*:items:<item>', that is off by default.
1910 + It allows fine grained control over which items' data is stripped.
1911 + The characters that are stripped are: \$ and \`.
1912 +
1913 + Available styles in 'items:<item>' are: pre, post. These are strings that
1914 + are inserted before (pre) and after (post) the item in question. Thus, the
1915 + following would cause the user name to be printed in red instead of the
1916 + default blue:
1917 +
1918 + zstyle ':prompt:grml:*:items:user' pre '%F{red}'
1919 +
1920 + Note, that the \`post' style may remain at its default value, because its
1921 + default value is '%f', which turns the foreground text attribute off (which
1922 + is exactly, what is still required with the new \`pre' value).
1923 + __EOF0__
1924 + }
1925 +
1926 + function prompt_grml-chroot_help () {
1927 + <<__EOF0__
1928 + prompt grml-chroot
1929 +
1930 + This is a variation of the grml prompt, see: prompt -h grml
1931 +
1932 + The main difference is the default value of the \`items' style. The rest
1933 + behaves exactly the same. Here are the defaults for \`grml-chroot':
1934 +
1935 + - left: grml-chroot user at host path percent
1936 + - right: (empty list)
1937 + __EOF0__
1938 + }
1939 +
1940 + function prompt_grml-large_help () {
1941 + <<__EOF0__
1942 + prompt grml-large
1943 +
1944 + This is a variation of the grml prompt, see: prompt -h grml
1945 +
1946 + The main difference is the default value of the \`items' style. In
1947 + particular, this theme uses _two_ lines instead of one with the plain
1948 + \`grml' theme. The rest behaves exactly the same. Here are the defaults
1949 + for \`grml-large':
1950 +
1951 + - left: rc jobs history shell-level change-root time date newline user
1952 + at host path vcs percent
1953 + - right: sad-smiley
1954 + __EOF0__
1955 + }
1956 +
1957 + function grml_prompt_setup () {
1958 + emulate -L zsh
1959 + autoload -Uz vcs_info
1960 + add-zsh-hook precmd prompt_$1_precmd
1961 + }
1962 +
1963 + function prompt_grml_setup () {
1964 + grml_prompt_setup grml
1965 + }
1966 +
1967 + function prompt_grml-chroot_setup () {
1968 + grml_prompt_setup grml-chroot
1969 + }
1970 +
1971 + function prompt_grml-large_setup () {
1972 + grml_prompt_setup grml-large
1973 + }
1974 +
1975 + # These maps define default tokens and pre-/post-decoration for items to be
1976 + # used within the themes. All defaults may be customised in a context sensitive
1977 + # matter by using zsh's `zstyle' mechanism.
1978 + typeset -gA grml_prompt_pre_default \
1979 + grml_prompt_post_default \
1980 + grml_prompt_token_default \
1981 + grml_prompt_token_function
1982 +
1983 + grml_prompt_pre_default=(
1984 + at ''
1985 + battery ' '
1986 + change-root ''
1987 + date '%F{blue}'
1988 + grml-chroot '%F{red}'
1989 + history '%F{green}'
1990 + host ''
1991 + jobs '%F{cyan}'
1992 + newline ''
1993 + path '%B'
1994 + percent ''
1995 + rc '%B%F{red}'
1996 + rc-always ''
1997 + sad-smiley ''
1998 + shell-level '%F{red}'
1999 + time '%F{blue}'
2000 + user '%B%F{blue}'
2001 + vcs ''
2002 + )
2003 +
2004 + grml_prompt_post_default=(
2005 + at ''
2006 + battery ''
2007 + change-root ''
2008 + date '%f'
2009 + grml-chroot '%f '
2010 + history '%f'
2011 + host ''
2012 + jobs '%f'
2013 + newline ''
2014 + path '%b'
2015 + percent ''
2016 + rc '%f%b'
2017 + rc-always ''
2018 + sad-smiley ''
2019 + shell-level '%f'
2020 + time '%f'
2021 + user '%f%b'
2022 + vcs ''
2023 + )
2024 +
2025 + grml_prompt_token_default=(
2026 + at '@'
2027 + battery 'GRML_BATTERY_LEVEL'
2028 + change-root 'debian_chroot'
2029 + date '%D{%Y-%m-%d}'
2030 + grml-chroot 'GRML_CHROOT'
2031 + history '{history#%!} '
2032 + host '%m '
2033 + jobs '[%j running job(s)] '
2034 + newline $'\n'
2035 + path '%40<..<%~%<< '
2036 + percent '%# '
2037 + rc '%(?..%? )'
2038 + rc-always '%?'
2039 + sad-smiley '%(?..:()'
2040 + shell-level '%(3L.+ .)'
2041 + time '%D{%H:%M:%S} '
2042 + user '%n'
2043 + vcs '0'
2044 + )
2045 +
2046 + function grml_theme_has_token () {
2047 + if (( ARGC != 1 )); then
2048 + printf 'usage: grml_theme_has_token <name>\n'
2049 + return 1
2050 + fi
2051 + (( ${+grml_prompt_token_default[$1]} ))
2052 + }
2053 +
2054 + function GRML_theme_add_token_usage () {
2055 + <<__EOF0__
2056 + Usage: grml_theme_add_token <name> [-f|-i] <token/function> [<pre> <post>]
2057 +
2058 + <name> is the name for the newly added token. If the \`-f' or \`-i' options
2059 + are used, <token/function> is the name of the function (see below for
2060 + details). Otherwise it is the literal token string to be used. <pre> and
2061 + <post> are optional.
2062 +
2063 + Options:
2064 +
2065 + -f <function> Use a function named \`<function>' each time the token
2066 + is to be expanded.
2067 +
2068 + -i <function> Use a function named \`<function>' to initialise the
2069 + value of the token _once_ at runtime.
2070 +
2071 + The functions are called with one argument: the token's new name. The
2072 + return value is expected in the \$REPLY parameter. The use of these
2073 + options is mutually exclusive.
2074 +
2075 + There is a utility function \`grml_theme_has_token', which you can use
2076 + to test if a token exists before trying to add it. This can be a guard
2077 + for situations in which a \`grml_theme_add_token' call may happen more
2078 + than once.
2079 +
2080 + Example:
2081 +
2082 + To add a new token \`day' that expands to the current weekday in the
2083 + current locale in green foreground colour, use this:
2084 +
2085 + grml_theme_add_token day '%D{%A}' '%F{green}' '%f'
2086 +
2087 + Another example would be support for \$VIRTUAL_ENV:
2088 +
2089 + function virtual_env_prompt () {
2090 + REPLY=\${VIRTUAL_ENV+\${VIRTUAL_ENV:t} }
2091 + }
2092 + grml_theme_add_token virtual-env -f virtual_env_prompt
2093 +
2094 + After that, you will be able to use a changed \`items' style to
2095 + assemble your prompt.
2096 + __EOF0__
2097 + }
2098 +
2099 + function grml_theme_add_token () {
2100 + emulate -L zsh
2101 + local name token pre post
2102 + local -i init funcall
2103 +
2104 + if (( ARGC == 0 )); then
2105 + GRML_theme_add_token_usage
2106 + return 0
2107 + fi
2108 +
2109 + init=0
2110 + funcall=0
2111 + pre=''
2112 + post=''
2113 + name=$1
2114 + shift
2115 + if [[ $1 == '-f' ]]; then
2116 + funcall=1
2117 + shift
2118 + elif [[ $1 == '-i' ]]; then
2119 + init=1
2120 + shift
2121 + fi
2122 +
2123 + if (( ARGC == 0 )); then
2124 + printf '
2125 + grml_theme_add_token: No token-string/function-name provided!\n\n'
2126 + GRML_theme_add_token_usage
2127 + return 1
2128 + fi
2129 + token=$1
2130 + shift
2131 + if (( ARGC != 0 && ARGC != 2 )); then
2132 + printf '
2133 + grml_theme_add_token: <pre> and <post> need to by specified _both_!\n\n'
2134 + GRML_theme_add_token_usage
2135 + return 1
2136 + fi
2137 + if (( ARGC )); then
2138 + pre=$1
2139 + post=$2
2140 + shift 2
2141 + fi
2142 +
2143 + if grml_theme_has_token $name; then
2144 + printf '
2145 + grml_theme_add_token: Token `%s'\'' exists! Giving up!\n\n' $name
2146 + GRML_theme_add_token_usage
2147 + return 2
2148 + fi
2149 + if (( init )); then
2150 + REPLY=''
2151 + $token $name
2152 + token=$REPLY
2153 + fi
2154 + grml_prompt_pre_default[$name]=$pre
2155 + grml_prompt_post_default[$name]=$post
2156 + if (( funcall )); then
2157 + grml_prompt_token_function[$name]=$token
2158 + grml_prompt_token_default[$name]=23
2159 + else
2160 + grml_prompt_token_default[$name]=$token
2161 + fi
2162 + }
2163 +
2164 + function grml_wrap_reply () {
2165 + emulate -L zsh
2166 + local target="$1"
2167 + local new="$2"
2168 + local left="$3"
2169 + local right="$4"
2170 +
2171 + if (( ${+parameters[$new]} )); then
2172 + REPLY="${left}${(P)new}${right}"
2173 + else
2174 + REPLY=''
2175 + fi
2176 + }
2177 +
2178 + function grml_prompt_addto () {
2179 + emulate -L zsh
2180 + local target="$1"
2181 + local lr it apre apost new v REPLY
2182 + local -a items
2183 + shift
2184 +
2185 + [[ $target == PS1 ]] && lr=left || lr=right
2186 + zstyle -a ":prompt:${grmltheme}:${lr}:setup" items items || items=( "$@" )
2187 + typeset -g "${target}="
2188 + for it in "${items[@]}"; do
2189 + zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" pre apre \
2190 + || apre=${grml_prompt_pre_default[$it]}
2191 + zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" post apost \
2192 + || apost=${grml_prompt_post_default[$it]}
2193 + zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" token new \
2194 + || new=${grml_prompt_token_default[$it]}
2195 + if (( ${+grml_prompt_token_function[$it]} )); then
2196 + REPLY=''
2197 + ${grml_prompt_token_function[$it]} $it
2198 + else
2199 + case $it in
2200 + battery)
2201 + grml_wrap_reply $target $new '' ''
2202 + ;;
2203 + change-root)
2204 + grml_wrap_reply $target $new '(' ')'
2205 + ;;
2206 + grml-chroot)
2207 + if [[ -n ${(P)new} ]]; then
2208 + REPLY="$CHROOT"
2209 + else
2210 + REPLY=''
2211 + fi
2212 + ;;
2213 + vcs)
2214 + v="vcs_info_msg_${new}_"
2215 + if (( ! vcscalled )); then
2216 + vcs_info
2217 + vcscalled=1
2218 + fi
2219 + if (( ${+parameters[$v]} )) && [[ -n "${(P)v}" ]]; then
2220 + REPLY="${(P)v}"
2221 + else
2222 + REPLY=''
2223 + fi
2224 + ;;
2225 + *) REPLY="$new" ;;
2226 + esac
2227 + fi
2228 + # Strip volatile characters per item. This is off by default. See the
2229 + # global stripping code a few lines below for details.
2230 + if [[ -o prompt_subst ]] && zstyle -t ":prompt:${grmltheme}:${lr}:items:$it" \
2231 + strip-sensitive-characters
2232 + then
2233 + REPLY="${REPLY//[$\`]/}"
2234 + fi
2235 + typeset -g "${target}=${(P)target}${apre}${REPLY}${apost}"
2236 + done
2237 +
2238 + # Per default, strip volatile characters (in the prompt_subst case)
2239 + # globally. If the option is off, the style has no effect. For more
2240 + # control, this can be turned off and stripping can be configured on a
2241 + # per-item basis (see above).
2242 + if [[ -o prompt_subst ]] && zstyle -T ":prompt:${grmltheme}:${lr}:setup" \
2243 + strip-sensitive-characters
2244 + then
2245 + typeset -g "${target}=${${(P)target}//[$\`]/}"
2246 + fi
2247 + }
2248 +
2249 + function prompt_grml_precmd () {
2250 + emulate -L zsh
2251 + local grmltheme=grml
2252 + local -a left_items right_items
2253 + left_items=(rc change-root user at host path vcs percent)
2254 + right_items=(sad-smiley)
2255 +
2256 + prompt_grml_precmd_worker
2257 + }
2258 +
2259 + function prompt_grml-chroot_precmd () {
2260 + emulate -L zsh
2261 + local grmltheme=grml-chroot
2262 + local -a left_items right_items
2263 + left_items=(grml-chroot user at host path percent)
2264 + right_items=()
2265 +
2266 + prompt_grml_precmd_worker
2267 + }
2268 +
2269 + function prompt_grml-large_precmd () {
2270 + emulate -L zsh
2271 + local grmltheme=grml-large
2272 + local -a left_items right_items
2273 + left_items=(rc jobs history shell-level change-root time date newline
2274 + user at host path vcs percent)
2275 + right_items=(sad-smiley)
2276 +
2277 + prompt_grml_precmd_worker
2278 + }
2279 +
2280 + function prompt_grml_precmd_worker () {
2281 + emulate -L zsh
2282 + local -i vcscalled=0
2283 +
2284 + grml_prompt_addto PS1 "${left_items[@]}"
2285 + if zstyle -T ":prompt:${grmltheme}:right:setup" use-rprompt; then
2286 + grml_prompt_addto RPS1 "${right_items[@]}"
2287 + fi
2288 + }
2289 +
2290 + function grml_prompt_fallback () {
2291 + setopt prompt_subst
2292 + local p0 p1
2293 +
2294 + p0="${RED}%(?..%? )${WHITE}${debian_chroot:+($debian_chroot)}"
2295 + p1="${BLUE}%n${NO_COLOR}@%m %40<...<%B%~%b%<< "'${vcs_info_msg_0_}'"%# "
2296 + if (( EUID == 0 )); then
2297 + PROMPT="${BLUE}${p0}${RED}${p1}"
2298 + else
2299 + PROMPT="${RED}${p0}${BLUE}${p1}"
2300 + fi
2301 + }
2302 +
2303 + if zrcautoload promptinit && promptinit 2>/dev/null ; then
2304 + grml_status_feature promptinit 0
2305 + # Since we define the required functions in here and not in files in
2306 + # $fpath, we need to stick the theme's name into `$prompt_themes'
2307 + # ourselves, since promptinit does not pick them up otherwise.
2308 + prompt_themes+=( grml grml-chroot grml-large )
2309 + # Also, keep the array sorted...
2310 + prompt_themes=( "${(@on)prompt_themes}" )
2311 + else
2312 + grml_status_feature promptinit 1
2313 + grml_prompt_fallback
2314 + function precmd () { (( ${+functions[vcs_info]} )) && vcs_info; }
2315 + fi
2316 +
2317 + if [[ $GRML_DISPLAY_BATTERY -gt 0 ]]; then
2318 + zstyle ':prompt:grml:right:setup' items sad-smiley battery
2319 + add-zsh-hook precmd battery
2320 + fi
2321 + if [[ "$TERM" == dumb ]] ; then
2322 + zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" pre ''
2323 + zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" post ' '
2324 + for i in rc user path jobs history date time shell-level; do
2325 + zstyle ":prompt:grml(|-large|-chroot):*:items:$i" pre ''
2326 + zstyle ":prompt:grml(|-large|-chroot):*:items:$i" post ''
2327 + done
2328 + unset i
2329 + zstyle ':prompt:grml(|-large|-chroot):right:setup' use-rprompt false
2330 + elif (( EUID == 0 )); then
2331 + zstyle ':prompt:grml(|-large|-chroot):*:items:user' pre '%B%F{red}'
2332 + fi
2333 +
2334 + # Finally enable one of the prompts.
2335 + if [[ -n $GRML_CHROOT ]]; then
2336 + prompt grml-chroot
2337 + elif [[ $GRMLPROMPT -gt 0 ]]; then
2338 + prompt grml-large
2339 + else
2340 + prompt grml
2341 + fi
2342 +
2343 + # make sure to use right prompt only when not running a command
2344 + setopt transient_rprompt
2345 +
2346 + # Terminal-title wizardry
2347 +
2348 + function ESC_print () {
2349 + info_print $'\ek' $'\e\\' "$@"
2350 + }
2351 + function set_title () {
2352 + info_print $'\e]0;' $'\a' "$@"
2353 + }
2354 +
2355 + function info_print () {
2356 + local esc_begin esc_end
2357 + esc_begin="$1"
2358 + esc_end="$2"
2359 + shift 2
2360 + printf '%s' ${esc_begin}
2361 + printf '%s' "$*"
2362 + printf '%s' "${esc_end}"
2363 + }
2364 +
2365 + function grml_reset_screen_title () {
2366 + # adjust title of xterm
2367 + # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
2368 + [[ ${NOTITLE:-} -gt 0 ]] && return 0
2369 + case $TERM in
2370 + (xterm*|rxvt*|alacritty|foot)
2371 + set_title ${(%):-"%n@%m: %~"}
2372 + ;;
2373 + esac
2374 + }
2375 +
2376 + function grml_vcs_to_screen_title () {
2377 + if [[ $TERM == screen* ]] ; then
2378 + if [[ -n ${vcs_info_msg_1_} ]] ; then
2379 + ESC_print ${vcs_info_msg_1_}
2380 + else
2381 + ESC_print "zsh"
2382 + fi
2383 + fi
2384 + }
2385 +
2386 + function grml_cmd_to_screen_title () {
2387 + # get the name of the currently running program to set screen window title
2388 + # if running in a screen.
2389 + if [[ "$TERM" == screen* ]] ; then
2390 + local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}"
2391 + ESC_print ${CMD}
2392 + fi
2393 + }
2394 +
2395 + function grml_control_xterm_title () {
2396 + case $TERM in
2397 + (xterm*|rxvt*|alacritty|foot)
2398 + set_title "${(%):-"%n@%m:"}" "$2"
2399 + ;;
2400 + esac
2401 + }
2402 +
2403 + if [[ $NOPRECMD -eq 0 ]]; then
2404 + add-zsh-hook precmd grml_reset_screen_title
2405 + add-zsh-hook precmd grml_vcs_to_screen_title
2406 + add-zsh-hook preexec grml_cmd_to_screen_title
2407 + if [[ $NOTITLE -eq 0 ]]; then
2408 + add-zsh-hook preexec grml_control_xterm_title
2409 + fi
2410 + fi
2411 +
2412 + # 'hash' some often used directories
2413 + #d# start
2414 + hash -d deb=/var/cache/apt/archives
2415 + hash -d doc=/usr/share/doc
2416 + hash -d linux=/lib/modules/$(command uname -r)/build/
2417 + hash -d log=/var/log
2418 + hash -d slog=/var/log/syslog
2419 + hash -d src=/usr/src
2420 + hash -d www=/var/www
2421 + #d# end
2422 +
2423 + # some aliases
2424 + if check_com -c screen ; then
2425 + if [[ $UID -eq 0 ]] ; then
2426 + if [[ -r /etc/grml/screenrc ]]; then
2427 + alias screen='screen -c /etc/grml/screenrc'
2428 + fi
2429 + elif [[ ! -r $HOME/.screenrc ]] ; then
2430 + if [[ -r /etc/grml/screenrc_grml ]]; then
2431 + alias screen='screen -c /etc/grml/screenrc_grml'
2432 + else
2433 + if [[ -r /etc/grml/screenrc ]]; then
2434 + alias screen='screen -c /etc/grml/screenrc'
2435 + fi
2436 + fi
2437 + fi
2438 + fi
2439 +
2440 + # do we have GNU ls with color-support?
2441 + if [[ "$TERM" != dumb ]]; then
2442 + #a1# List files with colors (\kbd{ls \ldots})
2443 + alias ls="command ls ${ls_options:+${ls_options[*]}}"
2444 + #a1# List all files, with colors (\kbd{ls -la \ldots})
2445 + alias la="command ls -la ${ls_options:+${ls_options[*]}}"
2446 + #a1# List files with long colored list, without dotfiles (\kbd{ls -l \ldots})
2447 + alias ll="command ls -l ${ls_options:+${ls_options[*]}}"
2448 + #a1# List files with long colored list, human readable sizes (\kbd{ls -hAl \ldots})
2449 + alias lh="command ls -hAl ${ls_options:+${ls_options[*]}}"
2450 + #a1# List files with long colored list, append qualifier to filenames (\kbd{ls -l \ldots})\\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
2451 + alias l="command ls -l ${ls_options:+${ls_options[*]}}"
2452 + else
2453 + alias la='command ls -la'
2454 + alias ll='command ls -l'
2455 + alias lh='command ls -hAl'
2456 + alias l='command ls -l'
2457 + fi
2458 +
2459 + # use ip from iproute2 with color support
2460 + if ip -color=auto addr show dev lo >/dev/null 2>&1; then
2461 + alias ip='command ip -color=auto'
2462 + fi
2463 +
2464 + if [[ -r /proc/mdstat ]]; then
2465 + alias mdstat='cat /proc/mdstat'
2466 + fi
2467 +
2468 + alias ...='cd ../../'
2469 +
2470 + # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
2471 + if [[ -x /sbin/kexec ]] && [[ -r /proc/cmdline ]] ; then
2472 + alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
2473 + fi
2474 +
2475 + #f1# Hints for the use of zsh on grml
2476 + function zsh-help () {
2477 + print "$bg[white]$fg[black]
2478 + zsh-help - hints for use of zsh on grml
2479 + =======================================$reset_color"
2480 +
2481 + print '
2482 + Main configuration of zsh happens in /etc/zsh/zshrc.
2483 + That file is part of the package grml-etc-core, if you want to
2484 + use them on a non-grml-system just get the tar.gz from
2485 + http://deb.grml.org/ or (preferably) get it from the git repository:
2486 +
2487 + http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc
2488 +
2489 + This version of grml'\''s zsh setup does not use skel/.zshrc anymore.
2490 + The file is still there, but it is empty for backwards compatibility.
2491 +
2492 + For your own changes use these two files:
2493 + $HOME/.zshrc.pre
2494 + $HOME/.zshrc.local
2495 +
2496 + The former is sourced very early in our zshrc, the latter is sourced
2497 + very lately.
2498 +
2499 + System wide configuration without touching configuration files of grml
2500 + can take place in /etc/zsh/zshrc.local.
2501 +
2502 + For information regarding zsh start at http://grml.org/zsh/
2503 +
2504 + Take a look at grml'\''s zsh refcard:
2505 + % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
2506 +
2507 + Check out the main zsh refcard:
2508 + % '$BROWSER' http://www.bash2zsh.com/zsh_refcard/refcard.pdf
2509 +
2510 + And of course visit the zsh-lovers:
2511 + % man zsh-lovers
2512 +
2513 + You can adjust some options through environment variables when
2514 + invoking zsh without having to edit configuration files.
2515 + Basically meant for bash users who are not used to the power of
2516 + the zsh yet. :)
2517 +
2518 + "NOCOR=1 zsh" => deactivate automatic correction
2519 + "NOMENU=1 zsh" => do not use auto menu completion
2520 + (note: use ctrl-d for completion instead!)
2521 + "NOPRECMD=1 zsh" => disable the precmd + preexec commands (set GNU screen title)
2522 + "NOTITLE=1 zsh" => disable setting the title of xterms without disabling
2523 + preexec() and precmd() completely
2524 + "GRML_DISPLAY_BATTERY=1 zsh"
2525 + => activate battery status on right side of prompt (WIP)
2526 + "COMMAND_NOT_FOUND=1 zsh"
2527 + => Enable a handler if an external command was not found
2528 + The command called in the handler can be altered by setting
2529 + the GRML_ZSH_CNF_HANDLER variable, the default is:
2530 + "/usr/share/command-not-found/command-not-found"
2531 +
2532 + A value greater than 0 is enables a feature; a value equal to zero
2533 + disables it. If you like one or the other of these settings, you can
2534 + add them to ~/.zshrc.pre to ensure they are set when sourcing grml'\''s
2535 + zshrc.'
2536 +
2537 + print "
2538 + $bg[white]$fg[black]
2539 + Please report wishes + bugs to the grml-team: http://grml.org/bugs/
2540 + Enjoy your grml system with the zsh!$reset_color"
2541 + }
2542 +
2543 + # debian stuff
2544 + if [[ -r /etc/debian_version ]] ; then
2545 + if [[ -z "$GRML_NO_APT_ALIASES" ]]; then
2546 + #a3# Execute \kbd{apt-cache policy}
2547 + alias acp='apt-cache policy'
2548 + if check_com -c apt ; then
2549 + #a3# Execute \kbd{apt search}
2550 + alias acs='apt search'
2551 + #a3# Execute \kbd{apt show}
2552 + alias acsh='apt show'
2553 + #a3# Execute \kbd{apt dist-upgrade}
2554 + salias adg="apt dist-upgrade"
2555 + #a3# Execute \kbd{apt upgrade}
2556 + salias ag="apt upgrade"
2557 + #a3# Execute \kbd{apt install}
2558 + salias agi="apt install"
2559 + #a3# Execute \kbd{apt update}
2560 + salias au="apt update"
2561 + else
2562 + alias acs='apt-cache search'
2563 + alias acsh='apt-cache show'
2564 + salias adg="apt-get dist-upgrade"
2565 + salias ag="apt-get upgrade"
2566 + salias agi="apt-get install"
2567 + salias au="apt-get update"
2568 + fi
2569 + if check_com -c aptitude ; then
2570 + #a3# Execute \kbd{aptitude install}
2571 + salias ati="aptitude install"
2572 + #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
2573 + salias -a up="aptitude update ; aptitude safe-upgrade"
2574 + fi
2575 + if check_com -c dpkg-buildpackage ; then
2576 + #a3# Execute \kbd{dpkg-buildpackage}
2577 + alias dbp='dpkg-buildpackage'
2578 + fi
2579 + if check_com -c grep-excuses ; then
2580 + #a3# Execute \kbd{grep-excuses}
2581 + alias ge='grep-excuses'
2582 + fi
2583 + if check_com -c apt-file ; then
2584 + alias afs='apt-file search'
2585 + alias afl='apt-file list'
2586 + fi
2587 + fi
2588 +
2589 + # get a root shell as normal user in live-cd mode:
2590 + if isgrmlcd && [[ $UID -ne 0 ]] ; then
2591 + alias su="sudo su"
2592 + fi
2593 +
2594 + fi
2595 +
2596 + # use /var/log/syslog iff present, fallback to journalctl otherwise
2597 + if [ -e /var/log/syslog ] ; then
2598 + #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog || journalctl}
2599 + salias llog="$PAGER /var/log/syslog" # take a look at the syslog
2600 + #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog || journalctl}
2601 + salias tlog="tail --follow=name /var/log/syslog" # follow the syslog
2602 + elif check_com -c journalctl ; then
2603 + salias llog="journalctl"
2604 + salias tlog="journalctl -f"
2605 + fi
2606 +
2607 + # sort installed Debian-packages by size
2608 + if check_com -c dpkg-query ; then
2609 + #a3# List installed Debian-packages sorted by size
2610 + alias debs-by-size="dpkg-query -Wf 'x \${Installed-Size} \${Package} \${Status}\n' | sed -ne '/^x /d' -e '/^x \(.*\) install ok installed$/s//\1/p' | sort -nr"
2611 + fi
2612 +
2613 + if isgrmlcd; then
2614 + # No core dumps: important for a live-cd-system
2615 + limit -s core 0
2616 + fi
2617 +
2618 + # grmlstuff
2619 + function grmlstuff () {
2620 + if [ -r /etc/grml_version ]; then
2621 + #a1# Output version of running grml
2622 + alias grml-version='cat /etc/grml_version'
2623 + fi
2624 +
2625 + if check_com -c grml-debootstrap ; then
2626 + function debian2hd () {
2627 + echo "Installing debian to harddisk is possible by using grml-debootstrap."
2628 + return 1
2629 + }
2630 + fi
2631 +
2632 + if check_com -c tmate && check_com -c qrencode ; then
2633 + function grml-remote-support() {
2634 + tmate -L grml-remote-support new -s grml-remote-support -d
2635 + tmate -L grml-remote-support wait tmate-ready
2636 + tmate -L grml-remote-support display -p '#{tmate_ssh}' | qrencode -t ANSI
2637 + echo "tmate session: $(tmate -L grml-remote-support display -p '#{tmate_ssh}')"
2638 + echo
2639 + echo "Scan this QR code and send it to your support team."
2640 + }
2641 + fi
2642 + }
2643 +
2644 + # now run the functions
2645 + isgrml && grmlstuff
2646 + grmlcomp
2647 +
2648 + # keephack
2649 + xsource "/etc/zsh/keephack"
2650 +
2651 + # wonderful idea of using "e" glob qualifier by Peter Stephenson
2652 + # You use it as follows:
2653 + # $ NTREF=/reference/file
2654 + # $ ls -l *(e:nt:)
2655 + # This lists all the files in the current directory newer than the reference file.
2656 + # You can also specify the reference file inline; note quotes:
2657 + # $ ls -l *(e:'nt ~/.zshenv':)
2658 + function nt () {
2659 + if [[ -n $1 ]] ; then
2660 + local NTREF=${~1}
2661 + fi
2662 + [[ $REPLY -nt $NTREF ]]
2663 + }
2664 +
2665 + # shell functions
2666 +
2667 + #f1# Reload an autoloadable function
2668 + function freload () { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
2669 + compdef _functions freload
2670 +
2671 + #
2672 + # Usage:
2673 + #
2674 + # e.g.: a -> b -> c -> d ....
2675 + #
2676 + # sll a
2677 + #
2678 + #
2679 + # if parameter is given with leading '=', lookup $PATH for parameter and resolve that
2680 + #
2681 + # sll =java
2682 + #
2683 + # Note: limit for recursive symlinks on linux:
2684 + # http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/fs/namei.c?id=refs/heads/master#l808
2685 + # This limits recursive symlink follows to 8,
2686 + # while limiting consecutive symlinks to 40.
2687 + #
2688 + # When resolving and displaying information about symlinks, no check is made
2689 + # that the displayed information does make any sense on your OS.
2690 + # We leave that decission to the user.
2691 + #
2692 + # The zstat module is used to detect symlink loops.
2693 + # When a symlink loop is detected, a warning ist printed and further processing is stopped.
2694 + #
2695 + # Module zstat is loaded by default in grml zshrc, no extra action needed for that.
2696 + #
2697 + # Known bugs:
2698 + # If you happen to come across a symlink that points to a destination on another partition
2699 + # with the same inode number, that will be marked as symlink loop though it is not.
2700 + # Two hints for this situation:
2701 + # I) Play lottery the same day, as you seem to be rather lucky right now.
2702 + # II) Send patches.
2703 + #
2704 + # return status:
2705 + # 0 upon success
2706 + # 1 file/dir not accesible
2707 + # 2 symlink loop detected
2708 + #
2709 + #f1# List symlinks in detail (more detailed version of 'readlink -f', 'whence -s' and 'namei -l')
2710 + function sll () {
2711 + if [[ -z ${1} ]] ; then
2712 + printf 'Usage: %s <symlink(s)>\n' "${0}"
2713 + return 1
2714 + fi
2715 +
2716 + local file jumpd curdir
2717 + local -i 10 RTN LINODE i
2718 + local -a SEENINODES
2719 + curdir="${PWD}"
2720 + RTN=0
2721 +
2722 + for file in "${@}" ; do
2723 + SEENINODES=()
2724 + ls -l "${file:a}" || RTN=1
2725 +
2726 + while [[ -h "$file" ]] ; do
2727 + LINODE=$(zstat -L +inode "${file}")
2728 + for i in ${SEENINODES} ; do
2729 + if (( ${i} == ${LINODE} )) ; then
2730 + builtin cd -q "${curdir}"
2731 + print 'link loop detected, aborting!'
2732 + return 2
2733 + fi
2734 + done
2735 + SEENINODES+=${LINODE}
2736 +
2737 + jumpd="${file:h}"
2738 + file="${file:t}"
2739 +
2740 + if [[ -d ${jumpd} ]] ; then
2741 + builtin cd -q "${jumpd}" || RTN=1
2742 + fi
2743 + file=$(readlink "$file")
2744 +
2745 + jumpd="${file:h}"
2746 + file="${file:t}"
2747 +
2748 + if [[ -d ${jumpd} ]] ; then
2749 + builtin cd -q "${jumpd}" || RTN=1
2750 + fi
2751 +
2752 + ls -l "${PWD}/${file}" || RTN=1
2753 + done
2754 + shift 1
2755 + if (( ${#} >= 1 )) ; then
2756 + print ""
2757 + fi
2758 + builtin cd -q "${curdir}"
2759 + done
2760 + return ${RTN}
2761 + }
2762 +
2763 + if check_com -c $PAGER ; then
2764 + #f3# View Debian's changelog of given package(s)
2765 + function dchange () {
2766 + emulate -L zsh
2767 + [[ -z "$1" ]] && printf 'Usage: %s <package_name(s)>\n' "$0" && return 1
2768 +
2769 + local package
2770 +
2771 + # `less` as $PAGER without e.g. `|lesspipe %s` inside $LESSOPEN can't properly
2772 + # read *.gz files, try to detect this to use vi instead iff available
2773 + local viewer
2774 +
2775 + if [[ ${$(typeset -p PAGER)[2]} = -a ]] ; then
2776 + viewer=($PAGER) # support PAGER=(less -Mr) but leave array untouched
2777 + else
2778 + viewer=(${=PAGER}) # support PAGER='less -Mr'
2779 + fi
2780 +
2781 + if [[ ${viewer[1]:t} = less ]] && [[ -z "${LESSOPEN}" ]] && check_com vi ; then
2782 + viewer='vi'
2783 + fi
2784 +
2785 + for package in "$@" ; do
2786 + if [[ -r /usr/share/doc/${package}/changelog.Debian.gz ]] ; then
2787 + $viewer /usr/share/doc/${package}/changelog.Debian.gz
2788 + elif [[ -r /usr/share/doc/${package}/changelog.gz ]] ; then
2789 + $viewer /usr/share/doc/${package}/changelog.gz
2790 + elif [[ -r /usr/share/doc/${package}/changelog ]] ; then
2791 + $viewer /usr/share/doc/${package}/changelog
2792 + else
2793 + if check_com -c aptitude ; then
2794 + echo "No changelog for package $package found, using aptitude to retrieve it."
2795 + aptitude changelog "$package"
2796 + elif check_com -c apt-get ; then
2797 + echo "No changelog for package $package found, using apt-get to retrieve it."
2798 + apt-get changelog "$package"
2799 + else
2800 + echo "No changelog for package $package found, sorry."
2801 + fi
2802 + fi
2803 + done
2804 + }
2805 + function _dchange () { _files -W /usr/share/doc -/ }
2806 + compdef _dchange dchange
2807 +
2808 + #f3# View Debian's NEWS of a given package
2809 + function dnews () {
2810 + emulate -L zsh
2811 + if [[ -r /usr/share/doc/$1/NEWS.Debian.gz ]] ; then
2812 + $PAGER /usr/share/doc/$1/NEWS.Debian.gz
2813 + else
2814 + if [[ -r /usr/share/doc/$1/NEWS.gz ]] ; then
2815 + $PAGER /usr/share/doc/$1/NEWS.gz
2816 + else
2817 + echo "No NEWS file for package $1 found, sorry."
2818 + return 1
2819 + fi
2820 + fi
2821 + }
2822 + function _dnews () { _files -W /usr/share/doc -/ }
2823 + compdef _dnews dnews
2824 +
2825 + #f3# View Debian's copyright of a given package
2826 + function dcopyright () {
2827 + emulate -L zsh
2828 + if [[ -r /usr/share/doc/$1/copyright ]] ; then
2829 + $PAGER /usr/share/doc/$1/copyright
2830 + else
2831 + echo "No copyright file for package $1 found, sorry."
2832 + return 1
2833 + fi
2834 + }
2835 + function _dcopyright () { _files -W /usr/share/doc -/ }
2836 + compdef _dcopyright dcopyright
2837 +
2838 + #f3# View upstream's changelog of a given package
2839 + function uchange () {
2840 + emulate -L zsh
2841 + if [[ -r /usr/share/doc/$1/changelog.gz ]] ; then
2842 + $PAGER /usr/share/doc/$1/changelog.gz
2843 + else
2844 + echo "No changelog for package $1 found, sorry."
2845 + return 1
2846 + fi
2847 + }
2848 + function _uchange () { _files -W /usr/share/doc -/ }
2849 + compdef _uchange uchange
2850 + fi
2851 +
2852 + # zsh profiling
2853 + function profile () {
2854 + ZSH_PROFILE_RC=1 zsh "$@"
2855 + }
2856 +
2857 + #f1# Edit an alias via zle
2858 + function edalias () {
2859 + [[ -z "$1" ]] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
2860 + }
2861 + compdef _aliases edalias
2862 +
2863 + #f1# Edit a function via zle
2864 + function edfunc () {
2865 + [[ -z "$1" ]] && { echo "Usage: edfunc <function_to_edit>" ; return 1 } || zed -f "$1" ;
2866 + }
2867 + compdef _functions edfunc
2868 +
2869 + # use it e.g. via 'Restart apache2'
2870 + #m# f6 Start() \kbd{service \em{process}}\quad\kbd{start}
2871 + #m# f6 Restart() \kbd{service \em{process}}\quad\kbd{restart}
2872 + #m# f6 Stop() \kbd{service \em{process}}\quad\kbd{stop}
2873 + #m# f6 Reload() \kbd{service \em{process}}\quad\kbd{reload}
2874 + #m# f6 Force-Reload() \kbd{service \em{process}}\quad\kbd{force-reload}
2875 + #m# f6 Status() \kbd{service \em{process}}\quad\kbd{status}
2876 + if [[ -d /etc/init.d ]] ; then
2877 + function __start_stop () {
2878 + local action_="${1:l}" # e.g Start/Stop/Restart
2879 + local service_="$2"
2880 + local param_="$3"
2881 +
2882 + if check_com -c service ; then
2883 + $SUDO service "$service_" "${action_}" "$param_"
2884 + else
2885 + $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
2886 + fi
2887 + }
2888 +
2889 + function _grmlinitd () {
2890 + local -a scripts
2891 + scripts=( /etc/init.d/*(x:t) )
2892 + _describe "service startup script" scripts
2893 + }
2894 +
2895 + for i in Start Restart Stop Force-Reload Reload Status ; do
2896 + eval "function $i () { __start_stop $i \"\$1\" \"\$2\" ; }"
2897 + compdef _grmlinitd $i
2898 + done
2899 + builtin unset -v i
2900 + fi
2901 +
2902 + #f1# Provides useful information on globbing
2903 + function H-Glob () {
2904 + echo -e "
2905 + / directories
2906 + . plain files
2907 + @ symbolic links
2908 + = sockets
2909 + p named pipes (FIFOs)
2910 + * executable plain files (0100)
2911 + % device files (character or block special)
2912 + %b block special files
2913 + %c character special files
2914 + r owner-readable files (0400)
2915 + w owner-writable files (0200)
2916 + x owner-executable files (0100)
2917 + A group-readable files (0040)
2918 + I group-writable files (0020)
2919 + E group-executable files (0010)
2920 + R world-readable files (0004)
2921 + W world-writable files (0002)
2922 + X world-executable files (0001)
2923 + s setuid files (04000)
2924 + S setgid files (02000)
2925 + t files with the sticky bit (01000)
2926 +
2927 + print *(m-1) # Files modified up to a day ago
2928 + print *(a1) # Files accessed a day ago
2929 + print *(@) # Just symlinks
2930 + print *(Lk+50) # Files bigger than 50 kilobytes
2931 + print *(Lk-50) # Files smaller than 50 kilobytes
2932 + print **/*.c # All *.c files recursively starting in \$PWD
2933 + print **/*.c~file.c # Same as above, but excluding 'file.c'
2934 + print (foo|bar).* # Files starting with 'foo' or 'bar'
2935 + print *~*.* # All Files that do not contain a dot
2936 + chmod 644 *(.^x) # make all plain non-executable files publically readable
2937 + print -l *(.c|.h) # Lists *.c and *.h
2938 + print **/*(g:users:) # Recursively match all files that are owned by group 'users'
2939 + echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print \$1}'<"
2940 + }
2941 + alias help-zshglob=H-Glob
2942 +
2943 + # grep for running process, like: 'any vim'
2944 + function any () {
2945 + emulate -L zsh
2946 + unsetopt KSH_ARRAYS
2947 + if [[ -z "$1" ]] ; then
2948 + echo "any - grep for process(es) by keyword" >&2
2949 + echo "Usage: any <keyword>" >&2 ; return 1
2950 + else
2951 + ps xauwww | grep -i "${grep_options[@]}" "[${1[1]}]${1[2,-1]}"
2952 + fi
2953 + }
2954 +
2955 +
2956 + # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
2957 + # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
2958 + [[ -r /proc/1/maps ]] && \
2959 + function deswap () {
2960 + print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
2961 + cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
2962 + print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
2963 + }
2964 +
2965 + # a wrapper for vim, that deals with title setting
2966 + # VIM_OPTIONS
2967 + # set this array to a set of options to vim you always want
2968 + # to have set when calling vim (in .zshrc.local), like:
2969 + # VIM_OPTIONS=( -p )
2970 + # This will cause vim to send every file given on the
2971 + # commandline to be send to it's own tab (needs vim7).
2972 + if check_com vim; then
2973 + function vim () {
2974 + VIM_PLEASE_SET_TITLE='yes' command vim ${VIM_OPTIONS} "$@"
2975 + }
2976 + fi
2977 +
2978 + ssl_hashes=( sha512 sha256 sha1 md5 )
2979 +
2980 + for sh in ${ssl_hashes}; do
2981 + eval 'ssl-cert-'${sh}'() {
2982 + emulate -L zsh
2983 + if [[ -z $1 ]] ; then
2984 + printf '\''usage: %s <file>\n'\'' "ssh-cert-'${sh}'"
2985 + return 1
2986 + fi
2987 + openssl x509 -noout -fingerprint -'${sh}' -in $1
2988 + }'
2989 + done; unset sh
2990 +
2991 + function ssl-cert-fingerprints () {
2992 + emulate -L zsh
2993 + local i
2994 + if [[ -z $1 ]] ; then
2995 + printf 'usage: ssl-cert-fingerprints <file>\n'
2996 + return 1
2997 + fi
2998 + for i in ${ssl_hashes}
2999 + do ssl-cert-$i $1;
3000 + done
3001 + }
3002 +
3003 + function ssl-cert-info () {
3004 + emulate -L zsh
3005 + if [[ -z $1 ]] ; then
3006 + printf 'usage: ssl-cert-info <file>\n'
3007 + return 1
3008 + fi
3009 + openssl x509 -noout -text -in $1
3010 + ssl-cert-fingerprints $1
3011 + }
3012 +
3013 + # make sure our environment is clean regarding colors
3014 + builtin unset -v BLUE RED GREEN CYAN YELLOW MAGENTA WHITE NO_COLOR
3015 +
3016 + # "persistent history"
3017 + # just write important commands you always need to $GRML_IMPORTANT_COMMANDS
3018 + # defaults for backward compatibility to ~/.important_commands
3019 + if [[ -r ~/.important_commands ]] ; then
3020 + GRML_IMPORTANT_COMMANDS=~/.important_commands
3021 + else
3022 + GRML_IMPORTANT_COMMANDS=${GRML_IMPORTANT_COMMANDS:-${ZDOTDIR:-${HOME}}/.important_commands}
3023 + fi
3024 + [[ -r ${GRML_IMPORTANT_COMMANDS} ]] && builtin fc -R ${GRML_IMPORTANT_COMMANDS}
3025 +
3026 + # load the lookup subsystem if it's available on the system
3027 + zrcautoload lookupinit && lookupinit
3028 +
3029 + # variables
3030 +
3031 + # set terminal property (used e.g. by msgid-chooser)
3032 + case "${COLORTERM}" in
3033 + truecolor)
3034 + # do not overwrite
3035 + ;;
3036 + *)
3037 + export COLORTERM="yes"
3038 + ;;
3039 + esac
3040 +
3041 + # aliases
3042 +
3043 + # general
3044 + #a2# Execute \kbd{du -sch}
3045 + [[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias da='du -sch'
3046 +
3047 + # listing stuff
3048 + #a2# Execute \kbd{ls -lSrah}
3049 + alias dir="command ls -lSrah"
3050 + #a2# Only show dot-directories
3051 + alias lad='command ls -d .*(/)'
3052 + #a2# Only show dot-files
3053 + alias lsa='command ls -a .*(.)'
3054 + #a2# Only files with setgid/setuid/sticky flag
3055 + alias lss='command ls -l *(s,S,t)'
3056 + #a2# Only show symlinks
3057 + alias lsl='command ls -l *(@)'
3058 + #a2# Display only executables
3059 + alias lsx='command ls -l *(*)'
3060 + #a2# Display world-{readable,writable,executable} files
3061 + alias lsw='command ls -ld *(R,W,X.^ND/)'
3062 + #a2# Display the ten biggest files
3063 + alias lsbig="command ls -flh *(.OL[1,10])"
3064 + #a2# Only show directories
3065 + alias lsd='command ls -d *(/)'
3066 + #a2# Only show empty directories
3067 + alias lse='command ls -d *(/^F)'
3068 + #a2# Display the ten newest files
3069 + alias lsnew="command ls -rtlh *(D.om[1,10])"
3070 + #a2# Display the ten oldest files
3071 + alias lsold="command ls -rtlh *(D.Om[1,10])"
3072 + #a2# Display the ten smallest files
3073 + alias lssmall="command ls -Srl *(.oL[1,10])"
3074 + #a2# Display the ten newest directories and ten newest .directories
3075 + alias lsnewdir="command ls -rthdl *(/om[1,10]) .*(D/om[1,10])"
3076 + #a2# Display the ten oldest directories and ten oldest .directories
3077 + alias lsolddir="command ls -rthdl *(/Om[1,10]) .*(D/Om[1,10])"
3078 +
3079 + # some useful aliases
3080 + #a2# Remove current empty directory. Execute \kbd{cd ..; rmdir \$OLDCWD}
3081 + alias rmcdir='cd ..; rmdir $OLDPWD || cd $OLDPWD'
3082 +
3083 + #a2# ssh with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
3084 + alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3085 + #a2# scp with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
3086 + alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3087 +
3088 + #a2# lsblk (list block devices) with the most useful columns
3089 + alias llblk="lsblk -o +LABEL,PARTLABEL,UUID,FSTYPE,SERIAL"
3090 +
3091 + # useful functions
3092 +
3093 + #f5# Backup \kbd{file_or_folder {\rm to} file_or_folder\_timestamp}
3094 + function bk () {
3095 + emulate -L zsh
3096 + local current_date=$(date -u "+%Y%m%dT%H%M%SZ")
3097 + local clean keep move verbose result all to_bk
3098 + setopt extended_glob
3099 + keep=1
3100 + while getopts ":hacmrv" opt; do
3101 + case $opt in
3102 + a) (( all++ ));;
3103 + c) unset move clean && (( ++keep ));;
3104 + m) unset keep clean && (( ++move ));;
3105 + r) unset move keep && (( ++clean ));;
3106 + v) verbose="-v";;
3107 + h) <<__EOF0__
3108 + bk [-hcmv] FILE [FILE ...]
3109 + bk -r [-av] [FILE [FILE ...]]
3110 + Backup a file or folder in place and append the timestamp
3111 + Remove backups of a file or folder, or all backups in the current directory
3112 +
3113 + Usage:
3114 + -h Display this help text
3115 + -c Keep the file/folder as is, create a copy backup using cp(1) (default)
3116 + -m Move the file/folder, using mv(1)
3117 + -r Remove backups of the specified file or directory, using rm(1). If none
3118 + is provided, remove all backups in the current directory.
3119 + -a Remove all (even hidden) backups.
3120 + -v Verbose
3121 +
3122 + The -c, -r and -m options are mutually exclusive. If specified at the same time,
3123 + the last one is used.
3124 +
3125 + The return code is the sum of all cp/mv/rm return codes.
3126 + __EOF0__
3127 + return 0;;
3128 + \?) bk -h >&2; return 1;;
3129 + esac
3130 + done
3131 + shift "$((OPTIND-1))"
3132 + if (( keep > 0 )); then
3133 + if islinux || isfreebsd; then
3134 + for to_bk in "$@"; do
3135 + cp $verbose -a "${to_bk%/}" "${to_bk%/}_$current_date"
3136 + (( result += $? ))
3137 + done
3138 + else
3139 + for to_bk in "$@"; do
3140 + cp $verbose -pR "${to_bk%/}" "${to_bk%/}_$current_date"
3141 + (( result += $? ))
3142 + done
3143 + fi
3144 + elif (( move > 0 )); then
3145 + while (( $# > 0 )); do
3146 + mv $verbose "${1%/}" "${1%/}_$current_date"
3147 + (( result += $? ))
3148 + shift
3149 + done
3150 + elif (( clean > 0 )); then
3151 + if (( $# > 0 )); then
3152 + for to_bk in "$@"; do
3153 + rm $verbose -rf "${to_bk%/}"_[0-9](#c8)T([0-1][0-9]|2[0-3])([0-5][0-9])(#c2)Z
3154 + (( result += $? ))
3155 + done
3156 + else
3157 + if (( all > 0 )); then
3158 + rm $verbose -rf *_[0-9](#c8)T([0-1][0-9]|2[0-3])([0-5][0-9])(#c2)Z(D)
3159 + else
3160 + rm $verbose -rf *_[0-9](#c8)T([0-1][0-9]|2[0-3])([0-5][0-9])(#c2)Z
3161 + fi
3162 + (( result += $? ))
3163 + fi
3164 + fi
3165 + return $result
3166 + }
3167 +
3168 + #f5# cd to directory and list files
3169 + function cl () {
3170 + emulate -L zsh
3171 + cd $1 && ls -a
3172 + }
3173 +
3174 + # smart cd function, allows switching to /etc when running 'cd /etc/fstab'
3175 + function cd () {
3176 + if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then
3177 + [[ ! -e ${1:h} ]] && return 1
3178 + print "Correcting ${1} to ${1:h}"
3179 + builtin cd ${1:h}
3180 + else
3181 + builtin cd "$@"
3182 + fi
3183 + }
3184 +
3185 + #f5# Create Directory and \kbd{cd} to it
3186 + function mkcd () {
3187 + if (( ARGC != 1 )); then
3188 + printf 'usage: mkcd <new-directory>\n'
3189 + return 1;
3190 + fi
3191 + if [[ ! -d "$1" ]]; then
3192 + command mkdir -p "$1"
3193 + else
3194 + printf '`%s'\'' already exists: cd-ing.\n' "$1"
3195 + fi
3196 + builtin cd "$1"
3197 + }
3198 +
3199 + #f5# Create temporary directory and \kbd{cd} to it
3200 + function cdt () {
3201 + local -a cdttemplate
3202 + if [ "$#" -eq 1 ]; then
3203 + if isfreebsd; then
3204 + # mktemp(1) on FreeBSD doesn't behave the same, cf.
3205 + # https://man.freebsd.org/cgi/man.cgi?query=mktemp#OPTIONS
3206 + cdttemplate=(-t "$1")
3207 + else
3208 + cdttemplate=(-t "$1".XXXXXXX)
3209 + fi
3210 + fi
3211 + builtin cd "$(mktemp -d ${cdttemplate[@]})"
3212 + builtin pwd
3213 + }
3214 +
3215 + #f5# List files which have been accessed within the last {\it n} days, {\it n} defaults to 1
3216 + function accessed () {
3217 + emulate -L zsh
3218 + print -l -- *(a-${1:-1})
3219 + }
3220 +
3221 + #f5# List files which have been changed within the last {\it n} days, {\it n} defaults to 1
3222 + function changed () {
3223 + emulate -L zsh
3224 + print -l -- *(c-${1:-1})
3225 + }
3226 +
3227 + #f5# List files which have been modified within the last {\it n} days, {\it n} defaults to 1
3228 + function modified () {
3229 + emulate -L zsh
3230 + print -l -- *(m-${1:-1})
3231 + }
3232 + # modified() was named new() in earlier versions, add an alias for backwards compatibility
3233 + check_com new || alias new=modified
3234 +
3235 + # use colors when GNU grep with color-support
3236 + if (( $#grep_options > 0 )); then
3237 + o=${grep_options:+"${grep_options[*]}"}
3238 + #a2# Execute \kbd{grep -{}-color=auto}
3239 + alias grep='grep '$o
3240 + alias egrep='egrep '$o
3241 + unset o
3242 + fi
3243 +
3244 + # Translate DE<=>EN
3245 + # 'translate' looks up a word in a file with language-to-language
3246 + # translations (field separator should be " : "). A typical wordlist looks
3247 + # like the following:
3248 + # | english-word : german-translation
3249 + # It's also only possible to translate english to german but not reciprocal.
3250 + # Use the following oneliner to reverse the sort order:
3251 + # $ awk -F ':' '{ print $2" : "$1" "$3 }' \
3252 + # /usr/local/lib/words/en-de.ISO-8859-1.vok > ~/.translate/de-en.ISO-8859-1.vok
3253 + #f5# Translates a word
3254 + if ! check_com -c trans; then
3255 + function trans () {
3256 + emulate -L zsh
3257 + case "$1" in
3258 + -[dD]*)
3259 + translate -l de-en $2
3260 + ;;
3261 + -[eE]*)
3262 + translate -l en-de $2
3263 + ;;
3264 + *)
3265 + echo "Usage: $0 { -D | -E }"
3266 + echo " -D == German to English"
3267 + echo " -E == English to German"
3268 + esac
3269 + }
3270 + fi
3271 +
3272 + # Usage: simple-extract <file>
3273 + # Using option -d deletes the original archive file.
3274 + #f5# Smart archive extractor
3275 + function simple-extract () {
3276 + emulate -L zsh
3277 + setopt extended_glob noclobber
3278 + local ARCHIVE DELETE_ORIGINAL DECOMP_CMD USES_STDIN USES_STDOUT GZTARGET WGET_CMD
3279 + local RC=0
3280 + zparseopts -D -E "d=DELETE_ORIGINAL"
3281 + for ARCHIVE in "${@}"; do
3282 + case $ARCHIVE in
3283 + *(tar.bz2|tbz2|tbz))
3284 + DECOMP_CMD="tar -xvjf -"
3285 + USES_STDIN=true
3286 + USES_STDOUT=false
3287 + ;;
3288 + *(tar.gz|tgz))
3289 + DECOMP_CMD="tar -xvzf -"
3290 + USES_STDIN=true
3291 + USES_STDOUT=false
3292 + ;;
3293 + *(tar.xz|txz|tar.lzma))
3294 + DECOMP_CMD="tar -xvJf -"
3295 + USES_STDIN=true
3296 + USES_STDOUT=false
3297 + ;;
3298 + *tar.zst)
3299 + DECOMP_CMD="tar --zstd -xvf -"
3300 + USES_STDIN=true
3301 + USES_STDOUT=false
3302 + ;;
3303 + *tar.lrz)
3304 + DECOMP_CMD="lrzuntar"
3305 + USES_STDIN=false
3306 + USES_STDOUT=false
3307 + ;;
3308 + *tar)
3309 + DECOMP_CMD="tar -xvf -"
3310 + USES_STDIN=true
3311 + USES_STDOUT=false
3312 + ;;
3313 + *rar)
3314 + DECOMP_CMD="unrar x"
3315 + USES_STDIN=false
3316 + USES_STDOUT=false
3317 + ;;
3318 + *lzh)
3319 + DECOMP_CMD="lha x"
3320 + USES_STDIN=false
3321 + USES_STDOUT=false
3322 + ;;
3323 + *7z)
3324 + DECOMP_CMD="7z x"
3325 + USES_STDIN=false
3326 + USES_STDOUT=false
3327 + ;;
3328 + *(zip|jar))
3329 + DECOMP_CMD="unzip"
3330 + USES_STDIN=false
3331 + USES_STDOUT=false
3332 + ;;
3333 + *deb)
3334 + DECOMP_CMD="ar -x"
3335 + USES_STDIN=false
3336 + USES_STDOUT=false
3337 + ;;
3338 + *bz2)
3339 + DECOMP_CMD="bzip2 -d -c -"
3340 + USES_STDIN=true
3341 + USES_STDOUT=true
3342 + ;;
3343 + *(gz|Z))
3344 + DECOMP_CMD="gzip -d -c -"
3345 + USES_STDIN=true
3346 + USES_STDOUT=true
3347 + ;;
3348 + *(xz|lzma))
3349 + DECOMP_CMD="xz -d -c -"
3350 + USES_STDIN=true
3351 + USES_STDOUT=true
3352 + ;;
3353 + *zst)
3354 + DECOMP_CMD="zstd -d -c -"
3355 + USES_STDIN=true
3356 + USES_STDOUT=true
3357 + ;;
3358 + *lrz)
3359 + DECOMP_CMD="lrunzip -"
3360 + USES_STDIN=true
3361 + USES_STDOUT=true
3362 + ;;
3363 + *)
3364 + print "ERROR: '$ARCHIVE' has unrecognized archive type." >&2
3365 + RC=$((RC+1))
3366 + continue
3367 + ;;
3368 + esac
3369 +
3370 + if ! check_com ${DECOMP_CMD[(w)1]}; then
3371 + echo "ERROR: ${DECOMP_CMD[(w)1]} not installed." >&2
3372 + RC=$((RC+2))
3373 + continue
3374 + fi
3375 +
3376 + GZTARGET="${ARCHIVE:t:r}"
3377 + if [[ -f $ARCHIVE ]] ; then
3378 +
3379 + print "Extracting '$ARCHIVE' ..."
3380 + if $USES_STDIN; then
3381 + if $USES_STDOUT; then
3382 + ${=DECOMP_CMD} < "$ARCHIVE" > $GZTARGET
3383 + else
3384 + ${=DECOMP_CMD} < "$ARCHIVE"
3385 + fi
3386 + else
3387 + if $USES_STDOUT; then
3388 + ${=DECOMP_CMD} "$ARCHIVE" > $GZTARGET
3389 + else
3390 + ${=DECOMP_CMD} "$ARCHIVE"
3391 + fi
3392 + fi
3393 + [[ $? -eq 0 && -n "$DELETE_ORIGINAL" ]] && rm -f "$ARCHIVE"
3394 +
3395 + elif [[ "$ARCHIVE" == (#s)(https|http|ftp)://* ]] ; then
3396 + if check_com curl; then
3397 + WGET_CMD="curl -L -s -o -"
3398 + elif check_com wget; then
3399 + WGET_CMD="wget -q -O -"
3400 + elif check_com fetch; then
3401 + WGET_CMD="fetch -q -o -"
3402 + else
3403 + print "ERROR: neither wget, curl nor fetch is installed" >&2
3404 + RC=$((RC+4))
3405 + continue
3406 + fi
3407 + print "Downloading and Extracting '$ARCHIVE' ..."
3408 + if $USES_STDIN; then
3409 + if $USES_STDOUT; then
3410 + ${=WGET_CMD} "$ARCHIVE" | ${=DECOMP_CMD} > $GZTARGET
3411 + RC=$((RC+$?))
3412 + else
3413 + ${=WGET_CMD} "$ARCHIVE" | ${=DECOMP_CMD}
3414 + RC=$((RC+$?))
3415 + fi
3416 + else
3417 + if $USES_STDOUT; then
3418 + ${=DECOMP_CMD} =(${=WGET_CMD} "$ARCHIVE") > $GZTARGET
3419 + else
3420 + ${=DECOMP_CMD} =(${=WGET_CMD} "$ARCHIVE")
3421 + fi
3422 + fi
3423 +
3424 + else
3425 + print "ERROR: '$ARCHIVE' is neither a valid file nor a supported URI." >&2
3426 + RC=$((RC+8))
3427 + fi
3428 + done
3429 + return $RC
3430 + }
3431 +
3432 + function __archive_or_uri () {
3433 + _alternative \
3434 + 'files:Archives:_files -g "*.(#l)(tar.bz2|tbz2|tbz|tar.gz|tgz|tar.xz|txz|tar.lzma|tar|rar|lzh|7z|zip|jar|deb|bz2|gz|Z|xz|lzma)"' \
3435 + '_urls:Remote Archives:_urls'
3436 + }
3437 +
3438 + function _simple_extract () {
3439 + _arguments \
3440 + '-d[delete original archivefile after extraction]' \
3441 + '*:Archive Or Uri:__archive_or_uri'
3442 + }
3443 + compdef _simple_extract simple-extract
3444 + [[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias se=simple-extract
3445 +
3446 + #f5# Change the xterm title from within GNU-screen
3447 + function xtrename () {
3448 + emulate -L zsh
3449 + if [[ $1 != "-f" ]] ; then
3450 + if [[ -z ${DISPLAY} ]] ; then
3451 + printf 'xtrename only makes sense in X11.\n'
3452 + return 1
3453 + fi
3454 + else
3455 + shift
3456 + fi
3457 + if [[ -z $1 ]] ; then
3458 + printf 'usage: xtrename [-f] "title for xterm"\n'
3459 + printf ' renames the title of xterm from _within_ screen.\n'
3460 + printf ' also works without screen.\n'
3461 + printf ' will not work if DISPLAY is unset, use -f to override.\n'
3462 + return 0
3463 + fi
3464 + print -n "\eP\e]0;${1}\C-G\e\\"
3465 + return 0
3466 + }
3467 +
3468 + #f2# Find history events by search pattern and list them by date.
3469 + function whatwhen () {
3470 + emulate -L zsh
3471 + local usage help ident format_l format_s first_char remain first last
3472 + usage='USAGE: whatwhen [options] <searchstring> <search range>'
3473 + help='Use `whatwhen -h'\'' for further explanations.'
3474 + ident=${(l,${#${:-Usage: }},, ,)}
3475 + format_l="${ident}%s\t\t\t%s\n"
3476 + format_s="${format_l//(\\t)##/\\t}"
3477 + # Make the first char of the word to search for case
3478 + # insensitive; e.g. [aA]
3479 + first_char=[${(L)1[1]}${(U)1[1]}]
3480 + remain=${1[2,-1]}
3481 + # Default search range is `-100'.
3482 + first=${2:-\-100}
3483 + # Optional, just used for `<first> <last>' given.
3484 + last=$3
3485 + case $1 in
3486 + ("")
3487 + printf '%s\n\n' 'ERROR: No search string specified. Aborting.'
3488 + printf '%s\n%s\n\n' ${usage} ${help} && return 1
3489 + ;;
3490 + (-h)
3491 + printf '%s\n\n' ${usage}
3492 + print 'OPTIONS:'
3493 + printf $format_l '-h' 'show help text'
3494 + print '\f'
3495 + print 'SEARCH RANGE:'
3496 + printf $format_l "'0'" 'the whole history,'
3497 + printf $format_l '-<n>' 'offset to the current history number; (default: -100)'
3498 + printf $format_s '<[-]first> [<last>]' 'just searching within a give range'
3499 + printf '\n%s\n' 'EXAMPLES:'
3500 + printf ${format_l/(\\t)/} 'whatwhen grml' '# Range is set to -100 by default.'
3501 + printf $format_l 'whatwhen zsh -250'
3502 + printf $format_l 'whatwhen foo 1 99'
3503 + ;;
3504 + (\?)
3505 + printf '%s\n%s\n\n' ${usage} ${help} && return 1
3506 + ;;
3507 + (*)
3508 + # -l list results on stout rather than invoking $EDITOR.
3509 + # -i Print dates as in YYYY-MM-DD.
3510 + # -m Search for a - quoted - pattern within the history.
3511 + fc -li -m "*${first_char}${remain}*" $first $last
3512 + ;;
3513 + esac
3514 + }
3515 +
3516 + # mercurial related stuff
3517 + if check_com -c hg ; then
3518 + # gnu like diff for mercurial
3519 + # http://www.selenic.com/mercurial/wiki/index.cgi/TipsAndTricks
3520 + #f5# GNU like diff for mercurial
3521 + function hgdi () {
3522 + emulate -L zsh
3523 + local i
3524 + for i in $(hg status -marn "$@") ; diff -ubwd <(hg cat "$i") "$i"
3525 + }
3526 +
3527 + # execute commands on the versioned patch-queue from the current repos
3528 + [[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias mq='hg -R $(readlink -f $(hg root)/.hg/patches)'
3529 +
3530 + # diffstat for specific version of a mercurial repository
3531 + # hgstat => display diffstat between last revision and tip
3532 + # hgstat 1234 => display diffstat between revision 1234 and tip
3533 + #f5# Diffstat for specific version of a mercurial repos
3534 + function hgstat () {
3535 + emulate -L zsh
3536 + [[ -n "$1" ]] && hg diff -r $1 -r tip | diffstat || hg export tip | diffstat
3537 + }
3538 +
3539 + fi # end of check whether we have the 'hg'-executable
3540 +
3541 + # disable bracketed paste mode for dumb terminals
3542 + [[ "$TERM" == dumb ]] && unset zle_bracketed_paste
3543 +
3544 + # grml-small cleanups and workarounds
3545 +
3546 + # The following is used to remove zsh-config-items that do not work
3547 + # in grml-small by default.
3548 + # If you do not want these adjustments (for whatever reason), set
3549 + # $GRMLSMALL_SPECIFIC to 0 in your .zshrc.pre file (which this configuration
3550 + # sources if it is there).
3551 +
3552 + if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then
3553 +
3554 + # Clean up
3555 +
3556 + unset "abk[V]"
3557 + unalias 'V' &> /dev/null
3558 + unfunction vman &> /dev/null
3559 + unfunction viless &> /dev/null
3560 + unfunction 2html &> /dev/null
3561 +
3562 + # manpages are not in grmlsmall
3563 + unfunction manzsh &> /dev/null
3564 + unfunction man2 &> /dev/null
3565 +
3566 + # Workarounds
3567 +
3568 + # See https://github.com/grml/grml/issues/56
3569 + if ! [[ -x ${commands[dig]} ]]; then
3570 + function dig_after_all () {
3571 + unfunction dig
3572 + unfunction _dig
3573 + autoload -Uz _dig
3574 + unfunction dig_after_all
3575 + }
3576 + function dig () {
3577 + if [[ -x ${commands[dig]} ]]; then
3578 + dig_after_all
3579 + command dig "$@"
3580 + return "$!"
3581 + fi
3582 + printf 'This installation does not include `dig'\'' for size reasons.\n'
3583 + printf 'Try `drill'\'' as a light weight alternative.\n'
3584 + return 0
3585 + }
3586 + function _dig () {
3587 + if [[ -x ${commands[dig]} ]]; then
3588 + dig_after_all
3589 + zle -M 'Found `dig'\'' installed. '
3590 + else
3591 + zle -M 'Try `drill'\'' instead of `dig'\''.'
3592 + fi
3593 + }
3594 + compdef _dig dig
3595 + fi
3596 + fi
3597 +
3598 + zrclocal
3599 +
3600 + unfunction grml_status_feature
3601 +
3602 + ## genrefcard.pl settings
3603 +
3604 + ### doc strings for external functions from files
3605 + #m# f5 grml-wallpaper() Sets a wallpaper (try completion for possible values)
3606 +
3607 + ### example: split functions-search 8,16,24,32
3608 + #@# split functions-search 8
3609 +
3610 + ## END OF FILE #################################################################
3611 + # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4
3612 + # Local variables:
3613 + # mode: sh
3614 + # End:
3615 +
3616 + # History configuration
3617 + HISTFILE=~/.histfile
3618 + HISTSIZE=3000
3619 + SAVEHIST=5000
3620 +
3621 + # ZSH plugins (Solus)
3622 + source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
3623 + source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh
3624 +
3625 + # Make Flatpaks accessible via the shell
3626 + export PATH="$PATH:/var/lib/flatpak/exports/bin"
3627 +
3628 + # Reset prompt to default
3629 + prompt default
3630 + PROMPT='%# '
3631 +
3632 + # Load Headline ZSH theme
3633 + source ~/.config/headline.zsh-theme
3634 +
3635 + fastfetch
3636 + # NOTE: Package cowsay for Solus
3637 + #fortune | cowsay -f tux

jce revisó este gist 1749229066. Ir a la revisión

Sin cambios

jce revisó este gist 1749229053. Ir a la revisión

Sin cambios

jce revisó este gist 1749228937. Ir a la revisión

1 file changed, 3967 insertions

.zshrc(archivo creado)

@@ -0,0 +1,3967 @@
1 + # Filename: /etc/zsh/zshrc
2 + # Purpose: config file for zsh (z shell)
3 + # Authors: grml-team (grml.org), (c) Michael Prokop <[email protected]>
4 + # Bug-Reports: see http://grml.org/bugs/
5 + # License: This file is licensed under the GPL v2.
6 + ################################################################################
7 + # This file is sourced only for interactive shells. It
8 + # should contain commands to set up aliases, functions,
9 + # options, key bindings, etc.
10 + #
11 + # Global Order: zshenv, zprofile, zshrc, zlogin
12 + ################################################################################
13 +
14 + # USAGE
15 + # If you are using this file as your ~/.zshrc file, please use ~/.zshrc.pre
16 + # and ~/.zshrc.local for your own customisations. The former file is read
17 + # before ~/.zshrc, the latter is read after it. Also, consider reading the
18 + # refcard and the reference manual for this setup, both available from:
19 + # <http://grml.org/zsh/>
20 +
21 + # Contributing:
22 + # If you want to help to improve grml's zsh setup, clone the grml-etc-core
23 + # repository from git.grml.org:
24 + # git clone git://git.grml.org/grml-etc-core.git
25 + #
26 + # Make your changes, commit them; use 'git format-patch' to create a series
27 + # of patches and send those to the following address via 'git send-email':
28 + # [email protected]
29 + #
30 + # Doing so makes sure the right people get your patches for review and
31 + # possibly inclusion.
32 +
33 + # zsh-refcard-tag documentation:
34 + # You may notice strange looking comments in this file.
35 + # These are there for a purpose. grml's zsh-refcard can now be
36 + # automatically generated from the contents of the actual configuration
37 + # file. However, we need a little extra information on which comments
38 + # and what lines of code to take into account (and for what purpose).
39 + #
40 + # Here is what they mean:
41 + #
42 + # List of tags (comment types) used:
43 + # #a# Next line contains an important alias, that should
44 + # be included in the grml-zsh-refcard.
45 + # (placement tag: @@INSERT-aliases@@)
46 + # #f# Next line contains the beginning of an important function.
47 + # (placement tag: @@INSERT-functions@@)
48 + # #v# Next line contains an important variable.
49 + # (placement tag: @@INSERT-variables@@)
50 + # #k# Next line contains an important keybinding.
51 + # (placement tag: @@INSERT-keybindings@@)
52 + # #d# Hashed directories list generation:
53 + # start denotes the start of a list of 'hash -d'
54 + # definitions.
55 + # end denotes its end.
56 + # (placement tag: @@INSERT-hasheddirs@@)
57 + # #A# Abbreviation expansion list generation:
58 + # start denotes the beginning of abbreviations.
59 + # end denotes their end.
60 + # Lines within this section that end in '#d .*' provide
61 + # extra documentation to be included in the refcard.
62 + # (placement tag: @@INSERT-abbrev@@)
63 + # #m# This tag allows you to manually generate refcard entries
64 + # for code lines that are hard/impossible to parse.
65 + # Example:
66 + # #m# k ESC-h Call the run-help function
67 + # That would add a refcard entry in the keybindings table
68 + # for 'ESC-h' with the given comment.
69 + # So the syntax is: #m# <section> <argument> <comment>
70 + # #o# This tag lets you insert entries to the 'other' hash.
71 + # Generally, this should not be used. It is there for
72 + # things that cannot be done easily in another way.
73 + # (placement tag: @@INSERT-other-foobar@@)
74 + #
75 + # All of these tags (except for m and o) take two arguments, the first
76 + # within the tag, the other after the tag:
77 + #
78 + # #<tag><section># <comment>
79 + #
80 + # Where <section> is really just a number, which are defined by the
81 + # @secmap array on top of 'genrefcard.pl'. The reason for numbers
82 + # instead of names is, that for the reader, the tag should not differ
83 + # much from a regular comment. For zsh, it is a regular comment indeed.
84 + # The numbers have got the following meanings:
85 + # 0 -> "default"
86 + # 1 -> "system"
87 + # 2 -> "user"
88 + # 3 -> "debian"
89 + # 4 -> "search"
90 + # 5 -> "shortcuts"
91 + # 6 -> "services"
92 + #
93 + # So, the following will add an entry to the 'functions' table in the
94 + # 'system' section, with a (hopefully) descriptive comment:
95 + # #f1# Edit an alias via zle
96 + # edalias() {
97 + #
98 + # It will then show up in the @@INSERT-aliases-system@@ replacement tag
99 + # that can be found in 'grml-zsh-refcard.tex.in'.
100 + # If the section number is omitted, the 'default' section is assumed.
101 + # Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
102 + # exactly the same as @@INSERT-aliases-default@@. If you want a list of
103 + # *all* aliases, for example, use @@INSERT-aliases-all@@.
104 +
105 + # zsh profiling
106 + # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
107 + if [[ $ZSH_PROFILE_RC -gt 0 ]] ; then
108 + zmodload zsh/zprof
109 + fi
110 +
111 + typeset -A GRML_STATUS_FEATURES
112 +
113 + function grml_status_feature () {
114 + emulate -L zsh
115 + local f=$1
116 + local -i success=$2
117 + if (( success == 0 )); then
118 + GRML_STATUS_FEATURES[$f]=success
119 + else
120 + GRML_STATUS_FEATURES[$f]=failure
121 + fi
122 + return 0
123 + }
124 +
125 + function grml_status_features () {
126 + emulate -L zsh
127 + local mode=${1:-+-}
128 + local this
129 + if [[ $mode == -h ]] || [[ $mode == --help ]]; then
130 + cat <<EOF
131 + grml_status_features [-h|--help|-|+|+-|FEATURE]
132 +
133 + Prints a summary of features the grml setup is trying to load. The
134 + result of loading a feature is recorded. This function lets you query
135 + the result.
136 +
137 + The function takes one argument: "-h" or "--help" to display this help
138 + text, "+" to display a list of all successfully loaded features, "-" for
139 + a list of all features that failed to load. "+-" to show a list of all
140 + features with their statuses.
141 +
142 + Any other word is considered to by a feature and prints its status.
143 +
144 + The default mode is "+-".
145 + EOF
146 + return 0
147 + fi
148 + if [[ $mode != - ]] && [[ $mode != + ]] && [[ $mode != +- ]]; then
149 + this="${GRML_STATUS_FEATURES[$mode]}"
150 + if [[ -z $this ]]; then
151 + printf 'unknown\n'
152 + return 1
153 + else
154 + printf '%s\n' $this
155 + fi
156 + return 0
157 + fi
158 + for key in ${(ok)GRML_STATUS_FEATURES}; do
159 + this="${GRML_STATUS_FEATURES[$key]}"
160 + if [[ $this == success ]] && [[ $mode == *+* ]]; then
161 + printf '%-16s %s\n' $key $this
162 + fi
163 + if [[ $this == failure ]] && [[ $mode == *-* ]]; then
164 + printf '%-16s %s\n' $key $this
165 + fi
166 + done
167 + return 0
168 + }
169 +
170 + # load .zshrc.pre to give the user the chance to overwrite the defaults
171 + [[ -r ${ZDOTDIR:-${HOME}}/.zshrc.pre ]] && source ${ZDOTDIR:-${HOME}}/.zshrc.pre
172 +
173 + # check for version/system
174 + # check for versions (compatibility reasons)
175 + function is51 () {
176 + [[ $ZSH_VERSION == 5.<1->* ]] && return 0
177 + return 1
178 + }
179 +
180 + function is4 () {
181 + [[ $ZSH_VERSION == <4->* ]] && return 0
182 + return 1
183 + }
184 +
185 + function is41 () {
186 + [[ $ZSH_VERSION == 4.<1->* || $ZSH_VERSION == <5->* ]] && return 0
187 + return 1
188 + }
189 +
190 + function is42 () {
191 + [[ $ZSH_VERSION == 4.<2->* || $ZSH_VERSION == <5->* ]] && return 0
192 + return 1
193 + }
194 +
195 + function is425 () {
196 + [[ $ZSH_VERSION == 4.2.<5->* || $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
197 + return 1
198 + }
199 +
200 + function is43 () {
201 + [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
202 + return 1
203 + }
204 +
205 + function is433 () {
206 + [[ $ZSH_VERSION == 4.3.<3->* || $ZSH_VERSION == 4.<4->* \
207 + || $ZSH_VERSION == <5->* ]] && return 0
208 + return 1
209 + }
210 +
211 + function is437 () {
212 + [[ $ZSH_VERSION == 4.3.<7->* || $ZSH_VERSION == 4.<4->* \
213 + || $ZSH_VERSION == <5->* ]] && return 0
214 + return 1
215 + }
216 +
217 + function is439 () {
218 + [[ $ZSH_VERSION == 4.3.<9->* || $ZSH_VERSION == 4.<4->* \
219 + || $ZSH_VERSION == <5->* ]] && return 0
220 + return 1
221 + }
222 +
223 + #f1# Checks whether or not you're running grml
224 + function isgrml () {
225 + [[ -f /etc/grml_version ]] && return 0
226 + return 1
227 + }
228 +
229 + #f1# Checks whether or not you're running a grml cd
230 + function isgrmlcd () {
231 + [[ -f /etc/grml_cd ]] && return 0
232 + return 1
233 + }
234 +
235 + if isgrml ; then
236 + #f1# Checks whether or not you're running grml-small
237 + function isgrmlsmall () {
238 + if [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]]; then
239 + return 0
240 + fi
241 + return 1
242 + }
243 + else
244 + function isgrmlsmall () { return 1 }
245 + fi
246 +
247 + GRML_OSTYPE=$(uname -s)
248 +
249 + function islinux () {
250 + [[ $GRML_OSTYPE == "Linux" ]]
251 + }
252 +
253 + function isdarwin () {
254 + [[ $GRML_OSTYPE == "Darwin" ]]
255 + }
256 +
257 + function isfreebsd () {
258 + [[ $GRML_OSTYPE == "FreeBSD" ]]
259 + }
260 +
261 + function isopenbsd () {
262 + [[ $GRML_OSTYPE == "OpenBSD" ]]
263 + }
264 +
265 + function issolaris () {
266 + [[ $GRML_OSTYPE == "SunOS" ]]
267 + }
268 +
269 + #f1# are we running within an utf environment?
270 + function isutfenv () {
271 + case "$LANG $CHARSET $LANGUAGE" in
272 + *utf*) return 0 ;;
273 + *UTF*) return 0 ;;
274 + *) return 1 ;;
275 + esac
276 + }
277 +
278 + # check for user, if not running as root set $SUDO to sudo
279 + (( EUID != 0 )) && SUDO='sudo' || SUDO=''
280 +
281 + # change directory to home on first invocation of zsh
282 + # important for rungetty -> autologin
283 + # Thanks go to Bart Schaefer!
284 + isgrml && function checkhome () {
285 + if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then
286 + export ALREADY_DID_CD_HOME=$HOME
287 + cd
288 + fi
289 + }
290 +
291 + # check for zsh v3.1.7+
292 +
293 + if ! [[ ${ZSH_VERSION} == 3.1.<7->* \
294 + || ${ZSH_VERSION} == 3.<2->.<->* \
295 + || ${ZSH_VERSION} == <4->.<->* ]] ; then
296 +
297 + printf '-!-\n'
298 + printf '-!- In this configuration we try to make use of features, that only\n'
299 + printf '-!- require version 3.1.7 of the shell; That way this setup can be\n'
300 + printf '-!- used with a wide range of zsh versions, while using fairly\n'
301 + printf '-!- advanced features in all supported versions.\n'
302 + printf '-!-\n'
303 + printf '-!- However, you are running zsh version %s.\n' "$ZSH_VERSION"
304 + printf '-!-\n'
305 + printf '-!- While this *may* work, it might as well fail.\n'
306 + printf '-!- Please consider updating to at least version 3.1.7 of zsh.\n'
307 + printf '-!-\n'
308 + printf '-!- DO NOT EXPECT THIS TO WORK FLAWLESSLY!\n'
309 + printf '-!- If it does today, you'\''ve been lucky.\n'
310 + printf '-!-\n'
311 + printf '-!- Ye been warned!\n'
312 + printf '-!-\n'
313 +
314 + function zstyle () { : }
315 + fi
316 +
317 + # autoload wrapper - use this one instead of autoload directly
318 + # We need to define this function as early as this, because autoloading
319 + # 'is-at-least()' needs it.
320 + function zrcautoload () {
321 + emulate -L zsh
322 + setopt extended_glob
323 + local fdir ffile
324 + local -i ffound
325 +
326 + ffile=$1
327 + (( ffound = 0 ))
328 + for fdir in ${fpath} ; do
329 + [[ -e ${fdir}/${ffile} ]] && (( ffound = 1 ))
330 + done
331 +
332 + (( ffound == 0 )) && return 1
333 + if [[ $ZSH_VERSION == 3.1.<6-> || $ZSH_VERSION == <4->* ]] ; then
334 + autoload -U ${ffile} || return 1
335 + else
336 + autoload ${ffile} || return 1
337 + fi
338 + return 0
339 + }
340 +
341 + # The following is the ‘add-zsh-hook’ function from zsh upstream. It is
342 + # included here to make the setup work with older versions of zsh (prior to
343 + # 4.3.7) in which this function had a bug that triggers annoying errors during
344 + # shell startup. This is exactly upstreams code from f0068edb4888a4d8fe94def,
345 + # with just a few adjustments in coding style to make the function look more
346 + # compact. This definition can be removed as soon as we raise the minimum
347 + # version requirement to 4.3.7 or newer.
348 + function add-zsh-hook () {
349 + # Add to HOOK the given FUNCTION.
350 + # HOOK is one of chpwd, precmd, preexec, periodic, zshaddhistory,
351 + # zshexit, zsh_directory_name (the _functions subscript is not required).
352 + #
353 + # With -d, remove the function from the hook instead; delete the hook
354 + # variable if it is empty.
355 + #
356 + # -D behaves like -d, but pattern characters are active in the function
357 + # name, so any matching function will be deleted from the hook.
358 + #
359 + # Without -d, the FUNCTION is marked for autoload; -U is passed down to
360 + # autoload if that is given, as are -z and -k. (This is harmless if the
361 + # function is actually defined inline.)
362 + emulate -L zsh
363 + local -a hooktypes
364 + hooktypes=(
365 + chpwd precmd preexec periodic zshaddhistory zshexit
366 + zsh_directory_name
367 + )
368 + local usage="Usage: $0 hook function\nValid hooks are:\n $hooktypes"
369 + local opt
370 + local -a autoopts
371 + integer del list help
372 + while getopts "dDhLUzk" opt; do
373 + case $opt in
374 + (d) del=1 ;;
375 + (D) del=2 ;;
376 + (h) help=1 ;;
377 + (L) list=1 ;;
378 + ([Uzk]) autoopts+=(-$opt) ;;
379 + (*) return 1 ;;
380 + esac
381 + done
382 + shift $(( OPTIND - 1 ))
383 + if (( list )); then
384 + typeset -mp "(${1:-${(@j:|:)hooktypes}})_functions"
385 + return $?
386 + elif (( help || $# != 2 || ${hooktypes[(I)$1]} == 0 )); then
387 + print -u$(( 2 - help )) $usage
388 + return $(( 1 - help ))
389 + fi
390 + local hook="${1}_functions"
391 + local fn="$2"
392 + if (( del )); then
393 + # delete, if hook is set
394 + if (( ${(P)+hook} )); then
395 + if (( del == 2 )); then
396 + set -A $hook ${(P)hook:#${~fn}}
397 + else
398 + set -A $hook ${(P)hook:#$fn}
399 + fi
400 + # unset if no remaining entries --- this can give better
401 + # performance in some cases
402 + if (( ! ${(P)#hook} )); then
403 + unset $hook
404 + fi
405 + fi
406 + else
407 + if (( ${(P)+hook} )); then
408 + if (( ${${(P)hook}[(I)$fn]} == 0 )); then
409 + set -A $hook ${(P)hook} $fn
410 + fi
411 + else
412 + set -A $hook $fn
413 + fi
414 + autoload $autoopts -- $fn
415 + fi
416 + }
417 +
418 + # Load is-at-least() for more precise version checks Note that this test will
419 + # *always* fail, if the is-at-least function could not be marked for
420 + # autoloading.
421 + zrcautoload is-at-least || function is-at-least () { return 1 }
422 +
423 + # set some important options (as early as possible)
424 +
425 + # append history list to the history file; this is the default but we make sure
426 + # because it's required for share_history.
427 + setopt append_history
428 +
429 + # import new commands from the history file also in other zsh-session
430 + is4 && setopt share_history
431 +
432 + # save each command's beginning timestamp and the duration to the history file
433 + setopt extended_history
434 +
435 + # remove command lines from the history list when the first character on the
436 + # line is a space
437 + setopt histignorespace
438 +
439 + # if a command is issued that can't be executed as a normal command, and the
440 + # command is the name of a directory, perform the cd command to that directory.
441 + setopt auto_cd
442 +
443 + # in order to use #, ~ and ^ for filename generation grep word
444 + # *~(*.gz|*.bz|*.bz2|*.zip|*.Z) -> searches for word not in compressed files
445 + # don't forget to quote '^', '~' and '#'!
446 + setopt extended_glob
447 +
448 + # display PID when suspending processes as well
449 + setopt longlistjobs
450 +
451 + # report the status of backgrounds jobs immediately
452 + setopt notify
453 +
454 + # whenever a command completion is attempted, make sure the entire command path
455 + # is hashed first.
456 + setopt hash_list_all
457 +
458 + # not just at the end
459 + setopt completeinword
460 +
461 + # Don't send SIGHUP to background processes when the shell exits.
462 + setopt nohup
463 +
464 + # make cd push the old directory onto the directory stack.
465 + setopt auto_pushd
466 +
467 + # avoid "beep"ing
468 + setopt nobeep
469 +
470 + # don't push the same dir twice.
471 + setopt pushd_ignore_dups
472 +
473 + # * shouldn't match dotfiles. ever.
474 + setopt noglobdots
475 +
476 + # use zsh style word splitting
477 + setopt noshwordsplit
478 +
479 + # don't error out when unset parameters are used
480 + setopt unset
481 +
482 + # setting some default values
483 + NOCOR=${NOCOR:-0}
484 + NOETCHOSTS=${NOETCHOSTS:-0}
485 + NOMENU=${NOMENU:-0}
486 + NOPRECMD=${NOPRECMD:-0}
487 + COMMAND_NOT_FOUND=${COMMAND_NOT_FOUND:-0}
488 + GRML_ZSH_CNF_HANDLER=${GRML_ZSH_CNF_HANDLER:-/usr/share/command-not-found/command-not-found}
489 + GRML_DISPLAY_BATTERY=${GRML_DISPLAY_BATTERY:-${BATTERY:-0}}
490 + GRMLSMALL_SPECIFIC=${GRMLSMALL_SPECIFIC:-1}
491 + ZSH_NO_DEFAULT_LOCALE=${ZSH_NO_DEFAULT_LOCALE:-0}
492 +
493 + typeset -ga ls_options
494 + typeset -ga grep_options
495 +
496 + # Colors on GNU ls(1)
497 + if ls --color=auto / >/dev/null 2>&1; then
498 + ls_options+=( --color=auto )
499 + # Colors on FreeBSD and OSX ls(1)
500 + elif ls -G / >/dev/null 2>&1; then
501 + ls_options+=( -G )
502 + fi
503 +
504 + # Natural sorting order on GNU ls(1)
505 + # OSX and IllumOS have a -v option that is not natural sorting
506 + if ls --version |& grep -q 'GNU' >/dev/null 2>&1 && ls -v / >/dev/null 2>&1; then
507 + ls_options+=( -v )
508 + fi
509 +
510 + # Color on GNU and FreeBSD grep(1)
511 + if grep --color=auto -q "a" <<< "a" >/dev/null 2>&1; then
512 + grep_options+=( --color=auto )
513 + fi
514 +
515 + # utility functions
516 + # this function checks if a command exists and returns either true
517 + # or false. This avoids using 'which' and 'whence', which will
518 + # avoid problems with aliases for which on certain weird systems. :-)
519 + # Usage: check_com [-c|-g] word
520 + # -c only checks for external commands
521 + # -g does the usual tests and also checks for global aliases
522 + function check_com () {
523 + emulate -L zsh
524 + local -i comonly gatoo
525 + comonly=0
526 + gatoo=0
527 +
528 + if [[ $1 == '-c' ]] ; then
529 + comonly=1
530 + shift 1
531 + elif [[ $1 == '-g' ]] ; then
532 + gatoo=1
533 + shift 1
534 + fi
535 +
536 + if (( ${#argv} != 1 )) ; then
537 + printf 'usage: check_com [-c|-g] <command>\n' >&2
538 + return 1
539 + fi
540 +
541 + if (( comonly > 0 )) ; then
542 + (( ${+commands[$1]} )) && return 0
543 + return 1
544 + fi
545 +
546 + if (( ${+commands[$1]} )) \
547 + || (( ${+functions[$1]} )) \
548 + || (( ${+aliases[$1]} )) \
549 + || (( ${+reswords[(r)$1]} )) ; then
550 + return 0
551 + fi
552 +
553 + if (( gatoo > 0 )) && (( ${+galiases[$1]} )) ; then
554 + return 0
555 + fi
556 +
557 + return 1
558 + }
559 +
560 + # creates an alias and precedes the command with
561 + # sudo if $EUID is not zero.
562 + function salias () {
563 + emulate -L zsh
564 + local only=0 ; local multi=0
565 + local key val
566 + while getopts ":hao" opt; do
567 + case $opt in
568 + o) only=1 ;;
569 + a) multi=1 ;;
570 + h)
571 + printf 'usage: salias [-hoa] <alias-expression>\n'
572 + printf ' -h shows this help text.\n'
573 + printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
574 + printf ' be careful using this option.\n'
575 + printf ' -o only sets an alias if a preceding sudo would be needed.\n'
576 + return 0
577 + ;;
578 + *) salias -h >&2; return 1 ;;
579 + esac
580 + done
581 + shift "$((OPTIND-1))"
582 +
583 + if (( ${#argv} > 1 )) ; then
584 + printf 'Too many arguments %s\n' "${#argv}"
585 + return 1
586 + fi
587 +
588 + key="${1%%\=*}" ; val="${1#*\=}"
589 + if (( EUID == 0 )) && (( only == 0 )); then
590 + alias -- "${key}=${val}"
591 + elif (( EUID > 0 )) ; then
592 + (( multi > 0 )) && val="${val// ; / ; sudo }"
593 + alias -- "${key}=sudo ${val}"
594 + fi
595 +
596 + return 0
597 + }
598 +
599 + # Check if we can read given files and source those we can.
600 + function xsource () {
601 + if (( ${#argv} < 1 )) ; then
602 + printf 'usage: xsource FILE(s)...\n' >&2
603 + return 1
604 + fi
605 +
606 + while (( ${#argv} > 0 )) ; do
607 + [[ -r "$1" ]] && source "$1"
608 + shift
609 + done
610 + return 0
611 + }
612 +
613 + # Check if we can read a given file and 'cat(1)' it.
614 + function xcat () {
615 + emulate -L zsh
616 + if (( ${#argv} != 1 )) ; then
617 + printf 'usage: xcat FILE\n' >&2
618 + return 1
619 + fi
620 +
621 + [[ -r $1 ]] && cat $1
622 + return 0
623 + }
624 +
625 + # Remove these functions again, they are of use only in these
626 + # setup files. This should be called at the end of .zshrc.
627 + function xunfunction () {
628 + emulate -L zsh
629 + local -a funcs
630 + local func
631 + funcs=(salias xcat xsource xunfunction zrcautoload zrcautozle)
632 + for func in $funcs ; do
633 + [[ -n ${functions[$func]} ]] \
634 + && unfunction $func
635 + done
636 + return 0
637 + }
638 +
639 + # this allows us to stay in sync with grml's zshrc and put own
640 + # modifications in ~/.zshrc.local
641 + function zrclocal () {
642 + xsource "/etc/zsh/zshrc.local"
643 + xsource "${ZDOTDIR:-${HOME}}/.zshrc.local"
644 + return 0
645 + }
646 +
647 + # locale setup
648 + if (( ZSH_NO_DEFAULT_LOCALE == 0 )); then
649 + xsource "/etc/default/locale"
650 + fi
651 +
652 + for var in LANG LC_ALL LC_MESSAGES ; do
653 + [[ -n ${(P)var} ]] && export $var
654 + done
655 + builtin unset -v var
656 +
657 + # set some variables
658 + if check_com -c vim ; then
659 + #v#
660 + export EDITOR=${EDITOR:-vim}
661 + else
662 + export EDITOR=${EDITOR:-vi}
663 + fi
664 +
665 + #v#
666 + export PAGER=${PAGER:-less}
667 +
668 + #v#
669 + export MAIL=${MAIL:-/var/mail/$USER}
670 +
671 + # color setup for ls:
672 + check_com -c dircolors && eval $(dircolors -b)
673 + # color setup for ls on OS X / FreeBSD:
674 + isdarwin && export CLICOLOR=1
675 + isfreebsd && export CLICOLOR=1
676 +
677 + # do MacPorts setup on darwin
678 + if isdarwin && [[ -d /opt/local ]]; then
679 + # Note: PATH gets set in /etc/zprofile on Darwin, so this can't go into
680 + # zshenv.
681 + PATH="/opt/local/bin:/opt/local/sbin:$PATH"
682 + MANPATH="/opt/local/share/man:$MANPATH"
683 + fi
684 + # do Fink setup on darwin
685 + isdarwin && xsource /sw/bin/init.sh
686 +
687 + # load our function and completion directories
688 + for fdir in /usr/share/grml/zsh/completion /usr/share/grml/zsh/functions; do
689 + fpath=( ${fdir} ${fdir}/**/*(/N) ${fpath} )
690 + done
691 + typeset -aU ffiles
692 + ffiles=(/usr/share/grml/zsh/functions/**/[^_]*[^~](N.:t))
693 + (( ${#ffiles} > 0 )) && autoload -U "${ffiles[@]}"
694 + unset -v fdir ffiles
695 +
696 + # support colors in less
697 + export LESS_TERMCAP_mb=$'\E[01;31m'
698 + export LESS_TERMCAP_md=$'\E[01;31m'
699 + export LESS_TERMCAP_me=$'\E[0m'
700 + export LESS_TERMCAP_se=$'\E[0m'
701 + export LESS_TERMCAP_so=$'\E[01;44;33m'
702 + export LESS_TERMCAP_ue=$'\E[0m'
703 + export LESS_TERMCAP_us=$'\E[01;32m'
704 +
705 + # mailchecks
706 + MAILCHECK=30
707 +
708 + # report about cpu-/system-/user-time of command if running longer than
709 + # 5 seconds
710 + REPORTTIME=5
711 +
712 + # watch for everyone but me and root
713 + watch=(notme root)
714 +
715 + # automatically remove duplicates from these arrays
716 + typeset -U path PATH cdpath CDPATH fpath FPATH manpath MANPATH
717 +
718 + # Load a few modules
719 + is4 && \
720 + for mod in parameter complist deltochar mathfunc ; do
721 + zmodload -i zsh/${mod} 2>/dev/null
722 + grml_status_feature mod:$mod $?
723 + done && builtin unset -v mod
724 +
725 + # autoload zsh modules when they are referenced
726 + if is4 ; then
727 + zmodload -a zsh/stat zstat
728 + zmodload -a zsh/zpty zpty
729 + zmodload -ap zsh/mapfile mapfile
730 + fi
731 +
732 + # completion system
733 + COMPDUMPFILE=${COMPDUMPFILE:-${ZDOTDIR:-${HOME}}/.zcompdump}
734 + if zrcautoload compinit ; then
735 + typeset -a tmp
736 + zstyle -a ':grml:completion:compinit' arguments tmp
737 + compinit -d ${COMPDUMPFILE} "${tmp[@]}"
738 + grml_status_feature compinit $?
739 + unset tmp
740 + else
741 + grml_status_feature compinit 1
742 + function compdef { }
743 + fi
744 +
745 + # completion system
746 +
747 + # called later (via is4 && grmlcomp)
748 + # note: use 'zstyle' for getting current settings
749 + # press ^xh (control-x h) for getting tags in context; ^x? (control-x ?) to run complete_debug with trace output
750 + function grmlcomp () {
751 + # TODO: This could use some additional information
752 +
753 + # Make sure the completion system is initialised
754 + (( ${+_comps} )) || return 1
755 +
756 + # allow one error for every three characters typed in approximate completer
757 + zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )'
758 +
759 + # don't complete backup files as executables
760 + zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)'
761 +
762 + # start menu completion only if it could find no unambiguous initial string
763 + zstyle ':completion:*:correct:*' insert-unambiguous true
764 + zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}'
765 + zstyle ':completion:*:correct:*' original true
766 +
767 + # activate color-completion
768 + zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
769 +
770 + # format on completion
771 + zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'
772 +
773 + # automatically complete 'cd -<tab>' and 'cd -<ctrl-d>' with menu
774 + # zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
775 +
776 + # insert all expansions for expand completer
777 + zstyle ':completion:*:expand:*' tag-order all-expansions
778 + zstyle ':completion:*:history-words' list false
779 +
780 + # activate menu
781 + zstyle ':completion:*:history-words' menu yes
782 +
783 + # ignore duplicate entries
784 + zstyle ':completion:*:history-words' remove-all-dups yes
785 + zstyle ':completion:*:history-words' stop yes
786 +
787 + # match uppercase from lowercase
788 + zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
789 +
790 + # separate matches into groups
791 + zstyle ':completion:*:matches' group 'yes'
792 + zstyle ':completion:*' group-name ''
793 +
794 + if [[ "$NOMENU" -eq 0 ]] ; then
795 + # if there are more than 5 options allow selecting from a menu
796 + zstyle ':completion:*' menu select=5
797 + else
798 + # don't use any menus at all
799 + setopt no_auto_menu
800 + fi
801 +
802 + zstyle ':completion:*:messages' format '%d'
803 + zstyle ':completion:*:options' auto-description '%d'
804 +
805 + # describe options in full
806 + zstyle ':completion:*:options' description 'yes'
807 +
808 + # on processes completion complete all user processes
809 + zstyle ':completion:*:processes' command 'ps -au$USER'
810 +
811 + # offer indexes before parameters in subscripts
812 + zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
813 +
814 + # provide verbose completion information
815 + zstyle ':completion:*' verbose true
816 +
817 + # recent (as of Dec 2007) zsh versions are able to provide descriptions
818 + # for commands (read: 1st word in the line) that it will list for the user
819 + # to choose from. The following disables that, because it's not exactly fast.
820 + zstyle ':completion:*:-command-:*:' verbose false
821 +
822 + # set format for warnings
823 + zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d'
824 +
825 + # define files to ignore for zcompile
826 + zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)'
827 + zstyle ':completion:correct:' prompt 'correct to: %e'
828 +
829 + # Ignore completion functions for commands you don't have:
830 + zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'
831 +
832 + # Provide more processes in completion of programs like killall:
833 + zstyle ':completion:*:processes-names' command 'ps c -u ${USER} -o command | uniq'
834 +
835 + # complete manual by their section
836 + zstyle ':completion:*:manuals' separate-sections true
837 + zstyle ':completion:*:manuals.*' insert-sections true
838 + zstyle ':completion:*:man:*' menu yes select
839 +
840 + # Search path for sudo completion
841 + zstyle ':completion:*:sudo:*' command-path /usr/local/sbin \
842 + /usr/local/bin \
843 + /usr/sbin \
844 + /usr/bin \
845 + /sbin \
846 + /bin \
847 + /usr/X11R6/bin
848 +
849 + # provide .. as a completion
850 + zstyle ':completion:*' special-dirs ..
851 +
852 + # run rehash on completion so new installed program are found automatically:
853 + function _force_rehash () {
854 + (( CURRENT == 1 )) && rehash
855 + return 1
856 + }
857 +
858 + ## correction
859 + # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
860 + if [[ "$NOCOR" -gt 0 ]] ; then
861 + zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
862 + setopt nocorrect
863 + else
864 + # try to be smart about when to use what completer...
865 + setopt correct
866 + zstyle -e ':completion:*' completer '
867 + if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
868 + _last_try="$HISTNO$BUFFER$CURSOR"
869 + reply=(_complete _match _ignored _prefix _files)
870 + else
871 + if [[ $words[1] == (rm|mv) ]] ; then
872 + reply=(_complete _files)
873 + else
874 + reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
875 + fi
876 + fi'
877 + fi
878 +
879 + # command for process lists, the local web server details and host completion
880 + zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
881 +
882 + # Some functions, like _apt and _dpkg, are very slow. We can use a cache in
883 + # order to speed things up
884 + if [[ ${GRML_COMP_CACHING:-yes} == yes ]]; then
885 + GRML_COMP_CACHE_DIR=${GRML_COMP_CACHE_DIR:-${ZDOTDIR:-$HOME}/.cache}
886 + if [[ ! -d ${GRML_COMP_CACHE_DIR} ]]; then
887 + command mkdir -p "${GRML_COMP_CACHE_DIR}"
888 + fi
889 + zstyle ':completion:*' use-cache yes
890 + zstyle ':completion:*:complete:*' cache-path "${GRML_COMP_CACHE_DIR}"
891 + fi
892 +
893 + # host completion
894 + _etc_hosts=()
895 + _ssh_config_hosts=()
896 + _ssh_hosts=()
897 + if is42 ; then
898 + if [[ -r ~/.ssh/config ]] ; then
899 + _ssh_config_hosts=(${${(s: :)${(ps:\t:)${${(@M)${(f)"$(<$HOME/.ssh/config)"}:#Host *}#Host }}}:#*[*?]*})
900 + fi
901 +
902 + if [[ -r ~/.ssh/known_hosts ]] ; then
903 + _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*})
904 + fi
905 +
906 + if [[ -r /etc/hosts ]] && [[ "$NOETCHOSTS" -eq 0 ]] ; then
907 + : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(grep -v '^0\.0\.0\.0\|^127\.0\.0\.1\|^::1 ' /etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}}
908 + fi
909 + fi
910 +
911 + local localname
912 + localname="$(uname -n)"
913 + hosts=(
914 + "${localname}"
915 + "$_ssh_config_hosts[@]"
916 + "$_ssh_hosts[@]"
917 + "$_etc_hosts[@]"
918 + localhost
919 + )
920 + zstyle ':completion:*:hosts' hosts $hosts
921 + # TODO: so, why is this here?
922 + # zstyle '*' hosts $hosts
923 +
924 + # use generic completion system for programs not yet defined; (_gnu_generic works
925 + # with commands that provide a --help option with "standard" gnu-like output.)
926 + for compcom in cp deborphan df feh fetchipac gpasswd head hnb ipacsum mv \
927 + pal stow uname ; do
928 + [[ -z ${_comps[$compcom]} ]] && compdef _gnu_generic ${compcom}
929 + done; unset compcom
930 +
931 + # see upgrade function in this file
932 + compdef _hosts upgrade
933 + }
934 +
935 + # Keyboard setup: The following is based on the same code, we wrote for
936 + # debian's setup. It ensures the terminal is in the right mode, when zle is
937 + # active, so the values from $terminfo are valid. Therefore, this setup should
938 + # work on all systems, that have support for `terminfo'. It also requires the
939 + # zsh in use to have the `zsh/terminfo' module built.
940 + #
941 + # If you are customising your `zle-line-init()' or `zle-line-finish()'
942 + # functions, make sure you call the following utility functions in there:
943 + #
944 + # - zle-line-init(): zle-smkx
945 + # - zle-line-finish(): zle-rmkx
946 +
947 + # Use emacs-like key bindings by default:
948 + bindkey -e
949 +
950 + # Custom widgets:
951 +
952 + ## beginning-of-line OR beginning-of-buffer OR beginning of history
953 + ## by: Bart Schaefer <[email protected]>, Bernhard Tittelbach
954 + function beginning-or-end-of-somewhere () {
955 + local hno=$HISTNO
956 + if [[ ( "${LBUFFER[-1]}" == $'\n' && "${WIDGET}" == beginning-of* ) || \
957 + ( "${RBUFFER[1]}" == $'\n' && "${WIDGET}" == end-of* ) ]]; then
958 + zle .${WIDGET:s/somewhere/buffer-or-history/} "$@"
959 + else
960 + zle .${WIDGET:s/somewhere/line-hist/} "$@"
961 + if (( HISTNO != hno )); then
962 + zle .${WIDGET:s/somewhere/buffer-or-history/} "$@"
963 + fi
964 + fi
965 + }
966 + zle -N beginning-of-somewhere beginning-or-end-of-somewhere
967 + zle -N end-of-somewhere beginning-or-end-of-somewhere
968 +
969 + # add a command line to the shells history without executing it
970 + function commit-to-history () {
971 + print -rs ${(z)BUFFER}
972 + zle send-break
973 + }
974 + zle -N commit-to-history
975 +
976 + # only slash should be considered as a word separator:
977 + function slash-backward-kill-word () {
978 + local WORDCHARS="${WORDCHARS:s@/@}"
979 + # zle backward-word
980 + zle backward-kill-word
981 + }
982 + zle -N slash-backward-kill-word
983 +
984 + # a generic accept-line wrapper
985 +
986 + # This widget can prevent unwanted autocorrections from command-name
987 + # to _command-name, rehash automatically on enter and call any number
988 + # of builtin and user-defined widgets in different contexts.
989 + #
990 + # For a broader description, see:
991 + # <http://bewatermyfriend.org/posts/2007/12-26.11-50-38-tooltime.html>
992 + #
993 + # The code is imported from the file 'zsh/functions/accept-line' from
994 + # <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>, which
995 + # distributed under the same terms as zsh itself.
996 +
997 + # A newly added command will may not be found or will cause false
998 + # correction attempts, if you got auto-correction set. By setting the
999 + # following style, we force accept-line() to rehash, if it cannot
1000 + # find the first word on the command line in the $command[] hash.
1001 + zstyle ':acceptline:*' rehash true
1002 +
1003 + function Accept-Line () {
1004 + setopt localoptions noksharrays
1005 + local -a subs
1006 + local -xi aldone
1007 + local sub
1008 + local alcontext=${1:-$alcontext}
1009 +
1010 + zstyle -a ":acceptline:${alcontext}" actions subs
1011 +
1012 + (( ${#subs} < 1 )) && return 0
1013 +
1014 + (( aldone = 0 ))
1015 + for sub in ${subs} ; do
1016 + [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
1017 + zle ${sub}
1018 +
1019 + (( aldone > 0 )) && break
1020 + done
1021 + }
1022 +
1023 + function Accept-Line-getdefault () {
1024 + emulate -L zsh
1025 + local default_action
1026 +
1027 + zstyle -s ":acceptline:${alcontext}" default_action default_action
1028 + case ${default_action} in
1029 + ((accept-line|))
1030 + printf ".accept-line"
1031 + ;;
1032 + (*)
1033 + printf ${default_action}
1034 + ;;
1035 + esac
1036 + }
1037 +
1038 + function Accept-Line-HandleContext () {
1039 + zle Accept-Line
1040 +
1041 + default_action=$(Accept-Line-getdefault)
1042 + zstyle -T ":acceptline:${alcontext}" call_default \
1043 + && zle ${default_action}
1044 + }
1045 +
1046 + function accept-line () {
1047 + setopt localoptions noksharrays
1048 + local -a cmdline
1049 + local -x alcontext
1050 + local buf com fname format msg default_action
1051 +
1052 + alcontext='default'
1053 + buf="${BUFFER}"
1054 + cmdline=(${(z)BUFFER})
1055 + com="${cmdline[1]}"
1056 + fname="_${com}"
1057 +
1058 + Accept-Line 'preprocess'
1059 +
1060 + zstyle -t ":acceptline:${alcontext}" rehash \
1061 + && [[ -z ${commands[$com]} ]] \
1062 + && rehash
1063 +
1064 + if [[ -n ${com} ]] \
1065 + && [[ -n ${reswords[(r)$com]} ]] \
1066 + || [[ -n ${aliases[$com]} ]] \
1067 + || [[ -n ${functions[$com]} ]] \
1068 + || [[ -n ${builtins[$com]} ]] \
1069 + || [[ -n ${commands[$com]} ]] ; then
1070 +
1071 + # there is something sensible to execute, just do it.
1072 + alcontext='normal'
1073 + Accept-Line-HandleContext
1074 +
1075 + return
1076 + fi
1077 +
1078 + if [[ -o correct ]] \
1079 + || [[ -o correctall ]] \
1080 + && [[ -n ${functions[$fname]} ]] ; then
1081 +
1082 + # nothing there to execute but there is a function called
1083 + # _command_name; a completion widget. Makes no sense to
1084 + # call it on the commandline, but the correct{,all} options
1085 + # will ask for it nevertheless, so warn the user.
1086 + if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
1087 + # Okay, we warned the user before, he called us again,
1088 + # so have it his way.
1089 + alcontext='force'
1090 + Accept-Line-HandleContext
1091 +
1092 + return
1093 + fi
1094 +
1095 + if zstyle -t ":acceptline:${alcontext}" nocompwarn ; then
1096 + alcontext='normal'
1097 + Accept-Line-HandleContext
1098 + else
1099 + # prepare warning message for the user, configurable via zstyle.
1100 + zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
1101 +
1102 + if [[ -z ${msg} ]] ; then
1103 + msg="%c will not execute and completion %f exists."
1104 + fi
1105 +
1106 + zformat -f msg "${msg}" "c:${com}" "f:${fname}"
1107 +
1108 + zle -M -- "${msg}"
1109 + fi
1110 + return
1111 + elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
1112 + # If we are here, the commandline contains something that is not
1113 + # executable, which is neither subject to _command_name correction
1114 + # and is not empty. might be a variable assignment
1115 + alcontext='misc'
1116 + Accept-Line-HandleContext
1117 +
1118 + return
1119 + fi
1120 +
1121 + # If we got this far, the commandline only contains whitespace, or is empty.
1122 + alcontext='empty'
1123 + Accept-Line-HandleContext
1124 + }
1125 +
1126 + zle -N accept-line
1127 + zle -N Accept-Line
1128 + zle -N Accept-Line-HandleContext
1129 +
1130 + # power completion / abbreviation expansion / buffer expansion
1131 + # see http://zshwiki.org/home/examples/zleiab for details
1132 + # less risky than the global aliases but powerful as well
1133 + # just type the abbreviation key and afterwards 'ctrl-x .' to expand it
1134 + declare -A abk
1135 + setopt extendedglob
1136 + setopt interactivecomments
1137 + abk=(
1138 + # key # value (#d additional doc string)
1139 + #A# start
1140 + '...' '../..'
1141 + '....' '../../..'
1142 + 'BG' '& exit'
1143 + 'C' '| wc -l'
1144 + 'G' '|& grep '${grep_options:+"${grep_options[*]}"}
1145 + 'H' '| head'
1146 + 'Hl' ' --help |& less -r' #d (Display help in pager)
1147 + 'L' '| less'
1148 + 'LL' '|& less -r'
1149 + 'M' '| most'
1150 + 'N' '&>/dev/null' #d (No Output)
1151 + 'R' '| tr A-z N-za-m' #d (ROT13)
1152 + 'SL' '| sort | less'
1153 + 'S' '| sort -u'
1154 + 'T' '| tail'
1155 + 'V' '|& vim -'
1156 + #A# end
1157 + 'co' './configure && make && sudo make install'
1158 + )
1159 +
1160 + function zleiab () {
1161 + emulate -L zsh
1162 + setopt extendedglob
1163 + local MATCH
1164 +
1165 + LBUFFER=${LBUFFER%%(#m)[.\-+:|_a-zA-Z0-9]#}
1166 + LBUFFER+=${abk[$MATCH]:-$MATCH}
1167 + }
1168 +
1169 + zle -N zleiab
1170 +
1171 + function help-show-abk () {
1172 + zle -M "$(print "Available abbreviations for expansion:"; print -a -C 2 ${(kv)abk})"
1173 + }
1174 +
1175 + zle -N help-show-abk
1176 +
1177 + # press "ctrl-x d" to insert the actual date in the form yyyy-mm-dd
1178 + function insert-datestamp () { LBUFFER+=${(%):-'%D{%Y-%m-%d}'}; }
1179 + zle -N insert-datestamp
1180 +
1181 + # press esc-m for inserting last typed word again (thanks to caphuso!)
1182 + function insert-last-typed-word () { zle insert-last-word -- 0 -1 };
1183 + zle -N insert-last-typed-word;
1184 +
1185 + function grml-zsh-fg () {
1186 + if (( ${#jobstates} )); then
1187 + zle .push-input
1188 + [[ -o hist_ignore_space ]] && BUFFER=' ' || BUFFER=''
1189 + BUFFER="${BUFFER}fg"
1190 + zle .accept-line
1191 + else
1192 + zle -M 'No background jobs. Doing nothing.'
1193 + fi
1194 + }
1195 + zle -N grml-zsh-fg
1196 +
1197 + # run command line as user root via sudo:
1198 + function sudo-command-line () {
1199 + [[ -z $BUFFER ]] && zle up-history
1200 + local cmd="sudo "
1201 + if [[ ${BUFFER} == ${cmd}* ]]; then
1202 + CURSOR=$(( CURSOR-${#cmd} ))
1203 + BUFFER="${BUFFER#$cmd}"
1204 + else
1205 + BUFFER="${cmd}${BUFFER}"
1206 + CURSOR=$(( CURSOR+${#cmd} ))
1207 + fi
1208 + zle reset-prompt
1209 + }
1210 + zle -N sudo-command-line
1211 +
1212 + ### jump behind the first word on the cmdline.
1213 + ### useful to add options.
1214 + function jump_after_first_word () {
1215 + local words
1216 + words=(${(z)BUFFER})
1217 +
1218 + if (( ${#words} <= 1 )) ; then
1219 + CURSOR=${#BUFFER}
1220 + else
1221 + CURSOR=${#${words[1]}}
1222 + fi
1223 + }
1224 + zle -N jump_after_first_word
1225 +
1226 + #f5# Create directory under cursor or the selected area
1227 + function inplaceMkDirs () {
1228 + # Press ctrl-xM to create the directory under the cursor or the selected area.
1229 + # To select an area press ctrl-@ or ctrl-space and use the cursor.
1230 + # Use case: you type "mv abc ~/testa/testb/testc/" and remember that the
1231 + # directory does not exist yet -> press ctrl-XM and problem solved
1232 + local PATHTOMKDIR
1233 + if ((REGION_ACTIVE==1)); then
1234 + local F=$MARK T=$CURSOR
1235 + if [[ $F -gt $T ]]; then
1236 + F=${CURSOR}
1237 + T=${MARK}
1238 + fi
1239 + # get marked area from buffer and eliminate whitespace
1240 + PATHTOMKDIR=${BUFFER[F+1,T]%%[[:space:]]##}
1241 + PATHTOMKDIR=${PATHTOMKDIR##[[:space:]]##}
1242 + else
1243 + local bufwords iword
1244 + bufwords=(${(z)LBUFFER})
1245 + iword=${#bufwords}
1246 + bufwords=(${(z)BUFFER})
1247 + PATHTOMKDIR="${(Q)bufwords[iword]}"
1248 + fi
1249 + [[ -z "${PATHTOMKDIR}" ]] && return 1
1250 + PATHTOMKDIR=${~PATHTOMKDIR}
1251 + if [[ -e "${PATHTOMKDIR}" ]]; then
1252 + zle -M " path already exists, doing nothing"
1253 + else
1254 + zle -M "$(mkdir -p -v "${PATHTOMKDIR}")"
1255 + zle end-of-line
1256 + fi
1257 + }
1258 +
1259 + zle -N inplaceMkDirs
1260 +
1261 + #v1# set number of lines to display per page
1262 + HELP_LINES_PER_PAGE=20
1263 + #v1# set location of help-zle cache file
1264 + HELP_ZLE_CACHE_FILE=~/.cache/zsh_help_zle_lines.zsh
1265 + # helper function for help-zle, actually generates the help text
1266 + function help_zle_parse_keybindings () {
1267 + emulate -L zsh
1268 + setopt extendedglob
1269 + unsetopt ksharrays #indexing starts at 1
1270 +
1271 + #v1# choose files that help-zle will parse for keybindings
1272 + ((${+HELPZLE_KEYBINDING_FILES})) || HELPZLE_KEYBINDING_FILES=( /etc/zsh/zshrc ~/.zshrc.pre ~/.zshrc ~/.zshrc.local )
1273 +
1274 + if [[ -r $HELP_ZLE_CACHE_FILE ]]; then
1275 + local load_cache=0
1276 + local f
1277 + for f ($HELPZLE_KEYBINDING_FILES) [[ $f -nt $HELP_ZLE_CACHE_FILE ]] && load_cache=1
1278 + [[ $load_cache -eq 0 ]] && . $HELP_ZLE_CACHE_FILE && return
1279 + fi
1280 +
1281 + #fill with default keybindings, possibly to be overwritten in a file later
1282 + #Note that due to zsh inconsistency on escaping assoc array keys, we encase the key in '' which we will remove later
1283 + local -A help_zle_keybindings
1284 + help_zle_keybindings['<Ctrl>@']="set MARK"
1285 + help_zle_keybindings['<Ctrl>x<Ctrl>j']="vi-join lines"
1286 + help_zle_keybindings['<Ctrl>x<Ctrl>b']="jump to matching brace"
1287 + help_zle_keybindings['<Ctrl>x<Ctrl>u']="undo"
1288 + help_zle_keybindings['<Ctrl>_']="undo"
1289 + help_zle_keybindings['<Ctrl>x<Ctrl>f<c>']="find <c> in cmdline"
1290 + help_zle_keybindings['<Ctrl>a']="goto beginning of line"
1291 + help_zle_keybindings['<Ctrl>e']="goto end of line"
1292 + help_zle_keybindings['<Ctrl>t']="transpose charaters"
1293 + help_zle_keybindings['<Alt>t']="transpose words"
1294 + help_zle_keybindings['<Alt>s']="spellcheck word"
1295 + help_zle_keybindings['<Ctrl>k']="backward kill buffer"
1296 + help_zle_keybindings['<Ctrl>u']="forward kill buffer"
1297 + help_zle_keybindings['<Ctrl>y']="insert previously killed word/string"
1298 + help_zle_keybindings["<Alt>'"]="quote line"
1299 + help_zle_keybindings['<Alt>"']="quote from mark to cursor"
1300 + help_zle_keybindings['<Alt><arg>']="repeat next cmd/char <arg> times (<Alt>-<Alt>1<Alt>0a -> -10 times 'a')"
1301 + help_zle_keybindings['<Alt>u']="make next word Uppercase"
1302 + help_zle_keybindings['<Alt>l']="make next word lowercase"
1303 + help_zle_keybindings['<Ctrl>xG']="preview expansion under cursor"
1304 + help_zle_keybindings['<Alt>q']="push current CL into background, freeing it. Restore on next CL"
1305 + help_zle_keybindings['<Alt>.']="insert (and interate through) last word from prev CLs"
1306 + help_zle_keybindings['<Alt>,']="complete word from newer history (consecutive hits)"
1307 + help_zle_keybindings['<Alt>m']="repeat last typed word on current CL"
1308 + help_zle_keybindings['<Ctrl>v']="insert next keypress symbol literally (e.g. for bindkey)"
1309 + help_zle_keybindings['!!:n*<Tab>']="insert last n arguments of last command"
1310 + help_zle_keybindings['!!:n-<Tab>']="insert arguments n..N-2 of last command (e.g. mv s s d)"
1311 + help_zle_keybindings['<Alt>h']="show help/manpage for current command"
1312 +
1313 + #init global variables
1314 + unset help_zle_lines help_zle_sln
1315 + typeset -g -a help_zle_lines
1316 + typeset -g help_zle_sln=1
1317 +
1318 + local k v f cline
1319 + local lastkeybind_desc contents #last description starting with #k# that we found
1320 + local num_lines_elapsed=0 #number of lines between last description and keybinding
1321 + #search config files in the order they a called (and thus the order in which they overwrite keybindings)
1322 + for f in $HELPZLE_KEYBINDING_FILES; do
1323 + [[ -r "$f" ]] || continue #not readable ? skip it
1324 + contents="$(<$f)"
1325 + for cline in "${(f)contents}"; do
1326 + #zsh pattern: matches lines like: #k# ..............
1327 + if [[ "$cline" == (#s)[[:space:]]#\#k\#[[:space:]]##(#b)(*)[[:space:]]#(#e) ]]; then
1328 + lastkeybind_desc="$match[*]"
1329 + num_lines_elapsed=0
1330 + #zsh pattern: matches lines that set a keybinding using bind2map, bindkey or compdef -k
1331 + # ignores lines that are commentend out
1332 + # grabs first in '' or "" enclosed string with length between 1 and 6 characters
1333 + elif [[ "$cline" == [^#]#(bind2maps[[:space:]](*)-s|bindkey|compdef -k)[[:space:]](*)(#b)(\"((?)(#c1,6))\"|\'((?)(#c1,6))\')(#B)(*) ]]; then
1334 + #description previously found ? description not more than 2 lines away ? keybinding not empty ?
1335 + if [[ -n $lastkeybind_desc && $num_lines_elapsed -lt 2 && -n $match[1] ]]; then
1336 + #substitute keybinding string with something readable
1337 + k=${${${${${${${match[1]/\\e\^h/<Alt><BS>}/\\e\^\?/<Alt><BS>}/\\e\[5~/<PageUp>}/\\e\[6~/<PageDown>}//(\\e|\^\[)/<Alt>}//\^/<Ctrl>}/3~/<Alt><Del>}
1338 + #put keybinding in assoc array, possibly overwriting defaults or stuff found in earlier files
1339 + #Note that we are extracting the keybinding-string including the quotes (see Note at beginning)
1340 + help_zle_keybindings[${k}]=$lastkeybind_desc
1341 + fi
1342 + lastkeybind_desc=""
1343 + else
1344 + ((num_lines_elapsed++))
1345 + fi
1346 + done
1347 + done
1348 + unset contents
1349 + #calculate length of keybinding column
1350 + local kstrlen=0
1351 + for k (${(k)help_zle_keybindings[@]}) ((kstrlen < ${#k})) && kstrlen=${#k}
1352 + #convert the assoc array into preformated lines, which we are able to sort
1353 + for k v in ${(kv)help_zle_keybindings[@]}; do
1354 + #pad keybinding-string to kstrlen chars and remove outermost characters (i.e. the quotes)
1355 + help_zle_lines+=("${(r:kstrlen:)k[2,-2]}${v}")
1356 + done
1357 + #sort lines alphabetically
1358 + help_zle_lines=("${(i)help_zle_lines[@]}")
1359 + [[ -d ${HELP_ZLE_CACHE_FILE:h} ]] || mkdir -p "${HELP_ZLE_CACHE_FILE:h}"
1360 + echo "help_zle_lines=(${(q)help_zle_lines[@]})" >| $HELP_ZLE_CACHE_FILE
1361 + zcompile $HELP_ZLE_CACHE_FILE
1362 + }
1363 + typeset -g help_zle_sln
1364 + typeset -g -a help_zle_lines
1365 +
1366 + # Provides (partially autogenerated) help on keybindings and the zsh line editor
1367 + function help-zle () {
1368 + emulate -L zsh
1369 + unsetopt ksharrays #indexing starts at 1
1370 + #help lines already generated ? no ? then do it
1371 + [[ ${+functions[help_zle_parse_keybindings]} -eq 1 ]] && {help_zle_parse_keybindings && unfunction help_zle_parse_keybindings}
1372 + #already displayed all lines ? go back to the start
1373 + [[ $help_zle_sln -gt ${#help_zle_lines} ]] && help_zle_sln=1
1374 + local sln=$help_zle_sln
1375 + #note that help_zle_sln is a global var, meaning we remember the last page we viewed
1376 + help_zle_sln=$((help_zle_sln + HELP_LINES_PER_PAGE))
1377 + zle -M "${(F)help_zle_lines[sln,help_zle_sln-1]}"
1378 + }
1379 + zle -N help-zle
1380 +
1381 + ## complete word from currently visible Screen or Tmux buffer.
1382 + if check_com -c screen || check_com -c tmux; then
1383 + function _complete_screen_display () {
1384 +
1385 + local TMPFILE=$(mktemp)
1386 + local -U -a _screen_display_wordlist
1387 + trap "rm -f $TMPFILE" EXIT
1388 +
1389 + # fill array with contents from screen hardcopy
1390 + if ((${+TMUX})); then
1391 + #works, but crashes tmux below version 1.4
1392 + #luckily tmux -V option to ask for version, was also added in 1.4
1393 + tmux -V &>/dev/null || return
1394 + tmux -q capture-pane -b 0 \; save-buffer -b 0 $TMPFILE \; delete-buffer -b 0
1395 + else
1396 + [[ "$TERM" != "screen" ]] && return
1397 + screen -X hardcopy $TMPFILE
1398 + # screen sucks, it dumps in latin1, apparently always. so recode it
1399 + # to system charset
1400 + check_com recode && recode latin1 $TMPFILE
1401 + fi
1402 + _screen_display_wordlist=( ${(QQ)$(<$TMPFILE)} )
1403 + # remove PREFIX to be completed from that array
1404 + _screen_display_wordlist[${_screen_display_wordlist[(i)$PREFIX]}]=""
1405 + compadd -a _screen_display_wordlist
1406 + }
1407 + #m# k CTRL-x\,\,\,S Complete word from GNU screen buffer
1408 + bindkey -r "^xS"
1409 + compdef -k _complete_screen_display complete-word '^xS'
1410 + fi
1411 +
1412 + # Load a few more functions and tie them to widgets, so they can be bound:
1413 +
1414 + function zrcautozle () {
1415 + emulate -L zsh
1416 + local fnc=$1
1417 + zrcautoload $fnc && zle -N $fnc
1418 + }
1419 +
1420 + function zrcgotwidget () {
1421 + (( ${+widgets[$1]} ))
1422 + }
1423 +
1424 + function zrcgotkeymap () {
1425 + [[ -n ${(M)keymaps:#$1} ]]
1426 + }
1427 +
1428 + zrcautozle insert-files
1429 + zrcautozle edit-command-line
1430 + zrcautozle insert-unicode-char
1431 + if zrcautoload history-search-end; then
1432 + zle -N history-beginning-search-backward-end history-search-end
1433 + zle -N history-beginning-search-forward-end history-search-end
1434 + fi
1435 + zle -C hist-complete complete-word _generic
1436 + zstyle ':completion:hist-complete:*' completer _history
1437 +
1438 + # The actual terminal setup hooks and bindkey-calls:
1439 +
1440 + # An array to note missing features to ease diagnosis in case of problems.
1441 + typeset -ga grml_missing_features
1442 +
1443 + function zrcbindkey () {
1444 + if (( ARGC )) && zrcgotwidget ${argv[-1]}; then
1445 + bindkey "$@"
1446 + fi
1447 + }
1448 +
1449 + function bind2maps () {
1450 + local i sequence widget
1451 + local -a maps
1452 +
1453 + while [[ "$1" != "--" ]]; do
1454 + maps+=( "$1" )
1455 + shift
1456 + done
1457 + shift
1458 +
1459 + if [[ "$1" == "-s" ]]; then
1460 + shift
1461 + sequence="$1"
1462 + else
1463 + sequence="${key[$1]}"
1464 + fi
1465 + widget="$2"
1466 +
1467 + [[ -z "$sequence" ]] && return 1
1468 +
1469 + for i in "${maps[@]}"; do
1470 + zrcbindkey -M "$i" "$sequence" "$widget"
1471 + done
1472 + }
1473 +
1474 + if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
1475 + function zle-smkx () {
1476 + emulate -L zsh
1477 + printf '%s' ${terminfo[smkx]}
1478 + }
1479 + function zle-rmkx () {
1480 + emulate -L zsh
1481 + printf '%s' ${terminfo[rmkx]}
1482 + }
1483 + function zle-line-init () {
1484 + zle-smkx
1485 + }
1486 + function zle-line-finish () {
1487 + zle-rmkx
1488 + }
1489 + zle -N zle-line-init
1490 + zle -N zle-line-finish
1491 + else
1492 + for i in {s,r}mkx; do
1493 + (( ${+terminfo[$i]} )) || grml_missing_features+=($i)
1494 + done
1495 + unset i
1496 + fi
1497 +
1498 + typeset -A key
1499 + key=(
1500 + Home "${terminfo[khome]}"
1501 + End "${terminfo[kend]}"
1502 + Insert "${terminfo[kich1]}"
1503 + Delete "${terminfo[kdch1]}"
1504 + Up "${terminfo[kcuu1]}"
1505 + Down "${terminfo[kcud1]}"
1506 + Left "${terminfo[kcub1]}"
1507 + Right "${terminfo[kcuf1]}"
1508 + PageUp "${terminfo[kpp]}"
1509 + PageDown "${terminfo[knp]}"
1510 + BackTab "${terminfo[kcbt]}"
1511 + )
1512 +
1513 + # Guidelines for adding key bindings:
1514 + #
1515 + # - Do not add hardcoded escape sequences, to enable non standard key
1516 + # combinations such as Ctrl-Meta-Left-Cursor. They are not easily portable.
1517 + #
1518 + # - Adding Ctrl characters, such as '^b' is okay; note that '^b' and '^B' are
1519 + # the same key.
1520 + #
1521 + # - All keys from the $key[] mapping are obviously okay.
1522 + #
1523 + # - Most terminals send "ESC x" when Meta-x is pressed. Thus, sequences like
1524 + # '\ex' are allowed in here as well.
1525 +
1526 + bind2maps emacs -- Home beginning-of-somewhere
1527 + bind2maps viins vicmd -- Home vi-beginning-of-line
1528 + bind2maps emacs -- End end-of-somewhere
1529 + bind2maps viins vicmd -- End vi-end-of-line
1530 + bind2maps emacs viins -- Insert overwrite-mode
1531 + bind2maps vicmd -- Insert vi-insert
1532 + bind2maps emacs -- Delete delete-char
1533 + bind2maps viins vicmd -- Delete vi-delete-char
1534 + bind2maps emacs viins vicmd -- Up up-line-or-search
1535 + bind2maps emacs viins vicmd -- Down down-line-or-search
1536 + bind2maps emacs -- Left backward-char
1537 + bind2maps viins vicmd -- Left vi-backward-char
1538 + bind2maps emacs -- Right forward-char
1539 + bind2maps viins vicmd -- Right vi-forward-char
1540 + #k# Perform abbreviation expansion
1541 + bind2maps emacs viins -- -s '^x.' zleiab
1542 + #k# Display list of abbreviations that would expand
1543 + bind2maps emacs viins -- -s '^xb' help-show-abk
1544 + #k# mkdir -p <dir> from string under cursor or marked area
1545 + bind2maps emacs viins -- -s '^xM' inplaceMkDirs
1546 + #k# display help for keybindings and ZLE
1547 + bind2maps emacs viins -- -s '^xz' help-zle
1548 + #k# Insert files and test globbing
1549 + bind2maps emacs viins -- -s "^xf" insert-files
1550 + #k# Edit the current line in \kbd{\$EDITOR}
1551 + bind2maps emacs viins -- -s '\ee' edit-command-line
1552 + #k# search history backward for entry beginning with typed text
1553 + bind2maps emacs viins -- -s '^xp' history-beginning-search-backward-end
1554 + #k# search history forward for entry beginning with typed text
1555 + bind2maps emacs viins -- -s '^xP' history-beginning-search-forward-end
1556 + #k# search history backward for entry beginning with typed text
1557 + bind2maps emacs viins -- PageUp history-beginning-search-backward-end
1558 + #k# search history forward for entry beginning with typed text
1559 + bind2maps emacs viins -- PageDown history-beginning-search-forward-end
1560 + bind2maps emacs viins -- -s "^x^h" commit-to-history
1561 + #k# Kill left-side word or everything up to next slash
1562 + bind2maps emacs viins -- -s '\ev' slash-backward-kill-word
1563 + #k# Kill left-side word or everything up to next slash
1564 + bind2maps emacs viins -- -s '\e^h' slash-backward-kill-word
1565 + #k# Kill left-side word or everything up to next slash
1566 + bind2maps emacs viins -- -s '\e^?' slash-backward-kill-word
1567 + # Do history expansion on space:
1568 + bind2maps emacs viins -- -s ' ' magic-space
1569 + #k# Trigger menu-complete
1570 + bind2maps emacs viins -- -s '\ei' menu-complete # menu completion via esc-i
1571 + #k# Insert a timestamp on the command line (yyyy-mm-dd)
1572 + bind2maps emacs viins -- -s '^xd' insert-datestamp
1573 + #k# Insert last typed word
1574 + bind2maps emacs viins -- -s "\em" insert-last-typed-word
1575 + #k# A smart shortcut for \kbd{fg<enter>}
1576 + bind2maps emacs viins -- -s '^z' grml-zsh-fg
1577 + #k# prepend the current command with "sudo"
1578 + bind2maps emacs viins -- -s "^os" sudo-command-line
1579 + #k# jump to after first word (for adding options)
1580 + bind2maps emacs viins -- -s '^x1' jump_after_first_word
1581 + #k# complete word from history with menu
1582 + bind2maps emacs viins -- -s "^x^x" hist-complete
1583 +
1584 + # insert unicode character
1585 + # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
1586 + # See for example http://unicode.org/charts/ for unicode characters code
1587 + #k# Insert Unicode character
1588 + bind2maps emacs viins -- -s '^xi' insert-unicode-char
1589 +
1590 + # use the new *-pattern-* widgets for incremental history search
1591 + if zrcgotwidget history-incremental-pattern-search-backward; then
1592 + for seq wid in '^r' history-incremental-pattern-search-backward \
1593 + '^s' history-incremental-pattern-search-forward
1594 + do
1595 + bind2maps emacs viins vicmd -- -s $seq $wid
1596 + done
1597 + builtin unset -v seq wid
1598 + fi
1599 +
1600 + if zrcgotkeymap menuselect; then
1601 + #m# k Shift-tab Perform backwards menu completion
1602 + bind2maps menuselect -- BackTab reverse-menu-complete
1603 +
1604 + #k# menu selection: pick item but stay in the menu
1605 + bind2maps menuselect -- -s '\e^M' accept-and-menu-complete
1606 + # also use + and INSERT since it's easier to press repeatedly
1607 + bind2maps menuselect -- -s '+' accept-and-menu-complete
1608 + bind2maps menuselect -- Insert accept-and-menu-complete
1609 +
1610 + # accept a completion and try to complete again by using menu
1611 + # completion; very useful with completing directories
1612 + # by using 'undo' one's got a simple file browser
1613 + bind2maps menuselect -- -s '^o' accept-and-infer-next-history
1614 + fi
1615 +
1616 + # Finally, here are still a few hardcoded escape sequences; Special sequences
1617 + # like Ctrl-<Cursor-key> etc do suck a fair bit, because they are not
1618 + # standardised and most of the time are not available in a terminals terminfo
1619 + # entry.
1620 + #
1621 + # While we do not encourage adding bindings like these, we will keep these for
1622 + # backward compatibility.
1623 +
1624 + ## use Ctrl-left-arrow and Ctrl-right-arrow for jumping to word-beginnings on
1625 + ## the command line.
1626 + # URxvt sequences:
1627 + bind2maps emacs viins vicmd -- -s '\eOc' forward-word
1628 + bind2maps emacs viins vicmd -- -s '\eOd' backward-word
1629 + # These are for xterm:
1630 + bind2maps emacs viins vicmd -- -s '\e[1;5C' forward-word
1631 + bind2maps emacs viins vicmd -- -s '\e[1;5D' backward-word
1632 + ## the same for alt-left-arrow and alt-right-arrow
1633 + # URxvt again:
1634 + bind2maps emacs viins vicmd -- -s '\e\e[C' forward-word
1635 + bind2maps emacs viins vicmd -- -s '\e\e[D' backward-word
1636 + # Xterm again:
1637 + bind2maps emacs viins vicmd -- -s '^[[1;3C' forward-word
1638 + bind2maps emacs viins vicmd -- -s '^[[1;3D' backward-word
1639 + # Also try ESC Left/Right:
1640 + bind2maps emacs viins vicmd -- -s '\e'${key[Right]} forward-word
1641 + bind2maps emacs viins vicmd -- -s '\e'${key[Left]} backward-word
1642 +
1643 + # autoloading
1644 +
1645 + zrcautoload zmv
1646 + zrcautoload zed
1647 +
1648 + # we don't want to quote/espace URLs on our own...
1649 + # if autoload -U url-quote-magic ; then
1650 + # zle -N self-insert url-quote-magic
1651 + # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
1652 + # else
1653 + # print 'Notice: no url-quote-magic available :('
1654 + # fi
1655 + if is51 ; then
1656 + # url-quote doesn't work without bracketed-paste-magic since Zsh 5.1
1657 + alias url-quote='autoload -U bracketed-paste-magic url-quote-magic;
1658 + zle -N bracketed-paste bracketed-paste-magic; zle -N self-insert url-quote-magic'
1659 + else
1660 + alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
1661 + fi
1662 +
1663 + #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
1664 + alias run-help >&/dev/null && unalias run-help
1665 + for rh in run-help{,-git,-ip,-openssl,-p4,-sudo,-svk,-svn}; do
1666 + zrcautoload $rh
1667 + done; unset rh
1668 +
1669 + # command not found handling
1670 +
1671 + (( ${COMMAND_NOT_FOUND} == 1 )) &&
1672 + function command_not_found_handler () {
1673 + emulate -L zsh
1674 + if [[ -x ${GRML_ZSH_CNF_HANDLER} ]] ; then
1675 + ${GRML_ZSH_CNF_HANDLER} $1
1676 + fi
1677 + return 1
1678 + }
1679 +
1680 + # history
1681 +
1682 + #v#
1683 + HISTFILE=${HISTFILE:-${ZDOTDIR:-${HOME}}/.zsh_history}
1684 + isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
1685 + isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
1686 +
1687 + # dirstack handling
1688 +
1689 + DIRSTACKSIZE=${DIRSTACKSIZE:-20}
1690 + DIRSTACKFILE=${DIRSTACKFILE:-${ZDOTDIR:-${HOME}}/.zdirs}
1691 +
1692 + if zstyle -T ':grml:chpwd:dirstack' enable; then
1693 + typeset -gaU GRML_PERSISTENT_DIRSTACK
1694 + function grml_dirstack_filter () {
1695 + local -a exclude
1696 + local filter entry
1697 + if zstyle -s ':grml:chpwd:dirstack' filter filter; then
1698 + $filter $1 && return 0
1699 + fi
1700 + if zstyle -a ':grml:chpwd:dirstack' exclude exclude; then
1701 + for entry in "${exclude[@]}"; do
1702 + [[ $1 == ${~entry} ]] && return 0
1703 + done
1704 + fi
1705 + return 1
1706 + }
1707 +
1708 + function chpwd () {
1709 + (( ZSH_SUBSHELL )) && return
1710 + (( $DIRSTACKSIZE <= 0 )) && return
1711 + [[ -z $DIRSTACKFILE ]] && return
1712 + grml_dirstack_filter $PWD && return
1713 + GRML_PERSISTENT_DIRSTACK=(
1714 + $PWD "${(@)GRML_PERSISTENT_DIRSTACK[1,$DIRSTACKSIZE]}"
1715 + )
1716 + builtin print -l ${GRML_PERSISTENT_DIRSTACK} >! ${DIRSTACKFILE}
1717 + }
1718 +
1719 + if [[ -f ${DIRSTACKFILE} ]]; then
1720 + # Enabling NULL_GLOB via (N) weeds out any non-existing
1721 + # directories from the saved dir-stack file.
1722 + dirstack=( ${(f)"$(< $DIRSTACKFILE)"}(N) )
1723 + # "cd -" won't work after login by just setting $OLDPWD, so
1724 + [[ -d $dirstack[1] ]] && cd -q $dirstack[1] && cd -q $OLDPWD
1725 + fi
1726 +
1727 + if zstyle -t ':grml:chpwd:dirstack' filter-on-load; then
1728 + for i in "${dirstack[@]}"; do
1729 + if ! grml_dirstack_filter "$i"; then
1730 + GRML_PERSISTENT_DIRSTACK=(
1731 + "${GRML_PERSISTENT_DIRSTACK[@]}"
1732 + $i
1733 + )
1734 + fi
1735 + done
1736 + else
1737 + GRML_PERSISTENT_DIRSTACK=( "${dirstack[@]}" )
1738 + fi
1739 + fi
1740 +
1741 + # directory based profiles
1742 +
1743 + if is433 ; then
1744 +
1745 + # chpwd_profiles(): Directory Profiles, Quickstart:
1746 + #
1747 + # In .zshrc.local:
1748 + #
1749 + # zstyle ':chpwd:profiles:/usr/src/grml(|/|/*)' profile grml
1750 + # zstyle ':chpwd:profiles:/usr/src/debian(|/|/*)' profile debian
1751 + # chpwd_profiles
1752 + #
1753 + # For details see the `grmlzshrc.5' manual page.
1754 + function chpwd_profiles () {
1755 + local profile context
1756 + local -i reexecute
1757 +
1758 + context=":chpwd:profiles:$PWD"
1759 + zstyle -s "$context" profile profile || profile='default'
1760 + zstyle -T "$context" re-execute && reexecute=1 || reexecute=0
1761 +
1762 + if (( ${+parameters[CHPWD_PROFILE]} == 0 )); then
1763 + typeset -g CHPWD_PROFILE
1764 + local CHPWD_PROFILES_INIT=1
1765 + (( ${+functions[chpwd_profiles_init]} )) && chpwd_profiles_init
1766 + elif [[ $profile != $CHPWD_PROFILE ]]; then
1767 + (( ${+functions[chpwd_leave_profile_$CHPWD_PROFILE]} )) \
1768 + && chpwd_leave_profile_${CHPWD_PROFILE}
1769 + fi
1770 + if (( reexecute )) || [[ $profile != $CHPWD_PROFILE ]]; then
1771 + (( ${+functions[chpwd_profile_$profile]} )) && chpwd_profile_${profile}
1772 + fi
1773 +
1774 + CHPWD_PROFILE="${profile}"
1775 + return 0
1776 + }
1777 +
1778 + chpwd_functions=( ${chpwd_functions} chpwd_profiles )
1779 +
1780 + fi # is433
1781 +
1782 + # Prompt setup for grml:
1783 +
1784 + # set colors for use in prompts (modern zshs allow for the use of %F{red}foo%f
1785 + # in prompts to get a red "foo" embedded, but it's good to keep these for
1786 + # backwards compatibility).
1787 + if is437; then
1788 + BLUE="%F{blue}"
1789 + RED="%F{red}"
1790 + GREEN="%F{green}"
1791 + CYAN="%F{cyan}"
1792 + MAGENTA="%F{magenta}"
1793 + YELLOW="%F{yellow}"
1794 + WHITE="%F{white}"
1795 + NO_COLOR="%f"
1796 + elif zrcautoload colors && colors 2>/dev/null ; then
1797 + BLUE="%{${fg[blue]}%}"
1798 + RED="%{${fg_bold[red]}%}"
1799 + GREEN="%{${fg[green]}%}"
1800 + CYAN="%{${fg[cyan]}%}"
1801 + MAGENTA="%{${fg[magenta]}%}"
1802 + YELLOW="%{${fg[yellow]}%}"
1803 + WHITE="%{${fg[white]}%}"
1804 + NO_COLOR="%{${reset_color}%}"
1805 + else
1806 + BLUE=$'%{\e[1;34m%}'
1807 + RED=$'%{\e[1;31m%}'
1808 + GREEN=$'%{\e[1;32m%}'
1809 + CYAN=$'%{\e[1;36m%}'
1810 + WHITE=$'%{\e[1;37m%}'
1811 + MAGENTA=$'%{\e[1;35m%}'
1812 + YELLOW=$'%{\e[1;33m%}'
1813 + NO_COLOR=$'%{\e[0m%}'
1814 + fi
1815 +
1816 + # First, the easy ones: PS2..4:
1817 +
1818 + # secondary prompt, printed when the shell needs more information to complete a
1819 + # command.
1820 + PS2='\`%_> '
1821 + # selection prompt used within a select loop.
1822 + PS3='?# '
1823 + # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
1824 + PS4='+%N:%i:%_> '
1825 +
1826 + # Some additional features to use with our prompt:
1827 + #
1828 + # - battery status
1829 + # - debian_chroot
1830 + # - vcs_info setup and version specific fixes
1831 +
1832 + # display battery status on right side of prompt using 'GRML_DISPLAY_BATTERY=1' in .zshrc.pre
1833 +
1834 + function battery () {
1835 + if [[ $GRML_DISPLAY_BATTERY -gt 0 ]] ; then
1836 + if islinux ; then
1837 + batterylinux
1838 + elif isopenbsd ; then
1839 + batteryopenbsd
1840 + elif isfreebsd ; then
1841 + batteryfreebsd
1842 + elif isdarwin ; then
1843 + batterydarwin
1844 + else
1845 + #not yet supported
1846 + GRML_DISPLAY_BATTERY=0
1847 + fi
1848 + fi
1849 + }
1850 +
1851 + function batterylinux () {
1852 + GRML_BATTERY_LEVEL=''
1853 + local batteries bat capacity
1854 + batteries=( /sys/class/power_supply/BAT*(N) )
1855 + if (( $#batteries > 0 )) ; then
1856 + for bat in $batteries ; do
1857 + if [[ -e $bat/capacity ]]; then
1858 + capacity=$(< $bat/capacity)
1859 + else
1860 + typeset -F energy_full=$(< $bat/energy_full)
1861 + typeset -F energy_now=$(< $bat/energy_now)
1862 + typeset -i capacity=$(( 100 * $energy_now / $energy_full))
1863 + fi
1864 + case $(< $bat/status) in
1865 + Charging)
1866 + GRML_BATTERY_LEVEL+=" ^"
1867 + ;;
1868 + Discharging)
1869 + if (( capacity < 20 )) ; then
1870 + GRML_BATTERY_LEVEL+=" !v"
1871 + else
1872 + GRML_BATTERY_LEVEL+=" v"
1873 + fi
1874 + ;;
1875 + *) # Full, Unknown
1876 + GRML_BATTERY_LEVEL+=" ="
1877 + ;;
1878 + esac
1879 + GRML_BATTERY_LEVEL+="${capacity}%%"
1880 + done
1881 + fi
1882 + }
1883 +
1884 + function batteryopenbsd () {
1885 + GRML_BATTERY_LEVEL=''
1886 + local bat batfull batwarn batnow num
1887 + for num in 0 1 ; do
1888 + bat=$(sysctl -n hw.sensors.acpibat${num} 2>/dev/null)
1889 + if [[ -n $bat ]]; then
1890 + batfull=${"$(sysctl -n hw.sensors.acpibat${num}.amphour0)"%% *}
1891 + batwarn=${"$(sysctl -n hw.sensors.acpibat${num}.amphour1)"%% *}
1892 + batnow=${"$(sysctl -n hw.sensors.acpibat${num}.amphour3)"%% *}
1893 + case "$(sysctl -n hw.sensors.acpibat${num}.raw0)" in
1894 + *" discharging"*)
1895 + if (( batnow < batwarn )) ; then
1896 + GRML_BATTERY_LEVEL+=" !v"
1897 + else
1898 + GRML_BATTERY_LEVEL+=" v"
1899 + fi
1900 + ;;
1901 + *" charging"*)
1902 + GRML_BATTERY_LEVEL+=" ^"
1903 + ;;
1904 + *)
1905 + GRML_BATTERY_LEVEL+=" ="
1906 + ;;
1907 + esac
1908 + GRML_BATTERY_LEVEL+="${$(( 100 * batnow / batfull ))%%.*}%%"
1909 + fi
1910 + done
1911 + }
1912 +
1913 + function batteryfreebsd () {
1914 + GRML_BATTERY_LEVEL=''
1915 + local num
1916 + local -A table
1917 + for num in 0 1 ; do
1918 + table=( ${=${${${${${(M)${(f)"$(acpiconf -i $num 2>&1)"}:#(State|Remaining capacity):*}%%( ##|%)}//:[ $'\t']##/@}// /-}//@/ }} )
1919 + if [[ -n $table ]] && [[ $table[State] != "not-present" ]] ; then
1920 + case $table[State] in
1921 + *discharging*)
1922 + if (( $table[Remaining-capacity] < 20 )) ; then
1923 + GRML_BATTERY_LEVEL+=" !v"
1924 + else
1925 + GRML_BATTERY_LEVEL+=" v"
1926 + fi
1927 + ;;
1928 + *charging*)
1929 + GRML_BATTERY_LEVEL+=" ^"
1930 + ;;
1931 + *)
1932 + GRML_BATTERY_LEVEL+=" ="
1933 + ;;
1934 + esac
1935 + GRML_BATTERY_LEVEL+="$table[Remaining-capacity]%%"
1936 + fi
1937 + done
1938 + }
1939 +
1940 + function batterydarwin () {
1941 + GRML_BATTERY_LEVEL=''
1942 + local -a table
1943 + table=( ${$(pmset -g ps)[(w)8,9]%%(\%|);} )
1944 + if [[ -n $table[2] ]] ; then
1945 + case $table[2] in
1946 + charging)
1947 + GRML_BATTERY_LEVEL+=" ^"
1948 + ;;
1949 + discharging)
1950 + if (( $table[1] < 20 )) ; then
1951 + GRML_BATTERY_LEVEL+=" !v"
1952 + else
1953 + GRML_BATTERY_LEVEL+=" v"
1954 + fi
1955 + ;;
1956 + *)
1957 + GRML_BATTERY_LEVEL+=" ="
1958 + ;;
1959 + esac
1960 + GRML_BATTERY_LEVEL+="$table[1]%%"
1961 + fi
1962 + }
1963 +
1964 + # set variable debian_chroot if running in a chroot with /etc/debian_chroot
1965 + if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
1966 + debian_chroot=$(</etc/debian_chroot)
1967 + fi
1968 +
1969 + # gather version control information for inclusion in a prompt
1970 +
1971 + if zrcautoload vcs_info; then
1972 + # `vcs_info' in zsh versions 4.3.10 and below have a broken `_realpath'
1973 + # function, which can cause a lot of trouble with our directory-based
1974 + # profiles. So:
1975 + if [[ ${ZSH_VERSION} == 4.3.<-10> ]] ; then
1976 + function VCS_INFO_realpath () {
1977 + setopt localoptions NO_shwordsplit chaselinks
1978 + ( builtin cd -q $1 2> /dev/null && pwd; )
1979 + }
1980 + fi
1981 +
1982 + zstyle ':vcs_info:*' max-exports 2
1983 +
1984 + if [[ -o restricted ]]; then
1985 + zstyle ':vcs_info:*' enable NONE
1986 + fi
1987 + fi
1988 +
1989 + typeset -A grml_vcs_coloured_formats
1990 + typeset -A grml_vcs_plain_formats
1991 +
1992 + grml_vcs_plain_formats=(
1993 + format "(%s%)-[%b] " "zsh: %r"
1994 + actionformat "(%s%)-[%b|%a] " "zsh: %r"
1995 + rev-branchformat "%b:%r"
1996 + )
1997 +
1998 + grml_vcs_coloured_formats=(
1999 + format "${MAGENTA}(${NO_COLOR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOR} "
2000 + actionformat "${MAGENTA}(${NO_COLOR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOR} "
2001 + rev-branchformat "%b${RED}:${YELLOW}%r"
2002 + )
2003 +
2004 + typeset GRML_VCS_COLOUR_MODE=xxx
2005 +
2006 + function grml_vcs_info_toggle_colour () {
2007 + emulate -L zsh
2008 + if [[ $GRML_VCS_COLOUR_MODE == plain ]]; then
2009 + grml_vcs_info_set_formats coloured
2010 + else
2011 + grml_vcs_info_set_formats plain
2012 + fi
2013 + return 0
2014 + }
2015 +
2016 + function grml_vcs_info_set_formats () {
2017 + emulate -L zsh
2018 + #setopt localoptions xtrace
2019 + local mode=$1 AF F BF
2020 + if [[ $mode == coloured ]]; then
2021 + AF=${grml_vcs_coloured_formats[actionformat]}
2022 + F=${grml_vcs_coloured_formats[format]}
2023 + BF=${grml_vcs_coloured_formats[rev-branchformat]}
2024 + GRML_VCS_COLOUR_MODE=coloured
2025 + else
2026 + AF=${grml_vcs_plain_formats[actionformat]}
2027 + F=${grml_vcs_plain_formats[format]}
2028 + BF=${grml_vcs_plain_formats[rev-branchformat]}
2029 + GRML_VCS_COLOUR_MODE=plain
2030 + fi
2031 +
2032 + zstyle ':vcs_info:*' actionformats "$AF" "zsh: %r"
2033 + zstyle ':vcs_info:*' formats "$F" "zsh: %r"
2034 + zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "$BF"
2035 + return 0
2036 + }
2037 +
2038 + # Change vcs_info formats for the grml prompt. The 2nd format sets up
2039 + # $vcs_info_msg_1_ to contain "zsh: repo-name" used to set our screen title.
2040 + if [[ "$TERM" == dumb ]] ; then
2041 + grml_vcs_info_set_formats plain
2042 + else
2043 + grml_vcs_info_set_formats coloured
2044 + fi
2045 +
2046 + # Now for the fun part: The grml prompt themes in `promptsys' mode of operation
2047 +
2048 + # This actually defines three prompts:
2049 + #
2050 + # - grml
2051 + # - grml-large
2052 + # - grml-chroot
2053 + #
2054 + # They all share the same code and only differ with respect to which items they
2055 + # contain. The main source of documentation is the `prompt_grml_help' function
2056 + # below, which gets called when the user does this: prompt -h grml
2057 +
2058 + function prompt_grml_help () {
2059 + <<__EOF0__
2060 + prompt grml
2061 +
2062 + This is the prompt as used by the grml-live system <http://grml.org>. It is
2063 + a rather simple one-line prompt, that by default looks something like this:
2064 +
2065 + <user>@<host> <current-working-directory>[ <vcs_info-data>]%
2066 +
2067 + The prompt itself integrates with zsh's prompt themes system (as you are
2068 + witnessing right now) and is configurable to a certain degree. In
2069 + particular, these aspects are customisable:
2070 +
2071 + - The items used in the prompt (e.g. you can remove \`user' from
2072 + the list of activated items, which will cause the user name to
2073 + be omitted from the prompt string).
2074 +
2075 + - The attributes used with the items are customisable via strings
2076 + used before and after the actual item.
2077 +
2078 + The available items are: at, battery, change-root, date, grml-chroot,
2079 + history, host, jobs, newline, path, percent, rc, rc-always, sad-smiley,
2080 + shell-level, time, user, vcs
2081 +
2082 + The actual configuration is done via zsh's \`zstyle' mechanism. The
2083 + context, that is used while looking up styles is:
2084 +
2085 + ':prompt:grml:<left-or-right>:<subcontext>'
2086 +
2087 + Here <left-or-right> is either \`left' or \`right', signifying whether the
2088 + style should affect the left or the right prompt. <subcontext> is either
2089 + \`setup' or 'items:<item>', where \`<item>' is one of the available items.
2090 +
2091 + The styles:
2092 +
2093 + - use-rprompt (boolean): If \`true' (the default), print a sad smiley
2094 + in $RPROMPT if the last command a returned non-successful error code.
2095 + (This in only valid if <left-or-right> is "right"; ignored otherwise)
2096 +
2097 + - items (list): The list of items used in the prompt. If \`vcs' is
2098 + present in the list, the theme's code invokes \`vcs_info'
2099 + accordingly. Default (left): rc change-root user at host path vcs
2100 + percent; Default (right): sad-smiley
2101 +
2102 + - strip-sensitive-characters (boolean): If the \`prompt_subst' option
2103 + is active in zsh, the shell performs lots of expansions on prompt
2104 + variable strings, including command substitution. So if you don't
2105 + control where some of your prompt strings is coming from, this is
2106 + an exploitable weakness. Grml's zsh setup does not set this option
2107 + and it is off in the shell in zsh-mode by default. If it *is* turned
2108 + on however, this style becomes active, and there are two flavours of
2109 + it: On per default is a global variant in the '*:setup' context. This
2110 + strips characters after the whole prompt string was constructed. There
2111 + is a second variant in the '*:items:<item>', that is off by default.
2112 + It allows fine grained control over which items' data is stripped.
2113 + The characters that are stripped are: \$ and \`.
2114 +
2115 + Available styles in 'items:<item>' are: pre, post. These are strings that
2116 + are inserted before (pre) and after (post) the item in question. Thus, the
2117 + following would cause the user name to be printed in red instead of the
2118 + default blue:
2119 +
2120 + zstyle ':prompt:grml:*:items:user' pre '%F{red}'
2121 +
2122 + Note, that the \`post' style may remain at its default value, because its
2123 + default value is '%f', which turns the foreground text attribute off (which
2124 + is exactly, what is still required with the new \`pre' value).
2125 + __EOF0__
2126 + }
2127 +
2128 + function prompt_grml-chroot_help () {
2129 + <<__EOF0__
2130 + prompt grml-chroot
2131 +
2132 + This is a variation of the grml prompt, see: prompt -h grml
2133 +
2134 + The main difference is the default value of the \`items' style. The rest
2135 + behaves exactly the same. Here are the defaults for \`grml-chroot':
2136 +
2137 + - left: grml-chroot user at host path percent
2138 + - right: (empty list)
2139 + __EOF0__
2140 + }
2141 +
2142 + function prompt_grml-large_help () {
2143 + <<__EOF0__
2144 + prompt grml-large
2145 +
2146 + This is a variation of the grml prompt, see: prompt -h grml
2147 +
2148 + The main difference is the default value of the \`items' style. In
2149 + particular, this theme uses _two_ lines instead of one with the plain
2150 + \`grml' theme. The rest behaves exactly the same. Here are the defaults
2151 + for \`grml-large':
2152 +
2153 + - left: rc jobs history shell-level change-root time date newline user
2154 + at host path vcs percent
2155 + - right: sad-smiley
2156 + __EOF0__
2157 + }
2158 +
2159 + function grml_prompt_setup () {
2160 + emulate -L zsh
2161 + autoload -Uz vcs_info
2162 + # The following autoload is disabled for now, since this setup includes a
2163 + # static version of the ‘add-zsh-hook’ function above. It needs to be
2164 + # re-enabled as soon as that static definition is removed again.
2165 + #autoload -Uz add-zsh-hook
2166 + add-zsh-hook precmd prompt_$1_precmd
2167 + }
2168 +
2169 + function prompt_grml_setup () {
2170 + grml_prompt_setup grml
2171 + }
2172 +
2173 + function prompt_grml-chroot_setup () {
2174 + grml_prompt_setup grml-chroot
2175 + }
2176 +
2177 + function prompt_grml-large_setup () {
2178 + grml_prompt_setup grml-large
2179 + }
2180 +
2181 + # These maps define default tokens and pre-/post-decoration for items to be
2182 + # used within the themes. All defaults may be customised in a context sensitive
2183 + # matter by using zsh's `zstyle' mechanism.
2184 + typeset -gA grml_prompt_pre_default \
2185 + grml_prompt_post_default \
2186 + grml_prompt_token_default \
2187 + grml_prompt_token_function
2188 +
2189 + grml_prompt_pre_default=(
2190 + at ''
2191 + battery ' '
2192 + change-root ''
2193 + date '%F{blue}'
2194 + grml-chroot '%F{red}'
2195 + history '%F{green}'
2196 + host ''
2197 + jobs '%F{cyan}'
2198 + newline ''
2199 + path '%B'
2200 + percent ''
2201 + rc '%B%F{red}'
2202 + rc-always ''
2203 + sad-smiley ''
2204 + shell-level '%F{red}'
2205 + time '%F{blue}'
2206 + user '%B%F{blue}'
2207 + vcs ''
2208 + )
2209 +
2210 + grml_prompt_post_default=(
2211 + at ''
2212 + battery ''
2213 + change-root ''
2214 + date '%f'
2215 + grml-chroot '%f '
2216 + history '%f'
2217 + host ''
2218 + jobs '%f'
2219 + newline ''
2220 + path '%b'
2221 + percent ''
2222 + rc '%f%b'
2223 + rc-always ''
2224 + sad-smiley ''
2225 + shell-level '%f'
2226 + time '%f'
2227 + user '%f%b'
2228 + vcs ''
2229 + )
2230 +
2231 + grml_prompt_token_default=(
2232 + at '@'
2233 + battery 'GRML_BATTERY_LEVEL'
2234 + change-root 'debian_chroot'
2235 + date '%D{%Y-%m-%d}'
2236 + grml-chroot 'GRML_CHROOT'
2237 + history '{history#%!} '
2238 + host '%m '
2239 + jobs '[%j running job(s)] '
2240 + newline $'\n'
2241 + path '%40<..<%~%<< '
2242 + percent '%# '
2243 + rc '%(?..%? )'
2244 + rc-always '%?'
2245 + sad-smiley '%(?..:()'
2246 + shell-level '%(3L.+ .)'
2247 + time '%D{%H:%M:%S} '
2248 + user '%n'
2249 + vcs '0'
2250 + )
2251 +
2252 + function grml_theme_has_token () {
2253 + if (( ARGC != 1 )); then
2254 + printf 'usage: grml_theme_has_token <name>\n'
2255 + return 1
2256 + fi
2257 + (( ${+grml_prompt_token_default[$1]} ))
2258 + }
2259 +
2260 + function GRML_theme_add_token_usage () {
2261 + <<__EOF0__
2262 + Usage: grml_theme_add_token <name> [-f|-i] <token/function> [<pre> <post>]
2263 +
2264 + <name> is the name for the newly added token. If the \`-f' or \`-i' options
2265 + are used, <token/function> is the name of the function (see below for
2266 + details). Otherwise it is the literal token string to be used. <pre> and
2267 + <post> are optional.
2268 +
2269 + Options:
2270 +
2271 + -f <function> Use a function named \`<function>' each time the token
2272 + is to be expanded.
2273 +
2274 + -i <function> Use a function named \`<function>' to initialise the
2275 + value of the token _once_ at runtime.
2276 +
2277 + The functions are called with one argument: the token's new name. The
2278 + return value is expected in the \$REPLY parameter. The use of these
2279 + options is mutually exclusive.
2280 +
2281 + There is a utility function \`grml_theme_has_token', which you can use
2282 + to test if a token exists before trying to add it. This can be a guard
2283 + for situations in which a \`grml_theme_add_token' call may happen more
2284 + than once.
2285 +
2286 + Example:
2287 +
2288 + To add a new token \`day' that expands to the current weekday in the
2289 + current locale in green foreground colour, use this:
2290 +
2291 + grml_theme_add_token day '%D{%A}' '%F{green}' '%f'
2292 +
2293 + Another example would be support for \$VIRTUAL_ENV:
2294 +
2295 + function virtual_env_prompt () {
2296 + REPLY=\${VIRTUAL_ENV+\${VIRTUAL_ENV:t} }
2297 + }
2298 + grml_theme_add_token virtual-env -f virtual_env_prompt
2299 +
2300 + After that, you will be able to use a changed \`items' style to
2301 + assemble your prompt.
2302 + __EOF0__
2303 + }
2304 +
2305 + function grml_theme_add_token () {
2306 + emulate -L zsh
2307 + local name token pre post
2308 + local -i init funcall
2309 +
2310 + if (( ARGC == 0 )); then
2311 + GRML_theme_add_token_usage
2312 + return 0
2313 + fi
2314 +
2315 + init=0
2316 + funcall=0
2317 + pre=''
2318 + post=''
2319 + name=$1
2320 + shift
2321 + if [[ $1 == '-f' ]]; then
2322 + funcall=1
2323 + shift
2324 + elif [[ $1 == '-i' ]]; then
2325 + init=1
2326 + shift
2327 + fi
2328 +
2329 + if (( ARGC == 0 )); then
2330 + printf '
2331 + grml_theme_add_token: No token-string/function-name provided!\n\n'
2332 + GRML_theme_add_token_usage
2333 + return 1
2334 + fi
2335 + token=$1
2336 + shift
2337 + if (( ARGC != 0 && ARGC != 2 )); then
2338 + printf '
2339 + grml_theme_add_token: <pre> and <post> need to by specified _both_!\n\n'
2340 + GRML_theme_add_token_usage
2341 + return 1
2342 + fi
2343 + if (( ARGC )); then
2344 + pre=$1
2345 + post=$2
2346 + shift 2
2347 + fi
2348 +
2349 + if grml_theme_has_token $name; then
2350 + printf '
2351 + grml_theme_add_token: Token `%s'\'' exists! Giving up!\n\n' $name
2352 + GRML_theme_add_token_usage
2353 + return 2
2354 + fi
2355 + if (( init )); then
2356 + REPLY=''
2357 + $token $name
2358 + token=$REPLY
2359 + fi
2360 + grml_prompt_pre_default[$name]=$pre
2361 + grml_prompt_post_default[$name]=$post
2362 + if (( funcall )); then
2363 + grml_prompt_token_function[$name]=$token
2364 + grml_prompt_token_default[$name]=23
2365 + else
2366 + grml_prompt_token_default[$name]=$token
2367 + fi
2368 + }
2369 +
2370 + function grml_wrap_reply () {
2371 + emulate -L zsh
2372 + local target="$1"
2373 + local new="$2"
2374 + local left="$3"
2375 + local right="$4"
2376 +
2377 + if (( ${+parameters[$new]} )); then
2378 + REPLY="${left}${(P)new}${right}"
2379 + else
2380 + REPLY=''
2381 + fi
2382 + }
2383 +
2384 + function grml_prompt_addto () {
2385 + emulate -L zsh
2386 + local target="$1"
2387 + local lr it apre apost new v REPLY
2388 + local -a items
2389 + shift
2390 +
2391 + [[ $target == PS1 ]] && lr=left || lr=right
2392 + zstyle -a ":prompt:${grmltheme}:${lr}:setup" items items || items=( "$@" )
2393 + typeset -g "${target}="
2394 + for it in "${items[@]}"; do
2395 + zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" pre apre \
2396 + || apre=${grml_prompt_pre_default[$it]}
2397 + zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" post apost \
2398 + || apost=${grml_prompt_post_default[$it]}
2399 + zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" token new \
2400 + || new=${grml_prompt_token_default[$it]}
2401 + if (( ${+grml_prompt_token_function[$it]} )); then
2402 + REPLY=''
2403 + ${grml_prompt_token_function[$it]} $it
2404 + else
2405 + case $it in
2406 + battery)
2407 + grml_wrap_reply $target $new '' ''
2408 + ;;
2409 + change-root)
2410 + grml_wrap_reply $target $new '(' ')'
2411 + ;;
2412 + grml-chroot)
2413 + if [[ -n ${(P)new} ]]; then
2414 + REPLY="$CHROOT"
2415 + else
2416 + REPLY=''
2417 + fi
2418 + ;;
2419 + vcs)
2420 + v="vcs_info_msg_${new}_"
2421 + if (( ! vcscalled )); then
2422 + vcs_info
2423 + vcscalled=1
2424 + fi
2425 + if (( ${+parameters[$v]} )) && [[ -n "${(P)v}" ]]; then
2426 + REPLY="${(P)v}"
2427 + else
2428 + REPLY=''
2429 + fi
2430 + ;;
2431 + *) REPLY="$new" ;;
2432 + esac
2433 + fi
2434 + # Strip volatile characters per item. This is off by default. See the
2435 + # global stripping code a few lines below for details.
2436 + if [[ -o prompt_subst ]] && zstyle -t ":prompt:${grmltheme}:${lr}:items:$it" \
2437 + strip-sensitive-characters
2438 + then
2439 + REPLY="${REPLY//[$\`]/}"
2440 + fi
2441 + typeset -g "${target}=${(P)target}${apre}${REPLY}${apost}"
2442 + done
2443 +
2444 + # Per default, strip volatile characters (in the prompt_subst case)
2445 + # globally. If the option is off, the style has no effect. For more
2446 + # control, this can be turned off and stripping can be configured on a
2447 + # per-item basis (see above).
2448 + if [[ -o prompt_subst ]] && zstyle -T ":prompt:${grmltheme}:${lr}:setup" \
2449 + strip-sensitive-characters
2450 + then
2451 + typeset -g "${target}=${${(P)target}//[$\`]/}"
2452 + fi
2453 + }
2454 +
2455 + function prompt_grml_precmd () {
2456 + emulate -L zsh
2457 + local grmltheme=grml
2458 + local -a left_items right_items
2459 + left_items=(rc change-root user at host path vcs percent)
2460 + right_items=(sad-smiley)
2461 +
2462 + prompt_grml_precmd_worker
2463 + }
2464 +
2465 + function prompt_grml-chroot_precmd () {
2466 + emulate -L zsh
2467 + local grmltheme=grml-chroot
2468 + local -a left_items right_items
2469 + left_items=(grml-chroot user at host path percent)
2470 + right_items=()
2471 +
2472 + prompt_grml_precmd_worker
2473 + }
2474 +
2475 + function prompt_grml-large_precmd () {
2476 + emulate -L zsh
2477 + local grmltheme=grml-large
2478 + local -a left_items right_items
2479 + left_items=(rc jobs history shell-level change-root time date newline
2480 + user at host path vcs percent)
2481 + right_items=(sad-smiley)
2482 +
2483 + prompt_grml_precmd_worker
2484 + }
2485 +
2486 + function prompt_grml_precmd_worker () {
2487 + emulate -L zsh
2488 + local -i vcscalled=0
2489 +
2490 + grml_prompt_addto PS1 "${left_items[@]}"
2491 + if zstyle -T ":prompt:${grmltheme}:right:setup" use-rprompt; then
2492 + grml_prompt_addto RPS1 "${right_items[@]}"
2493 + fi
2494 + }
2495 +
2496 + function grml_prompt_fallback () {
2497 + setopt prompt_subst
2498 + local p0 p1
2499 +
2500 + p0="${RED}%(?..%? )${WHITE}${debian_chroot:+($debian_chroot)}"
2501 + p1="${BLUE}%n${NO_COLOR}@%m %40<...<%B%~%b%<< "'${vcs_info_msg_0_}'"%# "
2502 + if (( EUID == 0 )); then
2503 + PROMPT="${BLUE}${p0}${RED}${p1}"
2504 + else
2505 + PROMPT="${RED}${p0}${BLUE}${p1}"
2506 + fi
2507 + }
2508 +
2509 + if zrcautoload promptinit && promptinit 2>/dev/null ; then
2510 + grml_status_feature promptinit 0
2511 + # Since we define the required functions in here and not in files in
2512 + # $fpath, we need to stick the theme's name into `$prompt_themes'
2513 + # ourselves, since promptinit does not pick them up otherwise.
2514 + prompt_themes+=( grml grml-chroot grml-large )
2515 + # Also, keep the array sorted...
2516 + prompt_themes=( "${(@on)prompt_themes}" )
2517 + else
2518 + grml_status_feature promptinit 1
2519 + grml_prompt_fallback
2520 + function precmd () { (( ${+functions[vcs_info]} )) && vcs_info; }
2521 + fi
2522 +
2523 + if is437; then
2524 + # The prompt themes use modern features of zsh, that require at least
2525 + # version 4.3.7 of the shell. Use the fallback otherwise.
2526 + if [[ $GRML_DISPLAY_BATTERY -gt 0 ]]; then
2527 + zstyle ':prompt:grml:right:setup' items sad-smiley battery
2528 + add-zsh-hook precmd battery
2529 + fi
2530 + if [[ "$TERM" == dumb ]] ; then
2531 + zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" pre ''
2532 + zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" post ' '
2533 + for i in rc user path jobs history date time shell-level; do
2534 + zstyle ":prompt:grml(|-large|-chroot):*:items:$i" pre ''
2535 + zstyle ":prompt:grml(|-large|-chroot):*:items:$i" post ''
2536 + done
2537 + unset i
2538 + zstyle ':prompt:grml(|-large|-chroot):right:setup' use-rprompt false
2539 + elif (( EUID == 0 )); then
2540 + zstyle ':prompt:grml(|-large|-chroot):*:items:user' pre '%B%F{red}'
2541 + fi
2542 +
2543 + # Finally enable one of the prompts.
2544 + if [[ -n $GRML_CHROOT ]]; then
2545 + prompt grml-chroot
2546 + elif [[ $GRMLPROMPT -gt 0 ]]; then
2547 + prompt grml-large
2548 + else
2549 + prompt grml
2550 + fi
2551 + else
2552 + grml_prompt_fallback
2553 + function precmd () { (( ${+functions[vcs_info]} )) && vcs_info; }
2554 + fi
2555 +
2556 + # make sure to use right prompt only when not running a command
2557 + is41 && setopt transient_rprompt
2558 +
2559 + # Terminal-title wizardry
2560 +
2561 + function ESC_print () {
2562 + info_print $'\ek' $'\e\\' "$@"
2563 + }
2564 + function set_title () {
2565 + info_print $'\e]0;' $'\a' "$@"
2566 + }
2567 +
2568 + function info_print () {
2569 + local esc_begin esc_end
2570 + esc_begin="$1"
2571 + esc_end="$2"
2572 + shift 2
2573 + printf '%s' ${esc_begin}
2574 + printf '%s' "$*"
2575 + printf '%s' "${esc_end}"
2576 + }
2577 +
2578 + function grml_reset_screen_title () {
2579 + # adjust title of xterm
2580 + # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
2581 + [[ ${NOTITLE:-} -gt 0 ]] && return 0
2582 + case $TERM in
2583 + (xterm*|rxvt*|alacritty|foot)
2584 + set_title ${(%):-"%n@%m: %~"}
2585 + ;;
2586 + esac
2587 + }
2588 +
2589 + function grml_vcs_to_screen_title () {
2590 + if [[ $TERM == screen* ]] ; then
2591 + if [[ -n ${vcs_info_msg_1_} ]] ; then
2592 + ESC_print ${vcs_info_msg_1_}
2593 + else
2594 + ESC_print "zsh"
2595 + fi
2596 + fi
2597 + }
2598 +
2599 + function grml_maintain_name () {
2600 + local localname
2601 + localname="$(uname -n)"
2602 +
2603 + # set hostname if not running on local machine
2604 + if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != "${localname}" ]] ; then
2605 + NAME="@$HOSTNAME"
2606 + fi
2607 + }
2608 +
2609 + function grml_cmd_to_screen_title () {
2610 + # get the name of the program currently running and hostname of local
2611 + # machine set screen window title if running in a screen
2612 + if [[ "$TERM" == screen* ]] ; then
2613 + local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME"
2614 + ESC_print ${CMD}
2615 + fi
2616 + }
2617 +
2618 + function grml_control_xterm_title () {
2619 + case $TERM in
2620 + (xterm*|rxvt*|alacritty|foot)
2621 + set_title "${(%):-"%n@%m:"}" "$2"
2622 + ;;
2623 + esac
2624 + }
2625 +
2626 + # The following autoload is disabled for now, since this setup includes a
2627 + # static version of the ‘add-zsh-hook’ function above. It needs to be
2628 + # re-enabled as soon as that static definition is removed again.
2629 + #zrcautoload add-zsh-hook || add-zsh-hook () { :; }
2630 + if [[ $NOPRECMD -eq 0 ]]; then
2631 + add-zsh-hook precmd grml_reset_screen_title
2632 + add-zsh-hook precmd grml_vcs_to_screen_title
2633 + add-zsh-hook preexec grml_maintain_name
2634 + add-zsh-hook preexec grml_cmd_to_screen_title
2635 + if [[ $NOTITLE -eq 0 ]]; then
2636 + add-zsh-hook preexec grml_control_xterm_title
2637 + fi
2638 + fi
2639 +
2640 + # 'hash' some often used directories
2641 + #d# start
2642 + hash -d deb=/var/cache/apt/archives
2643 + hash -d doc=/usr/share/doc
2644 + hash -d linux=/lib/modules/$(command uname -r)/build/
2645 + hash -d log=/var/log
2646 + hash -d slog=/var/log/syslog
2647 + hash -d src=/usr/src
2648 + hash -d www=/var/www
2649 + #d# end
2650 +
2651 + # some aliases
2652 + if check_com -c screen ; then
2653 + if [[ $UID -eq 0 ]] ; then
2654 + if [[ -r /etc/grml/screenrc ]]; then
2655 + alias screen='screen -c /etc/grml/screenrc'
2656 + fi
2657 + elif [[ ! -r $HOME/.screenrc ]] ; then
2658 + if [[ -r /etc/grml/screenrc_grml ]]; then
2659 + alias screen='screen -c /etc/grml/screenrc_grml'
2660 + else
2661 + if [[ -r /etc/grml/screenrc ]]; then
2662 + alias screen='screen -c /etc/grml/screenrc'
2663 + fi
2664 + fi
2665 + fi
2666 + fi
2667 +
2668 + # do we have GNU ls with color-support?
2669 + if [[ "$TERM" != dumb ]]; then
2670 + #a1# List files with colors (\kbd{ls \ldots})
2671 + alias ls="command ls ${ls_options:+${ls_options[*]}}"
2672 + #a1# List all files, with colors (\kbd{ls -la \ldots})
2673 + alias la="command ls -la ${ls_options:+${ls_options[*]}}"
2674 + #a1# List files with long colored list, without dotfiles (\kbd{ls -l \ldots})
2675 + alias ll="command ls -l ${ls_options:+${ls_options[*]}}"
2676 + #a1# List files with long colored list, human readable sizes (\kbd{ls -hAl \ldots})
2677 + alias lh="command ls -hAl ${ls_options:+${ls_options[*]}}"
2678 + #a1# List files with long colored list, append qualifier to filenames (\kbd{ls -l \ldots})\\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
2679 + alias l="command ls -l ${ls_options:+${ls_options[*]}}"
2680 + else
2681 + alias la='command ls -la'
2682 + alias ll='command ls -l'
2683 + alias lh='command ls -hAl'
2684 + alias l='command ls -l'
2685 + fi
2686 +
2687 + # use ip from iproute2 with color support
2688 + if ip -color=auto addr show dev lo >/dev/null 2>&1; then
2689 + alias ip='command ip -color=auto'
2690 + fi
2691 +
2692 + if [[ -r /proc/mdstat ]]; then
2693 + alias mdstat='cat /proc/mdstat'
2694 + fi
2695 +
2696 + alias ...='cd ../../'
2697 +
2698 + # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
2699 + if [[ -x /sbin/kexec ]] && [[ -r /proc/cmdline ]] ; then
2700 + alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
2701 + fi
2702 +
2703 + # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
2704 + alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
2705 + alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
2706 +
2707 + # make sure it is not assigned yet
2708 + [[ -n ${aliases[utf2iso]} ]] && unalias utf2iso
2709 + function utf2iso () {
2710 + if isutfenv ; then
2711 + local ENV
2712 + for ENV in $(env | command grep -i '.utf') ; do
2713 + eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
2714 + done
2715 + fi
2716 + }
2717 +
2718 + # make sure it is not assigned yet
2719 + [[ -n ${aliases[iso2utf]} ]] && unalias iso2utf
2720 + function iso2utf () {
2721 + if ! isutfenv ; then
2722 + local ENV
2723 + for ENV in $(env | command grep -i '\.iso') ; do
2724 + eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
2725 + done
2726 + fi
2727 + }
2728 +
2729 + # especially for roadwarriors using GNU screen and ssh:
2730 + if ! check_com asc &>/dev/null ; then
2731 + function asc () { autossh -t "$@" 'screen -RdU' }
2732 + compdef asc=ssh
2733 + fi
2734 +
2735 + #f1# Hints for the use of zsh on grml
2736 + function zsh-help () {
2737 + print "$bg[white]$fg[black]
2738 + zsh-help - hints for use of zsh on grml
2739 + =======================================$reset_color"
2740 +
2741 + print '
2742 + Main configuration of zsh happens in /etc/zsh/zshrc.
2743 + That file is part of the package grml-etc-core, if you want to
2744 + use them on a non-grml-system just get the tar.gz from
2745 + http://deb.grml.org/ or (preferably) get it from the git repository:
2746 +
2747 + http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc
2748 +
2749 + This version of grml'\''s zsh setup does not use skel/.zshrc anymore.
2750 + The file is still there, but it is empty for backwards compatibility.
2751 +
2752 + For your own changes use these two files:
2753 + $HOME/.zshrc.pre
2754 + $HOME/.zshrc.local
2755 +
2756 + The former is sourced very early in our zshrc, the latter is sourced
2757 + very lately.
2758 +
2759 + System wide configuration without touching configuration files of grml
2760 + can take place in /etc/zsh/zshrc.local.
2761 +
2762 + For information regarding zsh start at http://grml.org/zsh/
2763 +
2764 + Take a look at grml'\''s zsh refcard:
2765 + % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
2766 +
2767 + Check out the main zsh refcard:
2768 + % '$BROWSER' http://www.bash2zsh.com/zsh_refcard/refcard.pdf
2769 +
2770 + And of course visit the zsh-lovers:
2771 + % man zsh-lovers
2772 +
2773 + You can adjust some options through environment variables when
2774 + invoking zsh without having to edit configuration files.
2775 + Basically meant for bash users who are not used to the power of
2776 + the zsh yet. :)
2777 +
2778 + "NOCOR=1 zsh" => deactivate automatic correction
2779 + "NOMENU=1 zsh" => do not use auto menu completion
2780 + (note: use ctrl-d for completion instead!)
2781 + "NOPRECMD=1 zsh" => disable the precmd + preexec commands (set GNU screen title)
2782 + "NOTITLE=1 zsh" => disable setting the title of xterms without disabling
2783 + preexec() and precmd() completely
2784 + "GRML_DISPLAY_BATTERY=1 zsh"
2785 + => activate battery status on right side of prompt (WIP)
2786 + "COMMAND_NOT_FOUND=1 zsh"
2787 + => Enable a handler if an external command was not found
2788 + The command called in the handler can be altered by setting
2789 + the GRML_ZSH_CNF_HANDLER variable, the default is:
2790 + "/usr/share/command-not-found/command-not-found"
2791 +
2792 + A value greater than 0 is enables a feature; a value equal to zero
2793 + disables it. If you like one or the other of these settings, you can
2794 + add them to ~/.zshrc.pre to ensure they are set when sourcing grml'\''s
2795 + zshrc.'
2796 +
2797 + print "
2798 + $bg[white]$fg[black]
2799 + Please report wishes + bugs to the grml-team: http://grml.org/bugs/
2800 + Enjoy your grml system with the zsh!$reset_color"
2801 + }
2802 +
2803 + # debian stuff
2804 + if [[ -r /etc/debian_version ]] ; then
2805 + if [[ -z "$GRML_NO_APT_ALIASES" ]]; then
2806 + #a3# Execute \kbd{apt-cache policy}
2807 + alias acp='apt-cache policy'
2808 + if check_com -c apt ; then
2809 + #a3# Execute \kbd{apt search}
2810 + alias acs='apt search'
2811 + #a3# Execute \kbd{apt show}
2812 + alias acsh='apt show'
2813 + #a3# Execute \kbd{apt dist-upgrade}
2814 + salias adg="apt dist-upgrade"
2815 + #a3# Execute \kbd{apt upgrade}
2816 + salias ag="apt upgrade"
2817 + #a3# Execute \kbd{apt install}
2818 + salias agi="apt install"
2819 + #a3# Execute \kbd{apt update}
2820 + salias au="apt update"
2821 + else
2822 + alias acs='apt-cache search'
2823 + alias acsh='apt-cache show'
2824 + salias adg="apt-get dist-upgrade"
2825 + salias ag="apt-get upgrade"
2826 + salias agi="apt-get install"
2827 + salias au="apt-get update"
2828 + fi
2829 + #a3# Execute \kbd{aptitude install}
2830 + salias ati="aptitude install"
2831 + #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
2832 + salias -a up="aptitude update ; aptitude safe-upgrade"
2833 + #a3# Execute \kbd{dpkg-buildpackage}
2834 + alias dbp='dpkg-buildpackage'
2835 + #a3# Execute \kbd{grep-excuses}
2836 + alias ge='grep-excuses'
2837 + fi
2838 +
2839 + # get a root shell as normal user in live-cd mode:
2840 + if isgrmlcd && [[ $UID -ne 0 ]] ; then
2841 + alias su="sudo su"
2842 + fi
2843 +
2844 + fi
2845 +
2846 + # use /var/log/syslog iff present, fallback to journalctl otherwise
2847 + if [ -e /var/log/syslog ] ; then
2848 + #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog || journalctl}
2849 + salias llog="$PAGER /var/log/syslog" # take a look at the syslog
2850 + #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog || journalctl}
2851 + salias tlog="tail --follow=name /var/log/syslog" # follow the syslog
2852 + elif check_com -c journalctl ; then
2853 + salias llog="journalctl"
2854 + salias tlog="journalctl -f"
2855 + fi
2856 +
2857 + # sort installed Debian-packages by size
2858 + if check_com -c dpkg-query ; then
2859 + #a3# List installed Debian-packages sorted by size
2860 + alias debs-by-size="dpkg-query -Wf 'x \${Installed-Size} \${Package} \${Status}\n' | sed -ne '/^x /d' -e '/^x \(.*\) install ok installed$/s//\1/p' | sort -nr"
2861 + fi
2862 +
2863 + # if cdrecord is a symlink (to wodim) or isn't present at all warn:
2864 + if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord; then
2865 + if check_com -c wodim; then
2866 + function cdrecord () {
2867 + <<__EOF0__
2868 + cdrecord is not provided under its original name by Debian anymore.
2869 + See #377109 in the BTS of Debian for more details.
2870 +
2871 + Please use the wodim binary instead
2872 + __EOF0__
2873 + return 1
2874 + }
2875 + fi
2876 + fi
2877 +
2878 + if isgrmlcd; then
2879 + # No core dumps: important for a live-cd-system
2880 + limit -s core 0
2881 + fi
2882 +
2883 + # grmlstuff
2884 + function grmlstuff () {
2885 + # people should use 'grml-x'!
2886 + if check_com -c 915resolution; then
2887 + function 855resolution () {
2888 + echo "Please use 915resolution as resolution modifying tool for Intel \
2889 + graphic chipset."
2890 + return -1
2891 + }
2892 + fi
2893 +
2894 + #a1# Output version of running grml
2895 + alias grml-version='cat /etc/grml_version'
2896 +
2897 + if check_com -c grml-debootstrap ; then
2898 + function debian2hd () {
2899 + echo "Installing debian to harddisk is possible by using grml-debootstrap."
2900 + return 1
2901 + }
2902 + fi
2903 +
2904 + if check_com -c tmate && check_com -c qrencode ; then
2905 + function grml-remote-support() {
2906 + tmate -L grml-remote-support new -s grml-remote-support -d
2907 + tmate -L grml-remote-support wait tmate-ready
2908 + tmate -L grml-remote-support display -p '#{tmate_ssh}' | qrencode -t ANSI
2909 + echo "tmate session: $(tmate -L grml-remote-support display -p '#{tmate_ssh}')"
2910 + echo
2911 + echo "Scan this QR code and send it to your support team."
2912 + }
2913 + fi
2914 + }
2915 +
2916 + # now run the functions
2917 + isgrml && checkhome
2918 + is4 && isgrml && grmlstuff
2919 + is4 && grmlcomp
2920 +
2921 + # keephack
2922 + is4 && xsource "/etc/zsh/keephack"
2923 +
2924 + # wonderful idea of using "e" glob qualifier by Peter Stephenson
2925 + # You use it as follows:
2926 + # $ NTREF=/reference/file
2927 + # $ ls -l *(e:nt:)
2928 + # This lists all the files in the current directory newer than the reference file.
2929 + # You can also specify the reference file inline; note quotes:
2930 + # $ ls -l *(e:'nt ~/.zshenv':)
2931 + is4 && function nt () {
2932 + if [[ -n $1 ]] ; then
2933 + local NTREF=${~1}
2934 + fi
2935 + [[ $REPLY -nt $NTREF ]]
2936 + }
2937 +
2938 + # shell functions
2939 +
2940 + #f1# Reload an autoloadable function
2941 + function freload () { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
2942 + compdef _functions freload
2943 +
2944 + #
2945 + # Usage:
2946 + #
2947 + # e.g.: a -> b -> c -> d ....
2948 + #
2949 + # sll a
2950 + #
2951 + #
2952 + # if parameter is given with leading '=', lookup $PATH for parameter and resolve that
2953 + #
2954 + # sll =java
2955 + #
2956 + # Note: limit for recursive symlinks on linux:
2957 + # http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/fs/namei.c?id=refs/heads/master#l808
2958 + # This limits recursive symlink follows to 8,
2959 + # while limiting consecutive symlinks to 40.
2960 + #
2961 + # When resolving and displaying information about symlinks, no check is made
2962 + # that the displayed information does make any sense on your OS.
2963 + # We leave that decission to the user.
2964 + #
2965 + # The zstat module is used to detect symlink loops. zstat is available since zsh4.
2966 + # With an older zsh you will need to abort with <C-c> in that case.
2967 + # When a symlink loop is detected, a warning ist printed and further processing is stopped.
2968 + #
2969 + # Module zstat is loaded by default in grml zshrc, no extra action needed for that.
2970 + #
2971 + # Known bugs:
2972 + # If you happen to come across a symlink that points to a destination on another partition
2973 + # with the same inode number, that will be marked as symlink loop though it is not.
2974 + # Two hints for this situation:
2975 + # I) Play lottery the same day, as you seem to be rather lucky right now.
2976 + # II) Send patches.
2977 + #
2978 + # return status:
2979 + # 0 upon success
2980 + # 1 file/dir not accesible
2981 + # 2 symlink loop detected
2982 + #
2983 + #f1# List symlinks in detail (more detailed version of 'readlink -f', 'whence -s' and 'namei -l')
2984 + function sll () {
2985 + if [[ -z ${1} ]] ; then
2986 + printf 'Usage: %s <symlink(s)>\n' "${0}"
2987 + return 1
2988 + fi
2989 +
2990 + local file jumpd curdir
2991 + local -i 10 RTN LINODE i
2992 + local -a SEENINODES
2993 + curdir="${PWD}"
2994 + RTN=0
2995 +
2996 + for file in "${@}" ; do
2997 + SEENINODES=()
2998 + ls -l "${file:a}" || RTN=1
2999 +
3000 + while [[ -h "$file" ]] ; do
3001 + if is4 ; then
3002 + LINODE=$(zstat -L +inode "${file}")
3003 + for i in ${SEENINODES} ; do
3004 + if (( ${i} == ${LINODE} )) ; then
3005 + builtin cd -q "${curdir}"
3006 + print 'link loop detected, aborting!'
3007 + return 2
3008 + fi
3009 + done
3010 + SEENINODES+=${LINODE}
3011 + fi
3012 + jumpd="${file:h}"
3013 + file="${file:t}"
3014 +
3015 + if [[ -d ${jumpd} ]] ; then
3016 + builtin cd -q "${jumpd}" || RTN=1
3017 + fi
3018 + file=$(readlink "$file")
3019 +
3020 + jumpd="${file:h}"
3021 + file="${file:t}"
3022 +
3023 + if [[ -d ${jumpd} ]] ; then
3024 + builtin cd -q "${jumpd}" || RTN=1
3025 + fi
3026 +
3027 + ls -l "${PWD}/${file}" || RTN=1
3028 + done
3029 + shift 1
3030 + if (( ${#} >= 1 )) ; then
3031 + print ""
3032 + fi
3033 + builtin cd -q "${curdir}"
3034 + done
3035 + return ${RTN}
3036 + }
3037 +
3038 + if check_com -c $PAGER ; then
3039 + #f3# View Debian's changelog of given package(s)
3040 + function dchange () {
3041 + emulate -L zsh
3042 + [[ -z "$1" ]] && printf 'Usage: %s <package_name(s)>\n' "$0" && return 1
3043 +
3044 + local package
3045 +
3046 + # `less` as $PAGER without e.g. `|lesspipe %s` inside $LESSOPEN can't properly
3047 + # read *.gz files, try to detect this to use vi instead iff available
3048 + local viewer
3049 +
3050 + if [[ ${$(typeset -p PAGER)[2]} = -a ]] ; then
3051 + viewer=($PAGER) # support PAGER=(less -Mr) but leave array untouched
3052 + else
3053 + viewer=(${=PAGER}) # support PAGER='less -Mr'
3054 + fi
3055 +
3056 + if [[ ${viewer[1]:t} = less ]] && [[ -z "${LESSOPEN}" ]] && check_com vi ; then
3057 + viewer='vi'
3058 + fi
3059 +
3060 + for package in "$@" ; do
3061 + if [[ -r /usr/share/doc/${package}/changelog.Debian.gz ]] ; then
3062 + $viewer /usr/share/doc/${package}/changelog.Debian.gz
3063 + elif [[ -r /usr/share/doc/${package}/changelog.gz ]] ; then
3064 + $viewer /usr/share/doc/${package}/changelog.gz
3065 + elif [[ -r /usr/share/doc/${package}/changelog ]] ; then
3066 + $viewer /usr/share/doc/${package}/changelog
3067 + else
3068 + if check_com -c aptitude ; then
3069 + echo "No changelog for package $package found, using aptitude to retrieve it."
3070 + aptitude changelog "$package"
3071 + elif check_com -c apt-get ; then
3072 + echo "No changelog for package $package found, using apt-get to retrieve it."
3073 + apt-get changelog "$package"
3074 + else
3075 + echo "No changelog for package $package found, sorry."
3076 + fi
3077 + fi
3078 + done
3079 + }
3080 + function _dchange () { _files -W /usr/share/doc -/ }
3081 + compdef _dchange dchange
3082 +
3083 + #f3# View Debian's NEWS of a given package
3084 + function dnews () {
3085 + emulate -L zsh
3086 + if [[ -r /usr/share/doc/$1/NEWS.Debian.gz ]] ; then
3087 + $PAGER /usr/share/doc/$1/NEWS.Debian.gz
3088 + else
3089 + if [[ -r /usr/share/doc/$1/NEWS.gz ]] ; then
3090 + $PAGER /usr/share/doc/$1/NEWS.gz
3091 + else
3092 + echo "No NEWS file for package $1 found, sorry."
3093 + return 1
3094 + fi
3095 + fi
3096 + }
3097 + function _dnews () { _files -W /usr/share/doc -/ }
3098 + compdef _dnews dnews
3099 +
3100 + #f3# View Debian's copyright of a given package
3101 + function dcopyright () {
3102 + emulate -L zsh
3103 + if [[ -r /usr/share/doc/$1/copyright ]] ; then
3104 + $PAGER /usr/share/doc/$1/copyright
3105 + else
3106 + echo "No copyright file for package $1 found, sorry."
3107 + return 1
3108 + fi
3109 + }
3110 + function _dcopyright () { _files -W /usr/share/doc -/ }
3111 + compdef _dcopyright dcopyright
3112 +
3113 + #f3# View upstream's changelog of a given package
3114 + function uchange () {
3115 + emulate -L zsh
3116 + if [[ -r /usr/share/doc/$1/changelog.gz ]] ; then
3117 + $PAGER /usr/share/doc/$1/changelog.gz
3118 + else
3119 + echo "No changelog for package $1 found, sorry."
3120 + return 1
3121 + fi
3122 + }
3123 + function _uchange () { _files -W /usr/share/doc -/ }
3124 + compdef _uchange uchange
3125 + fi
3126 +
3127 + # zsh profiling
3128 + function profile () {
3129 + ZSH_PROFILE_RC=1 zsh "$@"
3130 + }
3131 +
3132 + #f1# Edit an alias via zle
3133 + function edalias () {
3134 + [[ -z "$1" ]] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
3135 + }
3136 + compdef _aliases edalias
3137 +
3138 + #f1# Edit a function via zle
3139 + function edfunc () {
3140 + [[ -z "$1" ]] && { echo "Usage: edfunc <function_to_edit>" ; return 1 } || zed -f "$1" ;
3141 + }
3142 + compdef _functions edfunc
3143 +
3144 + # use it e.g. via 'Restart apache2'
3145 + #m# f6 Start() \kbd{service \em{process}}\quad\kbd{start}
3146 + #m# f6 Restart() \kbd{service \em{process}}\quad\kbd{restart}
3147 + #m# f6 Stop() \kbd{service \em{process}}\quad\kbd{stop}
3148 + #m# f6 Reload() \kbd{service \em{process}}\quad\kbd{reload}
3149 + #m# f6 Force-Reload() \kbd{service \em{process}}\quad\kbd{force-reload}
3150 + #m# f6 Status() \kbd{service \em{process}}\quad\kbd{status}
3151 + if [[ -d /etc/init.d || -d /etc/service ]] ; then
3152 + function __start_stop () {
3153 + local action_="${1:l}" # e.g Start/Stop/Restart
3154 + local service_="$2"
3155 + local param_="$3"
3156 +
3157 + local service_target_="$(readlink /etc/init.d/$service_)"
3158 + if [[ $service_target_ == "/usr/bin/sv" ]]; then
3159 + # runit
3160 + case "${action_}" in
3161 + start) if [[ ! -e /etc/service/$service_ ]]; then
3162 + $SUDO ln -s "/etc/sv/$service_" "/etc/service/"
3163 + else
3164 + $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
3165 + fi ;;
3166 + # there is no reload in runits sysv emulation
3167 + reload) $SUDO "/etc/init.d/$service_" "force-reload" "$param_" ;;
3168 + *) $SUDO "/etc/init.d/$service_" "${action_}" "$param_" ;;
3169 + esac
3170 + else
3171 + # sysv/sysvinit-utils, upstart
3172 + if check_com -c service ; then
3173 + $SUDO service "$service_" "${action_}" "$param_"
3174 + else
3175 + $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
3176 + fi
3177 + fi
3178 + }
3179 +
3180 + function _grmlinitd () {
3181 + local -a scripts
3182 + scripts=( /etc/init.d/*(x:t) )
3183 + _describe "service startup script" scripts
3184 + }
3185 +
3186 + for i in Start Restart Stop Force-Reload Reload Status ; do
3187 + eval "function $i () { __start_stop $i \"\$1\" \"\$2\" ; }"
3188 + compdef _grmlinitd $i
3189 + done
3190 + builtin unset -v i
3191 + fi
3192 +
3193 + #f1# Provides useful information on globbing
3194 + function H-Glob () {
3195 + echo -e "
3196 + / directories
3197 + . plain files
3198 + @ symbolic links
3199 + = sockets
3200 + p named pipes (FIFOs)
3201 + * executable plain files (0100)
3202 + % device files (character or block special)
3203 + %b block special files
3204 + %c character special files
3205 + r owner-readable files (0400)
3206 + w owner-writable files (0200)
3207 + x owner-executable files (0100)
3208 + A group-readable files (0040)
3209 + I group-writable files (0020)
3210 + E group-executable files (0010)
3211 + R world-readable files (0004)
3212 + W world-writable files (0002)
3213 + X world-executable files (0001)
3214 + s setuid files (04000)
3215 + S setgid files (02000)
3216 + t files with the sticky bit (01000)
3217 +
3218 + print *(m-1) # Files modified up to a day ago
3219 + print *(a1) # Files accessed a day ago
3220 + print *(@) # Just symlinks
3221 + print *(Lk+50) # Files bigger than 50 kilobytes
3222 + print *(Lk-50) # Files smaller than 50 kilobytes
3223 + print **/*.c # All *.c files recursively starting in \$PWD
3224 + print **/*.c~file.c # Same as above, but excluding 'file.c'
3225 + print (foo|bar).* # Files starting with 'foo' or 'bar'
3226 + print *~*.* # All Files that do not contain a dot
3227 + chmod 644 *(.^x) # make all plain non-executable files publically readable
3228 + print -l *(.c|.h) # Lists *.c and *.h
3229 + print **/*(g:users:) # Recursively match all files that are owned by group 'users'
3230 + echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
3231 + }
3232 + alias help-zshglob=H-Glob
3233 +
3234 + # grep for running process, like: 'any vim'
3235 + function any () {
3236 + emulate -L zsh
3237 + unsetopt KSH_ARRAYS
3238 + if [[ -z "$1" ]] ; then
3239 + echo "any - grep for process(es) by keyword" >&2
3240 + echo "Usage: any <keyword>" >&2 ; return 1
3241 + else
3242 + ps xauwww | grep -i "${grep_options[@]}" "[${1[1]}]${1[2,-1]}"
3243 + fi
3244 + }
3245 +
3246 +
3247 + # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
3248 + # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
3249 + [[ -r /proc/1/maps ]] && \
3250 + function deswap () {
3251 + print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
3252 + cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
3253 + print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
3254 + }
3255 +
3256 + # a wrapper for vim, that deals with title setting
3257 + # VIM_OPTIONS
3258 + # set this array to a set of options to vim you always want
3259 + # to have set when calling vim (in .zshrc.local), like:
3260 + # VIM_OPTIONS=( -p )
3261 + # This will cause vim to send every file given on the
3262 + # commandline to be send to it's own tab (needs vim7).
3263 + if check_com vim; then
3264 + function vim () {
3265 + VIM_PLEASE_SET_TITLE='yes' command vim ${VIM_OPTIONS} "$@"
3266 + }
3267 + fi
3268 +
3269 + ssl_hashes=( sha512 sha256 sha1 md5 )
3270 +
3271 + for sh in ${ssl_hashes}; do
3272 + eval 'ssl-cert-'${sh}'() {
3273 + emulate -L zsh
3274 + if [[ -z $1 ]] ; then
3275 + printf '\''usage: %s <file>\n'\'' "ssh-cert-'${sh}'"
3276 + return 1
3277 + fi
3278 + openssl x509 -noout -fingerprint -'${sh}' -in $1
3279 + }'
3280 + done; unset sh
3281 +
3282 + function ssl-cert-fingerprints () {
3283 + emulate -L zsh
3284 + local i
3285 + if [[ -z $1 ]] ; then
3286 + printf 'usage: ssl-cert-fingerprints <file>\n'
3287 + return 1
3288 + fi
3289 + for i in ${ssl_hashes}
3290 + do ssl-cert-$i $1;
3291 + done
3292 + }
3293 +
3294 + function ssl-cert-info () {
3295 + emulate -L zsh
3296 + if [[ -z $1 ]] ; then
3297 + printf 'usage: ssl-cert-info <file>\n'
3298 + return 1
3299 + fi
3300 + openssl x509 -noout -text -in $1
3301 + ssl-cert-fingerprints $1
3302 + }
3303 +
3304 + # make sure our environment is clean regarding colors
3305 + builtin unset -v BLUE RED GREEN CYAN YELLOW MAGENTA WHITE NO_COLOR
3306 +
3307 + # "persistent history"
3308 + # just write important commands you always need to $GRML_IMPORTANT_COMMANDS
3309 + # defaults for backward compatibility to ~/.important_commands
3310 + if [[ -r ~/.important_commands ]] ; then
3311 + GRML_IMPORTANT_COMMANDS=~/.important_commands
3312 + else
3313 + GRML_IMPORTANT_COMMANDS=${GRML_IMPORTANT_COMMANDS:-${ZDOTDIR:-${HOME}}/.important_commands}
3314 + fi
3315 + [[ -r ${GRML_IMPORTANT_COMMANDS} ]] && builtin fc -R ${GRML_IMPORTANT_COMMANDS}
3316 +
3317 + # load the lookup subsystem if it's available on the system
3318 + zrcautoload lookupinit && lookupinit
3319 +
3320 + # variables
3321 +
3322 + # set terminal property (used e.g. by msgid-chooser)
3323 + case "${COLORTERM}" in
3324 + truecolor)
3325 + # do not overwrite
3326 + ;;
3327 + *)
3328 + export COLORTERM="yes"
3329 + ;;
3330 + esac
3331 +
3332 + # aliases
3333 +
3334 + # general
3335 + #a2# Execute \kbd{du -sch}
3336 + [[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias da='du -sch'
3337 +
3338 + # listing stuff
3339 + #a2# Execute \kbd{ls -lSrah}
3340 + alias dir="command ls -lSrah"
3341 + #a2# Only show dot-directories
3342 + alias lad='command ls -d .*(/)'
3343 + #a2# Only show dot-files
3344 + alias lsa='command ls -a .*(.)'
3345 + #a2# Only files with setgid/setuid/sticky flag
3346 + alias lss='command ls -l *(s,S,t)'
3347 + #a2# Only show symlinks
3348 + alias lsl='command ls -l *(@)'
3349 + #a2# Display only executables
3350 + alias lsx='command ls -l *(*)'
3351 + #a2# Display world-{readable,writable,executable} files
3352 + alias lsw='command ls -ld *(R,W,X.^ND/)'
3353 + #a2# Display the ten biggest files
3354 + alias lsbig="command ls -flh *(.OL[1,10])"
3355 + #a2# Only show directories
3356 + alias lsd='command ls -d *(/)'
3357 + #a2# Only show empty directories
3358 + alias lse='command ls -d *(/^F)'
3359 + #a2# Display the ten newest files
3360 + alias lsnew="command ls -rtlh *(D.om[1,10])"
3361 + #a2# Display the ten oldest files
3362 + alias lsold="command ls -rtlh *(D.Om[1,10])"
3363 + #a2# Display the ten smallest files
3364 + alias lssmall="command ls -Srl *(.oL[1,10])"
3365 + #a2# Display the ten newest directories and ten newest .directories
3366 + alias lsnewdir="command ls -rthdl *(/om[1,10]) .*(D/om[1,10])"
3367 + #a2# Display the ten oldest directories and ten oldest .directories
3368 + alias lsolddir="command ls -rthdl *(/Om[1,10]) .*(D/Om[1,10])"
3369 +
3370 + # some useful aliases
3371 + #a2# Remove current empty directory. Execute \kbd{cd ..; rmdir \$OLDCWD}
3372 + alias rmcdir='cd ..; rmdir $OLDPWD || cd $OLDPWD'
3373 +
3374 + #a2# ssh with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
3375 + alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3376 + #a2# scp with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
3377 + alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3378 +
3379 + # work around non utf8 capable software in utf environment via $LANG and luit
3380 + if check_com isutfenv && check_com luit ; then
3381 + if check_com -c mrxvt ; then
3382 + isutfenv && [[ -n "$LANG" ]] && \
3383 + alias mrxvt="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit mrxvt"
3384 + fi
3385 +
3386 + if check_com -c aterm ; then
3387 + isutfenv && [[ -n "$LANG" ]] && \
3388 + alias aterm="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit aterm"
3389 + fi
3390 +
3391 + if check_com -c centericq ; then
3392 + isutfenv && [[ -n "$LANG" ]] && \
3393 + alias centericq="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit centericq"
3394 + fi
3395 + fi
3396 +
3397 + # useful functions
3398 +
3399 + #f5# Backup \kbd{file_or_folder {\rm to} file_or_folder\_timestamp}
3400 + function bk () {
3401 + emulate -L zsh
3402 + local current_date=$(date -u "+%Y%m%dT%H%M%SZ")
3403 + local clean keep move verbose result all to_bk
3404 + setopt extended_glob
3405 + keep=1
3406 + while getopts ":hacmrv" opt; do
3407 + case $opt in
3408 + a) (( all++ ));;
3409 + c) unset move clean && (( ++keep ));;
3410 + m) unset keep clean && (( ++move ));;
3411 + r) unset move keep && (( ++clean ));;
3412 + v) verbose="-v";;
3413 + h) <<__EOF0__
3414 + bk [-hcmv] FILE [FILE ...]
3415 + bk -r [-av] [FILE [FILE ...]]
3416 + Backup a file or folder in place and append the timestamp
3417 + Remove backups of a file or folder, or all backups in the current directory
3418 +
3419 + Usage:
3420 + -h Display this help text
3421 + -c Keep the file/folder as is, create a copy backup using cp(1) (default)
3422 + -m Move the file/folder, using mv(1)
3423 + -r Remove backups of the specified file or directory, using rm(1). If none
3424 + is provided, remove all backups in the current directory.
3425 + -a Remove all (even hidden) backups.
3426 + -v Verbose
3427 +
3428 + The -c, -r and -m options are mutually exclusive. If specified at the same time,
3429 + the last one is used.
3430 +
3431 + The return code is the sum of all cp/mv/rm return codes.
3432 + __EOF0__
3433 + return 0;;
3434 + \?) bk -h >&2; return 1;;
3435 + esac
3436 + done
3437 + shift "$((OPTIND-1))"
3438 + if (( keep > 0 )); then
3439 + if islinux || isfreebsd; then
3440 + for to_bk in "$@"; do
3441 + cp $verbose -a "${to_bk%/}" "${to_bk%/}_$current_date"
3442 + (( result += $? ))
3443 + done
3444 + else
3445 + for to_bk in "$@"; do
3446 + cp $verbose -pR "${to_bk%/}" "${to_bk%/}_$current_date"
3447 + (( result += $? ))
3448 + done
3449 + fi
3450 + elif (( move > 0 )); then
3451 + while (( $# > 0 )); do
3452 + mv $verbose "${1%/}" "${1%/}_$current_date"
3453 + (( result += $? ))
3454 + shift
3455 + done
3456 + elif (( clean > 0 )); then
3457 + if (( $# > 0 )); then
3458 + for to_bk in "$@"; do
3459 + rm $verbose -rf "${to_bk%/}"_[0-9](#c8)T([0-1][0-9]|2[0-3])([0-5][0-9])(#c2)Z
3460 + (( result += $? ))
3461 + done
3462 + else
3463 + if (( all > 0 )); then
3464 + rm $verbose -rf *_[0-9](#c8)T([0-1][0-9]|2[0-3])([0-5][0-9])(#c2)Z(D)
3465 + else
3466 + rm $verbose -rf *_[0-9](#c8)T([0-1][0-9]|2[0-3])([0-5][0-9])(#c2)Z
3467 + fi
3468 + (( result += $? ))
3469 + fi
3470 + fi
3471 + return $result
3472 + }
3473 +
3474 + #f5# cd to directory and list files
3475 + function cl () {
3476 + emulate -L zsh
3477 + cd $1 && ls -a
3478 + }
3479 +
3480 + # smart cd function, allows switching to /etc when running 'cd /etc/fstab'
3481 + function cd () {
3482 + if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then
3483 + [[ ! -e ${1:h} ]] && return 1
3484 + print "Correcting ${1} to ${1:h}"
3485 + builtin cd ${1:h}
3486 + else
3487 + builtin cd "$@"
3488 + fi
3489 + }
3490 +
3491 + #f5# Create Directory and \kbd{cd} to it
3492 + function mkcd () {
3493 + if (( ARGC != 1 )); then
3494 + printf 'usage: mkcd <new-directory>\n'
3495 + return 1;
3496 + fi
3497 + if [[ ! -d "$1" ]]; then
3498 + command mkdir -p "$1"
3499 + else
3500 + printf '`%s'\'' already exists: cd-ing.\n' "$1"
3501 + fi
3502 + builtin cd "$1"
3503 + }
3504 +
3505 + #f5# Create temporary directory and \kbd{cd} to it
3506 + function cdt () {
3507 + builtin cd "$(mktemp -d)"
3508 + builtin pwd
3509 + }
3510 +
3511 + #f5# List files which have been accessed within the last {\it n} days, {\it n} defaults to 1
3512 + function accessed () {
3513 + emulate -L zsh
3514 + print -l -- *(a-${1:-1})
3515 + }
3516 +
3517 + #f5# List files which have been changed within the last {\it n} days, {\it n} defaults to 1
3518 + function changed () {
3519 + emulate -L zsh
3520 + print -l -- *(c-${1:-1})
3521 + }
3522 +
3523 + #f5# List files which have been modified within the last {\it n} days, {\it n} defaults to 1
3524 + function modified () {
3525 + emulate -L zsh
3526 + print -l -- *(m-${1:-1})
3527 + }
3528 + # modified() was named new() in earlier versions, add an alias for backwards compatibility
3529 + check_com new || alias new=modified
3530 +
3531 + # use colors when GNU grep with color-support
3532 + if (( $#grep_options > 0 )); then
3533 + o=${grep_options:+"${grep_options[*]}"}
3534 + #a2# Execute \kbd{grep -{}-color=auto}
3535 + alias grep='grep '$o
3536 + alias egrep='egrep '$o
3537 + unset o
3538 + fi
3539 +
3540 + # Translate DE<=>EN
3541 + # 'translate' looks up a word in a file with language-to-language
3542 + # translations (field separator should be " : "). A typical wordlist looks
3543 + # like the following:
3544 + # | english-word : german-translation
3545 + # It's also only possible to translate english to german but not reciprocal.
3546 + # Use the following oneliner to reverse the sort order:
3547 + # $ awk -F ':' '{ print $2" : "$1" "$3 }' \
3548 + # /usr/local/lib/words/en-de.ISO-8859-1.vok > ~/.translate/de-en.ISO-8859-1.vok
3549 + #f5# Translates a word
3550 + function trans () {
3551 + emulate -L zsh
3552 + case "$1" in
3553 + -[dD]*)
3554 + translate -l de-en $2
3555 + ;;
3556 + -[eE]*)
3557 + translate -l en-de $2
3558 + ;;
3559 + *)
3560 + echo "Usage: $0 { -D | -E }"
3561 + echo " -D == German to English"
3562 + echo " -E == English to German"
3563 + esac
3564 + }
3565 +
3566 + # Usage: simple-extract <file>
3567 + # Using option -d deletes the original archive file.
3568 + #f5# Smart archive extractor
3569 + function simple-extract () {
3570 + emulate -L zsh
3571 + setopt extended_glob noclobber
3572 + local ARCHIVE DELETE_ORIGINAL DECOMP_CMD USES_STDIN USES_STDOUT GZTARGET WGET_CMD
3573 + local RC=0
3574 + zparseopts -D -E "d=DELETE_ORIGINAL"
3575 + for ARCHIVE in "${@}"; do
3576 + case $ARCHIVE in
3577 + *(tar.bz2|tbz2|tbz))
3578 + DECOMP_CMD="tar -xvjf -"
3579 + USES_STDIN=true
3580 + USES_STDOUT=false
3581 + ;;
3582 + *(tar.gz|tgz))
3583 + DECOMP_CMD="tar -xvzf -"
3584 + USES_STDIN=true
3585 + USES_STDOUT=false
3586 + ;;
3587 + *(tar.xz|txz|tar.lzma))
3588 + DECOMP_CMD="tar -xvJf -"
3589 + USES_STDIN=true
3590 + USES_STDOUT=false
3591 + ;;
3592 + *tar.zst)
3593 + DECOMP_CMD="tar --zstd -xvf -"
3594 + USES_STDIN=true
3595 + USES_STDOUT=false
3596 + ;;
3597 + *tar.lrz)
3598 + DECOMP_CMD="lrzuntar"
3599 + USES_STDIN=false
3600 + USES_STDOUT=false
3601 + ;;
3602 + *tar)
3603 + DECOMP_CMD="tar -xvf -"
3604 + USES_STDIN=true
3605 + USES_STDOUT=false
3606 + ;;
3607 + *rar)
3608 + DECOMP_CMD="unrar x"
3609 + USES_STDIN=false
3610 + USES_STDOUT=false
3611 + ;;
3612 + *lzh)
3613 + DECOMP_CMD="lha x"
3614 + USES_STDIN=false
3615 + USES_STDOUT=false
3616 + ;;
3617 + *7z)
3618 + DECOMP_CMD="7z x"
3619 + USES_STDIN=false
3620 + USES_STDOUT=false
3621 + ;;
3622 + *(zip|jar))
3623 + DECOMP_CMD="unzip"
3624 + USES_STDIN=false
3625 + USES_STDOUT=false
3626 + ;;
3627 + *deb)
3628 + DECOMP_CMD="ar -x"
3629 + USES_STDIN=false
3630 + USES_STDOUT=false
3631 + ;;
3632 + *bz2)
3633 + DECOMP_CMD="bzip2 -d -c -"
3634 + USES_STDIN=true
3635 + USES_STDOUT=true
3636 + ;;
3637 + *(gz|Z))
3638 + DECOMP_CMD="gzip -d -c -"
3639 + USES_STDIN=true
3640 + USES_STDOUT=true
3641 + ;;
3642 + *(xz|lzma))
3643 + DECOMP_CMD="xz -d -c -"
3644 + USES_STDIN=true
3645 + USES_STDOUT=true
3646 + ;;
3647 + *zst)
3648 + DECOMP_CMD="zstd -d -c -"
3649 + USES_STDIN=true
3650 + USES_STDOUT=true
3651 + ;;
3652 + *lrz)
3653 + DECOMP_CMD="lrunzip -"
3654 + USES_STDIN=true
3655 + USES_STDOUT=true
3656 + ;;
3657 + *)
3658 + print "ERROR: '$ARCHIVE' has unrecognized archive type." >&2
3659 + RC=$((RC+1))
3660 + continue
3661 + ;;
3662 + esac
3663 +
3664 + if ! check_com ${DECOMP_CMD[(w)1]}; then
3665 + echo "ERROR: ${DECOMP_CMD[(w)1]} not installed." >&2
3666 + RC=$((RC+2))
3667 + continue
3668 + fi
3669 +
3670 + GZTARGET="${ARCHIVE:t:r}"
3671 + if [[ -f $ARCHIVE ]] ; then
3672 +
3673 + print "Extracting '$ARCHIVE' ..."
3674 + if $USES_STDIN; then
3675 + if $USES_STDOUT; then
3676 + ${=DECOMP_CMD} < "$ARCHIVE" > $GZTARGET
3677 + else
3678 + ${=DECOMP_CMD} < "$ARCHIVE"
3679 + fi
3680 + else
3681 + if $USES_STDOUT; then
3682 + ${=DECOMP_CMD} "$ARCHIVE" > $GZTARGET
3683 + else
3684 + ${=DECOMP_CMD} "$ARCHIVE"
3685 + fi
3686 + fi
3687 + [[ $? -eq 0 && -n "$DELETE_ORIGINAL" ]] && rm -f "$ARCHIVE"
3688 +
3689 + elif [[ "$ARCHIVE" == (#s)(https|http|ftp)://* ]] ; then
3690 + if check_com curl; then
3691 + WGET_CMD="curl -L -s -o -"
3692 + elif check_com wget; then
3693 + WGET_CMD="wget -q -O -"
3694 + elif check_com fetch; then
3695 + WGET_CMD="fetch -q -o -"
3696 + else
3697 + print "ERROR: neither wget, curl nor fetch is installed" >&2
3698 + RC=$((RC+4))
3699 + continue
3700 + fi
3701 + print "Downloading and Extracting '$ARCHIVE' ..."
3702 + if $USES_STDIN; then
3703 + if $USES_STDOUT; then
3704 + ${=WGET_CMD} "$ARCHIVE" | ${=DECOMP_CMD} > $GZTARGET
3705 + RC=$((RC+$?))
3706 + else
3707 + ${=WGET_CMD} "$ARCHIVE" | ${=DECOMP_CMD}
3708 + RC=$((RC+$?))
3709 + fi
3710 + else
3711 + if $USES_STDOUT; then
3712 + ${=DECOMP_CMD} =(${=WGET_CMD} "$ARCHIVE") > $GZTARGET
3713 + else
3714 + ${=DECOMP_CMD} =(${=WGET_CMD} "$ARCHIVE")
3715 + fi
3716 + fi
3717 +
3718 + else
3719 + print "ERROR: '$ARCHIVE' is neither a valid file nor a supported URI." >&2
3720 + RC=$((RC+8))
3721 + fi
3722 + done
3723 + return $RC
3724 + }
3725 +
3726 + function __archive_or_uri () {
3727 + _alternative \
3728 + 'files:Archives:_files -g "*.(#l)(tar.bz2|tbz2|tbz|tar.gz|tgz|tar.xz|txz|tar.lzma|tar|rar|lzh|7z|zip|jar|deb|bz2|gz|Z|xz|lzma)"' \
3729 + '_urls:Remote Archives:_urls'
3730 + }
3731 +
3732 + function _simple_extract () {
3733 + _arguments \
3734 + '-d[delete original archivefile after extraction]' \
3735 + '*:Archive Or Uri:__archive_or_uri'
3736 + }
3737 + compdef _simple_extract simple-extract
3738 + [[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias se=simple-extract
3739 +
3740 + #f5# Change the xterm title from within GNU-screen
3741 + function xtrename () {
3742 + emulate -L zsh
3743 + if [[ $1 != "-f" ]] ; then
3744 + if [[ -z ${DISPLAY} ]] ; then
3745 + printf 'xtrename only makes sense in X11.\n'
3746 + return 1
3747 + fi
3748 + else
3749 + shift
3750 + fi
3751 + if [[ -z $1 ]] ; then
3752 + printf 'usage: xtrename [-f] "title for xterm"\n'
3753 + printf ' renames the title of xterm from _within_ screen.\n'
3754 + printf ' also works without screen.\n'
3755 + printf ' will not work if DISPLAY is unset, use -f to override.\n'
3756 + return 0
3757 + fi
3758 + print -n "\eP\e]0;${1}\C-G\e\\"
3759 + return 0
3760 + }
3761 +
3762 + # Create small urls via http://goo.gl using curl(1).
3763 + # API reference: https://code.google.com/apis/urlshortener/
3764 + function zurl () {
3765 + emulate -L zsh
3766 + setopt extended_glob
3767 +
3768 + if [[ -z $1 ]]; then
3769 + print "USAGE: zurl <URL>"
3770 + return 1
3771 + fi
3772 +
3773 + local PN url prog api json contenttype item
3774 + local -a data
3775 + PN=$0
3776 + url=$1
3777 +
3778 + # Prepend 'http://' to given URL where necessary for later output.
3779 + if [[ ${url} != http(s|)://* ]]; then
3780 + url='http://'${url}
3781 + fi
3782 +
3783 + if check_com -c curl; then
3784 + prog=curl
3785 + else
3786 + print "curl is not available, but mandatory for ${PN}. Aborting."
3787 + return 1
3788 + fi
3789 + api='https://www.googleapis.com/urlshortener/v1/url'
3790 + contenttype="Content-Type: application/json"
3791 + json="{\"longUrl\": \"${url}\"}"
3792 + data=(${(f)"$($prog --silent -H ${contenttype} -d ${json} $api)"})
3793 + # Parse the response
3794 + for item in "${data[@]}"; do
3795 + case "$item" in
3796 + ' '#'"id":'*)
3797 + item=${item#*: \"}
3798 + item=${item%\",*}
3799 + printf '%s\n' "$item"
3800 + return 0
3801 + ;;
3802 + esac
3803 + done
3804 + return 1
3805 + }
3806 +
3807 + #f2# Find history events by search pattern and list them by date.
3808 + function whatwhen () {
3809 + emulate -L zsh
3810 + local usage help ident format_l format_s first_char remain first last
3811 + usage='USAGE: whatwhen [options] <searchstring> <search range>'
3812 + help='Use `whatwhen -h'\'' for further explanations.'
3813 + ident=${(l,${#${:-Usage: }},, ,)}
3814 + format_l="${ident}%s\t\t\t%s\n"
3815 + format_s="${format_l//(\\t)##/\\t}"
3816 + # Make the first char of the word to search for case
3817 + # insensitive; e.g. [aA]
3818 + first_char=[${(L)1[1]}${(U)1[1]}]
3819 + remain=${1[2,-1]}
3820 + # Default search range is `-100'.
3821 + first=${2:-\-100}
3822 + # Optional, just used for `<first> <last>' given.
3823 + last=$3
3824 + case $1 in
3825 + ("")
3826 + printf '%s\n\n' 'ERROR: No search string specified. Aborting.'
3827 + printf '%s\n%s\n\n' ${usage} ${help} && return 1
3828 + ;;
3829 + (-h)
3830 + printf '%s\n\n' ${usage}
3831 + print 'OPTIONS:'
3832 + printf $format_l '-h' 'show help text'
3833 + print '\f'
3834 + print 'SEARCH RANGE:'
3835 + printf $format_l "'0'" 'the whole history,'
3836 + printf $format_l '-<n>' 'offset to the current history number; (default: -100)'
3837 + printf $format_s '<[-]first> [<last>]' 'just searching within a give range'
3838 + printf '\n%s\n' 'EXAMPLES:'
3839 + printf ${format_l/(\\t)/} 'whatwhen grml' '# Range is set to -100 by default.'
3840 + printf $format_l 'whatwhen zsh -250'
3841 + printf $format_l 'whatwhen foo 1 99'
3842 + ;;
3843 + (\?)
3844 + printf '%s\n%s\n\n' ${usage} ${help} && return 1
3845 + ;;
3846 + (*)
3847 + # -l list results on stout rather than invoking $EDITOR.
3848 + # -i Print dates as in YYYY-MM-DD.
3849 + # -m Search for a - quoted - pattern within the history.
3850 + fc -li -m "*${first_char}${remain}*" $first $last
3851 + ;;
3852 + esac
3853 + }
3854 +
3855 + # mercurial related stuff
3856 + if check_com -c hg ; then
3857 + # gnu like diff for mercurial
3858 + # http://www.selenic.com/mercurial/wiki/index.cgi/TipsAndTricks
3859 + #f5# GNU like diff for mercurial
3860 + function hgdi () {
3861 + emulate -L zsh
3862 + local i
3863 + for i in $(hg status -marn "$@") ; diff -ubwd <(hg cat "$i") "$i"
3864 + }
3865 +
3866 + # build debian package
3867 + #a2# Alias for \kbd{hg-buildpackage}
3868 + alias hbp='hg-buildpackage'
3869 +
3870 + # execute commands on the versioned patch-queue from the current repos
3871 + [[ -n "$GRML_NO_SMALL_ALIASES" ]] || alias mq='hg -R $(readlink -f $(hg root)/.hg/patches)'
3872 +
3873 + # diffstat for specific version of a mercurial repository
3874 + # hgstat => display diffstat between last revision and tip
3875 + # hgstat 1234 => display diffstat between revision 1234 and tip
3876 + #f5# Diffstat for specific version of a mercurial repos
3877 + function hgstat () {
3878 + emulate -L zsh
3879 + [[ -n "$1" ]] && hg diff -r $1 -r tip | diffstat || hg export tip | diffstat
3880 + }
3881 +
3882 + fi # end of check whether we have the 'hg'-executable
3883 +
3884 + # disable bracketed paste mode for dumb terminals
3885 + [[ "$TERM" == dumb ]] && unset zle_bracketed_paste
3886 +
3887 + # grml-small cleanups and workarounds
3888 +
3889 + # The following is used to remove zsh-config-items that do not work
3890 + # in grml-small by default.
3891 + # If you do not want these adjustments (for whatever reason), set
3892 + # $GRMLSMALL_SPECIFIC to 0 in your .zshrc.pre file (which this configuration
3893 + # sources if it is there).
3894 +
3895 + if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then
3896 +
3897 + # Clean up
3898 +
3899 + unset "abk[V]"
3900 + unalias 'V' &> /dev/null
3901 + unfunction vman &> /dev/null
3902 + unfunction viless &> /dev/null
3903 + unfunction 2html &> /dev/null
3904 +
3905 + # manpages are not in grmlsmall
3906 + unfunction manzsh &> /dev/null
3907 + unfunction man2 &> /dev/null
3908 +
3909 + # Workarounds
3910 +
3911 + # See https://github.com/grml/grml/issues/56
3912 + if ! [[ -x ${commands[dig]} ]]; then
3913 + function dig_after_all () {
3914 + unfunction dig
3915 + unfunction _dig
3916 + autoload -Uz _dig
3917 + unfunction dig_after_all
3918 + }
3919 + function dig () {
3920 + if [[ -x ${commands[dig]} ]]; then
3921 + dig_after_all
3922 + command dig "$@"
3923 + return "$!"
3924 + fi
3925 + printf 'This installation does not include `dig'\'' for size reasons.\n'
3926 + printf 'Try `drill'\'' as a light weight alternative.\n'
3927 + return 0
3928 + }
3929 + function _dig () {
3930 + if [[ -x ${commands[dig]} ]]; then
3931 + dig_after_all
3932 + zle -M 'Found `dig'\'' installed. '
3933 + else
3934 + zle -M 'Try `drill'\'' instead of `dig'\''.'
3935 + fi
3936 + }
3937 + compdef _dig dig
3938 + fi
3939 + fi
3940 +
3941 + zrclocal
3942 +
3943 + unfunction grml_status_feature
3944 +
3945 + ## genrefcard.pl settings
3946 +
3947 + ### doc strings for external functions from files
3948 + #m# f5 grml-wallpaper() Sets a wallpaper (try completion for possible values)
3949 +
3950 + ### example: split functions-search 8,16,24,32
3951 + #@# split functions-search 8
3952 +
3953 + ## END OF FILE #################################################################
3954 + # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4
3955 + # Local variables:
3956 + # mode: sh
3957 + # End:
3958 +
3959 + # Make Flatpaks accessible via the shell
3960 + export PATH="$PATH:/var/lib/flatpak/exports/bin"
3961 +
3962 + # Reset prompt to default
3963 + prompt default
3964 + PROMPT='%# '
3965 +
3966 + # Load Headline ZSH theme
3967 + source ~/.config/headline.zsh-theme
Siguiente Anterior