xyzzyとArtisticStyleの連携

xyzzyからArtisticStyleを呼びだして使うlispを書いてみた。

・整形実行のログが参照できること
・整形実行後に元のファイルがアクティブになっていること
・元のファイルをアクティブにする際に行も記憶していること

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Artistic StyleでCソース整形 (Artistic Style 1.22専用)
;;
;; 現在のバッファをAstyle.exeで整形する。
;; 実行終了を待ってからバッファの再読込を行う。
;;
;; ここで使用しているArtistic Style のオプション
;; -t4 : インデントをタブで行う。タブ幅は4を指定。
;; -s4 : インデントをスペース4つで行う。
;; -S  : 'switch' に対して 'case XXX:' をインデントする。
;; -l  : ブラケットをclassや関数宣言では行分割し、ブロック前文と同じ行に置く。('--brackets= linux')
;; -p  : 演算子だけの場合、前後に空白を挿入する。
;; -y  : '--brackets=attach' か '--brackets= linux' を使用したときに、 先行する閉ブラケットと閉ヘッダ(例えば'else', 'catch', ...)を行分割する。
;; -X  : 標準エラー出力でなく標準出力へエラーおよびヘルプ情報を表示する。
;; -v  : 冗長なモード。オプション情報等を表示する。
(defun astyle () (interactive)
  ; 現在のバッファ名を保持
  (setq curbuf (buffer-name (selected-buffer)))

  ; 現在のカーソル行番号を保持
  (setq curline (current-line-number))

  ; てきとうなオプションをつけてAStyleを起動
  (pipe-command (concat (merge-pathnames "bin/AStyle.exe" (si:system-root)) " -SlpyXvt4 " (get-buffer-file-name)))

  ; AStyle終了後にウィンドウが分割され、結果が*Shell output*バッファに表示される

  ; AStyleの結果を出力したバッファ名を保持
  (setq resultbuf (buffer-name (selected-buffer)))

  ; 整形したバッファに移動して再読み込み
  ; ここではウィンドウ移動は行わない
  ; →2分割されたウィンドウに同じソースファイルがそれぞれ表示されている状態
  (switch-to-buffer curbuf)
  (revert-buffer)

  ; AStyleの結果を出力したバッファにスイッチ
  (switch-to-buffer resultbuf)

  ; 以前表示していたウィンドウをアクティブに
  ; →整形されたファイルが表示されているウィンドウに移動
  (move-previous-window)

  ; カーソル位置を戻す
  (goto-line curline))
(define-key spec-map #\C-a 'astyle)