xyzzyのlispとか

cppファイルとhファイルをいれかえるlisp
.xyzzyにでも。
キーバインドのC-tは好きな物に変えてください。

cppファイルとhファイルが同名でない場合は、
// relation-file:"hoge.h"
などと書いておけば、そのファイルを開く。

既知のバグ。
「foge.h」が存在しなくてもバッファを作成してしまう。


(define-key ed::*c++-mode-map* #\C-t 'change-source)

(defun get-file-buffer-name (filename)
; 渡されたファイル名のバッファがあればその名前を返す
(let ((targetbuffer (get-file-buffer filename)))
(if targetbuffer
(buffer-name targetbuffer))))

(defun get-relation-file ()
;; 関係しているファイルを得る
(save-excursion
(goto-char (point-min)) ;(beginning-of-buffer)のかわり。マーカに作用しない
(if (scan-buffer "relation-file:\"\\(.*\\)\"" :regexp t)
(match-string 1)
(let ((name (buffer-name (selected-buffer))))
(string-match "\\(.*\\)\\.\\(.*\\)" name)
(if (equal "h" (match-string 2))
(format nil "~A.cpp" (match-string 1))
(format nil "~A.h" (match-string 1)))))))

(defun change-source ()
;; cppファイルとhファイルをいれかえる
(interactive)
(let ((name (get-relation-file)))
(if name
(ed::find-file name)
(message "ファイルが見つかりません"))))