int mark_same2(struct doc *d, struct mark *m1, struct mark *m2, struct cmd_info *ci)
{
- struct point p, *pt = &p;
struct cmd_info ci2 = {0};
- p.doc = d;
if (!ci)
ci = &ci2;
ci->key = "doc:mark-same";
ci->mark = m1;
ci->mark2 = m2;
- ci->pointp = &pt;
+ ci->home = d->home;
ci->extra = 0;
key_lookup(d->map, ci);
return ci->extra;
return mark_same2(d, m1, m2, NULL);
}
+int mark_same_pane(struct pane *p, struct mark *m1, struct mark *m2,
+ struct cmd_info *ci)
+{
+ struct cmd_info ci2 = {0};
+
+ if (!ci)
+ ci = &ci2;
+ ci->key = "doc:mark-same";
+ ci->mark = m1;
+ ci->mark2 = m2;
+ ci->extra = 0;
+ ci->focus = p;
+ ci->pointp = NULL;
+ if (key_handle_focus(ci) == 0)
+ return 0;
+ return ci->extra;
+}
+
/* A 'vmark' is a mark in a particular view. We can walk around those
* silently skipping over the points.
*/
void mark_to_mark(struct doc *d, struct mark *m, struct mark *target);
int mark_same(struct doc *d, struct mark *m1, struct mark *m2);
int mark_same2(struct doc *d, struct mark *m1, struct mark *m2, struct cmd_info *ci);
+int mark_same_pane(struct pane *p, struct mark *m1, struct mark *m2,
+ struct cmd_info *ci);
struct point *point_new(struct doc *d, struct point **owner);
struct point *point_dup(struct point *p, struct point **owner);
wint_t mark_step(struct doc *d, struct mark *m, int forward, int move, struct cmd_info *ci);
DEF_CMD(text_mark_same)
{
- struct doc *d = (*ci->pointp)->doc;
+ struct doc *d = ci->home->data;
struct text *t = container_of(d, struct text, doc);
+
ci->extra = text_ref_same(t, &ci->mark->ref, &ci->mark2->ref);
return 1;
}
struct rl_mark *rm = container_of(ci->mark,
struct rl_mark, m);
struct mark *vm;
- struct point **ptp = pane_point(rl->pane);
- struct doc *d = (*ptp)->doc;
+ struct cmd_info ci2 = {0};
+ struct pane *p = rl->pane;
+
if (rm->line) {
free(rm->line);
rm->line = NULL;
* delete it - marks must remain distinct
*/
while ((vm = vmark_prev(&rm->m)) != NULL &&
- mark_same(d, &rm->m, vm)) {
+ mark_same_pane(p, &rm->m, vm, &ci2)) {
struct rl_mark *rlm = container_of(vm, struct rl_mark, m);
free(rlm->line);
mark_free(vm);
}
while ((vm = vmark_next(&rm->m)) != NULL &&
- mark_same(d, &rm->m, vm)) {
+ mark_same_pane(p, &rm->m, vm, &ci2)) {
struct rl_mark *rlm = container_of(vm, struct rl_mark, m);
free(rlm->line);
mark_free(vm);