diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-06-11 18:40:13 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-06-11 18:40:13 +0200 |
commit | 9a773488a7113cd028151e71ab6c9cd43bf56972 (patch) | |
tree | 9d20f190b083bc9bc99f7b358d552a6808724b9a | |
parent | c09a6d6c0c9d0e9056816f518171864158c72076 (diff) | |
download | vim-git-9a773488a7113cd028151e71ab6c9cd43bf56972.tar.gz |
updated for version 7.3.1164v7.3.1164
Problem: Can't test what is actually displayed on screen.
Solution: Add the screenchar() and screenattr() functions.
-rw-r--r-- | runtime/doc/eval.txt | 17 | ||||
-rw-r--r-- | src/eval.c | 57 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 76 insertions, 0 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index f7cc93b72..09eb22dbd 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1906,6 +1906,8 @@ repeat( {expr}, {count}) String repeat {expr} {count} times 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 index 38893c795..81c3ca278 100644 --- a/src/eval.c +++ b/src/eval.c @@ -654,6 +654,8 @@ static void f_reverse __ARGS((typval_T *argvars, typval_T *rettv)); #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 index 6be6a6cff..0122a8092 100644 --- 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, |