Tuesday, May 23, 2017

Re: Bug/non-determinism in output of maparg() and map commands

Brett Stahlman wrote:

> I would like to be able to save and restore mappings programmatically. In
> order to do so, however, I need to be able to determine the exact lhs and
> rhs used to create the mapping. I had assumed the lhs/rhs members of the
> dictionary returned by maparg() would provided this information, but as the
> simple example below illustrates, it does not. The problem is that both the
> 4 character mapping...
> "<F7>"
> ...and the single character function key mapping produce the same output
> for maparg()['lhs'] and `nmap <buffer>'. (The nmap output does at least
> colorize the function key, but the text output is identical.) The 'rhs'
> member seems to be treated slightly differently, but still inconsistently:
> in particular, for the maps created under default 'cpo', 'rhs' looks
> correct, but for <F9> (created with '<' in 'cpo'), it looks wrong. I
> suspect what's happening is that 'rhs' is always reporting exactly what was
> typed, but since in the general case I have no way of knowing what 'cpo'
> was in effect when the map was created, this isn't very helpful.
>
> Is there a programmatic way to determine lhs and rhs in some sort of
> canonical form? Also helpful would be if hasmapto() (or something like it)
> told you exactly which lhs was mapped to the specified rhs. (I realize
> there could be more than one, since hasmapto() doesn't require an exact
> match, but there's a similar situation with mapcheck(), and it just picks
> one mapping to return, which can be useful in certain use cases.) More
> generally, it seems there should be some way to determine a list of lhs
> from a given rhs...
>
> -- Test commands --
> set cpo&
> nmap <buffer> <F7> <F7>
> nmap <buffer> <lt>F8> <lt>F8>
> set cpo+=<
> nmap <buffer> <F9> <F9>
> set cpo&
>
> -- Output of nmap and maparg --
> nmap <buffer>
> n <F9> @<F9>
> n <F8> @<F8>
> n <F7> @<F7>
>
> echo maparg('<F7>', 'n', 0, 1)
> {'silent': 0, 'noremap': 0, 'lhs': '<F7>', 'mode': 'n', 'nowait': 0,
> 'expr': 0, 'sid': 66, 'rhs': '<F7>', 'buffer': 1}
> echo maparg('<lt>F8>', 'n', 0, 1)
> {'silent': 0, 'noremap': 0, 'lhs': '<F8>', 'mode': 'n', 'nowait': 0,
> 'expr': 0, 'sid': 66, 'rhs': '<lt>F8>', 'buffer': 1}
> echo maparg('<lt>F9>', 'n', 0, 1)
> {'silent': 0, 'noremap': 0, 'lhs': '<F9>', 'mode': 'n', 'nowait': 0,
> 'expr': 0, 'sid': 66, 'rhs': '<F9>', 'buffer': 1}

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.

--
ARTHUR: The swallow may fly south with the sun, or the house martin or the
plover seek warmer hot lands in winter, yet these are not strangers to
our land.
SOLDIER: Are you suggesting coconuts migrate?
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

/// Bram Moolenaar -- Bram@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+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments: