From 59e91088122728fa03a8031b20686e037bd9b76d Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Sun, 25 Mar 2018 10:25:12 +1100 Subject: [PATCH] indent selector: When line is empty, find indent from surrounding lines Look for the first non empty line preceeding the current line, or if not found, the first non empty line following it. Fixes #1904 --- src/selectors.cc | 15 +++++++++++++-- .../cmd | 1 + .../in | 4 ++++ .../selections | 4 ++++ 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 test/regression/1904-select-empty-line-indent-gets-whole-buffer/cmd create mode 100644 test/regression/1904-select-empty-line-indent-gets-whole-buffer/in create mode 100644 test/regression/1904-select-empty-line-indent-gets-whole-buffer/selections diff --git a/src/selectors.cc b/src/selectors.cc index 378692cc..d8ca897b 100644 --- a/src/selectors.cc +++ b/src/selectors.cc @@ -654,6 +654,17 @@ select_indent(const Context& context, const Selection& selection, return indent; }; + auto get_current_indent = [&](const Buffer& buffer, LineCount line, int tabstop) + { + for (auto l = line; l >= 0; --l) + if (buffer[l] != "\n"_sv) + return get_indent(buffer[l], tabstop); + for (auto l = line+1; l < buffer.line_count(); ++l) + if (buffer[l] != "\n"_sv) + return get_indent(buffer[l], tabstop); + return 0_char; + }; + auto is_only_whitespaces = [](StringView str) { auto it = str.begin(); skip_while(it, str.end(), @@ -667,8 +678,8 @@ select_indent(const Context& context, const Selection& selection, auto& buffer = context.buffer(); int tabstop = context.options()["tabstop"].get(); auto pos = selection.cursor(); - LineCount line = pos.line; - auto indent = get_indent(buffer[line], tabstop); + const LineCount line = pos.line; + const auto indent = get_current_indent(buffer, line, tabstop); LineCount begin_line = line - 1; if (to_begin) diff --git a/test/regression/1904-select-empty-line-indent-gets-whole-buffer/cmd b/test/regression/1904-select-empty-line-indent-gets-whole-buffer/cmd new file mode 100644 index 00000000..f318c475 --- /dev/null +++ b/test/regression/1904-select-empty-line-indent-gets-whole-buffer/cmd @@ -0,0 +1 @@ +2ji diff --git a/test/regression/1904-select-empty-line-indent-gets-whole-buffer/in b/test/regression/1904-select-empty-line-indent-gets-whole-buffer/in new file mode 100644 index 00000000..3a283adf --- /dev/null +++ b/test/regression/1904-select-empty-line-indent-gets-whole-buffer/in @@ -0,0 +1,4 @@ +foo(): + foo + + bar diff --git a/test/regression/1904-select-empty-line-indent-gets-whole-buffer/selections b/test/regression/1904-select-empty-line-indent-gets-whole-buffer/selections new file mode 100644 index 00000000..90241a37 --- /dev/null +++ b/test/regression/1904-select-empty-line-indent-gets-whole-buffer/selections @@ -0,0 +1,4 @@ + foo + + bar +