zsh カスタマイズ履歴 vol.1


##はじめに

最近、変更したり追加した`.zshrc`を紹介します。

##.zshrc

設定のまとめです。以下より詳細な説明になります。

```bash:~/.zshrc
# help {{{
alias run-help >/dev/null 2>&1 && unalias run-help
autoload -Uz run-help
autoload -Uz run-help-git
autoload -Uz run-help-svn
autoload -Uz run-help-svk
autoload -Uz run-help-openssl
autoload -Uz run-help-p4
autoload -Uz run-help-sudo
bindkey '^h^h' run-help
# help }}}

# z {{{
# brew install z
# ...or,source /path/to/z/z.sh
. `brew --prefix`/etc/profile.d/z.sh
compctl -U -K _z_zsh_tab_completion ${_Z_CMD:-z}
# }}}


# cdr {{{
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
zstyle ':completion:*:*:cdr:*:*' menu selection
zstyle ':completion:*' recent-dirs-insert both
zstyle ':chpwd:*' recent-dirs-max 500
zstyle ':chpwd:*' recent-dirs-default true
zstyle ':chpwd:*' recent-dirs-pushd true
# }}}

# zaw-cdr
# https://github.com/zsh-users/zaw
# source /path/to/zaw.zsh
bindkey '^j^j' zaw-cdr

# mac-clipmenu {{{
# curl -O https://gist.githubusercontent.com/richmikan/3251311/raw/290c70b9a45b5eb66036b83de79bfe6bb0b3b054/parsrx.sh
function searchClipBoard() {
cclip=`plutil -convert xml1 ~/Library/Application\ Support/ClipMenu/clips.data -o - | parsrx.sh | grep '/plist/dict/array/string ' | sed '1,2d' | sed 's/\/plist\/dict\/array\/string//g' | peco`
echo $cclip | pbcopy
}
zle -N searchClipBoard
bindkey '^x^p' searchClipBoard
# mac-clipmenu }}}

# gitinit {{{
function gitinit(){
    echo -n username:
    read user
    repo=`echo $PWD:t`
    repo_j={\"name\":\"$repo\"}
    url="https://github.com/"$user/$repo.git
    curl -u $user https://api.github.com/user/repos -d $repo_j
    case $? in
        0)
            rm -rf .git
            git init
            echo $url
            git remote add origin $url
            git commit --allow-empty -m "noun"
            git push -u origin master
            ;;
    esac
    #case $1 in
    #  a)
    #            rm -rf .git
    #            git init
    #            git add *
    #            echo $url
    #            git remote add origin $url
    #            git commit -m "first commit"
    #            git push -u origin master
    #            ;;
    #  *)
    #            rm -rf .git
    #            git init
    #            echo $url
    #            git remote add origin $url
    #            git commit --allow-empty -m "noun"
    #            git push -u origin master
    #            ;;
    #esac
}
# gitinit }}}
```

##zaw

###zaw-cdr

新しくzshに追加された`cdr`を使った移動を`C-j,C-j`キーで実現します。

ちなみに、`zaw`は所定の位置で`source`しておいてください。具体的には、自分が本体ファイルをおいているパスを記述します。

> `# source /path/to/zaw.zsh`

```bash:~/.zshrc
# cdr {{{
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
zstyle ':completion:*:*:cdr:*:*' menu selection
zstyle ':completion:*' recent-dirs-insert both
zstyle ':chpwd:*' recent-dirs-max 500
zstyle ':chpwd:*' recent-dirs-default true
zstyle ':chpwd:*' recent-dirs-pushd true
# }}}

# zaw-cdr
# https://github.com/zsh-users/zaw
# source /path/to/zaw.zsh
bindkey '^j^j' zaw-cdr
```

###zaw-z

`zaw/source`にプラグインを置き、キー`C-f,C-f`を設定しています。これは、`z`の履歴を使う方法です。

```bash:
$ cd /path/to/zaw/source

$ curl -O https://raw.githubusercontent.com/lovingly/dotfiles/master/zsh.d/zaw/zaw-z.zsh

$ echo "bindkey '^f^f' zaw-z" >> ~/.zshrc
```

https://raw.githubusercontent.com/lovingly/dotfiles/master/zsh.d/zaw/zaw-z.zsh

ちなみに、`z`を設定するには、以下を先に記述しておきます。

```bash:
# z {{{
# brew install z
# ...or,source /path/to/z/z.sh
. `brew --prefix`/etc/profile.d/z.sh
compctl -U -K _z_zsh_tab_completion ${_Z_CMD:-z}
# }}}
```

`homebrew`で入れた場合とrepoを持ってきた場合では記述が異なります。上は前者ですが、repoを持ってきた場合は、`source /path/to/z/z.sh`を記述します。

##mac-clipmenu

MacのClipMenuというアプリにて、クリップボード履歴をコマンドラインから参照します。必要な物は、 [peco](https://github.com/peco/peco)とか[xmlをパースするスクリプト](http://qiita.com/richmikan@github/items/e051b5d882c3dd2a39c6)とか。

まずは、スクリプトのダウンロードです。スクリプトはパスの通った場所`echo $PATH`に置きます。

```bash:
$ curl -O https://gist.githubusercontent.com/richmikan/3251311/raw/290c70b9a45b5eb66036b83de79bfe6bb0b3b054/parsrx.sh

$ chmod +x !$:t
```

```bash:~/.zshrc
# curl -O https://gist.githubusercontent.com/richmikan/3251311/raw/290c70b9a45b5eb66036b83de79bfe6bb0b3b054/parsrx.sh
function searchClipBoard() {
cclip=`plutil -convert xml1 ~/Library/Application\ Support/ClipMenu/clips.data -o - | parsrx.sh | grep '/plist/dict/array/string ' | sed '1,2d' | sed 's/\/plist\/dict\/array\/string//g' | peco`
echo $cclip | pbcopy
}
zle -N searchClipBoard
bindkey '^x^p' searchClipBoard
```

##git-init

ディレクトリ名でGitHubにリポジトリを作成し、空`commit`します。

> git commit --allow-empty -m "noun"


コメントを外すと、引数`a`でディレクトリ内を`add`します。ただし、上記`case`文はコメントアウトしてください。


> gitinit a

```bash:~/.zshrc
function gitinit(){
    echo -n username:
    read user
    repo=`echo $PWD:t`
    repo_j={\"name\":\"$repo\"}
    url="https://github.com/"$user/$repo.git
    curl -u $user https://api.github.com/user/repos -d $repo_j
    case $? in
        0)
            rm -rf .git
            git init
            echo $url
            git remote add origin $url
            git commit --allow-empty -m "noun"
            git push -u origin master
            ;;
    esac
    #case $1 in
    #  a)
    #            rm -rf .git
    #            git init
    #            git add *
    #            echo $url
    #            git remote add origin $url
    #            git commit -m "first commit"
    #            git push -u origin master
    #            ;;
    #  *)
    #            rm -rf .git
    #            git init
    #            echo $url
    #            git remote add origin $url
    #            git commit --allow-empty -m "noun"
    #            git push -u origin master
    #            ;;
    #esac
}
```

##help

`C-h,C-h`でヘルプを引けるようにしました。

```bash:~/.zshrc
alias run-help >/dev/null 2>&1 && unalias run-help
autoload -Uz run-help
autoload -Uz run-help-git
autoload -Uz run-help-svn
autoload -Uz run-help-svk
autoload -Uz run-help-openssl
autoload -Uz run-help-p4
autoload -Uz run-help-sudo
bindkey '^h^h' run-help
```


##エラーへの対処法

zshでは、記述の順番などがエラーの原因となっている場合が考えられます。したがって、基本的な記述については、その仕組のある程度の理解が必要となります。

###zaw-src-cdr:2: closing brace expected 

> zaw-src-cdr:2: closing brace expected 

`antigen`を使っている場合、もしくは、`setopt sh_word_split`を使っている場合に発生するようです。

ちなみに、デフォルトでは、有効になっていませんので、通常エラーが出ることはありません。エラーが出る場合は、`~/.zshrc`の末尾に、以下を記述して対応します。

```bash:~/.zshrc
unsetopt sh_word_split
```

ちなみに、本件エラーについては、[+KenSenoo](https://plus.google.com/+KenSenoo/posts)氏が検証に尽力してくださいました。ありがとうございます。

http://myfuturesightforpast.blogspot.jp/2014/07/solve-conflict-of-zsh-zaw-plugin.html

http://myfuturesightforpast.blogspot.jp/2014/07/cannot-exit-zsh-zaw-filter-search-mode.html