HOME

rpnedit.sed 関連スクリプト

2017-4-12

これは何?

スタックを使って対話的にテキストを編集するための sed 用スクリプト rpnedit.sed といっしょに使うと便利なスクリプト集。(起動方法および実例は「スタックを使って LaTeX の数式を編集せむ」参照。LaTeX 用マクロ集はratexmacro.sedを参照)

これらのスクリプトは、すべてカレント・ディレクトリにあるファイルを扱う。また、ファイル名はすべて固定されていて、必要があれば上書きされる。

sendclip.sh, texview.sh, texview1.sh の各スクリプトは、子プロセスとして inotifywait のプロセスを 1 つずつ作成する。したがって、これらのスクリプトを停止するためには、ちょっと注意が必要。フォアグラウンドに持ってきて、^C で子プロセスともども停止させるとか、ps -fj | grep sendclip.sh などとして PGID(プロセス・グループ ID)を確認し、kill -TERM -PGID するとかして、プロセス・グループすべてを停止する必要がある。(もっとも、彼らがずっと働いていたところで、さほどリソースを消費したりはしないと思うけど)

printlevel.awk

rpnedit.sed の標準出力を整形するための awk スクリプト。スタックのレベルを数字で表示し、スタックが更新されると画面をフラッシュしてからその内容を表示する。vt-100 的なコントロール・シーケンスがサポートされたターミナル用。

#!/bin/awk
BEGIN {
    FS = "\n"
    RS = "\t\t\n"
    OFS = "\n"
    ORS = "\n"
    maxlines=100                        # ターミナル最大行数(当てずっぽう)
    for (i = 1; i <= maxlines; i++) {   # カーソルをターミナル最終行に
        print "\n"
    }
    printf "\x1B\x5B\x32\x4a"    # ESC[2J 画面全体を消去
    printf "\x1B\x5B\x36\x47"    # ESC[6G カーソルを左から6の場所に移動
}
{
    printf "\n"
    printf "\x1B\x5B\x32\x4a"    # ESC[2J 画面全体を消去
    for (i = 2; i <= NF; i++) {
            printf "\x1B\x5B\x33\x32\x6d%3d:\x1B\x5B\x30\x6d ", NF-i+1
            ## \x1B\x5B\x33\x32\x6d ESC[2m で色を green に
            ## \x32 を変えると色が変わる
            ## \x31 red, \x33 yellow, \x34 blue, \35 magenta, \36 cyan, \37 white
            ## %3d は 10 進数3桁右寄せ
            ## \x1B\x5B\x30\x6d は ESC[0m で色をリセット
            print $i                 
        }
    printf "\x1B\x5B\x36\x47"     # ESC[6G カーソルを左から6の場所に移動
}

sendclip.sh

rpnedit.tmp ファイルを監視し、変更があれば同ファイルに保存された最新のスタック内容をクリップボードに書き出す。

#!/bin/sh
# rpnedit.sed の write コマンドが出力するファイルをクリップボードに送るためのスクリプト。
# rpnedit.tmp を監視し、変更があればこれにプリアンブル等を付けて LaTeX で処理する。
# ファイルの監視に、inotifywait コマンドを、クリップボードに送るために xcel コマンドを利用する。
# なお、rpnedit.tmp が [END_OF_STACK] で区切られていることを仮定してあり、
# 2 つ以上の [END_OF_STACK] がある場合は、最後から 2 番目の [END_OF_STACK] 以前を無視する。
while true;
do
    inotifywait -e modify rpnedit.tmp > /dev/null 2>&1 ;
    if [ -s rpnedit.tmp ];
    then
	 cat rpnedit.tmp |
	     sed -ne ':a;
/\[END_OF_STACK\]$/!{N; ba};
/\[END_OF_STACK\]$/{s/\n\[END_OF_STACK\]$//; h};
${g;p}' | xsel -b
    fi
done

texview.sh

rpnedit.tmp ファイルを監視し、変更があれば同ファイルに保存された最新のスタック内容から LaTeX の簡単なソースファイルを作成し(amsmath, amssymb の各パッケージを読みこむ)、コンパイルする。その結果、rpnedit.dvi という dvi ファイルができ上がることが期待される。

このスクリプトを起動したとき rpnedit.dvi ファイルが存在しないならば、ダミーの rpnedit.dvi ファイルが作成される。これは、rpnedit.tmp ファイルが存在しない状態で、dvi ビューアを立ち上げることによるエラーを防ぐためである。

#!/bin/sh
# robedut.sed の write コマンドが出力するファイルを LaTeX で処理するためにスクリプト。
# rpnedit.tmp を監視し、変更があればこれにプリアンブル等を付けて LaTeX で処理する。
# ファイルの監視に、inotifywait コマンドを利用する。
# なお、rpnedit.tmp が [END_OF_STACK] で区切られていることを仮定してあり、
# 2 つ以上の [END_OF_STACK] がある場合は、最後から 2 番目の [END_OF_STACK] 以前を無視する。
# パッケージは amsmath, amssymb を読み込むが、これを変える場合は、このファイル中の
# \\usepackage{amsmath,amssymb} とある行を編集すれば変えることができる。
if [ ! -s rpnedit.dvi ]
then
    echo '\\relax waiting... \\end' | tex --jobname=rpnedit > /dev/null 2>&1
fi

while true;
do
    inotifywait -e modify rpnedit.tmp > /dev/null 2>&1 ;
    if [ -s rpnedit.tmp ];
    then
	(echo '\\documentclass{article}
\\usepackage{amsmath,amssymb}
\\begin{document}';
	 cat rpnedit.tmp |
	     sed -ne ':a;
/\[END_OF_STACK\]$/!{N; ba};
/\[END_OF_STACK\]$/{s/\n\[END_OF_STACK\]$//; h};
${g;p}'
	 echo '\\end{document}') > rpnedit.tex;
	latex -halt-on-error rpnedit.tex;
    fi
done

texview1.sh

rpnedit.tmp1 ファイルを監視し、変更があれば同ファイルに保存された最新のスタックの各レベルを \[\] で囲んでから、LaTeX の簡単なソースファイルを作成し(ここで amsmath, amssymb の各パッケージを読みこむ)、コンパイルする。その結果、rpnedit.dvi という dvi ファイルができ上がることが期待される。この div ファイルは texview.sh と共通である。

このスクリプトを起動したとき rpnedit.dvi ファイルが存在しないならば、ダミーの rpnedit.dvi ファイルが作成される。これは、rpnedit.tmp ファイルが存在しない状態で、dvi ビューアを立ち上げることによるエラーを防ぐためである。

#!/bin/sh
# robedut.sed の write コマンドが出力するファイルを LaTeX で処理するためにスクリプト。
# rpnedit.tmp を監視し、変更があればこれにプリアンブル等を付けて LaTeX で処理する。
# ファイルの監視に、inotifywait コマンドを利用する。
# なお、rpnedit.tmp が [END_OF_STACK] で区切られていることを仮定してあり、
# 2 つ以上の [END_OF_STACK] がある場合は、最後から 2 番目の [END_OF_STACK] 以前を無視する。
# パッケージは amsmath, amssymb を読み込むが、これを変える場合は、このファイル中の
# \\usepackage{amsmath,amssymb} とある行を編集すれば変えることができる。
if [ ! -s rpnedit.dvi ]
then
    echo '\\relax waiting... \\end' | tex --jobname=rpnedit > /dev/null 2>&1
fi

while true;
do
    inotifywait -e modify rpnedit.tmp1 > /dev/null 2>&1 ;
    if [ -s rpnedit.tmp1 ];
    then
	(echo '\\documentclass{article}
\\usepackage{amsmath,amssymb}
\\begin{document}';
	 cat rpnedit.tmp1 |
	 sed -ne ':a;
/\[END_OF_STACK\]$/!{N; ba};
/\[END_OF_STACK\]$/{s/\n\[END_OF_STACK\]$//; h};
${g;p}' | sed -e 's/^/\\[/; s/$/\\]/'
	 echo '\\end{document}') > rpnedit.tex;
	latex -halt-on-error rpnedit.tex;
    fi
done

おわり