]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.911 v7.3.911
authorBram Moolenaar <Bram@vim.org>
Wed, 24 Apr 2013 12:07:45 +0000 (14:07 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 24 Apr 2013 12:07:45 +0000 (14:07 +0200)
Problem:    Python: Access to Vim variables is not so easy.
Solution:   Define vim.vars and vim.vvars. (ZyX)

runtime/doc/if_pyth.txt
src/eval.c
src/globals.h
src/if_py_both.h
src/if_python.c
src/if_python3.c
src/testdir/test86.in
src/testdir/test86.ok
src/testdir/test87.in
src/testdir/test87.ok
src/version.c

index 575002319aee01fe147f89e1f1877f1bfdb1c3a2..96fd1247d2c5bc7537fd71cf5f0f2d4e9455b32e 100644 (file)
@@ -237,6 +237,11 @@ vim.current                                                *python-current*
        "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,6 +312,7 @@ Examples (assume b is the current buffer) >
        :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,6 +360,9 @@ Window attributes are:
                                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.
 
index 4bfc0419ed96dabd5ff5c957a0539346b1339f9d..085eff88cec6f9a8e8d2d3ea604c76dcd1fb444a 100644 (file)
@@ -113,12 +113,7 @@ static char *e_letwrong = N_("E734: Wrong variable type for %s=");
 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;
+static dictitem_T      globvars_var;           /* variable used for g: */
 #define globvarht globvardict.dv_hashtab
 
 /*
@@ -370,12 +365,7 @@ static struct vimvar
 #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;
+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));
index ac0eb18e0646fbff4de24dc2d8d5b7e5ad3265a0..1e966cfec3355713bf617af36817ff1926bf537e 100644 (file)
@@ -180,6 +180,8 @@ EXTERN int  emsg_skip INIT(= 0);        /* don't display errors for
 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 */
index 6e4f01af3bca2227ad65f4a4848f92c5d1e0ec94..4362aee2995a0a02f670fd494a1c36b050166427 100644 (file)
@@ -1532,8 +1532,10 @@ WindowAttr(WindowObject *this, char *name)
     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("[sss]", "buffer", "cursor", "height");
+       return Py_BuildValue("[ssss]", "buffer", "cursor", "height", "vars");
     else
        return NULL;
 }
@@ -2495,8 +2497,10 @@ BufferAttr(BufferObject *this, char *name)
        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("[ss]", "name", "number");
+       return Py_BuildValue("[sss]", "name", "number", "vars");
     else
        return NULL;
 }
index 547df3accf24f0c64725da25c7d3bfe191c23500..6e1cb0c0f585e63071ee94ba72c654af5bda65f5 100644 (file)
@@ -1330,6 +1330,7 @@ PythonMod_Init(void)
 {
     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,6 +1354,12 @@ PythonMod_Init(void)
     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));
index fd05423c1a453c3f98eed3fb06ae95072b8dfa48..659316b41f8f8df4f8ad7863539c494d8d241d16 100644 (file)
@@ -1647,6 +1647,9 @@ Py3Init_vim(void)
     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); \
index b53b6bf391aff49af65da21535de56f170c7ecbe..fc61848e0a03bfa5ec4bfc83644a371ba3446481 100644 (file)
@@ -346,6 +346,19 @@ EOF
 :$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()
index 20b00d4d0bd3ff1be3e459ae8a58b68817835ce9..3bd2dcf25a56875e6f7539ece9fc309985a19867 100644 (file)
@@ -76,3 +76,7 @@ vim:  Vim(let):E859:
 [0, 1, 2, 3, 4, 5]
 [0, 1, 2, 3, 4, 5]
 [0, 1, 2, 3, 4, 5]
+Abc
+bac
+def
+bar
index 5115e5be7362289e00469cc00f44d2a326c5e8d6..bdde662f3846b7904e431aae1860862489879ffc 100644 (file)
@@ -315,6 +315,19 @@ EOF
 :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()
index 9d75c564e07fdc45ed00a5a95fe53d6aac1ef98d..ca74c1532181830c1c0e2df3f4339b50a3056d7a 100644 (file)
@@ -65,3 +65,7 @@ undefined_name:       Vim(let):Trace
 vim:   Vim(let):E861:
 [1]
 [1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
+Abc
+bac
+def
+bar
index 95cd857563d91794e91bc18ff366688f236e74a8..b2f5540e273250c0d3c7bc1ffb8f5c1ad21037d7 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    911,
 /**/
     910,
 /**/