xyzzyとperlの連携でテキスト処理最強環境
こないだからごそごそいじってるxyzzyのマクロとそこから連携するperlのスクリプト。
xyzzyのあまりの便利さ、ラクチンさ、フロントとしての有能さに今さらながら驚いた。もう15年ぐらい使ってるっちゅーのに。
エディタはxyzzy一択だろう(主語:おれ)
自分環境・自分作業内容に特化したマクロなので、誰にとっても有用・便利に使えるものではないけど、備忘録としてメモしておこう。
lispは手強い、というか他とは別モノなので、今回ごそごそ作ってるようなわずか数行のものでもネットで検索しまくり、デフォルトのlispフォルダをgrepしまくってやっと。明日にはもう忘れているであろう自分のためにもメモが必要なのだ。
てことで、先日までのマクロの振り返り。。
1)編集中のバッファの内容をtempファイルに書き出して
2)perlのスクリプトで処理して
3)処理された内容をバッファに読み込む
てところがキモ。
(2)のところ。
今日までは、処理してほしい内容について
(interactive "s[D]elSpace [T]ab4Space [M]akeEPUB [C]heck")
などと、マクロを起動したらperlでどういう処理をして欲しいのか、ユーザー入力を取得してperlに引数として渡すようにしていた。
でも、このユーザー入力のひと手間がけっこう面倒くさい。
面倒くさいものは続かない。そのうち使わなくなるのが目に見えている。
20分ぐらい考えて、macのCotEditorが外部スクリプトの引数に編集中のファイル名(フルパスで)を渡すことを思い出した。この動作をそのままxyzzyのマクロでも使うことにした。
そもそも、マクロを起動したらば。
編集中のファイルの拡張子が.plとか.pmだったらperlのシンタックスチェックをして欲しいし、編集中のファイルがeasy_epubフォルダ以下の.txtファイルだったらeasy_epub.plでEPUB電子書籍を作ってくれ。自分としては、いちいちユーザー入力を待って判定する必要はない。
ファイルと結びつかない新規バッファや*scratch*バッファで作業しているものに関しては、空白の削除やタブを空白4つに変換するなど、その時その場の小ネタ処理で決めうちできないので、ここはユーザー入力で動作を振り分けてもらいたい。
・フルパスのファイル名がわかっているものに関しては、パス・ファイル名を処理・動作の判断にしてくれ。
・ファイル名がわからないものに関しては、指示するからちょっと待てよ。
という自分リクエストを満たしたxyzzyのマクロがこの10行。
やってることは。
01:関数
02:この関数はマクロで呼び出せますよ
03:バッファを書き出すためのtempファイル名の設定
04:編集中のバッファがファイルと結びついてなければどんな処理をするのかユーザー入力待ち
05:tempファイルの削除
06:編集中のバッファをtempファイルに書き出し
07:perlに渡すためのバッチファイル(WINDOWSのダセエところだ)
引数としてフルパスのファイル名と、04の場合の入力された文字。標準入力経由でtemp-file、perlが処理した内容を受けとるところとして「*scratch*」バッファを設定。
08:バッファ全体をマークして
09:バッファをクリップボードにコピー
受けとるperl側は以下。長いのでpackageについては端折るけど。
・フルパスファイル名がわかっているものは、ファイルを読み込んで処理。
・ファイル名がないものは、一行ずつ処理したり、全部読み込んでから処理したり。
(第一引数はファイル名。第二引数がマクロの04で入力した文字)
いやもうほんと滅茶苦茶最強のテキスト処理環境のできあがりだ。
どのぐらい最強かというと、今日まさに立川で観てきた爆音「マッドマックス FR」のお婆ちゃんズぐらい最強だ(実写版ジブリだったなあ)
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
xyzzyでクリップボードのテキストを整形加工
タイトルは嘘です。すみません。
いわゆる仕事効率化っちゅーネタ(わたしは、なんたらハックだの効率化だのって言葉には生理的嫌悪感しかないんだけど、ほかにテキトーな言い方が思いつかなかった敗北感)
昨日でっち上げたxyzzyのマクロの続き。
1)編集中のバッファの内容をtempファイルに書き出して
2)perlのスクリプトで処理して
3)処理された内容をバッファに読み込む
4)バッファをクリップボードにコピーする
あとはWEBの管理ページに貼りつけるだけ、ああ、なんてラクチン。と自画自賛芸。
んで、この前段階として。
1)PDFのページの中の処理したい部分を範囲指定してコピーする。
2)コピーした部分をxyzzyにペーストする。
というのがあって、ペーストしたらば、昨日のマクロの出番だったワケだけど、よくよく考えてみりゃPDFのページの該当部分をコピーするところから一緒くたにできる。
・カレントバッファの内容を全削除
・更地になったバッファにクリップボードの内容をペーストする
これ、動作が凶悪なので、キーボードに割りあてるのは惨劇のもと。
ほかのマクロと併せ技で使うだけにしておこうな、おれ。
で、昨日のマクロと合わせる
やっぱ危険なので、キーの割り当ては大文字のPにしておいた。
(define-key ctl-x-map #\P 'clipboard-batch-processing)
以上の仕込みで。
なんということでしょう。WINDOWS上でコピーをした部分を、あたかもxyzzyで直接整形加工したように見えるじゃありませんか。
xyzzyはすげーっす(と、なにを今さら感)
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
xyzzyのバッファを書き出す
PDFのデータをWEBの管理ページにコピペという単調なワープアIT軽作業。
ぺたぺた貼りつけるだけならいいんだけど、PDFのデータは印刷のことを考えて(?)半角数字などの両側に半角のスペースが入ってたりするし、改行があるとWEBで表示すると半角程度空白になってしまう。
・PDFからエディタにコピペ
・無駄な半角スペースと改行を削除
・エディタから管理ページのフォームにコピペ
という作業。
毎度毎度エディタに貼りつけ置換して…いちいち同じ作業にむかついてきたので、調べてみた。
xyzzyというWINDOWSのエディタを10年以上使っていて、以前はマクロ(lisp)が面白くていろいろいじくってた。でも、もうすっかりびっくり忘却の彼方。lispは手強い。
とりあえず。xyzzyの編集中のバッファをperlに渡して処理させて、その結果を編集中のバッファに書き出して、クリップボードにコピーしてくれればいいや、と久しぶりにxyzzyのlispを調べた。
・カレントバッファをtmpファイルに書き出す
・外部コマンドでtmpファイルを開いて処理をして、その結果をカレントバッファに書き出す
・クリップボードにコピーする
perlを使えば何でもできるしなあ。
…て、「_xyzzy.tmp」とファイルを仲介してるんだけど。バッファを標準出力に出してそれを標準入力でperlが受けとるのが本来あるべきスマートな姿。Windowsだと無理、かなぁ…。
以下、外部コマンド実行でハマったのでメモ。
外部コマンドを実行するための関数「execute-shell-command」があって、xyzzyのリファランスを見ると
外部プログラムを実行します。結果だけをxyzzyに取り込みます。
COMMAND : 実行するコマンドをオプション付で指定します。
INFILE : 標準入力を使用する外部プログラムであれば入力ファイル名を指定します。
OUTPUT : 標準出力を出力するバッファを指定します。
ENVIRON : 設定する環境変数を連想リスト形式で渡します。
(("HOME" . "C:/applications/xyzzy/")
("TOPDIR" . "C:/spool/"))
DIRECTORY : 実行するディレクトリを指定します。
ところが、INFILEにtemp-fileを指定しても、ファイル名が引数になってない=指定のファイルを開けない。
具体的には
(execute-shell-command "_xyzzy-tmp.bat " t temp-file (selected-buffer))
INFILEにtemp-fileを指定すればバッチファイルの引数に渡されると思ったらダメだったので、perlのスクリプトの中で$f='_xyzzy.tmp'とファイル名を固定で指定してた。
これは超ダサイ。
なもんで、
(execute-shell-command (concat "_xyzzy-tmp.bat" " " temp-file) t (selected-buffer))
↑COMMANDにtemp-fileを入れたコマンドライン文字列を作って入れたところ、バッチファイルでtemp-fileを受けとることができた。
system関数にsprintfでコマンドを作って実行させる、ようなものだ。
うーん、でもきっとINFILEを使った方がいいんだろうなあ。
とはいえ、目先、今月8月も残り10日を切ってるんで、不細工でもこいつで作業してやっつけてしまわんと。時間がかかればかかるほど単価がアレになってしまうんで、〆切一ヶ月前倒し進行!
[08/31 19:48:13]追記。
て、optionalのところ、nilだtだじゃなく、ここにINFILEを書けばいいだけの話だった。誤情報すみません。
ちなみに、xyzzyでは「filter-buffer」というのがあって、「Ctrl+x #」と叩くと、外部コマンドを実行するための1行バッファが現われる。
ここに外部コマンドを入力すると、編集中のバッファ(カレントバッファ)を外部コマンドに渡してくれる。
単純なものならperlのワンライナーでやりたい放題だし、スクリプトを実行させるためのバッチファイルでもOKだ。
超手強いlispを避けて、普段使い慣れてる処理系で書けるのは本当に助かる。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
メール環境見直し
「夜の子供たち」は、ちょっとやりすぎ、な感じはあったけど、手に汗握る傑作でありました。後半、もっと個々の状況説明を厚くしてほしかった、かな。
わたしのメール環境はずーっと、emacsにmew。
なんだけど、emacs を utf 対応にしてから重いし不安定で困った。今どき、libretto50のメモリ32Mなんてzaurusよりもスペックは低いしなぁ。てことでテキトーなメーラーがないものかと。
Libretto50はもう無理があるだろうし、牛丼サーバーは余計な負荷をかけたくないし、…となると残るのはWINDOWSXPとzaurusだけじゃん(GmailなどのWEBメール(?)で普段のメール管理をするのは、まだ抵抗があるので却下)
WINDOWSXPのメーラーは、いろいろざっと見たり試したりしてみて、これが面白い。
https://www7a.biglobe.ne.jp/~hat/xyzzy/kamail3/readme.html
問題は、わたしが、WINDOWSXPパソコンを信用してない、というところだ。
zaurusは標準のメーラーが使えないんで探したんだけど意外に少なくて、とりあえず。
https://www.ultrapop.jp/?qpop
ただ、zaurusの場合、表で通信するとAirHの32Kという通信速度なので、メーラー以前の状況。
メールって一元管理したいシロモノなので、本当だったら、メール本文(データ)があって、どんなメーラー(クライアント)からでもアクセスできるのがベスト、だよなぁ。帯に短したすきに長しとでもいうのか、ちょうどいいメーラーが見つからない。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」