# HG changeset patch # User Bram Moolenaar # Date 1581696004 -3600 # Node ID bd9069d21c5d3933c9fcef14b2b18e764c8fe0ff # Parent 99feeb1a4af76696d4e6af9dfb66ae7f5d1d1ae9 patch 8.2.0258: modifyOtherKeys cannot be temporarily disabled Commit: https://github.com/vim/vim/commit/4132eb505c506f7a0710b03a275d1c5a247e4196 Author: Bram Moolenaar Date: Fri Feb 14 16:53:00 2020 +0100 patch 8.2.0258: modifyOtherKeys cannot be temporarily disabled Problem: ModifyOtherKeys cannot be temporarily disabled. Solution: Add echoraw() with an example for modifyOtherKeys. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 8.2. Last change: 2020 Feb 03 +*eval.txt* For Vim version 8.2. Last change: 2020 Feb 14 VIM REFERENCE MANUAL by Bram Moolenaar @@ -2414,6 +2414,7 @@ deletebufline({expr}, {first} [, {last}] did_filetype() Number |TRUE| if FileType autocmd event used diff_filler({lnum}) Number diff filler lines about {lnum} diff_hlID({lnum}, {col}) Number diff highlighting at {lnum}/{col} +echoraw({expr}) none output {expr} as-is empty({expr}) Number |TRUE| if {expr} is empty environ() Dict return environment variables escape({string}, {chars}) String escape {chars} in {string} with '\' @@ -2899,6 +2900,7 @@ win_id2win({expr}) Number get window nr win_screenpos({nr}) List get screen position of window {nr} win_splitmove({nr}, {target} [, {options}]) Number move window {nr} to split of {target} +win_type([{nr}]) String type of window {nr} winbufnr({nr}) Number buffer number of window {nr} wincol() Number window column of the cursor winheight({nr}) Number height of window {nr} @@ -3944,6 +3946,17 @@ diff_hlID({lnum}, {col}) *diff_hlID() Can also be used as a |method|: > GetLnum()->diff_hlID(col) + +echoraw({expr}) *echoraw()* + Output {expr} as-is, including unprintable characters. This + can be used to output a terminal code. For example, to disable + modifyOtherKeys: > + call echoraw(&t_TE) +< and to enable it again: > + call echoraw(&t_TI) +< Use with care, you can mess up the terminal this way. + + empty({expr}) *empty()* Return the Number 1 if {expr} is empty, zero otherwise. - A |List| or |Dictionary| is empty when it does not have any @@ -10402,6 +10415,7 @@ win_splitmove({nr}, {target} [, {options Can also be used as a |method|: > GetWinid()->win_splitmove(target) < + *winbufnr()* winbufnr({nr}) The result is a Number, which is the number of the buffer associated with window {nr}. {nr} can be the window number or diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -60,6 +60,7 @@ static void f_debugbreak(typval_T *argva #endif static void f_deepcopy(typval_T *argvars, typval_T *rettv); static void f_did_filetype(typval_T *argvars, typval_T *rettv); +static void f_echoraw(typval_T *argvars, typval_T *rettv); static void f_empty(typval_T *argvars, typval_T *rettv); static void f_environ(typval_T *argvars, typval_T *rettv); static void f_escape(typval_T *argvars, typval_T *rettv); @@ -394,6 +395,7 @@ static funcentry_T global_functions[] = {"did_filetype", 0, 0, 0, &t_number, f_did_filetype}, {"diff_filler", 1, 1, FEARG_1, &t_number, f_diff_filler}, {"diff_hlID", 2, 2, FEARG_1, &t_number, f_diff_hlID}, + {"echoraw", 1, 1, FEARG_1, &t_number, f_echoraw}, {"empty", 1, 1, FEARG_1, &t_number, f_empty}, {"environ", 0, 0, 0, &t_dict_string, f_environ}, {"escape", 2, 2, FEARG_1, &t_string, f_escape}, @@ -1814,6 +1816,21 @@ f_did_filetype(typval_T *argvars UNUSED, } /* + * "echoraw({expr})" function + */ + static void +f_echoraw(typval_T *argvars, typval_T *rettv UNUSED) +{ + char_u *str = tv_get_string_chk(&argvars[0]); + + if (str != NULL && *str != NUL) + { + out_str(str); + out_flush(); + } +} + +/* * "empty({expr})" function */ static void diff --git a/src/testdir/dumps/Test_functions_echoraw.dump b/src/testdir/dumps/Test_functions_echoraw.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_functions_echoraw.dump @@ -0,0 +1,5 @@ +>x+0&#ffffff0|e|l@1|o| @34 +|~+0#4040ff13&| @38 +|~| @38 +|~| @38 +| +0#0000000&@21|0|,|0|-|1| @8|A|l@1| diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -2,6 +2,7 @@ source shared.vim source check.vim source term_util.vim +source screendump.vim " Must be done first, since the alternate buffer must be unset. func Test_00_bufexists() @@ -2017,3 +2018,19 @@ func Test_range() " uniq() call assert_equal([0, 1, 2, 3, 4], uniq(range(5))) endfunc + +func Test_echoraw() + CheckScreendump + + " Normally used for escape codes, but let's test with a CR. + let lines =<< trim END + call echoraw("hello\x") + END + call writefile(lines, 'XTest_echoraw') + let buf = RunVimInTerminal('-S XTest_echoraw', {'rows': 5, 'cols': 40}) + call VerifyScreenDump(buf, 'Test_functions_echoraw', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('XTest_echoraw') +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -743,6 +743,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 258, +/**/ 257, /**/ 256,