zsh設定

Mac OS Xのクリーンインストールをしたついでにzsh環境を1から整理しているのでメモ。

作業メモです。固まったら整理します。

zshの基本設定

Preztoにお任せ。

$ zsh
$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

$ setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
$ chsh -s /bin/zsh

Gitブランチ表示

.zpreztorcを編集

zstyle ':prezto:load' pmodule \  
'environment' \
'terminal' \
'editor' \
'history' \
'directory' \
'spectrum' \
'utility' \
'completion' \
'git' \ #追加
'prompt'

percol

pecoにしようとも思ったけど変更せず。

sudo pip install percol

Emacsライクなキーバインドが使えるように設定

$HOME/.percol.d/rc.pyに追記。

percol.import_keymap({
"C-h" : lambda percol: percol.command.delete_backward_char(),
"C-d" : lambda percol: percol.command.delete_forward_char(),
"C-k" : lambda percol: percol.command.kill_end_of_line(),
"C-y" : lambda percol: percol.command.yank(),
"C-a" : lambda percol: percol.command.beginning_of_line(),
"C-e" : lambda percol: percol.command.end_of_line(),
"C-b" : lambda percol: percol.command.backward_char(),
"C-f" : lambda percol: percol.command.forward_char(),
"C-n" : lambda percol: percol.command.select_next(),
"C-p" : lambda percol: percol.command.select_previous(),
"C-v" : lambda percol: percol.command.select_next_page(),
"M-v" : lambda percol: percol.command.select_previous_page(),
"M-<" : lambda percol: percol.command.select_top(),
"M->" : lambda percol: percol.command.select_bottom(),
"C-m" : lambda percol: percol.finish(),
"C-j" : lambda percol: percol.finish(),
"C-g" : lambda percol: percol.cancel(),
})

zshのコマンド履歴をpercolで絞り込む

.zshrcに追記。
Ctrl+Rでコマンド履歴が検索できて便利。

function exists { which $1 &> /dev/null }

if exists percol; then
function percol_select_history() {
local tac
exists gtac && tac="gtac" || { exists tac && tac="tac" || { tac="tail -r" } }
BUFFER=$(history -n 1 | eval $tac | percol --query "$LBUFFER")
CURSOR=$#BUFFER # move cursor
zle -R -c # refresh
}

zle -N percol_select_history
bindkey '^R' percol_select_history
fi

参考:404 Engineer Logs -ライフチェンジングなpercolとautojumpの紹介

ディレクトリチェンジ

これまでautojumpを使っていたけどpercolにお任せすることにしました。

# cd 履歴を記録
typeset -U chpwd_functions
CD_HISTORY_FILE=${HOME}/.cd_history_file # cd 履歴の記録先ファイル
function chpwd_record_history() {
echo $PWD >> ${CD_HISTORY_FILE}
}
chpwd_functions=($chpwd_functions chpwd_record_history)

# percol を使って cd 履歴の中からディレクトリを選択
# 過去の訪問回数が多いほど選択候補の上に来る
function percol_get_destination_from_history() {
sort ${CD_HISTORY_FILE} | uniq -c | sort -r | \
sed -e 's/^[ ]*[0-9]*[ ]*//' | \
sed -e s"/^${HOME//\//\\/}/~/" | \
percol | xargs echo
}

# percol を使って cd 履歴の中からディレクトリを選択し cd するウィジェット
function percol_cd_history() {
local destination=$(percol_get_destination_from_history)
[ -n $destination ] && cd ${destination/#\~/${HOME}}
zle reset-prompt
}
zle -N percol_cd_history

# percol を使って cd 履歴の中からディレクトリを選択し,現在のカーソル位置に挿入するウィジェット
function percol_insert_history() {
local destination=$(percol_get_destination_from_history)
if [ $? -eq 0 ]; then
local new_left="${LBUFFER} ${destination} "
BUFFER=${new_left}${RBUFFER}
CURSOR=${#new_left}
fi
zle reset-prompt
}
zle -N percol_insert_history

# C-j C-j でディレクトリに cd
# C-j C-i でディレクトリを挿入
bindkey '^j^j' percol_cd_history
bindkey '^j^i' percol_insert_history

参考:Slip Ahead Logging - percol で z / autojump のようにディレクトリ高速ジャンプ

ショートカット追加