# HG changeset patch # User shinobu # Date 1220171934 -32400 # Node ID 8634ceb0aeef5b97ee65d533d23e6c6154b44db1 # Parent 1e44fe6dcfaa56ba9066a72b7eb4021d8074aca1 add copy_and_get_memline diff -r 1e44fe6dcfaa -r 8634ceb0aeef src/reditor.c --- a/src/reditor.c Sun Aug 31 15:24:59 2008 +0900 +++ b/src/reditor.c Sun Aug 31 17:38:54 2008 +0900 @@ -90,6 +90,8 @@ static int append_newline_sep_text(Session *sn, char *text); +static char_u *copy_and_get_memline(BUFTYPE *buf, long lnum); + /* g_rep has an all information of Remote Editor */ rep_T g_rep; @@ -1018,8 +1020,7 @@ rep_cmd *cmd; rep_T *rep = get_rep(); char *text; - char *prev_text = NULL; - + cursn = rep->cursession; if ((cursn == NULL) || (cursn->prevline == -1)) return; @@ -1032,18 +1033,17 @@ rep->cursession = cursn; } - text = get_memline_wrp(cursn->buf, cursn->prevline); - - //cmd = make_cmd(REP_REPLACE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, text); + //text = get_memline_wrp(cursn->buf, cursn->prevline); + text = copy_and_get_memline(cursn->buf, cursn->prevline); - // TODO : 変更前のテキストを UNDO バッファから取得する - cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, prev_text); + cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, cursn->prev_text); cmd->next = make_cmd(REP_INSERT_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, text); - + + // 現在のバッファを取っておく + cursn->prev_text = text; + add_cmd_to_list(&(cursn->new_cmdlist), cmd); - - if (cursn->sent_cmdlist.num == 0) { // 自トークンを送信してない場合 rep_send_cur_cmdlist(); } @@ -1051,6 +1051,21 @@ cursn->prevline = -1; } +static char_u * +copy_and_get_memline(buf, lnum) + BUFTYPE *buf; + linenr_T lnum; +{ + char_u *src; + char_u *dst; + unsigned len; + + src = get_memline_wrp(buf,lnum); + len = (unsigned)STRLEN(src); + if ((dst = lalloc((long_u)((len) + 1), FALSE)) != NULL) + mch_memmove(dst, src, (size_t)(len + 1)); + return (dst); +} static void check_line_change(sn, lnum) @@ -1069,8 +1084,13 @@ sn->prevline = lnum; return; } - cmd = make_cmd(REP_REPLACE_CMD, sn->sid, rep->eid, rep->seqno++, sn->prevline, - get_memline_wrp(sn->buf, sn->prevline)); + //cmd = make_cmd(REP_REPLACE_CMD, sn->sid, rep->eid, rep->seqno++, sn->prevline, get_memline_wrp(sn->buf, sn->prevline)); + // DELETE + cmd = make_cmd(REP_DELETE_LINE_CMD, sn->sid, rep->eid, rep->seqno++, sn->prevline, sn->prev_text); + add_cmd_to_list(&(sn->new_cmdlist), cmd); + + // INSERT + cmd = make_cmd(REP_INSERT_CMD, sn->sid, rep->eid, rep->seqno++, sn->prevline, get_memline_wrp(sn->buf, sn->prevline)); add_cmd_to_list(&(sn->new_cmdlist), cmd); sn->prevline = lnum; @@ -1105,9 +1125,15 @@ } } else if (xtra > 0) { if (lnum != lnume) { /* 行の途中から改行 */ - cmd = make_cmd( REP_REPLACE_CMD, cursn->sid, rep->eid, rep->seqno++, lnum, - get_memline_wrp(cursn->buf, lnum)); + // cmd = make_cmd( REP_REPLACE_CMD, cursn->sid, rep->eid, rep->seqno++, lnum, get_memline_wrp(cursn->buf, lnum)); + // DELETE + cmd = make_cmd( REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, lnum, cursn->prev_text); add_cmd_to_list(&(cursn->new_cmdlist), cmd); + + // INSERT + cmd = make_cmd( REP_INSERT_CMD, cursn->sid, rep->eid, rep->seqno++, lnum, get_memline_wrp(cursn->buf, lnum)); + add_cmd_to_list(&(cursn->new_cmdlist), cmd); + lnum++; } for (i = 0; xtra > 0; i++, xtra--) { @@ -1193,7 +1219,8 @@ rep->slineup = make_session(SLINEUP_NAME, make_new_buf_wrp(SLINEUP_NAME)); append_newline_sep_text(rep->slineup, text); set_cursession(rep->slineup); - update_screen_now_wrp(); + rep_start_create_cmds(); + //update_screen_now_wrp(); if (rep->eid == 0) { rep->eid = eid;