diff options
-rw-r--r-- | src/nvim/change.c | 8 | ||||
-rw-r--r-- | src/nvim/indent.c | 2 | ||||
-rw-r--r-- | src/nvim/shada.c | 83 | ||||
-rw-r--r-- | src/nvim/testdir/test_alot.vim | 1 | ||||
-rw-r--r-- | src/nvim/testdir/test_lispindent.vim (renamed from src/nvim/testdir/test_lispwords.vim) | 16 |
5 files changed, 64 insertions, 46 deletions
diff --git a/src/nvim/change.c b/src/nvim/change.c index c9e57ab88f..c6f9e9f5c2 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -1814,17 +1814,15 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) vreplace_mode = 0; } - // May do lisp indenting. if (!p_paste && leader == NULL && curbuf->b_p_lisp && curbuf->b_p_ai) { + // do lisp indenting fixthisline(get_lisp_indent); ai_col = (colnr_T)getwhitecols_curline(); - } - - // May do indenting after opening a new line. - if (do_cindent) { + } else if (do_cindent) { + // do 'cindent' or 'indentexpr' indenting do_c_expr_indent(); ai_col = (colnr_T)getwhitecols_curline(); } diff --git a/src/nvim/indent.c b/src/nvim/indent.c index 2509388009..3f5a8afbc1 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -1138,7 +1138,7 @@ static int lisp_match(char_u *p) (void)copy_option_part(&word, buf, LSIZE, ","); len = (int)strlen(buf); - if ((STRNCMP(buf, p, len) == 0) && (p[len] == ' ')) { + if ((STRNCMP(buf, p, len) == 0) && ascii_iswhite_or_nul(p[len])) { return true; } } diff --git a/src/nvim/shada.c b/src/nvim/shada.c index 7580cc8897..e56febec9b 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -454,10 +454,7 @@ static const ShadaEntry sd_default_values[] = { .additional_data = NULL), DEF_SDE(Variable, global_var, .name = NULL, - .value = { - .v_type = VAR_UNKNOWN, - .vval = { .v_string = NULL } - }, + .value = { .v_type = VAR_UNKNOWN, .vval = { .v_string = NULL } }, .additional_elements = NULL), DEF_SDE(GlobalMark, filemark, .name = '"', @@ -1127,26 +1124,27 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags) const bool get_old_files = (flags & (kShaDaGetOldfiles | kShaDaForceit) && (force || tv_list_len(oldfiles_list) == 0)); const bool want_marks = flags & kShaDaWantMarks; - const unsigned srni_flags = (unsigned)( - (flags & kShaDaWantInfo - ? (kSDReadUndisableableData - | kSDReadRegisters - | kSDReadGlobalMarks - | (p_hi ? kSDReadHistory : 0) - | (find_shada_parameter('!') != NULL - ? kSDReadVariables - : 0) - | (find_shada_parameter('%') != NULL - && ARGCOUNT == 0 - ? kSDReadBufferList - : 0)) - : 0) - | (want_marks && get_shada_parameter('\'') > 0 - ? kSDReadLocalMarks | kSDReadChanges - : 0) - | (get_old_files - ? kSDReadLocalMarks - : 0)); + const unsigned srni_flags = + (unsigned)( + (flags & kShaDaWantInfo + ? (kSDReadUndisableableData + | kSDReadRegisters + | kSDReadGlobalMarks + | (p_hi ? kSDReadHistory : 0) + | (find_shada_parameter('!') != NULL + ? kSDReadVariables + : 0) + | (find_shada_parameter('%') != NULL + && ARGCOUNT == 0 + ? kSDReadBufferList + : 0)) + : 0) + | (want_marks && get_shada_parameter('\'') > 0 + ? kSDReadLocalMarks | kSDReadChanges + : 0) + | (get_old_files + ? kSDReadLocalMarks + : 0)); if (srni_flags == 0) { // Nothing to do. return; @@ -1191,17 +1189,18 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags) case kSDItemSearchPattern: if (!force) { SearchPattern pat; - (cur_entry.data.search_pattern.is_substitute_pattern - ? &get_substitute_pattern - : &get_search_pattern)(&pat); + if (cur_entry.data.search_pattern.is_substitute_pattern) { + get_substitute_pattern(&pat); + } else { + get_search_pattern(&pat); + } if (pat.pat != NULL && pat.timestamp >= cur_entry.timestamp) { shada_free_shada_entry(&cur_entry); break; } } - (cur_entry.data.search_pattern.is_substitute_pattern - ? &set_substitute_pattern - : &set_search_pattern)((SearchPattern) { + + SearchPattern spat = (SearchPattern) { .magic = cur_entry.data.search_pattern.magic, .no_scs = !cur_entry.data.search_pattern.smartcase, .off = { @@ -1213,7 +1212,14 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags) .pat = (char_u *)cur_entry.data.search_pattern.pat, .additional_data = cur_entry.data.search_pattern.additional_data, .timestamp = cur_entry.timestamp, - }); + }; + + if (cur_entry.data.search_pattern.is_substitute_pattern) { + set_substitute_pattern(spat); + } else { + set_search_pattern(spat); + } + if (cur_entry.data.search_pattern.is_last_used) { set_last_used_pattern(cur_entry.data.search_pattern.is_substitute_pattern); set_no_hlsearch(!cur_entry.data.search_pattern.highlighted); @@ -1688,8 +1694,8 @@ static ShaDaWriteResult shada_pack_entry(msgpack_packer *const packer, ShadaEntr msgpack_pack_long(spacker, entry.data.filemark.mark.col); } assert(entry.type == kSDItemJump || entry.type == kSDItemChange - ? CHECK_DEFAULT(entry, filemark.name) - : true); + ? CHECK_DEFAULT(entry, filemark.name) + : true); if (!CHECK_DEFAULT(entry, filemark.name)) { PACK_STATIC_STR(KEY_NAME_CHAR); msgpack_pack_uint8(spacker, (uint8_t)entry.data.filemark.name); @@ -1699,15 +1705,14 @@ static ShaDaWriteResult shada_pack_entry(msgpack_packer *const packer, ShadaEntr break; } case kSDItemRegister: { - const size_t map_size = (size_t)( - 2 // Register contents and name + const size_t map_size = (size_t)(2 // Register contents and name + ONE_IF_NOT_DEFAULT(entry, reg.type) + ONE_IF_NOT_DEFAULT(entry, reg.width) + ONE_IF_NOT_DEFAULT(entry, reg.is_unnamed) // Additional entries, if any: + (size_t)(entry.data.reg.additional_data == NULL - ? 0 - : entry.data.reg.additional_data->dv_hashtab.ht_used)); + ? 0 + : entry.data.reg.additional_data->dv_hashtab.ht_used)); msgpack_pack_map(spacker, map_size); PACK_STATIC_STR(REG_KEY_CONTENTS); msgpack_pack_array(spacker, entry.data.reg.contents_size); @@ -2097,8 +2102,8 @@ static inline ShaDaWriteResult shada_read_when_writing(ShaDaReadDef *const sd_re break; case kSDItemSearchPattern: COMPARE_WITH_ENTRY((entry.data.search_pattern.is_substitute_pattern - ? &wms->sub_search_pattern - : &wms->search_pattern), entry); + ? &wms->sub_search_pattern + : &wms->search_pattern), entry); break; case kSDItemSubString: COMPARE_WITH_ENTRY(&wms->replacement, entry); diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim index a83ef50abc..a3d240f27e 100644 --- a/src/nvim/testdir/test_alot.vim +++ b/src/nvim/testdir/test_alot.vim @@ -15,7 +15,6 @@ source test_fnamemodify.vim source test_ga.vim source test_glob2regpat.vim source test_global.vim -source test_lispwords.vim source test_move.vim source test_put.vim source test_reltime.vim diff --git a/src/nvim/testdir/test_lispwords.vim b/src/nvim/testdir/test_lispindent.vim index 4144fb0521..8987f67a80 100644 --- a/src/nvim/testdir/test_lispwords.vim +++ b/src/nvim/testdir/test_lispindent.vim @@ -86,6 +86,22 @@ func Test_lisp_indent() set nolisp endfunc +func Test_lispindent_negative() + " in legacy script there is no error + call assert_equal(-1, lispindent(-1)) +endfunc + +func Test_lispindent_with_indentexpr() + enew + setl ai lisp nocin indentexpr=11 + exe "normal a(x\<CR>1\<CR>2)\<Esc>" + let expected = ['(x', ' 1', ' 2)'] + call assert_equal(expected, getline(1, 3)) + normal 1G=G + call assert_equal(expected, getline(1, 3)) + bwipe! +endfunc + func Test_lisp_indent_works() " This was reading beyond the end of the line new |