Mercurial > hg > RemoteEditor > emacs
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