static bool foreach_key_run_request(struct key_visitor_state *state, bool internal, bool toggles) { struct keymap *keymap = state->keymap; const char *group = !internal ? "External commands:" : toggles ? "Option toggling:" : "Internal commands:"; enum request request = REQ_RUN_REQUESTS + 1; for (; true; request++) { struct run_request *req = get_run_request(request); const char *key; if (!req) break; if (req->flags.internal != !!internal || req->keymap != keymap || !*(key = get_keys(keymap, request, true))) continue; if (toggles != !strcmp(req->argv[0], "toggle")) continue; if (!foreach_key_visit(state, group, request, NULL, req)) return false; } return true; }
static enum request open_run_request(struct view *view, enum request request) { struct run_request *req = get_run_request(request); const char **argv = NULL; bool confirmed = FALSE; request = REQ_NONE; if (!req) { report("Unknown run request"); return request; } if (!argv_format(view->env, &argv, req->argv, FALSE, TRUE)) { report("Failed to format arguments"); return REQ_NONE; } if (req->flags.internal) { request = run_prompt_command(view, argv); } else { confirmed = !req->flags.confirm; if (req->flags.confirm) { char cmd[SIZEOF_STR], prompt[SIZEOF_STR]; const char *and_exit = req->flags.exit ? " and exit" : ""; if (argv_to_string(argv, cmd, sizeof(cmd), " ") && string_format(prompt, "Run `%s`%s?", cmd, and_exit) && prompt_yesno(prompt)) { confirmed = TRUE; } } if (confirmed && argv_remove_quotes(argv)) open_external_viewer(argv, NULL, req->flags.silent, !req->flags.exit, FALSE, ""); } if (argv) argv_free(argv); free(argv); if (request == REQ_NONE) { if (req->flags.confirm && !confirmed) request = REQ_NONE; else if (req->flags.exit) request = REQ_QUIT; else if (!req->flags.internal && watch_dirty(&view->watch)) request = REQ_REFRESH; } return request; }
static enum request open_run_request(struct view *view, enum request request) { struct run_request *req = get_run_request(request); if (!req) { report("Unknown run request"); return REQ_NONE; } return exec_run_request(view, req); }
static void help_open_keymap_run_requests(struct help_request_iterator *iterator) { struct view *view = iterator->view; struct keymap *keymap = iterator->keymap; char buf[SIZEOF_STR]; const char *group = "External commands:"; int i; for (i = 0; TRUE; i++) { struct run_request *req = get_run_request(REQ_NONE + i + 1); const char *key; if (!req) break; if (req->keymap != keymap) continue; key = get_key_name(req->key); if (!*key) key = "(no key defined)"; if (iterator->add_title && help_open_keymap_title(view, keymap)) return; iterator->add_title = FALSE; if (group) { add_line_text(view, group, LINE_HELP_GROUP); group = NULL; } if (!argv_to_string(req->argv, buf, sizeof(buf), " ")) return; add_line_format(view, LINE_DEFAULT, " %-25s `%s`", key, buf); } }
static enum request open_run_request(struct view *view, enum request request) { struct run_request *req = get_run_request(request); const char **argv = NULL; bool confirmed = FALSE; request = REQ_NONE; if (!req) { report("Unknown run request"); return request; } if (argv_format(view->env, &argv, req->argv, FALSE, TRUE)) { if (req->internal) { char cmd[SIZEOF_STR]; if (argv_to_string(argv, cmd, sizeof(cmd), " ")) { request = run_prompt_command(view, cmd); } } else { confirmed = !req->confirm; if (req->confirm) { char cmd[SIZEOF_STR], prompt[SIZEOF_STR]; const char *and_exit = req->exit ? " and exit" : ""; if (argv_to_string(argv, cmd, sizeof(cmd), " ") && string_format(prompt, "Run `%s`%s?", cmd, and_exit) && prompt_yesno(prompt)) { confirmed = TRUE; } } if (confirmed && argv_remove_quotes(argv)) { if (req->silent) io_run_bg(argv); else open_external_viewer(argv, NULL, !req->exit, ""); } } } if (argv) argv_free(argv); free(argv); if (request == REQ_NONE) { if (req->confirm && !confirmed) request = REQ_NONE; else if (req->exit) request = REQ_QUIT; else if (view_has_flags(view, VIEW_REFRESH) && !view->unrefreshable) request = REQ_REFRESH; } return request; }