zshとscreenの設定

毎日似たような操作を繰り返しているけど、
少しでも早くすれば積み重なって莫大な時間へ。
zshとscreenの組み合わせで効率アップ。

設定はパクリのパクリですが、晒しておきます。

  • .screenrc
# prefix キーの設定 Ctrl + t
escape ^Tt

# onにすると、ビープを鳴らすときに錫際に音を鳴らさず、下のメッセージ領域にメッセージを表示させる。
vbell on

# 最終行にウィンドウ一覧を表示
hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w"
# ステータスラインの表示。
defhstatus I^En:^EtI

# offにするとスタートアップ画面を表示させなくする。
startup_message off

# onにしておくとscreenがいきなりお亡くなりになられても、その時のプロセスは生きて残る
autodetach on

# ログを設定
logfile "/home/syudou/log/screen-%Y%m%d-%n.log"
log on
deflog on

# スクリーンセーバー
idle 1200
blankerprg /usr/games/fortune

# bind 設定
bind w windowlist -b
bind -c REGION 2 split
bind -c REGION 1 only
bind -c REGION 0 remove
bind -c REGION o focus
bind -c REGION ^ resize
bind l command -c REGION

# 不明
shell -$SHELL

.zshrc

autoload -U compinit; compinit
export PATH=$PATH:/usr/sbin:~/bin
export HOSTNAME=hostname
alias ls='ls --color=auto'
alias su='sudo su -s /bin/zsh'
alias -g L="| lv"
alias -g G="| grep"


HISTSIZE=5000
PROMPT='%{^[[39m%}%U$USER%{@^[[33m%}%m%{::^[[32m%}%~%%^[[m%}%u'

zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \
                             /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin

#=============================================================#
# 履歴
HISTFILE=~/.zsh-history
HISTSIZE=1000000
SAVEHIST=1000000

# 複数の zsh を同時に使う時など history ファイルに上書きせず追加する
setopt append_history

# zsh の開始・終了時刻をヒストリファイルに書き込む
setopt extended_history

# 直前と同じコマンドラインはヒストリに追加しない
setopt hist_ignore_dups

# コマンドラインの先頭がスペースで始まる場合ヒストリに追加しない
setopt hist_ignore_space

# シェルのプロセスごとに履歴を共有
setopt share_history

# history (fc -l) コマンドをヒストリリストから取り除く。
setopt hist_no_store

# ヒストリを呼び出してから実行する間に一旦編集できる状態になる
setopt hist_verify

#=============================================================#


# 指定したコマンド名がなく、ディレクトリ名と一致した場合 cd する
#setopt auto_cd

# 補完候補が複数ある時に、一覧表示する
setopt auto_list

# 補完キー(Tab, Ctrl+I) を連打するだけで順に補完候補を自動で補完する
#setopt auto_menu

# カッコの対応などを自動的に補完する
setopt auto_param_keys

# ディレクトリ名の補完で末尾の / を自動的に付加し、次の補完に備える
setopt auto_param_slash

# 最後がディレクトリ名で終わっている場合末尾の / を自動的に取り除く
#setopt auto_remove_slash

# サスペンド中のプロセスと同じコマンド名を実行した場合はリジュームする
setopt auto_resume

# ビープ音を鳴らさないようにする
setopt NO_beep

# {a-c} を a b c に展開する機能を使えるようにする
setopt brace_ccl

# 内部コマンドの echo を BSD 互換にする
#setopt bsd_echo

# シンボリックリンクは実体を追うようになる
#setopt chase_links

# 既存のファイルを上書きしないようにする
#setopt clobber

# コマンドのスペルチェックをする
#setopt correct

# コマンドライン全てのスペルチェックをする
#setopt correct_all

# =command を command のパス名に展開する
setopt equals

# ファイル名で #, ~, ^ の 3 文字を正規表現として扱う
#setopt extended_glob

# Ctrl+S/Ctrl+Q によるフロー制御を使わないようにする
setopt NO_flow_control

# 各コマンドが実行されるときにパスをハッシュに入れる
#setopt hash_cmds

# シェルが終了しても裏ジョブに HUP シグナルを送らないようにする
setopt NO_hup

# Ctrl+D では終了しないようになる(exit, logout などを使う)
setopt ignore_eof

# コマンドラインでも # 以降をコメントと見なす
setopt interactive_comments

# auto_list の補完候補一覧で、ls -F のようにファイルの種別をマーク表示
setopt list_types

# 内部コマンド jobs の出力をデフォルトで jobs -l にする
setopt long_list_jobs

# コマンドラインの引数で --prefix=/usr などの = 以降でも補完できる
setopt magic_equal_subst

# メールスプール $MAIL が読まれていたらワーニングを表示する
#setopt mail_warning

# ファイル名の展開でディレクトリにマッチした場合末尾に / を付加する
setopt mark_dirs

# 補完候補が複数ある時、一覧表示 (auto_list) せず、すぐに最初の候補を補完する
#setopt menu_complete

# 複数のリダイレクトやパイプなど、必要に応じて tee や cat の機能が使われる
setopt multios

# ファイル名の展開で、辞書順ではなく数値的にソートされるようになる
#setopt numeric_glob_sort

# コマンド名に / が含まれているとき PATH 中のサブディレクトリを探す
#setopt path_dirs

# 8 ビット目を通すようになり、日本語のファイル名などを見れるようになる
setopt print_eightbit

# 戻り値が 0 以外の場合終了コードを表示する
#setopt print_exit_value

# ディレクトリスタックに同じディレクトリを追加しないようになる
#setopt pushd_ignore_dups

# pushd を引数なしで実行した場合 pushd $HOME と見なされる
#setopt pushd_to_home

# rm * などの際、本当に全てのファイルを消して良いかの確認しないようになる
#setopt rm_star_silent

# rm_star_silent の逆で、10 秒間反応しなくなり、頭を冷ます時間が与えられる
#setopt rm_star_wait

# for, repeat, select, if, function などで簡略文法が使えるようになる
setopt short_loops

# デフォルトの複数行コマンドライン編集ではなく、1行編集モードになる
#setopt single_line_zle

# コマンドラインがどのように展開され実行されたかを表示するようになる
#setopt xtrace

# 色を使う
setopt prompt_subst

# 文字列末尾に改行コードが無い場合でも表示する
unsetopt promptcr

#コピペの時rpromptを非表示する
setopt transient_rprompt

# cd -[tab] でpushd
#setopt autopushd

# keychainの設定
keychain ~/.ssh/id_rsa
. ~/.keychain/$HOSTNAME-sh

# スクリーン上から補完する。Ctrl + o
HARDCOPYFILE=$HOME/tmp/screen-hardcopy
touch $HARDCOPYFILE

dabbrev-complete () {
        local reply lines=80 # 80行分
        screen -X eval "hardcopy -h $HARDCOPYFILE"
        reply=($(sed '/^$/d' $HARDCOPYFILE | sed '$ d' | tail -$lines))
        compadd - "${reply[@]%[*/=@|]}"
}

zle -C dabbrev-complete menu-complete dabbrev-complete
bindkey '^o' dabbrev-complete
bindkey '^o^_' reverse-menu-complete


# SSHコマンドはscreenの新しい窓で
function ssh_screen(){
 eval server=\${$#}
 screen -t $server ssh "$@"
}
if [ x$TERM = xscreen ]; then
  alias ssh=ssh_screen
fi

# 最後に打ったコマンドステータス行に
if [ "$TERM" = "screen" ]; then
        chpwd () { echo -n "^[_`dirs`^[\\" }
        preexec() {
                # see [zsh-workers:13180]
                # http://www.zsh.org/mla/workers/2000/msg03993.html
                emulate -L zsh
                local -a cmd; cmd=(${(z)2})
                case $cmd[1] in
                        fg)
                                if *1; then
                                        cmd=(builtin jobs -l %+)
                                else
                                        cmd=(builtin jobs -l $cmd[2])
                                fi
                                ;;
                        %*)
                                cmd=(builtin jobs -l $cmd[1])
                                ;;
                        cd)
                                if *2; then
                                        cmd[1]=$cmd[2]
                                fi
                                ;&
                        *)
                                echo -n "^[k$cmd[1]:t^[\\"
                                return
                                ;;
                esac

                local -A jt; jt=(${(kv)jobtexts})

                $cmd >>(read num rest
                        cmd=(${(z)${(e):-\$jt$num}})
                        echo -n "^[k$cmd[1]:t^[\\") 2>/dev/null
        }
        chpwd
fi

例によって、コピペする場合は

^[

のところが制御文字ですので、viの場合 Ctrl v + Esc で入力しなおしてください。

*1: $#cmd == 1

*2: $#cmd == 2