# HG changeset patch
# User ZyX <kp-...@ya.ru>
# Date 1366478866 -14400
# Branch python-extended-2
# Node ID 10f7e8e41f8e23d30cf6f9f894f96d6fd4744e41
# Parent  3d61e036e5a6856a08e6e67bd9f372ebd79de15e
Add vim.vars, vim.vvars, buffer.vars, window.vars attributes

diff -r 3d61e036e5a6 -r 10f7e8e41f8e runtime/doc/if_pyth.txt
--- a/runtime/doc/if_pyth.txt   Sat Apr 20 20:51:52 2013 +0400
+++ b/runtime/doc/if_pyth.txt   Sat Apr 20 21:27:46 2013 +0400
@@ -237,6 +237,11 @@
        "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 @@
        :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 @@
                                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.
 
diff -r 3d61e036e5a6 -r 10f7e8e41f8e src/eval.c
--- a/src/eval.c        Sat Apr 20 20:51:52 2013 +0400
+++ b/src/eval.c        Sat Apr 20 21:27:46 2013 +0400
@@ -113,12 +113,6 @@
 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
 
 /*
@@ -370,12 +364,6 @@
 #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));
diff -r 3d61e036e5a6 -r 10f7e8e41f8e src/globals.h
--- a/src/globals.h     Sat Apr 20 20:51:52 2013 +0400
+++ b/src/globals.h     Sat Apr 20 21:27:46 2013 +0400
@@ -180,6 +180,10 @@
 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 dictitem_T      vimvars_var;        /* Variable used for v: */
+EXTERN dict_T  globvardict;                /* Dictionary with g: variables */
+EXTERN dictitem_T      globvars_var;       /* Variable used for g: */
 #endif
 EXTERN int     did_emsg;                   /* set by emsg() when the message
                                               is displayed or thrown */
diff -r 3d61e036e5a6 -r 10f7e8e41f8e src/if_py_both.h
--- a/src/if_py_both.h  Sat Apr 20 20:51:52 2013 +0400
+++ b/src/if_py_both.h  Sat Apr 20 21:27:46 2013 +0400
@@ -1531,8 +1531,10 @@
     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;
 }
@@ -2494,8 +2496,10 @@
        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;
 }
diff -r 3d61e036e5a6 -r 10f7e8e41f8e src/if_python.c
--- a/src/if_python.c   Sat Apr 20 20:51:52 2013 +0400
+++ b/src/if_python.c   Sat Apr 20 21:27:46 2013 +0400
@@ -1089,7 +1089,7 @@
 {
     PyObject *r;
 
-    if (CheckWindow((BufferObject *)(self)))
+    if (CheckWindow((WindowObject *)(self)))
        return NULL;
 
     r = BufferAttr((BufferObject *)(self), name);
@@ -1310,6 +1310,7 @@
 {
     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};
 
@@ -1333,6 +1334,12 @@
     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));
diff -r 3d61e036e5a6 -r 10f7e8e41f8e src/if_python3.c
--- a/src/if_python3.c  Sat Apr 20 20:51:52 2013 +0400
+++ b/src/if_python3.c  Sat Apr 20 21:27:46 2013 +0400
@@ -1647,6 +1647,9 @@
     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); \
diff -r 3d61e036e5a6 -r 10f7e8e41f8e src/testdir/test86.in
--- a/src/testdir/test86.in     Sat Apr 20 20:51:52 2013 +0400
+++ b/src/testdir/test86.in     Sat Apr 20 21:27:46 2013 +0400
@@ -346,6 +346,19 @@
 :$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()
diff -r 3d61e036e5a6 -r 10f7e8e41f8e src/testdir/test86.ok
--- a/src/testdir/test86.ok     Sat Apr 20 20:51:52 2013 +0400
+++ b/src/testdir/test86.ok     Sat Apr 20 21:27:46 2013 +0400
@@ -76,3 +76,7 @@
 [0, 1, 2, 3, 4, 5]
 [0, 1, 2, 3, 4, 5]
 [0, 1, 2, 3, 4, 5]
+Abc
+bac
+def
+bar
diff -r 3d61e036e5a6 -r 10f7e8e41f8e src/testdir/test87.in
--- a/src/testdir/test87.in     Sat Apr 20 20:51:52 2013 +0400
+++ b/src/testdir/test87.in     Sat Apr 20 21:27:46 2013 +0400
@@ -315,6 +315,19 @@
 :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()
diff -r 3d61e036e5a6 -r 10f7e8e41f8e src/testdir/test87.ok
--- a/src/testdir/test87.ok     Sat Apr 20 20:51:52 2013 +0400
+++ b/src/testdir/test87.ok     Sat Apr 20 21:27:46 2013 +0400
@@ -65,3 +65,7 @@
 vim:   Vim(let):E861:
 [1]
 [1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
+Abc
+bac
+def
+bar

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


diff -cr vim.3d61e036e5a6/runtime/doc/if_pyth.txt vim.10f7e8e41f8e/runtime/doc/if_pyth.txt
*** vim.3d61e036e5a6/runtime/doc/if_pyth.txt	2013-04-23 21:34:38.611446180 +0400
--- vim.10f7e8e41f8e/runtime/doc/if_pyth.txt	2013-04-23 21:34:38.635445473 +0400
***************
*** 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.
  
diff -cr vim.3d61e036e5a6/src/eval.c vim.10f7e8e41f8e/src/eval.c
*** vim.3d61e036e5a6/src/eval.c	2013-04-23 21:34:38.628445679 +0400
--- vim.10f7e8e41f8e/src/eval.c	2013-04-23 21:34:38.654444915 +0400
***************
*** 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,118 ----
***************
*** 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));
--- 364,369 ----
diff -cr vim.3d61e036e5a6/src/globals.h vim.10f7e8e41f8e/src/globals.h
*** vim.3d61e036e5a6/src/globals.h	2013-04-23 21:34:38.609446238 +0400
--- vim.10f7e8e41f8e/src/globals.h	2013-04-23 21:34:38.634445503 +0400
***************
*** 180,185 ****
--- 180,189 ----
  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 dictitem_T	vimvars_var;	    /* Variable used for v: */
+ EXTERN dict_T	globvardict;		    /* Dictionary with g: variables */
+ EXTERN dictitem_T	globvars_var;	    /* Variable used for g: */
  #endif
  EXTERN int	did_emsg;		    /* set by emsg() when the message
  					       is displayed or thrown */
diff -cr vim.3d61e036e5a6/src/if_py_both.h vim.10f7e8e41f8e/src/if_py_both.h
*** vim.3d61e036e5a6/src/if_py_both.h	2013-04-23 21:34:38.615446062 +0400
--- vim.10f7e8e41f8e/src/if_py_both.h	2013-04-23 21:34:38.641445297 +0400
***************
*** 1531,1538 ****
      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;
  }
--- 1531,1540 ----
      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;
  }
***************
*** 2494,2501 ****
  	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;
  }
--- 2496,2505 ----
  	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;
  }
diff -cr vim.3d61e036e5a6/src/if_python3.c vim.10f7e8e41f8e/src/if_python3.c
*** vim.3d61e036e5a6/src/if_python3.c	2013-04-23 21:34:38.630445621 +0400
--- vim.10f7e8e41f8e/src/if_python3.c	2013-04-23 21:34:38.656444856 +0400
***************
*** 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); \
diff -cr vim.3d61e036e5a6/src/if_python.c vim.10f7e8e41f8e/src/if_python.c
*** vim.3d61e036e5a6/src/if_python.c	2013-04-23 21:34:38.613446120 +0400
--- vim.10f7e8e41f8e/src/if_python.c	2013-04-23 21:34:38.638445386 +0400
***************
*** 1089,1095 ****
  {
      PyObject *r;
  
!     if (CheckWindow((BufferObject *)(self)))
  	return NULL;
  
      r = BufferAttr((BufferObject *)(self), name);
--- 1089,1095 ----
  {
      PyObject *r;
  
!     if (CheckWindow((WindowObject *)(self)))
  	return NULL;
  
      r = BufferAttr((BufferObject *)(self), name);
***************
*** 1310,1315 ****
--- 1310,1316 ----
  {
      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};
  
***************
*** 1333,1338 ****
--- 1334,1345 ----
      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));
diff -cr vim.3d61e036e5a6/src/testdir/test86.in vim.10f7e8e41f8e/src/testdir/test86.in
*** vim.3d61e036e5a6/src/testdir/test86.in	2013-04-23 21:34:38.616446032 +0400
--- vim.10f7e8e41f8e/src/testdir/test86.in	2013-04-23 21:34:38.642445268 +0400
***************
*** 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()
diff -cr vim.3d61e036e5a6/src/testdir/test86.ok vim.10f7e8e41f8e/src/testdir/test86.ok
*** vim.3d61e036e5a6/src/testdir/test86.ok	2013-04-23 21:34:38.616446032 +0400
--- vim.10f7e8e41f8e/src/testdir/test86.ok	2013-04-23 21:34:38.642445268 +0400
***************
*** 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
diff -cr vim.3d61e036e5a6/src/testdir/test87.in vim.10f7e8e41f8e/src/testdir/test87.in
*** vim.3d61e036e5a6/src/testdir/test87.in	2013-04-23 21:34:38.614446091 +0400
--- vim.10f7e8e41f8e/src/testdir/test87.in	2013-04-23 21:34:38.638445386 +0400
***************
*** 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()
diff -cr vim.3d61e036e5a6/src/testdir/test87.ok vim.10f7e8e41f8e/src/testdir/test87.ok
*** vim.3d61e036e5a6/src/testdir/test87.ok	2013-04-23 21:34:38.609446238 +0400
--- vim.10f7e8e41f8e/src/testdir/test87.ok	2013-04-23 21:34:38.634445503 +0400
***************
*** 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

Raspunde prin e-mail lui