zshの補完を強化するTips


今回は､zshの補完を強化する方法を幾つか紹介してみたいと思います｡

##補完候補をハイライトする



```~/.zshrc
autoload -U compinit
compinit
zstyle ':completion:*:default' menu select=2
```

##補完候補をオプションやディレクトリで分けて表示する

![](https://lh4.googleusercontent.com/-ARQCHEnpGWQ/UNbRu9p-PzI/AAAAAAAACWQ/gbgxudRz4A4/s640/fu.png)

```~/.zshrc
# 補完関数の表示を強化する
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 ''
```

[zshの補完を強化する方法](http://qiita.com/items/21f569f3853beb0f3409)を見てください｡bash 限定だった`git-completion`が進化した[zsh-completions](https://github.com/zsh-users/zsh-completions)などを使うことで､簡単に補完を強化することができます｡


#オプションを補完するときの表示を分かりやすくする

![](https://lh3.googleusercontent.com/-tkEHqbRI-yM/UNbRv2ot1vI/AAAAAAAACWU/R5AKw7otAY8/s640/fu.png)

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

#色をつける
色をつけるには､[LS_COLORSを設定しよう](http://qiita.com/items/84fa4e051c3325098be3)で紹介されている方法が一番効果的だと思います｡しかし､ツールを使用したくない場合は､以下のように個別に設定して行きましょう｡

![](https://lh4.googleusercontent.com/-x6hovhxCo_Q/UMyJmTiyRQI/AAAAAAAACFo/byUUdHDmXLk/s640/cd.png)

```~/.zshrc
# 名前で色を付けるようにする
autoload colors
colors
 
# LS_COLORSを設定しておく
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
 
# ファイル補完候補に色を付ける
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
```

ちなみに､コマンドに色をつけるには､[ zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)を使います｡

#git-flowコマンドの補完
```
mkdir ~/zsh/ && cd ~/zsh/ && git clone https://github.com/bobthecow/git-flow-completion.git && echo "source ~/zsh/.git-flow-completion.zsh" >> ~/.zshrc && exec $SHELL
```

#
#記憶を補完する
記憶を補完するために以下を設定しておくと便利です｡

```~/.zshrc
# cheat-sheet
cheat-sheet () { zle -M "`cat ~/zsh/cheat-sheet.conf`" }
zle -N cheat-sheet
bindkey "^[^h" cheat-sheet
 
git-cheat () { zle -M "`cat ~/zsh/git-cheat.conf`" }
zle -N git-cheat
bindkey "^[^g" git-cheat
```

#その他
```~/.zshrc
# 補完に関するオプション
# 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' '*?~' '*\#'
```

最後に､zshをもっとカスタマイズしてみたい人は､[zsh Advent Calendar 2012](http://qiita.com/advent-calendar/2012/zsh)を参考にしてみるといいかもしれません｡