X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=zsh%2Frc;h=37ca7a1f33e54f4914d188eedebc6760f701b837;hb=785f18e2984da17351be5e5691dcefea469d2437;hp=23f936935f5a8acbb78450c3468237d6824aaa77;hpb=78f40aeb6f67e6ad9f31a9fbd2471d8a0016ebe0;p=config%2Fdotfiles.git diff --git a/zsh/rc b/zsh/rc index 23f9369..37ca7a1 100644 --- a/zsh/rc +++ b/zsh/rc @@ -1,7 +1,7 @@ # Zsh configuration file. -source_debug "sourcing ~/.zsh/rc" +source_debug ". ~/.zsh/rc" # MISCELLANEOUS SETTINGS @@ -37,8 +37,9 @@ setopt ignoreeof # Use Vi(m) style key bindings. bindkey -v -# Also use jj to exit insert mode. +# Use jj and jk to exit insert mode. bindkey 'jj' vi-cmd-mode +bindkey 'jk' vi-cmd-mode # I don't need the arrow keys, I use ^N and ^P for this (see below). bindkey -r '^[OA' '^[OB' '^[OC' '^[OD' '^[[A' '^[[B' '^[[C' '^[[D' @@ -61,7 +62,7 @@ fpath=(~/.zsh/functions $fpath) # Autoload my functions (except completion functions and hidden files). Thanks # to caphuso from the Zsh example files for this idea. if [[ -d ~/.zsh/functions ]]; then - autoload ${fpath[1]}/^_*(^/:t) + autoload -Uz ${fpath[1]}/^_*(^/:t) fi # Simulate hooks using _functions arrays for Zsh versions older than 4.3.4. At @@ -95,8 +96,8 @@ fi # Autoload add-zsh-hook to add/remove zsh hook functions easily. autoload -Uz add-zsh-hook -# Load zmv (zsh move) which is powerful to rename files. -autoload zmv +# Load zmv (zsh move) which is a powerful file renamer. +autoload -Uz zmv # HISTORY SETTINGS @@ -113,10 +114,10 @@ setopt incappendhistory setopt histignoredups # Vim like completions of previous executed commands (also enter Vi-mode). If # called at the beginning it just recalls old commands (like cursor up), if -# called after typing something, only lines starting with the typed are -# returned. Very useful to get old commands quickly. Thanks to Mikachu in #zsh -# on Freenode (2010-01-17 12:47) for the information how to a use function -# with bindkey. +# called after typing something, only lines starting with the typed text are +# returned. Very useful to get old commands quickly - in addition to the +# history commands (!..). Thanks to Mikachu in #zsh on Freenode (2010-01-17 +# 12:47 CET) for the information how to a use function with bindkey. zle -N my-vi-history-beginning-search-backward my-vi-history-beginning-search-backward() { local not_at_beginning_of_line @@ -143,10 +144,13 @@ bindkey -a '^N' history-beginning-search-forward # PROMPT SETTINGS # Use colorized output, necessary for prompts and completions. -autoload -U colors && colors +autoload -Uz colors && colors + +# Necessary for $EPOCHSECONDS, the UNIX time. +zmodload zsh/datetime # Some shortcuts for colors. The %{...%} tells zsh that the data in between -# doesn't need any space, necessary for correct prompt draw. +# doesn't need any space, necessary for correct prompt drawing. local red="%{${fg[red]}%}" local blue="%{${fg[blue]}%}" local green="%{${fg[green]}%}" @@ -195,17 +199,17 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) || # changes are detected in the repository; check-for-changes must be set to # true for this to work. Thanks to Bart Trojanowski # (http://jukie.net/~bart/blog/pimping-out-zsh-prompt) for the idea - # (2010-03-11 00:20). + # (2010-03-11 00:20 CET). zstyle ':vcs_info:*' unstagedstr '¹' zstyle ':vcs_info:*' stagedstr '²' - # Default to running vcs_info. If possible we prevent running it later for + # Default to run vcs_info. If possible we prevent running it later for # speed reasons. If set to a non empty value vcs_info is run. FORCE_RUN_VCS_INFO=1 # Cache system inspired by Bart Trojanowski # (http://jukie.net/~bart/blog/pimping-out-zsh-prompt). - #zstyle ':vcs_info:*+pre-get-data:*' hooks pre-get-data + zstyle ':vcs_info:*+pre-get-data:*' hooks pre-get-data +vi-pre-get-data() { # Only Git and Mercurial support and need caching. Abort if any other # VCS is used. @@ -238,35 +242,61 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) || } add-zsh-hook chpwd prompt_chpwd + # Used by prompt code below to determine if vcs_info should be run. RUN_VCS_INFO=1 else RUN_VCS_INFO= fi -# Set the default prompt. The current host and working directory is displayed, +# Set the prompt. A two line prompt is used. On the top left the current +# working directory is displayed, on the right vcs_info (if available) and the +# current time in hex. On the bottom left current user name and host is shown, # the exit code of the last command if it wasn't 0, the number of running jobs # if not 0. # # The prompt is in green and blue to make easily detectable, the error exit # code in red and bold and the job count in yellow. +# +# Thanks to Adam's prompt for the basic idea of this prompt. prompt_precmd() { + # Regex to remove elements which take no space. Used to calculate the + # width of the top prompt. Thanks to Bart's and Adam's prompt code in + # Functions/Prompts/prompt_*_setup. + local zero='%([BSUbfksu]|([FB]|){*})' + # Call vcs_info before every prompt. if [[ -n $RUN_VCS_INFO ]]; then vcs_info + else + vcs_info_msg_0_= + fi - # Display the VCS information in the right prompt. - if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ]]; then - RPROMPT="${vcs_info_msg_0_}" - # There is a bug in Zsh below 4.3.9 which displays a wrong symbol when - # ${vcs_info_msg_0_} is empty. Provide a workaround for those versions, - # thanks to Frank Terbeck for it. - else - RPROMPT="${vcs_info_msg_0_:- }" - fi + local width width_left width_right + local top_left top_right + + # Display the current time in HEX in bright blue and vcs_info (if used) on + # the right in the top prompt. + top_right="$vcs_info_msg_0_($blue%B0x$(([##16] EPOCHSECONDS))%b$default)" + width_right=${#${(S%%)top_right//$~zero/}} + # Remove it if it would get too long. + if [[ $(( COLUMNS - 4 - 1 - width_right )) -lt 0 ]]; then + top_right= + width_right=0 fi - PROMPT="$green%B%m%b$default:$blue%B%~%b$default \ -%(1j.$yellow%j$default.)%# \ + # Display current directory on the left in the top prompt. Truncate the + # directory if necessary. + width=$(( COLUMNS - 4 - 1 - width_right )) + top_left=".-$default%b($yellow%$width<..<%~%<<$default)%B$blue" + + # Calculate the width of the top prompt to fill the middle with "-". + width_left=${#${(S%%)top_left//$~zero/}} + width_right=${#${(S%%)top_right//$~zero/}} + width=$(( COLUMNS - width_left - width_right )) + + PROMPT="$blue%B$top_left${(l:$width::-:)}%b$default$top_right +$blue%B'%b$default\ +$green%B%n%b$default@$green%B%m%b$default %(1j.$yellow%j$default.)%# \ %(?..($red%B%?%b$default%) )" } add-zsh-hook precmd prompt_precmd @@ -294,7 +324,7 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then # precmd() call. window_reset=yes # Is set to a non empty value when the shell is running as root. - if [[ $(id -u) -eq 0 ]]; then + if [[ $UID -eq 0 ]]; then window_root=yes fi @@ -315,7 +345,7 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then # Ignore often used commands which are only running for a very short # time. This prevents a "blinking" name when it's changed to "cd" for # example and then some milliseconds later back to "zsh". - [[ $program_name == (cd*|ls|la|ll|clear|c) ]] && return + [[ $program_name == (cd*|d|ls|l|la|ll|clear|c) ]] && return # Change my shortcuts so the real name of the program is displayed. case $program_name in @@ -347,7 +377,10 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then # If screen is running in SSH then display "@:hostname" as title # in the term/outer screen. if [[ $program_name == @screen ]]; then - program_name="@:${$(hostname)//.*/}" + program_name="@:${HOST//.*/}" + # Use "@:!hostname" for root screens. + elif [[ $program_name == @!screen ]]; then + program_name="@:!${HOST//.*/}" fi fi @@ -383,14 +416,16 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then window_reset= } - # Sets the window title. Works with screen, xterm and rxvt. + # Sets the window title. Works with screen, xterm and rxvt. (V) escapes + # all non-printable characters. Thanks to Mikachu in #zsh on Freenode + # (2010-08-07 17:09 CEST). if [[ $TERM == screen* ]]; then window_title() { - print -n "\ek$1\e\\" + print -n "\ek${(V)1}\e\\" } elif [[ $TERM == xterm* || $TERM == rxvt* ]]; then window_title() { - print -n "\e]2;$1\e\\" + print -n "\e]2;${(V)1}\e\\" } else # Fallback if another TERM is used. @@ -400,28 +435,34 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then # Add the preexec() and precmd() hooks. add-zsh-hook preexec window_preexec add-zsh-hook precmd window_precmd +else + # Fallback if another TERM is used, necessary to run screen (see below in + # "RUN COMMANDS"). + window_preexec() { } fi # COMPLETION SETTINGS -# Load the complist module which provides additions to completion lists -# (coloring, scrollable). +# Load the complist module which provides additional features to completion +# lists (coloring, scrolling). zmodload zsh/complist # Use new completion system, store dumpfile in ~/.zsh/cache to prevent # cluttering of ~/. $fpath must be set before calling this. Thanks to Adlai in -# #zsh on Freenode (2009-08-07 21:05) for reminding me of the $fpath problem. -autoload -U compinit && compinit -d ~/.zsh/cache/zcompdump +# #zsh on Freenode (2009-08-07 21:05 CEST) for reminding me of the $fpath +# problem. +autoload -Uz compinit && compinit -d ~/.zsh/cache/zcompdump -# Use cache to speed up completions. +# Use cache to speed up some slow completions (dpkg, perl modules, etc.). zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path ~/.zsh/cache # Complete arguments and fix spelling mistakes when possible. zstyle ':completion:*' completer _complete _match _correct _approximate -# Make sure the list of possible completions is displayed after pressing -# the first time. +# If there are multiple matches after pressing always display them +# immediately without requiring another . a lists aaa, aab, aac as +# possible completions if the directory contains aaa, aab, aac, bbb. setopt nolistambiguous # Allow completions in the middle of a text, i.e. "/usr/bin/whatever" # completes like "/usr/bin/". Useful when adding new options to commands. @@ -430,18 +471,21 @@ bindkey '^I' expand-or-complete-prefix # typing in lowercase most of the time and completion fixes the case. zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' -# Use ls like colors for completions. +# Use ls-like colors for completions. zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} # Make completion lists scrollable so "do you wish to see all n possibilities" -# is no longer displayed. +# is no longer displayed. Display current position in percent (%p). zstyle ':completion:*' list-prompt '%p' -# Display group name (like 'external command', 'alias', etc.) when there are -# multiple matches in bold. +# Display group name (%d) (like 'external command', 'alias', etc.), in bold. zstyle ':completion:*' format ' %B%d%b:' # Display different types of matches separately. zstyle ':completion:*' group-name '' +# Don't draw trailing / in bold (new in zsh 4.3.11). Thanks to Mikachu in #zsh +# on Freenode for the fix (2010-12-17 13:46 CET). +zle_highlight=(suffix:none) + # Ignore completion functions. zstyle ':completion:*:functions' ignored-patterns '_*' # Ignore parent directory. @@ -454,6 +498,21 @@ zstyle ':completion:*' ignore-line yes # Except for mv and cp, because I often want to use to similar names, so I # complete to the same and change it. zstyle ':completion:*:(mv|cp):*' ignore-line no +# Don't complete ./config.* files, this makes running ./configure much +# simpler. Thanks to Nomexous in #zsh on Freenode (2010-03-16 01:54 CET) +zstyle ':completion:*:*:-command-:*' ignored-patterns './config.*' + +# Don't complete unwanted files with Vim. Thanks to Nomexous in #zsh on +# Freenode (2010-06-06 04:54 CEST). See below for a way to complete them. +zstyle ':completion:*:*:vim:*:all-files' ignored-patterns '*.aux' '*.log' \ + '*.pdf' '*.class' + +# Provide a fallback completer which always completes files. Useful when Zsh's +# completion is too "smart". Thanks to Frank Terbeck +# (http://www.zsh.org/mla/users/2009/msg01038.html). +zle -C complete-files complete-word _generic +zstyle ':completion:complete-files:*' completer _files +bindkey '^F' complete-files # CUSTOM ALIASES AND FUNCTIONS @@ -475,17 +534,6 @@ TRAPINT() { return $1 } -# Colorize stderr. Very useful when looking for errors. Thanks to -# http://gentoo-wiki.com/wiki/Zsh for the basic script and Mikachu in #zsh on -# Freenode (2010-03-07 04:03) for some improvements (-r, printf). It's not yet -# perfect and doesn't work with su and git for example, but it can handle most -# interactive output quite well (even with no trailing new line) and in those -# cases the E alias can be used as workaround. -exec 2>>(while read -r -k -u 0 line; do - printf '\e[91m%s\e[0m' "$line"; - print -n $'\0'; -done &) - # Load aliases and similar functions also used by other shells. if [[ -f ~/.shell/aliases ]]; then . ~/.shell/aliases @@ -536,48 +584,39 @@ tig() { $@ } +# Pipe output through less. +tree() { + command tree -C "$@" | less +} -# OS SPECIFIC SETTINGS +# Automatically disown. +xpdf() { + command xpdf "$@" & + disown %command +} -local uname=$(uname) -if [[ $uname == Linux ]]; then +# OS SPECIFIC SETTINGS + +if [[ $OSTYPE == linux* ]]; then # Settings when creating Debian packages. DEBEMAIL=simon@ruderich.org export DEBEMAIL DEBFULLNAME='Simon Ruderich' export DEBFULLNAME - -elif [[ $uname == Darwin ]]; then # Mac OS X - # Store the current clipboard in CLIPBOARD before every command so it can - # be used in commands. - os_darwin_preexec() { - export CLIPBOARD="$(pbpaste)" - } - # Add the function as preexec hook. - add-zsh-hook preexec os_darwin_preexec - - # Initialize CLIPBOARD so it's available for completion directly after - # startup. - CLIPBOARD="" - export CLIPBOARD - - # Fetch current URL in clipboard with wget. - alias wnc='wget --no-proxy $CLIPBOARD' fi # LOAD ADDITIONAL CONFIGURATION FILES -# Load rc file for current hostname (first part before a dot) or rc.local. -source_config ~/.zsh host rc ${$(hostname)//.*/} +source_config ~/.zsh/rc.local # RUN COMMANDS # If not already in screen reattach to a running session or create a new one. -# This also starts screen one a remote server when connecting through ssh. -if [[ $TERM != dumb && -z $STY ]]; then +# This also starts screen on a remote server when connecting through ssh. +if [[ $TERM != dumb && $TERM != linux && -z $STY ]]; then # Get running detached sessions. session=$(screen -list | grep 'Detached' | awk '{ print $1; exit }') @@ -593,7 +632,27 @@ if [[ $TERM != dumb && -z $STY ]]; then fi fi +# Colorize stderr in red. Very useful when looking for errors. Thanks to +# http://gentoo-wiki.com/wiki/Zsh for the basic script and Mikachu in #zsh on +# Freenode (2010-03-07 04:03 CET) for some improvements (-r, printf). It's not +# yet perfect and doesn't work with su and git for example, but it can handle +# most interactive output quite well (even with no trailing new line) and in +# cases it doesn't work, the E alias can be used as workaround. +# +# Moved in the "run commands" section to prevent one unnecessary zsh process +# when starting screen (see above). +exec 2>>(while read -r -k -u 0 line; do + printf '\e[91m%s\e[0m' "$line"; + print -n $'\0'; +done &) + +# Run reminder and redisplay it every four hours (if it's available). +PERIOD=14400 +periodic() { + which rem > /dev/null && [ -f ~/.reminders ] && rem -h +} + -source_debug "finished sourcing ~/.zsh/rc" +source_debug ". ~/.zsh/rc (done)" # vim: ft=zsh