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.

View in manual

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");
}