From 007ff80b477880e820d08391b96ca2a00889082e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 28 Jan 2017 14:16:04 +0100 Subject: [PATCH] vis: deindent blank autoindented lines when leaving insert mode Does not work for the current implementation of `O` because the "lookbehind" i.e. second to last processed key is `` and not ``. Fix #383 --- main.c | 4 ++-- vis-modes.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index 046e90c06..15a20796b 100644 --- a/main.c +++ b/main.c @@ -1975,14 +1975,14 @@ static const char *openline(Vis *vis, const char *keys, const Arg *arg) { vis_operator(vis, VIS_OP_MODESWITCH, VIS_MODE_INSERT); if (arg->i > 0) { vis_motion(vis, VIS_MOVE_LINE_END); - vis_keys_feed(vis, ""); + vis_keys_feed(vis, ""); } else { if (vis_get_autoindent(vis)) { vis_motion(vis, VIS_MOVE_LINE_START); } else { vis_motion(vis, VIS_MOVE_LINE_BEGIN); } - vis_keys_feed(vis, ""); + vis_keys_feed(vis, ""); } return keys; } diff --git a/vis-modes.c b/vis-modes.c index 4739c3447..05cdc01bc 100644 --- a/vis-modes.c +++ b/vis-modes.c @@ -1,6 +1,7 @@ #include #include #include "vis-core.h" +#include "text-motions.h" #include "util.h" KeyAction *vis_action_new(Vis *vis, const char *name, const char *help, KeyActionFunction *func, Arg arg) { @@ -138,6 +139,21 @@ bool vis_window_mode_map(Win *win, enum VisMode id, bool force, const char *key, static void vis_mode_normal_enter(Vis *vis, Mode *old) { if (old != mode_get(vis, VIS_MODE_INSERT) && old != mode_get(vis, VIS_MODE_REPLACE)) return; + if (vis->autoindent && strcmp(vis->key_prev, "") == 0) { + Text *txt = vis->win->file->text; + for (Cursor *c = view_cursors(vis->win->view); c; c = view_cursors_next(c)) { + size_t pos = view_cursors_pos(c); + size_t start = text_line_start(txt, pos); + if (start == pos) { + size_t begin = text_line_begin(txt, pos); + size_t len = start - begin; + if (len) { + text_delete(txt, begin, len); + view_cursors_to(c, pos-len); + } + } + } + } macro_operator_stop(vis); if (!vis->win->parent && vis->action_prev.op == &vis_operators[VIS_OP_MODESWITCH] && vis->action_prev.count > 1) {