diff options
author | Kim F. Storm <storm@cua.dk> | 2005-09-09 11:55:09 +0000 |
---|---|---|
committer | Kim F. Storm <storm@cua.dk> | 2005-09-09 11:55:09 +0000 |
commit | a1d3a18846b6e5f0bb4da5442075867027727afe (patch) | |
tree | d67a858179ae8fe3598dc9176cfd893a86dffd34 /src/doc.c | |
parent | 39cac6b3ea85c0553c95a8d24ed1f12099a71683 (diff) | |
download | emacs-a1d3a18846b6e5f0bb4da5442075867027727afe.tar.gz emacs-a1d3a18846b6e5f0bb4da5442075867027727afe.tar.bz2 emacs-a1d3a18846b6e5f0bb4da5442075867027727afe.zip |
(Fsubstitute_command_keys): Lookup key binding for
commands that are remapped from some other command.
Diffstat (limited to 'src/doc.c')
-rw-r--r-- | src/doc.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/doc.c b/src/doc.c index 6d54aeceacd..a31c53d5b21 100644 --- a/src/doc.c +++ b/src/doc.c @@ -57,6 +57,8 @@ static Lisp_Object Vbuild_files; extern Lisp_Object Voverriding_local_map; +extern Lisp_Object Qremap; + /* For VMS versions with limited file name syntax, convert the name to something VMS will allow. */ static void @@ -812,6 +814,7 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int else if (strp[0] == '\\' && strp[1] == '[') { int start_idx; + int follow_remap = 1; changed = 1; strp += 2; /* skip \[ */ @@ -830,11 +833,21 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int idx = strp - SDATA (string); name = Fintern (make_string (start, length_byte), Qnil); + do_remap: /* Ignore remappings unless there are no ordinary bindings. */ tem = Fwhere_is_internal (name, keymap, Qt, Qnil, Qt); if (NILP (tem)) tem = Fwhere_is_internal (name, keymap, Qt, Qnil, Qnil); + if (VECTORP (tem) && XVECTOR (tem)->size > 1 + && EQ (AREF (tem, 0), Qremap) && SYMBOLP (AREF (tem, 1)) + && follow_remap) + { + name = AREF (tem, 1); + follow_remap = 0; + goto do_remap; + } + /* Note the Fwhere_is_internal can GC, so we have to take relocation of string contents into account. */ strp = SDATA (string) + idx; |