2008-10-05 18 views
143

Siempre me resulta 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?¿Qué hay en tu .zshrc?

Respuesta

138

Esta es la mía ...

# 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 [email protected]' 
else 
    alias sf='ssh [email protected]' 
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 "[email protected]" 
     #else 
       #command vi "[email protected]" 
     #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 

#}}} 
+19

Esto es tan grande que es casi inútil para mí. Yo, probablemente como la mayoría de las personas, no me tomaré el tiempo de leerlo. Especialmente sin explicaciones. –

+116

@Scottie T pero tiene comentarios por lo que es útil – aehlke

+4

Oro. ¡Pagándolo adentro! – chiggsy

30

Aquí es algo que he añadido recientemente y que no podí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 llama cada vez que se cd en algún lado. Luego se ve si hay un archivo env o .env.rc en el nuevo directorio o en uno de los directorios anteriores en el árbol y 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 .

+1

En segundo lugar. ¡Es genial! – Matt

+23

Veo cómo puede ser útil, pero realmente debe poner un cheque para asegurarse de que es el propietario del archivo. De lo contrario, puedo engañarte para que busques un archivo mío (que podría contener código malicioso). –

+3

Deberías echar un vistazo a smartcd, hace lo mismo pero de una forma automatizada, anidada y más regular. –

8

Aquí hay otro fragmento ZSH del que estoy muy orgulloso por la gran facilidad de lectura. ;)

# 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: :)@}"`" 
} 

Establecer VIEW en tu navegador, por ejemplo, export VIEW=/usr/bin/elinks o lo que quieras usar para una búsqueda rápida en Google.

2

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]" 
} 
9

me quedo con la mía en un repositorio en GitHub. Es una bifurcación de zshkit, que es una manera genial de almacenar sus personalizaciones.

Me gusta especialmente mi nuevo mensaje, que es realmente mínimo, 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 git, y no si no lo está. Lo acoplé con _why's titles para obtener lo que ve a continuación. Mece.

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

+2

Oh, esta es una gran idea. Creo que pondré mis archivos init e incluso mis archivos de configuración vim en GitHub también. –

+0

Esa [captura de pantalla] (http://img.skitch.com/20081017-m21ferbnp6b9bmu5trga8abjsj.jpg) no funciona tanto en FF como en Chrome, y sospecho que skitch requiere un inicio de sesión o ya no funciona para este tipo de tarea . Por otra parte, esta publicación es 5 años. –

2

En la mía, que 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 añade los nombres de host remoto para 'ssh' y otros comandos de red a las sugerencias de autocompletado, basado en el contenido de su ~/.ssh/known_hosts lists.)

+0

Tenga en cuenta que es posible que necesite 'HashKnownHosts no' en su' ~/.ssh/config' –

28

Heh, donde empiezo?

combinaciones de teclas ú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' 

Haciendo 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 tarda un tiempo? Mostrar "puntos de espera" mientras se completa una pestaña. (Se encuentra 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 

Corregir todos los errores de terminales, nunca. Uso terminales modernos en todas partes hoy en día. Esto solo funciona

export TERM=rxvt 
29

me gusta mi alias para encontrar una lista ordenada de grandes archivos 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 difícil, pero funciona perfecto. También me gusta bindkey de Ctrl-J, para hacer de varias líneas de edición fácil (es necesaria 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 para dibujar 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 soporte de números flotantes.

alt text

+4

zsh tiene potentes calificadores glob. Así que encontrar el archivo más grande en el directorio actual podría ser mucho más simple: echo ./*(.OL[1]) – Darkside

51

Alt-S inserta "sudo" al principio de la línea:

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

sesión Cambiar nombre cuando ssh en cualquier lugar:

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

alt-S truco == Genius –

+3

después de presionar 'alt-s' el puntero se queda allí. Cómo llevar el puntero al final de la línea después de insertar _sudo_. Intenté al agregar 'zle end-of-line' en la función, pero luego agrega _sudo_ al final de la línea. –

+4

@SagarRakshe Tu pregunta me intrigó, así que me salí de mi camino para averiguarlo. Resulta que realmente puede editar la línea de entrada actual directamente modificando la variable BUFFER en su función. https://github.com/sorin-ionescu/prezto/issues/28 tiene una buena función alternativa (comprobar si sudo ya está presente y mantener el cursor en el mismo lugar), mientras que http://zsh.sourceforge.net /Doc/Release/Zsh-Line-Editor.html#User_002dDefined-Widgets documenta todas las variables a las que puede acceder o modificar. – JBert

-2

Historia Mejor

export HISTCONTROL=erasedups 
shopt -s histappend 
+2

shopt is bash not zsh – lajarre

3

I oft es construir 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 así. 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 
+0

¿Esto difiere de '$ (!!)' cuando presiona '' después del segundo '!'? –

+0

Solo en el número de pulsaciones de teclas, creo. –

1

Tengo un sucio awk 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("&#xB0;","",$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'; } 

Así que 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.

+0

método alternativo: agregue un directorio de scripts a su ruta y cree scripts llamados 'ausweather',' zebra', etc ... – webb

+0

¡El bit del tiempo me da un 502, pero pensé que era una gran idea! –

Cuestiones relacionadas