mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
updated for version 7.3.911
Problem: Python: Access to Vim variables is not so easy. Solution: Define vim.vars and vim.vvars. (ZyX)
This commit is contained in:
@@ -237,6 +237,11 @@ vim.current *python-current*
|
|||||||
"current range". A range is a bit like a buffer, but with all access
|
"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.
|
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*
|
Output from Python *python-output*
|
||||||
Vim displays all Python code output in the Vim message area. Normal
|
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 n = len(b) # number of lines
|
||||||
:py (row,col) = b.mark('a') # named mark
|
:py (row,col) = b.mark('a') # named mark
|
||||||
:py r = b.range(1,5) # a sub-range of the buffer
|
: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*
|
4. Range objects *python-range*
|
||||||
@@ -354,6 +360,9 @@ Window attributes are:
|
|||||||
This is a tuple, (row,col).
|
This is a tuple, (row,col).
|
||||||
height (read-write) The window height, in rows
|
height (read-write) The window height, in rows
|
||||||
width (read-write) The window width, in columns
|
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 height attribute is writable only if the screen is split horizontally.
|
||||||
The width attribute is writable only if the screen is split vertically.
|
The width attribute is writable only if the screen is split vertically.
|
||||||
|
|
||||||
|
14
src/eval.c
14
src/eval.c
@@ -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_nofunc = N_("E130: Unknown function: %s");
|
||||||
static char *e_illvar = N_("E461: Illegal variable name: %s");
|
static char *e_illvar = N_("E461: Illegal variable name: %s");
|
||||||
|
|
||||||
/*
|
static dictitem_T globvars_var; /* variable used for g: */
|
||||||
* 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
|
#define globvarht globvardict.dv_hashtab
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -370,12 +365,7 @@ static struct vimvar
|
|||||||
#define vv_list vv_di.di_tv.vval.v_list
|
#define vv_list vv_di.di_tv.vval.v_list
|
||||||
#define vv_tv vv_di.di_tv
|
#define vv_tv vv_di.di_tv
|
||||||
|
|
||||||
/*
|
static dictitem_T vimvars_var; /* variable used for v: */
|
||||||
* 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
|
#define vimvarht vimvardict.dv_hashtab
|
||||||
|
|
||||||
static void prepare_vimvar __ARGS((int idx, typval_T *save_tv));
|
static void prepare_vimvar __ARGS((int idx, typval_T *save_tv));
|
||||||
|
@@ -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
|
EXTERN int emsg_severe INIT(= FALSE); /* use message of next of several
|
||||||
emsg() calls for throw */
|
emsg() calls for throw */
|
||||||
EXTERN int did_endif INIT(= FALSE); /* just had ":endif" */
|
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
|
#endif
|
||||||
EXTERN int did_emsg; /* set by emsg() when the message
|
EXTERN int did_emsg; /* set by emsg() when the message
|
||||||
is displayed or thrown */
|
is displayed or thrown */
|
||||||
|
@@ -1532,8 +1532,10 @@ WindowAttr(WindowObject *this, char *name)
|
|||||||
else if (strcmp(name, "width") == 0)
|
else if (strcmp(name, "width") == 0)
|
||||||
return Py_BuildValue("l", (long)(W_WIDTH(this->win)));
|
return Py_BuildValue("l", (long)(W_WIDTH(this->win)));
|
||||||
#endif
|
#endif
|
||||||
|
else if (strcmp(name, "vars") == 0)
|
||||||
|
return DictionaryNew(this->win->w_vars);
|
||||||
else if (strcmp(name,"__members__") == 0)
|
else if (strcmp(name,"__members__") == 0)
|
||||||
return Py_BuildValue("[sss]", "buffer", "cursor", "height");
|
return Py_BuildValue("[ssss]", "buffer", "cursor", "height", "vars");
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -2495,8 +2497,10 @@ BufferAttr(BufferObject *this, char *name)
|
|||||||
return Py_BuildValue("s", this->buf->b_ffname);
|
return Py_BuildValue("s", this->buf->b_ffname);
|
||||||
else if (strcmp(name, "number") == 0)
|
else if (strcmp(name, "number") == 0)
|
||||||
return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum);
|
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)
|
else if (strcmp(name,"__members__") == 0)
|
||||||
return Py_BuildValue("[ss]", "name", "number");
|
return Py_BuildValue("[sss]", "name", "number", "vars");
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@@ -1330,6 +1330,7 @@ PythonMod_Init(void)
|
|||||||
{
|
{
|
||||||
PyObject *mod;
|
PyObject *mod;
|
||||||
PyObject *dict;
|
PyObject *dict;
|
||||||
|
PyObject *tmp;
|
||||||
/* The special value is removed from sys.path in Python_Init(). */
|
/* The special value is removed from sys.path in Python_Init(). */
|
||||||
static char *(argv[2]) = {"/must>not&exist/foo", NULL};
|
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, "buffers", (PyObject *)(void *)&TheBufferList);
|
||||||
PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent);
|
PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent);
|
||||||
PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList);
|
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_LOCKED", PyInt_FromLong(VAR_LOCKED));
|
||||||
PyDict_SetItemString(dict, "VAR_FIXED", PyInt_FromLong(VAR_FIXED));
|
PyDict_SetItemString(dict, "VAR_FIXED", PyInt_FromLong(VAR_FIXED));
|
||||||
PyDict_SetItemString(dict, "VAR_SCOPE", PyInt_FromLong(VAR_SCOPE));
|
PyDict_SetItemString(dict, "VAR_SCOPE", PyInt_FromLong(VAR_SCOPE));
|
||||||
|
@@ -1647,6 +1647,9 @@ Py3Init_vim(void)
|
|||||||
Py_INCREF((PyObject *)(void *)&TheWindowList);
|
Py_INCREF((PyObject *)(void *)&TheWindowList);
|
||||||
PyModule_AddObject(mod, "windows", (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) \
|
#define ADD_INT_CONSTANT(name, value) \
|
||||||
tmp = PyLong_FromLong(value); \
|
tmp = PyLong_FromLong(value); \
|
||||||
Py_INCREF(tmp); \
|
Py_INCREF(tmp); \
|
||||||
|
@@ -346,6 +346,19 @@ EOF
|
|||||||
:$put =string(pyeval('l'))
|
:$put =string(pyeval('l'))
|
||||||
:py l = ll[-10:10]
|
:py l = ll[-10:10]
|
||||||
:$put =string(pyeval('l'))
|
:$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
|
:endfun
|
||||||
:"
|
:"
|
||||||
:call Test()
|
:call Test()
|
||||||
|
@@ -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]
|
[0, 1, 2, 3, 4, 5]
|
||||||
[0, 1, 2, 3, 4, 5]
|
[0, 1, 2, 3, 4, 5]
|
||||||
|
Abc
|
||||||
|
bac
|
||||||
|
def
|
||||||
|
bar
|
||||||
|
@@ -315,6 +315,19 @@ EOF
|
|||||||
:py3 trace_main()
|
:py3 trace_main()
|
||||||
:py3 sys.settrace(None)
|
:py3 sys.settrace(None)
|
||||||
:$put =string(l)
|
:$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
|
:endfun
|
||||||
:"
|
:"
|
||||||
:call Test()
|
:call Test()
|
||||||
|
@@ -65,3 +65,7 @@ undefined_name: Vim(let):Trace
|
|||||||
vim: Vim(let):E861:
|
vim: Vim(let):E861:
|
||||||
[1]
|
[1]
|
||||||
[1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
|
[1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
|
||||||
|
Abc
|
||||||
|
bac
|
||||||
|
def
|
||||||
|
bar
|
||||||
|
@@ -728,6 +728,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
911,
|
||||||
/**/
|
/**/
|
||||||
910,
|
910,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user