Thursday, August 29, 2019

Re: Mapping erases search count message

Am 29.08.2019 um 17:36 schrieb Christian Brabandt:
>
> On Do, 29 Aug 2019, Christian Brabandt wrote:
>
>>
>> On Di, 27 Aug 2019, Gary Johnson wrote:
>>
>>> On 2019-08-28, Christian Brabandt wrote:
>>>> On Di, 27 Aug 2019, Gary Johnson wrote:
>>>>
>>>>> I just tried exposing the search count message by removing 'S' from
>>>>> 'shortmess', but I couldn't see it. I discovered that it is hidden,
>>>>> erased and/or not updated by a couple of my mappings.
>>>>>
>>>>> nnoremap <silent> n nzv:call AdjCursor()<CR>
>>>>> nnoremap <silent> N Nzv:call AdjCursor()<CR>
>>>>>
>>>>> Here is a simple experiment that demonstrates the problem. Create
>>>>> a file, test.vim, that contains the following.
>>>>>
>>>>> set shortmess-=S
>>>>> nnoremap <silent> n n
>>>>> help map.txt
>>>>>
>>>>> Open a standard-sized, 80x24 terminal, and in it run
>>>>>
>>>>> $ vim -N -u NONE -i NONE -S test.vim
>>>>>
>>>>> Then search for "command":
>>>>>
>>>>> /command
>>>>>
>>>>> After hitting Enter, the cursor will be at the start of "commands"
>>>>> on line 7 and the command line will contain this:
>>>>>
>>>>> /command [1/>99]
>>>>>
>>>>> After hitting 'n', the cursor advances to line 13 and the command
>>>>> line stays the same, even showing "[1/>99]" when it should be
>>>>> showing "[2/>99]".
>>>>>
>>>>> Another 'n' advances the cursor to line 17, the screen scrolls
>>>>> up so that that line is at the bottom of the window, and the command
>>>>> line is empty--no search count message at all.
>>>>>
>>>>> I would think that <silent> would prevent the mapping from
>>>>> disturbing the command line, in which case this is a bug.
>>>>>
>>>>> If it's not a bug, then is there some way of defining a mapping that
>>>>> does not interfere with the search count message, or some way of
>>>>> restoring that message at the end of a mapping?
>>>>
>>>> Is that with patch 8.1.1288 included?
>>>
>>> Sorry, I forgot to include the version information. Yes, I used the
>>> latest version, 8.1.1933.
>>
>> Hm, I need to investigate.
>
> I see what is happening. A mapping with the `<silent>` flag will set the
> internal variable cmd_silent to prevent it from being output the command
> line. So what your mapping does is it acts like 'n' without outputting
> anything on the command line.
>
> But this is not what you want. You want the default behaviour of n,
> which does output the command to search + the new search index feature.
>
> (See the difference on the commandline between a plain `n` and a n
> mapped with `nnoremap <silent> n n`).
>
> So the obvious fix would be to remove the `<silent>` command. While this
> fixes your minimal test case, it most likely is no fix for your actual
> issue, that calling the AdjCursor() function will be output in the
> command line in addition (possibly overwriting the command line).
>
> What might work (depending on the complexity of your AdjCursor()
> function) is to use an expression mapping that simply returns 'n' after
> having done whatever action it needs to be doing. However, this might be
> a bit difficult since you want this to happen after the cursor has been
> placed.
>
> Another alternative might be a mapping like this:

This is what <script> mappings are for.

> nmap n nzv
> nnoremap <silent> zv zv:call AdjCursor()<cr>

:nmap n n<SID>(adj-cursor)
:nnoremap <silent> <SID>(adj-cursor) zv:call AdjCursor()<CR>


" first command can be written as:
:nmap <script> n n<SID>(adj-cursor)
:nnoremap <script> n n<SID>(adj-cursor)

--
Andy

--
--
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/vim_use/5D682DFC.2070903%40yahoo.de.

No comments: