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