Problem: Python: No {Buffer,TabPage,Window}.valid attributes.
Solution: Python patch 5: add .valid (ZyX)
DESTRUCTOR_FINISH(self);
}
+ static PyObject *
+TabPageAttrValid(TabPageObject *self, char *name)
+{
+ PyObject *r;
+
+ if (strcmp(name, "valid") != 0)
+ return NULL;
+
+ r = ((self->tab == INVALID_TABPAGE_VALUE) ? Py_False : Py_True);
+ Py_INCREF(r);
+ return r;
+}
+
static PyObject *
TabPageAttr(TabPageObject *self, char *name)
{
return firstwin;
}
+ static PyObject *
+WindowAttrValid(WindowObject *self, char *name)
+{
+ PyObject *r;
+
+ if (strcmp(name, "valid") != 0)
+ return NULL;
+
+ r = ((self->win == INVALID_WINDOW_VALUE) ? Py_False : Py_True);
+ Py_INCREF(r);
+ return r;
+}
+
static PyObject *
WindowAttr(WindowObject *self, char *name)
{
return (PyObject *)(self->tabObject);
}
else if (strcmp(name,"__members__") == 0)
- return Py_BuildValue("[sssssssss]", "buffer", "cursor", "height",
- "vars", "options", "number", "row", "col", "tabpage");
+ return Py_BuildValue("[ssssssssss]", "buffer", "cursor", "height",
+ "vars", "options", "number", "row", "col", "tabpage", "valid");
else
return NULL;
}
return RBSlice(self, lo, hi, 1, -1);
}
+ static PyObject *
+BufferAttrValid(BufferObject *self, char *name)
+{
+ PyObject *r;
+
+ if (strcmp(name, "valid") != 0)
+ return NULL;
+
+ r = ((self->buf == INVALID_BUFFER_VALUE) ? Py_False : Py_True);
+ Py_INCREF(r);
+ return r;
+}
+
static PyObject *
BufferAttr(BufferObject *self, char *name)
{
return OptionsNew(SREQ_BUF, self->buf, (checkfun) CheckBuffer,
(PyObject *) self);
else if (strcmp(name,"__members__") == 0)
- return Py_BuildValue("[ssss]", "name", "number", "vars", "options");
+ return Py_BuildValue("[sssss]", "name", "number", "vars", "options",
+ "valid");
else
return NULL;
}
{
PyObject *r;
+ if ((r = BufferAttrValid((BufferObject *)(self), name)))
+ return r;
+
if (CheckBuffer((BufferObject *)(self)))
return NULL;
{
PyObject *r;
+ if ((r = TabPageAttrValid((TabPageObject *)(self), name)))
+ return r;
+
if (CheckTabPage((TabPageObject *)(self)))
return NULL;
{
PyObject *r;
+ if ((r = WindowAttrValid((WindowObject *)(self), name)))
+ return r;
+
if (CheckWindow((WindowObject *)(self)))
return NULL;
*/
static PyObject *
-BufferGetattro(PyObject *self, PyObject*nameobj)
+BufferGetattro(PyObject *self, PyObject *nameobj)
{
PyObject *r;
GET_ATTR_STRING(name, nameobj);
+ if ((r = BufferAttrValid((BufferObject *)(self), name)))
+ return r;
+
if (CheckBuffer((BufferObject *)(self)))
return NULL;
static PyObject *
BufferDir(PyObject *self UNUSED)
{
- return Py_BuildValue("[sssss]", "name", "number",
- "append", "mark", "range");
+ return Py_BuildValue("[ssssssss]",
+ "name", "number", "vars", "options", "valid",
+ "append", "mark", "range");
}
/******************/
GET_ATTR_STRING(name, nameobj);
+ if ((r = TabPageAttrValid((TabPageObject *)(self), name)))
+ return r;
+
if (CheckTabPage((TabPageObject *)(self)))
return NULL;
GET_ATTR_STRING(name, nameobj);
+ if ((r = WindowAttrValid((WindowObject *)(self), name)))
+ return r;
+
if (CheckWindow((WindowObject *)(self)))
return NULL;
if _b is not cb:
vim.command('bwipeout! ' + str(_b.number))
del _b
+cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid)))
for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")', 'b.name = "!"'):
try:
exec(expr)
cb.append('Current window: ' + repr(vim.current.window))
cb.append('Current buffer: ' + repr(vim.current.buffer))
cb.append('Current line: ' + repr(vim.current.line))
+ws = list(vim.windows)
+ts = list(vim.tabpages)
for b in vim.buffers:
if b is not cb:
vim.command('bwipeout! ' + str(b.number))
+cb.append('w.valid: ' + repr([w.valid for w in ws]))
+cb.append('t.valid: ' + repr([t.valid for t in ts]))
EOF
:tabonly!
:only!
1:BufFilePre:1
7:BufFilePost:1
testdir/test86.in
+valid: b:False, cb:True
i:<buffer test86.in>
i2:<buffer test86.in>
i:<buffer a>
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
- <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (36, 0)
+ <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (37, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
Current window: <window 0>
Current buffer: <buffer test86.in>
Current line: 'Type error at assigning None to vim.current.buffer'
+w.valid: [True, False]
+t.valid: [True, False, True, False]
vim.vars:Dictionary:True
vim.options:Options:True
vim.bindeval("{}"):Dictionary:True
if _b is not cb:
vim.command('bwipeout! ' + str(_b.number))
del _b
+cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid)))
for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
try:
exec(expr)
cb.append('Current window: ' + repr(vim.current.window))
cb.append('Current buffer: ' + repr(vim.current.buffer))
cb.append('Current line: ' + repr(vim.current.line))
+ws = list(vim.windows)
+ts = list(vim.tabpages)
for b in vim.buffers:
if b is not cb:
vim.command('bwipeout! ' + str(b.number))
+cb.append('w.valid: ' + repr([w.valid for w in ws]))
+cb.append('t.valid: ' + repr([t.valid for t in ts]))
EOF
:tabonly!
:only!
1:BufFilePre:1
7:BufFilePost:1
testdir/test87.in
+valid: b:False, cb:True
i:<buffer test87.in>
i2:<buffer test87.in>
i:<buffer a>
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
- <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (36, 0)
+ <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (37, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
Current window: <window 0>
Current buffer: <buffer test87.in>
Current line: 'Type error at assigning None to vim.current.buffer'
+w.valid: [True, False]
+t.valid: [True, False, True, False]
vim.vars:Dictionary:True
vim.options:Options:True
vim.bindeval("{}"):Dictionary:True
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1044,
/**/
1043,
/**/