# /etc/zsh/zshrc ou ~/.zshrc # Fichier de configuration principal de zsh, lu au lancement des shells interactifs # (et non des shells d'interprétation de fichier) # Formation Debian GNU/Linux par Alexis de Lattre # http://formation-debian.via.ecp.fr/ ################ # 1. Les alias # ################ # Gestion du 'ls' : couleur & ne touche pas aux accents alias ls='ls --classify --tabsize=0 --literal --color=auto --show-control-chars --human-readable' # Copie en récursif et qui garde la date des fichiers copiés #alias cp='cp -Rp' alias cp='cp -R' # Copie distante, ajout de la récursivité tout le temps: alias scp='scp -r' # Demande confirmation avant d'écraser un fichier alias cP='cp --interactive' alias mv='mv --interactive' alias rm='rm --interactive' # Raccourcis pour 'ls' alias ll='ls -l' alias la='ls -lA' alias llm='ls -l | $PAGER' alias lll='ls -l | less' ##Classer par date alias llt='ls -l -t -h -r' alias lld='ls -l -d */ -h' alias l.='ls -d .*' alias lr='ls -R | grep ":$" | sed -e '\''s/:$//'\'' -e '\''s/[^-][^\/]*\//--/g'\'' -e '\''s/^/ /'\'' -e '\''s/-/|/'\''' # Faire en sorte que sudo puisse également utiliser les alias! (c'est l'espace qui fait toute la différence) # `man zshall` partie Aliasing: "If the text ends with a space, the next word in the shell input is treated as though it were in command position for # purposes of alias expansion. " if [ ${USER} != "root" ]; then alias sudo='sudo ' alias s='sudo ' alias si='sudo iptables -L -vn ' alias sp='sudo puppet agent -t ' alias sv='sudo vi ' alias sz='sudo zsh ' else alias sudo='sudo ' alias s='sudo ' alias si='iptables -L -vn ' alias sp='puppet agent -t ' alias sv='vi ' fi # Raccourcis pour cat alias ca='cat -n' # Envoyer une notification via libnotify-bin (fin d'une commande, ...) # Nécessite le paquet libnotify-bin alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' # Recherche d'un mot dans des fichiers alias grep='grep --color=always -i ' alias gerp='grep -i' ##Sensisble à la casse alias Grep='grep ' # Nettoyage de l'écran alias c='clear' # Liste le contenu du dossier alias dir='dir --color=always' alias less='less -r' #alias less='less --quiet' # Page de manuel en anglais #alias mane="LANG=C man " # Affichage le résultat de la commande 'mount' en colonne #mount | column -t # Afficher les lignes trop longues sur la ligne suivante plutot que de remplacer par un "$": alias most='most -w' # Commandes de gestion des paquets pour aptitude ou yum if [ -d /etc/apt ]; then alias update='sudo aptitude update' alias show='aptitude show' alias se='aptitude search' alias ins='sudo aptitude install' alias insexperimental='sudo aptitude -t experimental install' alias up='sudo aptitude update && sudo aptitude full-upgrade && sudo aptitude clean' alias version='apt-show-versions' alias pol='apt-cache policy ' else alias update='yum update' alias up='yum update' alias show='yum info' alias se='yum search' alias ins='yum install' alias version='yum info &1|grep "Version"' fi # Espace disque alias df='df -kTh' alias dus='du * -sh' # Gestion des processus: # Si htop n'est pas installé sur la machine: if [ ! -f "`which htop`" ]; then alias htop=top fi # Qu'est-ce qui consomme de la mémoire vive sur le système alias wotgobblemem='ps -o time,ppid,pid,nice,pcpu,pmem,user,comm -A | sort -n -k 6 | tail -15' # Décompression alias untargz='tar -zxvf' alias untarbz2='tar -jxvf' # Screen #alias totod='screen -c ~/.screen/scr.toto' #alias toto='screen -x toto' #alias toto='screen -Rd toto -c ~/.screen/scr.toto' #alias toto='tmux attach -f ~/.tmux.conf -d -t 0' alias toto='tmux -f ~/.tmux.conf ' alias ci='screen -x ssh || screen -c ~/.screen/scr.ssh_ci' # Lister les fichiers de configuration inutiles alias purge='grep-status -n -sPackage -FStatus config-files' ## Alias avec pipe alias -g H='| head' alias -g T='| tail -f' alias -g G='| grep' alias -g L='| less' alias -g M="| most" alias -g B="&|" alias -g HL="--help" alias -g MM="2>&1 | most" alias -g LL="2>&1 | less" alias -g CA="2>&1 | cat -A" alias -g NE="2> /dev/null" alias -g NUL="> /dev/null 2>&1" ## Affichage de l'historique if [ "$PAGER" = "most" ]; then # En commencant par la fin avec most (bidouillage, on est pas sensé avoir ): alias hist="fc -El 0 | most +$HISTSIZE" #alias hist="most +$HISTSIZE ~/.zsh/history" # Une fois dans un fichier avec most, la touche 'B' permet d'aller à la fin du fichier else # En commencant par la fin avec less: alias hist="fc -El 0 | less +G" #alias hist="less +G ~/.zsh/history" fi ## Gestion des répertoires alias u='cd ..' alias cd..='cd ..' alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' # Revenir dans le dossier dans lequel on se trouvait précédemment alias cd-='cd -' # Afficher la pile des dossiers: alias dirs='dirs -v' # Créer les répertoires précédents si ils n'existent pas alias mkdir='mkdir -p' # Affiche l'arborescence du répertoire courant #alias tree="find . | sed 's/[^/]*\//| /g;s/| *\([^| ]\)/+--- \1/'" #Déprécié au profit du paquet tree (cf man tree) # Affiche la variable $PATH ligne par ligne alias path='echo $PATH | tr ":" "\n" ' # Différence entre deux fichiers alias diff='colordiff -u' alias diffs='diff --side-by-side' # Recherche toutes les occurences de l'arguments passé en paramètre dans l'historique des commandes alias param='fc -l 0 | grep' # Calculatrice en ligne de commande alias caltos='bc' #alias df='df --human-readable' #alias du='du --human-readable' alias m='mutt -y' alias md='mkdir' alias rd='rmdir' #Internet ## Créer un mini serveur web à partir du dossier courant (http://localhost:8002) alias httpserv='python -m SimpleHTTPServer' ## Limite l'envoi à 3 requêtes pour ping alias ping="ping -c 3" ####################################### #Ouverture d'un programme en fonction #de l'extension du fichier ####################################### alias -s txt='$PAGER ' alias -s html=$BROWSER alias -s org=$BROWSER alias -s php=$BROWSER alias -s com=$BROWSER alias -s net=$BROWSER alias -s log='tail -f' alias -s conf='vim ' alias -s gz='gunzip ' alias -s bz2='tar -xjvf' ####################################### # Raccourcis pour les dossier # Pour y accéder, faire ~NOM_DU_RACCOURCIS ####################################### hash -d zsh="/etc/zsh" hash -d smb="/etc/samba/" ##Affiche quelques statistiques à propos de l'ordinateur alias stat_sys="echo ' ' && uname -a && echo ' '&& uptime &&echo ' '&& df && echo ' '" ##################################### #####FONCTIONS ###################################### ##Cree le repertoire et va dedans function mkcd() { mkdir $1 && cd $1 } #liste les alias et functions function listalias(){ cat /etc/zsh/zshrc | egrep "alias|function" | grep -v "^#" | $PAGER } #Récupère l'adresse IP publique function ippub() { wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d" " -f 6 | cut -d\< -f 1 } #lynx --dump http://www.whatismyip.com/|grep Your|awk '{print $4}' #Récupère l'adresse IP (privee) function ippriv() { echo "eth0: `ifconfig eth0|grep "inet adr"|awk '{print $2}'|awk -F ':' '{print $2}'`" echo "wlan0: `ifconfig wlan0|grep "inet adr"|awk '{print $2}'|awk -F ':' '{print $2}'`" } #Renomme les fichiers en minuscule function lowercase() { for file ; do filename=${file##*/} case "$filename" in */*) dirname==${file%/*} ;; *) dirname=.;; esac nf=$(echo $filename | tr A-Z a-z) newname="${dirname}/${nf}" if [ "$nf" != "$filename" ]; then mv "$file" "$newname" echo "lowercase: $file --> $newname" else echo "lowercase: $file not changed." fi done } ## Latex: ##Redéfinition de pdflatex: # La commande pdflatex est exécutée deux fois pour permettre la construction de l'index function pdflatex() { # On récupère le nom du fichier sans l'extension file_name="${1:r}" # Le fichier avec l'extension pdf pdf="${file_name}.pdf" # Dossier temporaire temp_dir="temp" # On supprime le fichier pdf si il est présent if [ -f "${pdf}" ]; then rm -rf "${pdf}" fi # Si le répertoire temporaire n'existe pas, on le crée if [ ! -d "${temp_dir}" ]; then mkdir "${temp_dir}" fi # On exécute la commande pour créer le pdf /usr/bin/pdflatex -output-directory ${temp_dir} $1 /usr/bin/pdflatex -output-directory ${temp_dir} $1 # On place le fichier pdf qui est dans le répertoire temporaire dans le répertoire courant mv -f "${temp_dir}"/*.pdf . } # Afficher le code retour de la commande précédente function cmd_status { local exit_code=$? # exit code of command local count=$(jobs | wc -l) # no. of background jobs # Report no. of background jobs if >0 if [ $count -gt 0 ]; then echo -n " %{$fg[cyan]%}⎇ %j " fi # Report exit code if [ $exit_code -ne 0 ]; then echo -n "%{$fg[yellow]%}%?%{$fg[red]%} ✖%{$reset_color%}" else echo -n "%{$fg[green]%}✔%{$reset_color%}" fi } ## Vérifier les logins et logouts de tous les comptes incluant le mien. watch=all # Vérifie toutes les 30 secondes logcheck=30 # Change le format de watch pour quelques chose avec plus d'informations # %n = username, %M = hostname, %a = action, %l = tty, %T = time, # %W = date WATCHFMT="%n from %M has %a tty%l at %T %W" # Crypte le fichier passer en paramètre en utilisant le certificat public # de l'utilisateur. # Arguments: # ${1}: fichier à crypter # ${2}: function crypt() { openssl smime -encrypt -aes128 -in ${1} -out .${1}.ls ~/.openssl/mycert.crt } # Décrypte le fichier passer en paramètre en fonction de la clef ssl de # l'utilisateur et trouve la ligne contenant le mot rechercher par l'user # Arguments: # ${1}: le fichier à décrypter # ${2}: le paramètre rechercher dans le fichier function getpdw() { openssl smime -decrypt -in ${1} -inkey ~/.openssl/mykey.key | grep ${2} } # Décrypte le fichier passer en paramètre en fonction de la clef ssl de # l'utilisateur et le fichier de sorti est le second paramètre # Arguments: # ${1}: le fichier à décrypter # ${2}: le fichier de sorti function decrypt() { openssl smime -decrypt -in ${1} -out ${2} -inkey ~/.openssl/mykey.key } ################################################ # 2. Prompt et définition des touches basiques # ################################################ # Prompt couleur (la couleur n'est pas la même pour le root et # pour les simples utilisateurs) # Définition des couleurs: #bleu_clair="[36;1m" #bleu_fonce="[34;1m" #rouge="[31m" #jaune="[33m" #blanc="[37m" #vert="[32m" #couleur_normale="[0m" # Définition du texte du prompt #heure="%{$bleu_clair%}%T" #user="%{$bleu_fonce%}%n" #user_root="%{$rouge%}%n" #at="%{$jaune%}@" #host="%{$blanc%}%m" #repertoire_courant="%{$vert%}%c" #repertoire_absolu="%{$vert%}%d" # Chemin du répertoire courant en relatif à ~ #repertoire_relatif="%{$vert%}%~" #root="%{$jaune%}%#" #noroot="%{$jaune%}%%" #normal="%{$couleur_normale%}" ## Définition du prompt #if [ "`id -u`" -eq 0 ]; then ## Root # export PS1="$heure $user_root$at$host $repertoire_courant$root $normal" ## export PS1="%{$bleu_clair%T %{$rouge%n%{$jaune@%{$blanc%m %{$vert%c%{$jaune%#%{%} " #else ## Simple utilisateur # export PS1="$heure $user$at$host $repertoire_courant$noroot $normal" #fi # ctrl+← and ctrl+→ issue bindkey "^[[1;5C" forward-word bindkey "^[[1;5D" backward-word bindkey "^[^[OC" forward-word bindkey "^[^[OD" backward-word # vim:ft=zsh ts=2 sw=2 sts=2 # # agnoster's Theme - https://gist.github.com/3712874 # A Powerline-inspired theme for ZSH # # # README # # In order for this theme to render correctly, you will need a # [Powerline-patched font](https://gist.github.com/1595572). # # In addition, I recommend the # [Solarized theme](https://github.com/altercation/solarized/) and, if you're # using it on Mac OS X, [iTerm 2](http://www.iterm2.com/) over Terminal.app - # it has significantly better color fidelity. # # # Goals # # The aim of this theme is to only show you *relevant* information. Like most # prompts, it will only show git information when in a git working directory. # However, it goes a step further: everything from the current user and # hostname to whether the last call exited with an error to whether background # jobs are running in this shell will all be displayed automatically when # appropriate. autoload -U colors zsh-mime-setup select-word-style colors # colors zsh-mime-setup # run everything as if it's an executable select-word-style bash # ctrl+w on words # Prompt setopt PROMPT_SUBST # allow funky stuff in prompt ### Segment drawing # A few utility functions to make it easy and re-usable to draw segmented prompts ### If you want the theme to show the prefix only when on a remote server export DEFAULT_USER="yekcim" [[ -n "$SSH_CLIENT" ]] || export DEFAULT_USER="yekcim" CURRENT_BG='NONE' SEGMENT_SEPARATOR='⮀' # Begin a segment # Takes two arguments, background and foreground. Both can be omitted, # rendering default background/foreground. prompt_segment() { local bg fg [[ -n $1 ]] && bg="%K{$1}" || bg="%k" [[ -n $2 ]] && fg="%F{$2}" || fg="%f" if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then echo -n " %{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%} " else echo -n "%{$bg%}%{$fg%} " fi CURRENT_BG=$1 [[ -n $3 ]] && echo -n $3 } # End the prompt, closing any open segments prompt_end() { if [[ -n $CURRENT_BG ]]; then echo -n " %{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR" else echo -n "%{%k%}" fi echo -n "%{%f%}" CURRENT_BG='' } ### Prompt components # Each component will draw itself, and hide itself if no information needs to be shown # Context: user@hostname (who am I and where am I) prompt_context() { local user=`whoami` if [[ "$user" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then prompt_segment black default "%(!.%{%F{yellow}%}.)$user@%m" fi } # Git: branch/detached head, dirty status # Checks if working tree is dirty parse_git_dirty() { local STATUS='' local FLAGS FLAGS=('--porcelain') if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then if [[ $POST_1_7_2_GIT -gt 0 ]]; then FLAGS+='--ignore-submodules=dirty' fi if [[ "$DISABLE_UNTRACKED_FILES_DIRTY" == "true" ]]; then FLAGS+='--untracked-files=no' fi STATUS=$(command git status ${FLAGS} 2> /dev/null | tail -n1) fi if [[ -n $STATUS ]]; then echo "$ZSH_THEME_GIT_PROMPT_DIRTY" else echo "$ZSH_THEME_GIT_PROMPT_CLEAN" fi } prompt_git() { local ref dirty if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then dirty=$(parse_git_dirty) if [[ $SHOW_STASH_SEGMENT -eq 1 ]]; then stash_size=$(git stash list | wc -l | tr -d ' ') if [[ stash_size -ne 0 ]]; then prompt_segment white black echo -n "+${stash_size}" fi fi ref=$(git symbolic-ref HEAD 2> /dev/null) || "" if [[ -z $ref ]]; then detached_head=true; ref="$(git show-ref --head -s --abbrev |head -n1 2> /dev/null)"; ref_symbol="➦" else detached_head=false; ref=${ref/refs\/heads\//} ref_symbol="" fi remote=${$(git rev-parse --verify ${hook_com[branch]}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/} if [[ -n ${remote} ]] ; then ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l | tr -d ' ') displayed_ahead=" (+${ahead})" behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l | tr -d ' ') else ahead="" displayed_ahead="" behind="" fi if [[ -n $dirty ]]; then prompt_segment yellow black else prompt_segment green black fi echo -n "${ref_symbol} ${ref}${displayed_ahead}" setopt promptsubst autoload -Uz vcs_info zstyle ':vcs_info:*' enable git zstyle ':vcs_info:*' get-revision true zstyle ':vcs_info:*' check-for-changes true zstyle ':vcs_info:*' stagedstr '✚' zstyle ':vcs_info:git:*' unstagedstr '●' zstyle ':vcs_info:*' formats ' %u%c' zstyle ':vcs_info:*' actionformats '%u%c' vcs_info echo -n "${vcs_info_msg_0_}" # Displaying upstream dedicated segment if [[ -n $remote ]]; then if [ $behind -ne 0 ]; then prompt_segment magenta white else prompt_segment cyan black fi echo -n " $remote (-$behind)" fi fi } prompt_hg() { local rev status if $(hg id >/dev/null 2>&1); then if $(hg prompt >/dev/null 2>&1); then if [[ $(hg prompt "{status|unknown}") = "?" ]]; then # if files are not added prompt_segment red white st='±' elif [[ -n $(hg prompt "{status|modified}") ]]; then # if any modification prompt_segment yellow black st='±' else # if working copy is clean prompt_segment green black fi echo -n $(hg prompt " {rev}@{branch}") $st else st="" rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g') branch=$(hg id -b 2>/dev/null) if `hg st | grep -Eq "^\?"`; then prompt_segment red black st='±' elif `hg st | grep -Eq "^(M|A)"`; then prompt_segment yellow black st='±' else prompt_segment green black fi echo -n " $rev@$branch" $st fi fi } # Dir: current working directory prompt_dir() { prompt_segment blue black '%~' } # Status: # - was there an error # - am I root # - are there background jobs? prompt_status() { local symbols symbols=() [[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}✘" [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡" [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙" [[ -n "$symbols" ]] && prompt_segment black default "$symbols" } ## Main prompt build_prompt() { RETVAL=$? prompt_status prompt_context prompt_dir prompt_git prompt_end } PROMPT='%{%f%b%k%}$(build_prompt) ' # Prise en charge des touches [début], [fin] et autres typeset -A key key[Home]=${terminfo[khome]} key[End]=${terminfo[kend]} key[Insert]=${terminfo[kich1]} key[Delete]=${terminfo[kdch1]} key[Up]=${terminfo[kcuu1]} key[Down]=${terminfo[kcud1]} key[Left]=${terminfo[kcub1]} key[Right]=${terminfo[kcuf1]} key[PageUp]=${terminfo[kpp]} key[PageDown]=${terminfo[knp]} [[ -n "${key[Home]}" ]] && bindkey "${key[Home]}" beginning-of-line [[ -n "${key[End]}" ]] && bindkey "${key[End]}" end-of-line [[ -n "${key[Insert]}" ]] && bindkey "${key[Insert]}" overwrite-mode [[ -n "${key[Delete]}" ]] && bindkey "${key[Delete]}" delete-char [[ -n "${key[Up]}" ]] && bindkey "${key[Up]}" up-line-or-history [[ -n "${key[Down]}" ]] && bindkey "${key[Down]}" down-line-or-history [[ -n "${key[Left]}" ]] && bindkey "${key[Left]}" backward-char [[ -n "${key[Right]}" ]] && bindkey "${key[Right]}" forward-char [[ -n "${key[PageUp]}" ]] && bindkey "${key[PageUp]}" history-beginning-search-backward [[ -n "${key[PageDown]}" ]] && bindkey "${key[PageDown]}" history-beginning-search-forward # Titre de la fenêtre d'un xterm case $TERM in xterm*) precmd () {print -Pn "\e]0;%n@%m: %~\a"} ;; esac # Gestion de la couleur pour 'ls' (exportation de LS_COLORS) if [ -x /usr/bin/dircolors ] then if [ -r ~/.dir_colors ] then eval "`dircolors ~/.dir_colors`" elif [ -r /etc/dir_colors ] then eval "`dircolors /etc/dir_colors`" else eval "`dircolors`" fi fi ########################################### # 4. Options de zsh (cf 'man zshoptions') # ########################################### # Je ne veux JAMAIS de beeps unsetopt beep unsetopt hist_beep unsetopt list_beep # Redirection de la sortie: # >| doit être utilisés pour pouvoir écraser un fichier déjà existant ; # le fichier ne sera pas écrasé avec '>' unsetopt clobber # Ctrl+D est équivalent à 'logout' unsetopt ignore_eof # Affiche le code de sortie si différent de '0' setopt print_exit_value # Demande confirmation pour 'rm *' unsetopt rm_star_silent # Attend 10 secondes avant d'exécuter une commande rm qui contient un * (asterisk). setopt rmstarwait # Correction orthographique des commandes # Désactivé car, contrairement à ce que dit le "man", il essaye de # corriger les commandes avant de les hasher setopt correct # Si on utilise des jokers dans une liste d'arguments, retire les jokers # qui ne correspondent à rien au lieu de donner une erreur setopt nullglob # Désactivé le raccourcis '=' # Par défaut, `ls -l =vim` indiquera l'emplacement de vim. # =vim équivaut à `which vim` #setopt noequals ## Activation des fonctions internes de ZSH: # Liste des fonctions disponibles: #zcalc : une calculatrice (plus besoin de bc ou autres expr) #zargs : un super xargs #zmv : une commande permettant de faire du renommage/déplaçage en masse de fichiers. #zftp : un client ftp natif autoload -U zfinit zfinit # Les jobs qui tournent en tâche de fond sont nicé à '0' unsetopt bg_nice # N'envoie pas de "HUP" aux jobs qui tourent quand le shell se ferme unsetopt hup # Lancer le manuel en se placant sur une commande et en faisant {ESC,ALT}+{H,h} autoload -U run-help ## Gestion de la pile des dossiers: # Taille maximale de la pile placé dans zshenv # L'exécution de "cd" met le répertoire d'où l'on vient sur la pile setopt auto_pushd # Ignore les doublons dans la pile setopt pushd_ignore_dups # N'affiche pas la pile après un "pushd" ou "popd" setopt pushd_silent # Inverse l'action de cd +1 et cd +1 setopt pushdminus # "pushd" sans argument = "pushd $HOME" setopt pushd_to_home ## Pour bien utiliser la pile: # `dirs` va afficher la pile # `cd -NUMÉRO` ira dans le dossier correspondant au numéro du dossier dans la pile ## Dirstack DIRSTACKSIZE=20 setopt autopushd pushdsilent pushdtohome ## Remove duplicate entries setopt pushdignoredups ## This reverts the +/- operators. setopt pushdminus #DIRSTACKFILE="$HOME/.zsh/cache/dirs" #if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; then #dirstack=( ${(f)"$(< $DIRSTACKFILE)"} ) #[[ -d $dirstack[1] ]] && cd $dirstack[1] #fi #chpwd() { #print -l $PWD ${(u)dirstack} >> $DIRSTACKFILE #} ################################### ###### Options de complétion ###### ################################### # Schémas de complétion # - Schéma A : # 1ère tabulation : complète jusqu'au bout de la partie commune # 2ème tabulation : propose une liste de choix # 3ème tabulation : complète avec le 1er item de la liste # 4ème tabulation : complète avec le 2ème item de la liste, etc... # -> c'est le schéma de complétion par défaut de zsh. # Schéma B : # 1ère tabulation : propose une liste de choix et complète avec le 1er item # de la liste # 2ème tabulation : complète avec le 2ème item de la liste, etc... # Si vous voulez ce schéma, décommentez la ligne suivante : #setopt menu_complete # Schéma C : # 1ère tabulation : complète jusqu'au bout de la partie commune et # propose une liste de choix # 2ème tabulation : complète avec le 1er item de la liste # 3ème tabulation : complète avec le 2ème item de la liste, etc... # Ce schéma est le meilleur à mon goût ! # Si vous voulez ce schéma, décommentez la ligne suivante : unsetopt list_ambiguous # Quand le dernier caractère d'une complétion est '/' et que l'on # tape 'espace' après, le '/' est effacé setopt auto_remove_slash # Ne fait pas de complétion sur les fichiers et répertoires cachés unsetopt glob_dots # Traite les liens symboliques comme il faut setopt chase_links # Quand l'utilisateur commence sa commande par '!' pour faire de la # complétion historique, il n'exécute pas la commande immédiatement # mais il écrit la commande dans le prompt setopt hist_verify # Si la commande est invalide mais correspond au nom d'un sous-répertoire # exécuter 'cd sous-répertoire' setopt auto_cd ############################################### # 5. Paramètres de l'historique des commandes # ############################################### # Définition des variables SAVEHIST=5000 HISTSIZE=5000 HISTFILE=$HOME/.zsh/history #export TIMEFMT="%E" export SAVEHIST HISTSIZE HISTFILE # Toutes les sessions zsh partage le même historique #setopt SHARE_HISTORY # Ajoute l'historique à la fin de l'ancien fichier #setopt append_history # Chaque ligne est ajoutée dans l'historique à mesure qu'elle est tapée setopt inc_append_history # Ne stocke pas une ligne dans l'historique si elle est identique à la # précédente setopt hist_ignore_dups # Supprime les répétitions dans le fichier d'historique, ne conservant # que la dernière occurrence ajoutée #setopt hist_ignore_all_dups # Supprime les répétitions dans l'historique lorsqu'il est plein, mais # pas avant setopt hist_expire_dups_first # N'enregistre pas plus d'une fois une même ligne, quelles que soient # les options fixées pour la session courante #setopt hist_save_no_dups # La recherche dans l'historique avec l'éditeur de commandes de zsh ne # montre pas une même ligne plus d'une fois, même si elle a été # enregistrée plusieurs fois setopt hist_find_no_dups # Affichage de la date du début de la commande et sa durée (depuis epoch) # Culture time: epoch: 1er janvier 1970 setopt extended_history # Ne pas enregistrer les commandes précédées d'un espace: setopt hist_ignore_space ########################################### # 6. Complétion des options des commandes # ########################################### zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' zstyle ':completion:*' max-errors 3 numeric zstyle ':completion:*' use-compctl false ## Pour la liste des processus que l'on peut kill, avec un menu et couleur zstyle ':completion:*:*:*:*:processes' menu yes select #zstyle ':completion:*:*:*:*:processes' force-list always zstyle ':completion:*:processes' command 'ps -au$USER' zstyle ':completion:*:*:kill:*:processes' list-colors "=(#b) #([0-9]#)*=36=31" ## Pour éviter de reproposer un argument déjà utiliser dans la commande lors de la complétion zstyle ':completion:*:(rm|mv|cp|ls|scp):*' ignore-line yes ## cd ne sélectionnera pas le dossier courant lorsqu'il devra remonter d'un dossier # cd ../ ne proposera pas le dossier courant par exemple. zstyle ':completion:*:cd:*' ignore-parents parent pwd ## Pour la liste des fichiers qu'on peut ouvrir avec vim zstyle ':completion:*:*:vim:*' menu yes select ## Mettre en cache les résultats de l'auto-complétion car certaines fonctions sont lentes (apt, dpkg, ...) # Ne pas hésiter à faire un petit aptitude install et de lister tous les résultats possibles une première fois, histoire d'avoir tous les paquets en cache (~600ko), ça vaut le coup! zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path ~/.zsh/cache ## Ajout des couleurs pour la complétion zmodload -i zsh/complist zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} ## Complétion de la commande cd avec les répertoires locaux puis ceux de la variable CDPATH zstyle ':completion:*:*:cd:*' tag-order local-directories path-directories ## Complétion des commandes ssh avec le contenu du fichier ~/.ssh/config et le contenu de host local HOSTS #[[ -f ~/.ssh/config ]] && HOSTS=(`sed -n \'s/^Host \(.*\)/\1/p\' ~/.ssh/config`) #if [ -f ~/.ssh/config ]; then #HOSTS=(`grep ^Host ~/.ssh/config | sed s/Host\ // | egrep -v ‘^\*$’`) #fi #zstyle ':completion:*:(ssh|scp|sftp|sshfs):*' hosts ${HOSTS} ## Ajout de la complétion pour plusieurs fonctions: autoload -U compinit autoload -U zutil autoload -U complist # Activation compinit ########################################### # 7. Création des fichiers et répertoires # ########################################### # Dossier .zsh dans le répertoire personnel if [ ! -d ~/.zsh ]; then mkdir ~/.zsh fi # Fichier contenant l'historique pour chaque utilisateur if [ ! -f ~/.zsh/history ]; then touch ~/.zsh/history fi # Dossier contenant le cache pour chaque utilisateur if [ ! -d ~/.zsh/cache ]; then mkdir ~/.zsh/cache fi ########################################### ############## 8. Globbing ################ ########################################### # Activation du globbing étendu setopt extendedglob ## '^' inverse la pattern qui suit. # Exemple: # `ls ^*.log` listera tous les fichiers exceptés *.log