zsh 関連

ファイルの構成

ファイルの内容

zsh は, 設定内容が多岐にわたり, 1 つのファイルに全てをまとめてしまおうとするとメンテナンスが大変なので, ある程度ファイルを分割してしまいます. なお, zsh そのものが本当に呼び出すファイルは, .zshenv と .zshrc (ログインシェルならば, .zprofile も) だけですが, .zshrc 内で source コマンドを使うことによって, 残りの設定ファイルを読み出します.

まずは, mkdir コマンドで, ホームディレクトリの直下に .zsh ディレクトリを作り, そこに移動します. 次に, .zaliases, .zcompctl, .zprofile, .zshenv, .zshrc の 5 つの設定ファイルを作ります (この時点では, 空のファイルでも問題ありません.). 最後に, ホームディレクトリに移り, .zsh/.zshenv に向けてのシンボリックリンクを貼ります (ln -s .zsh/.zshenv .).

いよいよ, ファイルの内容を記述していきます. まずは, .zshenv からです.

# -*- mode:shell-script -*-

ZDOTDIR=$HOME/.zsh

export ZDOTDIR

.zprofile に関しては, 特に記述する事が無いので, 空のままでいいです.

次は, .zaliases です. less 関連のエイリアスは, 必要なくなりました. less の不調の原因は, $HOME/.termcap というファイルが原因でした.

alias ls='ls --show-control-chars --color=auto -F'
alias rm='rm -i'
alias clear="echo -n '\033(B\003[H\033[J' ; clear"
alias less="TERM=linux less"
alias man="TERM=linux man"

次は, zsh の真骨頂といえる, 補間ルールを記述したファイル, .zcompctl です. このファイルの設定次第で, zsh の使い心地が全然変わってしまうので, 以下のサンプルを丸写しせずに, man をみたり, いろいろな情報を探してみましょう. なお, 日本語でコメントを書きたい場合は, 文字コードを EUC-JP にしておきます.

# -*- mode:shell-script -*-

#echo -n ".zcompctl "

# Argument for limit/unlimit
limitargs=(
addressspace aiomemorylocked aiooperations cachedthreads coredumpsize
cputime datasize descriptors filesize maxproc maxpthreads memorylocked
memoryuse resident sockbufsize stacksize vmemorysize
)

# Argument for cvs
cvs_option=( 
add admin annotate checkout commit diff edit editors export history 
import init log login logout rdiff release remove rtag status tag 
unedit update watch watchers 
) 

# Argument for network
hosts=(
localhost 127.0.0.1
)

urls=(
www.google.com www.google.co.jp www.yahoo.com www.yahoo.co.jp
)

# Environment

compctl -c man w3mman which # Interpolation list for command name
compctl -l '' nice exec screen # Interpolation for cmd arg1 arg2 ...
compctl -E printenv setenv
compctl -v -E vared unset  # シェル変数、環境変数


# Graphic Tools

compctl -g '*.obj' + -g '(|.)*(-/)' tgif
compctl -g '*.png' + -g '(|.)*(-/)' pngtopnm
#  Netpbm Tools
compctl -g '*.pbm' + -g '(|.)*(-/)' pbmclean pbmlife pbmmake pbmmask \
pbmpage pbmpscale pbmreduce pbmtext pbmtextps pbmto10x pbmtoascii \
pbmto4425 pbmtoatk pbmtobbnbg pbmtocmuwm pbmtoepsi pbmtoepson \
pbmtog3 pbmtogem pbmtogo pbmtoicon pbmtolj pbmtoln03 pbmtolps \
pbmtomacp pbmtomda pbmtomgr pbmtonokia pbmtopgm pbmtopi3 pbmtopk \
pbmtoplot pbmtoppa pbmtopsg3 pbmtoptx pbmtowbmp pbmtox10bm pbmtoxbm \
pbmtoybm pbmtozinc pbmupc
compctl -g '*.pgm' + -g '(|.)*(-/)' pgmabel pgmbentley pgmcrater \
pgmedge pgmenhance pgmhist pgmkernel pgmminkowski pgmmorphconv \
pgmnoise pgmnorm pgmoil pgmramp pgmslice pgmtexture pgmtofs \
pgmtolispm pgmtopbm pgmtopgm pgmtoppm
compctl -g '*.ppm' + -g '(|.)*(-/)' ppm3d ppmbrighten ppmchange \
ppmcie ppmcolormask ppmcolors ppmdim ppmdist ppmdither ppmfade \
ppmforge ppmflash ppmhist ppmlabel ppmmake ppmmix ppmnorm ppmntsc \
ppmpat ppmquant ppmquantall ppmrainbow ppmrelief ppmrough ppmshadow \
ppmshift ppmspread ppmtoacad ppmtoarbtxt ppmtobmp ppmtoeyuv ppmtoicr \
ppmtogif ppmtoilbm ppmtojpeg ppmtoleaf ppmtolj ppmtomap ppmtomitsu \
ppmtompeg ppmtoneo ppmtopcx ppmtopgm ppmtopi1 ppmtopict ppmtopj \
ppmtopjxl ppmtoppm ppmtopuzz ppmtorgb3 ppmtosixel ppmtoterm ppmtouil \
ppmtowinicon ppmtoxpm ppmtoyuv ppmtoyuvsplit ppmtv ppmwheel
compctl -g '*.p(b|g|p)m' + -g '(|.)*(-/)' pnmalias pnmarith pnmcat \
pnmcolormap pnmcomp pnmconvol pnmcrop pnmcut pnmdepth pnmenlarge \
pnmfile pnmflip pnmgamma pnmhisteq pnmhistmap pnmindex pnminterp \
pnminvert pnmmargin pnmmontage pnmnlfilt pnmnoraw pnmnorm pnmpad \
pnmpaste pnmpsnr pnmquant pnmremap pnmrotate pnmscale pnmscalefixed \
pnmshear pnmsmooth pnmsplit pnmstitch pnmtile pnmtoddif pnmtofiasco \
pnmtofits pnmtojbig pnmtojpeg pnmtopalm pnmtopclxl pnmtoplainpnm \
pnmtopng pnmtops pnmtorast pnmtorle pnmtosgi pnmtosir pnmtotiff \
pnmtotiffcmyk pnmtoxwd 

# TeX, DVI, PostScript, Adobe PDF

compctl -g '*.(tex|ins|dtx)' tex jtex ptex latex jlatex platex
compctl -g '*.dvi' xdvi dviselect dvips dvi2ps dvipdfm dvipdfmx
compctl -g '*.(e|)ps' + -g '(|.)*(-/)' gv ghostview ps2pdf
compctl -g '*.pdf' + -g '(|.)*(-/)' acroread

# Archive Utilities

compctl -f -x \
  'C[-1,*(e|t|l|v|x)*] p[2]' -g "*.lzh (|.)*(-/)" -- lha
compctl -g '*.zip' + -g '(|.)*(-/)' unzip zipinfo
compctl -g '*.(gz|z|Z)' + -g '(|.)*(-/)' gunzip zcat
compctl -g '*.bz2' + -g '(|.)*(-/)' bunzip2 bzcat
compctl -f -x \
  'C[-1,*z*] p[2]' -g "*.tar.gz *.tgz (|.)*(-/)" - \
  'C[-1,*Z*] p[2]' -g "*.tar.(Z|z) *.taz (|.)*(-/)" - \
  'C[-1,*(j|I)*] p[2]' -g "*.tar.bz2 *.tbz (|.)*(-/)" - \
  'C[-1,*f*] p[2]' -g "*.tar (|.)*(-/)" -- tar

# Development

compctl -g '*.exe' + -g '(|.)*(-/)' gdb
compctl -f -x 'p[1]' -k cvs_option -- cvs 
compctl -g '*.po' + -g '(|.)*(-/)' msgfmt
  # configure script
configre_opts () {
  reply=( `./configure --help | awk '/--/{print $1}' |\
  sed -e 's/--//' -e 's/=.*/=/'` )
  }
compctl -x 'n[1,=]' -f -- + -P -- -K configre_opts configure

# Network

#compctl -k hosts  slogin telnet ftp ncftp ping nslookup traceroute xhost
#compctl -f -k hosts rsh ssh
#compctl -K ftp_hosts_complete ftp ncftp
compctl -f -x 's[http://]' -k hosts -k urls - \
  'p[1]' -g "*.htm(|l) (|.)*(-/)" -- w3m lynx netscape iexplore mozilla

# Mathematics

compctl -g '*.plt' + -g '(|.)*(-/)' gnuplot
compctl -g '*.xls *.csv' + -g '(|.)*(-/)' msexcel

# System

compctl -g '(|.)*(-/)' cd chdir pushd
compctl -o setopt
compctl -k limitargs limit unlimit
  # limit と unlimit の補完候補は $limitargs
compctl -x 's[-]' -k signals -- kill
compctl -v -x 's[DISPLAY=]' -k hosts -S ':0' -- export
  # export の引数は変数(-v)だが、 DISPLAY= で始まっていると
  # ホスト名で補完して、末尾に :0 を付ける


# Miscellaneous

compctl -g '/var/db/pkg/*(:t) pkg_info pkg_delete
  # /var/db/pkg 下のファイルの basename を補完候補に
compctl -f -x 's[-P]' -k printers -- lpr lpq lprm prn
compctl -x 's[if=] , s[of=]' -f -- dd edd
function _folders () { reply=(`folders -recurse -fast`) }
compctl -x 's[+]' -K _folders -- folders folder scan packf
  # 補完時にシェルコマンドを呼出す例

最後に, .zshrc です.

# -*- mode:shell-script -*-

source $ZDOTDIR/.zaliases
source $ZDOTDIR/.zcompctl

HISTSIZE=512
HISTFILE="$ZDOTDIR/.zsh_history"
SAVEHIST=256

PATH=/usr/local/bin:/usr/X11R6/bin:/usr/bin:/bin:/usr/local/htmllint:$HOME/cmd
export PATH

MANPATH=/usr/local/share/man:/usr/local/man:/usr/share/man:/usr/man
LD_RUN_PATH=/usr/local/lib:/usr/lib:/usr/X11R6/lib
LD_LIBRARY_PATH=$LD_RUN_PATH
PROMPT=$'\n%{\e[0;32;40;1m%}%n%{\e[0m%}\n%{\e[0;37;40;1m%}$%{\e[0m%} '
PS1=$PROMPT
RPROMPT=$'%{\e[1;36m%}[%~]%{\e[0m%}'
PAGER='less -is'
WGETRC=$HOME/.wgetrc
CVSROOT=$HOME/CVSROOT
LANG=ja_JP.SJIS
EMACS=f:/MEADOW/1.15/bin/meadow.exe
LISPDIR=f:/MEADOW/site-lisp

TEXMF=/usr/local/share/texmf
TEXMFMAIN=/usr/local/share/texmf
TEXMFCNF=/usr/local/share/texmf/web2c

TZ='JST-9'

#GS_LIB=c:/gs/gs8.00/lib\;c:/gs/gs8.00/kanji\;c:/gs/fonts

export MANPATH LD_RUN_PATH LD_LIBRARY_PATH
export PS1 PROMPT RPROMPT WGETRC CVSROOT
export LANG PAGER
export TEXMF TEXMFMAIN TEXMFCNF
export EMACS LISPDIR
export TZ
#export GS_LIB

if [ -n ${DISPLAY} ]; then
  export DISPLAY=localhost:0.0
fi

if [ ! -n "${TERM}" ]; then
  #TERM=cygwin
  TERM=linux
fi

unset COMSPEC

fignore=('.o' '~')

setopt autocd automenu autolist correct nobeep nonomatch
setopt listtypes pushdsilent
setopt histignoredups
setopt notify
setopt printexitvalue

ulimit -c 0
unsetopt prompt_cr

stty -istrip
bindkey -m
  # Enable META key
bindkey -e
  # Key bind like Emacs

limitargs=(cputime filesize datasize stacksize coredumpsize resident maxproc descripters)

ここまで出来たら, シェルを再起動するなり, source コマンドで, .zshenv と .zshrc を呼び出すなりして, 設定を読み込みます. zsh での作業イメージを載せておきます. (作業イメージ)