Patch (after 7.0.44) Problem: xsubpp simply removes the newly added directives form if_perl.xs when converting it into if_perl.c Solution: See http://perldoc.perl.org/perlxs.html#Inserting-POD%2c-Comments-and-C-Preprocessor-Directives
*** ..\vim-7.0.044\src\if_perl.xs 2006-08-08 20:02:34.440876800 +0200 --- src\if_perl.xs 2006-08-08 21:07:26.287076800 +0200 *************** *** 1048,1053 **** --- 1048,1054 ---- } } + #ifdef FEAT_AUTOCMD void Set(vimbuf, ...) VIBUF vimbuf; *************** *** 1068,1102 **** 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 } } } void Delete(vimbuf, ...) VIBUF vimbuf; --- 1069,1131 ---- line = SvPV(ST(i),PL_na); if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) { aco_save_T aco; /* set curwin/curbuf for "vimbuf" and save some things */ aucmd_prepbuf(&aco, vimbuf); ! if (u_savesub(lnum) == OK) ! { ! ml_replace(lnum, (char_u *)line, TRUE); ! changed_bytes(lnum, 0); ! } ! ! /* restore curwin/curbuf and a few other things */ ! aucmd_restbuf(&aco); ! /* Careful: autocommands may have made "vimbuf" invalid! */ ! } ! } ! } ! ! #else ! void ! Set(vimbuf, ...) ! VIBUF vimbuf; ! ! PREINIT: ! int i; ! long lnum; ! char *line; ! PPCODE: ! if (buf_valid(vimbuf)) ! { ! if (items < 3) ! croak("Usage: VIBUF::Set(vimbuf, lnum, @lines)"); ! ! lnum = SvIV(ST(1)); ! for(i = 2; i < items; i++, lnum++) ! { ! line = SvPV(ST(i),PL_na); ! if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) ! { buf_T *save_curbuf = curbuf; curbuf = vimbuf; curwin->w_buffer = vimbuf; if (u_savesub(lnum) == OK) { ml_replace(lnum, (char_u *)line, TRUE); changed_bytes(lnum, 0); } curwin->w_buffer = save_curbuf; curbuf = save_curbuf; } } } + #endif + + #ifdef FEAT_AUTOCMD void Delete(vimbuf, ...) VIBUF vimbuf; *************** *** 1130,1144 **** 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); --- 1159,1168 ---- *************** *** 1146,1165 **** 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); } } } } void Append(vimbuf, ...) VIBUF vimbuf; --- 1170,1238 ---- if (save_curbuf == curbuf) check_cursor(); } /* restore curwin/curbuf and a few other things */ aucmd_restbuf(&aco); /* Careful: autocommands may have made "vimbuf" invalid! */ ! update_curbuf(VALID); ! } ! } ! } ! } ! ! #else ! void ! Delete(vimbuf, ...) ! VIBUF vimbuf; ! ! PREINIT: ! long i, lnum = 0, count = 0; ! PPCODE: ! if (buf_valid(vimbuf)) ! { ! if (items == 2) ! { ! lnum = SvIV(ST(1)); ! count = 1; ! } ! else if (items == 3) ! { ! lnum = SvIV(ST(1)); ! count = 1 + SvIV(ST(2)) - lnum; ! if(count == 0) ! count = 1; ! if(count < 0) ! { ! lnum -= count; ! count = -count; ! } ! } ! if (items >= 2) ! { ! for (i = 0; i < count; i++) ! { ! if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count) ! { ! buf_T *save_curbuf = curbuf; ! curbuf = vimbuf; ! curwin->w_buffer = vimbuf; ! if (u_savedel(lnum, 1) == OK) ! { ! ml_delete(lnum, 0); ! deleted_lines_mark(lnum, 1L); ! if (save_curbuf == curbuf) ! check_cursor(); ! } curwin->w_buffer = save_curbuf; curbuf = save_curbuf; update_curbuf(VALID); } } } } + #endif + + #ifdef FEAT_AUTOCMD void Append(vimbuf, ...) VIBUF vimbuf; *************** *** 1180,1212 **** 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); } } } --- 1253,1312 ---- line = SvPV(ST(i),PL_na); if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) { aco_save_T aco; /* set curwin/curbuf for "vimbuf" and save some things */ aucmd_prepbuf(&aco, vimbuf); ! if (u_inssub(lnum + 1) == OK) ! { ! ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE); ! appended_lines_mark(lnum, 1L); ! } ! ! /* restore curwin/curbuf and a few other things */ ! aucmd_restbuf(&aco); ! /* Careful: autocommands may have made "vimbuf" invalid! */ ! update_curbuf(VALID); ! } ! } ! } ! ! #else ! void ! Append(vimbuf, ...) ! VIBUF vimbuf; ! ! PREINIT: ! int i; ! long lnum; ! char *line; ! PPCODE: ! if (buf_valid(vimbuf)) ! { ! if (items < 3) ! croak("Usage: VIBUF::Append(vimbuf, lnum, @lines)"); ! ! lnum = SvIV(ST(1)); ! for (i = 2; i < items; i++, lnum++) ! { ! line = SvPV(ST(i),PL_na); ! if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) ! { buf_T *save_curbuf = curbuf; curbuf = vimbuf; curwin->w_buffer = vimbuf; if (u_inssub(lnum + 1) == OK) { ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE); appended_lines_mark(lnum, 1L); } curwin->w_buffer = save_curbuf; curbuf = save_curbuf; update_curbuf(VALID); } } } + #endif