Just like Ruby the Perl interface has some code that changes another buffer and doesn't do this properly. I made a patch for this, but since the if_perl.xs file is magically transformed into if_perl.c I ran into the problem that the #ifdef's don't work normally. I solved this by putting a tab before the #. I'm not sure if this works everywhere where Perl is supported.
Please try this out and let me know if this works or not. You need to enable the Perl interface for this. I suppose that if Vim compiles it will work, but you might try out a few Vim-Perl commands to be sure. *** ../vim-7.0.030/src/if_perl.xs Tue Mar 7 00:18:16 2006 --- src/if_perl.xs Thu Jun 22 21:22:18 2006 *************** *** 1056,1062 **** int i; long lnum; char *line; - buf_T *savebuf; PPCODE: if (buf_valid(vimbuf)) { --- 1056,1061 ---- *************** *** 1069,1082 **** line = SvPV(ST(i),PL_na); if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) { ! savebuf = curbuf; curbuf = vimbuf; if (u_savesub(lnum) == OK) { ml_replace(lnum, (char_u *)line, TRUE); changed_bytes(lnum, 0); } ! curbuf = savebuf; } } } --- 1068,1098 ---- line = SvPV(ST(i),PL_na); if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) { ! #ifdef FEAT_AUTOCMD ! aco_save_T aco; ! ! /* set curwin/curbuf for "vimbuf" and save some things */ ! aucmd_prepbuf(&aco, vimbuf); ! #else ! buf_T *save_curbuf = curbuf; ! curbuf = vimbuf; + curwin->w_buffer = vimbuf; + #endif if (u_savesub(lnum) == OK) { ml_replace(lnum, (char_u *)line, TRUE); changed_bytes(lnum, 0); } ! ! #ifdef FEAT_AUTOCMD ! /* restore curwin/curbuf and a few other things */ ! aucmd_restbuf(&aco); ! /* Careful: autocommands may have made "vimbuf" invalid! */ ! #else ! curwin->w_buffer = save_curbuf; ! curbuf = save_curbuf; ! #endif } } } *************** *** 1087,1093 **** PREINIT: long i, lnum = 0, count = 0; - buf_T *savebuf; PPCODE: if (buf_valid(vimbuf)) { --- 1103,1108 ---- *************** *** 1114,1129 **** { if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count) { ! savebuf = curbuf; curbuf = vimbuf; if (u_savedel(lnum, 1) == OK) { ml_delete(lnum, 0); deleted_lines_mark(lnum, 1L); ! if (savebuf == curbuf) check_cursor(); } ! curbuf = savebuf; update_curbuf(VALID); } } --- 1129,1159 ---- { if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count) { ! buf_T *save_curbuf = curbuf; ! #ifdef FEAT_AUTOCMD ! aco_save_T aco; ! ! /* set curwin/curbuf for "vimbuf" and save some things */ ! aucmd_prepbuf(&aco, vimbuf); ! #else curbuf = vimbuf; + curwin->w_buffer = vimbuf; + #endif if (u_savedel(lnum, 1) == OK) { ml_delete(lnum, 0); deleted_lines_mark(lnum, 1L); ! if (save_curbuf == curbuf) check_cursor(); } ! #ifdef FEAT_AUTOCMD ! /* restore curwin/curbuf and a few other things */ ! aucmd_restbuf(&aco); ! /* Careful: autocommands may have made "vimbuf" invalid! */ ! #else ! curwin->w_buffer = save_curbuf; ! curbuf = save_curbuf; ! #endif update_curbuf(VALID); } } *************** *** 1138,1144 **** int i; long lnum; char *line; - buf_T *savebuf; PPCODE: if (buf_valid(vimbuf)) { --- 1168,1173 ---- *************** *** 1151,1164 **** line = SvPV(ST(i),PL_na); if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) { ! savebuf = curbuf; curbuf = vimbuf; if (u_inssub(lnum + 1) == OK) { ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE); appended_lines_mark(lnum, 1L); } ! curbuf = savebuf; update_curbuf(VALID); } } --- 1180,1210 ---- line = SvPV(ST(i),PL_na); if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) { ! #ifdef FEAT_AUTOCMD ! aco_save_T aco; ! ! /* set curwin/curbuf for "vimbuf" and save some things */ ! aucmd_prepbuf(&aco, vimbuf); ! #else ! buf_T *save_curbuf = curbuf; ! curbuf = vimbuf; + curwin->w_buffer = vimbuf; + #endif if (u_inssub(lnum + 1) == OK) { ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE); appended_lines_mark(lnum, 1L); } ! ! #ifdef FEAT_AUTOCMD ! /* restore curwin/curbuf and a few other things */ ! aucmd_restbuf(&aco); ! /* Careful: autocommands may have made "vimbuf" invalid! */ ! #else ! curwin->w_buffer = save_curbuf; ! curbuf = save_curbuf; ! #endif update_curbuf(VALID); } } -- There is no right or wrong, there is only your personal opinion. (Bram Moolenaar) /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///