# HG changeset patch # User gongo # Date 1219131370 -32400 # Node ID 1978dc75b15c129a7072a619a73c48be9fa8ec45 # Parent ca6df6937dd1b26927194499c6e33b95593f4101 *** empty log message *** diff -r ca6df6937dd1 -r 1978dc75b15c ChangeLog --- 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 + + * 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 * thinking: delete,replace diff -r ca6df6937dd1 -r 1978dc75b15c redit-client-sm.el --- 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) - ;; $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 + ;; トークンが回ってくるのを待つ場合は、 + ;; すぐに 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 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!)AjA0$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!"