diff options
| -rw-r--r-- | config.def.h | 2 | ||||
| -rw-r--r-- | main.c | 55 |
2 files changed, 57 insertions, 0 deletions
diff --git a/config.def.h b/config.def.h index 47ed326..774871b 100644 --- a/config.def.h +++ b/config.def.h @@ -233,6 +233,8 @@ static const KeyBinding bindings_normal[] = { { "gP", ACTION(PUT_BEFORE_END) }, { "~", ALIAS("<vis-operator-case-swap>l") }, { "<End>", ALIAS("$") }, + { "gf", ACTION(OPEN_FILE_UNDER_CURSOR) }, + { "<C-w>gf", ACTION(OPEN_FILE_UNDER_CURSOR_NEW_WINDOW) }, { 0 /* empty last element, array terminator */ }, }; @@ -111,6 +111,8 @@ static const char *unicode_info(Vis*, const char *keys, const Arg *arg); static const char *percent(Vis*, const char *keys, const Arg *arg); /* either increment (arg->i > 0) or decrement (arg->i < 0) number under cursor */ static const char *number_increment_decrement(Vis*, const char *keys, const Arg *arg); +/* open a filename under cursor in same (!arg->b) or new (arg->b) window */ +static const char *open_file_under_cursor(Vis*, const char *keys, const Arg *arg); enum { VIS_ACTION_EDITOR_SUSPEND, @@ -272,6 +274,8 @@ enum { VIS_ACTION_UNICODE_INFO, VIS_ACTION_NUMBER_INCREMENT, VIS_ACTION_NUMBER_DECREMENT, + VIS_ACTION_OPEN_FILE_UNDER_CURSOR, + VIS_ACTION_OPEN_FILE_UNDER_CURSOR_NEW_WINDOW, VIS_ACTION_NOP, }; @@ -1071,6 +1075,16 @@ static KeyAction vis_action[] = { "Decrement number under cursor", number_increment_decrement, { .i = -1 } }, + [VIS_ACTION_OPEN_FILE_UNDER_CURSOR] = { + "open-file-under-cursor", + "Open file under the cursor", + open_file_under_cursor, { .b = false } + }, + [VIS_ACTION_OPEN_FILE_UNDER_CURSOR_NEW_WINDOW] = { + "open-file-under-cursor-new-cursor", + "Open file under the cursor in a new window", + open_file_under_cursor, { .b = true } + }, [VIS_ACTION_NOP] = { "nop", "Ignore key, do nothing", @@ -1677,6 +1691,47 @@ static const char *number_increment_decrement(Vis *vis, const char *keys, const return keys; } +static const char *open_file_under_cursor(Vis *vis, const char *keys, const Arg *arg) { + Win *win = vis_window(vis); + View *view = vis_view(vis); + Text *txt = vis_text(vis); + + if (!arg->b && !vis_window_closable(win)) { + vis_info_show(vis, "No write since last change"); + return keys; + } + + for (Cursor *c = view_cursors(view); c; c = view_cursors_next(c)) { + Filerange r = text_object_filename(txt, view_cursors_pos(c)); + if (!text_range_valid(&r)) + continue; + char *name = text_bytes_alloc0(txt, r.start, text_range_size(&r)); + if (!name) + continue; + + struct stat st; + if (stat(name, &st) == -1) { + vis_info_show(vis, "File `%s' not found", name); + free(name); + continue; + } + + if (!vis_window_new(vis, name)) { + vis_info_show(vis, "Failed to open `%s': %s", name, strerror(errno)); + free(name); + continue; + } else if (!arg->b) { + vis_window_close(win); + free(name); + return keys; + } + + free(name); + } + + return keys; +} + static Vis *vis; static void signal_handler(int signum, siginfo_t *siginfo, void *context) { |
