1
0
forked from aniani/vim

updated for version 7.3.952

Problem:    Python: It's not easy to change window/buffer/tabpage.
Solution:   Add ability to assign to vim.current.{tabpage,buffer,window}.
            (ZyX)
This commit is contained in:
Bram Moolenaar 2013-05-15 15:51:08 +02:00
parent 8661b17843
commit e761459eb6
3 changed files with 95 additions and 3 deletions

View File

@ -242,9 +242,9 @@ vim.current *python-current*
An object providing access (via specific attributes) to various
"current" objects available in vim:
vim.current.line The current line (RW) String
vim.current.buffer The current buffer (RO) Buffer
vim.current.window The current window (RO) Window
vim.current.tabpage The current tab page (RO) TabPage
vim.current.buffer The current buffer (RW) Buffer
vim.current.window The current window (RW) Window
vim.current.tabpage The current tab page (RW) TabPage
vim.current.range The current line range (RO) Range
The last case deserves a little explanation. When the :python or
@ -252,6 +252,22 @@ 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.
Note: When assigning to vim.current.{buffer,window,tabpage} it expects
valid |python-buffer|, |python-window| or |python-tabpage| objects
respectively. Assigning triggers normal (with |autocommand|s)
switching to given buffer, window or tab page. It is the only way to
switch UI objects in python: you can't assign to
|python-tabpage|.window attribute. To switch without triggering
autocommands use >
py << EOF
saved_eventignore = vim.options['eventignore']
vim.options['eventignore'] = 'all'
try:
vim.current.buffer = vim.buffers[2] # Switch to buffer 2
finally:
vim.options['eventignore'] = saved_eventignore
EOF
<
vim.vars *python-vars*
vim.vvars *python-vvars*
Dictionary-like objects holding dictionaries with global (|g:|) and

View File

@ -3244,6 +3244,80 @@ CurrentSetattr(PyObject *self UNUSED, char *name, PyObject *value)
return 0;
}
else if (strcmp(name, "buffer") == 0)
{
int count;
if (value->ob_type != &BufferType)
{
PyErr_SetString(PyExc_TypeError, _("expected vim.buffer object"));
return -1;
}
if (CheckBuffer((BufferObject *)(value)))
return -1;
count = ((BufferObject *)(value))->buf->b_fnum;
if (do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, count, 0) == FAIL)
{
PyErr_SetVim(_("failed to switch to given buffer"));
return -1;
}
return 0;
}
else if (strcmp(name, "window") == 0)
{
int count;
if (value->ob_type != &WindowType)
{
PyErr_SetString(PyExc_TypeError, _("expected vim.window object"));
return -1;
}
if (CheckWindow((WindowObject *)(value)))
return -1;
count = get_win_number(((WindowObject *)(value))->win, firstwin);
if (!count)
{
PyErr_SetString(PyExc_ValueError,
_("failed to find window in the current tab page"));
return -1;
}
win_goto(((WindowObject *)(value))->win);
if (((WindowObject *)(value))->win != curwin)
{
PyErr_SetString(PyExc_RuntimeError,
_("did not switch to the specified window"));
return -1;
}
return 0;
}
else if (strcmp(name, "tabpage") == 0)
{
if (value->ob_type != &TabPageType)
{
PyErr_SetString(PyExc_TypeError, _("expected vim.tabpage object"));
return -1;
}
if (CheckTabPage((TabPageObject *)(value)))
return -1;
goto_tabpage_tp(((TabPageObject *)(value))->tab, TRUE, TRUE);
if (((TabPageObject *)(value))->tab != curtab)
{
PyErr_SetString(PyExc_RuntimeError,
_("did not switch to the specified tab page"));
return -1;
}
return 0;
}
else
{
PyErr_SetString(PyExc_AttributeError, name);

View File

@ -728,6 +728,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
952,
/**/
951,
/**/