struct mark *m, *m2;
m = do_vmark_first(dd->doc, ci->numeric);
m2 = do_vmark_last(dd->doc, ci->numeric);
- if (ci->extra && dd->point)
+ if (ci->extra == 1 && dd->point)
m2 = do_vmark_at_point(dd->doc, dd->point,
ci->numeric);
+ if (ci->extra == 2)
+ m2 = doc_new_mark(dd->doc, ci->numeric);
return comm_call7(ci->comm2, "callback:vmark", ci->focus,
0, m, NULL, 0, NULL, m2);
}
}
static int vmark_get(struct pane *p, int view,
- struct mark **first, struct mark **last, struct mark **point)
+ struct mark **first, struct mark **last, struct mark **point, struct mark **new)
{
struct cmd_info ci = {0};
struct call_return cr;
ci.comm2 = &cr.c;
if (point)
ci.extra = 1;
+ else if (new)
+ ci.extra = 2;
if (key_handle_focus(&ci) == 0)
return 0;
if (first)
*first = cr.m;
if (point)
*point = cr.m2;
+ else if (new)
+ *new = cr.m2;
else if (last)
*last = cr.m2;
return 1;
struct mark *vmark_first(struct pane *p, int view)
{
struct mark *first = NULL;
- if (vmark_get(p, view, &first, NULL, NULL) == 0)
+ if (vmark_get(p, view, &first, NULL, NULL, NULL) == 0)
return 0;
return first;
}
struct mark *vmark_last(struct pane *p, int view)
{
struct mark *last = NULL;
- if (vmark_get(p, view, NULL, &last, NULL) == 0)
+ if (vmark_get(p, view, NULL, &last, NULL, NULL) == 0)
return 0;
return last;
}
struct mark *vmark_at_point(struct pane *p, int view)
{
struct mark *point = NULL;
- if (vmark_get(p, view, NULL, NULL, &point) == 0)
+ if (vmark_get(p, view, NULL, NULL, &point, NULL) == 0)
return 0;
return point;
}
+struct mark *vmark_new(struct pane *p, int view)
+{
+ struct mark *new = NULL;
+ if (vmark_get(p, view, NULL, NULL, NULL, &new) == 0)
+ return 0;
+ return new;
+}
+
struct mark *vmark_matching(struct pane *p, struct mark *m)
{
/* Find a nearby mark in the same view with the same ref */
struct mark *vmark_first(struct pane *p, int view);
struct mark *vmark_last(struct pane *p, int view);
struct mark *vmark_at_point(struct pane *p, int view);
+struct mark *vmark_new(struct pane *p, int view);
static inline int mark_ordered(struct mark *m1, struct mark *m2)
{
m = vmark_first(d->home, type);
if (m == NULL) {
/* No marks yet, let's make some */
- m = doc_new_mark(d, type);
+ m = vmark_new(d->home, type);
do_count(d, m, NULL, &l, &w, &c, 1);
}
if (doc_prior(d, m) != WEOF) {
/* no mark at start of file */
- m2 = doc_new_mark(d, type);
+ m2 = vmark_new(d->home, type);
do_count(d, m2, m, &l, &w, &c, 1);
m = m2;
}