2017-05-27 0:12 GMT+03:00 Nikolay Aleksandrovich Pavlov <zyx....@gmail.com>:
> 2017-05-26 20:43 GMT+03:00 Bram Moolenaar <b...@moolenaar.net>:
>>
>> Brett Stahlman wrote:
>>
>>> >> On Tuesday, May 23, 2017 at 8:25:33 AM UTC-5, Brett Stahlman wrote:
>>> >> > On Tue, May 23, 2017 at 4:35 AM, Bram Moolenaar <b...@moolenaar.net> 
>>> >> > wrote:
>>> >> > >
>>> >> > > Brett Stahlman wrote:
>>> >> > >
>>> >> %--snip--%
>>> >> > >
>>> >> > > The best solution is probably to also add the raw rhs, with the 
>>> >> > > terminal
>>> >> > > codes replaced.  This won't work when changing the terminal type, but
>>> >> > > that is very unlikely to happen.
>>> >> >
>>> >> > You mean adding a key such as "raw_rhs" to the dictionary returned by
>>> >> > maparg()? If so, then yes this would help, but there would still need 
>>> >> > to
>>> >> > be a way to determine lhs, which is currently even more ambiguous than
>>> >> > rhs. While it's true that I probably already have lhs if I'm calling
>>> >> > maparg(), I need a way to determine which lhs(s) is/are ambiguous with 
>>> >> > a
>>> >> > given lhs. Mapcheck() gives me only the rhs of the conflicting map. To
>>> >> > save and restore, I'd need to know the lhs in canonical form as well.
>>> >>
>>> >> Perhaps mapcheck() could take an optional arg requesting something more 
>>> >> than a simple boolean return. When called with this extra arg, 
>>> >> mapcheck() could return a conflicting/ambiguous lhs (or list thereof) in 
>>> >> some canonical format (possibly determined by the value of the extra arg 
>>> >> itself). As long as the format returned could be fed to maparg(), it 
>>> >> would be possible to find conflicting mappings, remove them temporarily, 
>>> >> and subsequently restore them...
>>> >
>>> > If you define a mapping you will want to know whether the mapping
>>> > already exists and needs to be restored.  For that you can use maparg(),
>>> > no need to use mapcheck().
>>> >
>>> > Not sure why you would want to remove "conflicting" mappings. Perhaps
>>> > when you map the ; key, and the user has ;x mapped?  Then you would need
>>> > a list.  Adding a maplist() function would be better than adding
>>> > arguments to mapcheck().
>>>
>>> Yes. Very much like that. I'm implementing a sort of transient mode, in
>>> which I'll "shadow" existing maps with very short (generally single
>>> character) mappings, which are expected to be ambiguous/conflicting with
>>> existing maps, and even builtin operators. Of course, when I exit the
>>> transient mode, I'd need to restore the mappings that were shadowed.
>>>
>>> The global and builtin maps are not a problem, since the transient maps use
>>> <buffer> and <nowait>; however, without parsing the output of one of the 
>>> :map
>>> functions, I have no way of knowing which buf-local mappings will be 
>>> ambiguous
>>> with the transient maps I'm defining. And parsing the :map output is
>>> problematic for the reasons already mentioned: e.g., no way to tell the
>>> difference between function key <F8> and the corresponding 4 characters. I'd
>>> actually considered taking some sort of iterative approach: e.g., trying all
>>> possible permutations of lhs as input to maparg() and testing the results, 
>>> in
>>> an attempt to deduce the canonical form, but this would be extremely messy,
>>> and I don't even know whether it would be deterministic... The maplist()
>>> function you mentioned, if it returned all ambiguous left hand sides in
>>> canonical form, or even a list of the corresponding maparg()-style
>>> dictionaries, would be perfect. Of course, there would also need to be a way
>>> to get the rhs's canonical form: e.g., the extra "raw_rhs" key in the 
>>> maparg()
>>> or maplist() dictionary.
>>
>> OK, so for this you would use maplist() to get the list of mappings to
>> disable, use maparg() to get the current mapping, clear the mapping, do
>> your stuff, then restore the cleared mappings.  You then need to make
>> sure you restore the mappings exactly as they were, even when your
>> "stuff" fails miserably.
>>
>> It's a lot easier if we would have a way to temporarily disable
>> mappings.  It's mostly the same as above, but you won't need to use
>> maparg() to get the current mapping and the restore operation.  Instead
>> you would disable instead of clear, and later re-enable instead of
>> restore.  Still need to make sure the re-enbling does happen, no change
>> in that part.
>
> Not sure I understood what exactly you suggest to disable/restore. All
> mappings at once with one command? I would actually disagree here: I
> need something similar for translit3, but it only remaps
> single-character mappings, leaving most of other user mappings alone.
> One mapping at a time? It would be good, but given that request is
> temporary remapping naming the functionality enable/disable looks
> strange. And there are still issues with determining {lhs}.
>
> One of the logical variants would be `:map <push> {lhs}
> {new-rhs}`/`:unmap <push> {lhs}`+`:map <pop> {lhs}`, but this is hard
> to implement and is rather limited, though less limited then
> enable/disable everything variant.
>
> I would instead suggest a function mappings_dump()/mappings_add():
> first is similar to `nvim[_buf]_get_keymap` and should dump all
> mappings as a list of maparg()-like dictionaries. Second should define
> mappings being given a list of them. Of course, this means that
> dictionaries need to be fixed to allow correctly saving/restoring.
>
> The advantages:
>
> 1. Easier to implement. Code for creating a maparg() dictionary is
> already there, iterating over all mappings is not a problem. Results
> needs to be incompatible with maparg() or use additional keys though:
> e.g. Neovim altered the contents of `noremap` and `buffer` keys: first
> is now 0, 1 or 2 (you can’t correctly restore a mapping if you can’t
> distinguish `map <script>` and `noremap`) and second is a buffer
> number or zero.
> 2. More flexible: you can save and restore everything, push or pop
> individual mappings, create a temporary mapping which is just like
> mapping X, but has `<Plug>(Translit3TemporaryMap)` lhs instead (to be
> returned from `<expr>` mappings in order to select either plugin
> behaviour or fall back to previously present user mapping instead).
>
>    I can imagine other usages enable/disable or push/pop could not
> achieve: generating configuration with mappings like :mkvimrc, but
> allows doing adjustments (parsing `:mkvimrc` output is not fun,
> especially if you want to be forward compatible), creating a plugin
> which analyses how often different mappings are used (need to copy all
> mappings to temporary then replace existing mappings with plugin
> ones).

BTW, when we come at it: is not there *already* a code which gets lhs
and rhs in determenistic format for `:mkvimrc`? It should be possible
to just reuse it.

> 3. This is also forward compatible: just need to state in the
> documentation that new significant keys may be added in the future to
> the dictionaries so they should be preserved.
>
>>
>> Big advantage is that if we evern add functionality to mappings, it will
>> keep working, while your save/restore pair probably fails.
>>
>> Ah, your later post goes in the same direction.
>>
>> --
>> DENNIS: Look,  strange women lying on their backs in ponds handing out
>>         swords ... that's no basis for a system of government.  Supreme
>>         executive power derives from a mandate from the masses, not from some
>>         farcical aquatic ceremony.
>>                  "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES 
>> LTD
>>
>>  /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
>> ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
>> \\\  an exciting new programming language -- http://www.Zimbu.org        ///
>>  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
>>
>> --
>> --
>> 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+unsubscr...@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+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to