『UNIX今日の技』の tcsh 関連の項目を纏めたものです。

岸田としては、zsh が使える環境ならば zsh を強く推します。 ですが duo とか zsh の入ってない計算機を使うことがよくあるので、tcsh の設定のポイントを書いておきます。 ~/.cshrc に記述しておくと毎回自動的にロードされます。

これまでの成果を{{ref .cshrc}}、 {{ref .cshrc_tcsh}}にまとめました (.cshrc_tcsh は .cshrc から source されます)。 一応このままで使えると思います。

1 便利なキーバインド

#### Key binding ############################################################
bindkey ^R  i-search-back       # [C-r]:コマンドヒストリから検索
bindkey ^P  history-search-backward # [C-p]:打ち込んだ部分まで同一なコマンドを検索
bindkey ^N  history-search-forward  # [C-n]:同上、ただし順方向検索
bindkey ^?  delete-char-or-list # [Del]:コマンドライン右端[Del]で補完候補の表示
bindkey ^[[2~   overwrite-mode      # [Ins]:で上書きモード切り替え
bindkey ^[[5~   history-search-backward # [PgUp]:打ち込んだ部分まで同一なコマンドを検索
bindkey ^[[6~   history-search-forward  # [PgDn]:同上、ただし順方向
bindkey ^[^[[D  vi-word-back        # [ESC]←:単語単位でカーソル位置を左へ
bindkey ^[^[[C  vi-word-fwd     # [ESC]→:単語単位でカーソル位置を右へ
stty    erase   ^H          # どの端末でも[C-h]でBackSpaceにするおまじない

[C-p], [C-n]はかなり便利です。 例えば、「ls /us[C-p]」と打つと、以前打ったコマンドのうち、先頭が「ls /us」のものを検索してくれます。 例えば、「ls /usr」 → 「ls /usr/local/bin」 → 「ls /usr/bin」 → ……。 一度打ったことのあるコマンドは、(ヒストリの残っている限り)二度と全入力する必要がないということです。

2 シェルオプション

幾つかの機能は、tcsh にシェル変数としてセットしておくと機能するようになります。 「岸田は使ってないけれど、人によっては便利かもしれない」というオプションは行頭# でコメントアウトしてあります。

## 補完
set autolist = ambiguous    # 1文字も補完されなかったときには一覧表示
set correct = cmd       # commandのタイプミスを自動訂正 (all etc.)
set filec           # csh でも補完を効かせる
set showdots        # ドットファイルも補完対象にする
set nobeep          # ファイル名補完失敗時にビープを鳴らさない
set color           # tab 補完の時もカラー表示
#set    fignore=( .o .h .s )    # ファイル名補完で無視される拡張子
#set    complete = enhance      # 補完時に大文字小文字を区別しない
#set    nostat = (/dev/ /mnt/)  # 補完候補を表示するときにファイルタイプを表示しない場所

## ヒストリ
set history = 1500      # ヒストリテーブルの大きさ
set savehist = (1500 merge) # logout時に.historyに残す数(mergeする)
set histdup = erase     # 入力行と一致するhistoryが有ったらそれを削除

## その他
set noclobber       # ">" リダイレクト先の名前のファイルがあると確認
set rmstar          # rm * を実行する前に確認
set cdpath = (~/)       # cd の対象のディレクトリが存在しない時は ~/dir に移動
set listjobs        # 中断時に全てのジョブを表示
set notify          # バックグラウンンドジョブの状態変化を通知
#set    ignoreeof       # 空行 C-d でログアウトしないようにする
#set    symlinks=ignore     # symlinkを実体として扱う
limit   coredumpsize    0   # コアファイルを吐かないようにする

## time コマンドの出力書式: この設定で、8秒以上 CPU を使った処理は自動的に time を表示してくれる。
set time=(8 "?
    Time spent in user mode   (CPU seconds) : %Us?
    Time spent in kernel mode (CPU seconds) : %Ss?
    Total time                              : %Es?
    CPU utilisation (percentage)            : %P?
    Times the process was swapped           : %W?
    Times of major page faults              : %F?
    Times of minor page faults              : %R")

3 エイリアス

長いコマンドを短い名前で呼び出す機能です。 ぶっちゃけこの一言で言い尽くせるのですが、もう少し詳しく見ると以下のような目的に分類できます。

簡略名、もしくは新しいコマンドっぽく使う: 長ったらしいコマンド名を打つのは気が滅入るものです。 コマンドを置き換える パイプ処理やコマンドの連結 常にオプションを付けて実行する: デフォルトにしたいオプションを常に使うことにします。 必ずバックグラウンドで起動: 別ウィンドウを開くアプリケーションはフォアグラウンドで実行する必要はないでしょう。 typo 対策: タイプミスを救済します。

##簡略名
alias   la  'ls -a'
alias   ll  'ls -al'
alias   pwd 'echo $cwd'
alias   bell    'echo ?a'
alias   memo    'vim ~/memo.txt'

##コマンドを置き換える
alias   rm  'mv ?!* ~/.trash/'
alias   vi  'vim'
alias   less    'jless -RM'

##パイプ,コマンドの連結
alias   dusort  'du ?!* | sort -rn | more'
alias   lsl 'ls ?!* | less'
alias   lll 'ls -al | less'
alias   psa 'ps auxw | grep ${USER} | grep -v "ps -auxw" | grep -v grep'
alias   psg 'ps auxw | grep ?!* | grep -v "ps -auxw" | grep -v grep'
alias   pst 'ps auxw | sort +4nr | grep -v "ps -auxw" | grep -v grep'
alias   cd  'cd ?!* ; ls'

##オプション
alias   mv  'mv -i'     # 上書き時に尋ねる
alias   cp  'cp -i'     # 上書き時に尋ねる
alias   du  'du -k'     # kB 表示
alias   su  'su -'
alias   ls  'ls -F'     # ファイルタイプを表示
alias   kterm   'kterm -sb -sl 500 -km euc -title kterm@$HOST ?!* &'

##バックグラウンド
alias   gv  'gv ?!* &'
alias   mozilla 'mozilla ?!* &'
alias   xcalc   'xcalc &'
alias   xdvi    'xdvi ?!* &'
alias   xterm   'xterm &'
alias   vasp    'vasp >& stdout & jobs'

##typo 対策
alias   cd..    'cd ..'
alias   sl  'ls'
alias   kls 'ls'
alias   lf  'ls'
alias   qls 'ls'
alias   l   'ls'
alias   s   'ls'
alias   les 'less'

引数を指定した個所に挿入したい場合は ?!* を使います。 また、エイリアスではない元のコマンドを使いたい場合は、「?mv」のように最初にバックスラッシュを付けてコマンド入力します。

4 ls のカラー化

ls のオプション --color でカラー化して表示できます。 エイリアスを張ってしまうと良いでしょう。

alias ls 'ls --color=tty'
# tty は「端末に応じて出力をカラー化するか自動的に変更する」という指定です

細かい色設定の仕方は要望があったら書きます。

:補足:Linux 以外では、標準の ls が GNU 製の ls ではないのでインストールする必要があります(FreeBSD では gnuls)。Linux ではそのままで大丈夫ですが、MacOS X はそのままではダメっぽいです。duo では tcsh 組込みコマンド ls-F を使うことでカラー化されたりします。

5 プロンプト

シェル変数 prompt 設定することでプロンプトを変更することができます。 雛型を用意しましたのでお好みでどうぞ。

#### プロンプト ############################################################
#set prompt='%n@%m %~ %% '  # 「ユーザ名@ホスト名 カレントディレクトリ %」
set prompt='%{?n?e[04;36m%}%n@%m %~ %%%{?e[00m%} ' # 先頭を改行して色をつけた
#set prompt='%{?e]2; %m:%~ ?a*?e]1;%%: %~?a%}*%{?n?e[04;36m%}%n@%m %~ %%%{?e[00m%} '
#    X環境でターミナルを立ち上げいる場合、タイトルバー、タスクバーに情報を表示する
#    1個目の'…'がタイトルバー、2個目の'…'がタスクバー、3個目の'…'が通常プロンプト
#
# 色設定
#       ?e[00m  初期状態へ戻す
#       ?e[01m  太字
#       ?e[04m  アンダーライン
#       ?e[05m  blink(太字)
#       ?e[07m  反転
#       ?e[3?m  文字色をかえる
#       ?e[4?m  背景色をかえる
#           ?= 0:黒, 1:赤, 2:緑, 3:黄, 4:青, 5:紫, 6:空, 7:白

「?e[04;36m」 は 「?e[04m?e[36m」 と等価です(2つの強調表現をまとめただけ)。 ということで、2番目の奴は、36の6を適当な数に変更するとプロンプトの色を変更できます。 「?e[04;36m」を「?e[04;36;40m」とするとプロンプトの背景色を黒にすることができます。

6 補完

tcsh の持つ最強の機能はキメ細かな補完設定です。 とりあえず以下をコピペして使うのが吉でしょう。 私も他人に貰って来たまんま使ってますので、細かい部分はよく分かってません。 いいんです。 こーゆーのは誰かが苦労して作ったものを皆で使えば良いのです。

で、以下の設定でできることの一例 cd, rmdir はディレクトリ名のみ補完する ps -u の後はユーザ名を補完する kill はプロセスID を補完する make の引数を install などと補完する fg, bg, stop コマンドで % に続く文字列はジョブ名として補完する set, setenv などで環境変数名、シェル変数名を補完する *rsh, ssh でオプションに応じてログイン名やホスト名で補完する

なお、ホスト名補完するにはシェル変数 hostnames に補完したいホスト名を登録しておく必要があります。

#### Completions ############################################################
set complete=1      #tcsh の補完機能をオンにするスイッチ
complete {egcs,cxx,cc,gcc,g++}  'c/-[IL]/d/'    ?
                'n/-c/f:*.{c,c++,C,cc,cpp}/'   ?
                'c/-l/f:*.a/' ?
                'n/*/f:*.{c,c++,C,cc,cpp,f,o}/' ?
                'c/-/"(o l c g v L I D U W O2 static undef)"/'
complete {f77,g77}      'c/-[IL]/d/'    ?
                'n/-c/f:*.f/'   ?
                'p/*/f:*.[fco]/'
complete make           'p/1/(all clean distclean depend ?
                install install.man Makefiles buildworld installworld)/'
complete glade          'n/*/f:*.{glade,gld}/'
complete javac          'n/*/f:*.java/'
complete tmake          'n/-o/f:Makefile/' ?
                'n/*/f:*.pro/'
complete gdb            'n/-d/d/' 'n/*/c/'
complete ar         'c/[dmpqrtx]/"(c l o u v a b i)"/' 'p/1/"(d m p q r t x)"//' ?
                'p/2/f:*.a/ p/*/f:*.o/'
complete perl           'n/-S/c/'

# Compress
complete lha            'n/*/f:*.{lzh,LZH}/'
complete unzip          'p/*/f:*.{ZIP,zip}/'
complete gzip           'n/-d/f:*.{gz,Z,tgz,TGZ}/'  ?
                'n/*/f:^*.{gz,Z,tgz,TGZ}/'
complete {gunzip,gzcat,zcat}    'n/*/f:*.{gz,Z,tgz,TGZ}/'
complete com{,press}        'n/*/f:^*.Z/'
complete unc{,ompress}      'n/*/f:*.Z/'
#complete tar           'n/*/f:*.{gz,Z,tar.gz,tgz,TGZ,tar.bz2}/'

# Tex
complete {*latex,'tex2*'}   'n/*/f:*.{tex,TEX,texi,ltx}/'
complete {ghostview,'gv*'}  'c/-l/(andscape)/'  ?
                'n/*/f:*.{ps,eps,pdf}/'
complete {dvi*,x*dvi}       'n/*/f:*.{dvi,DVI}/'

# Edit
complete {gnuplot,gp}       'n/*/f:*.{plt,gp}/'
complete 'ps?*'         'n/*/f:*.{ps,eps,PS,EPS}/'
complete {gs,gv,ghostview}  'n/*/f:*.{ps,PS,eps,epsi,epsf,pdf,PDF}/'
complete {acroread,xpdf}    'n/*/f:*.{pdf,PDF}/'
complete 'tgif*'        'n/*/f:*.obj/'
complete {vi,xvi,m,more}    'n/*/f:^*.{o,a,so,so.*}/'

# Print
complete lpr    'c/-P/$printers/' 'n/*/f:*.{ps,eps}/'
complete lpq    'c/-P/$printers/'
complete lprm   'c/-P/$printers/'
complete dvips  'c/-P/$printers/' 'n/-o/f:*.{ps,PS}/' 'n/*/f:*.dvi/'

# Browse
complete {netscape,Mo,Mosaic,lynx,Lynx,w3m} ?
                'n/*/f:*.{htm,html}/'

# Misc tools
complete {x11,free}amp      'n/*/f:*.{mp3,MP3}/'
# complete vncviewer       'p/1/$hostnames/:'

# Job
complete ps         'n/-*u/u/'
complete {fg,bg,stop}       'c/%/j/ p/1/"(%)"//'

# Env
complete complete       'p/1/X/'
complete uncomplete     'n/*/X/'
complete alias          'p/1/a/'
complete unalias        'n/*/a/'
complete set            'c/*=/f/' 'p/1/s/=' 'n/=/f/'
complete unset          'n/*/s/'
complete env            'p/1/e/='
complete envg           'p/1/e/'
complete {set,print}env     'p/1/e/'
complete unsetenv       'n/*/e/'
complete xhost          'c/*{+,-}/$hostnames/'?
                'p/*/$hostnames/'
complete xon            'c/*@/$hostnames/' ?
                'n/-l/u/' 'C/*/$hostnames/'

# Admin
#complete su            'c/--/"(login fast preserve-environment command shell help version)"/' ?
#               'c/-/"(f l m p c s -)"/' ?
#               'n/{-c,--command}/c/' ?
#               'n@{-s,--shell}@'`cat /etc/shells`'@' 'n/*/u/'

# Daily command
complete {cd,chdir,pushd,popd,pu,po} ?
                'p/1/d/' ?
                'n/-*/d/'
complete rmdir       'n/*/d/'
complete [r,s]{sh,login,l}  'c/*@/$hostnames/' ?
                'n/-l/u/' 'C/*/$hostnames/' ?
                'p/1/?$hostnames/' ?
                'c/-/"(l n)"/' ?
                'N/-l/c/' ?
                'n/-/c/' ?
                'p/2/c/' ?
                'p/*/f/'
complete [r,s]{cp}      'c/*@/$hostnames/:' 'n/-l/u/'
complete *ftp           'p/*/$hostnames/'
complete {,j}{man,whatis}   'n/-M/d/'   ?
                'n/*/c/'
complete {which,where,sudo,strace,exec,trace} ?
                'p/1/c/'
complete {finger,[M,m]ail,mailx} ?
                'c/*@/$hostnames/' 'p/1/u/@'
complete {nslookup,host,telnet,ping,traceroute}?
                'p/*/$hostnames/'
complete find 'c/-/(print name type)/'
complete find           'n/-name/f/' ?
                'n/-type/(c b d f p l s)/' ?
                'n/-exec/c/' ?
                'c/-/(name type user size ctime mtime atime print exec )/' ?
                'n/*/d/'
complete chgrp          'p/*/g/'
complete chown          'p/*/u/'
# complete kill          'c/-/`kill -l`/'
# complete killall       'c/-/`kill -l`/' 'p/*/c/'
complete kill 'p/*/`ps ax | awk ?{print? ?$1?}`/'

# Remove
complete rm     'c/--/"(directory force interactive verbose recursive help version)"/' ?
#           'c/-/"(d f i v r R -)"/' ?
            'n/*/f:^*.{c,cc,C,h,in,tex}/'   # Protect precious files

set hostnames = ( localhost ?
    odin ?
    goli{3,4,5,6,7,8,9} ?
    duo{1,2,3,4,5,6,7,8,9,10,11} ?
    moon{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20} ?
    moon{21,22,23,24,25,26} 
    )