diff options
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/bindings.c | 1 | ||||
| -rw-r--r-- | src/main/cmds.c | 100 | ||||
| -rw-r--r-- | src/main/main.c | 6 |
3 files changed, 92 insertions, 15 deletions
diff --git a/src/main/bindings.c b/src/main/bindings.c index b49a45e..7b25c7b 100644 --- a/src/main/bindings.c +++ b/src/main/bindings.c @@ -100,6 +100,7 @@ void init_bindings() { BINDING(Ctrl, 'G', "find-file-relative"), BINDING(Ctrl, 'W', "write-file"), BINDING(None, 'b', "switch-buffer"), + BINDING(None, 'k', "kill-buffer"), BINDING(Ctrl, 'B', "buffer-list"), BINDING(None, '0', "window-close"), diff --git a/src/main/cmds.c b/src/main/cmds.c index c668116..d28924b 100644 --- a/src/main/cmds.c +++ b/src/main/cmds.c @@ -74,8 +74,8 @@ int32_t do_switch_buffer(struct command_ctx ctx, int argc, const char *argv[]) { const char *bufname = NULL; if (argc == 0) { // switch back to prev buffer - if (window_has_prev_buffer(ctx.active_window)) { - bufname = window_prev_buffer(ctx.active_window)->name; + if (window_has_prev_buffer_view(ctx.active_window)) { + bufname = window_prev_buffer_view(ctx.active_window)->buffer->name; } else { return 0; } @@ -110,9 +110,10 @@ int32_t switch_buffer(struct command_ctx ctx, int argc, const char *argv[]) { providers, 1, switch_buffer_comp_inserted); ctx.self = &do_switch_buffer_command; - if (window_has_prev_buffer(ctx.active_window)) { - return minibuffer_prompt(ctx, "buffer (default %s): ", - window_prev_buffer(ctx.active_window)->name); + if (window_has_prev_buffer_view(ctx.active_window)) { + return minibuffer_prompt( + ctx, "buffer (default %s): ", + window_prev_buffer_view(ctx.active_window)->buffer->name); } else { return minibuffer_prompt(ctx, "buffer: "); } @@ -124,6 +125,51 @@ int32_t switch_buffer(struct command_ctx ctx, int argc, const char *argv[]) { ctx.active_window, ctx.buffers, argc, argv); } +int32_t do_kill_buffer(struct command_ctx ctx, int argc, const char *argv[]) { + disable_completion(minibuffer_buffer()); + const char *bufname = NULL; + if (argc == 0) { + // kill current buffer + bufname = window_buffer(ctx.active_window)->name; + } else { + bufname = argv[0]; + } + + if (buffers_remove(ctx.buffers, bufname)) { + return 0; + } else { + minibuffer_echo_timeout(4, "buffer %s not found", bufname); + return 1; + } +} + +COMMAND_FN("do-kill-buffer", do_kill_buffer, do_kill_buffer, NULL); + +static void kill_buffer_comp_inserted() { minibuffer_execute(); } + +int32_t kill_buffer(struct command_ctx ctx, int argc, const char *argv[]) { + if (argc == 0) { + minibuffer_clear(); + struct completion_provider providers[] = {buffer_provider()}; + enable_completion(minibuffer_buffer(), + ((struct completion_trigger){ + .kind = CompletionTrigger_Input, + .input = + (struct completion_trigger_input){ + .nchars = 0, .trigger_initially = false}}), + providers, 1, kill_buffer_comp_inserted); + + ctx.self = &do_kill_buffer_command; + return minibuffer_prompt(ctx, "kill buffer (default %s): ", + window_buffer(ctx.active_window)->name); + } + + disable_completion(minibuffer_buffer()); + + return execute_command(&do_switch_buffer_command, ctx.commands, + ctx.active_window, ctx.buffers, argc, argv); +} + void timer_to_list_line(const struct timer *timer, void *userdata) { struct buffer *target = (struct buffer *)userdata; @@ -241,6 +287,34 @@ int32_t buflist_refresh_cmd(struct command_ctx ctx, int argc, return 0; } +static struct command buflist_refresh_command = { + .name = "buflist-refresh", + .fn = buflist_refresh_cmd, +}; + +int32_t buflist_kill_cmd(struct command_ctx ctx, int argc, const char *argv[]) { + struct window *w = ctx.active_window; + + struct buffer_view *bv = window_buffer_view(w); + struct text_chunk text = buffer_line(bv->buffer, bv->dot.line); + + char *end = (char *)memchr(text.text, ' ', text.nbytes); + + if (end != NULL) { + uint32_t len = end - (char *)text.text; + char *bufname = (char *)malloc(len + 1); + strncpy(bufname, (const char *)text.text, len); + bufname[len] = '\0'; + + buffers_remove(ctx.buffers, bufname); + free(bufname); + execute_command(&buflist_refresh_command, ctx.commands, ctx.active_window, + ctx.buffers, 0, NULL); + } + + return 0; +} + int32_t buffer_list(struct command_ctx ctx, int argc, const char *argv[]) { struct buffer *b = buffers_find(ctx.buffers, "*buffers*"); if (b == NULL) { @@ -258,20 +332,21 @@ int32_t buffer_list(struct command_ctx ctx, int argc, const char *argv[]) { .fn = buflist_visit_cmd, }; + static struct command buflist_kill = { + .name = "buflist-kill", + .fn = buflist_kill_cmd, + }; + static struct command buflist_close = { .name = "buflist-close", .fn = buflist_close_cmd, }; - static struct command buflist_refresh = { - .name = "buflist-refresh", - .fn = buflist_refresh_cmd, - }; - struct binding bindings[] = { - ANONYMOUS_BINDING(Ctrl, 'M', &buflist_visit), + ANONYMOUS_BINDING(ENTER, &buflist_visit), + ANONYMOUS_BINDING(None, 'k', &buflist_kill), ANONYMOUS_BINDING(None, 'q', &buflist_close), - ANONYMOUS_BINDING(None, 'g', &buflist_refresh), + ANONYMOUS_BINDING(None, 'g', &buflist_refresh_command), }; struct keymap km = keymap_create("buflist", 8); keymap_bind_keys(&km, bindings, sizeof(bindings) / sizeof(bindings[0])); @@ -396,6 +471,7 @@ void register_global_commands(struct commands *commands, {.name = "write-file", .fn = write_file}, {.name = "run-command-interactive", .fn = run_interactive}, {.name = "switch-buffer", .fn = switch_buffer}, + {.name = "kill-buffer", .fn = kill_buffer}, {.name = "abort", .fn = _abort}, {.name = "timers", .fn = timers}, {.name = "buffer-list", .fn = buffer_list}, diff --git a/src/main/main.c b/src/main/main.c index 927785e..6048b63 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -61,7 +61,7 @@ void segfault() { display_destroy(display); } - printf("Segfault encountered...\n"); + fprintf(stderr, "Segfault encountered...\n"); abort(); } @@ -289,8 +289,8 @@ int main(int argc, char *argv[]) { struct buffer *ib = buffers_add(&buflist, initial_buffer); - windows_init(display_height(display), display_width(display), ib, - &minibuffer); + windows_init(display_height(display), display_width(display), ib, &minibuffer, + &buflist); struct window *active = windows_get_active(); if (goto_end) { buffer_view_goto_end(window_buffer_view(active)); |
