Function: single-key-description
single-key-description is a function defined in keymap.c.
Signature
(single-key-description KEY &optional NO-ANGLES)
Documentation
Return a pretty description of a character event KEY.
Control characters turn into C-whatever, etc. Optional argument NO-ANGLES non-nil means don't put angle brackets around function keys and event symbols.
See text-char-description for describing character codes.
Probably introduced at or before Emacs version 21.1.
Source Code
// Defined in /usr/src/emacs/src/keymap.c
{
USE_SAFE_ALLOCA;
if (CONSP (key) && lucid_event_type_list_p (key))
key = Fevent_convert_list (key);
if (CONSP (key) && FIXNUMP (XCAR (key)) && FIXNUMP (XCDR (key)))
/* An interval from a map-char-table. */
{
AUTO_STRING (dot_dot, "..");
return concat3 (Fsingle_key_description (XCAR (key), no_angles),
dot_dot,
Fsingle_key_description (XCDR (key), no_angles));
}
key = EVENT_HEAD (key);
if (FIXNUMP (key)) /* Normal character. */
{
char tem[KEY_DESCRIPTION_SIZE];
char *p = push_key_description (XFIXNUM (key), tem);
*p = 0;
return make_specified_string (tem, -1, p - tem, 1);
}
else if (SYMBOLP (key)) /* Function key or event-symbol. */
{
if (NILP (no_angles))
{
Lisp_Object namestr = SYMBOL_NAME (key);
const char *sym = SSDATA (namestr);
ptrdiff_t len = SBYTES (namestr);
/* Find the extent of the modifier prefix, like "C-M-". */
int i = 0;
while (i < len - 3 && sym[i + 1] == '-' && strchr ("CMSsHA", sym[i]))
i += 2;
/* First I bytes of SYM are modifiers; put <> around the rest. */
char *buffer = SAFE_ALLOCA (len + 3);
memcpy (buffer, sym, i);
buffer[i] = '<';
memcpy (buffer + i + 1, sym + i, len - i);
buffer [len + 1] = '>';
buffer [len + 2] = '\0';
Lisp_Object result = build_string (buffer);
SAFE_FREE ();
return result;
}
else
return Fsymbol_name (key);
}
else if (STRINGP (key)) /* Buffer names in the menubar. */
return Fcopy_sequence (key);
else
error ("KEY must be an integer, cons, symbol, or string");
}