Qu’y a-t-il dans votre .zshrc?

Je trouve toujours intéressant ce que les gens mettent dans leurs environnements de programmation. Après avoir lu la même question de base pour .vimrc et .bashrc, je dois demander mon shell préféré. Alors qu’est-ce qu’il y a dans le vôtre?

Voici la mienne…

# Autoload screen if we aren't in it. (Thanks Fjord!) if [[ $STY = '' ]] then screen -xR; fi #{{{ ZSH Modules autoload -U compinit promptinit zcalc zsh-mime-setup compinit promptinit zsh-mime-setup #}}} #{{{ Options # why would you type 'cd dir' if you could just type 'dir'? setopt AUTO_CD # Now we can pipe to multiple outputs! setopt MULTIOS # Spell check commands! (Sometimes annoying) setopt CORRECT # This makes cd=pushd setopt AUTO_PUSHD # This will use named dirs when possible setopt AUTO_NAME_DIRS # If we have a glob this will expand it setopt GLOB_COMPLETE setopt PUSHD_MINUS # No more annoying pushd messages... # setopt PUSHD_SILENT # blank pushd goes to home setopt PUSHD_TO_HOME # this will ignore multiple directories for the stack. Useful? I dunno. setopt PUSHD_IGNORE_DUPS # 10 second wait if you do something that will delete everything. I wish I'd had this before... setopt RM_STAR_WAIT # use magic (this is default, but it can't hurt!) setopt ZLE setopt NO_HUP setopt VI # only fools wouldn't do this ;-) export EDITOR="vi" setopt IGNORE_EOF # If I could disable Ctrl-s completely I would! setopt NO_FLOW_CONTROL # beeps are annoying setopt NO_BEEP # Keep echo "station" > station from clobbering station setopt NO_CLOBBER # Case insensitive globbing setopt NO_CASE_GLOB # Be Reasonable! setopt NUMERIC_GLOB_SORT # I don't know why I never set this before. setopt EXTENDED_GLOB # hows about arrays be awesome? (that is, frew${cool}frew has frew surrounding all the variables, not just first and last setopt RC_EXPAND_PARAM #}}} #{{{ Variables export MATHPATH="$MANPATH:/usr/local/texlive/2007/texmf/doc/man" export INFOPATH="$INFOPATH:/usr/local/texlive/2007/texmf/doc/info" export PATH="$PATH:/usr/local/texlive/2007/bin/i386-linux" export RI="--format ansi" declare -U path #export LANG=en_US export PAGER=most #}}} #{{{ External Files # Include stuff that should only be on this if [[ -r ~/.localinclude ]]; then source ~/.localinclude fi # Include local directories if [[ -r ~/.localdirs ]]; then source ~/.localdirs fi autoload run-help HELPDIR=~/zsh_help #}}} #{{{ Aliases #{{{ Amarok if [[ -x =amarok ]]; then alias play='dcop amarok player play' alias pause='dcop amarok player pause' alias next='dcop amarok player next' alias prev='dcop amarok player prev' alias stop='dcop amarok player stop' alias current='dcop amarok player nowPlaying' alias osd='dcop amarok player showOSD' alias pp='dcop amarok player playPause' fi #}}} #{{{ Shell Conveniences alias sz='source ~/.zshrc' alias ez='vim ~/.zshrc' alias mk=popd alias ls='pwd; ls --color' #}}} #{{{ Package management if [[ -x =aptitude ]]; then alias attd="sudo xterm -C aptitude" else if [[ -x =emerge ]]; then alias emu='sudo emerge -uDN world' alias emup='sudo emerge -uDvpN world' alias esy='sudo emerge --sync' alias ei='sudo emerge' alias eip='sudo emerge -vp ' alias packmask='sudo vi /etc/portage/package.unmask' alias packuse='sudo vi /etc/portage/package.use' alias packkey='sudo vi /etc/portage/package.keywords' fi fi #}}} #{{{ SSH if [[ $HOST = FrewSchmidt ]]; then alias sf='ssh frew@FrewSchmidt2' else alias sf='ssh frew@FrewSchmidt' fi alias enosh='ssh schmidtf@enosh.letnet.net' alias s31='ssh 192.168.3.1' alias s39='ssh 192.168.3.9' #}}} #{{{ Misc. if [[ -x `which tea_chooser` ]]; then # I need to do this more elegantly... alias rt='cd /home/frew/bin/run/tea_chooser; ./randtea.rb' fi # CPAN and sudo don't work together or something if [[ -x `which perl` ]]; then alias cpan="su root -c 'perl -MCPAN -e \"shell\"'" fi # Maxima with line editing! Now if only I could use zle... if [[ -x `which maxima` && -x `which ledit` ]]; then alias maxima='ledit maxima' fi # Convenient. Also works in Gentoo or Ubuntu if [[ -x `which irb1.8` ]]; then alias irb='irb1.8 --readline -r irb/completion' else alias irb='irb --readline -r irb/completion' fi # For some reason the -ui doesn't work on Ubuntu... I need to deal with that # somehow... if [[ -x `which unison` ]]; then alias un='unison -ui graphic -perms 0 default' alias un.='unison -ui graphic -perms 0 dotfiles' fi # fri is faster. if [[ -x `which fri` ]]; then alias ri=fri fi # This is how you can see all of my passwords. alias auth='view ~/.auth.des3' # copy with a progress bar. alias cpv="rsync -poghb --backup-dir=/tmp/rsync -e /dev/null --progress --" # save a few keystrokes when opening the learn sql database if [[ -x `which psql` ]]; then alias lrnsql="psql learn_sql" fi # I use the commands like, every day now alias seinr="sudo /etc/init.d/networking restart" if [[ -x `which gksudo` && -x `which wlassistant` ]]; then alias gkw="gksudo wlassistant&" fi alias kgs='javaws http://files.gokgs.com/javaBin/cgoban.jnlp' if [[ -x `which delish` ]]; then alias delish="noglob delish" fi alias tomes='screen -S tome -c /home/frew/.tomescreenrc' alias mpfs='mplayer -fs -zoom' alias mpns='mplayer -nosound' if [[ -x /home/frew/personal/dino ]]; then dinoray=( /home/frew/personal/dino/* ) alias dino='feh $dinoray[$RANDOM%$#dinoray+1]' fi #}}} #{{{ Globals... alias -g G="| grep" alias -g L="| less" #}}} #{{{ Suffixes... if [[ -x `which abiword` ]]; then alias -s doc=abiword fi if [[ -x `which ooimpress` ]]; then alias -s ppt='ooimpress &> /dev/null ' fi if [[ $DISPLAY = '' ]] then alias -s txt=vi else alias -s txt=gvim fi #}}} #}}} #{{{ Completion Stuff bindkey -M viins '\Ci' complete-word # Faster! (?) zstyle ':completion::complete:*' use-cache 1 # case insensitive completion zstyle ':completion:*' matcher-list 'm:{az}={AZ}' zstyle ':completion:*' verbose yes zstyle ':completion:*:descriptions' format '%B%d%b' zstyle ':completion:*:messages' format '%d' zstyle ':completion:*:warnings' format 'No matches for: %d' zstyle ':completion:*' group-name '' #zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete zstyle ':completion:*' completer _expand _force_rehash _complete _approximate _ignored # generate descriptions with magic. zstyle ':completion:*' auto-description 'specify: %d' # Don't prompt for a huge list, page it! zstyle ':completion:*:default' list-prompt '%S%M matches%s' # Don't prompt for a huge list, menu it! zstyle ':completion:*:default' menu 'select=0' # Have the newer files last so I see them first zstyle ':completion:*' file-sort modification reverse # color code completion!!!! Wohoo! zstyle ':completion:*' list-colors "=(#b) #([0-9]#)*=36=31" unsetopt LIST_AMBIGUOUS setopt COMPLETE_IN_WORD # Separate man page sections. Neat. zstyle ':completion:*:manuals' separate-sections true # Egomaniac! zstyle ':completion:*' list-separator 'fREW' # complete with a menu for xwindow ids zstyle ':completion:*:windows' menu on=0 zstyle ':completion:*:expand:*' tag-order all-expansions # more errors allowed for large words and fewer for small words zstyle ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX+$#SUFFIX)/3 )) )' # Errors format zstyle ':completion:*:corrections' format '%B%d (errors %e)%b' # Don't complete stuff already on the line zstyle ':completion::*:(rm|vi):*' ignore-line true # Don't complete directory we are already in (../here) zstyle ':completion:*' ignore-parents parent pwd zstyle ':completion::approximate*:*' prefix-needed false #}}} #{{{ Key bindings # Who doesn't want home and end to work? bindkey '\e[1~' beginning-of-line bindkey '\e[4~' end-of-line # Incremental search is elite! bindkey -M vicmd "/" history-incremental-search-backward bindkey -M vicmd "?" history-incremental-search-forward # Search based on what you typed in already bindkey -M vicmd "//" history-beginning-search-backward bindkey -M vicmd "??" history-beginning-search-forward bindkey "\eOP" run-help # oh wow! This is killer... try it! bindkey -M vicmd "q" push-line # Ensure that arrow keys work as they should bindkey '\e[A' up-line-or-history bindkey '\e[B' down-line-or-history bindkey '\eOA' up-line-or-history bindkey '\eOB' down-line-or-history bindkey '\e[C' forward-char bindkey '\e[D' backward-char bindkey '\eOC' forward-char bindkey '\eOD' backward-char bindkey -M viins 'jj' vi-cmd-mode bindkey -M vicmd 'u' undo # Rebind the insert key. I really can't stand what it currently does. bindkey '\e[2~' overwrite-mode # Rebind the delete key. Again, useless. bindkey '\e[3~' delete-char bindkey -M vicmd '!' edit-command-output # it's like, space AND completion. Gnarlbot. bindkey -M viins ' ' magic-space #}}} #{{{ History Stuff # Where it gets saved HISTFILE=~/.history # Remember about a years worth of history (AWESOME) SAVEHIST=10000 HISTSIZE=10000 # Don't overwrite, append! setopt APPEND_HISTORY # Write after each command # setopt INC_APPEND_HISTORY # Killer: share history between multiple shells setopt SHARE_HISTORY # If I type cd and then cd again, only save the last one setopt HIST_IGNORE_DUPS # Even if there are commands inbetween commands that are the same, still only save the last one setopt HIST_IGNORE_ALL_DUPS # Pretty Obvious. Right? setopt HIST_REDUCE_BLANKS # If a line starts with a space, don't save it. setopt HIST_IGNORE_SPACE setopt HIST_NO_STORE # When using a hist thing, make a newline show the change before executing it. setopt HIST_VERIFY # Save the time and how long a command ran setopt EXTENDED_HISTORY setopt HIST_SAVE_NO_DUPS setopt HIST_EXPIRE_DUPS_FIRST setopt HIST_FIND_NO_DUPS #}}} #{{{ Prompt! host_color=cyan history_color=yellow user_color=green root_color=red directory_color=magenta error_color=red jobs_color=green host_prompt="%{$fg_bold[$host_color]%}%m%{$reset_color%}" jobs_prompt1="%{$fg_bold[$jobs_color]%}(%{$reset_color%}" jobs_prompt2="%{$fg[$jobs_color]%}%j%{$reset_color%}" jobs_prompt3="%{$fg_bold[$jobs_color]%})%{$reset_color%}" jobs_total="%(1j.${jobs_prompt1}${jobs_prompt2}${jobs_prompt3} .)" history_prompt1="%{$fg_bold[$history_color]%}[%{$reset_color%}" history_prompt2="%{$fg[$history_color]%}%h%{$reset_color%}" history_prompt3="%{$fg_bold[$history_color]%}]%{$reset_color%}" history_total="${history_prompt1}${history_prompt2}${history_prompt3}" error_prompt1="%{$fg_bold[$error_color]%}< %{$reset_color%}" error_prompt2="%{$fg[$error_color]%}%?%{$reset_color%}" error_prompt3="%{$fg_bold[$error_color]%}>%{$reset_color%}" error_total="%(?..${error_prompt1}${error_prompt2}${error_prompt3} )" case "$TERM" in (screen) function precmd() { print -Pn "\033]0;S $TTY:t{%100< ...<%~%<<}\007" } ;; (xterm) directory_prompt="" ;; (*) directory_prompt="%{$fg[$directory_color]%}%~%{$reset_color%} " ;; esac if [[ $USER == root ]]; then post_prompt="%{$fg_bold[$root_color]%}%#%{$reset_color%}" else post_prompt="%{$fg_bold[$user_color]%}%#%{$reset_color%}" fi PS1="${host_prompt} ${jobs_total}${history_total} ${directory_prompt}${error_total}${post_prompt} " #if [[ $TERM == screen]; then #function precmd() { #print -Pn "\033]0;S $TTY:t{%100<...<%~%<<}\007" #} #elsif [[ $TERM == linux ]]; then #precmd () { print -Pn "\e]0;%m: %~\a" } #fi #}}} #{{{ Functions #function vi { #LIMIT=$# #for ((i = 1; i <= $LIMIT; i++ )) do #eval file="\$$i" #if [[ -e $file && ! -O $file ]] #then #otherfile=1 #else #fi #done #if [[ $otherfile = 1 ]] #then #command sudo vi "$@" #else #command vi "$@" #fi #} _force_rehash() { (( CURRENT == 1 )) && rehash return 1 # Because we didn't really complete anything } edit-command-output() { BUFFER=$(eval $BUFFER) CURSOR=0 } zle -N edit-command-output #}}} #{{{ Testing... Testing... #exec 2>>(while read line; do #print '\e[91m'${(q)line}'\e[0m' > /dev/tty; done &) watch=(notme) LOGCHECK=0 #}}} #{{{ ZSH Modules autoload -U compinit promptinit zcalc zsh-mime-setup compinit promptinit zsh-mime-setup #}}} 

Alt-S insère “sudo” en début de ligne:

 insert_sudo () { zle beginning-of-line; zle -U "sudo " } zle -N insert-sudo insert_sudo bindkey "^[s" insert-sudo 

Renommez la session quand je ssh n’importe où:

 case $TERM in xterm*) precmd () {print -Pn "\e]0;%m: %~\a"} ssh(){ PRENAME="`dcop $KONSOLE_DCOP_SESSION sessionName`"; dcop "$KONSOLE_DCOP_SESSION" renameSession "$@"; /usr/bin/ssh "$@"; dcop "$KONSOLE_DCOP_SESSION" renameSession "$PRENAME" } ;; esac 

Voici quelque chose que j’ai ajouté récemment et dont je ne pourrais plus me passer:

 function chpwd; { DIRECTORY="$PWD" while true; do if [ -f './.env.rc' ]; then source './.env.rc' break fi if [ -f './env' ]; then source './env' break fi [ $PWD = '/' ] && break cd -q .. done cd -q "$DIRECTORY" } 

Ceci est une fonction hook qui est appelée chaque fois que vous cd quelque part. Il regarde alors s’il y a un fichier env ou .env.rc trouve dans le nouveau répertoire ou l’un des répertoires ci-dessus dans l’arborescence et le source, s’il est trouvé. J’ai un fichier env dans chaque répertoire de projet, dans lequel je configure des éléments d’environnement de développement, tels que la mise à jour de la variable PERL5LIB avec de nouveaux chemins, des fichiers de balises actualisés, etc. .

J’aime mon alias pour trouver la liste sortingée des plus gros fichiers dans le répertoire courant:

 alias biggest='find -type f -printf '\''%s %p\n'\'' | sort -nr | head -n 40 | gawk "{ print \$1/1000000 \" \" \$2 \" \" \$3 \" \" \$4 \" \" \$5 \" \" \$6 \" \" \$7 \" \" \$8 \" \" \$9 }"' 

C’est un peu dur, mais fonctionne parfaitement. J’aime aussi bindkey pour Ctrl-J, pour rendre l’édition multi-lignes facile (une exception pour Midnight Commander est nécessaire):

 if [[ "$MC_SID" != "" || "$MC_CONTROL_PID" != "" ]]; then bindkey "^J" accept-line else bindkey "^J" self-insert fi 

Une autre chose que j’ai, bien qu’inutile, c’est de dessiner une fractale de mandelbrot:

 function most_useless_use_of_zsh { local lines columns colour abpqi pnew ((columns=COLUMNS-1, lines=LINES-1, colour=0)) for ((b=-1.5; b< =1.5; b+=3.0/lines)) do for ((a=-2.0; a<=1; a+=3.0/columns)) do for ((p=0.0, q=0.0, i=0; p*p+q*q < 4 && i < 32; i++)) do ((pnew=p*pq*q+a, q=2*p*q+b, p=pnew)) done ((colour=(i/4)%8)) echo -n "\\e[4${colour}m " done echo done } 

C'est une bonne présentation des capacités ZSH, par exemple la prise en charge des nombres à virgule flottante.

texte alt

Heh, où est-ce que je commence?

Liens utiles

 # Meta-u to chdir to the parent directory bindkey -s '\eu' '^Ucd ..; ls^M' # If AUTO_PUSHD is set, Meta-p pops the dir stack bindkey -s '\ep' '^Upopd >/dev/null; dirs -v^M' # Pipe the current command through less bindkey -s "\el" " 2>&1|less^M" 

Alias ​​de base

 alias k='tree' alias ltr='ls -ltr' alias r='screen -D -R' alias ls='ls --color' alias l='ls -lh' alias ll='ls -la' 

Rendre GNU fileutils plus verbeux

 for c in cp rm chmod chown rename; do alias $c="$c -v" done 

Sur une infrastructure lente où l’achèvement des tabs prend du temps? Afficher les “points d’attente” pendant que quelque chose se termine. (trouvé sur zsh-users )

 expand-or-complete-with-dots() { echo -n "\e[31m......\e[0m" zle expand-or-complete zle redisplay } zle -N expand-or-complete-with-dots bindkey "^I" expand-or-complete-with-dots 

Réparez tous les bugs de terminal. J’utilise des terminaux modernes partout de nos jours. Cela fonctionne juste.

 export TERM=rxvt 

Je garde le mien dans un repository sur GitHub . C’est un fork de zshkit, un moyen génial de stocker vos personnalisations.

Je suis particulièrement friand de mon nouveau message, qui est vraiment minime, mais qui contient beaucoup d’informations utiles. $ Affiche le statut de sortie de la dernière commande, et l’invite s’adapte à l’affichage de la twig et de l’état actuels si vous êtes dans un repository git, et non si vous ne le faites pas. Je l’ai couplé avec les titres de _why pour obtenir ce que vous voyez ci-dessous. Ça bascule

alt text http://img.skitch.com/20081017-m21ferbnp6b9bmu5trga8abjsj.jpg

Voici un autre extrait de ZSH dont je suis très fier en raison de sa grande lisibilité. 😉

 # URL encode something and print it. function url-encode; { setopt extendedglob echo "${${(j: :)@}//(#b)(?)/%$[[##16]##${match[1]}]}" } # Search google for the given keywords. function google; { $VIEW "http://www.google.com/search?q=`url-encode "${(j: :)@}"`" } 

Définissez VIEW sur votre navigateur, par exemple, export VIEW=/usr/bin/elinks ou ce que vous voulez utiliser pour une recherche rapide sur Google.

Je construis souvent des commandes élaborées étape par étape: je lance une commande, je vois une autre option, puis utilise la sortie de la même commande dans $() (la version portable des backquotes) dans une boucle for ou quelque chose. L’extrait suivant fait alt-E (je devrais probablement écrire meta-E?) Insérez la ligne précédente entre $() .

 insert-history-line() { LBUFFER="$LBUFFER\$(${history[$((HISTNO-1))]})" } zle -N insert-history-line insert-history-line bindkey '^[e' insert-history-line 

Ceci est ma configuration pour le support GNU Screen dans ZSH. Je ne sais pas où je l’ai trouvé, mais c’est très agréable d’avoir des titres parlants dans vos fenêtres d’écran si vous en avez beaucoup.

 function title { if [[ $TERM == "screen"* ]]; then print -nR $'\033k'$1$'\033\\' print -nR $'\033]0;'$2$'\a' fi } function precmd { title "zsh" "$PWD" } function preexec { emulate -L zsh local -a cmd; cmd=(${(z)1}) title "$cmd[1]:t" "$cmd[2,-1]" } 

Dans le mien, j’ai:

 zstyle -e ':completion::*:hosts' hosts 'reply=($(sed -e "/^#/d" -e "s/ .*\$//" -e "s/,/ /g" /etc/ssh_known_hosts(N) ~/.ssh/known_hosts(N) 2>/dev/null | xargs) $(grep \^Host ~/.ssh/config(N) | cut -f2 -d\ 2>/dev/null | xargs))' 

(Cela ajoute des noms d’hôte distants pour ‘ssh’ et d’autres commandes réseau aux suggestions de saisie semi-automatique, en fonction du contenu de vos listes ~ / .ssh / known_hosts.)

J’ai un awk sale dans mon [z | k] shrc. J’avais l’habitude de garder un gros fichier .func avec beaucoup de fonctions pour le sourcing jusqu’à certains jours, je me rends compte qu’il est super lent et j’ai besoin d’utiliser l’autoload pour les mettre en mémoire, pas simple source. Un coup d’oeil dans le fichier .func:

 #------------------------------------------------------------------------------ # Get Weather forcast from BBC ausweather () {curl -s http://newsrss.bbc.co.uk/weather/forecast/388/Next3DaysRSS.xml | awk -F'' '!a[$2]++&&NF!=1 {gsub("°","",$2); print $2}'; } #------------------------------------------------------------------------------ # ANSI color zebra output zebra () {cat $1 | awk 'NR%2 == 1 {printf("\033[30m\033[47m%s\033[0m\n", $0); next}; 1'; } 

Donc, dans .zshrc:

 # split .func file into small functions, one per file, under .funcs folder for autoloading awk -v homedir=$HOME ' BEGIN {comment="# Shell Function"} /^#/ && name == "" { comment = comment"\n"$0; next; } !/^#/ && /\(\)/ { name = $1; fun[name] = comment; } /; \}$/ && !/next; \}$/ { if (name == "") { print "Parse Error on Line "NR": "$0; next; } comment = "# Shell Function"; fun[name] = fun[name]"\n"$0; print fun[name] > homedir"/.funcs/"name; name = ""; next; } NR > 0 { fun[name] = fun[name]"\n"$0; } ' ~/.func FPATH=$FPATH:~/.funcs autoload ~/.funcs/*(:t) 

Toutes les fonctions sont POST Stytle. Récemment, j’envisage d’utiliser un style ksh function () plus gracieux.

Meilleure histoire

 export HISTCONTROL=erasedups shopt -s histappend