[プログラミング] zshrc

一回じゃ入らんからエントリ分けるよ・・・

.zshrc


# 
#   kcrt's .zshrc file for Fedora/Debian
#       Written by kcrt <kcrt__atmark__kcrt.net>
#               Nanoseconds Hunter "http://www.kcrt.net"
#   Id: $Id$
#


# ----- とりあえず
stty stop undef                 # ^Sとかを無効にする。

# ----- 色宣言
typeset -A hostcolors
typeset -A hostblacks
hostcolors=(kuro green fro cyan sphe yellow pele magenda)
hostblacks=(kuro 001100 fro 001111 sphe 001111 pele 110000)
hostcolor=blue
if [[ $hostcolors[$HOST] = "" ]]; then
hostcolor=blue
hostblack="000000"
else
hostcolor=$hostcolors[$HOST]
hostblack=$hostblacks[$HOST]
fi
export hostcolor
export hostblacks

# ----- xterm(screen上以外での起動)だと思われる
if [[ "$TERM" == "xterm" ]]; then
# 色の個別設定 - うまく動かない端末もあります
echo -n "^[]R"              # first, reset the palette
echo -n "^[]P0$hostblack"   # black
echo -n "^[]P1FF0000"       # red
echo -n "^[]P200CC00"       # green
echo -n "^[]P3CCCC00"       # yellow
echo -n "^[]P45555FF"       # blue
echo -n "^[]P5FF00FF"       # magenta
echo -n "^[]P600FFFF"       # cyan
echo -n "^[]P7CCCCCC"       # white
echo -n "^[]P8888888"       # BLACK
echo -n "^[]P9FFAAAA"       # RED
echo -n "^[]PA88FF88"       # GREEN
echo -n "^[]PBFFFFAA"       # YELLOW
echo -n "^[]PC7777FF"       # BLUE
echo -n "^[]PDFFCCFF"       # MAGENTA
echo -n "^[]PE88FFFF"       # CYAN
echo -n "^[]PFEEEEEE"       # WHITE
# タイトルバーの文字列
if [[ "$SSH_CONNECTION" != "" ]]; then
# ssh接続
tmpTitle=`echo -n $SSH_CONNECTION | sed -e 's/¥(.*¥) .* ¥(.*¥) .*/¥1 --> ¥2/g'`
echo "^[]2;$HOST($tmpTitle, ssh)¥a"
elif [[ "$REMOTEHOST" != "" ]]; then
# おそらくtelnet
echo -n "^[]2;$REMOTEHOST --> $HOST¥a";
else
# ローカルと見た
echo -n "^[]2;$HOST (local)¥a"
fi
fi

# ----- 環境変数
export EDITOR="vim"             # やっぱりvimだねっ
export COLOR="tty"

# ----- 色関係
autoload colors                 # $color[red]とかが使えるようになる。
colors
eval `dircolors -b`
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}   # 補完も色つける

# ----- autoloadたち
autoload -U compinit
compinit -u
autoload zmv
autoload zargs
autoload zsh/files


# 設定はNOを頭につけると逆の意味になるよ!
# ----- 補完
LISTMAX=200                         # 表示する最大補完リスト数
setopt auto_list                    # 曖昧な補完で自動的にリスト表示
setopt NO_menu_complete             # 一回目の補完で候補を挿入(cf. auto_menu)
setopt auto_menu                    # 二回目の補完で候補を挿入
setopt magic_equal_subst            # (?) --include=/usr.. などの=補完を有効に
setopt NO_complete_in_word          # TODO:よくわからない
setopt list_packed                  # 補完候補をできるだけつめて表示する
setopt NO_list_beep                 # 補完候補表示時にビープ音を鳴らす
setopt list_types                   # ファイル名のおしりに識別マークをつける

# ----- 履歴
HISTFILE="$HOME/.zhistory"          # 履歴保存先
HISTSIZE=1000                       # 使用する履歴数
SAVEHIST=1000                       # 保存する履歴数
setopt hist_ignore_space            # スペースで始まるコマンドを記録しない
setopt hist_ignore_all_dups         # 重複した履歴を記録しない
setopt share_history                # ターミナル間の履歴を共有する
setopt append_history               # 履歴を追記する

# ----- ファイル操作関連
setopt auto_cd                      # ディレクトリ名でcd
setopt auto_remove_slash            # 不要なスラッシュをはずす
setopt auto_pushd                   # 自動的にpushd
setopt pushd_ignore_dups            # 重複したディレクトリスタックを記録しない
setopt correct                      # コマンドのスペル補正
setopt correct_all                  # コマンド以外もスペル補正
setopt equals                       # =zshとかが置換される
setopt extended_glob                # 拡張グロブ有効

# ----- そのほかの設定
setopt print_eight_bit              # 8ビット文字表示
setopt prompt_subst                 # プロンプトでのコマンド置換などを有効に
setopt beep                         # エラー時にはBeep音
setopt NO_emacs                     # viが一番!
setopt NO_flow_control              # ^S/^Qを有効に


# ----- プロンプト
# PROMPT='%{^[[%(!.31.32)m%}[%n@%m]%# %{^[[m%}'
PROMPT='%{%(!.$fg[red].$fg[$hostcolor])%}[%n@%m]%# %{$reset_color%}'
# 最後に実行したプログラムがエラーだと反転するよ。
RPROMPT=' %{%(?.$fg[cyan].$bg[cyan]$fg[black])%} [%~] %{$reset_color%}'

# ----- キー
bindkey -v
bindkey '^z'    push-line
bindkey '^y'    run-help
bindkey '^[[A'   up-line-or-history
bindkey '^[[B'   down-line-or-history

# ----- 自分用関数
ShowStatus(){

# モードの切り替え時に右上にモードを表示

integer Cursor_X
integer Cursor_Y
integer StrLength
StrLength=$(echo -n $1 | wc -m)
Cursor_X=$[COLUMNS-$StrLength] # 場所はお好みで
Cursor_Y=1
echo -n "^[[s"          # push pos
echo -n "^[[$[$Cursor_Y];$[$Cursor_X]H" # set pos
echo -n "^[[07;37m$1^[[m" # print
echo -n "^[[u"          # pop pos

}
# viins <-> vicmd {{{
Vi_ToCmd(){
ShowStatus "-- NORMAL --"
builtin zle .vi-cmd-mode
}
Vi_Insert(){
ShowStatus "-- INSERT --"
builtin zle .vi-insert
}
Vi_InsertFirst(){
ShowStatus "-- INSERT --"
builtin zle .vi-insert-bol
}
Vi_AddNext(){
ShowStatus "-- INSERT --"
builtin zle .vi-add-next
}
Vi_AddEol(){
ShowStatus "-- INSERT --"
builtin zle .vi-add-eol
}
Vi_Change(){
ShowStatus "-- INSERT --"
builtin zle .vi-change
}
zle -N Vi_ToCmd
zle -N Vi_Insert
zle -N Vi_InsertFirst
zle -N Vi_AddNext
zle -N Vi_AddEol
zle -N Vi_Change
bindkey -M viins "^[" Vi_ToCmd
bindkey -M vicmd "i" Vi_Insert
bindkey -M vicmd "I" Vi_InsertFirst
bindkey -M vicmd "a" Vi_AddNext
bindkey -M vicmd "A" Vi_AddEol
bindkey -M vicmd "c" Vi_Change
bindkey -M vicmd "/" history-incremental-search-backward
bindkey -M vicmd "^P" vi-repeat-search
bindkey -M vicmd "^N" vi-rev-repeat-search
# vi-repeat-search
bindkey "^Q" self-insert
# }}}


# ----- 関数
function _w3m(){
:title w3m $1
if [[ $1 == "" ]]; then
w3m http://www.google.co.jp
else
w3m $@
fi
:title $SHELL
}
function :whatsnew(){
vimdiff $1 =(svn cat --revision HEAD $1)
}
fucntion :whatchanged(){
vimdiff $1 =(svn cat --revision PREV $1)
}
function trash(){

if [ $# = 0 ]; then
command rm
return 1
fi

if [ ! -d ~/.trash ]; then
echo "ERROR : ~/.trash not found!"
return 1
fi

mv $@ ~/.trash || return

if [ $# = 1 ]; then
echo "'$1' was moved into trash!"
else
echo "$# files were moved into trash!"
fi

}


# ----- エイリアス
# コマンド置き換え
alias vi='vim -p'
alias rm='trash'
alias w3m='_w3m'
# 引数
alias ls='ls -F --color=tty'
alias du='du --human-readable -s ./*'
alias df='df --human-readable'
alias grep='grep --color -a'
alias less='less --ignore-case --status-column --prompt="?f%f:(stdin).?m(%i/%m files?x, next %x.). ?c<-%c-> .?e(END):%lt-%lb./%Llines" --hilite-unread --tabs=4 --window=-5'
alias pstree='pstree -p'
alias cal='cal -3'
alias zmv='noglob zmv -W'
alias zcp='noglob zmv -C'
alias zln='noglob zmv -L'
# 省略とか
alias la='ls -F -a --color=tty'
alias ll='ls -F -la --color=tty --sort=time --reverse'
alias hist='history'
alias :q='exit'
alias su='su -s =zsh'
alias hexdump='od -Ax -tx1z -v'
alias beep='print "¥a"'
alias cls='clear'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias :kuro='ssh kuro'
if [[ -x /usr/bin/man ]]; then
compdef _man w3mman
alias man='w3mman'
fi

# ----- suffix alias (関連づけ)
alias -s txt='cat'
alias -s log='tail -f -n20'
alias -s html='w3m'
function viewxls(){
w3m -T text/html =(xlhtml $1)
}
alias -s xls='viewxls'

# ----- root用の設定
if [[ $USER != 'root' ]] ; then
alias updatedb="sudo updatedb; beep"
alias taillog='sudo tail -f -n20 /var/log/syslog'
# Fedoraはデフォルトで設定されてない
zstyle ':completion:*:sudo:*' command-path /usr/sbin /usr/bin /sbin /bin /usr/local/sbin
export PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin
fi

# ----- Abstraction (予定)
alias :suspend="sudo /usr/sbin/pm-suspend"
alias :hibernate="sudo /usr/sbin/pm-hibernate"
if [[ -x /usr/bin/yum ]] ; then
alias :package_update="sudo yum update"
alias :package_install="sudo yum install"
elif [[ -x /usr/bin/aptitude ]] ; then
alias :package_update="sudo aptitude update; sudo aptitude upgrade"
alias :package_install="sudo aptitude install"
alias :package_list=""
alias :package_search="sudo aptitude show"
fi

# ----- cygwin 固有設定
if [[ $OSTYPE = *cygwin* ]] ; then
alias updatedb="updatedb --prunepaths='/cygdrive'"
alias open='cmd /c start '
alias start='explorer . &'
fi


# ----- screen 使うことにしたよ
if [[ -x /usr/bin/screen ]]; then
function :title(){
# 1 : 普通の起動
# 2 : screen上    ->  TERM = "screen"
# 3 : ssh または screen上でのssh  ->  SSH_CLIENTが空でない
# 4 : ssh上でのscreen ->  SSH_CLIENTが空でない かつ STYが空でない

# rootの場合**を付ける
if [[ $USER == "root" ]]; then
1="*$1*"
fi

if [[ -n $SSH_CLIENT ]]; then
if [[ -n $STY ]]; then
# 4 : ssh上でのscreen
else
# 3 : ssh または screen上でのssh
# マシン名を付け加える
1="$HOST:$1"
fi
elif [[ $TERM == "screen" ]]; then
# 2 : screen上   ->  TERM = "screen"
else
# 1 : 普通の起動
fi

echo -n "^[k$1^[¥¥"
}
alias :split='screen -X split'
alias :taillog='screen -t syslog sudo tail -f /var/log/syslog'
alias :tailapachelog='screen -t syslog sudo tail -f /var/log/apache2/error.log'
alias :top='screen -t top top'
alias :displays='screen -X displays'
# よく使いそうなやつ
IsScreen=`expr $TERM : screen`
if [[ $IsScreen != 0 ]]; then
# ----- スクリーンだよ!
preexec(){
# derived from http://nijino.homelinux.net/diary/200206.shtml#200206140
#    and modified by kcrt
emulate -L zsh
local -a cmd;
cmd=(${(z)2})
case $cmd[1] in
fg)
if (( $#cmd == 1 )); then
cmd=(`builtin jobs -l %+`)
else
cmd=(`builtin jobs -l $cmd[2]`)
fi
;;
%*)
cmd=(`builtin jobs -l $cmd[1]`)
;;
ls)
local -a wd;
wd=(`builtin dirs`);
:title $wd[0];
;;
cd)
:title $cmd[2];
;;
sudo)
:title "*$cmd[2]*";
;;
*)
:title $cmd[1];
;;
esac

#local -A jt; jt=(${(kv)jobtexts})

#$cmd >>(read num rest
#cmd=(${(z)${(e):-¥$jt$num}})
#echo -n "^[k$cmd[1]:t^[¥¥") 2>/dev/null
}
else
screen -r
fi
else
echo "[kcrt] : screen not found."
fi

written by kcrt