わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

便利コマンドを作る

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になります.そのまま,cygwinplatex*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ならsjisISO-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-8Shift_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 _"