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:(defun to-perl()
02: (interactive)
03: (setq temp-file (concat (user-homedir-pathname) "_xyzzy.tmp"))
04: (unless (get-buffer-file-name) (setq op (read-string "[D]elSpace [T]ab4S [E]bookPage: ")));
05: (delete-file temp-file)
06: (write-file temp-file)
07: (execute-shell-command (concat "_xyzzy-tmp.bat" " \"" (get-buffer-file-name) "\" " op) temp-file "*scratch*" (selected-buffer))
08: (mark-whole-buffer)
09: (copy-region-to-clipboard (mark) (point))
10:)
やってることは。
01:関数
02:この関数はマクロで呼び出せますよ
03:バッファを書き出すためのtempファイル名の設定
04:編集中のバッファがファイルと結びついてなければどんな処理をするのかユーザー入力待ち
05:tempファイルの削除
06:編集中のバッファをtempファイルに書き出し
07:perlに渡すためのバッチファイル(WINDOWSのダセエところだ)
引数としてフルパスのファイル名と、04の場合の入力された文字。標準入力経由でtemp-file、perlが処理した内容を受けとるところとして「*scratch*」バッファを設定。
08:バッファ全体をマークして
09:バッファをクリップボードにコピー
受けとるperl側は以下。長いのでpackageについては端折るけど。
・フルパスファイル名がわかっているものは、ファイルを読み込んで処理。
・ファイル名がないものは、一行ずつ処理したり、全部読み込んでから処理したり。
(第一引数はファイル名。第二引数がマクロの04で入力した文字)
use strict;
use utf8;
use Encode;
binmode STDOUT=>":utf8";
my $file = shift(@ARGV);
my $x = xyzzy_buffer->new({});
if($file =~ m!easy_epub.+(\.txt)$!){ easy_epub フォルダで作業してる時はeasy_epubで作成
$x->run_easy_epub;
exit;
}
elsif($file =~ m!\.p[lm]$!){ 拡張子が.pl .pmは perl-wc でエラーチェック。
$x->check_error({file=>$file});
exit;
}
my $op = shift(@ARGV);
my @buf;
while(<>){
my $line = Encode::decode(’utf8’, $_);
if(! $file ){
if( $op =~ m!^[dD]$!){
print $x->delete_space({line=>$line});
}
elsif($op =~ m!^[tT]$!){
print $x->tab4space({line=>$line});
}
elsif($op =~ m!^[eE]$!){
push(@buf, $line);
}
else{
print $line;
}
}
}
if($op =~ m!^[eE]$! && @buf){
$x->make_ebook_page({contents=>\@buf});
}
いやもうほんと滅茶苦茶最強のテキスト処理環境のできあがりだ。
どのぐらい最強かというと、今日まさに立川で観てきた爆音「マッドマックス FR」のお婆ちゃんズぐらい最強だ(実写版ジブリだったなあ)


