changeset 38:dd22e85d6eab

¼õ¿®Ê¸»úÎó¤ÎÆüËܸìʸ»ú²½¤±¤Î½¤Àµ
author gongo
date Sun, 23 Dec 2007 18:05:43 +0900
parents 5f83b978de82
children ca6df6937dd1
files ChangeLog redit-client-sm.el
diffstat 2 files changed, 284 insertions(+), 180 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Dec 23 11:18:13 2007 +0900
+++ b/ChangeLog	Sun Dec 23 18:05:43 2007 +0900
@@ -1,5 +1,43 @@
 2007-12-23  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
 
+	* thinking:
+	buffer に対しての replace は (replace-string FROM TO) がある。
+	けど、先輩と一緒に探してみたけど、変数に対しての replace がない。
+	デフォルトでは実装されてない string.el ってのにありそうで。
+	まあ、デフォルトである関数を駆使すると
+
+	FROM で文字列を分割 リストに変換される。: (split-string FROM) 
+	TO を間に挟んで文字列に変換 : 関数不明
+
+	てかないとは思えないんだよな replace 。
+
+	
+	* 日本語関係:
+	昔のゼミの資料に載ってるしね!!
+
+	(decode-coding-string "\201\202" 'utf-8)
+
+	* thining:
+	eid は sid から、sid は bufname からってことにした。
+	で、global な変数の redit-client-session-id とか editor-id が
+	要らなくなってしまうが、本当は使いたい。
+	get-eid-from-session-info みたいなことはできるけど
+	送る度に毎回呼ぶのはちょっと。どこまで高い負荷かはわからんけど。
+	で、理想としては
+
+	バッファ(ファイル)を切り替える度に、bufname->sid を呼んで
+	editor-id に設定してってのがよい。これだと get-* を呼ぶのは
+	バッファ切る変える時だけですむ。
+	けど、「バッファを切り替えたとき」の hook が無いみたい。
+	探し方が悪いのか。見つからない。てか無い?
+
+	いろいろやり方はあるみたい(buffer-list のソートがほげほげ)だが
+	よくわからん。難しい。
+	「バッファが変更されたとき」はあるけど、これは文字を
+	打つだけで呼び出されるので余計悪化する。
+
+	当分は
+
 	* redit-client-sm.el: Session Info struct, hash table
 	Session ID から取得できる Session Info 構造体を作成。
 	これで Session 毎に情報を保持できると信じる。
--- a/redit-client-sm.el	Sun Dec 23 11:18:13 2007 +0900
+++ b/redit-client-sm.el	Sun Dec 23 18:05:43 2007 +0900
@@ -57,7 +57,7 @@
 (defvar redit-max-string-length 1004
   "Read-Write max length of string.")
 
-;; REP が使用する文字コード
+;; REP $B$,;HMQ$9$kJ8;z%3!<%I(B
 (defvar rep-string-encoding 'utf-8)
 
 (defvar redit-open-command           1)
@@ -138,10 +138,6 @@
 (defun redit-get-text-from-queue (queue)
   (nth 3 (Queue-front queue)))
 
-;;(defvar redit-client-command-queue (make-Queue))
-;;(defvar redit-client-receive-queue (make-Queue))
-;;(defvar redit-client-send-queue (make-Queue))
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Session Info struct ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -154,33 +150,50 @@
 (defstruct SessionInfo (eid nil) (send_cmdlist nil) (recv_cmdlist nil))
 
 ;; create and initialize
-(defun redit-create-sessionInfo (eid send recv)
-  (make-SessionInfo :eid eid :send_cmdlist send :recv_cmdlist recv))
+(defun redit-create-session-info (eid)
+  (make-SessionInfo :eid eid
+		    :send_cmdlist (make-Queue)
+		    :recv_cmdlist (make-Queue)))
 
-(defun redit-get-eid-from-sessionInfo (sinfo)
+(defun redit-get-editor-id-from-session-info (sinfo)
   (SessionInfo-eid sinfo))
-(defun redit-get-sendqueue-from-sessionInfo (sinfo)
+(defun redit-get-sendqueue-from-session-info (sinfo)
   (SessionInfo-send_cmdlist sinfo))
-(defun redit-get-recvqueue-from-sessionInfo (sinfo)
+(defun redit-get-recvqueue-from-session-info (sinfo)
   (SessionInfo-recv_cmdlist sinfo))
 
 ;;;;;;;;;;;;;;;;;
 ;; hash table  ;;
 ;;;;;;;;;;;;;;;;;
 
-(defvar bufname-to-sid-table (make-hash-table))
+(defvar bufname-to-sid-table (make-hash-table :test #'equal))
 (defvar sid-to-session-table (make-hash-table))
 
 (defun redit-set-sid-to-bufname-table (bufname sid)
   (setf (gethash bufname bufname-to-sid-table) sid))
 (defun redit-get-sid-from-bufname-table (bufname)
-  (gethash sid bufname-to-sid-table))
+  (gethash bufname bufname-to-sid-table))
 
 (defun redit-set-session-info-to-sid-table (sid sinfo)
   (setf (gethash sid sid-to-session-table) sinfo))
 (defun redit-get-session-info-from-sid-table (sid)
   (gethash sid sid-to-session-table))
 
+(defun gongo-start ()
+  (interactive)
+  (add-hook 'before-change-functions
+	    'redit-client-before-change-function t t)
+  (add-hook 'after-change-functions
+	    'redit-client-after-change-function t t)
+)
+
+(defun gongo-stop ()
+  (interactive)
+  (remove-hook 'before-change-functions
+	    'redit-client-before-change-function t)
+  (remove-hook 'after-change-functions
+	    'redit-client-after-change-function t)
+)
 
 
 ;;;;;;;;;;;;;;;;;;;
@@ -241,15 +254,15 @@
     
     ;; //Code of the process input/output buffer is rep-string-encoding
     ;; //(set-process-coding-system redit-client-process rep-string-encoding rep-string-encoding)
-    ;; 送受信するデータはバイナリで貰わないといけない。
-    ;; utf-8 じゃなくてずれる可能性があるので
+    ;; $BAw<u?.$9$k%G!<%?$O%P%$%J%j$GLc$o$J$$$H$$$1$J$$!#(B
+    ;; utf-8 $B$8$c$J$/$F$:$l$k2DG=@-$,$"$k$N$G(B
     (set-process-coding-system redit-client-process 'binary 'binary)
     
-    ;; プロセスが生きてるとき、 emacs を終了しようとすると
-    ;; 「processがうんたらで、本当に切ってもいいの y/n」
-    ;; って聞かれる。nil てやっておくと聞かれない。
-    ;; quit を入れるんなら t にして有効にすべきなんだろうか。
-    ;; 今は nil で
+    ;; $B%W%m%;%9$,@8$-$F$k$H$-!"(B emacs $B$r=*N;$7$h$&$H$9$k$H(B
+    ;; $B!V(Bprocess$B$,$&$s$?$i$G!"K\Ev$K@Z$C$F$b$$$$$N(B y/n$B!W(B
+    ;; $B$C$FJ9$+$l$k!#(Bnil $B$F$d$C$F$*$/$HJ9$+$l$J$$!#(B
+    ;; quit $B$rF~$l$k$s$J$i(B t $B$K$7$FM-8z$K$9$Y$-$J$s$@$m$&$+!#(B
+    ;; $B:#$O(B nil $B$G(B
     (set-process-query-on-exit-flag redit-client-process nil)
     
     ;; not necessary since Emacs 21.1
@@ -257,21 +270,26 @@
     ;; (make-local-hook 'after-change-functions)
     
     (if (string= "*scratch*" bufname) 
+	(progn
 	;; JOIN if buffer-name is "*scratch*"
+	  (process-send-string
+	   redit-client-process
+	   (concat
+	    (redit-pack
+	     redit-join-command
+	     0 0 0 0 (string-bytes bufname))
+	    (buffer-name)))
+	  (message "join-command"))
+      ;; PUT if buffer-name is not "*scratch*"
+      (progn
 	(process-send-string
 	 redit-client-process
 	 (concat
 	  (redit-pack
-	   redit-join-command
-	   0 0 0 0 0)))
-      ;; PUT if buffer-name is not "*scratch*"
-      (process-send-string
-       redit-client-process
-       (concat
-	(redit-pack
-	 redit-put-command
-	 0 0 0 0 (string-bytes bufname))
-	(buffer-name)))
+	   redit-put-command
+	   0 0 0 0 (string-bytes bufname))
+	  (buffer-name)))
+	(message "put-command"))
       )))
 
 (defun redit-quit-command ()
@@ -284,17 +302,17 @@
   (if redit-client-process
       (if (setq file (read-string "Filename: "))
 	  (progn
-	    ;; redit-client-process の input に文字列を送信する
+	    ;; redit-client-process $B$N(B input $B$KJ8;zNs$rAw?.$9$k(B
 	    (process-send-string
 	     redit-client-process
-	     ;; redit-open-command (01) と file を連結させる
+	     ;; redit-open-command (01) $B$H(B file $B$rO"7k$5$;$k(B
 	     (concat redit-open-command file))
-	    ;; redit-client-process から出力を得るまでループ
+	    ;; redit-client-process $B$+$i=PNO$rF@$k$^$G%k!<%W(B
 	    (while (eq nil (accept-process-output redit-client-process)))))
     (error "redit-client is not running.")))
 
-;; redit-client-process にreadコマンドとバッファ番号、行番号を送り、
-;; サーバからの出力を得る
+;; redit-client-process $B$K(Bread$B%3%^%s%I$H%P%C%U%!HV9f!"9THV9f$rAw$j!"(B
+;; $B%5!<%P$+$i$N=PNO$rF@$k(B
 (defun redit-client-read-line (linenum)
   (if redit-client-process
       (save-excursion
@@ -307,13 +325,13 @@
     (error "redit-client is not running.")))
 
 
-;; linenumで指定された行の編集をサーバへ送る
-;; redit-client-process に insert コマンドと
-;;バッファ番号、行番号、行の内容を送り、 Ack を受け取る
+;; linenum$B$G;XDj$5$l$?9T$NJT=8$r%5!<%P$XAw$k(B
+;; redit-client-process $B$K(B insert $B%3%^%s%I$H(B
+;;$B%P%C%U%!HV9f!"9THV9f!"9T$NFbMF$rAw$j!"(B Ack $B$r<u$1<h$k(B
 (defun redit-client-insert-line (linenum isnewline)
   (if redit-client-process
       (save-excursion
-	(let ((beginp) (endp) (text) (length) (packet))
+	(let ((beginp) (endp) (text) (length) (packet) (sinfo))
 	     (setq beginp
 		   (progn (goto-line linenum) (beginning-of-line) (point)))
 	     (setq endp
@@ -322,26 +340,47 @@
 		   (encode-coding-string
 		    (buffer-substring beginp endp) rep-string-encoding))
 	     (setq length (string-bytes text))
+	     
+	     ;;(setq packet (concat (redit-pack redit-insert-command
+		;;			      redit-client-session-id
+			;;		      redit-client-editor-id
+				;;	      (gen-seqno) linenum length)
+	     (setq redit-client-session-id
+		   (redit-get-sid-from-bufname-table "test.c"))
+	     (setq sinfo
+		   (redit-get-session-info-from-sid-table
+		    redit-client-session-id))
+	     (setq redit-client-editor-id
+		   (redit-get-editor-id-from-session-info sinfo))
 
-	     (setq packet (concat (redit-pack redit-insert-command
-					      redit-client-session-id
-					      redit-client-editor-id
-					      (gen-seqno) linenum length)
-				  text
-				  (if (eq isnewline t) "\n")))
-
-
+	     (message (concat
+		       "cmd = " (number-to-string redit-insert-command) ", "
+		       "sid = " (number-to-string redit-client-session-id) ", "
+		       "eid = " (number-to-string redit-client-editor-id) ", "
+		       "seq = " "0" ", "
+		       "lno = " (number-to-string linenum) ", "
+		       "siz = " (number-to-string length) "\n"
+		       "text= " text))
+	     (setq packet
+		   (concat
+		    (redit-pack
+		     redit-insert-command
+		     redit-client-session-id
+		     redit-client-editor-id
+		     (gen-seqno) linenum length)
+		    text
+		    (if (eq isnewline t) "\n")))	     
 	     (process-send-string redit-client-process packet)))
     (error "redit-client is not running.")))
 
-;; linenum で指定した行の削除命令を redit-client-process に送信する
+;; linenum $B$G;XDj$7$?9T$N:o=|L?Na$r(B redit-client-process $B$KAw?.$9$k(B
 (defun redit-client-delete-line (linenum)
   (if redit-client-process
       (save-restriction
 
-	;; トークンが回ってくるのを待つ場合は、
-	;; すぐに process-send-string せずに
-	;; 編集情報を保存するだけにとどめる
+	;; $B%H!<%/%s$,2s$C$F$/$k$N$rBT$D>l9g$O!"(B
+	;; $B$9$0$K(B process-send-string $B$;$:$K(B
+	;; $BJT=8>pJs$rJ]B8$9$k$@$1$K$H$I$a$k(B
 	;;(enqueue redit-client-command-queue
 	;;(concat (format "%10d%10d%10d%10d%10d%10d" (string-to-number redit-delete-line-command) redit-client-session-id redit-client-editor-id (gen-seqno) linenum 0) "\n"))
 	
@@ -355,7 +394,7 @@
 		      (gen-seqno) linenum 0))))
     (error "redit-client is not running.")))
 
-;; redit-client-process へcloseコマンドを送る
+;; redit-client-process $B$X(Bclose$B%3%^%s%I$rAw$k(B
 (defun redit-client-close ()
   "Save File and exit Remote-edit client."
   (interactive)
@@ -372,7 +411,7 @@
        redit-client-editor-id
        (gen-seqno) 0 0) "\n"))))
 
-;; redit-client-process を終了させる
+;; redit-client-process $B$r=*N;$5$;$k(B
 (defun redit-client-kill ()
   "Stop Remote-Edit client process."
   (interactive)
@@ -383,25 +422,24 @@
   (kill-all-local-variables))
 
 ;; proc == redit-client-process
-;; string == redit-client-process からの output
+;; string == redit-client-process $B$+$i$N(B output
 (defun redit-client-process-filter (proc string)
-  ;; バッファローカルなフックリスト before-change-functions から
-  ;; redit-client-before-change-function を取り除く. after も同じ
-  ;; proc からの出力に hook しないように
+  ;; $B%P%C%U%!%m!<%+%k$J%U%C%/%j%9%H(B before-change-functions $B$+$i(B
+  ;; redit-client-before-change-function $B$r<h$j=|$/(B. after $B$bF1$8(B
+  ;; proc $B$+$i$N=PNO$K(B hook $B$7$J$$$h$&$K(B
   (remove-hook 'before-change-functions
 	       'redit-client-before-change-function t)
   (remove-hook 'after-change-functions
 	       'redit-client-after-change-function t)
 
-  (message "hoehohoe")
-  
+  (message (concat "redit-client-process-filter: " string))
   (let ((command (rep-get-command-from-pkt string)))
-    ;; command がどの命令かを判断し、対応した処理をする。case みたい
+    ;; command $B$,$I$NL?Na$+$rH=CG$7!"BP1~$7$?=hM}$r$9$k!#(Bcase $B$_$?$$(B
     (cond 
      ;; FIXME
-     ((if (= command redit-open-ack)
-	  (if (/= redit-client-editor-id (rep-get-editor-id-from-pkt string))
-	      (redit-client-exec-open-ack string))))
+     ;;((if (= command redit-open-ack)
+     ;;(if (/= redit-client-editor-id (rep-get-editor-id-from-pkt string))
+     ;;(redit-client-exec-open-ack string))))
 
      ((if (= command redit-read-ack)
 	  (if (= redit-client-editor-id (rep-get-editor-id-from-pkt string))
@@ -444,8 +482,8 @@
 	    'redit-client-after-change-function t t)
   )
 
-;; window-scroll-functions に hook される。
-;; window がスクロールする度に呼ばれる
+;; window-scroll-functions $B$K(B hook $B$5$l$k!#(B
+;; window $B$,%9%/%m!<%k$9$kEY$K8F$P$l$k(B
 (defun redit-client-update-function (window window-start)
   (if (equal (window-buffer) redit-client-buffer)
       (save-excursion
@@ -479,7 +517,7 @@
 	(add-hook 'after-change-functions
 		  'redit-client-after-change-function t t))))
 
-;; currentp の位置の行数を返す
+;; currentp $B$N0LCV$N9T?t$rJV$9(B
 (defun real-count-lines (currentp)
   (+ (count-lines (point-min) currentp)
      (if (= (save-excursion (goto-char currentp) (current-column))
@@ -493,130 +531,131 @@
       (setq exprs (cdr exprs)))
     (goto-char saved-point)))
 
-;; before-change-functions に hook される
-;; バッファに変更があるたびに呼ばれる。バッファが変更される前に呼ばれる。
-;; begin と end には変更前の変更部分の始まりと終わりの point が入る
+;; before-change-functions $B$K(B hook $B$5$l$k(B
+;; $B%P%C%U%!$KJQ99$,$"$k$?$S$K8F$P$l$k!#%P%C%U%!$,JQ99$5$l$kA0$K8F$P$l$k!#(B
+;; begin $B$H(B end $B$K$OJQ99A0$NJQ99ItJ,$N;O$^$j$H=*$o$j$N(B point $B$,F~$k(B
 (defun redit-client-before-change-function (begin end)
-  (let ((beginl (real-count-lines begin)) ;; begin の行番号
-	(endl (real-count-lines end))	  ;; end の行番号
+  (let ((beginl (real-count-lines begin)) ;; begin $B$N9THV9f(B
+	(endl (real-count-lines end))	  ;; end $B$N9THV9f(B
 	(currline))			  ;; currline = nil
 
     ;; (message "before-change-function")
 
-    ;; 前回の編集した行と今回の編集した行が
-    ;; 違っていたら前回の編集をサーバへ送る
+    ;; $BA02s$NJT=8$7$?9T$H:#2s$NJT=8$7$?9T$,(B
+    ;; $B0c$C$F$$$?$iA02s$NJT=8$r%5!<%P$XAw$k(B
     (if (not (= beginl redit-client-previous-edited-line))
 	(redit-client-insert-line redit-client-previous-edited-line nil))
 
-    ;; 削除処理で起こる。
-    ;; (ex. BackSpaceによる行そのものの削除, C-Space C-wなどのカット, ...)
+    ;; $B:o=|=hM}$G5/$3$k!#(B
+    ;; (ex. BackSpace$B$K$h$k9T$=$N$b$N$N:o=|(B, C-Space C-w$B$J$I$N%+%C%H(B, ...)
     (if (< beginl endl)
 	(progn
 	  (setq currline endl)
-	  ;; endlからbeginlまで行の削除命令を出す
+	  ;; endl$B$+$i(Bbeginl$B$^$G9T$N:o=|L?Na$r=P$9(B
 	  (while (> currline beginl) 
 	    (redit-client-delete-line endl)
 	    (setq currline (- currline 1)))))))
 
-;; after-change-functions に hook される
-;; バッファに変更があるたびに呼ばれる。バッファが変更された後に呼ばれる
-;; begin と end には変更後の変更部分の始まりと終わりの point が入る
+;; after-change-functions $B$K(B hook $B$5$l$k(B
+;; $B%P%C%U%!$KJQ99$,$"$k$?$S$K8F$P$l$k!#%P%C%U%!$,JQ99$5$l$?8e$K8F$P$l$k(B
+;; begin $B$H(B end $B$K$OJQ998e$NJQ99ItJ,$N;O$^$j$H=*$o$j$N(B point $B$,F~$k(B
 (defun redit-client-after-change-function (begin end length)
   (let ((beginl (real-count-lines begin))
 	(endl (real-count-lines end))
 	(currline))
 
-    ;; (message "after-change-function")
-
-    ;; 挿入処理で起こる。
-    ;; (ex. 改行, C-y などのペースト, ...)
+    ;; $BA^F~=hM}$G5/$3$k!#(B
+    ;; (ex. $B2~9T(B, C-y $B$J$I$N%Z!<%9%H(B, ...)
     (if (< beginl endl)
 	(progn
 	  (setq currline beginl)
-	  ;; beginlからendlまで挿入命令を出す
+	  ;; beginl$B$+$i(Bendl$B$^$GA^F~L?Na$r=P$9(B
 	  (while (<= currline endl)
 	    (progn (redit-client-insert-line currline nil)
 		   (setq currline (+ currline 1))))))
     (setq redit-client-previous-edited-line endl)))
 
-;; 引き数で与えられた string (line_num + text_data) から
-;; 指定された行を削除し、そこに text_data を挿入する
+;; $B0z$-?t$GM?$($i$l$?(B string (line_num + text_data) $B$+$i(B
+;; $B;XDj$5$l$?9T$r:o=|$7!"$=$3$K(B text_data $B$rA^F~$9$k(B
 (defun redit-client-exec-insert-line (string)
-  (let ((linenum (rep-get-line-number-from-pkt string)) ;; 行番号
-	(text (rep-get-text-from-pkt string))) ;; テキストデータ
+  (let ((linenum (rep-get-line-number-from-pkt string)) ;; $B9THV9f(B
+	(text (rep-get-text-from-pkt string))) ;; $B%F%-%9%H%G!<%?(B
     (if (< (real-count-lines (point-max)) linenum)
 	(progn
 	  (call-interactively 'end-of-buffer) (newline)))
     (goto-line linenum)
-    (delete-region (progn (beginning-of-line) (point)) ;; 行の頭から
-		   (progn (end-of-line) (point))) ;; 行の末尾まで削除
-    (insert text) ;; テキストデータを挿入
+    (delete-region (progn (beginning-of-line) (point)) ;; $B9T$NF,$+$i(B
+		   (progn (end-of-line) (point))) ;; $B9T$NKvHx$^$G:o=|(B
+    (insert text) ;; $B%F%-%9%H%G!<%?$rA^F~(B
     (message (concat "recv = " text ", line = " (number-to-string linenum)))
     ))
 
-;; 引き数 string (line_num + text_data) で指定された行を削除する
+;; $B0z$-?t(B string (line_num + text_data) $B$G;XDj$5$l$?9T$r:o=|$9$k(B
 (defun redit-client-exec-delete-line (string)
   (let ((linenum (rep-get-line-number-from-pkt string)))
     (goto-line linenum)
-    ;; 行頭から末尾までのテキストを削除
+    ;; $B9TF,$+$iKvHx$^$G$N%F%-%9%H$r:o=|(B
     (delete-region (progn (beginning-of-line) (point))
 		   (progn (end-of-line) (point)))
-    ;; 指定された行自体を削除
-    ;; 指定された行番号は別の行の番号を表すことになる
+    ;; $B;XDj$5$l$?9T<+BN$r:o=|(B
+    ;; $B;XDj$5$l$?9THV9f$OJL$N9T$NHV9f$rI=$9$3$H$K$J$k(B
     (if (= (point) (point-max))
 	(delete-backward-char 1)
       (delete-char 1)))
   )
 
-;; 引き数 string (buf_num + line_num + text_data) 
-(defun redit-client-exec-open-ack (string)
-  (save-excursion
-    (let ((bufnum (rep-get-editor-id-from-pkt string))
-	  (linenum (rep-get-line-number-from-pkt string)))
-      (make-variable-buffer-local 'redit-client-buffer-name)
-      (make-variable-buffer-local 'redit-client-editor-id)
-      (setq redit-client-buffer-name
-	    (rep-get-text-from-pkt string))
-      (setq redit-client-buffer (get-buffer-create redit-client-buffer-name))
-      ;; プロセスとバッファを関連づける
-      (set-process-buffer redit-client-process redit-client-buffer)
-      (switch-to-buffer redit-client-buffer) ;; windowのバッファを変更する
-      (make-variable-buffer-local 'redit-client-previous-edited-line)
-      (make-variable-buffer-local 'redit-client-after-edited-line)
-      (make-variable-buffer-local 'redit-client-line-max-in-server)
-      (make-variable-buffer-local 'redit-client-previous-line)
-      (setq redit-client-line-max-in-server linenum)
-      (setq redit-client-editor-id bufnum)
-      (setq redit-client-previous-edited-line 1)
-      (setq redit-client-after-edited-line 1)
-      (setq redit-client-previous-line 1)
+;; $B2?MQ!)Aj<j$,3+$$$F$k%U%!%$%k$r<hF@$9$k$N$+$J!)(B
+;; read $B$_$?$$$J$b$s!)(B
+;; $B0z$-?t(B string (buf_num + line_num + text_data) 
+;;(defun redit-client-exec-open-ack (string)
+;;  (save-excursion
+;;    (let ((bufnum (rep-get-editor-id-from-pkt string))
+;;	  (linenum (rep-get-line-number-from-pkt string)))
+;;      (make-variable-buffer-local 'redit-client-buffer-name)
+;;      (make-variable-buffer-local 'redit-client-editor-id)
+;;      (setq redit-client-buffer-name
+;;	    (rep-get-text-from-pkt string))
+;;      (setq redit-client-buffer (get-buffer-create redit-client-buffer-name))
+;;      ;; $B%W%m%;%9$H%P%C%U%!$r4XO"$E$1$k(B
+;;      (set-process-buffer redit-client-process redit-client-buffer)
+;;      (switch-to-buffer redit-client-buffer) ;; window$B$N%P%C%U%!$rJQ99$9$k(B
+;;      (make-variable-buffer-local 'redit-client-previous-edited-line)
+;;      (make-variable-buffer-local 'redit-client-after-edited-line)
+;;      (make-variable-buffer-local 'redit-client-line-max-in-server)
+;;      (make-variable-buffer-local 'redit-client-previous-line)
+;;      (setq redit-client-line-max-in-server linenum)
+;;      (setq redit-client-editor-id bufnum)
+;;      (setq redit-client-previous-edited-line 1)
+;;      (setq redit-client-after-edited-line 1)
+;;      (setq redit-client-previous-line 1)
+;;
+;;      ;;(add-hook 'before-change-functions
+;;      ;;'redit-client-before-change-function t t)
+;;      ;;(add-hook 'after-change-functions
+;;      ;;'redit-client-after-change-function t t)
+;;
+;;      ;; not necessary since Emacs 21.1
+;;      ;; (make-local-hook 'window-scroll-functions)
+;;
+;;      ;; window $B$,%9%/%m!<%k$9$kEY$K8F$P$l$k4X?t72(B
+;;      (add-hook 'window-scroll-functions
+;;		'redit-client-update-function t t))))
 
-      ;;(add-hook 'before-change-functions
-      ;;'redit-client-before-change-function t t)
-      ;;(add-hook 'after-change-functions
-      ;;'redit-client-after-change-function t t)
 
-      ;; not necessary since Emacs 21.1
-      ;; (make-local-hook 'window-scroll-functions)
-
-      ;; window がスクロールする度に呼ばれる関数群
-      (add-hook 'window-scroll-functions
-		'redit-client-update-function t t))))
-
-;; string (line_num + text_data) で指定された行に
-;; text_data を挿入する
+;; string (line_num + text_data) $B$G;XDj$5$l$?9T$K(B
+;; text_data $B$rA^F~$9$k(B
 (defun redit-client-exec-read-ack (string)
   (save-excursion
     (let ((lines (rep-get-line-number-from-pkt string)))
-      ;; redit-client-buffer をカレントバッファにする
+      ;; redit-client-buffer $B$r%+%l%s%H%P%C%U%!$K$9$k(B
       (set-buffer redit-client-buffer)
       (goto-line lines)
-      (beginning-of-line) ;; 行の始めへ移動
+      (beginning-of-line) ;; $B9T$N;O$a$X0\F0(B
       ;;      (delete-region (progn (beginning-of-line) (point))
       ;; 		     (progn (end-of-line) (point)))
-      (insert (rep-get-text-from-pkt string))))) ;; テキストデータを挿入
+      (insert (rep-get-text-from-pkt string))))) ;; $B%F%-%9%H%G!<%?$rA^F~(B
 
-;; redit-client-line-max-in-server に行番号を入れてる(だけ)
+;; redit-client-line-max-in-server $B$K9THV9f$rF~$l$F$k(B($B$@$1(B)
 (defun redit-client-exec-insert-ack (string)
   (save-excursion
     (set-buffer redit-client-buffer)
@@ -629,7 +668,7 @@
     (let ((linenum (rep-get-line-number-from-pkt string)))
       (setq redit-client-line-max-in-server linenum))))
 
-;; プロセスとバッファ、ローカル変数を削除する
+;; $B%W%m%;%9$H%P%C%U%!!"%m!<%+%kJQ?t$r:o=|$9$k(B
 (defun redit-client-exec-close-ack (string)
   (if redit-client-process
       (kill-process redit-client-process))
@@ -637,30 +676,50 @@
       (kill-buffer redit-client-buffer))
   (kill-all-local-variables))
 
-;; 引き数で与えられた string から Editor IDを取得する
+;; $B0z$-?t$GM?$($i$l$?(B string $B$+$i(B Editor ID$B$r<hF@$9$k(B
 (defun redit-client-exec-join (string)
-  (setq redit-client-editor-id (rep-get-editor-id-from-pkt string))
-  (message (concat "your editor id = " (number-to-string redit-client-editor-id) "\n")))
+  (let (sinfo)
+    (setq redit-client-editor-id (rep-get-editor-id-from-pkt string))
+    (setq redit-client-session-id (rep-get-session-id-from-pkt string))
+  
+    (setq sinfo (redit-create-session-info redit-client-editor-id))
+    (redit-set-session-info-to-sid-table redit-client-session-id sinfo)
+    (redit-set-sid-to-bufname-table "test.c" redit-client-session-id)
+    
+    (message (concat "Session ["
+		     (number-to-string redit-client-session-id)
+		     "] "
+		     "test.c"))
+    (message (concat "Your editor id = " (number-to-string redit-client-editor-id)))
+))
 
-;; //引き数で与えられた string から Session IDを取得する
-;; 新仕様で、(put = ファイル有りjoin) ってことになって
-;; editor id を返すことになったので、sid と共に eid もセーブする
+;; //$B0z$-?t$GM?$($i$l$?(B string $B$+$i(B Session ID$B$r<hF@$9$k(B
+;; $B?7;EMM$G!"(B(put = $B%U%!%$%kM-$j(Bjoin) $B$C$F$3$H$K$J$C$F(B
+;; editor id $B$rJV$9$3$H$K$J$C$?$N$G!"(Bsid $B$H6&$K(B eid $B$b%;!<%V$9$k(B
 (defun redit-client-exec-put (string)
-  (setq redit-client-editor-id (rep-get-editor-id-from-pkt string))
-  (setq redit-client-session-id (rep-get-session-id-from-pkt string))
+  (let (sinfo)
+    (setq redit-client-editor-id (rep-get-editor-id-from-pkt string))
+    (setq redit-client-session-id (rep-get-session-id-from-pkt string))
 
-  (message (concat "Your Editor ID = " (number-to-string redit-client-editor-id) "\n"))
-  (message (concat "Session ID = " (number-to-string redit-client-session-id) "\n")))
-
-;; SessionIDを名前とした、新しいバッファを開く
+    (setq sinfo (redit-create-session-info redit-client-editor-id))
+    (redit-set-session-info-to-sid-table redit-client-session-id sinfo)
+    (redit-set-sid-to-bufname-table "test.c" redit-client-session-id)
+    
+    (message (concat "Session ["
+		     (number-to-string redit-client-session-id)
+		     "] "
+		     "test.c" "\n"))
+    (message (concat "Your editor id = " (number-to-string redit-client-editor-id) "\n"))))
+  
+;; SessionID$B$rL>A0$H$7$?!"?7$7$$%P%C%U%!$r3+$/(B
 ;; FIXME
-;;   SessionIDではなく、Session Nameが望ましい?
-;;   バッファを開いた後、Sessionで開いてるファイルの中身を表示するべき
+;;   SessionID$B$G$O$J$/!"(BSession Name$B$,K>$^$7$$(B?
+;;   $B%P%C%U%!$r3+$$$?8e!"(BSession$B$G3+$$$F$k%U%!%$%k$NCf?H$rI=<($9$k$Y$-(B
 (defun redit-client-exec-select ()
   (switch-to-buffer (get-buffer-create
 		     (number-to-string redit-client-session-id))))
 
-;; プロセスの状態を見て、対応したメッセージを表示
+;; $B%W%m%;%9$N>uBV$r8+$F!"BP1~$7$?%a%C%;!<%8$rI=<((B
 (defun redit-client-sentinel (proc msg)
   (cond ((eq (process-status proc) 'exit)
 	 (message "Client subprocess exited"))
@@ -671,6 +730,9 @@
   "generate editor local sequence number."
   (setq redit-client-seqno (+ redit-client-seqno 1)))
 
+(defun redit-make-packet (cmd sid eid seq lno siz text)
+  (concat (redit-pack cmd sid eid seq lno siz) text))
+
 (defun rep-get-command-from-pkt (pkt)
   (redit-unpack-int pkt 1))
 (defun rep-get-session-id-from-pkt (pkt)
@@ -684,22 +746,25 @@
 (defun rep-get-text-size-from-pkt (pkt)
   (redit-unpack-int pkt 6))
 
-;; コマンド後ろにあるテキストは
+;; $B%3%^%s%I8e$m$K$"$k%F%-%9%H$O(B
 ;;   (substring packet 24)
-;; でとれるので、text-size は要らない、とうれしい。
-;; が、(通信テストまだなので)例えば連続してパケットが送られて来たとき
-;; そのパケットが繋がってしまうと駄目。
-;; もし、process-filter が、一つのパケットの処理が終わるまで
-;; 後続のパケットを止めててくれるならこれでいけるが。
-;; 念のため、受け取った text-size と比較して
-;; 同じならおk、だめならそのサイズ分だけ取る、って所か。
-;; 最初からサイズ分だけでいいんじゃね?と思ったりもするが。
-;; あと、現時点ではサイズが違う(失敗)時の処理いれてない。
+;; $B$G$H$l$k$N$G!"(Btext-size $B$OMW$i$J$$!"$H$&$l$7$$!#(B
+;; $B$,!"(B($BDL?.%F%9%H$^$@$J$N$G(B)$BNc$($PO"B3$7$F%Q%1%C%H$,Aw$i$l$FMh$?$H$-(B
+;; $B$=$N%Q%1%C%H$,7R$,$C$F$7$^$&$HBLL\!#(B
+;; $B$b$7!"(Bprocess-filter $B$,!"0l$D$N%Q%1%C%H$N=hM}$,=*$o$k$^$G(B
+;; $B8eB3$N%Q%1%C%H$r;_$a$F$F$/$l$k$J$i$3$l$G$$$1$k$,!#(B
+;; $BG0$N$?$a!"<u$1<h$C$?(B text-size $B$HHf3S$7$F(B
+;; $BF1$8$J$i$*(Bk$B!"$@$a$J$i$=$N%5%$%:J,$@$1<h$k!"$C$F=j$+!#(B
+;; $B:G=i$+$i%5%$%:J,$@$1$G$$$$$s$8$c$M!)$H;W$C$?$j$b$9$k$,!#(B
+;; $B$"$H!"8=;~E@$G$O%5%$%:$,0c$&(B($B<:GT(B)$B;~$N=hM}$$$l$F$J$$!#(B
 (defun rep-get-text-from-pkt (pkt)
   (let ((size) (text))
     (setq size (rep-get-text-size-from-pkt pkt))
     (setq text (substring pkt 24))
-    (if (= size (string-bytes text)) text)))
+    (decode-coding-string text rep-string-encoding)))
+    ;;(if (= size (string-bytes text)) text
+    ;;(decode-coding-string (apply 'concat (split-string text "\xe3"))
+    ;;rep-string-encoding))))
 
 (defun redit-line-translate-out (cque rque)
   "redit line translate for output"
@@ -810,23 +875,24 @@
   )			      ;; defun
 
 ;; for debug
-(defun redit-client-print-command-queue ()
-  "Print command queue."
-  (interactive)
-  ;;(message redit-client-command-queue))
-  (let (queue)
-    (setq queue redit-client-command-queue)
-    (while (Queue-front queue)
-      (message (Queue-front queue))
-      (setq queue (cdr (Queue-rear queue)))
-      )))
-
-(defun redit-client-print-recive-queue ()
-  "Print command queue."
-  (interactive)
-  (print redit-client-receive-queue))
-
-(defun redit-client-print-send-queue ()
-  "Print command queue."
-  (interactive)
-  (print redit-client-send-queue))
+;;(defun redit-client-print-command-queue ()
+;;  "Print command queue."
+;;  (interactive)
+;;  ;;(message redit-client-command-queue))
+;;  (let (queue)
+;;    (setq queue redit-client-command-queue)
+;;    (while (Queue-front queue)
+;;      (message (Queue-front queue))
+;;      (setq queue (cdr (Queue-rear queue)))
+;;      )))
+;;
+;;(defun redit-client-print-recive-queue ()
+;;  "Print command queue."
+;;  (interactive)
+;;  (print redit-client-receive-queue))
+;;
+;;(defun redit-client-print-send-queue ()
+;;  "Print command queue."
+;;  (interactive)
+;;  (print redit-client-send-queue))
+;;
\ No newline at end of file