zshのbindkeyとprompt


##bindkey

###emacsとvi
####bindkey -s

キーバインドには一括した設定が用意されています。切り替えは、以下の様なキーを設定すると分かりやすいです。

```bash:~/.zshrc
bindkey -sv '^e' 'bindkey -e\n'
 
bindkey -se '^v' 'bindkey -v\n'
```

####bindkey -e,v

個人的には以下のように設定しています。

```bash:~/.zshrc
function airchrome-bindmode-emacs () {
bindkey -e
}
zle -N airchrome-bindmode-emacs
bindkey -v '^e' airchrome-bindmode-emacs
bindkey -a '^e' airchrome-bindmode-emacs
 
function airchrome-bindmode-vi () {
bindkey -v
}
zle -N airchrome-bindmode-vi
bindkey -e '^v' airchrome-bindmode-vi
 
bindkey -v
```

##prompt

###bindkey_mode

しかし、上記では現在どのキーバインドを使用しているのか分かりにくいです。よって、以下のようにプロンプトに表示すると分かりやすいです。



```bash:~/.zshrc
# prompt-bindkey_mode
# http://mba-hack.blogspot.jp/2014/04/zsh.html
function airchrome-bindmode-emacs () {
bindkey -e
EMACS_INSERT=`bindkey -lL main | cut -d ' ' -f 3`
if echo $EMACS_INSERT | grep emacs > /dev/null 2>&1;then
EMACS_INSERT="%K{black}%F{011}⮂%k%f%K{011}%F{034} % $EMACS_INSERT %k%f"
VIM_NORMAL="%K{011}%F{125}⮂%k%f%K{125}%F{015} % NORMAL %k%f%K{125}%F{black}⮂%k%f"
VIM_INSERT="%K{011}%F{075}⮂%k%f%K{075}%F{026} % INSERT %k%f%K{075}%F{black}⮂%k%f"
else
EMACS_INSERT="%K{black}%F{034}⮂%k%f%K{034}%F{011} % $EMACS_INSERT %k%f"
VIM_NORMAL="%K{034}%F{125}⮂%k%f%K{125}%F{015} % NORMAL %k%f%K{125}%F{black}⮂%k%f"
VIM_INSERT="%K{034}%F{075}⮂%k%f%K{075}%F{026} % INSERT %k%f%K{075}%F{black}⮂%k%f"
fi
RPS1="$EMACS_INSERT${${KEYMAP/vicmd/$VIM_NORMAL}/(main|viins)/$VIM_INSERT}"
RPS2=$RPS1
zle reset-prompt
}
zle -N airchrome-bindmode-emacs
bindkey -v '^e' airchrome-bindmode-emacs
bindkey -a '^e' airchrome-bindmode-emacs
 
function airchrome-bindmode-vi () {
bindkey -v
EMACS_INSERT=`bindkey -lL main | cut -d ' ' -f 3`
if echo $EMACS_INSERT | grep emacs > /dev/null 2>&1;then
EMACS_INSERT="%K{black}%F{011}⮂%k%f%K{011}%F{034} % $EMACS_INSERT %k%f"
VIM_NORMAL="%K{011}%F{125}⮂%k%f%K{125}%F{015} % NORMAL %k%f%K{125}%F{black}⮂%k%f"
VIM_INSERT="%K{011}%F{075}⮂%k%f%K{075}%F{026} % INSERT %k%f%K{075}%F{black}⮂%k%f"
else
EMACS_INSERT="%K{black}%F{034}⮂%k%f%K{034}%F{011} % $EMACS_INSERT %k%f"
VIM_NORMAL="%K{034}%F{125}⮂%k%f%K{125}%F{015} % NORMAL %k%f%K{125}%F{black}⮂%k%f"
VIM_INSERT="%K{034}%F{075}⮂%k%f%K{075}%F{026} % INSERT %k%f%K{075}%F{black}⮂%k%f"
fi
RPS1="$EMACS_INSERT${${KEYMAP/vicmd/$VIM_NORMAL}/(main|viins)/$VIM_INSERT}"
RPS2=$RPS1
zle reset-prompt
}
zle -N airchrome-bindmode-vi
bindkey -e '^v' airchrome-bindmode-vi
 
bindkey -v
```

`bindkey -lL main | cut -d ' ' -f 3`で現在のキーバインドを取得してます。

最終行の`bindkey -v`はデフォルト設定です。`-a`はviのノーマルモードです。


####show_buffer_stack


[zshのコマンドラインスタックをプロンプトに表示させる](http://yukirinmk2.hatenablog.com/entry/2013/10/21/175257)

コマンドラインスタックをプロンプトに表示することもできます。

```bash:~/.zshrc
# prompt-show_buffer_stack
# https://gist.github.com/yukirin/7067299
#bindkey "^Q" show_buffer_stack
local p_buffer_stack=""
local -a buffer_stack_arr
 
function make_p_buffer_stack()
{
	if [[ ! $#buffer_stack_arr > 0 ]]; then
		p_buffer_stack=""
		return
	fi
	p_buffer_stack="%F{cyan}<stack:$buffer_stack_arr>%f"
}
 
function show_buffer_stack()
{
	local cmd_str_len=$#LBUFFER
	[[ cmd_str_len > 10 ]] && cmd_str_len=10
	buffer_stack_arr=("[$LBUFFER[1,${cmd_str_len}]]" $buffer_stack_arr)
	make_p_buffer_stack
	zle push-line-or-edit
	zle reset-prompt
}
 
function check_buffer_stack()
{
	[[ $#buffer_stack_arr > 0 ]] && shift buffer_stack_arr
	make_p_buffer_stack
}
 
zle -N show_buffer_stack
bindkey "^Q" show_buffer_stack
add-zsh-hook precmd check_buffer_stack
 
RPROMPT='${p_buffer_stack}'
```

####branch 

記号なども使えます。この辺りは、[vim-powerline](https://powerline.readthedocs.org/en/latest/fontpatching.html)で使われてるものが参考になりますね。

```bash:~/.zshrc
zstyle ':vcs_info:git:*' stagedstr "⇊"
zstyle ':vcs_info:git:*' unstagedstr "⭠"
```


話は変わりますが、最近、vimのステータスラインを[vim-airline](https://github.com/bling/vim-airline)に変更してみました。


```bash:~/.vimrc
let g:airline_theme             = 'powerlineish'
let g:airline_enable_branch     = 1
let g:airline_enable_syntastic  = 1
 
" vim-powerline symbols
let g:airline_left_sep          = '⮀'
let g:airline_left_alt_sep      = '⮁'
let g:airline_right_sep         = '⮂'
let g:airline_right_alt_sep     = '⮃'
let g:airline_branch_prefix     = '⭠'
let g:airline_readonly_symbol   = '⭤'
let g:airline_linecolumn_prefix = '⭡'
let g:airline#extensions#tabline#enabled = 1
```

お勧めのキーバインドがあれば、是非、教えて下さい。