From 1d8b5da24db92f9598cd6aeb59d283ae39024349 Mon Sep 17 00:00:00 2001 From: Albert Cervin Date: Tue, 9 May 2023 13:38:21 +0200 Subject: Start of buflist implementation --- src/dged/buffers.c | 5 +++++ src/dged/buffers.h | 2 ++ src/main/bindings.c | 1 + src/main/cmds.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/src/dged/buffers.c b/src/dged/buffers.c index aa6bcea..265a248 100644 --- a/src/dged/buffers.c +++ b/src/dged/buffers.c @@ -52,6 +52,11 @@ struct buffer *buffers_find_by_filename(struct buffers *buffers, return NULL; } +void buffers_for_each(struct buffers *buffers, buffers_hook_cb callback, + void *userdata) { + VEC_FOR_EACH(&buffers->buffers, struct buffer * b) { callback(b, userdata); } +} + void buffers_destroy(struct buffers *buffers) { VEC_FOR_EACH(&buffers->buffers, struct buffer * b) { buffer_destroy(b); } diff --git a/src/dged/buffers.h b/src/dged/buffers.h index 8add8d8..cb37fcb 100644 --- a/src/dged/buffers.h +++ b/src/dged/buffers.h @@ -25,4 +25,6 @@ struct buffer *buffers_find_by_filename(struct buffers *buffers, const char *pat uint32_t buffers_add_add_hook(struct buffers *buffers, buffers_hook_cb callback, void *userdata); uint32_t buffers_add_remove_hook(struct buffers *buffers, buffers_hook_cb callback, void *userdata); +void buffers_for_each(struct buffers *buffers, buffers_hook_cb callback, void *userdata); + void buffers_destroy(struct buffers *buffers); diff --git a/src/main/bindings.c b/src/main/bindings.c index 7ea75eb..ec608fd 100644 --- a/src/main/bindings.c +++ b/src/main/bindings.c @@ -83,6 +83,7 @@ struct keymap *register_bindings() { BINDING(Ctrl, 'F', "find-file"), BINDING(Ctrl, 'W', "write-file"), BINDING(None, 'b', "switch-buffer"), + BINDING(Ctrl, 'B', "buffer-list"), BINDING(None, '0', "window-close"), BINDING(None, '1', "window-close-others"), diff --git a/src/main/cmds.c b/src/main/cmds.c index 4cbb00f..63a7e01 100644 --- a/src/main/cmds.c +++ b/src/main/cmds.c @@ -269,6 +269,39 @@ int32_t timers(struct command_ctx ctx, int argc, const char *argv[]) { return 0; } +void buffer_to_list_line(struct buffer *buffer, void *userdata) { + struct buffer_view *listbuf = (struct buffer_view *)userdata; + char buf[1024]; + size_t written = snprintf(buf, 1024, "%-16s %s\n", buffer->name, + buffer->filename != NULL ? buffer->filename : ""); + + if (written > 0) { + buffer_add_text(listbuf, (uint8_t *)buf, written); + } +} + +int32_t buffer_list(struct command_ctx ctx, int argc, const char *argv[]) { + struct buffer *b = buffers_find(ctx.buffers, "buffers"); + if (b == NULL) { + b = buffers_add(ctx.buffers, buffer_create("buffers")); + } + + struct window *new_window_a, *new_window_b; + window_split(ctx.active_window, &new_window_a, &new_window_b); + + window_set_buffer(new_window_b, b); + + struct buffer_view *bv = window_buffer_view(new_window_b); + buffer_set_readonly(b, false); + buffer_clear(bv); + buffers_for_each(ctx.buffers, buffer_to_list_line, bv); + + buffer_goto_beginning(bv); + buffer_set_readonly(b, true); + + return 0; +} + void register_global_commands(struct commands *commands, void (*terminate_cb)()) { @@ -281,6 +314,7 @@ void register_global_commands(struct commands *commands, {.name = "find-next", .fn = find, .userdata = "forward"}, {.name = "find-prev", .fn = find, .userdata = "backward"}, {.name = "timers", .fn = timers}, + {.name = "buffer-list", .fn = buffer_list}, {.name = "exit", .fn = exit_editor, .userdata = terminate_cb}}; register_commands(commands, global_commands, -- cgit v1.2.3