0
0
mirror of https://github.com/vim/vim.git synced 2025-09-04 21:33:48 -04:00

updated for version 7.3.996

Problem:    Python: Can't check types of what is returned by bindeval().
Solution:   Add vim.List, vim.Dictionary and vim.Function types. (ZyX)
This commit is contained in:
Bram Moolenaar 2013-05-21 19:50:34 +02:00
parent 1dc28783fa
commit cac867ad18
7 changed files with 90 additions and 12 deletions

View File

@ -11,9 +11,10 @@ The Python Interface to Vim *python* *Python*
3. Buffer objects |python-buffer| 3. Buffer objects |python-buffer|
4. Range objects |python-range| 4. Range objects |python-range|
5. Window objects |python-window| 5. Window objects |python-window|
6. pyeval(), py3eval() Vim functions |python-pyeval| 6. Tab page objects |python-tabpage|
7. Dynamic loading |python-dynamic| 7. pyeval(), py3eval() Vim functions |python-pyeval|
8. Python 3 |python3| 8. Dynamic loading |python-dynamic|
9. Python 3 |python3|
{Vi does not have any of these commands} {Vi does not have any of these commands}
@ -176,7 +177,7 @@ vim.bindeval(str) *python-bindeval*
list or dictionary. Thus modifications to these objects imply list or dictionary. Thus modifications to these objects imply
modifications of the original. modifications of the original.
Additionally, vimlist and vimdictionary type have read-write Additionally, vim.List and vim.Dictionary type have read-write
`.locked` attribute that returns `.locked` attribute that returns
Value Meaning ~ Value Meaning ~
zero Variable is not locked zero Variable is not locked
@ -189,14 +190,15 @@ vim.bindeval(str) *python-bindeval*
case these locks are ignored by anything except |:let|: |extend()| case these locks are ignored by anything except |:let|: |extend()|
does not care, neither does python interface). does not care, neither does python interface).
Vimdictionary type also supports `.scope` attribute which is one of vim.Dictionary type also supports `.scope` attribute which is one
of
Value Meaning ~ Value Meaning ~
zero Dictionary is not a scope one zero Dictionary is not a scope one
vim.VAR_DEF_SCOPE Function-local or global scope dictionary vim.VAR_DEF_SCOPE Function-local or global scope dictionary
vim.VAR_SCOPE Other scope dictionary vim.VAR_SCOPE Other scope dictionary
2. if expression evaluates to a function reference, then it returns 2. if expression evaluates to a function reference, then it returns
callable vimfunction object. Use self keyword argument to assign callable vim.Function object. Use self keyword argument to assign
|self| object for dictionary functions. |self| object for dictionary functions.
Note: this function has the same behavior as |lua-eval| (except that Note: this function has the same behavior as |lua-eval| (except that
@ -205,6 +207,10 @@ vim.bindeval(str) *python-bindeval*
relying on outputs of vim.eval() being a copy of original or relying on outputs of vim.eval() being a copy of original or
vim.eval("1") returning a string. vim.eval("1") returning a string.
You can use "List", "Dictionary" and "Function" vim module attributes
to test whether object has given type. These types are currently not
subclassable, neither they contain constructors, so you can use them
only for checks like `isinstance(obj, vim.List)`.
Error object of the "vim" module Error object of the "vim" module
@ -302,6 +308,9 @@ vim.options *python-options*
buffer-local options and |python-window| objects to access to buffer-local options and |python-window| objects to access to
window-local options. window-local options.
Type of this object is available via "Options" attribute of vim
module.
Output from Python *python-output* Output from Python *python-output*
Vim displays all Python code output in the Vim message area. Normal Vim displays all Python code output in the Vim message area. Normal
output appears as information messages, and error output appears as output appears as information messages, and error output appears as
@ -371,6 +380,8 @@ Note that when adding a line it must not contain a line break character '\n'.
A trailing '\n' is allowed and ignored, so that you can do: > A trailing '\n' is allowed and ignored, so that you can do: >
:py b.append(f.readlines()) :py b.append(f.readlines())
Buffer object type is available using "Buffer" attribute of vim module.
Examples (assume b is the current buffer) > Examples (assume b is the current buffer) >
:py print b.name # write the buffer file name :py print b.name # write the buffer file name
:py b[0] = "hello!!!" # replace the top line :py b[0] = "hello!!!" # replace the top line
@ -412,6 +423,8 @@ The range object methods are:
for Python's built-in list objects. for Python's built-in list objects.
r.append(list, nr) Idem, after line "nr" r.append(list, nr) Idem, after line "nr"
Range object type is available using "Range" attribute of vim module.
Example (assume r is the current range): Example (assume r is the current range):
# Send all lines in a range to the default printer # Send all lines in a range to the default printer
vim.command("%d,%dhardcopy!" % (r.start+1,r.end+1)) vim.command("%d,%dhardcopy!" % (r.start+1,r.end+1))
@ -456,6 +469,8 @@ Window attributes are:
The height attribute is writable only if the screen is split horizontally. The height attribute is writable only if the screen is split horizontally.
The width attribute is writable only if the screen is split vertically. The width attribute is writable only if the screen is split vertically.
Window object type is available using "Window" attribute of vim module.
============================================================================== ==============================================================================
6. Tab page objects *python-tabpage* 6. Tab page objects *python-tabpage*
@ -474,14 +489,16 @@ Tab page attributes are:
vars The tab page |t:| variables. vars The tab page |t:| variables.
window Current tabpage window. window Current tabpage window.
TabPage object type is available using "TabPage" attribute of vim module.
============================================================================== ==============================================================================
6. pyeval() and py3eval() Vim functions *python-pyeval* 7. pyeval() and py3eval() Vim functions *python-pyeval*
To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()| To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()|
functions to evaluate Python expressions and pass their values to VimL. functions to evaluate Python expressions and pass their values to VimL.
============================================================================== ==============================================================================
7. Dynamic loading *python-dynamic* 8. Dynamic loading *python-dynamic*
On MS-Windows the Python library can be loaded dynamically. The |:version| On MS-Windows the Python library can be loaded dynamically. The |:version|
output then includes |+python/dyn|. output then includes |+python/dyn|.
@ -498,7 +515,7 @@ Currently the name is "python24.dll". That is for Python 2.4. To know for
sure edit "gvim.exe" and search for "python\d*.dll\c". sure edit "gvim.exe" and search for "python\d*.dll\c".
============================================================================== ==============================================================================
8. Python 3 *python3* 9. Python 3 *python3*
*:py3* *:python3* *:py3* *:python3*
The `:py3` and `:python3` commands work similar to `:python`. A simple check The `:py3` and `:python3` commands work similar to `:python`. A simple check

View File

@ -4245,6 +4245,15 @@ static struct object_constant {
{"windows", (PyObject *)(void *)&TheWindowList}, {"windows", (PyObject *)(void *)&TheWindowList},
{"tabpages", (PyObject *)(void *)&TheTabPageList}, {"tabpages", (PyObject *)(void *)&TheTabPageList},
{"current", (PyObject *)(void *)&TheCurrent}, {"current", (PyObject *)(void *)&TheCurrent},
{"Buffer", (PyObject *)&BufferType},
{"Range", (PyObject *)&RangeType},
{"Window", (PyObject *)&WindowType},
{"TabPage", (PyObject *)&TabPageType},
{"Dictionary", (PyObject *)&DictionaryType},
{"List", (PyObject *)&ListType},
{"Function", (PyObject *)&FunctionType},
{"Options", (PyObject *)&OptionsType},
}; };
typedef int (*object_adder)(PyObject *, const char *, PyObject *); typedef int (*object_adder)(PyObject *, const char *, PyObject *);

View File

@ -631,10 +631,26 @@ cb.append('Current buffer: ' + repr(vim.current.buffer))
cb.append('Current line: ' + repr(vim.current.line)) cb.append('Current line: ' + repr(vim.current.line))
for b in vim.buffers: for b in vim.buffers:
if b is not cb: if b is not cb:
vim.command('bwipeout! ' + b.number) vim.command('bwipeout! ' + str(b.number))
EOF EOF
:tabonly! :tabonly!
:only! :only!
:"
:" Test types
py << EOF
for expr, attr in (
('vim.vars', 'Dictionary'),
('vim.options', 'Options'),
('vim.bindeval("{}")', 'Dictionary'),
('vim.bindeval("[]")', 'List'),
('vim.bindeval("function(\'tr\')")', 'Function'),
('vim.current.buffer', 'Buffer'),
('vim.current.range', 'Range'),
('vim.current.window', 'Window'),
('vim.current.tabpage', 'TabPage'),
):
cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
EOF
:endfun :endfun
:" :"
:call Test() :call Test()

View File

@ -333,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 test86.in>; cursor is at (954, 0) <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (970, 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)
@ -359,3 +359,12 @@ Current tab page: <tabpage 2>
Current window: <window 0> Current window: <window 0>
Current buffer: <buffer test86.in> Current buffer: <buffer test86.in>
Current line: 'Type error at assigning None to vim.current.buffer' Current line: 'Type error at assigning None to vim.current.buffer'
vim.vars:Dictionary:True
vim.options:Options:True
vim.bindeval("{}"):Dictionary:True
vim.bindeval("[]"):List:True
vim.bindeval("function('tr')"):Function:True
vim.current.buffer:Buffer:True
vim.current.range:Range:True
vim.current.window:Window:True
vim.current.tabpage:TabPage:True

View File

@ -622,6 +622,22 @@ for b in vim.buffers:
EOF EOF
:tabonly! :tabonly!
:only! :only!
:"
:" Test types
py3 << EOF
for expr, attr in (
('vim.vars', 'Dictionary'),
('vim.options', 'Options'),
('vim.bindeval("{}")', 'Dictionary'),
('vim.bindeval("[]")', 'List'),
('vim.bindeval("function(\'tr\')")', 'Function'),
('vim.current.buffer', 'Buffer'),
('vim.current.range', 'Range'),
('vim.current.window', 'Window'),
('vim.current.tabpage', 'TabPage'),
):
cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
EOF
:endfun :endfun
:" :"
:call Test() :call Test()

View File

@ -322,7 +322,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 (930, 0) <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (946, 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)
@ -348,3 +348,12 @@ Current tab page: <tabpage 2>
Current window: <window 0> Current window: <window 0>
Current buffer: <buffer test87.in> Current buffer: <buffer test87.in>
Current line: 'Type error at assigning None to vim.current.buffer' Current line: 'Type error at assigning None to vim.current.buffer'
vim.vars:Dictionary:True
vim.options:Options:True
vim.bindeval("{}"):Dictionary:True
vim.bindeval("[]"):List:True
vim.bindeval("function('tr')"):Function:True
vim.current.buffer:Buffer:True
vim.current.range:Range:True
vim.current.window:Window:True
vim.current.tabpage:TabPage:True

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 */
/**/
996,
/**/ /**/
995, 995,
/**/ /**/