zshの設定ファイル

自分の zsh の設定。

# ディレクトリ構成
${HOME}/.zsh
　|-- .zshenv
　|-- .zshrc
　|-- .zsh_main
　|-- .zsh_option
　|-- .zsh_alias
　`-- .zsh_history

# .zshenv
```.zshenv
# ホームディレクトリからこのファイルにの名前でリンクを張る。
# つまり、${HOME}/.zshenv -> ${ZDOTDIR}/.zshenv 
export ZDOTDIR="${HOME}/.zsh"
```

# .zshrc
```.zshrc
# ${ZDOTDIR} を設定したので、このファイルにはリンクを張らなくても良い。
# 主に環境変数の設定
if [ -f ${ZDOTDIR}/.zsh_main ]; then
	source ${ZDOTDIR}/.zsh_main
fi

# 主に zsh 特有のオプションの設定
if [ -f ${ZDOTDIR}/.zsh_option ]; then
	source ${ZDOTDIR}/.zsh_option
fi

# 主にエイリアスの設定
if [ -f ${ZDOTDIR}/.zsh_alias ]; then
	source ${ZDOTDIR}/.zsh_alias
fi
```

# .zsh_main
```.zsh_main
# path の設定

# たまに Solaris も使うので、そのパスも。
# (N-/) とすると存在するディレクトリだけをパスに加える。
path=(\
${HOME}/local/bin(N-/) \
/usr/local/bin(N-/) \
/usr/local/sbin(N-/) \
/opt/sfw/bin(N-/) \
/opt/sfw/sbin(N-/) \
/opt/csw/bin(N-/) \
/opt/csw/sbin(N-/) \
/usr/ccs/bin(N-/) \
/usr/sfw/bin(N-/) \
/usr/sfw/sbin(N-/) \
/usr/ucb(N-/) \
/usr/xpg4/bin(N-/) \
/usr/xpg6/bin(N-/) \
${path} \
)

# LD_LIBRARY_PATH でも (N-/) を使ったり、重複パスを削除したい（後述）。
if [ -z "${ld_library_path}" ]; then
	typeset -T LD_LIBRARY_PATH ld_library_path
fi
if [ -z "${ld_library_path_64}" ]; then
	typeset -T LD_LIBRARY_PATH_64 ld_library_path_64
fi

ld_library_path=(\
${HOME}/local/lib(N-/) \
/usr/local/lib(N-/) \
/usr/lib(N-/) \
/lib(N-/) \
/usr/sfw/lib(N-/) \
/usr/ucblib(N-/) \
/opt/sfw/lib(N-/) \
${ld_library_path} \
)

ld_library_path_64=(\
${HOME}/lib64(N-/) \
/usr/local/lib64(N-/) \
/usr/lib64(N-/) \
/lib64(N-/) \
/usr/sfw/lib/64(N-/) \
/usr/ucblib64(N-/) \
/opt/sfw/lib64(N-/) \
${ld_library_path_64} \
)

# 重複するパスを削除する。
typeset -U path ld_library_path ld_library_path_64
export PATH LD_LIBRARY_PATH LD_LIBRARY_PATH_64

# カーネル名。Linux や Solaris で設定を切り替えたいときに使用する。
export KERNEL_NAME="`uname -s`"

# 文字コード。横着して ${LANGUAGE} だけ変えれば良いように。
export LANGUAGE="ja_JP.eucJP"
export LANG="${LANGUAGE}"
export LC_ALL="${LANGUAGE}"

# エディタ、ページャ
export EDITOR="vim"
export CVSEDITOR="${EDITOR}"
export SVN_EDITOR="${EDITOR}"
export GIT_EDITOR="${EDITOR}"
export PAGER="less"

# ヒストリファイル
export HISTFILE="${ZDOTDIR}/.zsh_history"
export HISTSIZE=100000
export SAVEHIST=${HISTSIZE}

# 複数のグループを使っているので、環境変数で管理する。
export GROUP="`id -gn`"

# グループに応じて umask 値を変更する。
case "${GROUP}" in
	"hoge" | "piyo" | "fuga" )
		umask 027
		;;
	"foo" | "bar" )
		umask 002
		;;
	* )
		umask 022
		;;
esac

# ターミナルの上の所に表示される文字列の設定。
# 普段は「グループ ユーザ名@ホスト名:カレントディレクトリ」
# tmux や screen を使っているときは「ユーザ名@ホスト名」
case "${TERM}" in
	xterm* | kterm* )
		precmd() {
			echo -ne "\033]0;[${GROUP}] ${USER}@${HOST}:${PWD}\007"
		}
		;;
	screen* )
		precmd() {
			echo -ne "\033]0;${USER}@${HOST}\007"
		}
		;;
esac

# 単語の区切りに / を追加する（デフォルトの WORDCHARS から / を取り除く）。
# C-w（単語削除）で便利。
export WORDCHARS="*?_-.[]~=&;!#$%^(){}<>"

# write すんな。
mesg n
```

# .zsh_option
```.zsh_option
# zsh の補完候補が画面から溢れ出るとき、それでも表示するかどうか確認する。
export LISTMAX=0

# ls の色付け
# アーカイブファイルは赤
# 画像・動画・音声ファイルは紫
# pdf/ps/dvi は思案
# オフィス系は緑
# README/TODO/MEMO 系はオレンジ
export LS_COLORS="\
no=00:\
fi=00:\
di=01;34:\
ln=01;36:\
pi=40;33:\
so=01;35:\
do=01;35:\
bd=40;33;01:\
cd=40;33;01:\
or=40;31;01:\
su=37;41:\
sg=30;43:\
tw=30;42:\
ow=34;42:\
st=37;44:\
ex=01;32:\
*.tar=00;31:\
*.tgz=00;31:\
*.arj=00;31:\
*.taz=00;31:\
*.lzh=00;31:\
*.zip=00;31:\
*.z=00;31:\
*.Z=00;31:\
*.gz=00;31:\
*.bz2=00;31:\
*.bz=00;31:\
*.tbz2=00;31:\
*.tz=00;31:\
*.xz=00;31:\
*.deb=00;31:\
*.rpm=00;31:\
*.jar=00;31:\
*.rar=00;31:\
*.ace=00;31:\
*.zoo=00;31:\
*.cpio=00;31:\
*.7z=00;31:\
*.rz=00;31:\
*.eps=00;35:\
*.jpg=00;35:\
*.JPG=00;35:\
*.jpeg=00;35:\
*.JPEG=00;35:\
*.gif=00;35:\
*.GIF=00;35:\
*.bmp=00;35:\
*.BMP=00;35:\
*.pbm=00;35:\
*.pgm=00;35:\
*.ppm=00;35:\
*.tga=00;35:\
*.xbm=00;35:\
*.xpm=00;35:\
*.tif=00;35:\
*.tiff=00;35:\
*.png=00;35:\
*.PNG=00;35:\
*.mng=00;35:\
*.pcx=00;35:\
*.mov=00;35:\
*.mpg=00;35:\
*.mpeg=00;35:\
*.m2v=00;35:\
*.mkv=00;35:\
*.ogm=00;35:\
*.mp4=00;35:\
*.m4v=00;35:\
*.mp4v=00;35:\
*.vob=00;35:\
*.qt=00;35:\
*.nuv=00;35:\
*.wmv=00;35:\
*.asf=00;35:\
*.rm=00;35:\
*.rmvb=00;35:\
*.flc=00;35:\
*.avi=00;35:\
*.fli=00;35:\
*.gl=00;35:\
*.dl=00;35:\
*.xcf=00;35:\
*.xwd=00;35:\
*.yuv=00;35:\
*.aac=00;35:\
*.au=00;35:\
*.flac=00;35:\
*.mid=00;35:\
*.midi=00;35:\
*.mka=00;35:\
*.mp3=00;35:\
*.mpc=00;35:\
*.ogg=00;35:\
*.ra=00;35:\
*.wav=00;35:\
*.pdf=00;36:\
*.ps=00;36:\
*.dvi=00;36:\
*.doc=00;32:\
*.docx=00;32:\
*.xls=00;32:\
*.xlsx=00;32:\
*.ppt=00;32:\
*.pptx=00;32:\
*.potx=00;32:\
*.pot=00;32:\
*.odt=00;32:\
*.ods=00;32:\
*.odp=00;32:\
*.cvx=00;32:\
*README=00;33:\
*README.txt=00;33:\
*readme=00;33:\
*readme.txt=00;33:\
*TODO=00;33:\
*TODO.txt=00;33:\
*MEMO=00;33:\
*MEMO.txt=00;33:\
*memo=00;33:\
*memo.txt=00;33:\
"
export ZLS_COLORS="${LS_COLORS}"
export CLICOLOR="true"

# zsh の補完機能を強化する。必須。
autoload -Uz compinit
compinit

# プロンプト
# 色付きにする。
autoload -Uz colors
colors

# 上から順に、ユーザ名、ホスト名、カレントディレクトリ、グループ名、プロンプト
# プロンプトは、スーパーユーザ時に #
# スーパーユーザ以外かつ直前のコマンドの終了コードが 0 であるなら !, 0 でないなら $
p_usr="%{${fg[green]}%}%n%{${reset_color}%}"
p_hst="%{${fg[magenta]}%}@%m%{${reset_color}%}"
p_dir="%{${fg[cyan]}%}:%/%{${reset_color}%}"
p_grp="[${GROUP}]"
p_prt="%(?!%(!.#.$) !? )"
PROMPT="${p_usr}${p_hst}${p_dir}"$'\n'"${p_grp}${p_prt}"

# if ... fi とか "..." など、複数行にわたる場合
PROMPT2="%{${fg[yellow]}%}%_> %{${reset_color}%}"

# コマンド訂正時
SPROMPT="%{${fg[yellow]}%}correct%{${reset_color}%}: %{${fg[red]}%}%R%{${reset_color}%} => %{${fg[cyan]}%}%r%{${reset_color}%} (y|n|a|e)? "

# 右に出るプロンプト。日時を表示する。
RPROMPT="[%D{%m/%d %H:%M}]"

# Git を使っているときにリポジトリの状態を表示する。
# 非力なマシンだと表示に時間がかかるので、現状コメントアウト。
#autoload -Uz is-at-least
#if is-at-least 4.3.10; then
#	autoload -Uz vcs_info
#	zstyle ':vcs_info:git:*' check-for-changes true
#	zstyle ':vcs_info:git:*' stagedstr "%F{yellow}!"
#	zstyle ':vcs_info:git:*' unstagedstr "%F{red}+"
#	zstyle ':vcs_info:*' formats "%F{green}%c%u[%b]%f"
#	zstyle ':vcs_info:*' actionformats '[%b|%a]'
#	precmd () { vcs_info }
#	RPROMPT=$RPROMPT'${vcs_info_msg_0_}'
#fi

# ヒストリ探索
autoload -Uz history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end
bindkey "^R" history-incremental-search-backward
bindkey "^S" history-incremental-search-forward
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end

# キーバインドを emacs ライクに。vi ライクは -v
bindkey -e

# オプションシリーズ。ググったり、man を読んだりする。
setopt auto_list
setopt auto_menu
setopt auto_param_slash
setopt auto_pushd
setopt auto_remove_slash
setopt auto_resume
setopt brace_ccl
setopt complete_aliases
setopt correct
#setopt extended_glob
setopt extended_history
setopt hist_ignore_dups
setopt hist_ignore_all_dups
setopt hist_ignore_space
setopt hist_reduce_blanks
setopt hist_verify
setopt ignore_eof
setopt interactive_comments
setopt list_packed
setopt list_types
setopt magic_equal_subst
setopt mark_dirs
#setopt no_flow_control
setopt nobeep
setopt nolistbeep
setopt notify
setopt numeric_glob_sort
setopt print_eight_bit
setopt prompt_subst
setopt pushd_ignore_dups
setopt share_history
setopt zle
unsetopt glob_dots
unsetopt promptcr

# 補完候補の色付け、メッセージの設定
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' verbose yes
zstyle ':completion:*' completer _expand _complete _match _prefix _approximate _list _history
zstyle ':completion:*:messages' format "%{${fg[cyan]}%}%d%{${reset_color}%}"
zstyle ':completion:*:warnings' format "%{${fg[red]}%}no matches for: %{${fg[yellow]}%}%d%{${reset_color}%}"
zstyle ':completion:*:descriptions' format "%{${fg[yellow]}%}completing %d%{${reset_color}%}"
zstyle ':completion:*:corrections' format "%{${fg[yellow]}%}%d %{${fg[red]}%}(errors: %e){${reset_color}%}"
zstyle ':completion:*:options' description 'yes'
zstyle ':completion:*' group-name ''

# これらのファイルは補完候補にしない。でも rm では候補にする。
zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.o|*?.d|*?.aux|*?~|*\#'

# 補完で大文字小文字を区別しない。
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# 補完候補をカーソルで選ぶ。
zstyle ':completion:*:default' menu select=1

# cd 時にカレントディレクトリに候補がなかったら cdpath から選ぶ。
zstyle ':completion:*:cd:*' tag-order local-directories path-directories

# 補完時にこれらのディレクトリは除外する。
zstyle ':completion:*:cd:*' ignored-patterns '*CVS|*.svn|*.git|*lost+found'

# cd 時にカレントディレクトリを候補にしない。例えば、cd ../<TAB> とすれば分かる。
zstyle ':completion:*:cd:*' ignore-parents parent pwd

# kill 候補を色付け
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([%0-9]#)*=0=01;31'

# math function を有効化する。zsh は浮動小数点を使えるのがいい。
zmodload -i zsh/mathfunc
```

# .zsh_alias
```.zsh_alias
# まずはデフォルトのエイリアスを全消し
unalias -m \*

# 基本的なエイリアス
alias c="clear" # C-l でも画面クリア可能
alias cdd="cd ../"
alias cddd="cd ../../"
alias cdddd="cd ../../../"
alias cp="cp -apir"
alias j="jobs -l"
alias less="less -IMx4 -X"
alias ls="ls -hF"
alias l="ls"
alias ll="ls -l"
alias lll="ls -l"
alias la="ls -a"
alias lal="ls -al"
alias lt="ls -lt"
alias ltr="ls -ltr"
alias mv="mv -i"
alias rm="rm -i"
alias rsync="rsync -a"
alias scp="scp -pr"
alias ssh="ssh -X"
alias src="source ${ZDOTDIR}/.zshrc"

# やっつけ…
grep -E --color=auto ZDOTDIR ${ZDOTDIR}/.zshenv > /dev/null 2>&1
if [ $? -eq 0 ]; then
	alias grep="grep -E --color=auto"
fi

ls -hF --show-control-chars --color=auto > /dev/null 2>&1
if [ $? -eq 0 ]; then
	alias ls="ls -hF --show-control-chars --color=auto"
fi

if type vim > /dev/null 2>&1; then
	alias vi="vim"
	alias vwo="vim -u NONE --noplugin" # まっさらな vim
	alias vl="vim -u ${HOME}/.vimrc.latex" # LaTeX 用
fi

if type lv > /dev/null 2>&1; then
	alias lv="lv -c"
	export PAGER="lv -c"
fi

if type nkf > /dev/null 2>&1; then
	alias nkfe="nkf -e --overwrite"
	alias nkfs="nkf -s --overwrite"
	alias nkfw="nkf -w --overwrite"
	alias nkfj="nkf -j --overwrite"
	alias nkfg="nkf -g"
fi

# これらはサフィックスエイリアス（後述）用のエイリアス
if type eog > /dev/null 2>&1; then
	alias imgv="eog"
else
	alias imgv="display"
fi

if type evince > /dev/null 2>&1; then
	alias pdfv="evince"
else
	alias pdfv="gv"
fi

if type soffice > /dev/null 2>&1; then
	alias officev="soffice"
else
	alias officev="ooffice"
fi

if type google-chrome > /dev/null 2>&1; then
	alias browser="google-chrome"
elif type firefox > /dev/null 2>&1; then
	alias browser="firefox"
else
	alias browser="w3m"
fi

# tmux の自動アタッチ設定は他の方のものを色々いじった。
if type tmux > /dev/null 2>&1; then
	alias tmux="tmux -2"
	# auto-attach if there are any tmux sessions 
	if ( ! test ${TMUX} ) \
	&& ( ! expr ${TERM} : "^screen" > /dev/null 2>&1 ) \
	&& ( test tmux > /dev/null 2>&1 ); then
		if tmux has-session > /dev/null 2>&1 ; then
			local session=`tmux list-sessions \
						  | grep -e "^[0-9].*]$" \
						  | head -n 1 \
						  | sed -e "s/^\([0-9]\+\).*$/\1/"`
			if [ -n "${session}" ]; then
				echo "Attach tmux session ${session}."
				tmux attach-session -t ${session}
			else
				echo "Session has been already attached."
				tmux list-sessions
			fi
		else
		# do nothing if there are no tmux sessions
		fi
	fi
elif type screen > /dev/null 2>&1; then
	# use 'screen' command as a substitute for 'tmux' command
	alias tmux="screen -xR"
fi

# ある文字列を含むファイルを再帰的に検索する。
# zsh なら grep **/* があるが、何故下記のようにしたか記憶に無い。
function fr() {
	# examples:
	# $ fr volatile				-> all files including "volatile"
	# $ fr "int main\(\)"		-> all files including "int main()"
	# $ fr volatile .c			-> *.c including "volatile"
	# $ fr "int main\(\)" .c	-> *.c including "int main()"
	find ./ -name "*$2" -type f | xargs grep -n "$1"
}

# 自動伸長。サフィックスエイリアスでも使う。
function myextract() {
	case "${KERNEL_NAME}" in
		"SunOS" )
			TAR="gtar"
			;;
		"Linux" )
			TAR="tar"
			;;
	esac

	for arg in $@
	do
		case ${arg} in
			*.tgz | *.tar.gz | *.tar.Z | *.tbz ) ${TAR} xzvf ${arg} ;;
			*.tbz2 | *.tar.bz2 ) ${TAR} xjvf ${arg} ;;
			*.tar.xz ) ${TAR} xJvf ${arg} ;;
			*.tar ) ${TAR} xvf ${arg} ;;
			*.zip ) unzip ${arg} ;;
			*.arj ) unarj ${arg} ;;
			*.lzh ) lha e ${arg} ;;
			*.gz ) gunzip ${arg} ;;
			*.bz2 ) bunzip2 ${arg} ;;
			*.xz ) xz -d ${arg} ;;
			*.Z ) uncompress ${arg} ;;
			* ) echo "Not Supported: ${arg}" ;;
		esac
	done
}
alias kaito="myextract"

# 自動圧縮。デフォルトは .tar.bz2
function mycompress() {
	case "${KERNEL_NAME}" in
		"SunOS" )
			TAR="gtar"
			;;
		"Linux" )
			TAR="tar"
			;;
	esac

	if [ $# -eq 2 ]; then
		case $1 in
			*.tgz | *.tar.gz ) ${TAR} czvf $1 $2 ;;
			*.tbz2 | *.tar.bz2 ) ${TAR} cjvf $1 $2 ;;
			*.tar.xz ) ${TAR} cJvf $1 $2 ;;
			*.tar ) ${TAR} cvf $1 $2 ;;
			*.zip ) zip -r $1 $2 ;;
			*.lzh ) lha a $1 $2 ;;
			* ) echo "Not Supported: $1" ;;
		esac
	elif [ $# -eq 1 ]; then
		echo "Create $1.tar.bz2 ... "
		${TAR} cjvf $1.tar.bz2 $1 > /dev/null 2>&1
		echo "Done"
	fi
}
alias asshuku="mycompress"

# 画像を eps に変換する。
function img2eps() {
	for arg in $@
	do
		local filename=${arg}
		local filename_without_extension=${filename%.*}
		local pathname=${arg%/*}
		local extension=${arg##*.}
		if [ "${extension}" != "eps" ]; then
			echo -n "Convert ${filename} into eps file ... "
			convert ${filename} eps2:${filename_without_extension}.eps
			echo "Done"
		else
			echo "${filename}: eps file"
		fi
	done
}

# cd 後に ls する（zsh 特有）。
function chpwd() {
	ls
}

# まっさらな zsh を起動する。
alias zwo="env -i zsh -f"

# サフィックスエイリアス
# ファイルの拡張子によって実行するコマンドを自動判別する。
# 例：$ ./hoge.tar.gz -> $ myextract hoge.tar.gz -> $ tar xzvf hoge.tar.gz
alias -s dvi="xdvi"
alias -s pdf="pdfv"
alias -s {jpg,png,gif,bmp}="imgv"
alias -s {doc,docx,xls,xlsx,ppt,pptx,odt,ods,odp}="officev"
alias -s {htm,html}="browser"
alias -s {Z,gz,bz2,xz,tar,tgz,tbz,tbz2,zip,arj,lzh}="myextract"

# グローバルエイリアス
alias -g Y="yes |"
alias -g G="| grep"
alias -g V="| grep -v"
alias -g L="| less"
alias -g H="| head"
alias -g T="| tail"
alias -g S="| sort"
alias -g U="| uniq"
alias -g W="| wc"
alias -g X="| xargs"
alias -g LOG="2>&1 | tee"
alias -g WOA="> /dev/null 2>&1" # WithOut All
alias -g WOE="2> /dev/null" # WithOut stdErr
alias -g WOO="> /dev/null" # WithOut stdOut

# ディレクトリのエイリアス
# cd ~hoge のように使える。cd ~hoge の後に TAB を打てば補完も効く。
hash -d log="/var/log"
```