--- config.def.h | 2 ++ main.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/config.def.h b/config.def.h index 47ed326..774871b 100644 --- a/config.def.h +++ b/config.def.h _AT_@ -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 */ }, }; diff --git a/main.c b/main.c index c3ae7a3..21a1066 100644 --- a/main.c +++ b/main.c _AT_@ -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, _AT_@ -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, }; _AT_@ -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", _AT_@ -1677,6 +1691,32 @@ 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 && vis_window_new(vis, name) && !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) { -- 2.1.4 --BXVAT5kNtrzKuDFl--Received on Mon Sep 17 2001 - 00:00:00 CEST
This archive was generated by hypermail 2.3.0 : Sun Feb 07 2016 - 17:48:10 CET