aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2015-08-23 19:58:56 +0300
committerZyX <kp-pav@yandex.ru>2015-10-08 22:01:05 +0300
commit29a3e972ded23b2a3f960c572c1c69e98646ae67 (patch)
treeedd0ce9391a5889d75cdd3a4f77256cf592768c8
parent915a29822335905b79a2dacc73ce6bd219367eeb (diff)
downloadrneovim-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.c90
-rw-r--r--test/functional/shada/compatibility_spec.lua2
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