Last-modified:2016/04/26 23:38:17.
『UNIX今日の技』の tcsh 関連の項目を纏めたものです。
岸田としては、zsh が使える環境ならば zsh を強く推します。 ですが duo とか zsh の入ってない計算機を使うことがよくあるので、tcsh の設定のポイントを書いておきます。 ~/.cshrc に記述しておくと毎回自動的にロードされます。
これまでの成果を{{ref .cshrc}}、 {{ref .cshrc_tcsh}}にまとめました (.cshrc_tcsh は .cshrc から source されます)。 一応このままで使えると思います。
#### 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」 → ……。 一度打ったことのあるコマンドは、(ヒストリの残っている限り)二度と全入力する必要がないということです。
幾つかの機能は、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")
長いコマンドを短い名前で呼び出す機能です。 ぶっちゃけこの一言で言い尽くせるのですが、もう少し詳しく見ると以下のような目的に分類できます。
簡略名、もしくは新しいコマンドっぽく使う: 長ったらしいコマンド名を打つのは気が滅入るものです。 コマンドを置き換える パイプ処理やコマンドの連結 常にオプションを付けて実行する: デフォルトにしたいオプションを常に使うことにします。 必ずバックグラウンドで起動: 別ウィンドウを開くアプリケーションはフォアグラウンドで実行する必要はないでしょう。 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」のように最初にバックスラッシュを付けてコマンド入力します。
ls のオプション –color でカラー化して表示できます。 エイリアスを張ってしまうと良いでしょう。
alias ls 'ls --color=tty'
# tty は「端末に応じて出力をカラー化するか自動的に変更する」という指定です
細かい色設定の仕方は要望があったら書きます。
:補足:Linux 以外では、標準の ls が GNU 製の ls ではないのでインストールする必要があります(FreeBSD では gnuls)。Linux ではそのままで大丈夫ですが、MacOS X はそのままではダメっぽいです。duo では tcsh 組込みコマンド ls-F を使うことでカラー化されたりします。
シェル変数 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」とするとプロンプトの背景色を黒にすることができます。
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}
)