Zsh 入門者のための超速設定ガイド

# はじめに
このガイドでは、はじめて Zsh を使う人や Zsh の便利な使い方を知らない人に向けて、いくつかの便利な設定と操作方法を紹介します。また、 Zsh についての疑問を素早く解決できるよう、マニュアルの調べ方や他のドキュメントへのリンクも盛り込んであります。

このガイドでカバーしきれていない設定や分かりやすいドキュメントをご存知でしたら、ぜひ編集リクエストやコメントでお知らせください。

# 設定ファイル
ここでは主に普段のキー入力数を大幅に減らせるような設定を紹介します。

## .zshrc
`~/.zshrc` は Zsh のインタラクティブシェル（ユーザーがコマンドを入力する画面）が起動した際に読み込まれる設定ファイルです。 Zsh スクリプトを実行したり、 `zsh -c 'command...'` でコマンドを実行したりしたときには読み込まれません。このファイルには主に Zsh の操作に関する設定を記述します。

```zsh:.zshrc
# Emacs ライクな操作を有効にする（文字入力中に Ctrl-F,B でカーソル移動など）
# Vi ライクな操作が好みであれば `bindkey -v` とする
bindkey -e

# 自動補完を有効にする
# コマンドの引数やパス名を途中まで入力して <Tab> を押すといい感じに補完してくれる
# 例： `cd path/to/<Tab>`, `ls -<Tab>`
autoload -U compinit; compinit

# 入力したコマンドが存在せず、かつディレクトリ名と一致するなら、ディレクトリに cd する
# 例： /usr/bin と入力すると /usr/bin ディレクトリに移動
setopt auto_cd

# ↑を設定すると、 .. とだけ入力したら1つ上のディレクトリに移動できるので……
# 2つ上、3つ上にも移動できるようにする
alias ...='cd ../..'
alias ....='cd ../../..'

# "~hoge" が特定のパス名に展開されるようにする（ブックマークのようなもの）
# 例： cd ~hoge と入力すると /long/path/to/hogehoge ディレクトリに移動
hash -d hoge=/long/path/to/hogehoge

# cd した先のディレクトリをディレクトリスタックに追加する
# ディレクトリスタックとは今までに行ったディレクトリの履歴のこと
# `cd +<Tab>` でディレクトリの履歴が表示され、そこに移動できる
setopt auto_pushd

# pushd したとき、ディレクトリがすでにスタックに含まれていればスタックに追加しない
setopt pushd_ignore_dups

# 拡張 glob を有効にする
# glob とはパス名にマッチするワイルドカードパターンのこと
# （たとえば `mv hoge.* ~/dir` における "*"）
# 拡張 glob を有効にすると # ~ ^ もパターンとして扱われる
# どういう意味を持つかは `man zshexpn` の FILENAME GENERATION を参照
setopt extended_glob

# 入力したコマンドがすでにコマンド履歴に含まれる場合、履歴から古いほうのコマンドを削除する
# コマンド履歴とは今まで入力したコマンドの一覧のことで、上下キーでたどれる
setopt hist_ignore_all_dups

# コマンドがスペースで始まる場合、コマンド履歴に追加しない
# 履歴に残したくないコマンドを入力するとき使う
# 例： <Space>echo hello と入力
setopt hist_ignore_space

# <Tab> でパス名の補完候補を表示したあと、
# 続けて <Tab> を押すと候補からパス名を選択できるようになる
# 候補を選ぶには <Tab> か Ctrl-N,B,F,P
zstyle ':completion:*:default' menu select=1

# 単語の一部として扱われる文字のセットを指定する
# ここではデフォルトのセットから / を抜いたものとする
# こうすると、 Ctrl-W でカーソル前の1単語を削除したとき、 / までで削除が止まる
# パス名を入力中にファイル名を一気に消すとき便利
# 例： cd /home/me/somewhere<Ctrl-W> → cd /home/me/
WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'
```

→[その他のオプションの調べ方](http://qiita.com/uasi/items/c4288dd835a65eb9d709#1-5)

## .zshenv
`~/.zshenv` は Zsh が起動した際に必ず読み込まれる設定ファイルです。ここには主に環境変数などの、操作に関係のない設定を記述します。

```zsh:.zshenv
# PATH の設定（お好みで）
export PATH="/usr/local/bin:$PATH"

# PATH の内容と同期している配列変数 path も使える
path=(
    ~/bin
    $path
)

# もし .zshenv を複数のマシンで共有していて、
# あるマシンには存在するが別のマシンには存在しないパスを PATH に追加したいなら、
# パスの後ろに (N-/) をつけるとよい
# こうすると、パスの場所にディレクトリが存在しない場合、パスが空文字列に置換される
# 詳細は `man zshexpn` の Glob Qualifiers を参照
path=(
    /machine1/only/bin(N-/)
    /machine2/only/lib(N-/)
    $path
)
```

# よく使うキー操作（Emacs キーバインドの場合）
|キー|意味|
|----|----|
|**カーソル操作**||
|Ctrl-F|カーソルを1文字進める|
|Ctrl-B|カーソルを1文字戻す|
|Ctrl-A|カーソルを行頭に移動|
|Ctrl-E|カーソルを行末に移動|
|**文字削除**||
|Ctrl-W|1単語削除|
|Ctrl-K|カーソルから行末まで削除|
|Ctrl-Y|直前に削除した文字列を貼り付け|
|**コマンド履歴**||
|Ctrl-P|履歴を1つ戻る|
|Ctrl-N|履歴を1つ進める|
|Ctrl-R|履歴を新しい順に検索（検索中に Ctrl-R/Ctrl-S を押すと1つ古い/新しい候補を表示）|
|Ctrl-G（履歴表示中）|履歴表示をキャンセル|
|**その他**||
|Esc を押して Q|現在入力中のコマンドをスタックに退避してプロンプトを空にする（何か別のコマンドを実行すると、退避したコマンドがスタックから取り出される）。コマンド入力中に別のコマンドを実行したくなったとき便利|

## その他のキーバインドの調べ方

キーに割り当てられているアクションの一覧は `bindkey -L` で表示できます：

```
% bindkey -L
bindkey "^@" set-mark-command
bindkey "^A" beginning-of-line
bindkey "^B" backward-char
...
```

"^@" は Ctrl-@ を表し、続く set-mark-command はそのキーを押すと実行されるアクションの名前です。 Zsh ではアクションを定義する実体（組み込み関数または任意のユーザー定義の関数）のことをウィジェットと呼びます。ウィジェットの説明を読むには `man zshzle` の中をウィジェットの名前で検索します。

# 便利なコマンドや記法
- [Zsh - zmvコマンドで複数ファイルの一括リネーム - Qiita [キータ]](http://qiita.com/usamik26/items/fcb720ba646e5b0b4684)：`zmv *.hoge *.fuga` で拡張子を一括で付け替えたりできる
- [zsh で find を使わずに簡単にファイルを絞り込む - Qiita [キータ]](http://qiita.com/mollifier/items/1c4a4930a89aa75e5ced)：`echo *(/)` でディレクトリにだけマッチするなど

Zsh Advent Calendar にはたくさんの tips が集められています。

- [zsh Advent Calendar 2015 - Qiita [キータ]](http://qiita.com/advent-calendar/2015/zsh)
- [zsh Advent Calendar 2014 - Qiita [キータ]](http://qiita.com/advent-calendar/2014/zsh)
- [zsh Advent Calendar 2013 - Qiita [キータ]](http://qiita.com/advent-calendar/2013/zsh)
- [zsh Advent Calendar 2012 - Qiita [キータ]](http://qiita.com/advent-calendar/2012/zsh)

# マニュアルの調べ方
|マニュアル|内容|
|----|----|
|man zsh|zsh のマニュアルの一覧と zsh の概要|
|man zshmisc|スクリプトの構文、リダイレクトやパイプの書き方、特殊関数の一覧、などなど|
|man zshexpn|glob や変数展開の記法|
|man zshparam|特殊変数の一覧や変数の添字展開の記法|
|man zshoptions|setopt でセットできるオプションの一覧|
|man zshbuiltins|ビルトインコマンドの一覧|

上級者向けのマニュアルは省略してあります。すべてのマニュアルを見るには `man zsh` を参照してください。[オンラインでマニュアルを読むこともできます](http://zsh.sourceforge.net/Doc/Release/zsh_toc.html)。

検索しづらい記号については以下のページが参考になります。

- [zsh の分かりにくい記号、用語のまとめ - Qiita [キータ]](http://qiita.com/mollifier/items/26a9ddcb7470f539e575)
- [zsh の分からない用語を man から素早く探す - Qiita [キータ]](http://qiita.com/mollifier/items/14bbea7503910300b3ba)