# HG changeset patch # User gongo # Date 1219739173 -32400 # Node ID 0b7ba6b2a0f9bf3a301df040c7577c6984421767 # Parent 769ebe87cd5a71b10877503f44b4f8cca13cf38c *** empty log message *** diff -r 769ebe87cd5a -r 0b7ba6b2a0f9 test/session-info/README --- a/test/session-info/README Tue Aug 26 15:19:34 2008 +0900 +++ b/test/session-info/README Tue Aug 26 17:26:13 2008 +0900 @@ -1,2 +1,40 @@ -ここはまだできてないので -動いてないと思います \ No newline at end of file +/** + * $Id$ + */ + +編集したバッファによって、対応する SessionInfo を呼び出す + + +-------- +- 状況 - +-------- + +Session と emacs Buffer を一対一の関係にするっつーことで、 +バッファに対応する SessionInfo を生成した。これは + +SessionID, EditorID, Send Command List, Recv Command List + +で構成されている。 + +-------- +- 流れ - +-------- + +1. ユーザが編集をおこなった +2. そのバッファ名から、対応する SessionInfo を hash table より取得 +3. SessionInfo から sid, eid を取り出す + +4. 本番だと、その sid, eid を REPcommand に含めて SessionManager に送信 + +まあ簡単ですねきっと + +--------- +- Usage - +--------- + +1. emacs を起動 +2. M-x load-file [Enter] で redit-test-change-session.el を指定する +3. M-x redit-test-start で起動 + このとき、バッファに hoge.c hoge.c<2> hoge.c<3> という3つのバッファができる + 各バッファで編集を行うと、そのバッファに対応する sid eid が + *Messages* に表示される。対応する様子は .el を見てください。 diff -r 769ebe87cd5a -r 0b7ba6b2a0f9 test/session-info/redit-test-change-session.el --- a/test/session-info/redit-test-change-session.el Tue Aug 26 15:19:34 2008 +0900 +++ b/test/session-info/redit-test-change-session.el Tue Aug 26 17:26:13 2008 +0900 @@ -48,37 +48,81 @@ (send_cmdlist nil) (recv_cmdlist nil)) ;; create and initialize -(defun test-redit-create-session-info (sid eid) +(defun redit-test-create-session-info (sid eid) (make-SessionInfo :sid sid :eid eid :send_cmdlist (make-Queue) :recv_cmdlist (make-Queue))) -(defun test-redit-get-session-id-from-session-info (sinfo) +(defun redit-test-get-session-id-from-session-info (sinfo) (SessionInfo-sid sinfo)) -(defun test-redit-get-editor-id-from-session-info (sinfo) +(defun redit-test-get-editor-id-from-session-info (sinfo) (SessionInfo-eid sinfo)) -(defun test-redit-get-sendqueue-from-session-info (sinfo) +(defun redit-test-get-sendqueue-from-session-info (sinfo) (SessionInfo-send_cmdlist sinfo)) -(defun test-redit-get-recvqueue-from-session-info (sinfo) +(defun redit-test-get-recvqueue-from-session-info (sinfo) (SessionInfo-recv_cmdlist sinfo)) ;; hash table of SessionInfo -(defvar bufname-to-sid-table (make-hash-table)) -(defvar sid-to-session-table (make-hash-table)) +(defvar htable-sid2bufname (make-hash-table)) +(defvar htable-bufname2sinfo (make-hash-table)) + +(defun redit-test-sinfo-add-sid2buf (sid bufname) + (setf (gethash sid htable-sid2bufname) bufname)) +(defun redit-test-sinfo-get-sid2buf (sid) + (gethash sid htable-sid2bufname)) +(defun redit-test-sinfo-rm-sid2buf (sid) + (remhash sid htable-sid2bufname)) + +(defun redit-test-sinfo-add-buf2sinfo (bufname sinfo) + (setf (gethash bufname htable-bufname2sinfo) sinfo)) +(defun redit-test-sinfo-get-buf2sinfo (bufname) + (gethash bufname htable-bufname2sinfo)) +(defun redit-test-sinfo-rm-buf2sinfo (bufname) + (remhash bufname htable-bufname2sinfo)) + +;; バッファを3つ作り、それぞれに対応する SessionInfo を登録する +(defun redit-test-start () + (interactive) + (let ((sinfo1 (redit-test-create-session-info 0 1)) ;; sid = 0, eid = 1 + (sinfo2 (redit-test-create-session-info 3 8)) ;; sid = 3, eid = 8 + (sinfo3 (redit-test-create-session-info 102 12)) ;; sid = 102, eid = 12 + (bufname)) + + ;; hoge.c sid = 0 eid = 1 + (setq bufname (buffer-name (generate-new-buffer "hoge.c"))) + (redit-test-sinfo-add-sid2buf 0 bufname) + (redit-test-sinfo-add-buf2sinfo bufname sinfo1) -(defun test-redit-sinfo-add-buf2sid (bufname sid) - (setf (gethash bufname bufname-to-sid-table) sid)) -(defun test-redit-sinfo-get-buf2sid (bufname) - (gethash bufname bufname-to-sid-table)) -(defun test-redit-sinfo-rm-buf2sid (bufname) - (remhash bufname bufname-to-sid-table)) + ;; hoge.c<2> sid = 3 eid = 8 + (setq bufname (buffer-name (generate-new-buffer "hoge.c"))) + (redit-test-sinfo-add-sid2buf 3 bufname) + (redit-test-sinfo-add-buf2sinfo bufname sinfo2) + + ;; hoge.c<3> sid = 102 eid = 12 + (setq bufname (buffer-name (generate-new-buffer "hoge.c"))) + (redit-test-sinfo-add-sid2buf 102 bufname) + (redit-test-sinfo-add-buf2sinfo bufname sinfo3) + + (add-hook 'before-change-functions + 'redit-test-before-change-function t))) -(defun test-redit-sinfo-add-sid2sinfo (sid eid sinfo) - (setf (gethash sid sid-to-session-table) sinfo)) -(defun test-redit-sinfo-get-sid2sinfo (sid) - (gethash sid sid-to-session-table)) -(defun test-redit-sinfo-rm-sid2sinfo (sid) - (remhash sid sid-to-session-table)) +(defun redit-test-stop () + (interactive) + (remove-hook 'before-change-functions + 'redit-test-before-change-function)) + +;; 編集が行われた時に呼び出される。 +;; そのバッファ名から SessionInfo を hash table から取得し、 +;; 取得した SessionInfo から sid, eid を読み取り出力する +(defun redit-test-before-change-function (begin end) + (let ((sinfo) (sid) (eid) (bufname (buffer-name))) + (setq sinfo (redit-test-sinfo-get-buf2sinfo bufname)) + (if sinfo + (progn + (setq sid (SessionInfo-sid sinfo)) + (setq eid (SessionInfo-eid sinfo)) + (message (format "sid = %d, eid = %d\n" sid eid))) + ))) \ No newline at end of file