什么在你的.zshrc?
我总是觉得人们在编程环境中放置的东西很有意思。 在阅读.vimrc和.bashrc的基本问题之后,我必须要求我最喜欢的shell。 那么你的是什么?
这是我的…
# 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在行首插入“sudo”:
insert_sudo () { zle beginning-of-line; zle -U "sudo " } zle -N insert-sudo insert_sudo bindkey "^[s" insert-sudo
当我在任何地方ssh重命名会话:
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
这是我最近添加的东西,我不能再生活了:
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" }
这是一个钩子函数,只要你在某个地方cd
就可以调用。 然后它会查看是否有文件env
或.env.rc
位于树中的新目录或上面的目录之一中,并find它。 我在每个项目目录中都有一个env
文件,其中我设置了开发环境的东西,比如用新path更新PERL5LIBvariables,刷新标记文件等等。如果您经常在项目或分支之间切换,那真的会节省很多时间。
我喜欢我的别名在当前目录下查找最大文件的sorting列表:
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 }"'
这有点粗糙,但工作完美。 我也喜欢Ctrl-J的bindkey,使多行编辑变得简单(需要Midnight Commander的例外):
if [[ "$MC_SID" != "" || "$MC_CONTROL_PID" != "" ]]; then bindkey "^J" accept-line else bindkey "^J" self-insert fi
我有另一件事,虽然很无用,但它是一个绘制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 }
这是ZSHfunction的一个很好的介绍,例如浮点数支持。
嘿,我从哪里开始?
有用的键盘绑定
# 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 k='tree' alias ltr='ls -ltr' alias r='screen -D -R' alias ls='ls --color' alias l='ls -lh' alias ll='ls -la'
使GNU fileutils更加冗长
for c in cp rm chmod chown rename; do alias $c="$c -v" done
在制表符完成需要一段时间的缓慢基础结构上? 显示“等待点”,而一些标签完成。 (在zsh-users
上find)
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
修复所有的terminal错误,永远。 现在到处都是现代的terminal。 这只是工作。
export TERM=rxvt
我把它保存在GitHub的仓库中。 这是zshkit的一个分支,这是存储您的自定义的一个很酷的方法。
我特别喜欢我的新提示,这是非常小的,但包含大量有用的信息。 $
显示最后一个命令的退出状态,如果你在一个git仓库中,提示会适应显示当前分支和状态,如果你不在,那么不会。 我将它与_why的标题相结合,以获得您在下面看到的内容。 它岩石。
替代文字http://img.skitch.com/20081017-m21ferbnp6b9bmu5trga8abjsj.jpg
这是另外一个ZSH片段,我非常自豪,因为可读性很好。 ;)
# 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: :)@}"`" }
将VIEW
设置为您的浏览器,例如export VIEW=/usr/bin/elinks
或任何您想用于快速search的Google。
我经常一步一步地构build精细的命令:我运行一个命令,看到我需要一个不同的选项,然后在for循环中使用$()
(反向引用的可移植版本)中相同命令的输出。 下面的代码片断使得alt-E(我应该写meta -E?)在$()
之间插入前一行。
insert-history-line() { LBUFFER="$LBUFFER\$(${history[$((HISTNO-1))]})" } zle -N insert-history-line insert-history-line bindkey '^[e' insert-history-line
这是我在ZSH的GNU屏幕支持的设置。 不知道我在哪里find它,但是如果你的屏幕窗口中有很多的话,那么在屏幕窗口中说出标题是相当可爱的。
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]" }
在我的,我有:
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))'
(根据〜/ .ssh / known_hosts列表的内容,将'ssh'和其他networking命令的远程主机名添加到自动填充build议中。)
我在[z | k] shrc中有一个很脏的awk。 我曾经保留一个很大的.func文件与许多函数的采购,直到有些日子,我意识到这是超级慢,我需要使用自动加载到内存中,而不是简单的来源。 在.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'; }
所以在.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)
所有function都是POSIX Stytle。 最近我正在考虑使用更优雅的ksh函数()风格。
更好的历史
export HISTCONTROL=erasedups shopt -s histappend