自分のお気に入りの.zshrc設定

#はじめに
6月ごろから本格的にZshを使い始めて、最近また使いやすくカスタマイズしたので投稿したいと思います。
#コマンド検索っぽいもの
なんて表現すればいいのかわからないのでこんな表現になりましたがBashの`.inputrc`でいうと 

```
"\C-p":history-search-backward
"\C-n":history-search-forward
"\e[A":history-search-backward
"\e[B":history-search-forward
```
これらと同じような設定がしたい方用のやつです。
これをZsh向けにするにはどこかから`.zsh-history-substring-search.zsh`を持ってきて

```
source ~/.zsh-history-substring-search.zsh
export HISTORY_SUBSTRING_SEARCH_ENSURE_UNIQUE=1
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
```
を.zshrcに書けばいいです。
https://unix.stackexchange.com/questions/97843/how-can-i-search-history-with-text-already-entered-at-the-prompt-in-zsh
を参考にした気がします。

これがzshでできなかった頃はbashのほうがいいじゃんと思っていました。
#補完設定
Zshの良さはやはり補完の良さです。
補完キー連打で順に補完候補を自動で補完してくれたりしますし。(bashでできるかは知らない）

自分の設定はこんな感じです。

```
_cache_hosts=(`ruby -ne 'if /^Host\s+(.+)$/; print $1.strip, "\n"; end' ~/.ssh/config`) # ssh,scp用ホスト追加
autoload -Uz compinit
compinit -u
if [ -e /usr/local/share/zsh-completions ]; then
  fpath=(/usr/local/share/zsh-completions $fpath)
fi
# 補完で小文字でも大文字にマッチさせる
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
# 補完候補一覧をカラー表示
zstyle ':completion:*' list-colors ''
setopt list_packed           # 補完候補を詰めて表示
setopt auto_param_slash      # ディレクトリ名の補完で末尾の / を自動的に付加し、次の補完に備える
setopt list_types            # 補完候補一覧でファイルの種別を識別マーク表示 (訳注:ls -F の記号)
setopt auto_menu             # 補完キー連打で順に補完候補を自動で補完
setopt auto_param_keys       # カッコの対応などを自動的に補完
setopt magic_equal_subst     # コマンドラインの引数で --prefix=/usr などの = 以降でも補完できる
setopt complete_in_word      # 語の途中でもカーソル位置で補完
setopt extended_glob         # 拡張グロブで補完(~とか^とか。例えばless *.txt~memo.txt ならmemo.txt 以外の *.txt にマッチ)
```
https://qiita.com/kotashiratsuka/items/ae37757aa1d31d1d4f4d
を参考にした気がします。

特におすすめなのが

```
_cache_hosts=(`ruby -ne 'if /^Host\s+(.+)$/; print $1.strip, "\n"; end' ~/.ssh/config\`)
```
でscpの際、configからhostnameを持ってきて補完候補に入れてくれます。同時にファイルやディレクトリの補完ももちろんできます。
あとは
`zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'`や`setopt auto_param_slash`、`setopt auto_menu`、`setopt complete_in_word`もよく使う気がします。
#プロンプト
BashではPS1変数に設定しますが、ZshではPROMPT変数に設定します。自分で一から作ったもので恥ずかしいのですが

```
PROMPT='%B[%F{yellow}%m%F{white}:(%F{blue}%j%F{white}):(%F{magenta}%?%F{white}):%F{blue}%~%F{white}]%(?.%F{green}%#.%F{red}%#)%F{white}:%f %b'
```
という設定です。
bashでは

```
export PS1="\[\e[1m\][\[\e[33m\]\h\[\e[37m\]:(\[\e[34m\]\j\[\e[37m\]):(\[\e[35m\]\$?\[\e[37m\]):\[\e[36m\]\W\[\e[37m\]]\`if [[ \$? = "0" ]]; then echo "\\[\\e[32m\\]"; else echo "\\[\\e[31m\\]"; fi\`\$\[\e[00m\]: "
```
でほぼ同じものが出ます。なんとなくzshのほうがわかりやすい気がします。`[Host:(process):(return):Path]$:`みたいなプロンプトです。

#alias
自分はタイピングが遅いので、aliasをたくさん設定しています。一部を紹介します。

```
alias cp='cp -i'
alias rm='rm -i'
alias ll='ls -l'
alias la='ls -a'
alias grep="grep --color=auto"
alias en="emacs -nw"
alias enw="emacs -nw"
alias l="ls"
alias op="open"
alias mkdir="mkdir -p"
alias ..="cd .."
alias sl=ls
alias sls=ls
alias img=imgcat
alias p3="python3 "
alias  rfs='du -skh * .??*|sort -n'
alias -s {doc,xls,ppt,docx,xslx,pptx,rtf,html,htm,txt,css,pdf}=open
alias -s {py,c,cpp,txt}=cat
```
一部macでしか動かないものや推奨しないものなどもありますので、一つ一つどんな意味なのか考えながら設定してください。
ちなみに、`alias -s`はファイル名を打つだけで指定したコマンドで実行してくれるというものです。
macにはopenコマンドというとても便利なものがありますのでこんな感じのaliasを設定しておけばいいんじゃないでしょうか。

また、lsに色をつけたい場合

```
case "$OSTYPE" in
    solaris*) alias ls='ls --color=auto -F' ;;
    darwin*)  alias ls='ls -GF'             ;;
    Linux*)   alias ls='ls --color=auto -F' ;;
esac
```
という風に書けばいろんなOSに対応できます。
#その他
functionなどはほとんどbashと同じものが使えると思うので色々試してみてください。
anacondaを使っている方は

```
# added by Anaconda3 2019.03 installer
# >>> conda init >>>
# !! Contents within this block are managed by 'conda init' !!
function activate_anaconda(){
  __conda_setup="$(CONDA_REPORT_ERRORS=false '~/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
  if [ $? -eq 0 ]; then
      \eval "$__conda_setup"
  else
      if [ -f "~/anaconda3/etc/profile.d/conda.sh" ]; then
          . "~/anaconda3/etc/profile.d/conda.sh"
          CONDA_CHANGEPS1=false conda activate base
      else
          \export PATH="~/anaconda3/bin:$PATH"
      fi
  fi
  unset __conda_setup
  # <<< conda init <<<
}
```
って感じで使うときだけ関数として起動するようにするといいかもしれません。
シェルスクリプトもいちいちファイル作るよりfunctionとして.zshrcに書く派です。(環境を移すのも楽だし）
#最後に
zshを始めたばかりの人はまず他の人のを参考にしてやるのが一番です。
僕も最初は他の人のを参考にしてやっていたので皆さんも僕のを参考にしてみてください。

あと書いてて疲れました。

以上