vim/7.3.911
2013-05-08 17:06:40 +02:00

344 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

To: vim_dev@googlegroups.com
Subject: Patch 7.3.911
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
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 cant 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 ///