Xyzzy/BufFilter

Last-modified: 2008-04-16 (水) 11:31:54

エディタにも時代区分てのがあると思うんである。

近代エディタと前近代エディタを分けるのは、「バッファの内容を外部コマンドに食わせて、その出力をまた取込む」機能の有無じゃないだろうか。「バッファの内容を云云」はなくても、「外部コマンドの結果を直接取込む」機能の存否が前近代と近代との境目なんじゃないか。

この機能、知ると知らないとでは大違い。知らなかったら

  1. バッファを一旦保存する
  2. コマンドラインから何かしら入力し、ファイルを加工する。出力をファイルに落とすのを忘れないこと
  3. 出力結果のファイルをエディタに読込む

といった手間をかけなければならないところ、エディタにいながらにしてちょちょいのちょいでバッファを加工できる。

WordStarにはこんな機能はなかった筈だ。何せ8ビットCP/M時代のエディタだしな。WordStarの16ビット版であるWordMasterにもなかったと思う。MS-DOS(PC-DOS)のエディタも、機能豊富とはいえここまでやるものはそう多くなかったんじゃないか。一方UnixのエディタはDOS誕生より前に書かれたex/viが既にこの機能を持っている。exの先祖であるedにはまだなかったようだ。

まあこの辺はエディタ歴史学として別途考察することにして、xyzzyも近代エディタとしてfilter-region, filter-bufferというコマンドを持っている。

同じようなことをするのにふたつのコマンド(キーストローク)を憶えるのはかったるいな。

ひとつのコマンドにまとめてしまえ。

余談ながら、調べてみるとfilter-bufferはfilter-regionを呼んでるんだった。まあそれもそうか。

バッファ全体かリージョンかは前置引数の有無で見分けることにする。デフォルトはどっちか迷ったが、ex/viの動きも参考にして、リージョンを対象とするのをデフォルトにした。

コマンド名はこれまたex/viを参考にして、bang(!)。

; 前置引数がなければ(デフォルト)リージョン。
; あればバッファ全体。
(defun bang (cmd &optional whole)
  (interactive "e! \np" :history0 'execute)
  (if (typep whole 'number)
      (filter-region cmd
                     (point-min) (point-max))
    (filter-region cmd
                   (region-beginning) (region-end))
    ))