Example #1
0
File: mark.c Project: ZyX-I/neovim
static void mark_adjust_internal(linenr_T line1, linenr_T line2,
                                 long amount, long amount_after,
                                 bool adjust_folds, bool end_temp)
{
  int i;
  int fnum = curbuf->b_fnum;
  linenr_T    *lp;
  static pos_T initpos = INIT_POS_T(1, 0, 0);

  if (line2 < line1 && amount_after == 0L)          /* nothing to do */
    return;

  if (!cmdmod.lockmarks) {
    /* named marks, lower case and upper case */
    for (i = 0; i < NMARKS; i++) {
      one_adjust(&(curbuf->b_namedm[i].mark.lnum));
      if (namedfm[i].fmark.fnum == fnum)
        one_adjust_nodel(&(namedfm[i].fmark.mark.lnum));
    }
    for (i = NMARKS; i < NGLOBALMARKS; i++) {
      if (namedfm[i].fmark.fnum == fnum)
        one_adjust_nodel(&(namedfm[i].fmark.mark.lnum));
    }

    /* last Insert position */
    one_adjust(&(curbuf->b_last_insert.mark.lnum));

    /* last change position */
    one_adjust(&(curbuf->b_last_change.mark.lnum));

    /* last cursor position, if it was set */
    if (!equalpos(curbuf->b_last_cursor.mark, initpos))
      one_adjust(&(curbuf->b_last_cursor.mark.lnum));


    /* list of change positions */
    for (i = 0; i < curbuf->b_changelistlen; ++i)
      one_adjust_nodel(&(curbuf->b_changelist[i].mark.lnum));

    /* Visual area */
    one_adjust_nodel(&(curbuf->b_visual.vi_start.lnum));
    one_adjust_nodel(&(curbuf->b_visual.vi_end.lnum));

    // quickfix marks
    if (!qf_mark_adjust(NULL, line1, line2, amount, amount_after)) {
      curbuf->b_has_qf_entry &= ~BUF_HAS_QF_ENTRY;
    }
    // location lists
    bool found_one = false;
    FOR_ALL_TAB_WINDOWS(tab, win) {
      found_one |= qf_mark_adjust(win, line1, line2, amount, amount_after);
    }
    if (!found_one) {
      curbuf->b_has_qf_entry &= ~BUF_HAS_LL_ENTRY;
    }

    sign_mark_adjust(line1, line2, amount, amount_after);
    bufhl_mark_adjust(curbuf, line1, line2, amount, amount_after, end_temp);
  }
Example #2
0
/*
 * Adjust marks between line1 and line2 (inclusive) to move 'amount' lines.
 * Must be called before changed_*(), appended_lines() or deleted_lines().
 * May be called before or after changing the text.
 * When deleting lines line1 to line2, use an 'amount' of MAXLNUM: The marks
 * within this range are made invalid.
 * If 'amount_after' is non-zero adjust marks after line2.
 * Example: Delete lines 34 and 35: mark_adjust(34, 35, MAXLNUM, -2);
 * Example: Insert two lines below 55: mark_adjust(56, MAXLNUM, 2, 0);
 *				   or: mark_adjust(56, 55, MAXLNUM, 2);
 */
void mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after)
{
  int i;
  int fnum = curbuf->b_fnum;
  linenr_T    *lp;
  static pos_T initpos = INIT_POS_T(1, 0, 0);

  if (line2 < line1 && amount_after == 0L)          /* nothing to do */
    return;

  if (!cmdmod.lockmarks) {
    /* named marks, lower case and upper case */
    for (i = 0; i < NMARKS; i++) {
      one_adjust(&(curbuf->b_namedm[i].mark.lnum));
      if (namedfm[i].fmark.fnum == fnum)
        one_adjust_nodel(&(namedfm[i].fmark.mark.lnum));
    }
    for (i = NMARKS; i < NGLOBALMARKS; i++) {
      if (namedfm[i].fmark.fnum == fnum)
        one_adjust_nodel(&(namedfm[i].fmark.mark.lnum));
    }

    /* last Insert position */
    one_adjust(&(curbuf->b_last_insert.mark.lnum));

    /* last change position */
    one_adjust(&(curbuf->b_last_change.mark.lnum));

    /* last cursor position, if it was set */
    if (!equalpos(curbuf->b_last_cursor.mark, initpos))
      one_adjust(&(curbuf->b_last_cursor.mark.lnum));


    /* list of change positions */
    for (i = 0; i < curbuf->b_changelistlen; ++i)
      one_adjust_nodel(&(curbuf->b_changelist[i].mark.lnum));

    /* Visual area */
    one_adjust_nodel(&(curbuf->b_visual.vi_start.lnum));
    one_adjust_nodel(&(curbuf->b_visual.vi_end.lnum));

    /* quickfix marks */
    qf_mark_adjust(NULL, line1, line2, amount, amount_after);
    /* location lists */
    FOR_ALL_TAB_WINDOWS(tab, win) {
      qf_mark_adjust(win, line1, line2, amount, amount_after);
    }

    sign_mark_adjust(line1, line2, amount, amount_after);
  }
Example #3
0
/*
 * Adjust marks between line1 and line2 (inclusive) to move 'amount' lines.
 * Must be called before changed_*(), appended_lines() or deleted_lines().
 * May be called before or after changing the text.
 * When deleting lines line1 to line2, use an 'amount' of MAXLNUM: The marks
 * within this range are made invalid.
 * If 'amount_after' is non-zero adjust marks after line2.
 * Example: Delete lines 34 and 35: mark_adjust(34, 35, MAXLNUM, -2);
 * Example: Insert two lines below 55: mark_adjust(56, MAXLNUM, 2, 0);
 *				   or: mark_adjust(56, 55, MAXLNUM, 2);
 */
void mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after)
{
  int i;
  int fnum = curbuf->b_fnum;
  linenr_T    *lp;
  win_T       *win;
  tabpage_T   *tab;
  static pos_T initpos = INIT_POS_T(1, 0, 0);

  if (line2 < line1 && amount_after == 0L)          /* nothing to do */
    return;

  if (!cmdmod.lockmarks) {
    /* named marks, lower case and upper case */
    for (i = 0; i < NMARKS; i++) {
      one_adjust(&(curbuf->b_namedm[i].lnum));
      if (namedfm[i].fmark.fnum == fnum)
        one_adjust_nodel(&(namedfm[i].fmark.mark.lnum));
    }
    for (i = NMARKS; i < NMARKS + EXTRA_MARKS; i++) {
      if (namedfm[i].fmark.fnum == fnum)
        one_adjust_nodel(&(namedfm[i].fmark.mark.lnum));
    }

    /* last Insert position */
    one_adjust(&(curbuf->b_last_insert.lnum));

    /* last change position */
    one_adjust(&(curbuf->b_last_change.lnum));

    /* last cursor position, if it was set */
    if (!equalpos(curbuf->b_last_cursor, initpos))
      one_adjust(&(curbuf->b_last_cursor.lnum));


    /* list of change positions */
    for (i = 0; i < curbuf->b_changelistlen; ++i)
      one_adjust_nodel(&(curbuf->b_changelist[i].lnum));

    /* Visual area */
    one_adjust_nodel(&(curbuf->b_visual.vi_start.lnum));
    one_adjust_nodel(&(curbuf->b_visual.vi_end.lnum));

    /* quickfix marks */
    qf_mark_adjust(NULL, line1, line2, amount, amount_after);
    /* location lists */
    FOR_ALL_TAB_WINDOWS(tab, win)
    qf_mark_adjust(win, line1, line2, amount, amount_after);

  }

  /* previous context mark */
  one_adjust(&(curwin->w_pcmark.lnum));

  /* previous pcmark */
  one_adjust(&(curwin->w_prev_pcmark.lnum));

  /* saved cursor for formatting */
  if (saved_cursor.lnum != 0)
    one_adjust_nodel(&(saved_cursor.lnum));

  /*
   * Adjust items in all windows related to the current buffer.
   */
  FOR_ALL_TAB_WINDOWS(tab, win)
  {
    if (!cmdmod.lockmarks)
      /* Marks in the jumplist.  When deleting lines, this may create
       * duplicate marks in the jumplist, they will be removed later. */
      for (i = 0; i < win->w_jumplistlen; ++i)
        if (win->w_jumplist[i].fmark.fnum == fnum)
          one_adjust_nodel(&(win->w_jumplist[i].fmark.mark.lnum));

    if (win->w_buffer == curbuf) {
      if (!cmdmod.lockmarks)
        /* marks in the tag stack */
        for (i = 0; i < win->w_tagstacklen; i++)
          if (win->w_tagstack[i].fmark.fnum == fnum)
            one_adjust_nodel(&(win->w_tagstack[i].fmark.mark.lnum));

      /* the displayed Visual area */
      if (win->w_old_cursor_lnum != 0) {
        one_adjust_nodel(&(win->w_old_cursor_lnum));
        one_adjust_nodel(&(win->w_old_visual_lnum));
      }

      /* topline and cursor position for windows with the same buffer
       * other than the current window */
      if (win != curwin) {
        if (win->w_topline >= line1 && win->w_topline <= line2) {
          if (amount == MAXLNUM) {                  /* topline is deleted */
            if (line1 <= 1)
              win->w_topline = 1;
            else
              win->w_topline = line1 - 1;
          } else                        /* keep topline on the same line */
            win->w_topline += amount;
          win->w_topfill = 0;
        } else if (amount_after && win->w_topline > line2)   {
          win->w_topline += amount_after;
          win->w_topfill = 0;
        }
        if (win->w_cursor.lnum >= line1 && win->w_cursor.lnum <= line2) {
          if (amount == MAXLNUM) {         /* line with cursor is deleted */
            if (line1 <= 1)
              win->w_cursor.lnum = 1;
            else
              win->w_cursor.lnum = line1 - 1;
            win->w_cursor.col = 0;
          } else                        /* keep cursor on the same line */
            win->w_cursor.lnum += amount;
        } else if (amount_after && win->w_cursor.lnum > line2)
          win->w_cursor.lnum += amount_after;
      }

      /* adjust folds */
      foldMarkAdjust(win, line1, line2, amount, amount_after);
    }
  }

  /* adjust diffs */
  diff_mark_adjust(line1, line2, amount, amount_after);
}