changeset 56:3bbcdd5060a6

*** empty log message ***
author gongo
date Tue, 26 Aug 2008 20:45:22 +0900
parents 563a0c8c5706
children 91236a2c6e2d
files ChangeLog redit-client-sm.el
diffstat 2 files changed, 91 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Aug 26 18:54:39 2008 +0900
+++ b/ChangeLog	Tue Aug 26 20:45:22 2008 +0900
@@ -1,3 +1,50 @@
+2008-08-26  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
+
+	* redit-client-sm.el (redit-client-delete-line): TODO
+	REP_project/JavaSessionManager/export にある
+	テスト用の GUI だと、text size が 0 だと
+	向こうでスルーするらしい。
+	
+	delete-line-command だとテキストを送る必要がないので
+	今まで 0 にしてたんだけど、上の問題で delete が反応しなかった。
+	なので、今は "55555" とかテキストに追加してます。
+	テスト用GUIが修正されたらこっちも直します。
+	
+	* redit-client-sm.el (redit-client-after-change-function): fix,TODO
+	insert/delete の条件判定変更。
+	before-change-function と after-change-function の
+	それぞれの begin line, end line を見て判定する事にした。
+	Cで書くと
+
+	  if ((before-begin == after-end) && (before-begin != before-end)) {
+	      int endl = before-end;
+	      while (endl > before-begin) {
+	          delete-line(endl);
+	      }
+	      insert-line(before-begin);
+          } else {
+	      int endl = after-end;
+	      while (endl >= before-begin) { // 注意
+	          insert-line(endl);
+	      }
+	  }
+
+	こんな感じ。詳しい説明聞きたい人は俺に直で。
+	もしくは後ほど詳しく書きます。
+
+	- 注意
+	>= だと、1文字ずつ編集しても command が送信されてしまう。
+	> だと全く送信されなくなるので、そこは要修正
+
+	* redit-client-sm.el (redit-client-before-change-function): fix
+	insert/delete の条件判定変更のため、
+	ここでは、beginl と endl を取得するのみ
+
+	* redit-client-sm.el (redit-client-exec-insert-line): fix
+	指定したバッファの指定した行に、指定した文字列を
+	挿入できるように変更。
+	詳しくは test/buffer-edit に書いてます。
+
 2008-08-23  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
 
 	* memo: 文字列の長さ、バイト数
--- a/redit-client-sm.el	Tue Aug 26 18:54:39 2008 +0900
+++ b/redit-client-sm.el	Tue Aug 26 20:45:22 2008 +0900
@@ -407,23 +407,16 @@
 ;; linenum で指定した行の削除命令を redit-client-process に送信する
 (defun redit-client-delete-line (linenum)
   (if redit-client-process
-      (save-restriction
-
-	;; トークンが回ってくるのを待つ場合は、
-	;; すぐに 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"))
-	
-	;; insert lines on server buffer
-	(process-send-string
-	 redit-client-process
-	 (concat
-	  (redit-pack redit-delete-line-command
-		      redit-client-session-id
-		      redit-client-editor-id
-		      (gen-seqno) linenum 0))))
-    (error "redit-client is not running.")))
+      (save-excursion
+	(let (packet)
+	  ;; insert lines on server buffer
+	  (setq packet (redit-make-packet
+			redit-delete-line-command redit-client-session-id
+			redit-client-editor-id (gen-seqno) linenum
+			5 "55555"))
+	  
+	  (process-send-string redit-client-process packet)))
+	(error "redit-client is not running.")))
 
 ;; redit-client-process へcloseコマンドを送る
 (defun redit-client-close ()
@@ -592,47 +585,42 @@
     (goto-char saved-point)))
 
 ;; before-change-functions に hook される
-;; バッファに変更があるたびに呼ばれる。バッファが変更される前に呼ばれる。
+;; バッファが変更される直前に呼ばれる。
 ;; begin と end には変更前の変更部分の始まりと終わりの point が入る
 (defun redit-client-before-change-function (begin end)
-  (let ((beginl (real-count-lines begin)) ;; begin の行番号
-	(endl (real-count-lines end))	  ;; end の行番号
-	(currline))			  ;; currline = nil
-
-    ;; (message "before-change-function")
-
-    ;; 前回の編集した行と今回の編集した行が
-    ;; 違っていたら前回の編集をサーバへ送る
-    (if (not (= beginl redit-client-previous-edited-line))
-	(redit-client-insert-line redit-client-previous-edited-line nil))
-
-    ;; 削除処理で起こる。
-    ;; (ex. BackSpaceによる行そのものの削除, C-Space C-wなどのカット, ...)
-    (if (< beginl endl)
-	(progn
-	  (setq currline endl)
-	  ;; endlからbeginlまで行の削除命令を出す
-	  (while (> currline beginl) 
-	    (redit-client-delete-line currline)
-	    (setq currline (- currline 1)))))))
+  ;; (message "before-change-function")
+  (setq redit-client-begin-line-before-func (real-count-lines begin))
+  (setq redit-client-end-line-before-func (real-count-lines end)))
 
 ;; 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))
+  ;; (message "after-change-function")
+  (let (endl)
+    (setq redit-client-begin-line-after-func (real-count-lines begin))
+    (setq redit-client-end-line-after-func (real-count-lines end))
 
-    ;; 挿入処理で起こる。
-    ;; (ex. 改行, C-y などのペースト, ...)
-    (if (< beginl endl)
-	(progn
-	  (setq currline beginl)
-	  ;; beginlからendlまで挿入命令を出す
-	  (while (<= currline endl)
-	    (progn (redit-client-insert-line currline nil)
-		   (setq currline (+ currline 1))))))
+    (if (and 
+	 (= redit-client-begin-line-before-func
+	    redit-client-end-line-after-func)
+	 (not (= redit-client-begin-line-before-func
+		 redit-client-end-line-before-func)))
+      (progn
+	;; delete
+	(setq endl redit-client-end-line-before-func)
+	(while (> endl redit-client-begin-line-before-func)
+	  (redit-client-delete-line endl)
+	  (setq endl (1- endl)))
+	(redit-client-insert-line redit-client-begin-line-before-func nil))
+      (progn
+	;; insert
+	(setq endl redit-client-end-line-after-func)
+	(while (>= endl redit-client-begin-line-before-func)
+	  (redit-client-insert-line endl nil)
+	  (setq endl (1- endl))))
+      )
+
     (setq redit-client-previous-edited-line endl)))
 
 ;; 引き数で与えられた string (line_num + text_data) から
@@ -641,7 +629,7 @@
   (let ((sid        (redit-get-session-id-from-pkt pkt))
 	(editlineno (redit-get-line-number-from-pkt pkt))
 	(text       (redit-get-text-from-pkt pkt))
-	(diff) (bufname) (sinfo))
+	(curlineno) (bufname) (sinfo))
 
     ;; SessionID から、このテキストを挿入するべき
     ;; バッファ名を取得する
@@ -653,14 +641,14 @@
       ;; 指定行番号へ移動
       ;; diff には、editlineno と 実際に移動した行番号の差が入る
       ;; バッファの末尾の行が指定した行に足りない場合に diff > 0 になる
-      (setq diff (goto-line editlineno))
-
-      (if (> diff 0)
+      (goto-line editlineno) ;; 指定行番号へ移動
+      (setq curlineno (real-count-lines (point))) ;; 現在の行番号
+      (if (> editlineno curlineno)
 	  ;; buffer の 最後の行番号が、editlineno に足りない場合、
 	  ;; その行数だけ改行し、その行へ移動する。
 	  ;; newline なので、下のようにテキストを削除する必要は無い
 	  (progn (end-of-line)
-		 (newline diff)
+		 (newline (- editlineno curlineno))
 		 (goto-line editlineno))
 	
 	;; 行頭から末尾までのテキストを削除