Wednesday, October 7, 2015

Re: How can I take control over jumps `Ctrl-O` and `Ctrl-I` in Vimscript?

2015-10-08 1:23 GMT+03:00 Nikolay Pavlov <zyx.vim@gmail.com>:
> 2015-10-07 19:07 GMT+03:00 Annis Monadjem <annismonadjem@gmail.com>:
>> On Wednesday, October 7, 2015 at 9:01:25 AM UTC+2, Christian Brabandt wrote:
>>> Hi Annis!
>>>
>>> On Di, 06 Okt 2015, Annis Monadjem wrote:
>>>
>>> > On Wednesday, October 7, 2015 at 12:39:30 AM UTC+2, Annis Monadjem
>>> > wrote:
>>> > > Is there any way I could use Vimscript to go through the list of
>>> > > jumps `Ctrl-O`, `Ctrl-I` and to pick the previous jump
>>> > > buffers/positions?
>>> > >
>>> > > Any suggestion is greatly appreciated.
>>> >
>>> > Hi Tony, Thanks for your comments. I'm not there still. I'm trying to
>>> > write a Vimscript and I just need a hint on how to approach the
>>> > problem.
>>> >
>>> > I'm keeping all my Vim-Help-jump-buffers 'nobuflisted', except for the
>>> > very last Vim-Help-buffer which is 'buflisted'. I am doing this
>>> > purposely to keep my listing ':ls' concise and short. Most other
>>> > non-Help-buffers and their jumps would be 'buflisted', except for
>>> > deleted ones.
>>> >
>>> > When pressing 'Ctrl-O' I'd like to jump to earlier history of
>>> > positions/buffers of both Vim-Help-jump-buffers as well as
>>> > non-Help-buffers. In particular I would like to jump to
>>> > Vim-Help-jump-buffers even if these are 'nobuflisted'. While jumping
>>> > back to each earlier buffer I would like to make the new `Ctrl-O`
>>> > target buffer only 'buflisted' while the previous buffer
>>> > 'nobuflisted'. Problem is that `Ctrl-O` does not point nor open a
>>> > 'nobuflisted' buffer (at least I don't know) and I'd don't want to
>>> > 'buflisted' all Vim-Help-jump-buffers except the loaded/visible one.
>>> >
>>> > Please, share with me what would be my best approach to vimscript this
>>> > problem.
>>>
>>> I don't follow. Are you saying, that C-O/C-I does not jump if that
>>> particular buffer has been set to nobuflisted? That doesn't not sound
>>> right, but a quick test does not show this behaviour.
>>>
>>> So please provide exact steps that do this and show exactly what you
>>> expect and what happens.
>>>
>>> Best,
>>> Christian
>>> --
>>> Ein Blitzableiter auf einem Kirchturm ist das denkbar stärkste
>>> Mißtrauensvotum gegen den lieben Gott.
>>> -- Karl Kraus
>>
>> Hi Karl,
>>
>> Thanks for your remarks. Following your kind suggestion I have prepared a description below.
>>
>> A) OVERALL SUMMARY:
>> I would like Vim Editor to show all buffers in ':ls' as usual with exception of Vim help buffers, i.e. generated by `:help` or `Ctrl-]`. Only the current active Vim-Help-buffer should be listed, while all other Vim-Help-buffers should be always unlisted. Also the editor should allow user to jump backward and forward as usual again with exception of Vim help buffers; the Vim-help-buffer where jump is active should be listed, while all other Vim-help-buffers should be unlisted.
>>
>> B) THE OBJECTIVE:
>> To write a Vimscript that would make Vim only show the last Vim-Help-buffer as listed and all other Vim-Help-buffers as unlisted. When typing `Ctrl-O` or `Ctrl-T` (and the opposite when typing `Ctrl-I` and `Ctrl-]` in the reverse direction) it should work as usually in Vim, except in case Vim-Help-buffer is the visible/active/current buffer then:
>> 1) if previous-buffer-jump is also a Vim-Help-buffer, then `Ctrl-O` or `Ctrl-T` should CHANGE the current Vim-Help-buffer to 'nobuflisted' before jumping to the previous Vim-Help-buffer and once on the previous one it would CHANGE it to 'buflisted'.
>> 2) if previous buffer jump was any other NONE-Help-buffer, then `Ctrl-O` or `Ctrl-T` should KEEP the current NONE-Help-buffer as 'buflisted' and once on the previous one it should KEEP it also 'buflisted'.
>>
>> C) WORK DONE AS OF NOW:
>> 1) "~/.vim/after/ftplugin/help.vim" contains:
>> set buflisted
>>
>> 2) "~/.vimrc" contains:
>> autocmd BufEnter,BufWinEnter * if &filetype=='help'
>> \| only
>> \| execute "normal! zi"
>> \| let w:bufnuc = bufnr("%")
>> \| let w:bufnua = bufnr("#")
>> \| if w:bufnua > 0
>> \| execute "buffer " . w:bufnua
>
> This is rather strange part.
>
> 1. Does not it add jump points?
> 2. Why do you need to use :buffer *at all*? There is
> getbufvar()/setbufvar() pair, which also works for buffer-local
> options like &buflisted and &filetype.
>
> Try to rewrite code without switching buffers. Maybe this will fix the issue.
>
> Also note keepjumps command modifier. If you for some reason *do* need
> to switch buffers you may use it.
>
>> \| if &filetype=='help'
>> \| if w:bufnua != w:bufnuc
>> \| set nobuflisted
>> \| endif
>> \| endif
>> \| execute "buffer " . w:bufnuc
>> \| endif
>> \| endif
>>
>> The code as specified above keeps the Vim-help-buffers unlisted with only one copy, the current one, listed.
>>
>> D) PROBLEM REMAINING:
>> To write another script that auto-triggers whenever I press `Ctrl-O` or `Ctrl-T` (as well as `Ctrl-I` or `Ctrl-]` for reverse direction) on Vim-help-buffers and which would then follow instructions 1) and 2) in the above Objective.
>
> "To write another script" is not a valid task: you will *never* look
> at bugs in your original script with this task. You need to formulate
> this as "keep the default behaviour of <C-o>/…, keeping currently
> viewed help buffer listed and others unlisted".

Note that if I thought this is a valid task I would suggest to map
<C-o> and friends to the code that

1. Calls `execute "noautocmd normal! \<C-o>"`: your autocmd comes in the way.
2. Runs

call map(range(1, bufnr('$')), 'bufexists(v:val) &&
getbufvar(v:val, "&buftype") is# "help" && setbufvar(v:val,
"&buflisted", v:val == bufnr("%"))')

. (By the way, this line does basically the same thing your big
`:if` does according to your explanations: it may be rewritten as

autocmd BufEnter,BufWinEnter *
\:if &buftype is# "help"
\| only
\| set invfoldenable
\| call map(range(1, bufnr('$')), 'bufexists(v:val) &&
getbufvar(v:val, "&buftype") is# "help" && setbufvar(v:val,
"&buflisted", v:val == ' . expand("<abuf>") . ')')
\|endif

(set invfoldenable is what `zi` does: I do not like the idea of
using :execute for whatever reason), with the difference that it sets
options for *all* help buffers and not only the current and previous
ones.)

I.e. instead of simplifying your setup you would do the opposite.

By the way, why you are using `set invfoldenable` and not setting this
option to some particular value?

>
>>
>> I appreciate any suggestions and assistance.
>>
>> Regards,
>> Annis Monadjem
>>
>> --
>> --
>> 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: