diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-02-07 16:07:44 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-02-10 19:39:01 +0100 |
| commit | 528c418427361b480dd8be66eb872b2053963817 (patch) | |
| tree | 1c30ed62bc60aa663c13437130f6745d90a529f7 /main.c | |
| parent | a9128846c27307bae1a8154c8bfe8c71acd2c88e (diff) | |
| download | vis-528c418427361b480dd8be66eb872b2053963817.tar.gz vis-528c418427361b480dd8be66eb872b2053963817.tar.xz | |
vis: implement gf and <C-w>gf to open filename under cursor
Based on a patch by Silvan Jegen.
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 55 |
1 files changed, 55 insertions, 0 deletions
@@ -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) { |
