Monday, May 22, 2017

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

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}

Thanks,
Brett Stahlman

--
--
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: