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)