diff --git a/7.3.945 b/7.3.945 new file mode 100644 index 0000000..f3bfb2f --- /dev/null +++ b/7.3.945 @@ -0,0 +1,648 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.945 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.945 +Problem: Python: List of buffers is not very useful. +Solution: Make vim.buffers a map. No iterator yet. (ZyX) +Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/if_python3.c, + src/if_python.c, src/testdir/test86.ok, src/testdir/test87.ok + + +*** ../vim-7.3.944/runtime/doc/if_pyth.txt 2013-05-12 19:30:27.000000000 +0200 +--- runtime/doc/if_pyth.txt 2013-05-15 13:34:06.000000000 +0200 +*************** +*** 209,220 **** + to which the variables referred. + + vim.buffers *python-buffers* +! A sequence object providing access to the list of vim buffers. The + object supports the following operations: > + :py b = vim.buffers[i] # Indexing (read-only) + :py b in vim.buffers # Membership test + :py n = len(vim.buffers) # Number of elements +- :py for b in vim.buffers: # Sequential access + < + vim.windows *python-windows* + A sequence object providing access to the list of vim windows. The +--- 209,219 ---- + to which the variables referred. + + vim.buffers *python-buffers* +! A mapping object providing access to the list of vim buffers. The + object supports the following operations: > + :py b = vim.buffers[i] # Indexing (read-only) + :py b in vim.buffers # Membership test + :py n = len(vim.buffers) # Number of elements + < + vim.windows *python-windows* + A sequence object providing access to the list of vim windows. The +*** ../vim-7.3.944/src/if_py_both.h 2013-05-12 21:16:17.000000000 +0200 +--- src/if_py_both.h 2013-05-15 13:34:06.000000000 +0200 +*************** +*** 534,549 **** + * Buffer list object - Implementation + */ + +! static PyTypeObject BufListType; +! static PySequenceMethods BufListAsSeq; + + typedef struct + { + PyObject_HEAD +! } BufListObject; + + static PyInt +! BufListLength(PyObject *self UNUSED) + { + buf_T *b = firstbuf; + PyInt n = 0; +--- 534,548 ---- + * Buffer list object - Implementation + */ + +! static PyTypeObject BufMapType; + + typedef struct + { + PyObject_HEAD +! } BufMapObject; + + static PyInt +! BufMapLength(PyObject *self UNUSED) + { + buf_T *b = firstbuf; + PyInt n = 0; +*************** +*** 558,577 **** + } + + static PyObject * +! BufListItem(PyObject *self UNUSED, PyInt n) + { +! buf_T *b; + +! for (b = firstbuf; b; b = b->b_next, --n) + { +! if (n == 0) +! return BufferNew(b); + } + +! PyErr_SetString(PyExc_IndexError, _("no such buffer")); +! return NULL; + } + + typedef struct pylinkedlist_S { + struct pylinkedlist_S *pll_next; + struct pylinkedlist_S *pll_prev; +--- 557,597 ---- + } + + static PyObject * +! BufMapItem(PyObject *self UNUSED, PyObject *keyObject) + { +! buf_T *b; +! int bnr; + +! #if PY_MAJOR_VERSION < 3 +! if (PyInt_Check(keyObject)) +! bnr = PyInt_AsLong(keyObject); +! else +! #endif +! if (PyLong_Check(keyObject)) +! bnr = PyLong_AsLong(keyObject); +! else + { +! PyErr_SetString(PyExc_ValueError, _("key must be integer")); +! return NULL; + } + +! b = buflist_findnr(bnr); +! +! if (b) +! return BufferNew(b); +! else +! { +! PyErr_SetString(PyExc_KeyError, _("no such buffer")); +! return NULL; +! } + } + ++ static PyMappingMethods BufMapAsMapping = { ++ (lenfunc) BufMapLength, ++ (binaryfunc) BufMapItem, ++ (objobjargproc) 0, ++ }; ++ + typedef struct pylinkedlist_S { + struct pylinkedlist_S *pll_next; + struct pylinkedlist_S *pll_prev; +*************** +*** 3401,3411 **** + WindowType.tp_setattr = WindowSetattr; + #endif + +! vim_memset(&BufListType, 0, sizeof(BufListType)); +! BufListType.tp_name = "vim.bufferlist"; +! BufListType.tp_basicsize = sizeof(BufListObject); +! BufListType.tp_as_sequence = &BufListAsSeq; +! BufListType.tp_flags = Py_TPFLAGS_DEFAULT; + BufferType.tp_doc = "vim buffer list"; + + vim_memset(&WinListType, 0, sizeof(WinListType)); +--- 3421,3431 ---- + WindowType.tp_setattr = WindowSetattr; + #endif + +! vim_memset(&BufMapType, 0, sizeof(BufMapType)); +! BufMapType.tp_name = "vim.bufferlist"; +! BufMapType.tp_basicsize = sizeof(BufMapObject); +! BufMapType.tp_as_mapping = &BufMapAsMapping; +! BufMapType.tp_flags = Py_TPFLAGS_DEFAULT; + BufferType.tp_doc = "vim buffer list"; + + vim_memset(&WinListType, 0, sizeof(WinListType)); +*** ../vim-7.3.944/src/if_python3.c 2013-05-12 21:16:17.000000000 +0200 +--- src/if_python3.c 2013-05-15 13:34:06.000000000 +0200 +*************** +*** 1272,1293 **** + } + } + +- /* Buffer list object - Definitions +- */ +- +- static PySequenceMethods BufListAsSeq = { +- (lenfunc) BufListLength, /* sq_length, len(x) */ +- (binaryfunc) 0, /* sq_concat, x+y */ +- (ssizeargfunc) 0, /* sq_repeat, x*n */ +- (ssizeargfunc) BufListItem, /* sq_item, x[i] */ +- 0, /* was_sq_slice, x[i:j] */ +- (ssizeobjargproc) 0, /* sq_as_item, x[i]=v */ +- 0, /* sq_ass_slice, x[i:j]=v */ +- 0, /* sq_contains */ +- 0, /* sq_inplace_concat */ +- 0, /* sq_inplace_repeat */ +- }; +- + /* Window object - Implementation + */ + +--- 1272,1277 ---- +*************** +*** 1512,1520 **** + } + #endif + +! static BufListObject TheBufferList = + { +! PyObject_HEAD_INIT(&BufListType) + }; + + static WinListObject TheWindowList = +--- 1496,1504 ---- + } + #endif + +! static BufMapObject TheBufferMap = + { +! PyObject_HEAD_INIT(&BufMapType) + }; + + static WinListObject TheWindowList = +*************** +*** 1538,1544 **** + PyType_Ready(&BufferType); + PyType_Ready(&RangeType); + PyType_Ready(&WindowType); +! PyType_Ready(&BufListType); + PyType_Ready(&WinListType); + PyType_Ready(&CurrentType); + PyType_Ready(&DictionaryType); +--- 1522,1528 ---- + PyType_Ready(&BufferType); + PyType_Ready(&RangeType); + PyType_Ready(&WindowType); +! PyType_Ready(&BufMapType); + PyType_Ready(&WinListType); + PyType_Ready(&CurrentType); + PyType_Ready(&DictionaryType); +*************** +*** 1557,1564 **** + Py_INCREF(VimError); + + PyModule_AddObject(mod, "error", VimError); +! Py_INCREF((PyObject *)(void *)&TheBufferList); +! PyModule_AddObject(mod, "buffers", (PyObject *)(void *)&TheBufferList); + Py_INCREF((PyObject *)(void *)&TheCurrent); + PyModule_AddObject(mod, "current", (PyObject *)(void *)&TheCurrent); + Py_INCREF((PyObject *)(void *)&TheWindowList); +--- 1541,1548 ---- + Py_INCREF(VimError); + + PyModule_AddObject(mod, "error", VimError); +! Py_INCREF((PyObject *)(void *)&TheBufferMap); +! PyModule_AddObject(mod, "buffers", (PyObject *)(void *)&TheBufferMap); + Py_INCREF((PyObject *)(void *)&TheCurrent); + PyModule_AddObject(mod, "current", (PyObject *)(void *)&TheCurrent); + Py_INCREF((PyObject *)(void *)&TheWindowList); +*** ../vim-7.3.944/src/if_python.c 2013-05-12 20:36:09.000000000 +0200 +--- src/if_python.c 2013-05-15 13:34:06.000000000 +0200 +*************** +*** 1131,1154 **** + &((RangeObject *)(self))->end); + } + +- /* Buffer list object - Definitions +- */ +- +- static PySequenceMethods BufListAsSeq = { +- (PyInquiry) BufListLength, /* sq_length, len(x) */ +- (binaryfunc) 0, /* sq_concat, x+y */ +- (PyIntArgFunc) 0, /* sq_repeat, x*n */ +- (PyIntArgFunc) BufListItem, /* sq_item, x[i] */ +- (PyIntIntArgFunc) 0, /* sq_slice, x[i:j] */ +- (PyIntObjArgProc) 0, /* sq_ass_item, x[i]=v */ +- (PyIntIntObjArgProc) 0, /* sq_ass_slice, x[i:j]=v */ +- (objobjproc) 0, +- #if PY_MAJOR_VERSION >= 2 +- (binaryfunc) 0, +- 0, +- #endif +- }; +- + /* Window object - Implementation + */ + +--- 1131,1136 ---- +*************** +*** 1212,1220 **** + } + #endif + +! static BufListObject TheBufferList = + { +! PyObject_HEAD_INIT(&BufListType) + }; + + static WinListObject TheWindowList = +--- 1194,1202 ---- + } + #endif + +! static BufMapObject TheBufferMap = + { +! PyObject_HEAD_INIT(&BufMapType) + }; + + static WinListObject TheWindowList = +*************** +*** 1240,1246 **** + PyType_Ready(&BufferType); + PyType_Ready(&RangeType); + PyType_Ready(&WindowType); +! PyType_Ready(&BufListType); + PyType_Ready(&WinListType); + PyType_Ready(&CurrentType); + PyType_Ready(&OptionsType); +--- 1222,1228 ---- + PyType_Ready(&BufferType); + PyType_Ready(&RangeType); + PyType_Ready(&WindowType); +! PyType_Ready(&BufMapType); + PyType_Ready(&WinListType); + PyType_Ready(&CurrentType); + PyType_Ready(&OptionsType); +*************** +*** 1254,1260 **** + VimError = Py_BuildValue("s", "vim.error"); + + PyDict_SetItemString(dict, "error", VimError); +! PyDict_SetItemString(dict, "buffers", (PyObject *)(void *)&TheBufferList); + PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent); + PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList); + tmp = DictionaryNew(&globvardict); +--- 1236,1242 ---- + VimError = Py_BuildValue("s", "vim.error"); + + PyDict_SetItemString(dict, "error", VimError); +! PyDict_SetItemString(dict, "buffers", (PyObject *)(void *)&TheBufferMap); + PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent); + PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList); + tmp = DictionaryNew(&globvardict); +*** ../vim-7.3.944/src/testdir/test86.ok 2013-05-12 21:16:17.000000000 +0200 +--- src/testdir/test86.ok 2013-05-15 13:34:06.000000000 +0200 +*************** +*** 226,238 **** + p/bopts1: False + inv: 2! ValueError + G: 0 +! W: 1:1 2:1 3:0 4:0 +! B: 1:1 2:1 3:0 4:0 + del wopts3! KeyError + del bopts3! ValueError + G: 0 +! W: 1:1 2:1 3:0 4:0 +! B: 1:1 2:1 3:0 4:0 + >>> iminsert + p/gopts1! KeyError + inv: 3! KeyError +--- 226,238 ---- + p/bopts1: False + inv: 2! ValueError + G: 0 +! W: 1:0 2:1 3:0 4:1 +! B: 1:0 2:1 3:0 4:1 + del wopts3! KeyError + del bopts3! ValueError + G: 0 +! W: 1:0 2:1 3:0 4:1 +! B: 1:0 2:1 3:0 4:1 + >>> iminsert + p/gopts1! KeyError + inv: 3! KeyError +*************** +*** 244,256 **** + wopts3! KeyError + p/bopts1: 2 + G: 1 +! W: 1:2 2:1 3:0 4:2 +! B: 1:2 2:1 3:0 4:2 + del wopts3! KeyError + del bopts3! ValueError + G: 1 +! W: 1:2 2:1 3:0 4:2 +! B: 1:2 2:1 3:0 4:2 + >>> omnifunc + p/gopts1! KeyError + inv: 1! KeyError +--- 244,256 ---- + wopts3! KeyError + p/bopts1: 2 + G: 1 +! W: 1:0 2:2 3:2 4:1 +! B: 1:0 2:2 3:2 4:1 + del wopts3! KeyError + del bopts3! ValueError + G: 1 +! W: 1:0 2:2 3:2 4:1 +! B: 1:0 2:2 3:2 4:1 + >>> omnifunc + p/gopts1! KeyError + inv: 1! KeyError +*************** +*** 263,275 **** + p/bopts1: '' + inv: 1! ValueError + G: '' +! W: 1:'B' 2:'C' 3:'A' 4:'' +! B: 1:'B' 2:'C' 3:'A' 4:'' + del wopts3! KeyError + del bopts3! ValueError + G: '' +! W: 1:'B' 2:'C' 3:'A' 4:'' +! B: 1:'B' 2:'C' 3:'A' 4:'' + >>> preserveindent + p/gopts1! KeyError + inv: 2! KeyError +--- 263,275 ---- + p/bopts1: '' + inv: 1! ValueError + G: '' +! W: 1:'A' 2:'B' 3:'' 4:'C' +! B: 1:'A' 2:'B' 3:'' 4:'C' + del wopts3! KeyError + del bopts3! ValueError + G: '' +! W: 1:'A' 2:'B' 3:'' 4:'C' +! B: 1:'A' 2:'B' 3:'' 4:'C' + >>> preserveindent + p/gopts1! KeyError + inv: 2! KeyError +*************** +*** 282,294 **** + p/bopts1: False + inv: 2! ValueError + G: 0 +! W: 1:1 2:1 3:0 4:0 +! B: 1:1 2:1 3:0 4:0 + del wopts3! KeyError + del bopts3! ValueError + G: 0 +! W: 1:1 2:1 3:0 4:0 +! B: 1:1 2:1 3:0 4:0 + >>> path + p/gopts1: '.,/usr/include,,' + inv: 0! ValueError +--- 282,294 ---- + p/bopts1: False + inv: 2! ValueError + G: 0 +! W: 1:0 2:1 3:0 4:1 +! B: 1:0 2:1 3:0 4:1 + del wopts3! KeyError + del bopts3! ValueError + G: 0 +! W: 1:0 2:1 3:0 4:1 +! B: 1:0 2:1 3:0 4:1 + >>> path + p/gopts1: '.,/usr/include,,' + inv: 0! ValueError +*************** +*** 300,311 **** + p/bopts1: None + inv: 0! ValueError + G: '.,,' +! W: 1:',,' 2:'.' 3:'.,,' 4:'.,,' +! B: 1:',,' 2:'.' 3:'.,,' 4:'.,,' + del wopts3! KeyError + G: '.,,' +! W: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,' +! B: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,' + First line + First line + def +--- 300,311 ---- + p/bopts1: None + inv: 0! ValueError + G: '.,,' +! W: 1:'.,,' 2:',,' 3:'.,,' 4:'.' +! B: 1:'.,,' 2:',,' 3:'.,,' 4:'.' + del wopts3! KeyError + G: '.,,' +! W: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,' +! B: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,' + First line + First line + def +*** ../vim-7.3.944/src/testdir/test87.ok 2013-05-12 21:16:17.000000000 +0200 +--- src/testdir/test87.ok 2013-05-15 13:34:06.000000000 +0200 +*************** +*** 215,227 **** + p/bopts1: False + inv: 2! ValueError + G: 0 +! W: 1:1 2:1 3:0 4:0 +! B: 1:1 2:1 3:0 4:0 + del wopts3! KeyError + del bopts3! ValueError + G: 0 +! W: 1:1 2:1 3:0 4:0 +! B: 1:1 2:1 3:0 4:0 + >>> iminsert + p/gopts1! KeyError + inv: 3! KeyError +--- 215,227 ---- + p/bopts1: False + inv: 2! ValueError + G: 0 +! W: 1:0 2:1 3:0 4:1 +! B: 1:0 2:1 3:0 4:1 + del wopts3! KeyError + del bopts3! ValueError + G: 0 +! W: 1:0 2:1 3:0 4:1 +! B: 1:0 2:1 3:0 4:1 + >>> iminsert + p/gopts1! KeyError + inv: 3! KeyError +*************** +*** 233,245 **** + wopts3! KeyError + p/bopts1: 2 + G: 1 +! W: 1:2 2:1 3:0 4:2 +! B: 1:2 2:1 3:0 4:2 + del wopts3! KeyError + del bopts3! ValueError + G: 1 +! W: 1:2 2:1 3:0 4:2 +! B: 1:2 2:1 3:0 4:2 + >>> omnifunc + p/gopts1! KeyError + inv: 1! KeyError +--- 233,245 ---- + wopts3! KeyError + p/bopts1: 2 + G: 1 +! W: 1:0 2:2 3:2 4:1 +! B: 1:0 2:2 3:2 4:1 + del wopts3! KeyError + del bopts3! ValueError + G: 1 +! W: 1:0 2:2 3:2 4:1 +! B: 1:0 2:2 3:2 4:1 + >>> omnifunc + p/gopts1! KeyError + inv: 1! KeyError +*************** +*** 252,264 **** + p/bopts1: b'' + inv: 1! ValueError + G: '' +! W: 1:'B' 2:'C' 3:'A' 4:'' +! B: 1:'B' 2:'C' 3:'A' 4:'' + del wopts3! KeyError + del bopts3! ValueError + G: '' +! W: 1:'B' 2:'C' 3:'A' 4:'' +! B: 1:'B' 2:'C' 3:'A' 4:'' + >>> preserveindent + p/gopts1! KeyError + inv: 2! KeyError +--- 252,264 ---- + p/bopts1: b'' + inv: 1! ValueError + G: '' +! W: 1:'A' 2:'B' 3:'' 4:'C' +! B: 1:'A' 2:'B' 3:'' 4:'C' + del wopts3! KeyError + del bopts3! ValueError + G: '' +! W: 1:'A' 2:'B' 3:'' 4:'C' +! B: 1:'A' 2:'B' 3:'' 4:'C' + >>> preserveindent + p/gopts1! KeyError + inv: 2! KeyError +*************** +*** 271,283 **** + p/bopts1: False + inv: 2! ValueError + G: 0 +! W: 1:1 2:1 3:0 4:0 +! B: 1:1 2:1 3:0 4:0 + del wopts3! KeyError + del bopts3! ValueError + G: 0 +! W: 1:1 2:1 3:0 4:0 +! B: 1:1 2:1 3:0 4:0 + >>> path + p/gopts1: b'.,/usr/include,,' + inv: 0! ValueError +--- 271,283 ---- + p/bopts1: False + inv: 2! ValueError + G: 0 +! W: 1:0 2:1 3:0 4:1 +! B: 1:0 2:1 3:0 4:1 + del wopts3! KeyError + del bopts3! ValueError + G: 0 +! W: 1:0 2:1 3:0 4:1 +! B: 1:0 2:1 3:0 4:1 + >>> path + p/gopts1: b'.,/usr/include,,' + inv: 0! ValueError +*************** +*** 289,300 **** + p/bopts1: None + inv: 0! ValueError + G: '.,,' +! W: 1:',,' 2:'.' 3:'.,,' 4:'.,,' +! B: 1:',,' 2:'.' 3:'.,,' 4:'.,,' + del wopts3! KeyError + G: '.,,' +! W: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,' +! B: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,' + First line + First line + def +--- 289,300 ---- + p/bopts1: None + inv: 0! ValueError + G: '.,,' +! W: 1:'.,,' 2:',,' 3:'.,,' 4:'.' +! B: 1:'.,,' 2:',,' 3:'.,,' 4:'.' + del wopts3! KeyError + G: '.,,' +! W: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,' +! B: 1:'.,,' 2:',,' 3:'.,,' 4:'.,,' + First line + First line + def +*** ../vim-7.3.944/src/version.c 2013-05-13 20:26:47.000000000 +0200 +--- src/version.c 2013-05-15 13:37:08.000000000 +0200 +*************** +*** 730,731 **** +--- 730,733 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 945, + /**/ + +-- +ARTHUR: A scratch? Your arm's off! +BLACK KNIGHT: No, it isn't. +ARTHUR: Well, what's that then? +BLACK KNIGHT: I've had worse. + The Quest for the Holy Grail (Monty Python) + + /// 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 ///