WARNING: if you map <C-[> you may very well break any key codes that start
with Esc. Make sure it comes AFTER other mappings.
+Vim automatically detects if the modifyOtherKeys mode was enabled when it
+spots an escape sequence that must have been created by it. To see if Vim
+detected such an escape sequence use `:verbose map`, the first line will then
+show "Seen modifyOtherKeys: true" (possibly translated).
+
A known side effect is that in Insert mode the raw escape sequence is inserted
after the CTRL-V key. This can be used to check whether modifyOtherKeys is
enabled: In Insert mode type CTRL-SHIFT-V CTRL-V, if you get one byte then
return (char_u *)mapmode.ga_data;
}
+/*
+ * Output a line for one mapping.
+ */
static void
showmap(
mapblock_T *mp,
return OK;
}
+/*
+ * List mappings. When "haskey" is FALSE all mappings, otherwise mappings that
+ * match "keys[keys_len]".
+ */
+ static void
+list_mappings(
+ int keyround,
+ int abbrev,
+ int haskey,
+ char_u *keys,
+ int keys_len,
+ int mode,
+ int *did_local)
+{
+ if (p_verbose > 0 && keyround == 1 && seenModifyOtherKeys)
+ msg_puts(_("Seen modifyOtherKeys: true"));
+
+ // need to loop over all global hash lists
+ for (int hash = 0; hash < 256 && !got_int; ++hash)
+ {
+ mapblock_T *mp;
+
+ if (abbrev)
+ {
+ if (hash != 0) // there is only one abbreviation list
+ break;
+ mp = curbuf->b_first_abbr;
+ }
+ else
+ mp = curbuf->b_maphash[hash];
+ for ( ; mp != NULL && !got_int; mp = mp->m_next)
+ {
+ // check entries with the same mode
+ if (!mp->m_simplified && (mp->m_mode & mode) != 0)
+ {
+ if (!haskey) // show all entries
+ {
+ showmap(mp, TRUE);
+ *did_local = TRUE;
+ }
+ else
+ {
+ int n = mp->m_keylen;
+ if (STRNCMP(mp->m_keys, keys,
+ (size_t)(n < keys_len ? n : keys_len)) == 0)
+ {
+ showmap(mp, TRUE);
+ *did_local = TRUE;
+ }
+ }
+ }
+ }
+ }
+}
+
/*
* map[!] : show all key mappings
* map[!] {lhs} : show key mapping for {lhs}
int did_local = FALSE;
int keyround1_simplified = keyround == 1 && did_simplify;
int round;
- int hash;
- int new_hash;
if (keyround == 2)
{
&& haskey && hasarg && maptype != MAPTYPE_UNMAP)
{
// need to loop over all global hash lists
- for (hash = 0; hash < 256 && !got_int; ++hash)
+ for (int hash = 0; hash < 256 && !got_int; ++hash)
{
if (abbrev)
{
// When listing global mappings, also list buffer-local ones here.
if (map_table != curbuf->b_maphash && !hasarg
&& maptype != MAPTYPE_UNMAP)
- {
- // need to loop over all global hash lists
- for (hash = 0; hash < 256 && !got_int; ++hash)
- {
- if (abbrev)
- {
- if (hash != 0) // there is only one abbreviation list
- break;
- mp = curbuf->b_first_abbr;
- }
- else
- mp = curbuf->b_maphash[hash];
- for ( ; mp != NULL && !got_int; mp = mp->m_next)
- {
- // check entries with the same mode
- if (!mp->m_simplified && (mp->m_mode & mode) != 0)
- {
- if (!haskey) // show all entries
- {
- showmap(mp, TRUE);
- did_local = TRUE;
- }
- else
- {
- n = mp->m_keylen;
- if (STRNCMP(mp->m_keys, keys,
- (size_t)(n < len ? n : len)) == 0)
- {
- showmap(mp, TRUE);
- did_local = TRUE;
- }
- }
- }
- }
- }
- }
+ list_mappings(keyround, abbrev, haskey, keys, len,
+ mode, &did_local);
// Find an entry in the maphash[] list that matches.
// For :unmap we may loop two times: once to try to unmap an entry with
&& !did_it && !got_int; ++round)
{
// need to loop over all hash lists
- for (hash = 0; hash < 256 && !got_int; ++hash)
+ for (int hash = 0; hash < 256 && !got_int; ++hash)
{
if (abbrev)
{
// May need to put this entry into another hash
// list.
- new_hash = MAP_HASH(mp->m_mode, mp->m_keys[0]);
+ int new_hash = MAP_HASH(mp->m_mode, mp->m_keys[0]);
if (!abbrev && new_hash != hash)
{
*mpp = mp->m_next;