mirror of
https://github.com/neovim/neovim.git
synced 2025-09-16 00:08:19 +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()) {
|
||||
s->line_is_white = inindent(0);
|
||||
// A key name preceded by a bang means this key is not to be
|
||||
// inserted. Skip ahead to the re-indenting below.
|
||||
// A key name preceded by a star means that indenting has to be
|
||||
// done before inserting the key.
|
||||
s->line_is_white = inindent(0);
|
||||
if (in_cinkeys(s->c, '!', s->line_is_white)) {
|
||||
insert_do_cindent(s);
|
||||
if (in_cinkeys(s->c, '!', s->line_is_white)
|
||||
&& stop_arrow() == OK) {
|
||||
do_c_expr_indent();
|
||||
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)
|
||||
&& stop_arrow() == OK) {
|
||||
do_c_expr_indent();
|
||||
@@ -3657,7 +3658,7 @@ void fix_indent(void)
|
||||
/// Check that "cinkeys" contains the key "keytyped",
|
||||
/// 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 not preceded with '*' (indent afterwards)
|
||||
/// when == ' ': Only if key is not preceded with '*' or '!' (indent afterwards)
|
||||
///
|
||||
/// "keytyped" can have a few special values:
|
||||
/// KEY_OPEN_FORW :
|
||||
@@ -3697,7 +3698,7 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty)
|
||||
case '!':
|
||||
try_match = (*look == '!'); break;
|
||||
default:
|
||||
try_match = (*look != '*'); break;
|
||||
try_match = (*look != '*') && (*look != '!'); break;
|
||||
}
|
||||
if (*look == '*' || *look == '!') {
|
||||
look++;
|
||||
|
Reference in New Issue
Block a user