Mercurial > hg > RemoteEditor > emacs
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)) ;; 行頭から末尾までのテキストを削除