zsh

Brogramming with Tom
zshの日本語まとめページです。おすすめの設定やプラグインがありましたら、コメントいただけると嬉しいです。

photo credit: ryanoshea via photopin cc


目次



zshの基本



# タイトル内容
01 インストールzshのインストール方法の紹介
02 操作方法 zshのショートカットキーなどを紹介
03 設定方法zshのカスタマイズ方法、その他



zshの設定



# 内容
01 必須の基本設定
02 Vi風のキーバインドを使う
03 cdした時には、同時にlsする
04 mkdirとcdを同時に行う
05 一時的にコマンドを保存する
06 コマンドをコピーする
07 Google検索を行う
08 ALC検索を行う
09 プロンプト(見た目)をカスタマイズする
10 補完を強化する
11 カラーを強化する
12 キーで上の階層へ移動できるようにする
13 既定のブラウザを変更する
14 tmuxの自動起動
15 undo,redoをキーで行う
16 bashにも対応したpowerline-bash
17 クリップボード履歴から検索をかける


zshの便利ツール



# タイトル 内容
01 z ディレクトリ移動を簡単にするツール
02 autojump ディレクトリ移動を簡単にするツール(python)
03 zaw 直感的なインターフェイスを提供するツール
04 auto-fu.zsh 自動補完を強化するツール
05 zmv ファイル名一括置換
06 oh-my-zsh zshの一括カスタマイズを補助
07 antigen oh-my-zshのプラグインなどを個別に利用する


zshの補完強化



# タイトル 内容
01 zsh-completions基本コマンドなどの補完強化
02 git-flow-completiongit-flowのオプション補完
03 cache-policy補完関数で キャッシュ機能(cache-policy) を使う


zsh関連のリンク



# タイトル 内容
01 Z shell 公式サイト
02 ZSH Documentation 上記サイトのドキュメント
03 zsh Advent Calendar 2012 zsh関連の連続記事
04 Qiita Zsh 記事投稿サイト



インストール


zshというのは、デフォルトでもある程度の補完が便利なシェルのことです。ちなみに、シェル(Shell)とは、カーネル(Kernel)に要求を伝える道具のことです。パソコンを使う上では、基本的なツールです。パソコンを初めて触るという人は、zshを通して、いろいろなことをやってみるといいかもしれません。


Mac



sudo port install zsh

または、

brew install zsh



which zsh

sudo sh -c "echo '/opt/local/bin/zsh' >> /etc/shells"

chsh -s /opt/local/bin/zsh



Linux



sudo apt-get -y install


which zsh

chsh -s /usr/zsh



Windows



Windowsの場合は、 Cygwinというツールを使います。色々と面倒ですが、以下の手順を踏めば、分かりやすく導入できると思います。


まずは、Windows PowerShellを起動します。Windows+ Rを押して、「powershell」と入力すると起動します。




一応、シェルスクリプトを実行できるように権限を変更しておきます。

Set-ExecutionPolicy RemoteSigned



そこで、以下を貼り付けてください。 Enterを押せば、確定します。


function Install-Cygwin {
param ( $TempCygDir="$env:temp\cygInstall" )
if(!(Test-Path -Path $TempCygDir -PathType Container))
{
$null = New-Item -Type Directory -Path $TempCygDir -Force
}
$client = new-object System.Net.WebClient
$client.DownloadFile("http://cygwin.com/setup.exe", "$TempCygDir\setup.exe" )
Start-Process -wait -FilePath "$TempCygDir\setup.exe" -ArgumentList "-q -n -l $TempCygDir -s http://mirror.nyi.net/cygwin/ -R c:\Cygwin"
Start-Process -wait -FilePath "$TempCygDir\setup.exe" -ArgumentList "-q -n -l $TempCygDir -s http://mirror.nyi.net/cygwin/ -R c:\Cygwin -P openssh"
Start-Process -wait -FilePath "$TempCygDir\setup.exe" -ArgumentList "-q -n -l $TempCygDir -s http://mirror.nyi.net/cygwin/ -R c:\Cygwin -P wget"
}






これで、コマンドが作成されました。以下のコマンドを実行してください。


Install-Cygwin



Cygwinがインストールされたら、 Windows + Rを押して、「c:cygwin/cygwin.bat」を入力し、 Enterを押します。




しかし、Terminalがあまりに使いにくいので、 minttyを使うことにします。





次に、パッケージ管理マネージャーをインストールしましょう。まず、Cygwinを起動します。




そして、以下のコマンドを実行すると、 apt-cyg installなどが使えるようになります。


wget http://apt-cyg.googlecode.com/svn/trunk/apt-cyg

mv apt-cyg  /usr/bin

chmod +x /usr/bin/apt-cyg



最後に、パッケージマネージャを使って、 zshをインストールします。


apt-cyg install zsh vim

vim /etc/passwd

vim /Cygwin.bat



最後の行あたりにある bashzshに変更します。 こちらの記事などが参考になります。


操作方法



ここでは、 zshのデフォルトのショートカットキーなどを紹介します。多分、 Emacsのキーバインドになっていたと思いますが、使用出来るショートカットキーは以下のとおりです。ちなみに、私は、 Emacsのキーバインドを使っています。


キー 説明 使用頻度
履歴を戻る ☆☆☆
履歴を進む ☆☆☆
C-a 行頭へ移動 ☆☆☆
C-e 行末へ移動 ☆☆☆
C-u カーソルより前を削除 ☆☆☆
C-k カーソルより後を削除
C-p 履歴を戻る ☆☆☆
C-n 履歴を進む
C-Delete カーソルの1文字を削除
C-h 前の1文字を削除
C-l クリア ☆☆☆
C-f カーソルを右に移動 ☆☆☆
C-b カーソルを左に移動 ☆☆☆
C-j Enterと同じで改行 ☆☆
C-m Enterと同じで改行
C-[ Escと同じ
C-i Tabと同じで補完
C-r 検索 ☆☆☆
C-c 現在実行中のプログラムを消す ☆☆☆
C-z 現在実行中のプログラムを停止 ☆☆
C-g 新しく入力する ☆☆☆
C-v 直後に打った特殊文字を文字として入力
M-d カーソル位置の単語を削除 ☆☆☆
M-q 入力文字を一時保存 ☆☆
M-a コマンド実行後に再度コマンドをセット
M-f 次の単語へ移動 ☆☆☆
M-b 前の単語へ移動 ☆☆☆
M-h 一番最初の単語をrun-help ☆☆☆
M-? 一番最初の単語をwhichする ☆☆☆
M-p sudoから始まる履歴を戻る ☆☆
M-n sudoから始まる履歴を進む



bindkey -L






設定方法



zshの設定を行うには、 ~/.zshrcに設定を記述する必要があります。

touch ~/.zshrc

vim ~/.zshrc

# 再起動
exec $SHELL

# 設定ファイルの読み込み
source ~/.zshrc

# 履歴
history

# キーバインド
bindkey

# エイリアス
alias


必須の基本設定



## 基本設定 {{{
# http://yuyunko.hatenablog.com/entry/20101112/1289551129

# PAGER
export PAGER=lv

# LANG 設定
export LANG=ja_JP.UTF-8
case ${UID} in
0)
LANG=C
;;
esac

# 色の読み込み
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

# '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

# コマンド履歴を保存するファイル名。
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

# それぞれの環境に合わせて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'
## }}}



vi風のキーバインドを使用する



# 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

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

# 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



cdと同時にlsする




# cdコマンド後にlsを自動実行
function chpwd() { ls -F }



mkdirとcdを同時にする



# cdとmkdirを一緒にする
# http://d.hatena.ne.jp/yarb/20110126/p1
function mkcd() {
if [[ -d $1 ]]; then
echo "It already exsits! Cd to the directory."
cd $1
else
echo "Created the directory and cd to it."
mkdir -p $1 && cd $1
fi
}



一時的にコマンドを退避する




# C-qでコマンドラインスタック
# http://qiita.com/items/1f2c7793944b1f6cc346
show_buffer_stack() {
POSTDISPLAY="
stack: $LBUFFER"
zle push-line-or-edit
}

zle -N show_buffer_stack
setopt noflowcontrol
bindkey '^Q' show_buffer_stack



コマンドをコピーする



# C-x, C-pでコマンドをクリップボードにコピーする
# http://d.hatena.ne.jp/hiboma/20120315/1331821642
pbcopy-buffer(){
print -rn $BUFFER | pbcopy
zle -M "pbcopy: ${BUFFER}"
}

zle -N pbcopy-buffer
bindkey '^x^p' pbcopy-buffer




Google検索を行う




# w3mでGoogle検索
function go() {
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
}

# 1年以内の検索
function goy() {
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}"
tbs='&tbs=qdr:y'
fi
w3m http://www.google.co.jp/$opt$tbs
}

# 1ヶ月以内の検索
function gom() {
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}"
tbs='&tbs=qdr:m'
fi
w3m http://www.google.co.jp/$opt$tbs
}

# ChromeでGoogle検索
function chrome() {
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
open -a Google\ Chrome http://www.google.co.jp/$opt
}



ALC検索を行う



# 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
}



プロンプトをカスタマイズする




# PROMPT# {{{
# https://github.com/clear-code/zsh.d/blob/master/zshrc

setopt prompt_subst
setopt prompt_percent
setopt transient_rprompt

color256()
{
local red=$1; shift
local green=$2; shift
local blue=$3; shift

echo -n $[$red * 36 + $green * 6 + $blue + 16]
}

fg256()
{
echo -n $'\e[38;5;'$(color256 "$@")"m"
}

bg256()
{
echo -n $'\e[48;5;'$(color256 "$@")"m"
}

zstyle ':vcs_info:*' max-exports 3
zstyle ':vcs_info:hg:*' get-revision true # hg で check-for-changes を有効にするには
zstyle ':vcs_info:hg:*' use-simple true  # この2つの設定が必要

autoload -Uz is-at-least
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "⚡" # 適当な文字列に変更する
zstyle ':vcs_info:git:*' unstagedstr "±" # 適当の文字列に変更する

# Gitブランチ名や作業状態を表示する
zstyle ':vcs_info:git:*' formats '%K{green}%F{black}⮀%k%f%{%F{white}%K{green}%}  %s  %{%k%f%}%K{blue}%F{green}⮀%k%f%{%F{white}%K{blue}%}  %b  %{%k%f%}%K{black}%F{blue}⮀%k%f%{%F{white}%K{black}%} %c%u %{%k%f%}'

# プロンプトの左
autoload -Uz vcs_info
prompt_bar_left_self="%{%F{white}%K{blue}%}  %n%{%k%f%}%{%F{white}%K{blue}%}@%{%k%f%}%{%F{white}%K{blue}%}%m %{%k%f%}%{%B%F{blue}%K{blue}%}%{%b%f%k%}%K{cyan}%F{blue}⮀%k%f%{%B%F{white}%K{cyan}%}  [%~]  %{%k%f%b%}%{%k%f%}%K{red}%F{cyan}⮀%k%f%(?.%F{white}%K{red}%}  COMP  %k%f.%B%K{red}%F{red}%}  ERROR  %b%k%f)%{%K{green}%F{red}⮀%k%f%F{white}%K{green}%}  -%h  %{%k%f%}%K{green}%F{white}⮂%k%f"

# プロンプトンの左下
prompt_bar_left="${prompt_bar_left_self} ${prompt_bar_left_status} ${prompt_bar_left_date}"
prompt_left='%{%F{white}%K{black}%}  $SHELL  %{%k%f%}%{%K{white}%F{black}⮀%k%f%B%F{black}%K{white}%} %# %{%b%k%f%f%}%K{black}%F{white}⮀%k%f >  '

count_prompt_characters()
{
print -n -P -- "$1" | sed -e $'s/\e\[[0-9;]*m//g' | wc -m | sed -e 's/ //g'
}

update_prompt()
{
local bar_left_length=$(count_prompt_characters "$prompt_bar_left")
local bar_rest_length=$[COLUMNS - bar_left_length]

local bar_left="$prompt_bar_left"
local bar_right_without_path="${prompt_bar_right:s/%d//}"
local bar_right_without_path_length=$(count_prompt_characters "$bar_right_without_path")
#local max_path_length=$[bar_rest_length - bar_right_without_path_length]
bar_right=${prompt_bar_right:s/%d/%(C,%${max_path_length}<...<%d%<<,)/}
bar_right="%${bar_rest_length}<<${separator}${bar_right}%<<"

PROMPT="${bar_left}${bar_right}"$'\n'"${prompt_left}"

# プロンプトの右下
RPROMPT="%K{white}%F{black}⮀%k%f%{%F{black}%K{white}%} %l  %K{black}%F{white}⮀%k%f%{%k%f%}%{%F{white}%K{black}%}  $LANG  %{%k%f%}%K{black}%F{white}⮂%k%f"
case "$TERM_PROGRAM" in
Apple_Terminal)

RPROMPT="${RPROMPT}"
;;
esac

LANG=C vcs_info >&/dev/null
if [ -n "$vcs_info_msg_0_" ]; then
RPROMPT="${vcs_info_msg_0_}${RPROMPT}"
fi
}

precmd_functions=($precmd_functions update_prompt)
# }}}




補完をカスタマイズする




## 補完を強化する
# http://voidy21.hatenablog.jp/entry/20090902/1251918174

# 補完に関するオプション
setopt auto_param_slash      # ディレクトリ名の補完で末尾の / を自動的に付加し、次の補完に備える
setopt mark_dirs             # ファイル名の展開でディレクトリにマッチした場合 末尾に / を付加
setopt list_types            # 補完候補一覧でファイルの種別を識別マーク表示 (訳注:ls -F の記号)
setopt auto_menu             # 補完キー連打で順に補完候補を自動で補完
setopt auto_param_keys       # カッコの対応などを自動的に補完
setopt interactive_comments  # コマンドラインでも # 以降をコメントと見なす
setopt magic_equal_subst     # コマンドラインの引数で --prefix=/usr などの = 以降でも補完できる

setopt complete_in_word      # 語の途中でもカーソル位置で補完
setopt always_last_prompt    # カーソル位置は保持したままファイル名一覧を順次その場で表示

setopt print_eight_bit  #日本語ファイル名等8ビットを通す
setopt extended_glob  # 拡張グロブで補完(~とか^とか。例えばless *.txt~memo.txt ならmemo.txt 以外の *.txt にマッチ)
setopt globdots # 明確なドットの指定なしで.から始まるファイルをマッチ

bindkey "^I" menu-complete   # 展開する前に補完候補を出させる(Ctrl-iで補完するようにする)

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

# 範囲指定できるようにする
# 例 : mkdir {1-3} で フォルダ1, 2, 3を作れる
setopt brace_ccl

# manの補完をセクション番号別に表示させる
zstyle ':completion:*:manuals' separate-sections true

# 変数の添字を補完する
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters

# apt-getとかdpkgコマンドをキャッシュを使って速くする
zstyle ':completion:*' use-cache true

# ディレクトリを切り替える時の色々な補完スタイル
#あらかじめcdpathを適当に設定しておく
cdpath=(~ ~/myapp/gae/ ~/myapp/gae/google_appengine/demos/)
# カレントディレクトリに候補がない場合のみ cdpath 上のディレクトリを候補に出す
zstyle ':completion:*:cd:*' tag-order local-directories path-directories
#cd は親ディレクトリからカレントディレクトリを選択しないので表示させないようにする (例: cd ../<TAB>):
zstyle ':completion:*:cd:*' ignore-parents parent pwd

# オブジェクトファイルとか中間ファイルとかはfileとして補完させない
zstyle ':completion:*:*files' ignored-patterns '*?.o' '*?~' '*\#'

# セパレータを設定する
zstyle ':completion:*' list-separator '-->'
zstyle ':completion:*:manuals' separate-sections true

# 補完関数の表示を強化する
zstyle ':completion:*' verbose yes
zstyle ':completion:*' completer _expand _complete _match _prefix _approximate _list _history
zstyle ':completion:*:messages' format '%F{YELLOW}%d'$DEFAULT
zstyle ':completion:*:warnings' format '%F{RED}No matches for:''%F{YELLOW} %d'$DEFAULT
zstyle ':completion:*:descriptions' format '%F{YELLOW}completing %B%d%b'$DEFAULT
zstyle ':completion:*:options' description 'yes'
zstyle ':completion:*:descriptions' format '%F{yellow}Completing %B%d%b%f'$DEFAULT

# マッチ種別を別々に表示
zstyle ':completion:*' group-name ''



カラーを強化する



brew install coreutils

cd ~/dotfiles/ && git clone git://github.com/zsh-users/zsh-syntax-highlighting.git



# glsを使う
# http://qiita.com/items/84fa4e051c3325098be3
export LS_COLORS
if [ -f ~/.dircolors ]; then
if type dircolors > /dev/null 2>&1; then
eval $(dircolors ~/.dircolors)
elif type gdircolors > /dev/null 2>&1; then
eval $(gdircolors ~/.dircolors)
fi
fi

# zsh-syntax-highlightingを使う
source ~/dotfiles/zsh-syntax-highlighting/zsh-syntax-highlighting.plugin.zsh



キーで上の階層へ移動できるようにする



# ^を押すと上の階層へ
# http://qiita.com/items/b01536fa63d9f8fadf4f
cdup() {
if [ -z "$BUFFER" ]; then
echo
cd ..
if type precmd > /dev/null 2>&1; then
precmd
fi
local precmd_func
for precmd_func in $precmd_functions; do
$precmd_func
done
zle reset-prompt
else
zle self-insert '^'
fi
}
zle -N cdup
bindkey '\^' cdup



既定のブラウザを変更する



# デフォルトのブラウザを変更する
export BROWSER=w3m



tmuxの自動起動



# tmux自動起動
# http://d.hatena.ne.jp/tyru/20100828/run_tmux_or_screen_at_shell_startup
is_screen_running() {
# tscreen also uses this varariable.
[ ! -z "$WINDOW" ]
}
is_tmux_runnning() {
[ ! -z "$TMUX" ]
}
is_screen_or_tmux_running() {
is_screen_running || is_tmux_runnning
}
shell_has_started_interactively() {
[ ! -z "$PS1" ]
}
resolve_alias() {
cmd="$1"
while \
whence "$cmd" >/dev/null 2>/dev/null \
&& [ "$(whence "$cmd")" != "$cmd" ]
do
cmd=$(whence "$cmd")
done
echo "$cmd"
}


if ! is_screen_or_tmux_running && shell_has_started_interactively; then
for cmd in tmux tscreen screen; do
if whence $cmd >/dev/null 2>/dev/null; then
$(resolve_alias "$cmd")
break
fi
done
fi



undo,redoをキーで行う



# Esc+^u, ^rでundo, redoする
# http://qiita.com/items/156464de9caf64338b17
bindkey "^[u" undo
bindkey "^[r" redo


bashにも対応したpowerline-bash






例えば、zshの場合は、 cd && git clone https://github.com/milkbikis/powerline-bash.gitで複製した後、以下のように書きます。


function powerline_precmd() {
export PS1="$(~/powerline-bash/powerline-bash.py $? --shell zsh)"
}

function install_powerline_precmd() {
for s in "${precmd_functions[@]}"; do
if [ "$s" = "powerline_precmd" ]; then
return
fi
done
precmd_functions+=(powerline_precmd)
}

install_powerline_precmd



ちなみに、このツールは、 tmux-powerlinevim-powerlineと同じようにフォントにパッチを当てる必要はないのでしょうか。調べていないので、その辺は分かりません。したがって、もしかしたらボックス右端の三角を表示するためにフォントにパッチを当てる必要があるかもしれません。


クリップボード履歴から検索をかける


MacのClipMenuというアプリを使用します。

function searchClipBoard() {
    clipMenuPath='$HOME/Library/Application Support/ClipMenu'
plutil -convert xml1 $HOME/Library/Application\ Support/ClipMenu/clips.data -o - |\
        awk '/<string>/,/<\/string>/' |\
 
        # 15行目から最終行まで抜き出す
        sed -n '15, $p' |\
 
        sed -e 's/<string>//g' -e 's/<\/string>//g' -e 's/&lt;/</g' -e 's/&gt;/>/g' |\
        # head -5020 |tail -5000 |\
        sed '/^$/d'|cat -n |sort -k 2|uniq -f1 |sort -k 1 |\
        sed -e 's/^ *[0-9]*//g' |\
        awk '{for(i=1;i<NF;i++){printf("%s%s",$i,OFS=" ")}print $NF}' |\
 
        # ナンバリングの追加
        nl -b t -n ln |percol |sed -e "s/\ /\\\ /g" |\
 
            # ナンバリングの削除
        sed -e 's/\\ / /g' |cut -c 8- |ruby -pe 'chomp' |pbcopy
    zle reset-prompt
};
zle -N searchClipBoard
 
# C-x, C-xでクリップボード履歴の検索
bindkey '^x^x' searchClipBoard





z



zを使用すると、ディレクトリの移動が簡単になります。


git clone git://github.com/rupa/z

source z/z.sh



# z {{{1
# http://qiita.com/items/38d3008ac7d0b19b4805
autoload -Uz is-at-least

# Treat hook functions as array
typeset -ga chpwd_functions
typeset -ga precmd_functions
typeset -ga preexec_functions

# Simulate hook functions for older versions
if ! is-at-least 4.2.7; then
function chpwd() { local f; for f in $chpwd_functions; do $f; done }
function precmd() { local f; for f in $precmd_functions; do $f; done }
function preexec() { local f; for f in $preexec_functions; do $f; done }
fi

function load-if-exists() { test -e "$1" && source "$1" }

# z - jump around {{{2
# https://github.com/rupa/z
_Z_CMD=j
_Z_DATA=$ZDOTDIR/.z
if is-at-least 4.3.9; then
load-if-exists $ZDOTDIR/z/z.sh
else
_Z_NO_PROMPT_COMMAND=1
load-if-exists $ZDOTDIR/z/z.sh && {
function precmd_z() {
_z --add "$(pwd -P)"
}
precmd_functions+=precmd_z
}
fi
test $? || unset _Z_CMD _Z_DATA _Z_NO_PROMPT_COMMAND
#}}}

# zでタブ補完 #{{{2
# http://qiita.com/items/7a549a9b74700063111a
compctl -U -K _z_zsh_tab_completion z
# compctl -U -K _z_zsh_tab_completion "$_Z_CMD"
#}}}
#}}}



autojump



autojumpは、 zと同様にディレクトリの移動を簡単にしてくれるツールです。 Pythonが必要になる分、色々と動作速度や環境面で不安はあるものの設定が簡単です。

sudo port install autojump



# autojump
# http://ihiroky.hatenablog.com/entry/2013/01/22/114130
export FPATH="$FPATH:/opt/local/share/zsh/site-functions/"
if [ -f /opt/local/etc/profile.d/autojump.sh ]; then
. /opt/local/etc/profile.d/autojump.sh
fi



zaw



zawは、 unite.vimライクなインターフェイスを提供するツールです。様々な拡張が簡単に行えるため人気があります。


cd && git clone https://github.com/zsh-users/zaw.git

echo "source ~/zaw/zaw.zsh" >> ~/.zshrc && source ~/.zshrc



# zaw keybind
bindkey '^X' zaw



これで、 C-xを押すと、 zawが起動します。ちなみに、 auto-fu.zshなどと併用している場合は、 C-g, C-xとしてください。



zawの拡張例



# zaw-src-gitdir
# http://d.hatena.ne.jp/syohex/20120624/1340550154
function zaw-src-gitdir () {
_dir=$(git rev-parse --show-cdup 2>/dev/null)
if [ $? -eq 0 ]
then
candidates=( $(git ls-files ${_dir} | perl -MFile::Basename -nle \
'$a{dirname $_}++; END{delete $a{"."}; print for sort keys %a}') )
fi

actions=("zaw-src-gitdir-cd")
act_descriptions=("change directory in git repos")
}

function zaw-src-gitdir-cd () {
BUFFER="cd $1"
zle accept-line
}

zaw-register-src -n gitdir zaw-src-gitdir

bindkey '^@' zaw-gitdir



これで、 C-@を押すことで、今いる gitリポジトリ内の別ディレクトリに簡単に移動できるようになります。


auto-fu.zsh



auto-fu.zshは、 zshの補完を強化してくれるツールです。


cd ~/dotfiles

git clone git://github.com/hchbaw/auto-fu.zsh.git



# auto-fu.zsh
# http://blog.glidenote.com/blog/2012/04/07/auto-fu.zsh/
if [ -f ~/dotfiles/auto-fu.zsh/auto-fu.zsh ]; then
source ~/dotfiles/auto-fu.zsh/auto-fu.zsh
function zle-line-init () {
auto-fu-init
}
zle -N zle-line-init
zstyle ':completion:*' completer _oldlist _complete
fi

## ^PとかのHistory検索と相性が悪い
## auto-fu.zshのためオリジナルが変更
## URLをコピペしたときに自動でエスケープ
#autoload -Uz url-quote-magic
#zle -N self-insert url-quote-magic



zmv



zmvを使うことで、 zshで一括処理を行いやすくなります。


# zmv
# http://mollifier.hatenablog.com/entry/20101227/p1
autoload -Uz zmv
alias zmv='noglob zmv -W'



oh-my-zsh



oh-my-zshは、 zshのカスタマイズを簡単にしてくれます。


wget http://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh



git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

mv ~/.zshrc ~/.zshrc.orig

cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc


oh-my-zsh を使って zsh の便利な設定をまとめて取り入れる


antigen




ちなみに、 antigenを利用すると、 oh-my-zshのプラグインなどを利用できますので、便利です。


Zshのプラグインマネージャーantigenでoh-my-zshの良いとこ取りをする


cd ~/dotfiles

git clone https://github.com/zsh-users/antigen.git



# antigen {{{
# http://blog.glidenote.com/blog/2012/10/25/antigen/
source ~/dotfiles/antigen/antigen.zsh

# Load the oh-my-zsh's library.
antigen-lib

# Bundles from the default repo (robbyrussell's oh-my-zsh).
antigen-bundle git
antigen-bundle heroku
antigen-bundle pip
antigen-bundle lein
antigen-bundle command-not-found

# Syntax highlighting bundle.
antigen-bundle zsh-users/zsh-syntax-highlighting

# Load the theme.
antigen-theme robbyrussell

# Tell antigen that you're done.
antigen-apply
# }}}



zsh-completions



cd ~/dotfiles

git clone https://github.com/zsh-users/zsh-completions.git



# zsh-completions
# http://transitive.info/2013/03/03/zsh-completions/
[ -d $HOME/dotfiles/zsh-completions/src ] && fpath=($HOME/dotfiles/zsh-completions/src $fpath)



rm ~/.zcompdump

compinit



git-flow-completion



brew install git-flow

cd ~/.dotfiles

git clone https://github.com/bobthecow/git-flow-completion.git



# git-flow-completion
# https://github.com/bobthecow/git-flow-completion
source ~/dotfiles/git-flow-completion/git-flow-completion.zsh


cache-policy



# cache-policy を設定
zstyle -s ":completion:${curcontext}:" cache-policy update_policy
if [[ -z $update_policy ]]; then
    zstyle ":completion:${curcontext}:" cache-policy __grunt_caching_policy
fi


以下の記事がとても参考になります。

zsh の補完関数で キャッシュ機能(cache-policy) を使う