# HG changeset patch # User gongo # Date 1198400743 -32400 # Node ID dd22e85d6eab400784b6df258c26ee8f6ace4a04 # Parent 5f83b978de82bba9c8231131fb5f7499ea016841 ¼õ¿®Ê¸»úÎó¤ÎÆüËܸìʸ»ú²½¤±¤Î½¤Àµ diff -r 5f83b978de82 -r dd22e85d6eab ChangeLog --- 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 + * 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 毎に情報を保持できると信じる。 diff -r 5f83b978de82 -r dd22e85d6eab redit-client-sm.el --- 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 じゃなくてずれる可能性があるので + ;; $BAwl9g$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 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!)AjA0$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!"