> Well, that's a very long list.  Do we really need all of this?
> Let's at least order by usefulness.  First add things that help
> plugin writers most.  I'm assuming that very few users will type
> Python commands, I expect them to be used in scripts.
> We could lower priority for things that are already possible but
> perhaps not in a very nice way.

They are all possible (except for some edge cases like `<script>` mappings 
(maparg(dict=1) does not distinguish between `nore` and `<script>` mappings), 
`<LT>F1>` vs `<F1>` in lhs when using `:redir` to get list of mappings, 
determining whether some column in :jumps output is file name or line in the 
buffer, determining function name used for custom/customlist completion and so 
on). And all help plugin writers. The least useful for me would be jumps thing, 
but other plugin writers would not tell the same. Like all python interface 
improvements this reduces the need for `vim.command` and `vim.[bind]eval`. Main 
target is to reduce VimL in scripts that require python support to just one 
line `:python import foo; foo.setup()` call and have nice python code. Then 
python-enabled plugins are easily installable by pip with the single addition 
of that line to vimrc. Additionally python-only plugins will be able to be 
written in python and not in python+VimL. Currently people are not doing the 
former because this still requires a bunch of things written in VimL and 
wrapping this into `vim.command('''{multi-line}''')` does not look good and the 
latter is just not possible. There are a few more things to be added for this 
to work:

vim.functions:
    Mapping-like object mapping user function names to vim.Function objects.
    Accepts s: and <SID> in keys, but always expands it when creating objects.

function:
    Callable object with the following attributes:
        name           Function name
        code           Function code
        sid            Script ID
        is_dictionary  True or False.
        dict           For convenience vim.Dictionary can be assigned to this
                       attribute in order to forget about specifying self= arg.
                       Supports assigning any mapping-like object that can be 
                       converted.

vim.Function(args, code, name=None, is_dictionary=False, dict=None)
    Creates function object like above (name=None means anonymous function, name
    is automatically generated). Code is a iterable of strings.

vim._gen_function(callable, args=())
    Generates vim.Function object from python callable object. At this point 
    can only do something like the following (but not exactly this; and also 
    written in C):

        id = vim._callables.save(callable)
        return vim.Function(args, ('python import vim', 'return 
pyeval("vim._callables[{0}]({1})")'.format(id, 
','.join((arg+'=vim.bindeval("a:'+arg+'")' for arg in args)))), dict={})
        # Rather hacky, but standard solution is preferred over 100500 ways
        # plugin writers can reimplement it just to call python function 
        # from various places where it is needed.

    . Is not supposed to be used directly: it is for
    vim.Command(command=callable), vim.Autocommand(command=callable) and 
    vim.Mapping(rhs=callable, expr=True).

In vim.Autocommand(command=callable) callable receives buf=N (for <abuf>) and 
match=string (for <amatch>) keyword arguments.

In vim.Command(command=callable) callable automatically receives a list of
arguments in args keyword argument and additionally count=N or range=(N, M), 
bang=True/False and reg=char keyword arguments if appropriate.

In vim.Command(complete=callable) callable receives three arguments as usual 
completion function. It is the only callable that receives non-keyword 
arguments.

In vim.Mapping(rhs=callable, expr=True) callable is called without arguments.

vim.options, {buffer}.options and {window}.options should also support 
assigning python functions when it makes sense:
    &statusline: will use something like %! and receive vim.window argument.
    &indentexpr, &formatexpr, &balloonexpr, &foldexpr, &diffexpr, &includeexpr, 
    &patchexpr, &printexpr
    &omnifunc, &completefunc, &operatorfunc
. As when deleting commands, mappings, autocommands and resetting options no 
GC is triggered this will use pyeval() directly as long as possible (i.e. no 
need to make GC’ing functions also GC objects from vim._callables as functions
will not be garbage-collected). vim._callables will have .remove() method in 
case somebody will need to GC things manually. vim._callables won’t contain two 
references to same object.

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Raspunde prin e-mail lui