zshの大量にある1文字記号の意味の調べ方

[zsh の分かりにくい記号、用語のまとめ](https://qiita.com/mollifier/items/26a9ddcb7470f539e575)と似たような感じだけど、Webの方が目次や索引があったりして、個人的にはmanより読みやすいと思うのでリンクを張ってみた。

[公式ドキュメント:目次](https://zsh.sourceforge.io/Doc/Release/zsh_toc.html)



# 記号

## Parameter Expansion Flags（変数展開フラグ）
↓の`(q)`みたいなの。  [公式ドキュメント](https://zsh.sourceforge.io/Doc/Release/Expansion.html#Parameter-Expansion-Flags
)

```zsh
${(q)hoge}
```

## Modifiers（編集子）
↓の`:h`みたいなの。[公式ドキュメント](https://zsh.sourceforge.io/Doc/Release/Expansion.html#Modifiers)
```zsh
${dir:h}
```

## Globbing Flags（グロブフラグ）
↓の`(#m)`みたいなの。[公式ドキュメント](https://zsh.sourceforge.io/Doc/Release/Expansion.html#Globbing-Flags)

```zsh
${arr//(#m)[aeiou]/${(U)MATCH}}
```

## Glob Qualifiers（グロブ修飾子）
↓の`(N)`みたいなの。[公式ドキュメント](https://zsh.sourceforge.io/Doc/Release/Expansion.html#Glob-Qualifiers)

```zsh
*.zsh(N)
```

# Tips
## タブ補完を使う

なんとzshは記号にもタブ補完が効いてしまう。これで意味を調べられる。
（上記のうちGlobbing Flagsだけは効かない模様）

```console
% ls ${(<ここでTab>
0  -- split words on null bytes
A  -- assign as an array parameter
a  -- sort in array index order (with O to reverse)
b  -- backslash quote pattern characters only
B  -- include index of beginning of match in #, % expressions
C  -- capitalize words
```

# 記号以外にも公式ドキュメントへのリンク

## オプション
`setopt auto_cd`みたいなの。
[公式ドキュメント:オプションのリスト](https://zsh.sourceforge.io/Doc/Release/Options.html#Options)

次のコマンドでオプションのリストを表示できる:

```console
$ set -o
noaliases             off
aliasfuncdef          off
allexport             off
...
```

## 組み込み変数
`HISTFILE`や`PS1`などシェルが使う変数のリストは[公式ドキュメント:Parameters Used by the Shell](https://zsh.sourceforge.io/Doc/Release/Parameters.html#Parameters-Used-By-The-Shell)にある。
`$_comps`や`$commands`などは[公式ドキュメント:Variables Index](https://zsh.sourceforge.io/Doc/Release/Variables-Index.html#Variables-Index)にある。


次のコマンドで定義済み変数のリストを表示できる:

```console
$ set
'!'=0
'#'=0
'$'=84029
```


## zleウィジェット

↓の`history-incremental-pattern-search-backward`みたいなのをウィジェットという。
[公式ドキュメント:ウィジェットのリスト](https://zsh.sourceforge.io/Doc/Release/Editor-Functions-Index.html#Editor-Functions-Index)
```zsh
bindkey    '^R'   history-incremental-pattern-search-backward
```


次のコマンドでユーザー定義を含むウィジェットのリストを表示できる:

```console
$ zle -al
.accept-and-hold
.accept-and-infer-next-history
.accept-and-menu-complete
...
```

## スタイルとタグ

↓zstyleの`descriptions`の部分（コロンで区切られる最後の部分）をタグ、`format`の部分をスタイルという。
[公式ドキュメント：スタイルとタグのリスト](https://zsh.sourceforge.io/Doc/Release/Style-and-Tag-Index.html#Style-and-Tag-Index)

```zsh
zstyle ':completion:*:descriptions' format '%F{yellow}%d%f'      # グループ名など
```

次のコマンドでスタイルのリストを表示できる:
（適用可能な全スタイルではなく、定義済みのスタイル）

```console
$ zstyle -L
zstyle ':vcs_info:svn*:*' actionformats '%c%u %F{1}| %a%f'
zstyle ':vcs_info:*' actionformats '%b %F{1}| %a%f'
zstyle ':vcs_info:hg*:*' branchformat %b
...
```

カーソル位置で適用可能なスタイルを調べるには、`M-2 C-x h`を押せば良い:

```console
$ cp -<ここでM-2 C-x h>
tags in context :completion::complete:cp::
    argument-rest options  (_arguments _cp)
tags in context :completion::complete:cp:argument-rest:
    globbed-files  (_files _arguments _cp)
```

# さいごに

zshのカスタマイズは楽じゃない。しかしドキュメントへのアクセスを効率的にし、文字列操作や配列操作のイディオムを覚えれば、あとは他のツールのカスタマイズとそう変わらないのではないか。

- [zsh文字列操作まとめ](https://qiita.com/aosho235/items/32b62c732a1b343dce9f)
- [zsh の配列操作の基本から応用まで](https://qiita.com/mollifier/items/f897b3fddd2d10369333)
- [zshの連想配列の使い方まとめ](https://qiita.com/mollifier/items/ba956b7c07acdabd74a7)

ただ補完をカスタマイズするにはしっかり仕組みを理解する必要があるので
- [zshの本](https://www.amazon.co.jp/dp/4774138649/)
- [A User's Guide to the Z-ShellのChapter 6](https://zsh.sourceforge.io/Guide/zshguide06.html#l144)（主要開発者のPeter Stephenson氏によるもので、半公式といっていいだろう）

をおすすめする。

そもそもカスタマイズが面倒くさいが便利に使いたい人は[zsh4humans](https://github.com/romkatv/zsh4humans)はどうだろう。powerlevel10k作者のromkatv氏による「設定無しで欲しい機能が全部揃っている」zshフレームワークで、

- シンタックスハイライト
- オートサジェスト（fishみたいな）
- Powerlevel10kによるプロンプト
- fzfとの統合

が入っている。romkatv氏のことだから、速度にも最大限に注意を払っていると思われる。