zsh の分かりにくい記号、用語のまとめ

[zsh Advent Calendar](http://qiita.com/advent-calendar/2012/zsh) もいよいよ最終日なった。便利な使い方とかがいっぱい載ってるので、まだの人は見てみると良いと思う。

こういう Advent Calendar とか便利な Tips とかの記事なんかは、読んでると自分なりにカスタマイズしたくなってくる。それに、単純にコピペするだけじゃなくて、何をやってるのかちゃんと理解したいって人も多いと思う。

でも、そういうときに困るのが、なんか変な記号みたいなのがいっぱいあって何やってるか分かんなくなること。

例えばこんな感じ。

```sh
path=(${JAVA_HOME:+${JAVA_HOME}/bin}(N-/) $path)
```

意味わかんないし、`(N-/)` とかググってもうまく検索できない。

この手の記号とかはいっぱいあるし、知らないことがあるのはしょうがない。でも「調べ方が分からない」ってのはだいぶまずい。「知らなかったとしても必要なときに調べられる」ことが大事だと思う。

というわけで zsh の分かりにくい記号、用語をまとめてみた。なんかよくわかんない時でもここで探せば、どうやって調べればよいか分かるようになると思う。

これを参考にしてもっと zsh を楽しんでみてください!


## 履歴

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| 履歴展開 | history expansion | man zshexpn の「HISTORY EXPANSION」 | 過去に入力したコマンドラインを再度実行する |`!!` |
| 履歴展開のイベント指定 | history designator | man zshexpn の「HISTORY EXPANSION」->「Event Designators」 | コマンドライン履歴を参照する指定方法 |`!ls` |
| 履歴展開の引数の選択 | word designators | man zshexpn の「HISTORY EXPANSION」->「Word Designators」 | 履歴展開で対象となるコマンドラインの一部の引数だけを展開する | `vim !cp:2` |
| 履歴展開の編集子 | modifiers | man zshexpn の「HISTORY EXPANSION」->「Modifiers」 | 履歴展開で取り出した内容を一部削除、置換して使用する | `cd !!:$:h` |

## ファイル名生成系

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| ファイル名展開 | filename expansion | man zshexpn の「FILENAME EXPANSION」 | ファイル名、パス名に置き換わる記号 | `ls ~` |
| グロブ記号 | glob operator | man zshexpn の「FILENAME GENERATION」->「Glob Operators」 | ファイル名のパターンとみなされるメタ文字 | `grep HOGE **/*.rb` |
| グロブフラグ | globbing flag | man zshexpn の「FILENAME GENERATION」->「Globbing Flags」 | ファイル名パターン指定で指定するフラグ | `rm (#i)*.bak` |
| グロブ修飾子 | glob qualifier | man zshexpn の「FILENAME GENERATION」->「Glob Qualifiers」 | ファイル名パターン指定で、ファイルの種類で絞り込みを行うための記号 | `mv  *(.) ../tmp` |
| ブレース展開 | brace expansion | man zshexpn の「BRACE EXPANSION」 | `{}` を使用して複数の名前を指定する方法 | `ls README.{txt,bak}` |
| 整数範囲展開 | brace expansion (every number) | man zshexpn の「BRACE EXPANSION」 | 数値の連番を作成する記法 | `wget http://site.com/{1..28}.jpg` |
| 算術展開 | arithmetic expansion | man zshexpn の「ARITHMETIC EXPANSION」。 計算の記法については man zshmisc の「ARITHMETIC EVALUATION」| 計算結果に置き換えるための記法 | `echo $((1+2))` |

また、ファイル名生成では履歴展開の modifiers と同じものが使える。(`echo *(:e)` など)

## 変数

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| 変数展開 | parameter expansion | man zshexpn の「PARAMETER EXPANSION」 | 変数を値に置き換える際の規則 | `${PWD##*/}` |
| 変数展開フラグ | parameter expansion flags | man zshexpn の「PARAMETER EXPANSION」->「Parameter Expansion Flags」 | 変数展開の際に追加で指定するフラグ | `${(U)foo}` |
| 配列の添字用変数展開フラグ | subscript flags | man zshparamの「ARRAY PARAMETERS」-> 「Subscript Flags」 | 配列の値を取り出すときの添字に追加で指定するフラグ | `${array[(I)pattern]}` |
| シェルによって設定される変数 | PARAMETERS SET BY THE SHELL | man zshparam の「PARAMETERS SET BY THE SHELL」 | zsh によって自動的に設定される変数 | $? |
| シェルによって使用される変数 | PARAMETERS USED BY THE SHELL | man zshparam の「PARAMETERS USED BY THE SHELL」 | zsh の動作を指定するために設定する変数 | $PROMPT |

また、変数展開では履歴展開の modifiers と同じものが使える。(`${PWD:t}` など)

## コマンドライン編集

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| デフォルトキーバインド | default bindings | man zshzle の「STANDARD WIDGETS」 | emacs モード,  vi コマンドモード、 vi インサートモードで使用可能なデフォルトキーバインド | `^A` |
| ユーザー定義ウィジェット | user-defined widgets | man zshzle の「USER-DEFINED WIDGETS」 | コマンドライン編集操作を独自に定義する | `function myfunc1 
{ ... }; zle -N myfunc1; bindkey '^Y' myfunc1` |
| 文字ハイライト | character highlighting | man zshzle の「CHARACTER HIGHLIGHTING」 | コマンドラインで表示する文字に色を付けるなどして強調する ||

## プロンプト表示

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| プロンプト文字列の展開 | expansion of prompt sequences | man zshmisc の「SIMPLE PROMPT ESCAPES」 | プロンプトの表示をカスタマイズする | `PROMPT="[%n@%m] %~ ` |
| プロンプト文字列の条件文字列 | conditional substrings in prompts | man zshmisc の「CONDITIONAL SUBSTRINGS IN PROMPTS」 | プロンプト文字列の一部を現在の状態に応じて変化させる | PROMPT="%(?..[%?]) %~ " |
| プロンプトテーマ | prompt themes | man zshcontrib の「PROMPT THEMES」 | プロンプトテーマを選択して使用する | `autoload -Uz promptinit; promptinit; prompt -p adam2` |


## 補完

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| スタイル | style | man zshcompsys の「COMPLETION SYSTEM CONFIGURATION」->「Standard Styles」 | どのように補完するかを指定するために定義された名前。zstyle *CONTEXT* *STYLE* *VALUE* の STYLE の部分。| `zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'` |
| コンテクスト | context | man zshcompsys の「COMPLETION SYSTEM CONFIGURATION」 | どのような文脈で補完が行われているかを指定する文字列。zstyle *CONTEXT* *STYLE* *VALUE* の CONTEXT の部分。 | `zstyle ':completion:*:cd:*' group-name ''` |
| タグ | tag | man zshcompsys の「COMPLETION SYSTEM CONFIGURATION」->「Standard Tags」 | 何を補完しているかを指定する文字列。CONTEXT は :completion:*FUNCTION*:*COMPLETER*:*COMMAND*:*ARGUMENT*:*TAG* という形式で書くが、その TAG の部分。 | `zstyle ':completion:*:processes' command 'ps x -o pid,s,args'` |

## リダイレクト

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| リダイレクト | redirection | man zshmisc の「REDIRECTION」 | コマンドの入出力を別のファイルに切り替えるための記号(ヒアドキュメント、ヒアストリングもここに含む) | `ls ~ > list.txt` |
| プロセス置換 | process  substitution | man zshexpn の「PROCESS SUBSTITUTION」| コマンドの入出力を読み取るファイル名に置き換えるための記号。本来一時ファイルが必要な箇所で、コマンド名を指定してそこにファイルがあるものとして記述できる。 | `diff <(ls dir1) <(ls dir2)` |
| マルチIO | multio | man zshmisc の「MULTIOS」 | 1つのコマンドの入出力を複数指定する | `sort <foo <bar` |


## 構文

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| 条件式 | conditional expressions | man zshmisc の「CONDITIONAL EXPRESSIONS」 | ファイルの状態チェック、文字列の比較などを行うための記法 | `[[ -f foo.zsh ]] && source foo.zsh` |
| 制御構文 | complex commands | man zshmisc の「COMPLEX COMMANDS」 | 複数のコマンドを組み合わせて実行する方法。if, while などの制御構文 | `if foo; then bar fi` |


## 内部関数

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| 組み込みコマンド | builtin commands | man zshbuiltins | zsh 内部で実装しているコマンド | `alias` |
| 特殊関数 | special functions | man zshmisc の「SPECIAL FUNCTIONS」 | zsh でとく別な機能を持つ関数 | chpwd |

## その他

| 名前(日本語) | 名前(英語) | man ページの該当箇所 | 内容 | 例 |
|:-------------|:-----------|:---------------------|:-----|:---|
| オプション | options | man zshoptions | zsh の動作をON/OFFで指定する | `setopt AUTO_CD` |
| コマンド前置 | precommand modifiers | man zshmisc の「PRECOMMAND MODIFIERS」 | コマンドの前に指定して実行するコマンドの動作を変更する | `nocorrect cp foo bar` |