yuyunko's blog

ぼうびろく

zshの設定,zshrc

zshは最強のシェル!!

・・・ということらしいので,zshいれてみた.
だけど最強にするためにはそれなりに設定が大変で.

いろんなサイトを見まくって自分なりに使いやすいようなzshrcにしてみたつもり.

以下自分用メモ

#######################################################################################################
#{{{ 環境設定
# PAGER
export PAGER=lv

#}}}
#######################################################################################################
#{{{ LANG 設定
export LANG=ja_JP.UTF-8
case ${UID} in
	0)
		LANG=C
		;;
esac
# }}}
#######################################################################################################
#{{{ PATH設定
if [ -d "$HOME/bin" ] ; then
	PATH="$HOME/bin:$PATH"
fi

if [ -d "$HOME/bin/scripts" ] ; then
	PATH="$HOME/bin/scripts:$PATH"
fi
# }}}
#######################################################################################################
###{{{ 外観に関する設定
# 色の読み込み
autoload -Uz colors
colors

# 色の定義
local DEFAULT=$'%{e[m%}'$
local RED=$'%{e[1;31m%}'$
local GREEN=$'%{e[1;32m%}'$
local YELLOW=$'%{e[1;33m%}'$
local BLUE=$'%{e[1;34m%}'$
local PURPLE=$'%{e[1;35m%}'$
local LIGHT_BLUE=$'%{e[1;36m%}'$
local WHITE=$'%{e[1;37m%}'$

# ビープ音を鳴らさないようにする
setopt NO_beep

# エスケープシーケンスを通すオプション
setopt prompt_subst
# プロンプトの設定 1 ランダムに色が変わる
# PROMPT=$'%{\e[$[32+$RANDOM % 5]m%}%U%B$HOST'"{%n}%b%%%{\e[m%}%u "
# RPROMPT=$'%{\e[33m%}[%~]%{\e[m%}'

# プロンプ卜の設定 2 rootとその他で色を変えている
case ${UID} in
	0)
		PROMPT="%{$fg_bold[green]%}%m%{$fg_bold[red]%}#%{$reset_color%} "
		PROMPT2="%{$fg[magenta]%}%_%{$reset_color%}%{$fg_bold[white]%}>>%{$reset_color%} "
		;;
	*)
		PROMPT="%{$fg_bold[cyan]%}%m%{$fg_bold[white]%}%%%{$reset_color%} "
		PROMPT2="%{$fg[magenta]%}%_%{$reset_color%}%{$fg_bold[white]%}>>%{$reset_color%} "
		;;
esac
# 右プロンプトに現在地を表示。これのおかげで入力位置がウロウロしない。
RPROMPT="%{$fg_bold[white]%}[%{$reset_color%}%{$fg[cyan]%}%~%{$reset_color%}%{$fg_bold[white]%}]%{$reset_color%}"

# setopt correctしてるときに使われるプロンプト。
SPROMPT="%{$fg_bold[red]%}correct%{$reset_color%}: %R -> %r ? "

# 'dircolors -p'で出力されるものに手を加えて保存したものを読み込んでる。
if [ -f ~/.dir_colors ]; then
	eval `dircolors -b ~/.dir_colors`
fi

# コマンドを実行するときに右プロンプトを消す。他の端末等にコピペするときに便利。
setopt transient_rprompt

# コマンドラインでも # 以降をコメントと見なす
setopt interactive_comments

# 補完候補もLS_COLORSに合わせて色づけ。
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

# }}}
#######################################################################################################
###{{{ 補完に関する設定
# 補完を有効にするために自分をsource
# source ~/.zshrc

# 自動補完
autoload -Uz compinit
compinit

# 補完のときプロンプトの位置を変えない
setopt always_last_prompt

# ディレクトリ名を入力するとそこに移動出来る。 'cd'を省略出来るわけだが、癖で打ってしまうので正直あまり恩恵は受けていない。
setopt auto_cd

# 移動した場所を記録し、cd -[TAB] で以前移動したディレクトリの候補を提示してくれて、その番号を入力することで移動出来るようになる。
setopt auto_pushd

# auto_pushdで重複するディレクトリは記録しないようにする。
setopt pushd_ignore_dups

# コマンドのスペルミスを指摘して予想される正しいコマンドを提示してくれる。このときのプロンプトがSPROMPT。
setopt correct

# 補完候補を表示するときに出来るだけ詰めて表示。
setopt list_packed

#ドットファイルにマッチさせるために先頭に'.'を付ける必要がなくなる。
# setopt glog_dots

# aliasを展開して補完。
# setopt complete_aliases

# 補完候補が複数ある時に、一覧表示する
setopt auto_list

#  auto_list の補完候補一覧で、ls -F のようにファイルの種別をマーク表示
setopt list_types

# 補完キー(Tab, Ctrl+I) を連打するだけで順に補完候補を自動で補完する
setopt auto_menu

# コマンドラインの引数で --prefix=/usr などの = 以降でも補完できる
setopt magic_equal_subst

#  複数のリダイレクトやパイプなど、必要に応じて tee や cat の機能が使われる
setopt multios

# {a-c} を a b c に展開する機能を使えるようにする
setopt brace_ccl

# カッコの対応などを自動的に補完する
setopt auto_param_keys

# ファイル名で , ~, ^ の 3 文字を正規表現として扱う
setopt extended_glob

# サスペンド中のプロセスと同じコマンド名を実行した場合はリジュームする
setopt auto_resume

#  rm * などの際、本当に全てのファイルを消して良いかの確認しないようになる
setopt rm_star_silent

#  for, repeat, select, if, function などで簡略文法が使えるようになる
setopt short_loops

#  コマンドラインがどのように展開され実行されたかを表示するようになる
# setopt xtrace

# ディレクトリの最後のスラッシュを自動で削除する
setopt autoremoveslash

# シンボリックリンクは実体を追うようになる
# setopt chase_links

# コマンドにsudoを付けてもきちんと補完出来るようにする。Ubuntuだと/etc/zsh/zshrcで設定されている。
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin

# 大文字・小文字を区別しないで補完出来るようにするが、大文字を入力した場合は区別する。
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# 補完候補を矢印キーなどで選択出来るようにする。'select=3'のように指定した場合は、補完候補が3個以上ある時に選択出来るようになる。
zstyle ':completion:*:default' menu select

# zstyleによる補完設定
zstyle ':completion:*' verbose yes
zstyle ':completion:*' completer _expand _complete _match _prefix _approximate _list _history
zstyle ':completion:*:messages' format $YELLOW'%d'$DEFAULT
zstyle ':completion:*:warnings' format $RED'No matches for:'$YELLOW' %d'$DEFAULT
zstyle ':completion:*:descriptions' format $YELLOW'completing %B%d%b'$DEFAULT
zstyle ':completion:*:corrections' format $YELLOW'%B%d '$RED'(errors: %e)%b'$DEFAULT
zstyle ':completion:*:options' description 'yes'
# グループ名に空文字列を指定すると,マッチ対象のタグ名がグループ名に使われる。
# したがって,すべての マッチ種別を別々に表示させたいなら以下のようにする
zstyle ':completion:*' group-name ''

# 予測変換を行うかどうか
# autoload -U predict-on
# predict-on
# }}}
#######################################################################################################
###{{{ 履歴(history)に関する設定
# コマンド履歴を保存するファイル名。
HISTFILE=~/.zsh/.zsh_histfile

# 記憶される履歴の数。
HISTSIZE=10000

# 保存される履歴の数。設定によってはHISTSIZEより大きくないとまずいらしい。彷徨うと桁が二つぐらい大きい値を設定している人もいるが、とりあえずHISTSIZEと同じにしておく。
SAVEHIST=100000

# rootは履歴を保存しない。
if [ $UID = 0 ]; then
	unset HISTFILE
	SAVEHIST=0
fi

# 履歴を複数端末間で共有する。
setopt share_history

# 複数の zsh を同時に使う時など history ファイルに上書きせず追加する
setopt append_history

# 重複するコマンドが記憶されるとき、古い方を削除する。
setopt hist_ignore_all_dups

# 直前のコマンドと同じ場合履歴に追加しない。
setopt hist_ignore_dups

# 重複するコマンドが保存されるとき、古い方を削除する。
setopt hist_save_no_dups

#  zsh の開始・終了時刻をヒストリファイルに書き込む
setopt extended_history

#  コマンドラインの先頭がスペースで始まる場合ヒストリに追加しない
setopt hist_ignore_space

#  ヒストリを呼び出してから実行する間に一旦編集できる状態になる
setopt hist_verify

# apt-getやdpkgなどのキャッシュ
if [ -d ~/.zsh/cache ]; then
    zstyle ':completion:*' use-cache yes
    zstyle ':completion:*' cache-path ~/.zsh/cache
fi


# }}}
#######################################################################################################
###{{{ キーバインド
# Vimを使っているので頑張ってVi風のキーバインドに。
bindkey -v

# bindkey -v でもコマンドラインスタック使う
bindkey 'eq' push-line

# 補完候補のメニュー選択で、矢印キーの代わりにhjklで移動出来るようにする。
zmodload zsh/complist
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'j' vi-down-line-or-history
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char


# 途中までコマンドを打っていて、これ前も入力したと思ったときに、Ctrl-Pで補完してくれる。さらに押せばより古いコマンドで補完。やっぱりさっきの、というときはCtrl-nで戻る。
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 "" history-beginning-search-backward-end
bindkey "" history-beginning-search-forward-end

# }}}
#######################################################################################################
###{{{ alias
# それぞれの環境に合わせてaliasを設定
case "${OSTYPE}" in
	freebsd*|darwin*)
		alias ls='ls -G'
		;;
	linux*)
		alias ls='ls --color=auto'
		alias grep='grep --color=auto'
		;;
esac
# case `uname` in
#     Linux)
#         alias ls='ls --color=auto'
#         ;;
#     Darwin|FreeBSD)
#         alias ls='ls -GvF'
#         ;;
# esac
alias -g L='| $PAGER'
alias -g G='| grep'
alias -g V='| vim -R -'

alias ll='ls -l'
alias la='ls -a'
alias lla='ls -al'
# alias lla='ls -a -l | lv'

# }}}
#######################################################################################################
###{{{ function
# cdしたらlsするのが癖だから。
# function cd() {builtin cd $@ && ls -v -F --color=auto}
# function cd() {builtin cd $@ && ls -v -F }
# これも、cdしたらlsしてくれるが、こっちのほうがauto_cdの場合でもlsしてくれるのでこっちで。
# function chpwd() { ls -v -F --color=auto }
function chpwd() { ls -F }

# 'google ほげほげ'ですぐに検索。
function google() {
local str opt
if [ $ != 0 ]; then
	for i in $*; do
		str="$str+$i"
	done
	str=`echo $str | sed 's/^\+//'`
	opt='search?num=50&hl=ja&lr=lang_ja'
	opt="${opt}&q=${str}"
fi
w3m http://www.google.co.jp/$opt
}

# w3mでALC検索
function alc() {
if [ $ != 0 ]; then
	w3m "http://eow.alc.co.jp/$*/UTF-8/?ref=sa"
else
	w3m "http://www.alc.co.jp/"
fi
}

# ゴミ箱の実装 ~/.trashがゴミ箱の場所
# function rm() {
# if [ -d ~/.trash ]; then
#     local DATE=`date "+%y%m%d-%H%M%S"`
#     mkdir ~/.trash/$DATE
#     for i in $@; do
#         if [ -e $i ]; then
#             mv $i ~/.trash/$DATE/
#         else 
#             echo "$i : not found"
#         fi
#     done
# else
#     /bin/rm $@
# fi
# }

# C-^ で一つ上のディレクトリへ
function cdup() {
echo
cd ..
zle reset-prompt
}
zle -N cdup
bindkey '' cdup

# キーバインドがviの時に,ノーマルモードとインサートモードの状態を状況に応じて表示
readuntil () {
	typeset a
	while [ "$a" != "$1" ]
	do
		read -E -k 1 a
	done
}

#
# If the $SHOWMODE variable is set, displays the vi mode, specified by
# the $VIMODE variable, under the current command line.
# 
# Arguments:
#
#   1 (optional): Beyond normal calculations, the number of additional
#   lines to move down before printing the mode.  Defaults to zero.
#
showmode() {
	typeset movedown
	typeset row

	# Get number of lines down to print mode
	movedown=$(($(echo "$RBUFFER" | wc -l) + ${1:-0}))

	# Get current row position
	echo -n "\e[6n"
	row="${${$(readuntil R)#*\[}%;*}"

	# Are we at the bottom of the terminal?
	if [ $((row+movedown)) -gt "$LINES" ]
	then
		# Scroll terminal up one line
		echo -n "\e[1S"

		# Move cursor up one line
		echo -n "\e[1A"
	fi

	# Save cursor position
	echo -n "\e[s"

	# Move cursor to start of line $movedown lines down
	echo -n "\e[$movedown;E"

	# Change font attributes
	echo -n "\e[1m"

	# Has a mode been set?
	if [ -n "$VIMODE" ]
	then
		# Print mode line
		echo -n "-- $VIMODE -- "
	else
		# Clear mode line
		echo -n "\e[0K"
	fi

	# Restore font
	echo -n "\e[0m"

	# Restore cursor position
	echo -n "\e[u"
}

clearmode() {
	VIMODE= showmode
}

#
# Temporary function to extend built-in widgets to display mode.
#
#   1: The name of the widget.
#
#   2: The mode string.
#
#   3 (optional): Beyond normal calculations, the number of additional
#   lines to move down before printing the mode.  Defaults to zero.
#
makemodal () {
	# Create new function
	eval "$1() { zle .'$1'; ${2:+VIMODE='$2'}; showmode $3 }"

	# Create new widget
	zle -N "$1"
}

# Extend widgets
makemodal vi-add-eol           INSERT
makemodal vi-add-next          INSERT
makemodal vi-change            INSERT
makemodal vi-change-eol        INSERT
makemodal vi-change-whole-line INSERT
makemodal vi-insert            INSERT
makemodal vi-insert-bol        INSERT
makemodal vi-open-line-above   INSERT
makemodal vi-substitute        INSERT
makemodal vi-open-line-below   INSERT 1
makemodal vi-replace           REPLACE
makemodal vi-cmd-mode          NORMAL

unfunction makemodal

# どの環境でもクリップボードにコピー(macではpbcopy linuxではxselが必要)
# 使い方
# % vim mail.txt    # vim でメールを書く
# % cat mail.txt C  # メールの内容をクリップボードにコピーする
# INPUT.txt のうち 10から15行目をクリップボードにコピーする
# % sed -n '10,15p' INPUT.txt C
if which pbcopy >/dev/null 2>&1 ; then 
	# Mac  
	alias -g C='| pbcopy'
elif which xsel >/dev/null 2>&1 ; then 
	# Linux
	alias -g C='| xsel --input --clipboard'
elif which putclip >/dev/null 2>&1 ; then 
	# Cygwin 
	alias -g C='| putclip'
fi


# auto-fu.zsh の設定
# source ~/.zsh/auto-fu.zsh
# zle-line-init () {auto-fu-init;}; zle -N zle-line-init
# zstyle ':completion:*' completer _oldlist _complete _match _ignored _approximate
# auto-fu.zsh での動作をちょっと変えるパッチ
# delete unambiguous prefix when accepting line
# function afu+delete-unambiguous-prefix () {
#     afu-clearing-maybe
#     local buf; buf="$BUFFER"
#     local bufc; bufc="$buffer_cur"
#     [[ -z "$cursor_new" ]] && cursor_new=-1
#     [[ "$buf[$cursor_new]" == ' ' ]] && return
#     [[ "$buf[$cursor_new]" == '/' ]] && return
#     ((afu_in_p == 1)) && [[ "$buf" != "$bufc" ]] && {
#         there are more than one completion candidates
#         zle afu+complete-word
#         [[ "$buf" == "$BUFFER" ]] && {
#             the completion suffix was an unambiguous prefix
#             afu_in_p=0; buf="$bufc"
#         }
#         BUFFER="$buf"
#         buffer_cur="$bufc"
#     }
# }
# zle -N afu+delete-unambiguous-prefix
# function afu-ad-delete-unambiguous-prefix () {
#     local afufun="$1"
#     local code; code=$functions[$afufun]
#     eval "function $afufun () { zle afu+delete-unambiguous-prefix; $code }"
# }
# afu-ad-delete-unambiguous-prefix afu+accept-line
# afu-ad-delete-unambiguous-prefix afu+accept-line-and-down-history
# afu-ad-delete-unambiguous-prefix afu+accept-and-hold




# 起動時にscreen起動
# ubuntuの場合 $TERM = screen-bce
case "${OSTYPE}" in
	freebsd*|darwin*)
		if [ $TERM != "screen" ]; then
			exec screen -S main -xRR
		fi
			;;
	linux*)
		if [ $TERM != "screen-bce" ]; then
			exec byobu -S main -xRR
		fi
			;;
esac
# case "${OSTYPE}" in
#     freebsd*|darwin*)
#         if [ $TERM != "screen" ]; then
#             exec screen -U -D -RR
#         fi
#             ;;
#     linux*)
#         if [ $TERM != "screen-bce" ]; then
#             exec byobu -U -D -RR
#         fi
#             ;;
# esac
# }}}
#######################################################################################################
#{{{ 個人用設定ファイルがあればそれを読み込む
if [ -e ~/.zshrc_private ]; then
	source ~/.zshrc_private
fi

# }}}