diff options
author | ZyX <kp-pav@yandex.ru> | 2015-08-23 19:58:56 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2015-10-08 22:01:05 +0300 |
commit | 29a3e972ded23b2a3f960c572c1c69e98646ae67 (patch) | |
tree | edd0ce9391a5889d75cdd3a4f77256cf592768c8 | |
parent | 915a29822335905b79a2dacc73ce6bd219367eeb (diff) | |
download | rneovim-29a3e972ded23b2a3f960c572c1c69e98646ae67.tar.gz rneovim-29a3e972ded23b2a3f960c572c1c69e98646ae67.tar.bz2 rneovim-29a3e972ded23b2a3f960c572c1c69e98646ae67.zip |
shada: Fix v:hlsearch save/restore and do not write empty patterns
-rw-r--r-- | src/nvim/shada.c | 90 | ||||
-rw-r--r-- | test/functional/shada/compatibility_spec.lua | 2 |
2 files changed, 40 insertions, 52 deletions
diff --git a/src/nvim/shada.c b/src/nvim/shada.c index 938a76dbd8..197c3e4dcd 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -1343,7 +1343,7 @@ static void shada_read(ShaDaReadDef *const sd_reader, const int flags) set_last_used_pattern( cur_entry.data.search_pattern.is_substitute_pattern); } - if (!cur_entry.data.search_pattern.is_substitute_pattern) { + if (cur_entry.data.search_pattern.is_last_used) { SET_NO_HLSEARCH(!cur_entry.data.search_pattern.highlighted); } // Do not free shada entry: its allocated memory was saved above. @@ -2513,59 +2513,47 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer, } while (var_iter != NULL); } + const bool search_highlighted = !(no_hlsearch + || find_shada_parameter('h') != NULL); + const bool search_last_used = search_was_last_used(); +#define ADD_SEARCH_PAT(func, wms_attr, hlo, pcae, o, is_sub) \ + do { \ + SearchPattern pat; \ + func(&pat); \ + if (pat.pat != NULL) { \ + wms->wms_attr = (PossiblyFreedShadaEntry) { \ + .can_free_entry = false, \ + .data = { \ + .type = kSDItemSearchPattern, \ + .timestamp = pat.timestamp, \ + .data = { \ + .search_pattern = { \ + .magic = pat.magic, \ + .smartcase = !pat.no_scs, \ + .has_line_offset = hlo, \ + .place_cursor_at_end = pcae, \ + .offset = o, \ + .is_last_used = (is_sub ^ search_last_used), \ + .is_substitute_pattern = is_sub, \ + .highlighted = ((is_sub ^ search_last_used) \ + && search_highlighted), \ + .pat = (char *) pat.pat, \ + .additional_data = pat.additional_data, \ + } \ + } \ + } \ + }; \ + } \ + } while (0) + // Initialize search pattern - { - SearchPattern pat; - get_search_pattern(&pat); - wms->search_pattern = (PossiblyFreedShadaEntry) { - .can_free_entry = false, - .data = { - .type = kSDItemSearchPattern, - .timestamp = pat.timestamp, - .data = { - .search_pattern = { - .magic = pat.magic, - .smartcase = !pat.no_scs, - .has_line_offset = pat.off.line, - .place_cursor_at_end = pat.off.end, - .offset = pat.off.off, - .is_last_used = search_was_last_used(), - .is_substitute_pattern = false, - .highlighted = !(no_hlsearch || find_shada_parameter('h') != NULL), - .pat = (char *) pat.pat, - .additional_data = pat.additional_data, - } - } - } - }; - } + ADD_SEARCH_PAT(get_search_pattern, search_pattern, pat.off.line, \ + pat.off.end, pat.off.off, false); // Initialize substitute search pattern - { - SearchPattern pat; - get_substitute_pattern(&pat); - wms->sub_search_pattern = (PossiblyFreedShadaEntry) { - .can_free_entry = false, - .data = { - .type = kSDItemSearchPattern, - .timestamp = pat.timestamp, - .data = { - .search_pattern = { - .magic = pat.magic, - .smartcase = !pat.no_scs, - .has_line_offset = false, - .place_cursor_at_end = false, - .offset = 0, - .is_last_used = !search_was_last_used(), - .is_substitute_pattern = true, - .highlighted = false, - .pat = (char *) pat.pat, - .additional_data = pat.additional_data, - } - } - } - }; - } + ADD_SEARCH_PAT(get_substitute_pattern, sub_search_pattern, false, false, 0, + true); +#undef ADD_SEARCH_PAT // Initialize substitute replacement string { diff --git a/test/functional/shada/compatibility_spec.lua b/test/functional/shada/compatibility_spec.lua index 13d4c44657..485e8a183c 100644 --- a/test/functional/shada/compatibility_spec.lua +++ b/test/functional/shada/compatibility_spec.lua @@ -39,7 +39,7 @@ describe('ShaDa forward compatibility support code', function() nvim_command('wshada ' .. shada_fname) found = false for _, v in ipairs(read_shada_file(shada_fname)) do - if v.type == 2 and v.value.ss then + if v.type == 2 and not v.value.ss then eq(nil, v.value.sX) found = true end |