To: vim_dev@googlegroups.com Subject: Patch 7.4.2071 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.2071 Problem: The return value of type() is difficult to use. Solution: Define v:t_ constants. (Ken Takata) Files: runtime/doc/eval.txt, src/eval.c, src/evalfunc.c, src/testdir/test_channel.vim, src/testdir/test_viml.vim, src/vim.h *** ../vim-7.4.2070/runtime/doc/eval.txt 2016-07-16 14:46:51.119240709 +0200 --- runtime/doc/eval.txt 2016-07-19 17:18:42.434204673 +0200 *************** *** 1810,1815 **** --- 1827,1853 ---- example, when jumping to a tag the value is ":tag tagname\r". For ":edit +cmd file" the value is ":cmd\r". + *v:t_TYPE* *v:t_bool* *t_bool-varialble* + v:t_bool Value of Boolean type. Read-only. See: |type()| + *v:t_channel* *t_channel-varialble* + v:t_channel Value of Channel type. Read-only. See: |type()| + *v:t_dict* *t_dict-varialble* + v:t_dict Value of Dictionary type. Read-only. See: |type()| + *v:t_float* *t_float-varialble* + v:t_float Value of Float type. Read-only. See: |type()| + *v:t_func* *t_func-varialble* + v:t_func Value of Funcref type. Read-only. See: |type()| + *v:t_job* *t_job-varialble* + v:t_job Value of Job type. Read-only. See: |type()| + *v:t_list* *t_list-varialble* + v:t_list Value of List type. Read-only. See: |type()| + *v:t_none* *t_none-varialble* + v:t_none Value of None type. Read-only. See: |type()| + *v:t_number* *t_number-varialble* + v:t_number Value of Number type. Read-only. See: |type()| + *v:t_string* *t_string-varialble* + v:t_string Value of String type. Read-only. See: |type()| + *v:termresponse* *termresponse-variable* v:termresponse The escape sequence returned by the terminal for the |t_RV| termcap entry. It is set when Vim receives an escape sequence *************** *** 7403,7422 **** {only available when compiled with the |+float| feature} *type()* ! type({expr}) The result is a Number, depending on the type of {expr}: ! Number: 0 ! String: 1 ! Funcref: 2 ! List: 3 ! Dictionary: 4 ! Float: 5 ! To avoid the magic numbers it should be used this way: > :if type(myvar) == type(0) :if type(myvar) == type("") :if type(myvar) == type(function("tr")) :if type(myvar) == type([]) :if type(myvar) == type({}) :if type(myvar) == type(0.0) undofile({name}) *undofile()* Return the name of the undo file that would be used for a file --- 7546,7575 ---- {only available when compiled with the |+float| feature} *type()* ! type({expr}) The result is a Number representing the type of {expr}. ! Instead of using the number directly, it is better to use the ! v:t_ variable that has the value: ! Number: 0 |v:t_number| ! String: 1 |v:t_string| ! Funcref: 2 |v:t_func| ! List: 3 |v:t_list| ! Dictionary: 4 |v:t_dict| ! Float: 5 |v:t_float| ! Boolean: 6 |v:t_bool| (v:false and v:true) ! None 7 |v:t_none| (v:null and v:none) ! Job 8 |v:t_job| ! Channel 9 |v:t_channel| ! For backward compatibility, this method can be used: > :if type(myvar) == type(0) :if type(myvar) == type("") :if type(myvar) == type(function("tr")) :if type(myvar) == type([]) :if type(myvar) == type({}) :if type(myvar) == type(0.0) + :if type(myvar) == type(v:false) + :if type(myvar) == type(v:none) + < To check if the v:t_ variables exist use this: > + :if exists('v:t_number') undofile({name}) *undofile()* Return the name of the undo file that would be used for a file *************** *** 7510,7515 **** --- 7663,7672 ---- plus one) 'x position of mark x (if the mark is not set, 0 is returned) + v In Visual mode: the start of the Visual area (the + cursor is the end). When not in Visual mode + returns the cursor position. Differs from |'<| in + that it's updated right away. Note that only marks in the current file can be used. Examples: > virtcol(".") with text "foo^Lbar", with cursor on the "^L", returns 5 *** ../vim-7.4.2070/src/eval.c 2016-07-17 22:13:26.805095373 +0200 --- src/eval.c 2016-07-19 17:11:58.058396906 +0200 *************** *** 177,182 **** --- 177,192 ---- {VV_NAME("none", VAR_SPECIAL), VV_RO}, {VV_NAME("vim_did_enter", VAR_NUMBER), VV_RO}, {VV_NAME("testing", VAR_NUMBER), 0}, + {VV_NAME("t_number", VAR_NUMBER), VV_RO}, + {VV_NAME("t_string", VAR_NUMBER), VV_RO}, + {VV_NAME("t_func", VAR_NUMBER), VV_RO}, + {VV_NAME("t_list", VAR_NUMBER), VV_RO}, + {VV_NAME("t_dict", VAR_NUMBER), VV_RO}, + {VV_NAME("t_float", VAR_NUMBER), VV_RO}, + {VV_NAME("t_bool", VAR_NUMBER), VV_RO}, + {VV_NAME("t_none", VAR_NUMBER), VV_RO}, + {VV_NAME("t_job", VAR_NUMBER), VV_RO}, + {VV_NAME("t_channel", VAR_NUMBER), VV_RO}, }; /* shorthand */ *************** *** 292,297 **** --- 302,318 ---- set_vim_var_nr(VV_NONE, VVAL_NONE); set_vim_var_nr(VV_NULL, VVAL_NULL); + set_vim_var_nr(VV_TYPE_NUMBER, VAR_TYPE_NUMBER); + set_vim_var_nr(VV_TYPE_STRING, VAR_TYPE_STRING); + set_vim_var_nr(VV_TYPE_FUNC, VAR_TYPE_FUNC); + set_vim_var_nr(VV_TYPE_LIST, VAR_TYPE_LIST); + set_vim_var_nr(VV_TYPE_DICT, VAR_TYPE_DICT); + set_vim_var_nr(VV_TYPE_FLOAT, VAR_TYPE_FLOAT); + set_vim_var_nr(VV_TYPE_BOOL, VAR_TYPE_BOOL); + set_vim_var_nr(VV_TYPE_NONE, VAR_TYPE_NONE); + set_vim_var_nr(VV_TYPE_JOB, VAR_TYPE_JOB); + set_vim_var_nr(VV_TYPE_CHANNEL, VAR_TYPE_CHANNEL); + set_reg_var(0); /* default for v:register is not 0 but '"' */ #ifdef EBCDIC *** ../vim-7.4.2070/src/evalfunc.c 2016-07-17 22:33:48.668907497 +0200 --- src/evalfunc.c 2016-07-19 17:11:58.058396906 +0200 *************** *** 12136,12157 **** switch (argvars[0].v_type) { ! case VAR_NUMBER: n = 0; break; ! case VAR_STRING: n = 1; break; case VAR_PARTIAL: ! case VAR_FUNC: n = 2; break; ! case VAR_LIST: n = 3; break; ! case VAR_DICT: n = 4; break; ! case VAR_FLOAT: n = 5; break; case VAR_SPECIAL: if (argvars[0].vval.v_number == VVAL_FALSE || argvars[0].vval.v_number == VVAL_TRUE) ! n = 6; else ! n = 7; break; ! case VAR_JOB: n = 8; break; ! case VAR_CHANNEL: n = 9; break; case VAR_UNKNOWN: EMSG2(_(e_intern2), "f_type(UNKNOWN)"); n = -1; --- 12136,12157 ---- switch (argvars[0].v_type) { ! case VAR_NUMBER: n = VAR_TYPE_NUMBER; break; ! case VAR_STRING: n = VAR_TYPE_STRING; break; case VAR_PARTIAL: ! case VAR_FUNC: n = VAR_TYPE_FUNC; break; ! case VAR_LIST: n = VAR_TYPE_LIST; break; ! case VAR_DICT: n = VAR_TYPE_DICT; break; ! case VAR_FLOAT: n = VAR_TYPE_FLOAT; break; case VAR_SPECIAL: if (argvars[0].vval.v_number == VVAL_FALSE || argvars[0].vval.v_number == VVAL_TRUE) ! n = VAR_TYPE_BOOL; else ! n = VAR_TYPE_NONE; break; ! case VAR_JOB: n = VAR_TYPE_JOB; break; ! case VAR_CHANNEL: n = VAR_TYPE_CHANNEL; break; case VAR_UNKNOWN: EMSG2(_(e_intern2), "f_type(UNKNOWN)"); n = -1; *** ../vim-7.4.2070/src/testdir/test_channel.vim 2016-07-15 21:24:41.197452549 +0200 --- src/testdir/test_channel.vim 2016-07-19 17:11:58.058396906 +0200 *************** *** 188,193 **** --- 188,194 ---- " Test that we can open two channels. func Ch_two_channels(port) let handle = ch_open('localhost:' . a:port, s:chopt) + call assert_equal(v:t_channel, type(handle)) if ch_status(handle) == "fail" call assert_false(1, "Can't open channel") return *************** *** 420,425 **** --- 421,427 ---- endif call ch_log('Test_raw_pipe()') let job = job_start(s:python . " test_channel_pipe.py", {'mode': 'raw'}) + call assert_equal(v:t_job, type(job)) call assert_equal("run", job_status(job)) try " For a change use the job where a channel is expected. *** ../vim-7.4.2070/src/testdir/test_viml.vim 2016-07-01 18:16:47.497936191 +0200 --- src/testdir/test_viml.vim 2016-07-19 17:11:58.058396906 +0200 *************** *** 950,955 **** --- 950,969 ---- call assert_equal(6, type(v:true)) call assert_equal(7, type(v:none)) call assert_equal(7, type(v:null)) + call assert_equal(8, v:t_job) + call assert_equal(9, v:t_channel) + call assert_equal(v:t_number, type(0)) + call assert_equal(v:t_string, type("")) + call assert_equal(v:t_func, type(function("tr"))) + call assert_equal(v:t_func, type(function("tr", [8]))) + call assert_equal(v:t_list, type([])) + call assert_equal(v:t_dict, type({})) + call assert_equal(v:t_float, type(0.0)) + call assert_equal(v:t_bool, type(v:false)) + call assert_equal(v:t_bool, type(v:true)) + call assert_equal(v:t_none, type(v:none)) + call assert_equal(v:t_none, type(v:null)) + call assert_equal(0, 0 + v:false) call assert_equal(1, 0 + v:true) *** ../vim-7.4.2070/src/vim.h 2016-07-19 17:01:20.341019259 +0200 --- src/vim.h 2016-07-19 17:11:58.062396864 +0200 *************** *** 1968,1974 **** #define VV_NONE 68 #define VV_VIM_DID_ENTER 69 #define VV_TESTING 70 ! #define VV_LEN 71 /* number of v: vars */ /* used for v_number in VAR_SPECIAL */ #define VVAL_FALSE 0L --- 1968,1984 ---- #define VV_NONE 68 #define VV_VIM_DID_ENTER 69 #define VV_TESTING 70 ! #define VV_TYPE_NUMBER 71 ! #define VV_TYPE_STRING 72 ! #define VV_TYPE_FUNC 73 ! #define VV_TYPE_LIST 74 ! #define VV_TYPE_DICT 75 ! #define VV_TYPE_FLOAT 76 ! #define VV_TYPE_BOOL 77 ! #define VV_TYPE_NONE 78 ! #define VV_TYPE_JOB 79 ! #define VV_TYPE_CHANNEL 80 ! #define VV_LEN 81 /* number of v: vars */ /* used for v_number in VAR_SPECIAL */ #define VVAL_FALSE 0L *************** *** 1976,1981 **** --- 1986,2003 ---- #define VVAL_NONE 2L #define VVAL_NULL 3L + /* Type values for type(). */ + #define VAR_TYPE_NUMBER 0 + #define VAR_TYPE_STRING 1 + #define VAR_TYPE_FUNC 2 + #define VAR_TYPE_LIST 3 + #define VAR_TYPE_DICT 4 + #define VAR_TYPE_FLOAT 5 + #define VAR_TYPE_BOOL 6 + #define VAR_TYPE_NONE 7 + #define VAR_TYPE_JOB 8 + #define VAR_TYPE_CHANNEL 9 + #ifdef FEAT_CLIPBOARD /* VIM_ATOM_NAME is the older Vim-specific selection type for X11. Still *** ../vim-7.4.2070/src/version.c 2016-07-19 17:01:20.345019217 +0200 --- src/version.c 2016-07-19 17:10:31.799291839 +0200 *************** *** 760,761 **** --- 760,763 ---- { /* Add new patch number below this line */ + /**/ + 2071, /**/ -- ARTHUR: I did say sorry about the `old woman,' but from the behind you looked-- DENNIS: What I object to is you automatically treat me like an inferior! ARTHUR: Well, I AM king... The Quest for the Holy Grail (Monty Python) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///