mirror of
https://github.com/neovim/neovim.git
synced 2025-11-22 10:06:33 +00:00
fix(edit.c): indentkeys double indent after "!" #12894
which is both unexpected and different from the Vim behaviour. Indent was triggered once by the '!' check in insert_execute(), and inserting the char was correctly skipped, but then triggered again in insert_check() (provided that cindent was not being ignored after manual indentation, i.e. `can_cindent == true`). While this is the smallest fix, another solution would be to remove VimState#check and instead move that to *_enter()/-_execute(), since the control flow is pretty unnecessarily convoluted as is. That would also have the benefit of differing less from the Vim source code.
This commit is contained in:
@@ -624,16 +624,17 @@ static int insert_execute(VimState *state, int key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cindent_on() && ctrl_x_mode_none()) {
|
if (cindent_on() && ctrl_x_mode_none()) {
|
||||||
|
s->line_is_white = inindent(0);
|
||||||
// A key name preceded by a bang means this key is not to be
|
// A key name preceded by a bang means this key is not to be
|
||||||
// inserted. Skip ahead to the re-indenting below.
|
// inserted. Skip ahead to the re-indenting below.
|
||||||
// A key name preceded by a star means that indenting has to be
|
if (in_cinkeys(s->c, '!', s->line_is_white)
|
||||||
// done before inserting the key.
|
&& stop_arrow() == OK) {
|
||||||
s->line_is_white = inindent(0);
|
do_c_expr_indent();
|
||||||
if (in_cinkeys(s->c, '!', s->line_is_white)) {
|
|
||||||
insert_do_cindent(s);
|
|
||||||
return 1; // continue
|
return 1; // continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A key name preceded by a star means that indenting has to be
|
||||||
|
// done before inserting the key.
|
||||||
if (can_cindent && in_cinkeys(s->c, '*', s->line_is_white)
|
if (can_cindent && in_cinkeys(s->c, '*', s->line_is_white)
|
||||||
&& stop_arrow() == OK) {
|
&& stop_arrow() == OK) {
|
||||||
do_c_expr_indent();
|
do_c_expr_indent();
|
||||||
@@ -3657,7 +3658,7 @@ void fix_indent(void)
|
|||||||
/// Check that "cinkeys" contains the key "keytyped",
|
/// Check that "cinkeys" contains the key "keytyped",
|
||||||
/// when == '*': Only if key is preceded with '*' (indent before insert)
|
/// when == '*': Only if key is preceded with '*' (indent before insert)
|
||||||
/// when == '!': Only if key is preceded with '!' (don't insert)
|
/// when == '!': Only if key is preceded with '!' (don't insert)
|
||||||
/// when == ' ': Only if key is not preceded with '*' (indent afterwards)
|
/// when == ' ': Only if key is not preceded with '*' or '!' (indent afterwards)
|
||||||
///
|
///
|
||||||
/// "keytyped" can have a few special values:
|
/// "keytyped" can have a few special values:
|
||||||
/// KEY_OPEN_FORW :
|
/// KEY_OPEN_FORW :
|
||||||
@@ -3697,7 +3698,7 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty)
|
|||||||
case '!':
|
case '!':
|
||||||
try_match = (*look == '!'); break;
|
try_match = (*look == '!'); break;
|
||||||
default:
|
default:
|
||||||
try_match = (*look != '*'); break;
|
try_match = (*look != '*') && (*look != '!'); break;
|
||||||
}
|
}
|
||||||
if (*look == '*' || *look == '!') {
|
if (*look == '*' || *look == '!') {
|
||||||
look++;
|
look++;
|
||||||
|
|||||||
@@ -6,12 +6,20 @@ local expect = helpers.expect
|
|||||||
local command = helpers.command
|
local command = helpers.command
|
||||||
local eq = helpers.eq
|
local eq = helpers.eq
|
||||||
local eval = helpers.eval
|
local eval = helpers.eval
|
||||||
|
local curbuf_contents = helpers.curbuf_contents
|
||||||
|
|
||||||
describe('insert-mode', function()
|
describe('insert-mode', function()
|
||||||
before_each(function()
|
before_each(function()
|
||||||
clear()
|
clear()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('indents only once after "!" keys #12894', function()
|
||||||
|
command('let counter = []')
|
||||||
|
command('set indentexpr=len(add(counter,0))')
|
||||||
|
feed('i<C-F>x')
|
||||||
|
eq(' x', curbuf_contents())
|
||||||
|
end)
|
||||||
|
|
||||||
it('CTRL-@', function()
|
it('CTRL-@', function()
|
||||||
-- Inserts last-inserted text, leaves insert-mode.
|
-- Inserts last-inserted text, leaves insert-mode.
|
||||||
insert('hello')
|
insert('hello')
|
||||||
|
|||||||
Reference in New Issue
Block a user