Fixed broken search results highlighting
Signed-off-by: Slava Zanko <slavazanko@gmail.com>
Этот коммит содержится в:
родитель
064352e14d
Коммит
1940e8f5dd
@ -816,6 +816,9 @@ mc_search__run_regex (mc_search_t * lc_mc_search, const void *user_data,
|
|||||||
if (current_chr == MC_SEARCH_CB_ABORT)
|
if (current_chr == MC_SEARCH_CB_ABORT)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (current_chr == MC_SEARCH_CB_INVALID)
|
||||||
|
continue;
|
||||||
|
|
||||||
current_pos++;
|
current_pos++;
|
||||||
|
|
||||||
if (current_chr == MC_SEARCH_CB_SKIP)
|
if (current_chr == MC_SEARCH_CB_SKIP)
|
||||||
|
@ -82,10 +82,9 @@ mcview_nroff_get_char (mcview_nroff_t * nroff, int *ret_val, off_t nroff_index)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_unichar_isprint (c))
|
|
||||||
return FALSE;
|
|
||||||
*ret_val = c;
|
*ret_val = c;
|
||||||
return TRUE;
|
|
||||||
|
return g_unichar_isprint (c);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -275,14 +274,20 @@ mcview__get_nroff_real_len (mcview_t * view, off_t start, off_t length)
|
|||||||
nroff = mcview_nroff_seq_new_num (view, start);
|
nroff = mcview_nroff_seq_new_num (view, start);
|
||||||
if (nroff == NULL)
|
if (nroff == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
while (i < length)
|
while (i < length)
|
||||||
{
|
{
|
||||||
if (nroff->type != NROFF_TYPE_NONE)
|
switch (nroff->type)
|
||||||
{
|
{
|
||||||
ret += 1 + nroff->char_width;
|
case NROFF_TYPE_BOLD:
|
||||||
|
ret += 1 + nroff->char_width; /* real char width and 0x8 */
|
||||||
|
break;
|
||||||
|
case NROFF_TYPE_UNDERLINE:
|
||||||
|
ret += 2; /* underline symbol and ox8 */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
i++;
|
i += nroff->char_width;
|
||||||
mcview_nroff_seq_next (nroff);
|
mcview_nroff_seq_next (nroff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -379,10 +384,20 @@ mcview_nroff_seq_next (mcview_nroff_t * nroff)
|
|||||||
|
|
||||||
nroff->prev_type = nroff->type;
|
nroff->prev_type = nroff->type;
|
||||||
|
|
||||||
|
switch (nroff->type)
|
||||||
|
{
|
||||||
|
case NROFF_TYPE_BOLD:
|
||||||
|
nroff->index += 1 + nroff->char_width;
|
||||||
|
break;
|
||||||
|
case NROFF_TYPE_UNDERLINE:
|
||||||
|
nroff->index += 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
nroff->index += nroff->char_width;
|
nroff->index += nroff->char_width;
|
||||||
|
|
||||||
if (nroff->prev_type != NROFF_TYPE_NONE)
|
|
||||||
nroff->index += 2;
|
|
||||||
mcview_nroff_seq_info (nroff);
|
mcview_nroff_seq_info (nroff);
|
||||||
return nroff->current_char;
|
return nroff->current_char;
|
||||||
}
|
}
|
||||||
|
@ -116,17 +116,21 @@ mcview_find (mcview_t * view, gsize search_start, gsize * len)
|
|||||||
static void
|
static void
|
||||||
mcview_search_show_result (mcview_t * view, Dlg_head ** d, size_t match_len)
|
mcview_search_show_result (mcview_t * view, Dlg_head ** d, size_t match_len)
|
||||||
{
|
{
|
||||||
|
int nroff_len;
|
||||||
|
|
||||||
view->search_start = view->search->normal_offset +
|
nroff_len =
|
||||||
mcview__get_nroff_real_len (view,
|
view->text_nroff_mode
|
||||||
view->search->start_buffer,
|
? mcview__get_nroff_real_len (view, view->search->start_buffer,
|
||||||
view->search->normal_offset - view->search->start_buffer);
|
view->search->normal_offset - view->search->start_buffer) : 0;
|
||||||
|
view->search_start = view->search->normal_offset + nroff_len;
|
||||||
|
|
||||||
if (!view->hex_mode)
|
if (!view->hex_mode)
|
||||||
view->search_start++;
|
view->search_start++;
|
||||||
|
|
||||||
view->search_end = view->search_start + match_len +
|
nroff_len =
|
||||||
mcview__get_nroff_real_len (view, view->search_start - 1, match_len);
|
view->text_nroff_mode ? mcview__get_nroff_real_len (view, view->search_start - 1,
|
||||||
|
match_len) : 0;
|
||||||
|
view->search_end = view->search_start + match_len + nroff_len;
|
||||||
|
|
||||||
if (view->hex_mode)
|
if (view->hex_mode)
|
||||||
{
|
{
|
||||||
@ -161,44 +165,50 @@ mcview_search_cmd_callback (const void *user_data, gsize char_offset)
|
|||||||
if (!view->text_nroff_mode)
|
if (!view->text_nroff_mode)
|
||||||
{
|
{
|
||||||
if (!mcview_get_byte (view, char_offset, &lc_byte))
|
if (!mcview_get_byte (view, char_offset, &lc_byte))
|
||||||
return MC_SEARCH_CB_INVALID;
|
return MC_SEARCH_CB_OK;
|
||||||
|
|
||||||
return lc_byte;
|
return lc_byte;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (view->search_numNeedSkipChar)
|
if (view->search_numNeedSkipChar != 0)
|
||||||
{
|
{
|
||||||
view->search_numNeedSkipChar--;
|
view->search_numNeedSkipChar--;
|
||||||
return MC_SEARCH_CB_SKIP;
|
return MC_SEARCH_CB_SKIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (search_cb_char_curr_index == -1)
|
if (search_cb_char_curr_index == -1
|
||||||
|
|| search_cb_char_curr_index >= view->search_nroff_seq->char_width)
|
||||||
{
|
{
|
||||||
|
if (search_cb_char_curr_index != -1)
|
||||||
|
mcview_nroff_seq_next (view->search_nroff_seq);
|
||||||
|
|
||||||
search_cb_char_curr_index = 0;
|
search_cb_char_curr_index = 0;
|
||||||
if (view->search_nroff_seq->char_width > 1)
|
if (view->search_nroff_seq->char_width > 1)
|
||||||
g_unichar_to_utf8 (view->search_nroff_seq->current_char, search_cb_char_buffer);
|
g_unichar_to_utf8 (view->search_nroff_seq->current_char, search_cb_char_buffer);
|
||||||
else
|
else
|
||||||
search_cb_char_buffer[0] = (char) view->search_nroff_seq->current_char;
|
search_cb_char_buffer[0] = (char) view->search_nroff_seq->current_char;
|
||||||
|
|
||||||
|
if (view->search_nroff_seq->type != NROFF_TYPE_NONE)
|
||||||
|
{
|
||||||
|
switch (view->search_nroff_seq->type)
|
||||||
|
{
|
||||||
|
case NROFF_TYPE_BOLD:
|
||||||
|
view->search_numNeedSkipChar = 1 + view->search_nroff_seq->char_width; /* real char width and 0x8 */
|
||||||
|
break;
|
||||||
|
case NROFF_TYPE_UNDERLINE:
|
||||||
|
view->search_numNeedSkipChar = 2; /* underline symbol and ox8 */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return MC_SEARCH_CB_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (search_cb_char_curr_index < view->search_nroff_seq->char_width)
|
lc_byte = search_cb_char_buffer[search_cb_char_curr_index];
|
||||||
{
|
search_cb_char_curr_index++;
|
||||||
lc_byte = search_cb_char_buffer[search_cb_char_curr_index];
|
return (lc_byte != -1) ? (unsigned char) lc_byte : MC_SEARCH_CB_INVALID;
|
||||||
search_cb_char_curr_index++;
|
|
||||||
return (lc_byte != -1) ? (unsigned char) lc_byte : MC_SEARCH_CB_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
mcview_nroff_seq_next (view->search_nroff_seq);
|
|
||||||
search_cb_char_curr_index = 0;
|
|
||||||
if (view->search_nroff_seq->char_width > 1)
|
|
||||||
g_unichar_to_utf8 (view->search_nroff_seq->current_char, search_cb_char_buffer);
|
|
||||||
else
|
|
||||||
search_cb_char_buffer[0] = (char) view->search_nroff_seq->current_char;
|
|
||||||
|
|
||||||
if (view->search_nroff_seq->type != NROFF_TYPE_NONE)
|
|
||||||
view->search_numNeedSkipChar = 1 + view->search_nroff_seq->char_width;
|
|
||||||
|
|
||||||
return MC_SEARCH_CB_SKIP;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -248,9 +258,14 @@ mcview_do_search (mcview_t * view)
|
|||||||
|
|
||||||
if (view->search_start != 0)
|
if (view->search_start != 0)
|
||||||
{
|
{
|
||||||
int nroff_real_len = mcview__get_nroff_real_len (view, view->search_start + 1, 2);
|
if (!view->text_nroff_mode)
|
||||||
search_start = mcview_search_options.backwards ? -2 : nroff_real_len != 0 ? 2 : 0;
|
search_start = view->search_start + (mcview_search_options.backwards ? -2 : 0);
|
||||||
search_start += view->search_start + nroff_real_len * search_start;
|
else
|
||||||
|
{
|
||||||
|
int nroff_real_len = mcview__get_nroff_real_len (view, view->search_start + 1, 2);
|
||||||
|
search_start = mcview_search_options.backwards ? -2 : nroff_real_len != 0 ? 1 : 0;
|
||||||
|
search_start += view->search_start + nroff_real_len * search_start;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mcview_search_options.backwards && (int) search_start < 0)
|
if (mcview_search_options.backwards && (int) search_start < 0)
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user