xyzzyのバッファを書き出す

2015/8/22 [15:44:21] (土) 天気

PDFのデータをWEBの管理ページにコピペという単調なワープアIT軽作業。

ぺたぺた貼りつけるだけならいいんだけど、PDFのデータは印刷のことを考えて(?)半角数字などの両側に半角のスペースが入ってたりするし、改行があるとWEBで表示すると半角程度空白になってしまう。


・PDFからエディタにコピペ

・無駄な半角スペースと改行を削除

・エディタから管理ページのフォームにコピペ


という作業。

毎度毎度エディタに貼りつけ置換して…いちいち同じ作業にむかついてきたので、調べてみた。


xyzzyというWINDOWSのエディタを10年以上使っていて、以前はマクロ(lisp)が面白くていろいろいじくってた。でも、もうすっかりびっくり忘却の彼方。lispは手強い。


とりあえず。xyzzyの編集中のバッファをperlに渡して処理させて、その結果を編集中のバッファに書き出して、クリップボードにコピーしてくれればいいや、と久しぶりにxyzzyのlispを調べた。


・カレントバッファをtmpファイルに書き出す

・外部コマンドでtmpファイルを開いて処理をして、その結果をカレントバッファに書き出す

・クリップボードにコピーする


(defun put-current-buffer-to-tmpfile ()
  (interactive)
  (setq temp-file "_xyzzy.tmp")
  (delete-file temp-file)
  (write-file temp-file)
  (execute-shell-command (concat "_xyzzy-tmp.bat" " " temp-file) t (selected-buffer))
  (copy-region-to-clipboard (progn(goto-bol)(point)) (progn(goto-eol)(point)))
)

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を避けて、普段使い慣れてる処理系で書けるのは本当に助かる。


image
<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】