| To: vim-dev@vim.org |
| Subject: Patch 7.0.022 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=ISO-8859-1 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.0.022 |
| Problem: Using buffer.append() in Ruby may append the line to the wrong |
| buffer. (Alex Norman) |
| Solution: Properly switch to the buffer to do the appending. Also for |
| buffer.delete() and setting a buffer line. |
| Files: src/if_ruby.c |
| |
| |
| |
| |
| |
| *** 643,653 **** |
| |
| static VALUE set_buffer_line(buf_T *buf, linenr_T n, VALUE str) |
| { |
| ! buf_T *savebuf = curbuf; |
| ! char *line = STR2CSTR(str); |
| |
| ! if (n > 0 && n <= buf->b_ml.ml_line_count && line != NULL) { |
| curbuf = buf; |
| if (u_savesub(n) == OK) { |
| ml_replace(n, (char_u *)line, TRUE); |
| changed(); |
| --- 643,665 ---- |
| |
| static VALUE set_buffer_line(buf_T *buf, linenr_T n, VALUE str) |
| { |
| ! char *line = STR2CSTR(str); |
| ! #ifdef FEAT_AUTOCMD |
| ! aco_save_T aco; |
| ! #else |
| ! buf_T *save_curbuf = curbuf; |
| ! #endif |
| |
| ! if (n > 0 && n <= buf->b_ml.ml_line_count && line != NULL) |
| ! { |
| ! #ifdef FEAT_AUTOCMD |
| ! /* set curwin/curbuf for "buf" and save some things */ |
| ! aucmd_prepbuf(&aco, buf); |
| ! #else |
| curbuf = buf; |
| + curwin->w_buffer = buf; |
| + #endif |
| + |
| if (u_savesub(n) == OK) { |
| ml_replace(n, (char_u *)line, TRUE); |
| changed(); |
| |
| *** 655,664 **** |
| syn_changed(n); /* recompute syntax hl. for this line */ |
| #endif |
| } |
| ! curbuf = savebuf; |
| update_curbuf(NOT_VALID); |
| } |
| ! else { |
| rb_raise(rb_eIndexError, "index %d out of buffer", n); |
| return Qnil; /* For stop warning */ |
| } |
| --- 667,685 ---- |
| syn_changed(n); /* recompute syntax hl. for this line */ |
| #endif |
| } |
| ! |
| ! #ifdef FEAT_AUTOCMD |
| ! /* restore curwin/curbuf and a few other things */ |
| ! aucmd_restbuf(&aco); |
| ! /* Careful: autocommands may have made "buf" invalid! */ |
| ! #else |
| ! curwin->w_buffer = save_curbuf; |
| ! curbuf = save_curbuf; |
| ! #endif |
| update_curbuf(NOT_VALID); |
| } |
| ! else |
| ! { |
| rb_raise(rb_eIndexError, "index %d out of buffer", n); |
| return Qnil; /* For stop warning */ |
| } |
| |
| *** 676,687 **** |
| |
| static VALUE buffer_delete(VALUE self, VALUE num) |
| { |
| ! buf_T *buf = get_buf(self); |
| ! buf_T *savebuf = curbuf; |
| ! long n = NUM2LONG(num); |
| |
| ! if (n > 0 && n <= buf->b_ml.ml_line_count) { |
| curbuf = buf; |
| if (u_savedel(n, 1) == OK) { |
| ml_delete(n, 0); |
| |
| --- 697,720 ---- |
| |
| static VALUE buffer_delete(VALUE self, VALUE num) |
| { |
| ! buf_T *buf = get_buf(self); |
| ! long n = NUM2LONG(num); |
| ! #ifdef FEAT_AUTOCMD |
| ! aco_save_T aco; |
| ! #else |
| ! buf_T *save_curbuf = curbuf; |
| ! #endif |
| |
| ! if (n > 0 && n <= buf->b_ml.ml_line_count) |
| ! { |
| ! #ifdef FEAT_AUTOCMD |
| ! /* set curwin/curbuf for "buf" and save some things */ |
| ! aucmd_prepbuf(&aco, buf); |
| ! #else |
| curbuf = buf; |
| + curwin->w_buffer = buf; |
| + #endif |
| + |
| if (u_savedel(n, 1) == OK) { |
| ml_delete(n, 0); |
| |
| |
| *** 691,700 **** |
| |
| changed(); |
| } |
| ! curbuf = savebuf; |
| update_curbuf(NOT_VALID); |
| } |
| ! else { |
| rb_raise(rb_eIndexError, "index %d out of buffer", n); |
| } |
| return Qnil; |
| --- 724,742 ---- |
| |
| changed(); |
| } |
| ! |
| ! #ifdef FEAT_AUTOCMD |
| ! /* restore curwin/curbuf and a few other things */ |
| ! aucmd_restbuf(&aco); |
| ! /* Careful: autocommands may have made "buf" invalid! */ |
| ! #else |
| ! curwin->w_buffer = save_curbuf; |
| ! curbuf = save_curbuf; |
| ! #endif |
| update_curbuf(NOT_VALID); |
| } |
| ! else |
| ! { |
| rb_raise(rb_eIndexError, "index %d out of buffer", n); |
| } |
| return Qnil; |
| |
| *** 702,714 **** |
| |
| static VALUE buffer_append(VALUE self, VALUE num, VALUE str) |
| { |
| ! buf_T *buf = get_buf(self); |
| ! buf_T *savebuf = curbuf; |
| ! char *line = STR2CSTR(str); |
| ! long n = NUM2LONG(num); |
| |
| ! if (n >= 0 && n <= buf->b_ml.ml_line_count && line != NULL) { |
| curbuf = buf; |
| if (u_inssub(n + 1) == OK) { |
| ml_append(n, (char_u *) line, (colnr_T) 0, FALSE); |
| |
| --- 744,768 ---- |
| |
| static VALUE buffer_append(VALUE self, VALUE num, VALUE str) |
| { |
| ! buf_T *buf = get_buf(self); |
| ! char *line = STR2CSTR(str); |
| ! long n = NUM2LONG(num); |
| ! #ifdef FEAT_AUTOCMD |
| ! aco_save_T aco; |
| ! #else |
| ! buf_T *save_curbuf = curbuf; |
| ! #endif |
| |
| ! if (n >= 0 && n <= buf->b_ml.ml_line_count && line != NULL) |
| ! { |
| ! #ifdef FEAT_AUTOCMD |
| ! /* set curwin/curbuf for "buf" and save some things */ |
| ! aucmd_prepbuf(&aco, buf); |
| ! #else |
| curbuf = buf; |
| + curwin->w_buffer = buf; |
| + #endif |
| + |
| if (u_inssub(n + 1) == OK) { |
| ml_append(n, (char_u *) line, (colnr_T) 0, FALSE); |
| |
| |
| *** 718,724 **** |
| |
| changed(); |
| } |
| ! curbuf = savebuf; |
| update_curbuf(NOT_VALID); |
| } |
| else { |
| --- 772,786 ---- |
| |
| changed(); |
| } |
| ! |
| ! #ifdef FEAT_AUTOCMD |
| ! /* restore curwin/curbuf and a few other things */ |
| ! aucmd_restbuf(&aco); |
| ! /* Careful: autocommands may have made "buf" invalid! */ |
| ! #else |
| ! curwin->w_buffer = save_curbuf; |
| ! curbuf = save_curbuf; |
| ! #endif |
| update_curbuf(NOT_VALID); |
| } |
| else { |
| |
| |
| |
| *** 668,669 **** |
| --- 668,671 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 22, |
| /**/ |