return 1;
}
+DEF_CMD(save_str)
+{
+ struct call_return *cr = container_of(ci->comm, struct call_return, c);
+ cr->s = ci->str ? strdup(ci->str) : NULL;
+ return 1;
+}
+
DEF_CMD(emacs_file_complete)
{
/* Extract a directory name and a basename from the document.
int fd;
struct pane *par, *pop, *docp;
struct cmd_info ci2 = {0};
+ struct call_return cr;
int ret;
d = str;
ci2.key = "Complete:prefix";
ci2.str = b;
ci2.focus = par;
+ cr.c = save_str;
+ cr.s = NULL;
+ ci2.comm2 = &cr.c;
ret = key_handle_focus(&ci2);
free(d);
- if (ci2.str && (strlen(ci2.str) <= strlen(b) && ret-1 > 1)) {
+ if (cr.s && (strlen(cr.s) <= strlen(b) && ret-1 > 1)) {
/* We need the dropdown */
pane_damaged(par, DAMAGED_CONTENT);
free(str);
+ free(cr.s);
return 1;
}
- if (ci2.str) {
+ if (cr.s) {
/* add the extra chars from ci2.str */
- char *c = ci2.str + strlen(b);
+ char *c = cr.s + strlen(b);
call5("Replace", ci->focus, 1, ci->mark, c, 0);
+ free(cr.s);
}
/* Now need to close the popup */
pane_close(pop);
char *str = doc_getstr(ci->focus, NULL);
struct pane *par, *pop;
struct cmd_info ci2 = {0};
+ struct call_return cr;
int ret;
pop = pane_attach(ci->focus, "popup", ed->docs->home, "DM1r");
ci2.key = "Complete:prefix";
ci2.str = str;
ci2.focus = par;
+ cr.c = save_str;
+ cr.s = NULL;
+ ci2.comm2= &cr.c;
ret = key_handle_focus(&ci2);
- if (ci2.str && (strlen(ci2.str) <= strlen(str) && ret - 1 > 1)) {
+ if (cr.s && (strlen(cr.s) <= strlen(str) && ret - 1 > 1)) {
/* We need the dropdown */
pane_damaged(par, DAMAGED_CONTENT);
free(str);
+ free(cr.s);
return 1;
}
- if (ci2.str) {
- /* add the extra chars from ci2.str */
- char *c = ci2.str + strlen(str);
+ if (cr.s) {
+ /* add the extra chars from cr.s */
+ char *c = cr.s + strlen(str);
call5("Replace", ci->focus, 1, ci->mark, c, 0);
+ free(cr.s);
}
/* Now need to close the popup */
pane_close(pop);
common[common_len(c, common)] = 0;
cnt += 1;
}
- ci->str = common;
+ comm_call(ci->comm2, "callback:prefix", ci->focus, 0, NULL, common, 0);
+ free(common);
call3("Move-to", ci->home, 0, m);
mark_free(m);
call3("render-lines:redraw", ci->focus, 0, NULL);