zshの導入から各種設定

tcsh
zsh: Functions Index: P – U

zshのキーバインドで余っているキーを探す - mollifier delta blog
http://www.ayu.ics.keio.ac.jp/~mukai/translate/zshoptions.html
http://journal.mycom.co.jp/column/zsh/index.html
http://journal.mycom.co.jp/column/zsh/001/index.html
http://journal.mycom.co.jp/column/zsh/002/index.html
http://journal.mycom.co.jp/column/zsh/003/index.html
http://journal.mycom.co.jp/column/zsh/004/index.html
http://journal.mycom.co.jp/column/zsh/005/index.html
http://journal.mycom.co.jp/column/zsh/006/index.html

http://memo.officebrook.net/20090205.html

順次追加。

まず、compinit

以下を~/.zshrcに記述する。

autoload -U compinit
compinit

~/.zprofileの使いどころを知る。


ログインシェルとしてzshが起動された場合

1 ~/.zshenv
2 ~/.zprofile
3 ~/.zshrc
4 ~/.zlogin
インタラクティブシェル(ログインシェルとしてではない)としてzshが起動された場合

1 ~/.zshenv
2 ~/.zshrc
シェルスクリプトを実行するコマンドとしてzshが起動された場合

1 ~/.zshenv
ログインシェルとして起動されたzshからログアウトする場合

1 ~/.zlogout

なので、基本的に設定は.zshrcファイルに書いておけばいい。環境変数を設定するなどログイン時に一度だけ実行すればいいような設定だけ.zprofileに書いておく。一時的にzshインタラクティブシェルとして起動するような使い方をする場合はぜんぶ.zshrcに書いておけばいい。

.zshenvはシェルスクリプトコマンドとしてzshを実行する場合にも読み込まれるので、予期せぬ設定をしておくとハマることもある。よくわからなければ使わない方がいいだろう

環境変数は~/.zprofileに書こうと決める。

環境変数LANG

以下を~/.zprofileに記述する。

export LANG=ja_JP.UTF-8

プロンプトの設定

以下、4種類のプロンプトを設定する。

プロンプト名 説明
PROMPT 通常時の
PROMPT2 forやwhileなど複数行入力時の
SPROMPT 入力ミスを確認時の
RPROMPT 右側に表示
デフォルト
 % echo $PROMPT
%m%# 

 % echo $PROMPT2
%_> 

 % echo $SPROMPT
zsh: correct '%R' to '%r' [nyae]? 

 % echo $RPROMPT

何も設定されていない。

変更

PROMPT
RED="%{${fg[red]}%}"
YELLOW="%{${fg[yellow]}%}"
RESET="%{${reset_color}%}"
PROMPT="${RED}%n@%m ${YELLOW}%~ ${RED}%# ${RESET}"


PROMPT2
PROMPT2="${YELLOW} %_ > ${RESET}"


SPROMPT
SPROMPT="${YELLOW} '%r' [nyae] ? "


RPROMPT
RPROMPT="%/"

ターミナルのタイトルに「ユーザ@ホスト:カレントディレクトリ」と表示させる

~/.zshrcに以下を記述する。

case "${TERM}" in
kterm*|xterm*)
    precmd() {
        echo -ne "\033]0;${USER}@${HOST%%.*}:${PWD}\007"
    }
    ;;
esac 

ヒストリ関連の設定をする

~/.zprofileに以下を記載する。

HISTFILE=~/.zhistory
SAVEHIST=100000
HISTSIZE=10000
オプション名 説明
HISTFILE コマンド履歴を保存するファイル名
SAVEHIST 保存されるヒストリーの数
HISTSIZE 記憶されるヒストリー数

以下の内容を~/.zshrcに記載する。

#存在しないヒストリにビープ音
setopt hist_beep
#zshがセッションを終了した順にファイルに追記
#setopt append_history
#各端末でコマンドを実行した順番にヒストリへ記録
setopt inc_append_history
# !を使ったヒストリ展開を行う
setopt bang_hist
#ヒストリ展開を行ったとき、すぐ実行せず、一度読込む
setopt hist_verify
#ヒストリから関数定義を除く
setopt hist_no_functions
#historyコマンドを記録しない
setopt hist_no_store
#行頭スペースコマンドは記録しない
#setopt histignorespace
#同じコマンド続けて実行,重複記録しない
setopt hist_ignore_dups
#ヒストリ内にまったく同じ行、古い削除、新しい記録
setopt hist_ignore_all_dups
#古いヒストリが削除されるとき
#まったく同じ行があればそれを優先して削除
setopt hist_expire_dups_first
#ファイルに書き出すとき古いコマンドと同じなら無視
#setopt hist_save_no_dups
#実行時間も記録
#書式
#:実行時間:経過時間:コマンド
setopt extended_history
#余分な空白を排除して記録
setopt hist_reduce_blanks
#複数の端末でリアルタイムにヒストリを共有
setopt share_history

キーバインド設定をする

以下の内容を~/.zshrcに記載する。

# d default
# e emacs
# v vi
bindkey -d
# シェルの操作はemacsな感じで
# わざわざ記述しておく
bindkey "^A" beginning-of-line                    # 行頭へジャンプ
bindkey "^B" backward-char                        # ←キー
bindkey "^D" delete-char-or-list                  # deleteキー カーソル上の文字を削除
bindkey "^E" end-of-line                          # 行末へジャンプ
bindkey "^F" forward-char                         # →キー
bindkey "^G" send-break                           # コマンド入力を実行せずに無視して次の行へ 
bindkey "^H" backward-char                        # ←キー
bindkey "^I" expand-or-complete                   # 展開または補完
#bindkey "^J" accept-line                         # screen用に使用
bindkey "^K" kill-line                            # カーソルから行末までを削除
bindkey "^L" clear-screen                         # クリアスクリーン
bindkey "^M" accept-line                          # コマンド行のコマンドを実行 Enterの代わりに
#bindkey "^O" accept-line-and-down-history        # 使い(どころ|かた)が分からない
#bindkey "^Q" push-line                           # 使い(どころ|かた)が分からない
bindkey "^R" history-incremental-search-backward  # インクリメンタルサーチ
bindkey "^S" history-incremental-search-forward   # インクリメンタルサーチ
#bindkey "^T" transpose-chars                     # 文字の順番を入れ替える
bindkey "^U" kill-whole-line                      # 一行削除
#bindkey "^V" quoted-insert                       # 文字を挿入 使う必要性がないと思う
bindkey "^W" backward-kill-word                   # カーソルから行頭までを削除

bindkey "^N" history-beginning-search-forward     # 超絶に使う
bindkey "^P" history-beginning-search-backward    # 超絶に使う


http://journal.mycom.co.jp/column/zsh/004/index.html
記載されている以下の内容がよく分からず、調べる。

autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end 

autoloadのオプション「-U」については以下のリンク先で分かったつもり。
http://blog.livedoor.jp/miya_k_/archives/206513.html
http://blog.livedoor.jp/miya_k_/archives/227129.html
http://blog.livedoor.jp/miya_k_/archives/232122.html
「-z」と「-k」についてはよく分からない。


zleがよく分からずに、twitterで呟いていたらid:hijouguchiさんが助けてくれる。しかし、まだ微妙。
rdera on Twitter: "zshの「zle -N」ってのが分からなくて、調べてる。"
hijouguchi on Twitter: "@rdera zle -N hoge でhogeという名前のシェル関数から同名のzleウィジェットを作成するみたいです。"
hijouguchi on Twitter: "@rdera 何て説明していいのかちょっと悩みますが、ちょっとしたコマンドみたいなものですかね。 「man zstyle」で・"
保留して、先に進む。

ディレクトリ関連の設定

以下の内容を~/.zshrcに記載する。

#####ディレクトリ関連#####
#cd省略でディレクトリ移動
setopt auto_cd
# ~を必要せずに移動
#setopt cdable_vars
#特に必要がないかと
unsetopt cdable_vars
#cdコマンドでディレクトリスタックに保存
setopt auto_pushd
#ディレクトリスタックに重複して記録しない
setopt pushd_ignore_dups
#移動先がシンボリックリンクならば実際のディレクトリに移動する
setopt chase_links
#パスに..が含まれる シンボリックリンクではなく実際のディレクトリに移動
setopt chase_dots
#引数なしでpushdするとpushd $HOMEとして実行
setopt pushd_to_home

コマンドのスペル訂正関連の設定

以下の設定を~/.zshrcに記載する。

#コマンドのスペル訂正をしてくれる
# y 訂正コマンドを実行
# n 入力したコマンドが実行
# a 実行を中断 abort
# e コマンドライン編集 edit
setopt correct
#引数についてもスペル訂正を試みる
#それは面倒なことになるかも nocorrectをコマンド前
#setopt correct_all
unsetopt correct_all
#スペル訂正時にDVORAK配列を前提にする
#setopt dvorak
unsetopt dvorak

補完関係の設定

以下の設定を~/.zshrcに記載する。

#####補完関係#####
#補完のときプロンプトの位置を変えない
setopt always_last_prompt
#補完候補が複数あるとき自動でメニューをリストアップ
setopt auto_list
#補完要求に対してメニューをリストアップ
setopt auto_menu
#補完候補を詰めて表示する
setopt list_packed
#補完の表示を水平方向に
setopt list_rows_first
#補完候補の表示を親切に ls -F
# /がディレクトリ
# @がシンボリックリンク
setopt list_types
# tabキーの節約
setopt menu_complete
#エイリアスに対して別の補完定義を telnet tt
#setopt complete_aliases
setopt no_complete_aliases
#ディレクトリ 補完 /を付与
setopt auto_param_slash
#スペースで /を削除
setopt auto_remove_slash
#よく分からない
setopt auto_name_dirs
#補完候補表示時にビープ音をならさない
setopt nolistbeep

ユーザ毎の設定を行う

以下を~/.zshrcに記載する。

#ユーザ毎の設定を行う
case ${UID} in
  0)                 #rootユーザの場合

  ;;  
  *)                 #一般ユーザの場合

  ;;  
esac

実験的な内容を記述したファイルを読み込む方法

以下を~/.zshrcに記載する。

#実験的な設定をに書き込んでおく
[ -f ~/.zshrc.lab ] && source ~/.zshrc.lab


追記していきます。