| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.945 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 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); |
| |
| |
| |
| *** 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); |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 /// |