【コラム】

漢のzsh

22 もってけ泥棒! コピペで始めるzsh - リターンズ

    後藤大地  [2007/08/01]

    こいつを~/.zshrcにコピーだ

    今回は、そのまま使えるコピペシリーズ第2弾をお送りする。本連載の第10回目でそのまま~/.zshrcにコピーすれば使える設定ファイルを紹介したが、これが好評だった。とりあえず、読者の皆さんはコピペしてzshの世界を堪能したらしい。あれからいくらかの変更や設定追加を行ったので、その最新版を公開しよう。というわけで、持ってけ!! 野郎どもっ!!!

    リスト1.1 コピー&ペースト対応 ~/.zshrc ファイル - LInux/FreeBSD/Mac OS X 対応版

    
    # users generic .zshrc file for zsh(1)
    
    ## Environment variable configuration
    #
    # LANG
    #
    export LANG=ja_JP.UTF-8
    
    
    ## Default shell configuration
    #
    # set prompt
    #
    autoload colors
    colors
    case ${UID} in
    0)
        PROMPT="%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 "
        [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
            PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') ${PROMPT}"
        ;;
    *)
        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 goes to head of a line and Ctrl-e goes 
    #   to end of it)
    #
    bindkey -e
    
    # 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
    
    
    ## Command history configuration
    #
    HISTFILE=~/.zsh_history
    HISTSIZE=10000
    SAVEHIST=10000
    setopt hist_ignore_dups     # ignore duplication command history list
    setopt share_history        # share command history data
    
    
    ## Completion configuration
    #
    fpath=(~/.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"
    
    case "${OSTYPE}" in
    darwin*)
        alias updateports="sudo port selfupdate; sudo port outdated"
        alias portupgrade="sudo port upgrade installed"
        ;;
    freebsd*)
        case ${UID} in
        0)
            updateports() 
            {
                if [ -f /usr/ports/.portsnap.INDEX ]
                then
                    portsnap fetch update
                else
                    portsnap fetch extract update
                fi
                (cd /usr/ports/; make index)
    
                portversion -v -l \<
            }
            alias appsupgrade='pkgdb -F && BATCH=YES NO_CHECKSUM=YES portupgrade -a'
            ;;
        esac
        ;;
    esac
    
    
    ## terminal configuration
    #
    unset LSCOLORS
    case "${TERM}" in
    xterm)
        export TERM=xterm-color
        ;;
    kterm)
        export TERM=kterm-color
        # set BackSpace control character
        stty erase
        ;;
    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'
        ;;
    esac
    
    # set terminal title including current directory
    #
    case "${TERM}" in
    kterm*|xterm*)
        precmd() {
            echo -ne "\033]0;${USER}@${HOST%%.*}:${PWD}\007"
        }
        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'
        ;;
    esac
    
    
    ## load user .zshrc configuration file
    #
    [ -f ~/.zshrc.mine ] && source ~/.zshrc.mine
    

    対応するOSはLinux、FreeBSD、Mac OS Xだ。動作はそれぞれUbuntu 7.04 (zsh 4.3.2)、FreeBSD-current/stable (zsh 4.3.2)、OS X 10.4.10 Tiger(zsh 4.2.3)で確認してある。本連載の第10回目に設定ファイルの説明があるので、興味がある野郎どもは読んでみてほしい。コピペしてとりあえず使ってみるのもまたよしだ。変更されたところがあるので、以下では第10回目で紹介した設定ファイルから変更されたところを説明しておく。

    リモートログイン時における色の変更 : OSXでの不具合に対応

    リスト2.1を見て欲しい。

    リスト2.1 リモートログイン時のホスト名のカラーを変更 - 文字も大文字へ変更

    
     [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
            PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') ${PROMPT}"
    

    本連載の第10回目で公開した設定ファイルでは、リモートログインしたときに表示されるプロンプトのホスト名の部分が真っ白でなにも表示されないという問題があることが分かった。Mac OS Xのターミナルで色としてwhiteを指定するとまったく見えなくなるようだ。そのため、色を変更しておいた。それぞれ図2.1~図2.3のような色で表示される。

    図2.1 リモートログインした場合のプロンプト - gnome-terminal + zsh 4.3.2 on FreeBSD-current

    図2.2 リモートログインした場合のプロンプト - gnome-terminal + zsh 4.3.2 on Ubuntu 7.04

    図2.3 リモートログインした場合のプロンプト - ターミナル + zsh 4.2.3 on Mac OS X 10.4.10

    それから、リモートログインしているプロンプトをローカルプロンプトと間違えて作業することがあるので、ホスト名を大文字で表示して強調するようにした。

    zshエディタのロード

    リスト3.1を見て欲しい。

    リスト3.1 zshで作成されたエディタzedを読み込む設定を追加

    
    ## zsh editor
    #
    autoload zed
    

    本連載の第11回目でzshで実装されたエディタであるzedを紹介したが、今回、このエディタ関数をデフォルトで読み込むように設定に追加した。デフォルトで読み込まれる関数を表示したり、簡単な関数を作成する場合に便利なツールなので、読み込んでおいて損はないというわけだ。

    コマンド補完ファイルを設置するパス設定

    次にリスト4.1を見てみよう。

    リスト4.1 コマンド補完ファイルを置いておくディレクトリを指定 : /.zsh/functions/Completion/ ここに置いておけばいい

    
    ## Completion configuration
    #
    fpath=(~/.zsh/functions/Completion ${fpath})
    autoload -U compinit
    compinit
    

    コマンド補完ファイルは指定したディレクトリに置いておくことで、シェル起動時に自動的に読み込まれるようになる。その設定を追加しておいた。ここではzshのデフォルトのディレクトリツリーを真似して~/.zsh/functions/Completion/に置けばいいようになっている。パスは好みで変えてみればよいだろう。

    コマンド補完設定で便利なものが溜まってきたらどうやって公開しようか考えているわけだが……。コピペして完了させたいので、公開するときは1つのファイルにまとめてしまおうかとも考えている。

    OSごとの設定、エイリアスと関数の使い分けのサンプルとか

    設定のサンプルとしてリスト5.1も含めてある。

    リスト5.1 Mac OS XとFreeBSDでの設定例など

    
    case "${OSTYPE}" in
    darwin*)
        alias updateports="sudo port selfupdate; sudo port outdated"
        alias portupgrade="sudo port upgrade installed"
        ;;
    freebsd*)
        case ${UID} in
        0)
            updateports() 
            {
                if [ -f /usr/ports/.portsnap.INDEX ]
                then
                    portsnap fetch update
                else
                    portsnap fetch extract update
                fi
                (cd /usr/ports/; make index)
    
                portversion -v -l \<
            }
            alias appsupgrade='pkgdb -F && BATCH=YES NO_CHECKSUM=YES portupgrade -a'
            ;;
        esac
        ;;
    esac
    

    OSTYPE変数でOSごとに処理の振り分け、UID変数で管理者ユーザと一般ユーザごとに処理を分岐、短い処理はエイリアスでコマンド化、長い処理は関数でコマンド化といったところだ。Mac OS Xの場合、ユーザで振り分けるのではなくsudoコマンドを使うようにしてある。Mac OS Xの方はMacPortsを使ってアプリケーションを更新する用のショートカットで、FreeBSDの方はPorts Collectionを使ってアプリケーションを更新する用のショートカットだ。OSを混在させる場合の基本的な処理方法なので、何かの参考にしてもらえればと幸いである。

    それでは、Let's enjoy zsh !!

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

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