mac - ¿Qué hay en tu.zshrc?
zsh opensuse (12)
Siempre me parece interesante lo que las personas ponen en sus entornos de programación. Después de leer la misma pregunta básica para .vimrc y .bashrc, tengo que pedir mi shell favorito. Entonces, ¿qué hay en el tuyo?
A menudo construyo comandos elaborados paso a paso: ejecuto un comando, veo que necesito una opción diferente, luego uso el resultado del mismo comando dentro de $()
(la versión portátil de las comillas inversas) en un bucle for o algo. El siguiente fragmento de código hace que alt-E (probablemente debería escribir meta-E?) Inserte la línea anterior entre $()
.
insert-history-line() {
LBUFFER="$LBUFFER/$(${history[$((HISTNO-1))]})"
}
zle -N insert-history-line insert-history-line
bindkey ''^[e'' insert-history-line
Alt-S inserta "sudo" al comienzo de la línea:
insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo
Renombrar la sesión cuando salgo a otra parte:
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
Aquí está el mío...
# 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 [email protected]''
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 ''/C-i'' complete-word
# Faster! (?)
zstyle '':completion::complete:*'' use-cache 1
# case insensitive completion
zstyle '':completion:*'' matcher-list ''m:{a-z}={A-Z}''
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
#}}}
Aquí hay algo que agregué recientemente y que no podría vivir sin más:
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"
}
Esta es una función de enlace que se invoca cada vez que se cd
un cd
alguna parte. A continuación, busca si hay un archivo env
o .env.rc
está en el nuevo directorio o uno de los directorios anteriores en el árbol y lo fuentes, si se encuentra. Tengo un archivo env
en cada directorio de proyecto, en el cual configuro cosas del entorno de desarrollo, como actualizar la variable PERL5LIB con nuevas rutas, refrescar archivos de etiquetas, etc. Realmente ahorra mucho tiempo si a menudo cambias de proyecto o rama .
Aquí hay otro fragmento de ZSH del que estoy muy orgulloso por la gran legibilidad. ;)
# 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: :)@}"`"
}
Establezca VIEW
en su navegador, por ejemplo, export VIEW=/usr/bin/elinks
o lo que quiera usar para una búsqueda rápida en Google.
En el mío, tengo:
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))''
(Esto agrega nombres de host remotos para ''ssh'' y otros comandos de red a las sugerencias de autocompletar, en función del contenido de sus listas ~ / .ssh / known_hosts).
Esta es mi configuración para el soporte de pantalla GNU en ZSH. No sé dónde lo encontré, pero es muy agradable tener títulos hablados en las ventanas de tu pantalla si tienes muchos de ellos.
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]"
}
Estoy guardando el mío en un repositorio en GitHub . Es una bifurcación de zshkit, que es una manera genial de almacenar sus personalizaciones.
Me gusta mucho mi nuevo mensaje, que es realmente minimalista, pero contiene mucha información útil. El $
muestra el estado de salida del último comando, y el aviso se adapta para mostrar la rama y el estado actuales si está en un repositorio de git, y no si no lo está. Lo asocio con los títulos de _why para obtener lo que ves a continuación. Mece.
texto alternativo http://img.skitch.com/20081017-m21ferbnp6b9bmu5trga8abjsj.jpg
Heh, ¿por dónde empiezo?
Enlaces útiles
# 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 básicos
alias k=''tree''
alias ltr=''ls -ltr''
alias r=''screen -D -R''
alias ls=''ls --color''
alias l=''ls -lh''
alias ll=''ls -la''
Hacer fileutils GNU más detallado
for c in cp rm chmod chown rename; do
alias $c="$c -v"
done
En infraestructura lenta donde la finalización de pestañas toma un tiempo? Muestre "puntos de espera" mientras algo completa la pestaña. (encontrado en 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
Arregle todos los errores terminales, alguna vez. Utilizo terminales modernos en todas partes hoy en día. Esto solo funciona
export TERM=rxvt
Me gusta mi alias para encontrar una lista ordenada de los archivos más grandes en el directorio actual:
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 }"''
Es un poco duro, pero funciona perfecto. También me gusta bindkey para Ctrl-J, para facilitar la edición de varias líneas (se necesita una excepción para Midnight Commander):
if [[ "$MC_SID" != "" || "$MC_CONTROL_PID" != "" ]]; then
bindkey "^J" accept-line
else
bindkey "^J" self-insert
fi
Otra cosa que tengo, aunque bastante inútil, es una función dibujar el fractal de mandelbrot:
function most_useless_use_of_zsh {
local lines columns colour a b p q i 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*p-q*q+a, q=2*p*q+b, p=pnew))
done
((colour=(i/4)%8))
echo -n "//e[4${colour}m "
done
echo
done
}
Es una buena presentación de las capacidades ZSH, por ejemplo, compatibilidad con números flotantes.
Mejor historia
export HISTCONTROL=erasedups
shopt -s histappend
Tengo un awk sucio en mi [z | k] shrc. Solía mantener un gran archivo .func con muchas funciones para el aprovisionamiento hasta que algunos días me doy cuenta de que es super lento y necesito usar la carga automática para tenerlos en la memoria, no como fuente simple. Un vistazo en el archivo .func:
#------------------------------------------------------------------------------
# Get Weather forcast from BBC
ausweather () {curl -s http://newsrss.bbc.co.uk/weather/forecast/388/Next3DaysRSS.xml | awk -F''</*title>'' ''!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''; }
Entonces en .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)
Todas las funciones son POSIX Stytle. Recientemente estoy considerando usar un estilo de función ksh () más elegante.