static buf_T *get_buf(VALUE obj) { buf_T *buf; Data_Get_Struct(obj, buf_T, buf); if (buf == NULL) rb_raise(eDeletedBufferError, "attempt to refer to deleted buffer"); return buf; } 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) { mark_adjust(n + 1, MAXLNUM, 1L, 0L); ml_append(n, (char_u *) line, (colnr_T) 0, FALSE); changed(); } curbuf = savebuf; update_curbuf(NOT_VALID); } else { rb_raise(rb_eIndexError, "index %d out of buffer", n); } return str; } static void ruby_vim_init(void) { ... rb_define_method(cBuffer, "append", buffer_append, 2); ... }