Monday, May 25, 2015

Re: Does trigger any event?

2015-05-25 22:31 GMT+03:00 Nikolay Pavlov <zyx.vim@gmail.com>:
> 2015-05-25 16:40 GMT+03:00 Nicola <nvitacolonna@gmail.com>:
>> On 2015-05-25 05:12:21 +0000, Nikolay Pavlov said:
>>
>>> 2015-05-25 1:12 GMT+03:00 Justin M. Keyes <justinkz@gmail.com>:
>>>>
>>>> On Sun, May 24, 2015 at 5:19 AM, Nicola <nvitacolonna@gmail.com> wrote:
>>>>>
>>>>> Hi,
>>>>> am I right that <C-w><C-o> does not trigger any event? I have a custom
>>>>> status line, which does not get updated when I close all other windows.
>>>>> For
>>>>> now, I have this workaround:
>>>>>
>>>>> nnoremap <C-w>o <C-w>o:call RefreshStatusLines()<CR>
>>>>> nnoremap <C-w><C-w> <C-w>o:call RefreshStatusLines()<CR>
>>>>>
>>>>> I was wondering whether there is a better way to detect when the user
>>>>> makes
>>>>> the active window the only visible one.
>>>>
>>>>
>>>> No such event.
>>
>>
>> Ok, I see that there is a WinResized event in `h todo`, so it is something
>> that is not implemented yet.
>>
>>>> But you can force statusline redraw by assigning an
>>>> option to itself:
>>>>
>>>> let &readonly=&readonly
>>>>
>>>> Although, I just noticed that Vim has a :redrawstatus command.
>>
>>
>> Thanks, both seem to work. I can probably dispose of my RefreshStatusLines()
>> then.
>>
>>>> Is
>>>> there any need for the "let &ro=&ro" hack mentioned in ":help
>>>> 'statusline'", given the existence of :redrawstatus?
>>>
>>>
>>> It is not needed. Status line redraw is being triggered by closing the
>>> window, no redraw is the problem of the custom status line, not Vim.
>>> RefreshStatusLines function is thus obviously *not* being used from
>>> the &statusline in this case.
>>
>>
>> I'm not sure I'm following you: what is the point of calling a function
>> whose
>> purpose is to redraw the status line from the status line itself? For
>> reference,
>> the code I'm using is here:
>>
>>
>> https://github.com/lifepillar/lifepillar-vim-config/blob/master/vimrc#L482
>>
>> I'm far from being a Vim expert, so I may well be doing things suboptimally.
>
> So your code intentions originate from the same Vim problem. When you
> referenced its name I imagined a function which fills status line with
> actual contents, which makes sense if you need to put results of
> lengthy computations into the status line (though usually this would
> touch only some segments and thus does not need a function which
> updates the whole status line).
>
>> call setwinvar(nr, '&statusline', '%!BuildStatusLine(' . winwidth(nr) . ',' . winbufnr(nr) . ',' . (nr == winnr()) . ')')
>
> 1. winwidth(nr) can be called inside BuildStatusLine. Same for other
> arguments. Just provide it with `nr`: this is a curse of `%!` that
> your code *is not* executed in the current window context, so you need
> external facilities for providing window number.
> 2. In place of window number it is better to mark windows with a
> window id (e.g. w:plugin_window_id: per-window unique variable).
> Window number is then obtained by using something like
> `filter(range(1, winnr('$')), 'getwinvar(v:val, "plugin_window_id") ==
> window_id')[0]`. Reasoning: when you rotate windows (:h window-moving)
> you do not get any events AFAIR, but window number changes.
> 3. In place of using *any* events at all update &statusline in a
> status line function. It is the only thing which will *definitely* be
> called. Setting &statusline from statusline function causes no errors,
> except that the intro screen may disappear:
> https://github.com/powerline/powerline/blob/2fa7c3cfc8023a927e44975514b7da4d5ac6e57e/powerline/vim.py#L212-L223.
> 4. Updating &statusline may trigger unnecessary redraws. Don't do this
> if it is already correct.
> 5. In place of updating &statusline in a statusline function always,
> do this only if `BuildNewStatusLine()` function is called. At the
> start set &g:statusline (note: ***global* option**) to
> %!BuildNewStatusLine(). :h global-local
> 6. Whichever function updates status lines should take care about
> assigning w:plugin_window_id for new windows.
>
> Note about autocommands:
>
> 1. There are no autocommands launched for some window manipulations.
> 2. Any code run inside autocommand without `nested` after pattern will
> not trigger your autocommands. `nested` is almost never used, though I
> wish it and nore mappings/abbreviations would be the defaults.
>
>>
>>> I know this because powerline does *not* use anything, but "switch
>>> highlight group" and "display raw text" statusline segments and it
>>> still immediately occupies all space after closing the window (== it
>>> does not use %= segments, so to occupy all space Vim must recompute
>>> status line or it will be displayed using the previous window size).
>>
>>
>> How do you get right-aligned elements in the status line without %=?
>
> What does %= do? It fills status line with spaces (well, some value
> from &fillchars really). Powerline does the same, but
>
> a) leaves no chances for &fillchars to intervent and
> b) supports any applications that displays colored text and provides
> length information.
>
>>
>> I have used Airline, but not Powerline, in the past, and it has the same
>> problem
>> (after <C-w>o the status line is not updated). Isn't Airline's codebase
>> derived from
>> Powerline?
>
> No, and never was.

Powerline is Python, airline is VimL. They may have used powerline-vim
(which was VimL) as a base, but AFAIK they did not.

>
>>
>> Nicola
>>
>>
>>
>> --
>> --
>> You received this message from the "vim_use" 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_use" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to vim_use+unsubscribe@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.

--
--
You received this message from the "vim_use" 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_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments: