0
0
mirror of https://github.com/vim/vim.git synced 2025-08-27 20:13:38 -04:00

updated for version 7.3.1042

Problem:    Python: can't assign to vim.Buffer.name.
Solution:   Python patch 3. (ZyX)
This commit is contained in:
Bram Moolenaar 2013-05-29 22:02:22 +02:00
parent 1bc2428e1f
commit e9ba516be2
11 changed files with 263 additions and 153 deletions

View File

@ -250,7 +250,7 @@ vim.windows *python-windows*
object and always use windows from that tab page (or throw vim.error object and always use windows from that tab page (or throw vim.error
in case tab page was deleted). You can keep a reference to both in case tab page was deleted). You can keep a reference to both
without keeping a reference to vim module object or |python-tabpage|, without keeping a reference to vim module object or |python-tabpage|,
they will not loose their properties in this case. they will not lose their properties in this case.
vim.tabpages *python-tabpages* vim.tabpages *python-tabpages*
A sequence object providing access to the list of vim tab pages. The A sequence object providing access to the list of vim tab pages. The
@ -361,6 +361,11 @@ The buffer object attributes are:
this object will raise KeyError. If option is this object will raise KeyError. If option is
|global-local| and local value is missing getting it |global-local| and local value is missing getting it
will return None. will return None.
b.name String, RW. Contains buffer name (full path).
Note: when assigning to b.name |BufFilePre| and
|BufFilePost| autocommands are launched.
b.number Buffer number. Can be used as |python-buffers| key.
Read-only.
The buffer object methods are: The buffer object methods are:
b.append(str) Append a line to the buffer b.append(str) Append a line to the buffer

View File

@ -784,6 +784,7 @@ do_move(line1, line2, dest)
*/ */
last_line = curbuf->b_ml.ml_line_count; last_line = curbuf->b_ml.ml_line_count;
mark_adjust(line1, line2, last_line - line2, 0L); mark_adjust(line1, line2, last_line - line2, 0L);
changed_lines(last_line - num_lines + 1, 0, last_line + 1, num_lines);
if (dest >= line2) if (dest >= line2)
{ {
mark_adjust(line2 + 1, dest, -num_lines, 0L); mark_adjust(line2 + 1, dest, -num_lines, 0L);
@ -799,6 +800,7 @@ do_move(line1, line2, dest)
curbuf->b_op_start.col = curbuf->b_op_end.col = 0; curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
mark_adjust(last_line - num_lines + 1, last_line, mark_adjust(last_line - num_lines + 1, last_line,
-(last_line - dest - extra), 0L); -(last_line - dest - extra), 0L);
changed_lines(last_line - num_lines + 1, 0, last_line + 1, -extra);
/* /*
* Now we delete the original text -- webb * Now we delete the original text -- webb
@ -2414,6 +2416,58 @@ print_line(lnum, use_number, list)
info_message = FALSE; info_message = FALSE;
} }
int
rename_buffer(new_fname)
char_u *new_fname;
{
char_u *fname, *sfname, *xfname;
#ifdef FEAT_AUTOCMD
buf_T *buf = curbuf;
apply_autocmds(EVENT_BUFFILEPRE, NULL, NULL, FALSE, buf);
/* buffer changed, don't change name now */
if (buf != curbuf)
return FAIL;
# ifdef FEAT_EVAL
if (aborting()) /* autocmds may abort script processing */
return FAIL;
# endif
#endif
/*
* The name of the current buffer will be changed.
* A new (unlisted) buffer entry needs to be made to hold the old file
* name, which will become the alternate file name.
* But don't set the alternate file name if the buffer didn't have a
* name.
*/
fname = buf->b_ffname;
sfname = buf->b_sfname;
xfname = buf->b_fname;
buf->b_ffname = NULL;
buf->b_sfname = NULL;
if (setfname(buf, new_fname, NULL, TRUE) == FAIL)
{
buf->b_ffname = fname;
buf->b_sfname = sfname;
return FAIL;
}
buf->b_flags |= BF_NOTEDITED;
if (xfname != NULL && *xfname != NUL)
{
buf = buflist_new(fname, xfname, curwin->w_cursor.lnum, 0);
if (buf != NULL && !cmdmod.keepalt)
curwin->w_alt_fnum = buf->b_fnum;
}
vim_free(fname);
vim_free(sfname);
#ifdef FEAT_AUTOCMD
apply_autocmds(EVENT_BUFFILEPOST, NULL, NULL, FALSE, buf);
#endif
/* Change directories when the 'acd' option is set. */
DO_AUTOCHDIR
return OK;
}
/* /*
* ":file[!] [fname]". * ":file[!] [fname]".
*/ */
@ -2421,9 +2475,6 @@ print_line(lnum, use_number, list)
ex_file(eap) ex_file(eap)
exarg_T *eap; exarg_T *eap;
{ {
char_u *fname, *sfname, *xfname;
buf_T *buf;
/* ":0file" removes the file name. Check for illegal uses ":3file", /* ":0file" removes the file name. Check for illegal uses ":3file",
* "0file name", etc. */ * "0file name", etc. */
if (eap->addr_count > 0 if (eap->addr_count > 0
@ -2437,49 +2488,8 @@ ex_file(eap)
if (*eap->arg != NUL || eap->addr_count == 1) if (*eap->arg != NUL || eap->addr_count == 1)
{ {
#ifdef FEAT_AUTOCMD if (rename_buffer(eap->arg) == FAIL)
buf = curbuf;
apply_autocmds(EVENT_BUFFILEPRE, NULL, NULL, FALSE, curbuf);
/* buffer changed, don't change name now */
if (buf != curbuf)
return; return;
# ifdef FEAT_EVAL
if (aborting()) /* autocmds may abort script processing */
return;
# endif
#endif
/*
* The name of the current buffer will be changed.
* A new (unlisted) buffer entry needs to be made to hold the old file
* name, which will become the alternate file name.
* But don't set the alternate file name if the buffer didn't have a
* name.
*/
fname = curbuf->b_ffname;
sfname = curbuf->b_sfname;
xfname = curbuf->b_fname;
curbuf->b_ffname = NULL;
curbuf->b_sfname = NULL;
if (setfname(curbuf, eap->arg, NULL, TRUE) == FAIL)
{
curbuf->b_ffname = fname;
curbuf->b_sfname = sfname;
return;
}
curbuf->b_flags |= BF_NOTEDITED;
if (xfname != NULL && *xfname != NUL)
{
buf = buflist_new(fname, xfname, curwin->w_cursor.lnum, 0);
if (buf != NULL && !cmdmod.keepalt)
curwin->w_alt_fnum = buf->b_fnum;
}
vim_free(fname);
vim_free(sfname);
#ifdef FEAT_AUTOCMD
apply_autocmds(EVENT_BUFFILEPOST, NULL, NULL, FALSE, curbuf);
#endif
/* Change directories when the 'acd' option is set. */
DO_AUTOCHDIR
} }
/* print full file name if :cd used */ /* print full file name if :cd used */
fileinfo(FALSE, FALSE, eap->forceit); fileinfo(FALSE, FALSE, eap->forceit);

View File

@ -30,6 +30,14 @@ typedef int Py_ssize_t; /* Python 2.4 and earlier don't have this type. */
#define INVALID_WINDOW_VALUE ((win_T *)(-1)) #define INVALID_WINDOW_VALUE ((win_T *)(-1))
#define INVALID_TABPAGE_VALUE ((tabpage_T *)(-1)) #define INVALID_TABPAGE_VALUE ((tabpage_T *)(-1))
#define DICTKEY_DECL \
PyObject *dictkey_todecref;
#define DICTKEY_GET(err) \
if (!(key = StringToChars(keyObject, &dictkey_todecref))) \
return err;
#define DICTKEY_UNREF \
Py_XDECREF(dictkey_todecref);
typedef void (*rangeinitializer)(void *); typedef void (*rangeinitializer)(void *);
typedef void (*runner)(const char *, void * typedef void (*runner)(const char *, void *
#ifdef PY_CAN_RECURSE #ifdef PY_CAN_RECURSE
@ -64,6 +72,51 @@ Python_Release_Vim(void)
{ {
} }
/*
* The "todecref" argument holds a pointer to PyObject * that must be
* DECREF'ed after returned char_u * is no longer needed or NULL if all what
* was needed to generate returned value is object.
*
* Use Py_XDECREF to decrement reference count.
*/
static char_u *
StringToChars(PyObject *object, PyObject **todecref)
{
char_u *p;
PyObject *bytes = NULL;
if (PyBytes_Check(object))
{
if (PyString_AsStringAndSize(object, (char **) &p, NULL) == -1)
return NULL;
if (p == NULL)
return NULL;
*todecref = NULL;
}
else if (PyUnicode_Check(object))
{
bytes = PyUnicode_AsEncodedString(object, (char *)ENC_OPT, NULL);
if (bytes == NULL)
return NULL;
if(PyString_AsStringAndSize(bytes, (char **) &p, NULL) == -1)
return NULL;
if (p == NULL)
return NULL;
*todecref = bytes;
}
else
{
PyErr_SetString(PyExc_TypeError, _("object must be string"));
return NULL;
}
return (char_u *) p;
}
/* Output buffer management /* Output buffer management
*/ */
@ -1586,6 +1639,18 @@ set_option_value_for(key, numval, stringval, opt_flags, opt_type, from)
return VimTryEnd(); return VimTryEnd();
} }
static void *
py_memsave(void *p, size_t len)
{
void *r;
if (!(r = PyMem_Malloc(len)))
return NULL;
mch_memmove(r, p, len);
return r;
}
#define PY_STRSAVE(s) ((char_u *) py_memsave(s, STRLEN(s) + 1))
static int static int
OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject) OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
{ {
@ -1670,57 +1735,16 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
else else
{ {
char_u *val; char_u *val;
if (PyBytes_Check(valObject)) PyObject *todecref;
if ((val = StringToChars(valObject, &todecref)))
{ {
r = set_option_value_for(key, 0, val, opt_flags,
if (PyString_AsStringAndSize(valObject, (char **) &val, NULL) == -1) self->opt_type, self->from);
{ Py_XDECREF(todecref);
DICTKEY_UNREF
return -1;
}
if (val == NULL)
{
DICTKEY_UNREF
return -1;
}
val = vim_strsave(val);
}
else if (PyUnicode_Check(valObject))
{
PyObject *bytes;
bytes = PyUnicode_AsEncodedString(valObject, (char *)ENC_OPT, NULL);
if (bytes == NULL)
{
DICTKEY_UNREF
return -1;
}
if(PyString_AsStringAndSize(bytes, (char **) &val, NULL) == -1)
{
DICTKEY_UNREF
return -1;
}
if (val == NULL)
{
DICTKEY_UNREF
return -1;
}
val = vim_strsave(val);
Py_XDECREF(bytes);
} }
else else
{ r = -1;
PyErr_SetString(PyExc_TypeError, _("object must be string"));
DICTKEY_UNREF
return -1;
}
r = set_option_value_for(key, 0, val, opt_flags,
self->opt_type, self->from);
vim_free(val);
} }
DICTKEY_UNREF DICTKEY_UNREF
@ -2541,7 +2565,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, PyInt *len_cha
array = NULL; array = NULL;
else else
{ {
array = (char **)alloc((unsigned)(new_len * sizeof(char *))); array = PyMem_New(char *, new_len);
if (array == NULL) if (array == NULL)
{ {
PyErr_NoMemory(); PyErr_NoMemory();
@ -2558,7 +2582,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, PyInt *len_cha
{ {
while (i) while (i)
vim_free(array[--i]); vim_free(array[--i]);
vim_free(array); PyMem_Free(array);
return FAIL; return FAIL;
} }
} }
@ -2635,7 +2659,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, PyInt *len_cha
* been dealt with (either freed, or the responsibility passed * been dealt with (either freed, or the responsibility passed
* to vim. * to vim.
*/ */
vim_free(array); PyMem_Free(array);
/* Adjust marks. Invalidate any which lie in the /* Adjust marks. Invalidate any which lie in the
* changed range, and move any in the remainder of the buffer. * changed range, and move any in the remainder of the buffer.
@ -2717,7 +2741,7 @@ InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
char **array; char **array;
buf_T *savebuf; buf_T *savebuf;
array = (char **)alloc((unsigned)(size * sizeof(char *))); array = PyMem_New(char *, size);
if (array == NULL) if (array == NULL)
{ {
PyErr_NoMemory(); PyErr_NoMemory();
@ -2733,7 +2757,7 @@ InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
{ {
while (i) while (i)
vim_free(array[--i]); vim_free(array[--i]);
vim_free(array); PyMem_Free(array);
return FAIL; return FAIL;
} }
} }
@ -2768,7 +2792,7 @@ InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
/* Free the array of lines. All of its contents have now /* Free the array of lines. All of its contents have now
* been freed. * been freed.
*/ */
vim_free(array); PyMem_Free(array);
restore_buffer(savebuf); restore_buffer(savebuf);
update_screen(VALID); update_screen(VALID);
@ -3179,6 +3203,45 @@ BufferAttr(BufferObject *self, char *name)
return NULL; return NULL;
} }
static int
BufferSetattr(BufferObject *self, char *name, PyObject *valObject)
{
if (CheckBuffer(self))
return -1;
if (strcmp(name, "name") == 0)
{
char_u *val;
aco_save_T aco;
int r;
PyObject *todecref;
if (!(val = StringToChars(valObject, &todecref)))
return -1;
VimTryStart();
/* Using aucmd_*: autocommands will be executed by rename_buffer */
aucmd_prepbuf(&aco, self->buf);
r = rename_buffer(val);
aucmd_restbuf(&aco);
Py_XDECREF(todecref);
if (VimTryEnd())
return -1;
if (r == FAIL)
{
PyErr_SetVim(_("failed to rename buffer"));
return -1;
}
return 0;
}
else
{
PyErr_SetString(PyExc_AttributeError, name);
return -1;
}
}
static PyObject * static PyObject *
BufferAppend(BufferObject *self, PyObject *args) BufferAppend(BufferObject *self, PyObject *args)
{ {
@ -4040,7 +4103,7 @@ _ConvertFromPyObject(PyObject *obj, typval_T *tv, PyObject *lookupDict)
if (result == NULL) if (result == NULL)
return -1; return -1;
if (set_string_copy(result, tv) == -1) if (set_string_copy(result, tv))
{ {
Py_XDECREF(bytes); Py_XDECREF(bytes);
return -1; return -1;
@ -4169,11 +4232,13 @@ init_structs(void)
BufferType.tp_methods = BufferMethods; BufferType.tp_methods = BufferMethods;
#if PY_MAJOR_VERSION >= 3 #if PY_MAJOR_VERSION >= 3
BufferType.tp_getattro = (getattrofunc)BufferGetattro; BufferType.tp_getattro = (getattrofunc)BufferGetattro;
BufferType.tp_setattro = (setattrofunc)BufferSetattro;
BufferType.tp_alloc = call_PyType_GenericAlloc; BufferType.tp_alloc = call_PyType_GenericAlloc;
BufferType.tp_new = call_PyType_GenericNew; BufferType.tp_new = call_PyType_GenericNew;
BufferType.tp_free = call_PyObject_Free; BufferType.tp_free = call_PyObject_Free;
#else #else
BufferType.tp_getattr = (getattrfunc)BufferGetattr; BufferType.tp_getattr = (getattrfunc)BufferGetattr;
BufferType.tp_setattr = (setattrfunc)BufferSetattr;
#endif #endif
vim_memset(&WindowType, 0, sizeof(WindowType)); vim_memset(&WindowType, 0, sizeof(WindowType));

View File

@ -676,18 +676,6 @@ get_exceptions(void)
static int initialised = 0; static int initialised = 0;
#define PYINITIALISED initialised #define PYINITIALISED initialised
#define DICTKEY_GET(err) \
if (!PyString_Check(keyObject)) \
{ \
PyErr_SetString(PyExc_TypeError, _("only string keys are allowed")); \
return err; \
} \
if (PyString_AsStringAndSize(keyObject, (char **) &key, NULL) == -1) \
return err;
#define DICTKEY_UNREF
#define DICTKEY_DECL
#define DESTRUCTOR_FINISH(self) self->ob_type->tp_free((PyObject*)self); #define DESTRUCTOR_FINISH(self) self->ob_type->tp_free((PyObject*)self);
#define WIN_PYTHON_REF(win) win->w_python_ref #define WIN_PYTHON_REF(win) win->w_python_ref
@ -926,7 +914,7 @@ DoPyCommand(const char *cmd, rangeinitializer init_range, runner run, void *arg)
else else
{ {
/* Need to make a copy, value may change when setting new locale. */ /* Need to make a copy, value may change when setting new locale. */
saved_locale = (char *)vim_strsave((char_u *)saved_locale); saved_locale = (char *) PY_STRSAVE(saved_locale);
(void)setlocale(LC_NUMERIC, "C"); (void)setlocale(LC_NUMERIC, "C");
} }
#endif #endif
@ -953,7 +941,7 @@ DoPyCommand(const char *cmd, rangeinitializer init_range, runner run, void *arg)
if (saved_locale != NULL) if (saved_locale != NULL)
{ {
(void)setlocale(LC_NUMERIC, saved_locale); (void)setlocale(LC_NUMERIC, saved_locale);
vim_free(saved_locale); PyMem_Free(saved_locale);
} }
#endif #endif

View File

@ -638,32 +638,6 @@ static int py3initialised = 0;
#define PYINITIALISED py3initialised #define PYINITIALISED py3initialised
#define DICTKEY_DECL PyObject *bytes = NULL;
#define DICTKEY_GET(err) \
if (PyBytes_Check(keyObject)) \
{ \
if (PyString_AsStringAndSize(keyObject, (char **) &key, NULL) == -1) \
return err; \
} \
else if (PyUnicode_Check(keyObject)) \
{ \
bytes = PyString_AsBytes(keyObject); \
if (bytes == NULL) \
return err; \
if (PyString_AsStringAndSize(bytes, (char **) &key, NULL) == -1) \
return err; \
} \
else \
{ \
PyErr_SetString(PyExc_TypeError, _("only string keys are allowed")); \
return err; \
}
#define DICTKEY_UNREF \
if (bytes != NULL) \
Py_XDECREF(bytes);
#define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self) #define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self)
#define WIN_PYTHON_REF(win) win->w_python3_ref #define WIN_PYTHON_REF(win) win->w_python3_ref
@ -696,6 +670,7 @@ static PyObject *BufferDir(PyObject *);
static PyObject *OutputGetattro(PyObject *, PyObject *); static PyObject *OutputGetattro(PyObject *, PyObject *);
static int OutputSetattro(PyObject *, PyObject *, PyObject *); static int OutputSetattro(PyObject *, PyObject *, PyObject *);
static PyObject *BufferGetattro(PyObject *, PyObject *); static PyObject *BufferGetattro(PyObject *, PyObject *);
static int BufferSetattro(PyObject *, PyObject *, PyObject *);
static PyObject *TabPageGetattro(PyObject *, PyObject *); static PyObject *TabPageGetattro(PyObject *, PyObject *);
static PyObject *WindowGetattro(PyObject *, PyObject *); static PyObject *WindowGetattro(PyObject *, PyObject *);
static int WindowSetattro(PyObject *, PyObject *, PyObject *); static int WindowSetattro(PyObject *, PyObject *, PyObject *);
@ -1108,6 +1083,14 @@ BufferGetattro(PyObject *self, PyObject*nameobj)
return PyObject_GenericGetAttr(self, nameobj); return PyObject_GenericGetAttr(self, nameobj);
} }
static int
BufferSetattro(PyObject *self, PyObject *nameobj, PyObject *val)
{
GET_ATTR_STRING(name, nameobj);
return BufferSetattr((BufferObject *)(self), name, val);
}
static PyObject * static PyObject *
BufferDir(PyObject *self UNUSED) BufferDir(PyObject *self UNUSED)
{ {

View File

@ -19,6 +19,7 @@ void viminfo_writestring __ARGS((FILE *fd, char_u *p));
void do_fixdel __ARGS((exarg_T *eap)); void do_fixdel __ARGS((exarg_T *eap));
void print_line_no_prefix __ARGS((linenr_T lnum, int use_number, int list)); void print_line_no_prefix __ARGS((linenr_T lnum, int use_number, int list));
void print_line __ARGS((linenr_T lnum, int use_number, int list)); void print_line __ARGS((linenr_T lnum, int use_number, int list));
int rename_buffer __ARGS((char_u *new_fname));
void ex_file __ARGS((exarg_T *eap)); void ex_file __ARGS((exarg_T *eap));
void ex_update __ARGS((exarg_T *eap)); void ex_update __ARGS((exarg_T *eap));
void ex_write __ARGS((exarg_T *eap)); void ex_write __ARGS((exarg_T *eap));

View File

@ -476,6 +476,10 @@ EOF
:py b=vim.current.buffer :py b=vim.current.buffer
:wincmd w :wincmd w
:mark a :mark a
:augroup BUFS
: autocmd BufFilePost * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePost:' + vim.eval('bufnr("%")'))
: autocmd BufFilePre * python cb.append(vim.eval('expand("<abuf>")') + ':BufFilePre:' + vim.eval('bufnr("%")'))
:augroup END
py << EOF py << EOF
cb = vim.current.buffer cb = vim.current.buffer
# Tests BufferAppend and BufferItem # Tests BufferAppend and BufferItem
@ -496,9 +500,20 @@ b.append('foo')
b[0]='bar' b[0]='bar'
b[0:0]=['baz'] b[0:0]=['baz']
vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number) vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
# Test assigning to name property
old_name = cb.name
cb.name = 'foo'
cb.append(cb.name[-11:])
b.name = 'bar'
cb.append(b.name[-11:])
cb.name = old_name
cb.append(cb.name[-17:])
# Test CheckBuffer # Test CheckBuffer
vim.command('bwipeout! ' + str(b.number)) for _b in vim.buffers:
for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'): if _b is not cb:
vim.command('bwipeout! ' + str(_b.number))
del _b
for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")', 'b.name = "!"'):
try: try:
exec(expr) exec(expr)
except vim.error: except vim.error:
@ -507,7 +522,12 @@ for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
# Usually a SEGV here # Usually a SEGV here
# Should not happen in any case # Should not happen in any case
cb.append('No exception for ' + expr) cb.append('No exception for ' + expr)
vim.command('cd .')
EOF EOF
:augroup BUFS
: autocmd!
:augroup END
:augroup! BUFS
:" :"
:" Test vim.buffers object :" Test vim.buffers object
:set hidden :set hidden
@ -586,7 +606,9 @@ def W(w):
else: else:
return repr(w) return repr(w)
def Cursor(w, start=len(cb)): start = len(cb)
def Cursor(w):
if w.buffer is cb: if w.buffer is cb:
return repr((start - w.cursor[0], w.cursor[1])) return repr((start - w.cursor[0], w.cursor[1]))
else: else:

View File

@ -319,14 +319,23 @@ bar
Second line Second line
Third line Third line
foo foo
1:BufFilePre:1
6:BufFilePost:1
testdir/foo
5:BufFilePre:5
5:BufFilePost:5
testdir/bar
1:BufFilePre:1
7:BufFilePost:1
testdir/test86.in
i:<buffer test86.in> i:<buffer test86.in>
i2:<buffer test86.in> i2:<buffer test86.in>
i:<buffer a> i:<buffer a>
i3:<buffer test86.in> i3:<buffer test86.in>
1:<buffer test86.in>=<buffer test86.in> 1:<buffer test86.in>=<buffer test86.in>
6:<buffer a>=<buffer a> 8:<buffer a>=<buffer a>
7:<buffer b>=<buffer b> 9:<buffer b>=<buffer b>
8:<buffer c>=<buffer c> 10:<buffer c>=<buffer c>
4 4
i4:<buffer test86.in> i4:<buffer test86.in>
i4:<buffer test86.in> i4:<buffer test86.in>
@ -335,7 +344,7 @@ Number of tabs: 4
Current tab pages: Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)> <tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows: Windows:
<window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (27, 0) <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (36, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)> <tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows: Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0) <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)

View File

@ -463,6 +463,10 @@ EOF
:py3 b=vim.current.buffer :py3 b=vim.current.buffer
:wincmd w :wincmd w
:mark a :mark a
:augroup BUFS
: autocmd BufFilePost * python3 cb.append(vim.eval('expand("<abuf>")') + ':BufFilePost:' + vim.eval('bufnr("%")'))
: autocmd BufFilePre * python3 cb.append(vim.eval('expand("<abuf>")') + ':BufFilePre:' + vim.eval('bufnr("%")'))
:augroup END
py3 << EOF py3 << EOF
cb = vim.current.buffer cb = vim.current.buffer
# Tests BufferAppend and BufferItem # Tests BufferAppend and BufferItem
@ -483,8 +487,19 @@ b.append('foo')
b[0]='bar' b[0]='bar'
b[0:0]=['baz'] b[0:0]=['baz']
vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number) vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
# Test assigning to name property
old_name = cb.name
cb.name = 'foo'
cb.append(cb.name[-11:])
b.name = 'bar'
cb.append(b.name[-11:])
cb.name = old_name
cb.append(cb.name[-17:])
# Test CheckBuffer # Test CheckBuffer
vim.command('bwipeout! ' + str(b.number)) for _b in vim.buffers:
if _b is not cb:
vim.command('bwipeout! ' + str(_b.number))
del _b
for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'): for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
try: try:
exec(expr) exec(expr)
@ -494,6 +509,7 @@ for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
# Usually a SEGV here # Usually a SEGV here
# Should not happen in any case # Should not happen in any case
cb.append('No exception for ' + expr) cb.append('No exception for ' + expr)
vim.command('cd .')
EOF EOF
:" :"
:" Test vim.buffers object :" Test vim.buffers object

View File

@ -308,14 +308,23 @@ bar
Second line Second line
Third line Third line
foo foo
1:BufFilePre:1
6:BufFilePost:1
testdir/foo
5:BufFilePre:5
5:BufFilePost:5
testdir/bar
1:BufFilePre:1
7:BufFilePost:1
testdir/test87.in
i:<buffer test87.in> i:<buffer test87.in>
i2:<buffer test87.in> i2:<buffer test87.in>
i:<buffer a> i:<buffer a>
i3:<buffer test87.in> i3:<buffer test87.in>
1:<buffer test87.in>=<buffer test87.in> 1:<buffer test87.in>=<buffer test87.in>
6:<buffer a>=<buffer a> 8:<buffer a>=<buffer a>
7:<buffer b>=<buffer b> 9:<buffer b>=<buffer b>
8:<buffer c>=<buffer c> 10:<buffer c>=<buffer c>
4 4
i4:<buffer test87.in> i4:<buffer test87.in>
i4:<buffer test87.in> i4:<buffer test87.in>
@ -324,7 +333,7 @@ Number of tabs: 4
Current tab pages: Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)> <tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows: Windows:
<window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (27, 0) <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (36, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)> <tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows: Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0) <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)

View File

@ -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 */
/**/
1042,
/**/ /**/
1041, 1041,
/**/ /**/