X-Git-Url: https://git.xinqibao.xyz/st.git/blobdiff_plain/8618386de947a1e2d0b449d6f60fde478e931ecb..634c247fa76a5f649cdcc51109970e46ddaf5c32:/st.c diff --git a/st.c b/st.c index 533fb0a..e2e6c57 100644 --- a/st.c +++ b/st.c @@ -679,8 +679,14 @@ selected(int x, int y) { void selsnap(int mode, int *x, int *y, int direction) { + int i; + switch(mode) { case SNAP_WORD: + /* + * Snap around if the word wraps around at the end or + * beginning of a line. + */ for(;;) { if(direction < 0 && *x <= 0) { if(*y > 0 && term.line[*y - 1][term.col-1].mode @@ -708,6 +714,11 @@ selsnap(int mode, int *x, int *y, int direction) { } break; case SNAP_LINE: + /* + * Snap around if the the previous line or the current one + * has set ATTR_WRAP at its end. Then the whole next or + * previous line will be selected. + */ *x = (direction < 0) ? 0 : term.col - 1; if(direction < 0 && *y > 0) { for(; *y > 0; *y += direction) { @@ -726,6 +737,16 @@ selsnap(int mode, int *x, int *y, int direction) { } break; default: + /* + * Select the whole line when the end of line is reached. + */ + if(direction > 0) { + i = term.col; + while(--i > 0 && term.line[*y][i].c[0] == ' ') + /* nothing */; + if(i > 0 && i < *x) + *x = term.col - 1; + } break; } }