From f288a64264d1c7a2bd07c0d9cb4b1f9809d5868b Mon Sep 17 00:00:00 2001 From: lePerdu Date: Wed, 2 May 2018 18:22:25 -0400 Subject: [PATCH] edit.c: Disable indent during completion closes #8345 --- src/nvim/edit.c | 2 +- test/functional/viml/completion_spec.lua | 113 +++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 67ac675a14..6b31406b0c 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -494,7 +494,7 @@ static int insert_check(VimState *state) s->inserted_space = false; } - if (can_cindent && cindent_on() && ctrl_x_mode == 0) { + if (can_cindent && cindent_on() && ctrl_x_mode == 0 && !compl_started) { insert_do_cindent(s); } diff --git a/test/functional/viml/completion_spec.lua b/test/functional/viml/completion_spec.lua index 70b4717c32..cd1b312265 100644 --- a/test/functional/viml/completion_spec.lua +++ b/test/functional/viml/completion_spec.lua @@ -466,6 +466,7 @@ describe('completion', function() ]]) expect('August') end) + it("repeats correctly after backspace #2674", function () feed('oJa') screen:expect([[ @@ -712,6 +713,118 @@ describe('completion', function() end) end) + it("does not indent until an item is selected #8345", function () + -- Indents on "ind", unindents on "unind". + source([[ + function! TestIndent() + let line = getline(v:lnum) + if (line =~ '^\s*ind') + return indent(v:lnum-1) + shiftwidth() + elseif (line =~ '^\s*unind') + return indent(v:lnum-1) - shiftwidth() + else + return indent(v:lnum-1) + endif + endfunction + set indentexpr=TestIndent() + set indentkeys=o,O,!^F,=ind,=unind + set completeopt+=menuone + ]]) + + -- Give some words to complete. + feed("iinc uninc indent unindent") + + -- Does not indent when "ind" is typed. + feed("in") + -- Completion list is generated incorrectly if we send everything at once + -- via nvim_input(). So wait() before sending . #8480 + wait() + feed("d") + + screen:expect([[ + inc uninc indent unindent | + ind^ | + {2:indent }{0: }| + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + {3:-- Keyword Local completion (^N^P) }{4:match 1 of 2} | + ]]) + + -- Indents when the item is selected + feed("") + screen:expect([[ + inc uninc indent unindent | + indent^ | + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + {3:-- INSERT --} | + ]]) + -- Indents when completion is exited using ESC. + feed("ind") + screen:expect([[ + inc uninc indent unindent | + indent | + in^d | + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + | + ]]) + -- Works for unindenting too. + feed("ounin") + helpers.wait() + feed("d") + screen:expect([[ + inc uninc indent unindent | + indent | + ind | + unind^ | + {0:~ }{2: unindent }{0: }| + {0:~ }| + {0:~ }| + {3:-- Keyword Local completion (^N^P) }{4:match 1 of 2} | + ]]) + -- Works when going back and forth. + feed("c") + screen:expect([[ + inc uninc indent unindent | + indent | + ind | + uninc^ | + {0:~ }{2: uninc }{0: }| + {0:~ }| + {0:~ }| + {3:-- Keyword Local completion (^N^P) }{4:match 1 of 2} | + ]]) + feed("d") + screen:expect([[ + inc uninc indent unindent | + indent | + ind | + unind^ | + {0:~ }{2: unindent }{0: }| + {0:~ }| + {0:~ }| + {3:-- Keyword Local completion (^N^P) }{4:match 1 of 2} | + ]]) + feed("") + screen:expect([[ + inc uninc indent unindent | + indent | + ind | + uninden^t | + {0:~ }| + {0:~ }| + {0:~ }| + | + ]]) + end) it('disables folding during completion', function () feed_command("set foldmethod=indent")