# HG changeset patch # User Bram Moolenaar # Date 1370968813 -7200 # Node ID 4db0bf9f1b44d1f0d42a1863732dfaef73c9971d # Parent 88b44813388439835b147bdccba707b3bf696c72 updated for version 7.3.1164 Problem: Can't test what is actually displayed on screen. Solution: Add the screenchar() and screenattr() functions. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1906,6 +1906,8 @@ repeat( {expr}, {count}) String repeat { resolve( {filename}) String get filename a shortcut points to reverse( {list}) List reverse {list} in-place round( {expr}) Float round off {expr} +screenattr( {row}, {col}) Number attribute at screen position +screenchar( {row}, {col}) Number character at screen position screencol() Number current cursor column screenrow() Number current cursor row search( {pattern} [, {flags} [, {stopline} [, {timeout}]]]) @@ -4890,6 +4892,21 @@ round({expr}) *round()* < -5.0 {only available when compiled with the |+float| feature} +screenattr(row, col) *screenattr()* + Like screenchar(), but return the attribute. This is a rather + arbitrary number that can only be used to compare to the + attribute at other positions. + +screenchar(row, col) *screenchar()* + The result is a Number, which is the character at position + [row, col] on the screen. This works for every possible + screen position, also status lines, window separators and the + command line. The top left position is row one, column one + The character excludes composing characters. For double-byte + encodings it may only be the first byte. + This is mainly to be used for testing. + Returns -1 when row or col is out of range. + screencol() *screencol()* The result is a Number, which is the current screen column of the cursor. The leftmost column has number 1. diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -654,6 +654,8 @@ static void f_reverse __ARGS((typval_T * #ifdef FEAT_FLOAT static void f_round __ARGS((typval_T *argvars, typval_T *rettv)); #endif +static void f_screenattr __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_screenchar __ARGS((typval_T *argvars, typval_T *rettv)); static void f_screencol __ARGS((typval_T *argvars, typval_T *rettv)); static void f_screenrow __ARGS((typval_T *argvars, typval_T *rettv)); static void f_search __ARGS((typval_T *argvars, typval_T *rettv)); @@ -8037,6 +8039,8 @@ static struct fst #ifdef FEAT_FLOAT {"round", 1, 1, f_round}, #endif + {"screenattr", 2, 2, f_screenattr}, + {"screenchar", 2, 2, f_screenchar}, {"screencol", 0, 0, f_screencol}, {"screenrow", 0, 0, f_screenrow}, {"search", 1, 4, f_search}, @@ -15804,6 +15808,59 @@ f_round(argvars, rettv) #endif /* + * "screenattr()" function + */ + static void +f_screenattr(argvars, rettv) + typval_T *argvars UNUSED; + typval_T *rettv; +{ + int row; + int col; + int c; + + row = get_tv_number_chk(&argvars[0], NULL) - 1; + col = get_tv_number_chk(&argvars[1], NULL) - 1; + if (row < 0 || row >= screen_Rows + || col < 0 || col >= screen_Columns) + c = -1; + else + c = ScreenAttrs[LineOffset[row] + col]; + rettv->vval.v_number = c; +} + +/* + * "screenchar()" function + */ + static void +f_screenchar(argvars, rettv) + typval_T *argvars UNUSED; + typval_T *rettv; +{ + int row; + int col; + int off; + int c; + + row = get_tv_number_chk(&argvars[0], NULL) - 1; + col = get_tv_number_chk(&argvars[1], NULL) - 1; + if (row < 0 || row >= screen_Rows + || col < 0 || col >= screen_Columns) + c = -1; + else + { + off = LineOffset[row] + col; +#ifdef FEAT_MBYTE + if (enc_utf8 && ScreenLinesUC[off] != 0) + c = ScreenLinesUC[off]; + else +#endif + c = ScreenLines[off]; + } + rettv->vval.v_number = c; +} + +/* * "screencol()" function * * First column is 1 to be consistent with virtcol(). diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1164, +/**/ 1163, /**/ 1162,