aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-02-07 16:07:44 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-02-10 19:39:01 +0100
commit528c418427361b480dd8be66eb872b2053963817 (patch)
tree1c30ed62bc60aa663c13437130f6745d90a529f7 /main.c
parenta9128846c27307bae1a8154c8bfe8c71acd2c88e (diff)
downloadvis-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.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/main.c b/main.c
index c3ae7a3..da475e5 100644
--- a/main.c
+++ b/main.c
@@ -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) {