diff --git a/7.3.911 b/7.3.911 new file mode 100644 index 0000000..9143cee --- /dev/null +++ b/7.3.911 @@ -0,0 +1,343 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.911 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.911 +Problem: Python: Access to Vim variables is not so easy. +Solution: Define vim.vars and vim.vvars. (ZyX) +Files: runtime/doc/if_pyth.txt, src/eval.c, src/globals.h, + src/if_py_both.h, src/if_python3.c, src/if_python.c, + src/testdir/test86.in, src/testdir/test86.ok, + src/testdir/test87.in, src/testdir/test87.ok + + +*** ../vim-7.3.910/runtime/doc/if_pyth.txt 2012-09-21 14:00:05.000000000 +0200 +--- runtime/doc/if_pyth.txt 2013-04-24 13:54:23.000000000 +0200 +*************** +*** 54,61 **** + EOF + endfunction + < +! Note: Python is very sensitive to the indenting. Also make sure the "class" +! line and "EOF" do not have any indent. + + *:pyfile* *:pyf* + :[range]pyf[ile] {file} +--- 54,61 ---- + EOF + endfunction + < +! Note: Python is very sensitive to the indenting. Make sure the "class" line +! and "EOF" do not have any indent. + + *:pyfile* *:pyf* + :[range]pyf[ile] {file} +*************** +*** 165,171 **** + Value Meaning ~ + zero Variable is not locked + vim.VAR_LOCKED Variable is locked, but can be unlocked +! vim.VAR_FIXED Variable is locked and can’t be unlocked + integer constants. If variable is not fixed, you can do + `var.locked=True` to lock it and `var.locked=False` to unlock. + There is no recursive locking like |:lockvar|! does. There is also +--- 165,171 ---- + Value Meaning ~ + zero Variable is not locked + vim.VAR_LOCKED Variable is locked, but can be unlocked +! vim.VAR_FIXED Variable is locked and can't be unlocked + integer constants. If variable is not fixed, you can do + `var.locked=True` to lock it and `var.locked=False` to unlock. + There is no recursive locking like |:lockvar|! does. There is also +*************** +*** 237,242 **** +--- 237,247 ---- + "current range". A range is a bit like a buffer, but with all access + restricted to a subset of lines. See |python-range| for more details. + ++ vim.vars *python-vars* ++ vim.vvars *python-vvars* ++ Dictionary-like objects holding dictionaries with global (|g:|) and ++ vim (|v:|) variables respectively. Identical to `vim.bindeval("g:")`, ++ but faster. + + Output from Python *python-output* + Vim displays all Python code output in the Vim message area. Normal +*************** +*** 307,312 **** +--- 312,318 ---- + :py n = len(b) # number of lines + :py (row,col) = b.mark('a') # named mark + :py r = b.range(1,5) # a sub-range of the buffer ++ :py b.vars["foo"] = "bar" # assign b:foo variable + + ============================================================================== + 4. Range objects *python-range* +*************** +*** 354,359 **** +--- 360,368 ---- + This is a tuple, (row,col). + height (read-write) The window height, in rows + width (read-write) The window width, in columns ++ vars (read-only) The window |w:| variables. Attribute is ++ unassignable, but you can change window ++ variables this way + The height attribute is writable only if the screen is split horizontally. + The width attribute is writable only if the screen is split vertically. + +*************** +*** 385,391 **** + + *:py3* *:python3* + The |:py3| and |:python3| commands work similar to |:python|. A simple check +! if the `:py3` command is wrong: > + :py3 print("Hello") + < *:py3file* + The |:py3file| command works similar to |:pyfile|. +--- 394,400 ---- + + *:py3* *:python3* + The |:py3| and |:python3| commands work similar to |:python|. A simple check +! if the `:py3` command is working: > + :py3 print("Hello") + < *:py3file* + The |:py3file| command works similar to |:pyfile|. +*** ../vim-7.3.910/src/eval.c 2013-04-15 18:25:55.000000000 +0200 +--- src/eval.c 2013-04-24 14:02:45.000000000 +0200 +*************** +*** 113,124 **** + static char *e_nofunc = N_("E130: Unknown function: %s"); + static char *e_illvar = N_("E461: Illegal variable name: %s"); + +! /* +! * All user-defined global variables are stored in dictionary "globvardict". +! * "globvars_var" is the variable that is used for "g:". +! */ +! static dict_T globvardict; +! static dictitem_T globvars_var; + #define globvarht globvardict.dv_hashtab + + /* +--- 113,119 ---- + static char *e_nofunc = N_("E130: Unknown function: %s"); + static char *e_illvar = N_("E461: Illegal variable name: %s"); + +! static dictitem_T globvars_var; /* variable used for g: */ + #define globvarht globvardict.dv_hashtab + + /* +*************** +*** 370,381 **** + #define vv_list vv_di.di_tv.vval.v_list + #define vv_tv vv_di.di_tv + +! /* +! * The v: variables are stored in dictionary "vimvardict". +! * "vimvars_var" is the variable that is used for the "l:" scope. +! */ +! static dict_T vimvardict; +! static dictitem_T vimvars_var; + #define vimvarht vimvardict.dv_hashtab + + static void prepare_vimvar __ARGS((int idx, typval_T *save_tv)); +--- 365,371 ---- + #define vv_list vv_di.di_tv.vval.v_list + #define vv_tv vv_di.di_tv + +! static dictitem_T vimvars_var; /* variable used for v: */ + #define vimvarht vimvardict.dv_hashtab + + static void prepare_vimvar __ARGS((int idx, typval_T *save_tv)); +*** ../vim-7.3.910/src/globals.h 2013-03-19 13:33:18.000000000 +0100 +--- src/globals.h 2013-04-24 13:57:51.000000000 +0200 +*************** +*** 180,185 **** +--- 180,187 ---- + EXTERN int emsg_severe INIT(= FALSE); /* use message of next of several + emsg() calls for throw */ + EXTERN int did_endif INIT(= FALSE); /* just had ":endif" */ ++ EXTERN dict_T vimvardict; /* Dictionary with v: variables */ ++ EXTERN dict_T globvardict; /* Dictionary with g: variables */ + #endif + EXTERN int did_emsg; /* set by emsg() when the message + is displayed or thrown */ +*** ../vim-7.3.910/src/if_py_both.h 2013-04-24 13:47:36.000000000 +0200 +--- src/if_py_both.h 2013-04-24 13:54:23.000000000 +0200 +*************** +*** 1532,1539 **** + else if (strcmp(name, "width") == 0) + return Py_BuildValue("l", (long)(W_WIDTH(this->win))); + #endif + else if (strcmp(name,"__members__") == 0) +! return Py_BuildValue("[sss]", "buffer", "cursor", "height"); + else + return NULL; + } +--- 1532,1541 ---- + else if (strcmp(name, "width") == 0) + return Py_BuildValue("l", (long)(W_WIDTH(this->win))); + #endif ++ else if (strcmp(name, "vars") == 0) ++ return DictionaryNew(this->win->w_vars); + else if (strcmp(name,"__members__") == 0) +! return Py_BuildValue("[ssss]", "buffer", "cursor", "height", "vars"); + else + return NULL; + } +*************** +*** 2495,2502 **** + return Py_BuildValue("s", this->buf->b_ffname); + else if (strcmp(name, "number") == 0) + return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum); + else if (strcmp(name,"__members__") == 0) +! return Py_BuildValue("[ss]", "name", "number"); + else + return NULL; + } +--- 2497,2506 ---- + return Py_BuildValue("s", this->buf->b_ffname); + else if (strcmp(name, "number") == 0) + return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum); ++ else if (strcmp(name, "vars") == 0) ++ return DictionaryNew(this->buf->b_vars); + else if (strcmp(name,"__members__") == 0) +! return Py_BuildValue("[sss]", "name", "number", "vars"); + else + return NULL; + } +*** ../vim-7.3.910/src/if_python3.c 2013-04-24 13:39:11.000000000 +0200 +--- src/if_python3.c 2013-04-24 13:54:23.000000000 +0200 +*************** +*** 1647,1652 **** +--- 1647,1655 ---- + Py_INCREF((PyObject *)(void *)&TheWindowList); + PyModule_AddObject(mod, "windows", (PyObject *)(void *)&TheWindowList); + ++ PyModule_AddObject(mod, "vars", DictionaryNew(&globvardict)); ++ PyModule_AddObject(mod, "vvars", DictionaryNew(&vimvardict)); ++ + #define ADD_INT_CONSTANT(name, value) \ + tmp = PyLong_FromLong(value); \ + Py_INCREF(tmp); \ +*** ../vim-7.3.910/src/if_python.c 2013-04-24 13:47:36.000000000 +0200 +--- src/if_python.c 2013-04-24 13:54:33.000000000 +0200 +*************** +*** 1330,1335 **** +--- 1330,1336 ---- + { + PyObject *mod; + PyObject *dict; ++ PyObject *tmp; + /* The special value is removed from sys.path in Python_Init(). */ + static char *(argv[2]) = {"/must>not&exist/foo", NULL}; + +*************** +*** 1353,1358 **** +--- 1354,1365 ---- + PyDict_SetItemString(dict, "buffers", (PyObject *)(void *)&TheBufferList); + PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent); + PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList); ++ tmp = DictionaryNew(&globvardict); ++ PyDict_SetItemString(dict, "vars", tmp); ++ Py_DECREF(tmp); ++ tmp = DictionaryNew(&vimvardict); ++ PyDict_SetItemString(dict, "vvars", tmp); ++ Py_DECREF(tmp); + PyDict_SetItemString(dict, "VAR_LOCKED", PyInt_FromLong(VAR_LOCKED)); + PyDict_SetItemString(dict, "VAR_FIXED", PyInt_FromLong(VAR_FIXED)); + PyDict_SetItemString(dict, "VAR_SCOPE", PyInt_FromLong(VAR_SCOPE)); +*** ../vim-7.3.910/src/testdir/test86.in 2013-04-05 19:32:30.000000000 +0200 +--- src/testdir/test86.in 2013-04-24 13:54:33.000000000 +0200 +*************** +*** 346,351 **** +--- 346,364 ---- + :$put =string(pyeval('l')) + :py l = ll[-10:10] + :$put =string(pyeval('l')) ++ :" ++ :" Vars ++ :let g:foo = 'bac' ++ :let w:abc = 'def' ++ :let b:baz = 'bar' ++ :try ++ : throw "Abc" ++ :catch ++ : put =pyeval('vim.vvars[''exception'']') ++ :endtry ++ :put =pyeval('vim.vars[''foo'']') ++ :put =pyeval('vim.current.window.vars[''abc'']') ++ :put =pyeval('vim.current.buffer.vars[''baz'']') + :endfun + :" + :call Test() +*** ../vim-7.3.910/src/testdir/test86.ok 2013-04-24 13:04:21.000000000 +0200 +--- src/testdir/test86.ok 2013-04-24 13:54:33.000000000 +0200 +*************** +*** 76,78 **** +--- 76,82 ---- + [0, 1, 2, 3, 4, 5] + [0, 1, 2, 3, 4, 5] + [0, 1, 2, 3, 4, 5] ++ Abc ++ bac ++ def ++ bar +*** ../vim-7.3.910/src/testdir/test87.in 2013-02-13 14:17:00.000000000 +0100 +--- src/testdir/test87.in 2013-04-24 13:54:33.000000000 +0200 +*************** +*** 315,320 **** +--- 315,333 ---- + :py3 trace_main() + :py3 sys.settrace(None) + :$put =string(l) ++ :" ++ :" Vars ++ :let g:foo = 'bac' ++ :let w:abc = 'def' ++ :let b:baz = 'bar' ++ :try ++ : throw "Abc" ++ :catch ++ : put =py3eval('vim.vvars[''exception'']') ++ :endtry ++ :put =py3eval('vim.vars[''foo'']') ++ :put =py3eval('vim.current.window.vars[''abc'']') ++ :put =py3eval('vim.current.buffer.vars[''baz'']') + :endfun + :" + :call Test() +*** ../vim-7.3.910/src/testdir/test87.ok 2013-04-24 13:04:21.000000000 +0200 +--- src/testdir/test87.ok 2013-04-24 13:54:33.000000000 +0200 +*************** +*** 65,67 **** +--- 65,71 ---- + vim: Vim(let):E861: + [1] + [1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1] ++ Abc ++ bac ++ def ++ bar +*** ../vim-7.3.910/src/version.c 2013-04-24 13:47:36.000000000 +0200 +--- src/version.c 2013-04-24 13:54:00.000000000 +0200 +*************** +*** 730,731 **** +--- 730,733 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 911, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +222. You send more than 20 personal e-mails a day. + + /// 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 ///