Mercurial > hg > RemoteEditor > emacs
changeset 40:1978dc75b15c
*** empty log message ***
author | gongo |
---|---|
date | Tue, 19 Aug 2008 16:36:10 +0900 |
parents | ca6df6937dd1 |
children | 0f547ed856f6 |
files | ChangeLog redit-client-sm.el |
diffstat | 2 files changed, 172 insertions(+), 123 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Tue Aug 05 19:14:29 2008 +0900 +++ b/ChangeLog Tue Aug 19 16:36:10 2008 +0900 @@ -1,3 +1,35 @@ +2008-08-19 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp> + + * thinking: buffer と session の関連性 + とりあえずバッファとSessionを関連づけるために + SessionInfo なるものを作ってあるんだけど + その切り替えをいつするかって話。2007-12-23 に書いてるね。 + 先生からの助言で、 + + - Session の情報が必要になるのは + SessionManager に送るときだけなので + before-change-functions/after-change-functions の時に + 切り替えればいいんじゃないか + - 表に出てないバッファに対しても変更は効くはずなので、 + SessionManager から受け取った REP コマンドによる変更は + バッファを指定してバックグラウンドで行う + + こんな感じになりました。なるほどなるへそ。 + + で、SessionInfo はハッシュテーブルで管理してて、 + キーとして SessionID と その Session に対応するバッファ名 + にしようかと思ってる。思ってた。思い続けてた。 + で、バッファ名は基本ファイル名なので、重複する恐れがある云々で + いろいろ考えてたんだけど、よくよく考えて + 通常の emacs でもディレクトリが違ってファイル名同じだったら、 + 下のファイル名の横に + + hoge.c<2> + + みたいな表示が出来る事を思い出した。 + つーことでこれでいいんじゃね? + ということでこの方法とテストプログラム書いてみる + 2008-08-05 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp> * thinking: delete,replace
--- a/redit-client-sm.el Tue Aug 05 19:14:29 2008 +0900 +++ b/redit-client-sm.el Tue Aug 19 16:36:10 2008 +0900 @@ -1,6 +1,8 @@ ;; $Id$ -(eval-when-compile (require 'cl)) +;; cl-macs でマクロとして定義されているため +;; cl.el をインクルードしておく +(require 'cl) ;; ;; REP Command @@ -57,41 +59,44 @@ (defvar redit-max-string-length 1004 "Read-Write max length of string.") -;; REP $B$,;HMQ$9$kJ8;z%3!<%I(B -(defvar rep-string-encoding 'utf-8) +;; REP が使用する文字コード +(defconst rep-string-encoding 'utf-8) + +;; port +(defconst redit-process-port 8766) -(defvar redit-open-command 1) -(defvar redit-open-ack 2) -(defvar redit-read-command 3) -(defvar redit-read-ack 4) -(defvar redit-read-finish-ack 5) ;; obsolete -(defvar redit-insert-command 6) -(defvar redit-insert-ack 7) -;;(defvar redit-write-still-ack "7") -;;(defvar redit-write-finish-ack "8") -(defvar redit-delete-line-command 9) -(defvar redit-delete-line-ack 10) -(defvar redit-close-command 11) -(defvar redit-close-ack 12) -(defvar redit-replace-command 13) -(defvar redit-replace-ack 14) -(defvar redit-nop-command 15) +(defconst redit-open-command 1) +(defconst redit-open-ack 2) +(defconst redit-read-command 3) +(defconst redit-read-ack 4) +(defconst redit-read-finish-ack 5) ;; obsolete +(defconst redit-insert-command 6) +(defconst redit-insert-ack 7) +;;(defconst redit-write-still-ack "7") +;;(defconst redit-write-finish-ack "8") +(defconst redit-delete-line-command 9) +(defconst redit-delete-line-ack 10) +(defconst redit-close-command 11) +(defconst redit-close-ack 12) +(defconst redit-replace-command 13) +(defconst redit-replace-ack 14) +(defconst redit-nop-command 15) ;; REP Session -(defvar redit-join-command 41) -(defvar redit-join-ack-command 42) -(defvar redit-get-command 43) ;; obsolete -(defvar redit-get-ack-command 44) ;; obsolete -(defvar redit-put-command 45) -(defvar redit-put-ack-command 46) -(defvar redit-select-command 47) ;; obsolete -(defvar redit-select-ack-command 48) -(defvar redit-register-command 49) ;; obsolete -(defvar redit-register-ack-command 50) ;; obsolete -(defvar redit-deregister-command 51) ;; obsolete -(defvar redit-deregister-ack-command 52) ;; obsolete -(defvar redit-quit-command 53) -(defvar redit-quit-ack-command 54) +(defconst redit-join-command 41) +(defconst redit-join-ack-command 42) +(defconst redit-get-command 43) ;; obsolete +(defconst redit-get-ack-command 44) ;; obsolete +(defconst redit-put-command 45) +(defconst redit-put-ack-command 46) +(defconst redit-select-command 47) ;; obsolete +(defconst redit-select-ack-command 48) +(defconst redit-register-command 49) ;; obsolete +(defconst redit-register-ack-command 50) ;; obsolete +(defconst redit-deregister-command 51) ;; obsolete +(defconst redit-deregister-ack-command 52) ;; obsolete +(defconst redit-quit-command 53) +(defconst redit-quit-ack-command 54) ;;;;;;;;;;;;;;;;;; ;; Queue struct ;; @@ -244,7 +249,8 @@ (delete-process redit-client-process) (error nil)))) (setq redit-client-process (open-network-stream - "redit-client" nil "localhost" 8766)) + "redit-client" nil "localhost" + redit-process-port)) ;; called when the process changes state (set-process-sentinel redit-client-process 'redit-client-sentinel) @@ -254,15 +260,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) - ;; $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 + ;; 送受信するデータはバイナリで貰わないといけない。 + ;; utf-8 じゃなくてずれる可能性があるので (set-process-coding-system redit-client-process 'binary 'binary) - ;; $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 + ;; プロセスが生きてるとき、 emacs を終了しようとすると + ;; 「processがうんたらで、本当に切ってもいいの y/n」 + ;; って聞かれる。nil てやっておくと聞かれない。 + ;; quit を入れるんなら t にして有効にすべきなんだろうか。 + ;; 今は nil で (set-process-query-on-exit-flag redit-client-process nil) ;; not necessary since Emacs 21.1 @@ -279,7 +285,16 @@ redit-join-command 0 0 0 0 (string-bytes bufname)) (buffer-name))) - (message "join-command")) + (message (concat + "join-command: " + (number-to-string redit-join-command) " " + (number-to-string 0) " " + (number-to-string 0) " " + (number-to-string 0) " " + (number-to-string 0) " " + (number-to-string (string-bytes bufname)) " " + "\"" bufname "\"" + ))) ;; PUT if buffer-name is not "*scratch*" (progn (process-send-string @@ -295,24 +310,27 @@ (defun redit-quit-command () "quit" (interactive) + ;; process kill とかしよう ) + +;; obsolete (defun redit-client-open (file) (interactive "P") (if redit-client-process (if (setq file (read-string "Filename: ")) (progn - ;; redit-client-process $B$N(B input $B$KJ8;zNs$rAw?.$9$k(B + ;; redit-client-process の input に文字列を送信する (process-send-string redit-client-process - ;; redit-open-command (01) $B$H(B file $B$rO"7k$5$;$k(B + ;; redit-open-command (01) と file を連結させる (concat redit-open-command file)) - ;; redit-client-process $B$+$i=PNO$rF@$k$^$G%k!<%W(B + ;; redit-client-process から出力を得るまでループ (while (eq nil (accept-process-output redit-client-process))))) (error "redit-client is not running."))) -;; 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 +;; redit-client-process にreadコマンドとバッファ番号、行番号を送り、 +;; サーバからの出力を得る (defun redit-client-read-line (linenum) (if redit-client-process (save-excursion @@ -325,9 +343,9 @@ (error "redit-client is not running."))) -;; 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 +;; linenumで指定された行の編集をサーバへ送る +;; redit-client-process に insert コマンドと +;; バッファ番号、行番号、行の内容を送り、 Ack を受け取る (defun redit-client-insert-line (linenum isnewline) (if redit-client-process (save-excursion @@ -373,14 +391,14 @@ (process-send-string redit-client-process packet))) (error "redit-client is not running."))) -;; linenum $B$G;XDj$7$?9T$N:o=|L?Na$r(B redit-client-process $B$KAw?.$9$k(B +;; linenum で指定した行の削除命令を redit-client-process に送信する (defun redit-client-delete-line (linenum) (if redit-client-process (save-restriction - ;; $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 + ;; トークンが回ってくるのを待つ場合は、 + ;; すぐに process-send-string せずに + ;; 編集情報を保存するだけにとどめる ;;(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")) @@ -394,7 +412,7 @@ (gen-seqno) linenum 0)))) (error "redit-client is not running."))) -;; redit-client-process $B$X(Bclose$B%3%^%s%I$rAw$k(B +;; redit-client-process へcloseコマンドを送る (defun redit-client-close () "Save File and exit Remote-edit client." (interactive) @@ -411,7 +429,7 @@ redit-client-editor-id (gen-seqno) 0 0) "\n")))) -;; redit-client-process $B$r=*N;$5$;$k(B +;; redit-client-process を終了させる (defun redit-client-kill () "Stop Remote-Edit client process." (interactive) @@ -422,11 +440,11 @@ (kill-all-local-variables)) ;; proc == redit-client-process -;; string == redit-client-process $B$+$i$N(B output +;; string == redit-client-process からの output (defun redit-client-process-filter (proc string) - ;; $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 + ;; バッファローカルなフックリスト before-change-functions から + ;; redit-client-before-change-function を取り除く. after も同じ + ;; proc からの出力に hook しないように (remove-hook 'before-change-functions 'redit-client-before-change-function t) (remove-hook 'after-change-functions @@ -434,7 +452,7 @@ (message (concat "redit-client-process-filter: " string)) (let ((command (rep-get-command-from-pkt string))) - ;; command $B$,$I$NL?Na$+$rH=CG$7!"BP1~$7$?=hM}$r$9$k!#(Bcase $B$_$?$$(B + ;; command がどの命令かを判断し、対応した処理をする。case みたい (cond ;; FIXME ;;((if (= command redit-open-ack) @@ -482,8 +500,8 @@ 'redit-client-after-change-function t t) ) -;; window-scroll-functions $B$K(B hook $B$5$l$k!#(B -;; window $B$,%9%/%m!<%k$9$kEY$K8F$P$l$k(B +;; window-scroll-functions に hook される。 +;; window がスクロールする度に呼ばれる (defun redit-client-update-function (window window-start) (if (equal (window-buffer) redit-client-buffer) (save-excursion @@ -517,7 +535,7 @@ (add-hook 'after-change-functions 'redit-client-after-change-function t t)))) -;; currentp $B$N0LCV$N9T?t$rJV$9(B +;; currentp の位置の行数を返す (defun real-count-lines (currentp) (+ (count-lines (point-min) currentp) (if (= (save-excursion (goto-char currentp) (current-column)) @@ -531,82 +549,81 @@ (setq exprs (cdr exprs))) (goto-char saved-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 +;; before-change-functions に hook される +;; バッファに変更があるたびに呼ばれる。バッファが変更される前に呼ばれる。 +;; begin と end には変更前の変更部分の始まりと終わりの point が入る (defun redit-client-before-change-function (begin end) - (let ((beginl (real-count-lines begin)) ;; begin $B$N9THV9f(B - (endl (real-count-lines end)) ;; end $B$N9THV9f(B + (let ((beginl (real-count-lines begin)) ;; begin の行番号 + (endl (real-count-lines end)) ;; end の行番号 (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)) - ;; $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, ...) + ;; 削除処理で起こる。 + ;; (ex. BackSpaceによる行そのものの削除, C-Space C-wなどのカット, ...) (if (< beginl endl) (progn (setq currline endl) - ;; endl$B$+$i(Bbeginl$B$^$G9T$N:o=|L?Na$r=P$9(B + ;; endlからbeginlまで行の削除命令を出す (while (> currline beginl) (redit-client-delete-line endl) (setq currline (- currline 1))))))) -;; 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 +;; after-change-functions に hook される +;; バッファに変更があるたびに呼ばれる。バッファが変更された後に呼ばれる +;; begin と end には変更後の変更部分の始まりと終わりの point が入る (defun redit-client-after-change-function (begin end length) (let ((beginl (real-count-lines begin)) (endl (real-count-lines end)) (currline)) - ;; $BA^F~=hM}$G5/$3$k!#(B - ;; (ex. $B2~9T(B, C-y $B$J$I$N%Z!<%9%H(B, ...) + ;; 挿入処理で起こる。 + ;; (ex. 改行, C-y などのペースト, ...) (if (< beginl endl) (progn (setq currline beginl) - ;; beginl$B$+$i(Bendl$B$^$GA^F~L?Na$r=P$9(B + ;; beginlからendlまで挿入命令を出す (while (<= currline endl) (progn (redit-client-insert-line currline nil) (setq currline (+ currline 1)))))) (setq redit-client-previous-edited-line endl))) -;; $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 +;; 引き数で与えられた string (line_num + text_data) から +;; 指定された行を削除し、そこに text_data を挿入する (defun redit-client-exec-insert-line (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 + (let ((linenum (rep-get-line-number-from-pkt string)) ;; 行番号 + (text (rep-get-text-from-pkt string))) ;; テキストデータ (if (< (real-count-lines (point-max)) linenum) (progn (call-interactively 'end-of-buffer) (newline))) (goto-line linenum) - (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))) + (delete-region (progn (beginning-of-line) (point)) ;; 行の頭から + (progn (end-of-line) (point))) ;; 行の末尾まで削除 + (insert text) ;; テキストデータを挿入 )) -;; $B0z$-?t(B string (line_num + text_data) $B$G;XDj$5$l$?9T$r:o=|$9$k(B +;; 引き数 string (line_num + text_data) で指定された行を削除する (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))) ) -;; $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) +;; 何用?相手が開いてるファイルを取得するのかな? +;; read みたいなもん? +;; 引き数 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)) @@ -616,9 +633,9 @@ ;; (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 +;; (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) @@ -637,25 +654,25 @@ ;; ;; 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 +;; ;; window がスクロールする度に呼ばれる関数群 ;; (add-hook 'window-scroll-functions ;; 'redit-client-update-function t t)))) -;; string (line_num + text_data) $B$G;XDj$5$l$?9T$K(B -;; text_data $B$rA^F~$9$k(B +;; string (line_num + text_data) で指定された行に +;; text_data を挿入する (defun redit-client-exec-read-ack (string) (save-excursion (let ((lines (rep-get-line-number-from-pkt string))) - ;; redit-client-buffer $B$r%+%l%s%H%P%C%U%!$K$9$k(B + ;; redit-client-buffer をカレントバッファにする (set-buffer redit-client-buffer) (goto-line lines) - (beginning-of-line) ;; $B9T$N;O$a$X0\F0(B + (beginning-of-line) ;; 行の始めへ移動 ;; (delete-region (progn (beginning-of-line) (point)) ;; (progn (end-of-line) (point))) - (insert (rep-get-text-from-pkt string))))) ;; $B%F%-%9%H%G!<%?$rA^F~(B + (insert (rep-get-text-from-pkt string))))) ;; テキストデータを挿入 -;; redit-client-line-max-in-server $B$K9THV9f$rF~$l$F$k(B($B$@$1(B) +;; redit-client-line-max-in-server に行番号を入れてる(だけ) (defun redit-client-exec-insert-ack (string) (save-excursion (set-buffer redit-client-buffer) @@ -668,7 +685,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)) @@ -676,7 +693,7 @@ (kill-buffer redit-client-buffer)) (kill-all-local-variables)) -;; $B0z$-?t$GM?$($i$l$?(B string $B$+$i(B Editor ID$B$r<hF@$9$k(B +;; 引き数で与えられた string から Editor IDを取得する (defun redit-client-exec-join (string) (let (sinfo) (setq redit-client-editor-id (rep-get-editor-id-from-pkt string)) @@ -693,9 +710,9 @@ (message (concat "Your editor id = " (number-to-string redit-client-editor-id))) )) -;; //$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 +;; //引き数で与えられた string から Session IDを取得する +;; 新仕様で、(put = ファイル有りjoin) ってことになって +;; editor id を返すことになったので、sid と共に eid もセーブする (defun redit-client-exec-put (string) (let (sinfo) (setq redit-client-editor-id (rep-get-editor-id-from-pkt string)) @@ -711,15 +728,15 @@ "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 +;; SessionIDを名前とした、新しいバッファを開く ;; FIXME -;; 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 +;; SessionIDではなく、Session Nameが望ましい? +;; バッファを開いた後、Sessionで開いてるファイルの中身を表示するべき (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")) @@ -746,17 +763,17 @@ (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) -;; $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 +;; でとれるので、text-size は要らない、とうれしい。 +;; が、(通信テストまだなので)例えば連続してパケットが送られて来たとき +;; そのパケットが繋がってしまうと駄目。 +;; もし、process-filter が、一つのパケットの処理が終わるまで +;; 後続のパケットを止めててくれるならこれでいけるが。 +;; 念のため、受け取った text-size と比較して +;; 同じならおk、だめならそのサイズ分だけ取る、って所か。 +;; 最初からサイズ分だけでいいんじゃね?と思ったりもするが。 +;; あと、現時点ではサイズが違う(失敗)時の処理いれてない。 (defun rep-get-text-from-pkt (pkt) (let ((size) (text)) (setq size (rep-get-text-size-from-pkt pkt))