mirror of
https://github.com/tmux/tmux.git
synced 2024-11-17 18:08:51 +00:00
Skip wrapped lines in top level search loop because they will be
combined in the inner loop (in window_copy_search_rl_regex and the others), avoids searching the same text multiple times. Also add a line length limit for regex searches. GitHub issue 3675.
This commit is contained in:
parent
c767d62329
commit
43e5e80343
@ -295,6 +295,7 @@ struct window_copy_mode_data {
|
|||||||
int timeout; /* search has timed out */
|
int timeout; /* search has timed out */
|
||||||
#define WINDOW_COPY_SEARCH_TIMEOUT 10000
|
#define WINDOW_COPY_SEARCH_TIMEOUT 10000
|
||||||
#define WINDOW_COPY_SEARCH_ALL_TIMEOUT 200
|
#define WINDOW_COPY_SEARCH_ALL_TIMEOUT 200
|
||||||
|
#define WINDOW_COPY_SEARCH_MAX_LINE 2000
|
||||||
|
|
||||||
int jumptype;
|
int jumptype;
|
||||||
struct utf8_data *jumpchar;
|
struct utf8_data *jumpchar;
|
||||||
@ -3205,7 +3206,9 @@ window_copy_search_lr_regex(struct grid *gd, u_int *ppx, u_int *psx, u_int py,
|
|||||||
len = gd->sx - first;
|
len = gd->sx - first;
|
||||||
endline = gd->hsize + gd->sy - 1;
|
endline = gd->hsize + gd->sy - 1;
|
||||||
pywrap = py;
|
pywrap = py;
|
||||||
while (buf != NULL && pywrap <= endline) {
|
while (buf != NULL &&
|
||||||
|
pywrap <= endline &&
|
||||||
|
len < WINDOW_COPY_SEARCH_MAX_LINE) {
|
||||||
gl = grid_get_line(gd, pywrap);
|
gl = grid_get_line(gd, pywrap);
|
||||||
if (~gl->flags & GRID_LINE_WRAPPED)
|
if (~gl->flags & GRID_LINE_WRAPPED)
|
||||||
break;
|
break;
|
||||||
@ -3262,7 +3265,9 @@ window_copy_search_rl_regex(struct grid *gd, u_int *ppx, u_int *psx, u_int py,
|
|||||||
len = gd->sx - first;
|
len = gd->sx - first;
|
||||||
endline = gd->hsize + gd->sy - 1;
|
endline = gd->hsize + gd->sy - 1;
|
||||||
pywrap = py;
|
pywrap = py;
|
||||||
while (buf != NULL && (pywrap <= endline)) {
|
while (buf != NULL &&
|
||||||
|
pywrap <= endline &&
|
||||||
|
len < WINDOW_COPY_SEARCH_MAX_LINE) {
|
||||||
gl = grid_get_line(gd, pywrap);
|
gl = grid_get_line(gd, pywrap);
|
||||||
if (~gl->flags & GRID_LINE_WRAPPED)
|
if (~gl->flags & GRID_LINE_WRAPPED)
|
||||||
break;
|
break;
|
||||||
@ -3601,10 +3606,11 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd,
|
|||||||
struct grid *sgd, u_int fx, u_int fy, u_int endline, int cis, int wrap,
|
struct grid *sgd, u_int fx, u_int fy, u_int endline, int cis, int wrap,
|
||||||
int direction, int regex)
|
int direction, int regex)
|
||||||
{
|
{
|
||||||
u_int i, px, sx, ssize = 1;
|
u_int i, px, sx, ssize = 1;
|
||||||
int found = 0, cflags = REG_EXTENDED;
|
int found = 0, cflags = REG_EXTENDED;
|
||||||
char *sbuf;
|
char *sbuf;
|
||||||
regex_t reg;
|
regex_t reg;
|
||||||
|
struct grid_line *gl;
|
||||||
|
|
||||||
if (regex) {
|
if (regex) {
|
||||||
sbuf = xmalloc(ssize);
|
sbuf = xmalloc(ssize);
|
||||||
@ -3621,6 +3627,9 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd,
|
|||||||
|
|
||||||
if (direction) {
|
if (direction) {
|
||||||
for (i = fy; i <= endline; i++) {
|
for (i = fy; i <= endline; i++) {
|
||||||
|
gl = grid_get_line(gd, i);
|
||||||
|
if (i != endline && gl->flags & GRID_LINE_WRAPPED)
|
||||||
|
continue;
|
||||||
if (regex) {
|
if (regex) {
|
||||||
found = window_copy_search_lr_regex(gd,
|
found = window_copy_search_lr_regex(gd,
|
||||||
&px, &sx, i, fx, gd->sx, ®);
|
&px, &sx, i, fx, gd->sx, ®);
|
||||||
@ -3634,6 +3643,9 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = fy + 1; endline < i; i--) {
|
for (i = fy + 1; endline < i; i--) {
|
||||||
|
gl = grid_get_line(gd, i - 1);
|
||||||
|
if (i != endline && gl->flags & GRID_LINE_WRAPPED)
|
||||||
|
continue;
|
||||||
if (regex) {
|
if (regex) {
|
||||||
found = window_copy_search_rl_regex(gd,
|
found = window_copy_search_rl_regex(gd,
|
||||||
&px, &sx, i - 1, 0, fx + 1, ®);
|
&px, &sx, i - 1, 0, fx + 1, ®);
|
||||||
|
Loading…
Reference in New Issue
Block a user