【コラム】

漢のzsh

24 グッバイ野郎ども! コピペではじめるzshファイナル

    後藤大地  [2009/03/17]

    1年半ぶりの連載再開でいきなり最終回、というやや乱暴な展開だが、後は読者諸兄の自己研鑽に期待したい。どんどんコピペしてzshの力を満喫してくれ!

    こいつを${HOME}/.zshrcにコピーだ!

    そのまま使えるコピペシリーズ第3弾をお届けしたい。本連載第10回第22回でそのまま${HOME}/.zshrcにコピーすれば使える設定ファイルを紹介した。あれから1年半、zshはマイナーリリースを重ね当時とほぼ変わらない機能を提供している。"Z"の名にふさわしい鎮座ぶりだ。その間漢の設定ファイルも微調整を繰り返してきた。というわけでこれが最後だ。もってけ野郎ども!

    リスト1 コピー&ペースト対応${HOME}/.zshrc ファイル - FreeBSD/Mac OS X/Ubuntsu対応版

    # users generic .zshrc file for zsh(1)
    
    ## Environment variable configuration
    #
    # LANG
    #
    export LANG=ja_JP.UTF-8
    case ${UID} in
    0)
        LANG=C
        ;;
    esac
    
    
    ## Default shell configuration
    #
    # set prompt
    #
    autoload colors
    colors
    case ${UID} in
    0)
        PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') %B%{${fg[red]}%}%/#%{${reset_color}%}%b "
        PROMPT2="%B%{${fg[red]}%}%_#%{${reset_color}%}%b "
        SPROMPT="%B%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
        ;;
    *)
        PROMPT="%{${fg[red]}%}%/%%%{${reset_color}%} "
        PROMPT2="%{${fg[red]}%}%_%%%{${reset_color}%} "
        SPROMPT="%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%} "
        [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
            PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') ${PROMPT}"
        ;;
    esac
    
    # auto change directory
    #
    setopt auto_cd
    
    # auto directory pushd that you can get dirs list by cd -[tab]
    #
    setopt auto_pushd
    
    # command correct edition before each completion attempt
    #
    setopt correct
    
    # compacked complete list display
    #
    setopt list_packed
    
    # no remove postfix slash of command line
    #
    setopt noautoremoveslash
    
    # no beep sound when complete list displayed
    #
    setopt nolistbeep
    
    
    ## Keybind configuration
    #
    # emacs like keybind (e.x. Ctrl-a gets to line head and Ctrl-e gets
    #   to end) and something additions
    #
    bindkey -e
    bindkey "^[[1~" beginning-of-line # Home gets to line head
    bindkey "^[[4~" end-of-line # End gets to line end
    bindkey "^[[3~" delete-char # Del
    
    # historical backward/forward search with linehead string binded to ^P/^N
    #
    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
    bindkey "\\ep" history-beginning-search-backward-end
    bindkey "\\en" history-beginning-search-forward-end
    
    # reverse menu completion binded to Shift-Tab
    #
    bindkey "\e[Z" reverse-menu-complete
    
    
    ## Command history configuration
    #
    HISTFILE=${HOME}/.zsh_history
    HISTSIZE=50000
    SAVEHIST=50000
    setopt hist_ignore_dups     # ignore duplication command history list
    setopt share_history        # share command history data
    
    
    ## Completion configuration
    #
    fpath=(${HOME}/.zsh/functions/Completion ${fpath})
    autoload -U compinit
    compinit
    
    
    ## zsh editor
    #
    autoload zed
    
    
    ## Prediction configuration
    #
    #autoload predict-on
    #predict-off
    
    
    ## Alias configuration
    #
    # expand aliases before completing
    #
    setopt complete_aliases     # aliased ls needs if file/dir completions work
    
    alias where="command -v"
    alias j="jobs -l"
    
    case "${OSTYPE}" in
    freebsd*|darwin*)
        alias ls="ls -G -w"
        ;;
    linux*)
        alias ls="ls --color"
        ;;
    esac
    
    alias la="ls -a"
    alias lf="ls -F"
    alias ll="ls -l"
    
    alias du="du -h"
    alias df="df -h"
    
    alias su="su -l"
    
    
    ## terminal configuration
    #
    case "${TERM}" in
    screen)
        TERM=xterm
        ;;
    esac
    
    case "${TERM}" in
    xterm|xterm-color)
        export LSCOLORS=exfxcxdxbxegedabagacad
        export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
        zstyle ':completion:*' list-colors 'di=34' 'ln=35' 'so=32' 'ex=31' 'bd=46;34' 'cd=43;34'
        ;;
    kterm-color)
        stty erase '^H'
        export LSCOLORS=exfxcxdxbxegedabagacad
        export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
        zstyle ':completion:*' list-colors 'di=34' 'ln=35' 'so=32' 'ex=31' 'bd=46;34' 'cd=43;34'
        ;;
    kterm)
        stty erase '^H'
        ;;
    cons25)
        unset LANG
        export LSCOLORS=ExFxCxdxBxegedabagacad
        export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
        zstyle ':completion:*' list-colors 'di=;34;1' 'ln=;35;1' 'so=;32;1' 'ex=31;1' 'bd=46;34' 'cd=43;34'
        ;;
    jfbterm-color)
        export LSCOLORS=gxFxCxdxBxegedabagacad
        export LS_COLORS='di=01;36:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
        zstyle ':completion:*' list-colors 'di=;36;1' 'ln=;35;1' 'so=;32;1' 'ex=31;1' 'bd=46;34' 'cd=43;34'
        ;;
    esac
    
    # set terminal title including current directory
    #
    case "${TERM}" in
    xterm|xterm-color|kterm|kterm-color)
        precmd() {
            echo -ne "\033]0;${USER}@${HOST%%.*}:${PWD}\007"
        }
        ;;
    esac
    
    
    ## load user .zshrc configuration file
    #
    [ -f ${HOME}/.zshrc.mine ] && source ${HOME}/.zshrc.mine
    

    対応するOSはUbuntu 8.10、FreeBSD 8/7/6、Mac OS X Tiger/Leopardだ。第10回第22回にそれぞれ設定の説明があるので興味がある野郎どもは読んでみてほしい。コピペしてとりあえず使ってみるのもまたよしだ。第22回からいくつか変更されたところがある。次に主な変更点を説明しておく。

    環境変数LANG

    以前はrootユーザも一般ユーザも環境変数LANGにja_JP.UTF-8を設定していた。しかしrootユーザでLANG=ja_JP.UTF-8だとアプリケーションのビルドやコマンドの実行などで都合が悪いケースがあり、rootユーザの場合はLANG=Cが設定されるように変更した。

    リスト2 rootユーザはLANG=Cが、それ以外のユーザはLANG=ja_JP.UTF-8が設定される

    export LANG=ja_JP.UTF-8
    case ${UID} in
    0)
        LANG=C
        ;;
    esac
    

    プロンプト

    従来の設定ではsshでリモートログインしている場合にホスト名がプロンプトに表示するようになっていた。第22回ではさらにホスト名がわかりやすいように大文字で表示するように変更した。今回はrootユーザの場合にはリモートログインであるかそうでないかに関わらずホスト名をプロンプトを表示するように変更した。

    リスト3 rootユーザの場合、ホスト名をプロンプトにデフォルトで表示する

    case ${UID} in
    0)
        PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') %B%{${fg[red]}%}%/#%{${reset_color}%}%b "
        PROMPT2="%B%{${fg[red]}%}%_#%{${reset_color}%}%b "
        SPROMPT="%B%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
        ;;
    *)
    (snip)
    esac
    

    判定に使っている環境変数が、sshでログインした状態でsu(1)した場合には引き継がれないためプロンプトにホスト名が表示されない。このため、sshでログインしてsu(1)した場合にローカルホストのプロンプトだと勘違いして作業するという問題があった。rootユーザの場合常にホスト名をプロンプトに表示するように変更することでこの問題に対処した。

    コマンド履歴

    従来はコマンド履歴の保持数を10,000に設定してあった。これは生ぬるかったと言わざるを得ない。反省を活かし、50,000へ増やした。

    リスト4 コマンド履歴を1万から5万へ増加

    HISTSIZE=50000
    SAVEHIST=50000
    

    ターミナル/コンソール

    ターミナルやコンソールの設定部分を見直し、従来よりもターミナルやコンソールの対応設定の追加がおこないやすいように変更した。対応させたいターミナルがある場合、該当部分をコピー&ペーストして内容を書き換えればいい。screen(1)への対応ロジックを試した時期もあったが、screen(1)の動作に対応した処理を加えると設定が複雑になるうえに状況を判定できないパターンがあり、逆効果だと判断した。screen(1)と併用する場合には自分でTERMを設定してから${HOME}/.zshrcをもう一度読み込めばいい。

    グッバイ野郎ども!

    本連載「漢のzsh」は2007年2月8日に開始された。もう2年前の話になる。この2年間でWebアプリケーションやモバイルアプリケーションは大きな躍進を遂げた。ネットワークを経由して活用するツールsshは活躍のシーンを広げ、それを支えるUIとしてzshの位置も揺るぎない。 しかしながらzshのブラウザ版ともいえるかもしれないUbiquityが登場するなど、状況はめまぐるしい早さで変わっている。

    こうした状況を鑑み、本連載は当初の目的を果たしたと判断した。野郎どもにとってzshはもはや日常欠かすことができないシェルだと信じている。これからはzshを使って新しい日常を生み出していってほしい。グッバイ、野郎ども!

    新着記事

    特設サイトの情報

      求人情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      転職ノウハウ

      あなたの仕事適性診断

      4つの診断で、自分の適性を見つめなおそう!

      Heroes File ~挑戦者たち~

      働くこと・挑戦し続けることへの思いを綴ったインタビュー

      はじめての転職診断

      あなたにピッタリのアドバイスを読むことができます。

      転職Q&A

      転職に必要な情報が収集できます

      スカウト転職する

      企業からアプローチのメッセージが届きます。

      マイナビニュースマガジン