zshの補完を強化するTips

joshua radin:today
photo credit: visualpanic via photopin cc


はじめに


ちょっと前に、zsh Advent Calendar 2012に参加してみました。


私は、こういうものに参加したことはなかったので、ちょっぴり感動です。


ここで、私が投稿したのは、 zshのhistoryに関する内容でしたが、ちょっと面白みにかけ、適当すぎたかもしれないと思っています(ストック数も少なかったし)。


だって、最後の方の参加だったので、ネタが思いつかなかったんだもん。


にも関わらず、最後のほうの日程で誰も予約を入れなかった場合、再投稿するための記事を幾つか作成していました。


しかし、今日ですべての予約が埋まってしまったので、今回は、そのために用意していた記事の一つをブログで公開しちゃいます。


なぜ、そこまでするのかというと、それは、 zsh Advent Calendar 2012に空きがないようにしたかったからです。多分、他の参加者の方々も同じ気持ちだと思います。


zshの補完を強化するTips


では、基本設定は面白く無いので、最後あたりにまとめるとして、まずは応用の設定から解説していきます。


補完候補を選択する


autoload -U compinit
compinit
zstyle ':completion:*:default' menu select=2






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


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





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


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







色をつける


# 名前で色を付けるようにする
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}



その他


# manの補完をセクション番号別に表示させる
# http://voidy21.hatenablog.jp/entry/20090902/1251918174
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' '*?~' '*\#'



基本設定


# 補完に関するオプション
# 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



後は、 bash 限定だったgit-completionが進化したzsh-completionsなどを使ってみてください。


Cheat-Sheet


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

# 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