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    ///

Reply via email to