2015-06-14 15:04 GMT+03:00 AA <[email protected]>:
> On Sunday, June 14, 2015 at 4:45:00 PM UTC+5:30, ZyX wrote:
>> 2015-06-14 14:10 GMT+03:00 Nikolay Pavlov
>> > 2015-06-13 17:02 GMT+03:00 AA
>> >> When I update the statusline from a python thread forked from main, the 
>> >> update gets registered by vim but is shown only after take an action, a 
>> >> movement using keys, or a mouse scroll.
>> >>
>> >> Python code here if it helps: http://sprunge.us/LCfM  (Open in vim 
>> >> followed by :pyfile %)
>> >>
>> >> Briefly: Spawn threads, each threads sleeps for a while and then updates 
>> >> the statusline. Don't do anything and you'll never notice the update. 
>> >> Keep j/k pressed and all updates show fine.
>> >>
>> >> So my question is: Is there a way in which I can make the status updates 
>> >> immediate, without requiring any user action?
>> >
>> > Vim is not thread-safe. You *must not* update statusline in another
>> > thread, especially doing this using `set statusline` command (there is
>> > also a variant where you use `vim.options` and/or {window}.options
>> > ({window}: object from vim.windows or vim.current.window)). Most
>> > likely after some time this code is running you will get a crash
>> > because Vim is using many globals (using .options will touch much less
>> > amount of globals compared to vim.command('set statusline=' …)).
>>
>> If you need such code to work then use NeoVim. It is still not
>> thread-safe, but NeoVim Python bindings run in another process and
>> communicate via sockets and time of your code execution is controlled
>> by NeoVim receiving messages and not Python sending them. Here you may
>> need :redrawstatus to force statusline redraw, though I thought that
>> setting &statusline should already cause a redraw.
>>
>> >
>> > Another bad idea was using Python code using :pyfile. This command
>> > pushes all variables/functions defined in the sourced file into global
>> > namespace so with big amount of plugins that use :pyfile you will
>> > definitely run into problems.
>> >
>> >>
>> >> Thanks
>> >>
>> >> --
>> >> --
>> >> 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
>> >> For more options, visit https://groups.google.com/d/optout.
>
> Thank you for the answer and for taking the time to give extra suggestions.
> I am now calling the private __setitem__ of vim.options, followed by 
> vim.command(redrawstatus).

Why __setitem__? obj.__setitem__(key, value) is obj[key] = value
(except when obj.__setitem__ was reassigned after object was already
created, but such a thing is not being done by sane Python
developers), it is not private by any means.

> Everything works fine.

Note that if with your code Vim will crash this is not a bug in Vim.

>
> As for pyfile, I will now use PYTHON << MARKER to run python code.

Absolutely no difference. There are only two sane ways to run Python
code and not pollute global namespace (== have at most one object in
global namespace):

1. Create a module and import it.
2. Use main function:

        def my_plugin_main():
            # Your code here

        my_plugin_main()

>
> --
> --
> 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/d/optout.

-- 
-- 
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/d/optout.

Raspunde prin e-mail lui