# HG changeset patch # User Mikael Berthe # Date 1342286457 -7200 # Node ID 7215ca490221622de42a94c171c89f8d58a109f5 Re-import repository after cleanup from personal stuff (see description) I've remove too dirty or specific stuff, so that i could put this configuration on a public repo. Here's a copy of the initial Mercurial changelog, FWIW... * (2012-07-14) Mikael Berthe Reorganize all scripts * (2012-07-14) Mikael Berthe Add a "tools" directory * (2012-07-14) Mikael Berthe Don't use ^X^C as a keybinding * (2012-07-14) Mikael Berthe Disable ... completion for now * (2012-07-14) Mikael Berthe Add rehash key binding * (2012-07-14) Mikael Berthe Add n fix a few key bindings * (2012-07-14) Mikael Berthe More cleanup Remove zshrc_compinstall Move personnal stuff to zshrc_local * (2012-07-14) Mikael Berthe New commands: ...* Previous commands .. and ... have been renamed to ,, and ,,, * (2012-07-14) Mikael Berthe Add WATCHFMT, move REPORTTIME to zshenv * (2012-07-14) Mikael Berthe Add REPORTTIME * (2012-07-13) Mikael Berthe Add a few useful functions Ideas borrowed from https://github.com/whiteinge/dotfiles/blob/master/.zshrc * (2012-07-13) Mikael Berthe Move aliases to a new file * (2012-07-13) Mikael Berthe Check for zshrc_local existence * (2012-07-13) Mikael Berthe Cleanup vcsinfo prompt * (2012-07-12) Mikael Berthe Colorize time in default color prompt as well * (2012-07-12) Mikael Berthe Prompt: colorize time * (2012-07-12) Mikael Berthe Add a copy of git-prompt.sh * (2012-07-12) Mikael Berthe Update prompt themes Since we do not display the mode on the first line, let's use this place for the date/time. * (2012-07-12) Mikael Berthe Update prompts / new showmode * (2012-07-12) Mikael Berthe More showmode cleanup, part2 * (2012-07-12) Mikael Berthe Switch showmode to using RPROMPT, part1 * (2012-07-12) Mikael Berthe Prompt: many improvements and fixes * (2012-07-11) Mikael Berthe More prompt code cleanup * (2012-07-11) Mikael Berthe More readable prompt generation * (2012-07-11) Mikael Berthe Dynamic path color * (2012-07-11) Mikael Berthe New prompt based on Zsh' vcs_info module * (2012-07-10) Mikael Berthe Add git info, add a light dev2 prompt * (2012-07-10) Mikael Berthe Dev prompt: Improve Mercurial repository detection * (2012-07-08) Mikael Berthe hg prompt: Change color of unapplied patches * (2012-07-08) Mikael Berthe Change Mercurial prompt format * (2012-07-08) Mikael Berthe Try to improve showmode support. Enable it for 256 color terms. * (2012-07-08) Mikael Berthe Fix interaction between showmode and the new "dev" prompt When showmode is disabled (e.g. in screen), do not display the mode in PS1. * (2012-07-08) Mikael Berthe Add development prompt (HG and minimal git support) Can be set up from the shell command line with "prompt_set_dev". * (2012-07-08) Mikael Berthe Ignore Vim swap files * (2009-12-22) Mikael Berthe Slight update zlog{in,out} * (2009-12-22) Mikael Berthe Add zlogin * (2009-12-22) Mikael Berthe Update hgignore list * (2009-12-22) Mikael Berthe Initial import into Mercurial diff -r 000000000000 -r 7215ca490221 .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,5 @@ +syntax: glob + +.zcompdump +zsh_local/* +*.sw[po] diff -r 000000000000 -r 7215ca490221 .zshrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.zshrc Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,2 @@ + +source $ZDOTDIR/zshrc diff -r 000000000000 -r 7215ca490221 functions/zshrc_vcsinfo --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/functions/zshrc_vcsinfo Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,165 @@ +# +# MiKael, 2012-07-10 +# Sources: +# https://github.com/whiteinge/dotfiles/blob/master/.zsh_shouse_prompt +# http://git.rolinh.ch/index.php?p=dotfiles.git + +# {{{ + +autoload -Uz vcs_info + +zstyle ':vcs_info:*' enable git hg +zstyle ':vcs_info:(hg*|git*):*' get-revision true +zstyle ':vcs_info:(hg*|git*):*' check-for-changes true + +zstyle ':vcs_info:hg*' formats "(%B%s%{${reset_color}%})[%i%u %b %m]" # rev+changes branch misc +#zstyle ':vcs_info:hg*' actionformats "(%s|%{$fg[red]%}%a%{$fg[white]%})[%i%u %b %m]" +zstyle ':vcs_info:hg*' actionformats "%{$fg[red]%}%a %{${reset_color}%}[%i%u %{$fg[blue]%}%b%{${reset_color}%}%m]" + +zstyle ':vcs_info:hg*:*' get-bookmarks true +zstyle ':vcs_info:hg*:*' get-mq true + +zstyle ':vcs_info:hg*:*' get-unapplied true +zstyle ':vcs_info:hg*:*' patch-format "mq(%g):%n/%c %p" +zstyle ':vcs_info:hg*:*' nopatch-format "mq(%g):%n/%c %p" + +zstyle ':vcs_info:hg*:*' unstagedstr "%{$fg_bold[red]%}+%{${reset_color}%}" +zstyle ':vcs_info:hg*:*' hgrevformat "%r" # only show local rev. +zstyle ':vcs_info:hg*:*' branchformat "%b" # only show branch + +zstyle ':vcs_info:git*' formats "(%B%s%{${reset_color}%}) %12.12i %c%u %b%m" # hash changes branch misc +#zstyle ':vcs_info:git*' formats "%c%u %b%m" # hash changes branch misc +zstyle ':vcs_info:git*' actionformats "(%s|%{$fg[white]%}%a) %12.12i %c%u %b%m" + +zstyle ':vcs_info:git*:*' stagedstr "%{$fg[green]%}S%{${reset_color}%}" +zstyle ':vcs_info:git*:*' unstagedstr "%{$fg[red]%}U%{${reset_color}%}" + +# zstyle ':vcs_info:hg:*:-all-' command fakehg +# zstyle ':vcs_info:*+*:*' debug true + +zstyle ':vcs_info:hg*+set-hgrev-format:*' hooks hg-hashfallback +zstyle ':vcs_info:hg*+set-message:*' hooks mq-vcs +#zstyle ':vcs_info:git*+set-message:*' hooks git-st git-stash +zstyle ':vcs_info:git*+set-message:*' hooks git-untracked git-st + +### Dynamically set hgrevformat based on if the local rev is available +# We don't always know the local revision, e.g. if use-simple is set +# Truncate long hash to 12-chars but also allow for multiple parents +function +vi-hg-hashfallback() { + if [[ -z ${hook_com[localrev]} ]] ; then + local -a parents + + parents=( ${(s:+:)hook_com[hash]} ) + parents=( ${(@r:12:)parents} ) + hook_com[rev-replace]="${(j:+:)parents}" + + ret=1 + fi +} + +### Show when mq itself is under version control +function +vi-mq-vcs() { + # if [[ -d ${hook_com[base]}/.hg/patches/.hg ]]; then + # hook_com[hg-mqpatch-string]="mq:${hook_com[hg-mqpatch-string]}" + # fi +} + +# Show remote ref name and number of commits ahead-of or behind +function +vi-git-st() { + local ahead behind remote + local -a gitstatus + + # Are we on a remote-tracking branch? + remote=${$(git rev-parse --verify ${hook_com[branch]}@{upstream} \ + --symbolic-full-name --abbrev-ref 2>/dev/null)} + + if [[ -n ${remote} ]] ; then + # for git prior to 1.7 + # ahead=$(git rev-list origin/${hook_com[branch]}..HEAD | wc -l) + ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l) + (( $ahead )) && gitstatus+=( "%{$fg[green]%}+${ahead}%{${reset_color}%}" ) + + # for git prior to 1.7 + # behind=$(git rev-list HEAD..origin/${hook_com[branch]} | wc -l) + behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l) + (( $behind )) && gitstatus+=( "%{$fg[red]%}-${behind}%{${reset_color}%}" ) + + #hook_com[branch]="${hook_com[branch]} [${remote} ${(j:/:)gitstatus}]" + hook_com[branch]="[%{$fg[blue]%}${hook_com[branch]}%{${reset_color}%}]" + fi +} + +# Show count of stashed changes +function +vi-git-stash() { + local -a stashes + + if [[ -s ${hook_com[base]}/.git/refs/stash ]] ; then + stashes=$(git stash list 2>/dev/null | wc -l) + #hook_com[misc]+=" (${stashes} stashed)" + hook_com[misc]+="(%{$fg[red]%}${stashes} %{${reset_color}%}stashed)" + fi +} + +# Show count of untracked files +function +vi-git-untracked(){ + if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \ + git status --porcelain | grep '??' &> /dev/null ; then + # This will show the marker if there are any untracked files in repo. + # If instead you want to show the marker only if there are untracked + # files in $PWD, use: + #[[ -n $(git ls-files --others --exclude-standard) ]] ; then + local nb_untracked=$(git status --porcelain | grep "\? \?" | wc -l) + local nb_up=$(git status --porcelain | grep "M" | wc -l) + hook_com[staged]+="%{${reset_color}%}$nb_untracked%{$fg[red]%}N %{${reset_color}%}$nb_up" + fi +} + +# }}} + +# {{{ Prompts + +setopt transient_rprompt + +# Others prompts +PS2="%{$fg_no_bold[yellow]%}%_>%{${reset_color}%} " +PS3="%{$fg_no_bold[yellow]%}?#%{${reset_color}%} " + +# }}} + +# {{{ precmd() + +function __precmd_vcsinfo { + + vcs_info + + local deco="%{${fg_no_bold[white]}%}" + + if [[ -O "$PWD" ]]; then + local path_color="${fg_no_bold[magenta]}" + elif [[ -w "$PWD" ]]; then + local path_color="${fg_no_bold[blue]}" + else + local path_color="${fg_bold[red]}" + fi + + if [[ $UID -eq 0 ]]; then + local user_color="${fg_bold[red]}" + else + local user_color="${fg_bold[default]}" + fi + + local return_code="%(?..${deco}!%{${fg_bold[red]}%}%?${deco}! %{${reset_color}%})" + #local cwd="%{${path_color}%}%32<...<%~" + local cwd="%{${path_color}%}%~%{${reset_color}%}" + local sign="%(!.%{${fg_bold[red]}%}.${deco})%#" + + PS1="${cwd} +${return_code}%D{%m%d %H:%M} [%B%n%b] %{%{$fg[red]%}%}%m%{${reset_color}%}${sign}%{${reset_color}%} " + + # Prompt on the right, displayed when in a VCS repository + RPS1="${vcs_info_msg_0_}%{${reset_color}%}" + + setopt prompt_subst +} + +# }}} diff -r 000000000000 -r 7215ca490221 tools/git-prompt.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/git-prompt.sh Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,289 @@ +# bash/zsh git prompt support +# +# Copyright (C) 2006,2007 Shawn O. Pearce +# Distributed under the GNU General Public License, version 2.0. +# +# This script allows you to see the current branch in your prompt. +# +# To enable: +# +# 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh). +# 2) Add the following line to your .bashrc/.zshrc: +# source ~/.git-prompt.sh +# 3) Change your PS1 to also show the current branch: +# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' +# ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' +# +# The argument to __git_ps1 will be displayed only if you are currently +# in a git repository. The %s token will be the name of the current +# branch. +# +# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value, +# unstaged (*) and staged (+) changes will be shown next to the branch +# name. You can configure this per-repository with the +# bash.showDirtyState variable, which defaults to true once +# GIT_PS1_SHOWDIRTYSTATE is enabled. +# +# You can also see if currently something is stashed, by setting +# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed, +# then a '$' will be shown next to the branch name. +# +# If you would like to see if there're untracked files, then you can set +# GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked +# files, then a '%' will be shown next to the branch name. +# +# If you would like to see the difference between HEAD and its upstream, +# set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates you are behind, ">" +# indicates you are ahead, and "<>" indicates you have diverged. You +# can further control behaviour by setting GIT_PS1_SHOWUPSTREAM to a +# space-separated list of values: +# +# verbose show number of commits ahead/behind (+/-) upstream +# legacy don't use the '--count' option available in recent +# versions of git-rev-list +# git always compare HEAD to @{upstream} +# svn always compare HEAD to your SVN upstream +# +# By default, __git_ps1 will compare HEAD to your SVN upstream if it can +# find one, or @{upstream} otherwise. Once you have set +# GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by +# setting the bash.showUpstream config variable. + +# __gitdir accepts 0 or 1 arguments (i.e., location) +# returns location of .git repo +__gitdir () +{ + # Note: this function is duplicated in git-completion.bash + # When updating it, make sure you update the other one to match. + if [ -z "${1-}" ]; then + if [ -n "${__git_dir-}" ]; then + echo "$__git_dir" + elif [ -n "${GIT_DIR-}" ]; then + test -d "${GIT_DIR-}" || return 1 + echo "$GIT_DIR" + elif [ -d .git ]; then + echo .git + else + git rev-parse --git-dir 2>/dev/null + fi + elif [ -d "$1/.git" ]; then + echo "$1/.git" + else + echo "$1" + fi +} + +# stores the divergence from upstream in $p +# used by GIT_PS1_SHOWUPSTREAM +__git_ps1_show_upstream () +{ + local key value + local svn_remote svn_url_pattern count n + local upstream=git legacy="" verbose="" + + svn_remote=() + # get some config options from git-config + local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')" + while read -r key value; do + case "$key" in + bash.showupstream) + GIT_PS1_SHOWUPSTREAM="$value" + if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then + p="" + return + fi + ;; + svn-remote.*.url) + svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value" + svn_url_pattern+="\\|$value" + upstream=svn+git # default upstream is SVN if available, else git + ;; + esac + done <<< "$output" + + # parse configuration values + for option in ${GIT_PS1_SHOWUPSTREAM}; do + case "$option" in + git|svn) upstream="$option" ;; + verbose) verbose=1 ;; + legacy) legacy=1 ;; + esac + done + + # Find our upstream + case "$upstream" in + git) upstream="@{upstream}" ;; + svn*) + # get the upstream from the "git-svn-id: ..." in a commit message + # (git-svn uses essentially the same procedure internally) + local svn_upstream=($(git log --first-parent -1 \ + --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null)) + if [[ 0 -ne ${#svn_upstream[@]} ]]; then + svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]} + svn_upstream=${svn_upstream%@*} + local n_stop="${#svn_remote[@]}" + for ((n=1; n <= n_stop; n++)); do + svn_upstream=${svn_upstream#${svn_remote[$n]}} + done + + if [[ -z "$svn_upstream" ]]; then + # default branch name for checkouts with no layout: + upstream=${GIT_SVN_ID:-git-svn} + else + upstream=${svn_upstream#/} + fi + elif [[ "svn+git" = "$upstream" ]]; then + upstream="@{upstream}" + fi + ;; + esac + + # Find how many commits we are ahead/behind our upstream + if [[ -z "$legacy" ]]; then + count="$(git rev-list --count --left-right \ + "$upstream"...HEAD 2>/dev/null)" + else + # produce equivalent output to --count for older versions of git + local commits + if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)" + then + local commit behind=0 ahead=0 + for commit in $commits + do + case "$commit" in + "<"*) ((behind++)) ;; + *) ((ahead++)) ;; + esac + done + count="$behind $ahead" + else + count="" + fi + fi + + # calculate the result + if [[ -z "$verbose" ]]; then + case "$count" in + "") # no upstream + p="" ;; + "0 0") # equal to upstream + p="=" ;; + "0 "*) # ahead of upstream + p=">" ;; + *" 0") # behind upstream + p="<" ;; + *) # diverged from upstream + p="<>" ;; + esac + else + case "$count" in + "") # no upstream + p="" ;; + "0 0") # equal to upstream + p=" u=" ;; + "0 "*) # ahead of upstream + p=" u+${count#0 }" ;; + *" 0") # behind upstream + p=" u-${count% 0}" ;; + *) # diverged from upstream + p=" u+${count#* }-${count% *}" ;; + esac + fi + +} + + +# __git_ps1 accepts 0 or 1 arguments (i.e., format string) +# returns text to add to bash PS1 prompt (includes branch name) +__git_ps1 () +{ + local g="$(__gitdir)" + if [ -n "$g" ]; then + local r="" + local b="" + if [ -f "$g/rebase-merge/interactive" ]; then + r="|REBASE-i" + b="$(cat "$g/rebase-merge/head-name")" + elif [ -d "$g/rebase-merge" ]; then + r="|REBASE-m" + b="$(cat "$g/rebase-merge/head-name")" + else + if [ -d "$g/rebase-apply" ]; then + if [ -f "$g/rebase-apply/rebasing" ]; then + r="|REBASE" + elif [ -f "$g/rebase-apply/applying" ]; then + r="|AM" + else + r="|AM/REBASE" + fi + elif [ -f "$g/MERGE_HEAD" ]; then + r="|MERGING" + elif [ -f "$g/CHERRY_PICK_HEAD" ]; then + r="|CHERRY-PICKING" + elif [ -f "$g/BISECT_LOG" ]; then + r="|BISECTING" + fi + + b="$(git symbolic-ref HEAD 2>/dev/null)" || { + + b="$( + case "${GIT_PS1_DESCRIBE_STYLE-}" in + (contains) + git describe --contains HEAD ;; + (branch) + git describe --contains --all HEAD ;; + (describe) + git describe HEAD ;; + (* | default) + git describe --tags --exact-match HEAD ;; + esac 2>/dev/null)" || + + b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." || + b="unknown" + b="($b)" + } + fi + + local w="" + local i="" + local s="" + local u="" + local c="" + local p="" + + if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then + if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then + c="BARE:" + else + b="GIT_DIR!" + fi + elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then + if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then + if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then + git diff --no-ext-diff --quiet --exit-code || w="*" + if git rev-parse --quiet --verify HEAD >/dev/null; then + git diff-index --cached --quiet HEAD -- || i="+" + else + i="#" + fi + fi + fi + if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then + git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$" + fi + + if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then + if [ -n "$(git ls-files --others --exclude-standard)" ]; then + u="%" + fi + fi + + if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then + __git_ps1_show_upstream + fi + fi + + local f="$w$i$s$u" + printf -- "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p" + fi +} diff -r 000000000000 -r 7215ca490221 zlogin --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zlogin Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,3 @@ +# + +[ -f $ZDOTLOCALDIR/zlogin ] && . $ZDOTLOCALDIR/zlogin diff -r 000000000000 -r 7215ca490221 zlogout --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zlogout Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,4 @@ +# + +clear +[ -f $ZDOTLOCALDIR/zlogout ] && . $ZDOTLOCALDIR/zlogout diff -r 000000000000 -r 7215ca490221 zsh_local/.placeholder diff -r 000000000000 -r 7215ca490221 zshenv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zshenv Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,44 @@ +# +# This file is sourced on all invocations of the shell. +# If the -f flag is present or if the NO_RCS option is +# set within this file, all other initialization files +# are skipped. +# +# This file should contain commands to set the command +# search path, plus other important environment variables. +# This file should not contain commands that produce +# output or assume the shell is attached to a tty. +# +# Global Order: zshenv, zprofile, zshrc, zlogin + +export ZDOTLOCALDIR=$ZDOTDIR/zsh_local + +# PATH +PATH="$HOME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games" +# Correction du PATH pour root +# Essentiel si l'utilisateur est connecte en non-root puis fait un 'su -' +# par defaut les repertoires /sbin, /usr/sbin, /usr/local/sbin manquent. +if [[ $UID -eq 0 ]]; then + PATH="/usr/local/sbin:/usr/sbin:/sbin:${PATH}" +fi +export PATH + +# Options de 'less' +export LESS="-Mi" +# Ouvre les fichiers compressés +eval $(lesspipe) + +# Pager +export PAGER=less +export MANPAGER=less + +watch=(notme) +WATCHFMT='%n %a %l from %m at %T on %D.' + +REPORTTIME=60 + +# Bip visuel +export ZBEEP='\e[?5h\e[?5l' + +export EDITOR='vim' +export VISUAL=$EDITOR diff -r 000000000000 -r 7215ca490221 zshrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zshrc Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,304 @@ +# +# This file is sourced only for interactive shells. It +# should contain commands to set up aliases, functions, +# options, key bindings, etc. +# +# Global Order: zshenv, zprofile, zshrc, zlogin + +# Copyright (c) 1995 Antoine VOUILLON +# Copyright (c) 1995-1999 Farzad FARID +# Copyright (c) Mikael BERTHE, 2001-2012 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# La ligne suivante provoque parfois un message d'erreur non gênant +unalias run-help 2>/dev/null +autoload run-help + +autoload -U zmv + +# Protection des fichiers : rw-rw-r-- +# Protection des répertoires : rwxrwxr-x +if [[ $UID -eq 0 ]]; then + umask 022 +else + umask 002 +fi + +ulimit -c 0 +# Pas de limite pour les coredump +#ulimit -c unlimited +#unlimit coredumpsize + +######################## +# Definition du prompt # +######################## + +# Chargement des variables pour les couleurs +autoload colors; colors; + +# Prompt complet (date, login, tty, hostname, cwd) sur une ligne +# (Invite de commande de secours...) +export PS1="%T %B[%n:%l]%b %S%m%s:%~%# " + +# Prompt complet sur 2 lignes, N&B +#export PS1="%B%~%b +#%D{%m%d %H:%M} %B[%n:%l]%b %S%m%s%# " + +export PS2='%_.. > ' + +# Enable my Vim-like mode for supported terms +if [[ "$TERM" == "rxvt" || + "$TERM" == "rxvt-256color" || + "$TERM" == "rxvt-unicode" || + "$TERM" == "rxvt-unicode-256color" ]] +then + export SHOWMODE="on" +fi + +set shell=$SHELL +#cdpath=(~) + +if [[ -z "$FPATH" ]]; then + if [[ -d "/usr/lib/zsh/functions" ]]; then + FPATH="/usr/lib/zsh/functions" + elif [[ -d "/usr/share/zsh/functions" ]]; then + FPATH="/usr/share/zsh/functions" + else + echo "zsh: Could not set FPATH variable: no ../zsh/functions directory" + fi +fi + +# Pour configurer les couleurs créer le fichier /etc/LS_COLORS avec la +# commande "dircolors --print-database > /etc/LS_COLORS" et l'éditer. +# Taper 'man dircolors' pour plus de details +if [[ -x /usr/bin/dircolors ]]; then + if [[ -e /etc/LS_COLORS ]]; then + eval $(dircolors -b /etc/LS_COLORS) + else + eval $(dircolors -b) + fi + LS_OPTIONS=(--color=auto) + export LS_OPTIONS +fi + + +#################### +# Options du shell # +#################### + +# Les noms des options sont écrits avec le souligné '_' optionnel pour +# faciliter la recherche dans la documentation de zsh. + +# Options de completion. Complète les noms de commandes/fichiers avec TAB +# listes toutes les possibilités, ne beep pas, boucle entre les choix par +# appui répété sur TAB. +#setopt menu_complete +setopt auto_list +setopt list_types +setopt no_list_beep +#setopt bash_auto_list + +# Correction automatique +setopt correct +unsetopt correct_all + +# Autres options + +# chdir « intelligent » +setopt auto_cd + +# On ne modifie pas des fichiers existants avec '>' et '>>' +setopt no_clobber + +unsetopt bg_nice +setopt no_flow_control +setopt no_hup +unsetopt sun_keyboard_hack + +# On n'écrase pas le fichier d'historique +setopt append_history +# On autorise les commentaires +setopt interactive_comments +# Les lignes commençant par une espace ne seront pas archivées +setopt hist_ignore_space +# fc -l ne sera pas archivé +setopt hist_no_store +# Pas de doublons dans l'historique +setopt hist_ignore_dups +# Les répertoires sont automatiquement mis dans la pile (cf. pushd, popd...) +setopt auto_pushd +# ... sans doublons +setopt pushd_ignore_dups +# Affiche la valeur de retour d'un programme (si non nulle) +setopt print_exit_value +# Essaie de réduire la liste des complétions +setopt list_packed + +#setopt nobeep + + +############################ +# Historique des commandes # +############################ + +export SAVEHIST=4096 +export HISTSIZE=4096 +export HIST_EXPIRE_DUPS_FIRST +export HISTFILE=$HOME/.history + + +############################# +# Configuration des touches # +############################# + +# Pour que la touche Alt marche dans les xterm +bindkey -e +if [[ -z ${TERM:#xterm*} || -z ${TERM:#rxvt*} || -z ${TERM:#linux*} ]]; then + stty pass8 + # L'option -m empêche l'utilisation des accents (è = ESC-h, etc.) + #bindkey -me +fi + +# Universelle +#bindkey '^Q' quoted-insert +bindkey '[2~' overwrite-mode # Ins +bindkey '[3~' delete-char # Suppr +bindkey '[5~' history-beginning-search-backward # PgUp +bindkey '[6~' history-beginning-search-forward # PgDn +bindkey '^[^I' reverse-menu-complete # ESC-Tab +bindkey '^Xc' copy-prev-word +bindkey '^Xf' _correct_filename +bindkey '^Xm' _most_recent_file + + +# Sur la console +if [[ "$TERM" == "console" || "$TERM" == "vt100" ]]; then + bindkey '^[[1~' beginning-of-line # Home + bindkey '^[[4~' end-of-line # End +fi + +# Dans un xterm term=linux +if [[ -z ${TERM:#linux*} || -z ${TERM:#screen} ]]; then + bindkey '^[[H' beginning-of-line # Home + bindkey '^[[F' end-of-line # End + bindkey '[1~' beginning-of-line # Home + bindkey '[4~' end-of-line # End +fi + +# Dans un xterm +if [[ -z ${TERM:#xterm*} ]]; then + bindkey '^[[H' beginning-of-line # Home + bindkey '^[[F' end-of-line # End + bindkey '[1~' beginning-of-line # Home + bindkey '[4~' end-of-line # End +fi + +# Dans un rxvt +if [[ -z ${TERM:#rxvt*} ]]; then + bindkey '^[[7~' beginning-of-line # Home + bindkey '^[[8~' end-of-line # End +fi + +# Sur un xterm, on differencie backspace et delete (?). +if [[ -z ${TERM:#xterm*} ]] +then + bindkey '^H' backward-delete-char # Backspace + bindkey '^?' backward-delete-char # Backspace +fi + +# En combinaison avec le "keycode 22 = Backspace" du .Xmodmap pour +# faire marcher le backspace dans Netscape +stty erase '^?' + +####################################################### +# Completion, lire le man pour plus de renseignements # +####################################################### + +#compctl -g '*(-/)' cd pushd +compctl -g '.*(-/) *(-/)' cd pushd +compctl -g '.*(-/) *(-/)' rmdir +compctl -g '*.Z *.z *.gz *.tgz *(-/)' zcat gunzip +compctl -g '*.Z *.z *.gz *.tgz *.tar *.bz2 *(-/)' tart tarx tar +compctl -g '*.bz2 *(-/)' bz2cat bunzip2 +compctl -g '*.zip *.ZIP *.exe *.EXE *(-/)' unzip +compctl -g '*.ps *.ps.gz *(-/)' gs ghostview gv evince +compctl -g '*.tex* *.latex* *(-/)' tex latex texi2dvi +compctl -g '*.dvi *(-/)' xdvi dvips +compctl -j -P % -x 's[-] p[1]' -k signals -- kill +compctl -l '' nohup exec +compctl -u -x 's[@]' -k hosts -- finger +compctl -m info +compctl -m -g '*.1 *(-/)' man +compctl -c which where type +compctl -g '*.pdf *(-/)' evince + +# Hosts completion + +if [ -f ~/.ssh/config ]; then + hosts=($hosts `grep ^Host ~/.ssh/config | sed s/Host\ // | egrep -v '^\*$'`) +fi +if [ "$hosts" ]; then + zstyle ':completion:*:hosts' hosts $hosts +fi + +########## +# zstyle # +########## + +zstyle ':completion:*' completer _expand _complete _correct _approximate +zstyle ':completion:*' completions 1 +zstyle ':completion:*' format 'Completing %B%d%b%:' +zstyle ':completion:*' glob 1 +zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} +zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s +zstyle ':completion:*' max-errors 2 numeric +zstyle ':completion:*' menu select=3 +zstyle ':completion:*' prompt '%e erreur(s)...' +zstyle ':completion:*' select-prompt '%SScrolling active: current selection at %p%s' +zstyle ':completion:*' substitute 1 + +autoload -Uz compinit +compinit + +# Needed for menuselect below +zmodload zsh/complist + +autoload -U incremental-complete-word +zle -N incremental-complete-word +bindkey 'i' incremental-complete-word + +bindkey -M menuselect '' accept-and-infer-next-history + +bindkey -s '' '/' +bindkey -s '' ',' + + +############################## +# Source configuration files # +############################## + +for rc in $ZDOTDIR/zshrc.d/??-*.zrc; do + [[ -r ${rc} ]] && source "$rc" +done +unset rc + +# Local configuration files +# (Other that zshrc, which is sourced from our zshrc.d scripts) +localrcfiles=($ZDOTLOCALDIR/??-*.zrc) 2> /dev/null +for rc in $localrcfiles; do + [[ -r ${rc} ]] && source "$rc" +done +unset rc localrcfiles diff -r 000000000000 -r 7215ca490221 zshrc.d/20-prompt.zrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zshrc.d/20-prompt.zrc Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,159 @@ + +# You can use fast_hg_root from https://bitbucket.org/yaniv_aknin/fast_hg_root +# or maybe use the command false if you don't use Mercurial at all. +# (Override in $ZDOTLOCALDIR/zshrc) +HG_ROOT_CMD=("hg" "root") +export HG_ROOT_CMD + + +### Extended prompts + +function __prompt_path_color { + local path_color + if [[ -O "$PWD" ]]; then + path_color="${fg_no_bold[magenta]}" + elif [[ -w "$PWD" ]]; then + path_color="${fg_no_bold[blue]}" + else + path_color="${fg_bold[red]}" + fi + print "%{$path_color%}" +} + +# From http://stevelosh.com/blog/2010/02/my-extravagant-zsh-prompt/ +function __prompt_char { + __gitdir >/dev/null 2>/dev/null && echo '±' && return + $HG_ROOT_CMD >/dev/null 2>/dev/null && echo '☿' && return + echo '○' +} + +function __hg_prompt_info { + $HG_ROOT_CMD >/dev/null 2>/dev/null && + hg prompt --angle-brackets " + +>%BHG%b<(%{$fg[green]%}%{$reset_color%})><%{$fg[green]%}%{$reset_color%}>\ +< on %{$fg[magenta]%}%{$reset_color%}>\ +< at %{$fg[yellow]%}%{$reset_color%}>" 2>/dev/null +} + +source $ZDOTDIR/tools/git-prompt.sh > /dev/null 2>&1 +function __git_prompt_info { + r=$(__git_ps1) + if [ ! -z $r ]; then echo -e "\n%Bgit%b$r"; fi +} + +function __prompt_set_dev { + # Prompt complet sur 2 lignes, couleurs, avec un indicateur de dépôt git/hg + local -a lines pline + + local red="%{$fg[red]%}" + local cyan="%{$fg[cyan]%}" + local reset="%{$reset_color%}" + + # 1re ligne + pline+=( "%D{%m%d} " ) # Date + pline+=( "$cyan%D{%H:%M}$reset " ) # Time + pline+=( $(__prompt_path_color) ) # Couleur du chemin dynamique + pline+=( "%~$reset" ) # Chemin (cwd) + lines+=( ${(j::)pline} ) + pline=() + + # 2e ligne + pline+=( "[%B%n%b] " ) # Nom d'utilisateur + pline+=( "$red%m$reset" ) # Nom de machine + pline+=( $(__prompt_char) ) # Indicateur de dépôt (hg/git) + pline+=( "%# " ) # Invite de commande + lines+=( ${(j::)pline} ) + + export PS1=${(F)lines} +} + +function __prompt_set_dev-mikael { + # Prompt complet sur 2 ou 3 lignes, avec informations sur les dépôts git/hg + local -a lines pline + + local red="%{$fg[red]%}" + local cyan="%{$fg[cyan]%}" + local reset="%{$reset_color%}" + + # 1re ligne + pline+=( "%D{%m%d} " ) # Date + pline+=( "$cyan%D{%H:%M}$reset " ) # Time + pline+=( $(__prompt_path_color) ) # Couleur du chemin dynamique + pline+=( "%~$reset" ) # Chemin (cwd) + lines+=( ${(j::)pline} ) + pline=() + + # 2e ligne + pline+=( "[%B%n%b] " ) # Nom d'utilisateur + pline+=( "$red%m$reset" ) # Nom de machine + pline+=( "$(__hg_prompt_info)" ) # Informations de dépôt Mercurial + pline+=( "$(__git_prompt_info)" ) # Informations de dépôt git + pline+=( "%# " ) # Invite de commande + lines+=( ${(j::)pline} ) + + export PS1=${(F)lines} +} + +function precmd { + case $_PROMPT_DEFINED in + dev) + __prompt_set_dev + ;; + dev-mikael) + __prompt_set_dev-mikael + ;; + dev-vcsinfo) + __precmd_vcsinfo + ;; + esac +} + +function prompt_set_dev-vcsinfo { + _PROMPT_DEFINED="dev-vcsinfo" + source $ZDOTDIR/functions/zshrc_vcsinfo +} + +function __prompt_unset_dev-vcsinfo { + if [[ $_PROMPT_DEFINED == "dev-vcsinfo" ]]; then + zstyle ':vcs_info:*' enable NONE + unset RPS1 + fi +} + +function prompt_set_blackwhite { + # Prompt complet sur 2 lignes, N&B + __prompt_unset_dev-vcsinfo + unsetopt prompt_subst + + export PS1="%D{%m%d %H:%M} %B%~%b +[%B%n%b:%l] %S%m%s%# " + + export _PROMPT_DEFINED="blackwhite" +} + +function prompt_set_color { + # Prompt complet sur 2 lignes, couleurs + __prompt_unset_dev-vcsinfo + unsetopt prompt_subst + + PS1="%D{%m%d} %{$fg[cyan]%}%D{%H:%M}%{$reset_color%} " + PS1=$PS1"%{$fg[magenta]%}%~%{$reset_color%} +[%B%n%b:%l] %{$fg[red]%}%m%{$reset_color%}%# " + export PS1 + + export _PROMPT_DEFINED="blackwhite" +} + +function prompt_set_dev { + __prompt_unset_dev-vcsinfo + export _PROMPT_DEFINED="dev" +} +function prompt_set_dev-mikael { + __prompt_unset_dev-vcsinfo + export _PROMPT_DEFINED="dev-mikael" +} + + +# Invite de commande par défaut +prompt_set_color diff -r 000000000000 -r 7215ca490221 zshrc.d/30-aliases.zrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zshrc.d/30-aliases.zrc Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,67 @@ + +########### +# Aliases # +########### + +# Ces 3 alias demandent confirmation avant d'ecraser un fichier +alias cp='cp -i' +alias mv='mv -i' +alias rm='rm -i' + +alias cd..='cd ..' + +# Gestion de l'historique des commandes +alias h=history 23 +alias H='history | less' + +# Affiche la liste de tous les processus tournant en memoire +alias psx='ps aux | less -S' + +# Affiche la liste de tous vos processus +alias psu='ps ux | less -S' + +# Divers alias pour lister le contenu d'un repertoire +# la = comme 'ls' avec les fichiers caches en plus +# ll = tout lister, y compris les fichiers caches +# lm = comme 'll' avec une pause en plus +# dir = affichage long +# dirm = comme 'dirm' avec une pause en plus +alias l='command ls $LS_OPTIONS -l' +alias ls='command ls $LS_OPTIONS -F' +alias la='command ls $LS_OPTIONS -aF' +alias ll='command ls $LS_OPTIONS -laF' +function lm() { command ls $LS_OPTIONS -laF $* | less } +alias dir='command ls $LS_OPTIONS -lF' +function dirm() { command ls $LS_OPTIONS -lF $* | less } + +# Gestion de la directory stack, lire le man pour en savoir plus +alias d=dirs +alias dv='dirs -v' +#alias pu=pushd +#alias po=popd + +if [[ -x /usr/bin/xemacs ]]; then + alias em='xemacs -nw' +elif [[ -x /usr/bin/emacs ]]; then + alias em='emacs -nw' +fi +if [[ -x /usr/bin/vim ]]; then + alias vi=vim +fi + +# DNS stuff +alias dmx='dig -t MX +nocmd +nocomment +identify +nostats +noquestion' +alias dhost='dig +nocmd +nocomment +identify +nostats +noquestion' + +# :) +alias :q='echo "Ha ha ha :-)"' + +# Xterm resizing-fu (From Joey...) +alias default='echo -e "\033]50;fixed\007"' +alias normal=default +#alias hide='echo -e "\033]50;nil2\007"' +#alias tiny='echo -e "\033]50;5x7\007"' +alias small='echo -e "\033]50;6x10\007"' +alias medium='echo -e "\033]50;7x13\007"' +alias large='echo -e "\033]50;9x15\007"' +alias huge='echo -e "\033]50;10x20\007"' diff -r 000000000000 -r 7215ca490221 zshrc.d/30-functions.zrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zshrc.d/30-functions.zrc Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,97 @@ + +############# +# Functions # +############# + +# Commande tres pratique pour formatter un fichier .man +# exemple : mf prog.1 +function mf() { tbl $* | nroff -mandoc | less -s } + +# ,,(), ,,,() for quickly changing $CWD {{{1 +# http://www.shell-fu.org/lister.php?id=769 + +# Go up n levels: +# ,, 3 +function ,, (){ + local arg=${1:-1}; + local dir="" + while [ $arg -gt 0 ]; do + dir="../$dir" + arg=$(($arg - 1)); + done + cd $dir >&/dev/null +} + +# Go up to a named dir +# ,,, usr +function ,,, (){ + if [ -z "$1" ]; then + return + fi + local maxlvl=16 + local dir=$1 + while [ $maxlvl -gt 0 ]; do + dir="../$dir" + maxlvl=$(($maxlvl - 1)); + if [ -d "$dir" ]; then + cd $dir >&/dev/null + fi + done +} + + +# Customized version from Frank Terbeck' scripts +# http://bewatermyfriend.org/p/2011/013/ +# "." will display the current working directory +# ".." will get you 1 directory up, +# "..." will get you 2 directories up, etc. +function ft_accept_line_cd_up() { + setopt local_options extended_glob + local -a cmdline + cmdline=( ${(z)BUFFER} ) + if (( ${#cmdline} == 1 )) && [[ ${cmdline[1]} == "." ]] ; then + BUFFER="pwd" + zle ".$WIDGET" + return + fi + if (( ${#cmdline} == 1 )) && [[ ${cmdline[1]} == ..## ]] ; then + BUFFER='cd ' + for (( i = 2; i <= ${#${cmdline[1]}}; i++ )); do + BUFFER="${BUFFER}../" + done + BUFFER=${BUFFER%/} + fi + zle ".$WIDGET" +} +zle -N accept-line ft_accept_line_cd_up + +# 2nd part, completion support... +function ft_complete_with_dots() { + setopt local_options extended_glob + local -a cmdline + cmdline=( ${(z)BUFFER} ) + if (( ${#cmdline} == 1 )) && [[ ${cmdline[1]} == ..## ]] ; then + BUFFER='cd ' + for (( i = 2; i <= ${#${cmdline[1]}}; i++ )); do + BUFFER="${BUFFER}../" + done + CURSOR=${#BUFFER} + fi + zle ".$WIDGET" +} +# Disabling for now as I don't know how to fallback to automatic correction... +#zle -N expand-or-complete ft_complete_with_dots + + +# genpass() +# Generates a tough password of a given length +# Borrowed (and slightly modifed) from Seth House github repository. + +function genpass() { + if [ ! "$1" ]; then + echo "Usage: $0 20" + echo "For a random, 20-character password." + return 1 + fi + dd if=/dev/urandom count=1 2>/dev/null | tr -cd 'A-Za-z0-9' | cut -c-$1 +} diff -r 000000000000 -r 7215ca490221 zshrc.d/50-local.zrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zshrc.d/50-local.zrc Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,6 @@ + +####################### +# Local customization # +####################### + +[ -f $ZDOTLOCALDIR/zshrc ] && . $ZDOTLOCALDIR/zshrc diff -r 000000000000 -r 7215ca490221 zshrc.d/60-vi-showmode.zrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zshrc.d/60-vi-showmode.zrc Sat Jul 14 19:20:57 2012 +0200 @@ -0,0 +1,245 @@ +# +# Vi Mode +# This is an old script I have been updating/customizing over +# the time, I'm unable to mention the original author. +# Let me know if you know who I should give the credits to. +# +# This mode can be enabled/disabled using the variable +# $SHOWMODE in your $ZDOTLOCALDIR/zshrc. +# +# MiKael +# + +if [[ $SHOWMODE != "on" ]]; then + # Vi showmode is not enabled--skipping file + return 0 +fi + + +##################### +# Vim-like showmode # +##################### + +# vi keybindings +bindkey -v + +bindkey -M vicmd "^R" redo +bindkey -M vicmd "u" undo +bindkey -M vicmd "ga" what-cursor-position + +unsetopt promptcr +setopt transient_rprompt + +__string_insert="--INSERT--" +__string_normal="--NORMAL--" +__string_replace="--REPLACE-" + +redisplay-insert() { + show_mode "$__string_insert" +} +redisplay-normal() { + show_mode "$__string_normal" +} +zle -N redisplay-insert +zle -N redisplay-normal +bindkey -M viins "^X^R" redisplay-insert +bindkey -M vicmd "^X^R" redisplay-normal + +screenclear () { + echo -n "\033[2J\033[400H" + builtin zle .redisplay + show_mode "$__string_insert" +} +zle -N screenclear +bindkey " " screenclear + +function zle-line-finish { + export RPS1="$__string_insert" +} +zle -N zle-line-finish + +show_mode() { + export RPS1=$1 + builtin zle reset-prompt + return +} + + +### vi-add-eol (unbound) (A) (unbound) +### Move to the end of the line and enter insert mode. + +vi-add-eol() { + show_mode "$__string_insert" + builtin zle .vi-add-eol +} +zle -N vi-add-eol +bindkey -M vicmd "A" vi-add-eol + +### vi-add-next (unbound) (a) (unbound) +### Enter insert mode after the current cursor posi­ +### tion, without changing lines. +vi-add-next() { + show_mode "$__string_insert" + builtin zle .vi-add-next +} +zle -N vi-add-next +bindkey -M vicmd "a" vi-add-next + + +### vi-change (unbound) (c) (unbound) +### Read a movement command from the keyboard, and kill +### from the cursor position to the endpoint of the +### movement. Then enter insert mode. If the command +### is vi-change, change the current line. + +vi-change() { + show_mode "$__string_insert" + builtin zle .vi-change +} +zle -N vi-change +bindkey -M vicmd "c" vi-change + +### vi-change-eol (unbound) (C) (unbound) +### Kill to the end of the line and enter insert mode. + +vi-change-eol() { + show_mode "$__string_insert" + builtin zle .vi-change-eol +} +zle -N vi-change-eol +bindkey -M vicmd "C" vi-change-eol + +### vi-change-whole-line (unbound) (S) (unbound) +### Kill the current line and enter insert mode. + +vi-change-whole-line() { + show_mode "$__string_insert" + builtin zle .vi-change-whole-line +} +zle -N vi-change-whole-line +bindkey -M vicmd "S" vi-change-whole-line + +### vi-insert (unbound) (i) (unbound) +### Enter insert mode. + +vi-insert() { + show_mode "$__string_insert" + builtin zle .vi-insert +} +zle -N vi-insert +bindkey -M vicmd "i" vi-insert + +### vi-insert-bol (unbound) (I) (unbound) +### Move to the first non-blank character on the line +### and enter insert mode. + +vi-insert-bol() { + show_mode "$__string_insert" + builtin zle .vi-insert-bol +} +zle -N vi-insert-bol +bindkey -M vicmd "I" vi-insert-bol + +### vi-open-line-above (unbound) (O) (unbound) +### Open a line above the cursor and enter insert mode. + +vi-open-line-above() { + show_mode "$__string_insert" + builtin zle .vi-open-line-above +} +zle -N vi-open-line-above +bindkey -M vicmd "O" vi-open-line-above + +### vi-open-line-below (unbound) (o) (unbound) +### Open a line below the cursor and enter insert mode. + +vi-open-line-below() { + show_mode "$__string_insert" + builtin zle .vi-open-line-below +} +zle -N vi-open-line-below +bindkey -M vicmd "o" vi-open-line-below + +### vi-substitute (unbound) (s) (unbound) +### Substitute the next character(s). + +vi-substitute() { + show_mode "$__string_insert" + builtin zle .vi-substitute +} +zle -N vi-substitute +bindkey -M vicmd "s" vi-substitute + + +### vi-replace (unbound) (R) (unbound) +### Enter overwrite mode. +### + +vi-replace() { + show_mode "$__string_replace" + builtin zle .vi-replace +} +zle -N vi-replace +bindkey -M vicmd "R" vi-replace + +### vi-cmd-mode (^X^V) (unbound) (^[) +### Enter command mode; that is, select the `vicmd' +### keymap. Yes, this is bound by default in emacs +### mode. + +vi-cmd-mode() { + show_mode "$__string_normal" + builtin zle .vi-cmd-mode +} +zle -N vi-cmd-mode +bindkey -M viins "" vi-cmd-mode + + +### vi-oper-swap-case +### Read a movement command from the keyboard, and swap +### the case of all characters from the cursor position +### to the endpoint of the movement. If the movement +### command is vi-oper-swap-case, swap the case of all +### characters on the current line. +### + +bindkey -M vicmd "g~" vi-oper-swap-case + + +bindkey -M vicmd "[2~" vi-insert +bindkey -M vicmd 'q' push-line +bindkey -M vicmd '[5~' history-beginning-search-backward # PgUp +bindkey -M vicmd '[6~' history-beginning-search-forward # PgDn + +bindkey -M viins '[5~' history-beginning-search-backward # PgUp +bindkey -M viins '[6~' history-beginning-search-forward # PgDn +bindkey -M viins '[7~' beginning-of-line +bindkey -M viins '[8~' end-of-line +bindkey -M viins '^A' beginning-of-line +bindkey -M viins '^E' end-of-line +bindkey -M viins '[3~' delete-char +bindkey -M viins '' up-line-or-history +bindkey -M viins '' down-line-or-history +bindkey -M viins '^Xc' copy-prev-word +bindkey -M viins '^Xf' _correct_filename +bindkey -M viins '^_' undo +bindkey -M viins '^K' vi-change-eol +bindkey -M viins '^R' history-incremental-search-backward +bindkey -M viins '^O' accept-line-and-down-history +bindkey -M viins '^T' transpose-chars +bindkey -M viins '^Xm' _most_recent_file + +bindkey -M viins -s '^X^H' 'hash -r\n' + + +if [[ -z ${TERM:#screen} ]]; then + bindkey -M viins '[1~' beginning-of-line # Home + bindkey -M viins '[4~' end-of-line # End +fi + +# Edit the command line using your usual editor. +autoload edit-command-line +zle -N edit-command-line +bindkey -M vicmd v edit-command-line + +export RPS1="$__string_insert"