zsh用簡易計算機
- 簡易計算機を定義
これを打っておくと、あとで「? 5*3-10」といった具合に計算ができるようになります。
? () { echo "$*" | bc -l; }Linuxで使えるクレージーな小技コマンドいろいろ | IDEA*IDEA
bcはよく使うコマンドの一つで,来週の授業でも,気合いを入れて準備をしている余談として取り上げる予定です.
それにしても,毎回「echo "5*3-10"|bc」なんて打ち込むのは面倒でした.~/.zshrcに入れておきますか.
まずはターミナル上で,上の関数定義を実行してみると,「zsh: no matches found: ?」と出て,失敗しました.
「?」が悪いのでしょう.代わりにいい文字,ないかな…いろいろキーを打ってみると,「_」が空いています.
$ _ () { echo "$*" | bc -l; }
問題なさそうです.では…
$ _ 5*3-10 zsh: no matches found: 5*3-10
うまくいきません.「*」があるので,ワイルドカード展開をしようとしたのでしょう.もちろん,5から始まって3-10で終わるファイル名なんて,ありません.
少し調べたところ,noglobというコマンドで,この種の展開を抑制してくれます.じゃあこう.
$ alias _="noglob _" $ _ 5*3-10 5
めでたしめでたし.
ちなみにaliasで再帰的にコマンドを書くのは,私が大学2年のときにUnixを使うようになったときのcshでも,可能でした.たしか「alias ls "ls -aFgl"」なんて書いていたかな.
文字コードを意識したplatex
日常のコマンド実行で,他に,悩みがないか調査…ありました.TeXコンパイル時の文字コードです.
来週の授業で,レポート課題を出します.例年どおりの,プログラム打ち込みと小問です.
それで,問題文に入れている「〜」の文字の影響で,NTEmacsで保存すると強制的にUTF-8になります.そのまま,cygwinのplatex*1に通すと,エラーが出ます.
なのですが,platex -helpとすると,中にこんなオプションがあるのが分かります.
-kanji=STRING set Japanese encoding (STRING=euc|jis|sjis|utf8)
実際,「platex -kanji=utf8 q.tex」とすると,問題なくdviファイルが作られました.
それでは,texファイルの文字コードを判別して,引数に与えますか.判別と言えばnkfコマンドですね.えっと…
$ nkf --help (略) -g --guess Guess the input code (略) $ nkf -g q.tex UTF-8 $ nkf -s q.tex | nkf -g Shift_JIS $ nkf -j q.tex | nkf -g ISO-2022-JP $ nkf -e q.tex | nkf -g EUC-JP
nkfの出力はUTF-8だけど,platexの-kanjiオプションにはutf8と書かないといけません.Shift_JISならsjis,ISO-2022-JPならjis,EUC-JPならeuc.スマートに変換する方法が思い浮かばないので,sedで変えることにします.まずは変換関数を.
$ guessforplatex () { function> nkf -g $1 | sed -e 's/UTF-8/utf8/;s/Shift_JIS/sjis/;s/ISO-2022-JP/jis/;s/EUC-JP/euc/' function> } $ guessforplatex q.tex utf8
そして,コンパイルのための関数を書きましょう.
$ dvi () { function> local base=${1%\.*} function> platex -kanji=`guessforplatex $base.tex` $base function> }
baseというローカル変数は,拡張子抜きのファイル名です.実行時のファイル名に,「q.tex」と書いても「q.dvi」と書いても,補完を忘れて「q.」の状態でEnterを押してしまっても,いいようにしています.
あれこれやって,動作を確認したら,~/.zshrcに書いておきます.
alias dvi=platex function pdf() { dvipdfmx ${1%\.*} } if which nkf > /dev/null then function guessforplatex () { nkf -g $1 | sed -e 's/UTF-8/utf8/;s/Shift_JIS/sjis/;s/ISO-2022-JP/jis/;s/EUC-JP/euc/' } unalias dvi function dvi () { local base=${1%\.*} platex -kanji=`guessforplatex $base.tex` $base } function 2dvi () { local base=${1%\.*} dvi $1 && dvi $1 } fi function udvi() { local base=${1%\.*} platex -kanji=utf8 $base } function 2udvi() { local base=${1%\.*} udvi $1 && udvi $1 } function sdvi() { local base=${1%\.*} platex -kanji=sjis $base } function 2sdvi() { local base=${1%\.*} sdvi $1 && sdvi $1 }
いろいろ足しています.近い将来,英語の論文を書く予定がないので,pdfファイルを作るのはdvipdfmxとしておきます.また,Cygwinの標準的なインストールでは,nkfが入らないので,nkfコマンドがあるときに限って,文字コードの判別やdviの関数を定義しています.udvi, sdviは,入力文字コードそれぞれUTF-8,Shift_JIS決め打ちです.2から始まる関数は,TeXコンパイルを2回行います.コマンドの最初にuやsや2を付けているのは,まず「dvi 」を打って引数を書き,それから,文字コード決め打ちや2回コンパイルをしたいと思ったら,行頭に戻って打ち込めばいいようにしているからです.
小物
# texsymbol _ => \symbol{95} function texsymbol() { echo "\\symbol{$(echo -n ${1[1]} | od -i | sed -e 's/^[0-9]* *//')}" } # YYMMDD形式で日付出力 alias yymmdd='date +%y%m%d' # YYYYMMDD形式で日付出力 alias yyyymmdd='date +%Y%m%d' alias ymd=yyyymmdd # makeし直し function remake() { command rm $* command make $* } # 実行属性を付ける alias svn+exe='svn propset svn:executable ON' # 最新のログメッセージだけ見る alias svn-loghead="svn log --limit 1" # _ 5*3-10 => 5 function _() { echo "$*" | bc -l } alias _="noglob _"