diff options
| author | Kenichi Handa | 1999-02-24 02:31:57 +0000 |
|---|---|---|
| committer | Kenichi Handa | 1999-02-24 02:31:57 +0000 |
| commit | 9fb7129305282105e748b41d7c23ff0d319a2e73 (patch) | |
| tree | ac2ee7a6c62038dde1cf26c7b5af450d11b5b1fa /src | |
| parent | 75c44f31defb196c1920a39ae79cf5a843b72bbf (diff) | |
| download | emacs-9fb7129305282105e748b41d7c23ff0d319a2e73.tar.gz emacs-9fb7129305282105e748b41d7c23ff0d319a2e73.zip | |
(push_key_description): If enable-multibyte-characters
is non-nil, try to convert unibyte character to multibyte. For
invalid multibyte character, show all bits by octal form.
(Fsingle_key_description): Check the varidity of charset for a
generic character.
Diffstat (limited to 'src')
| -rw-r--r-- | src/keymap.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/keymap.c b/src/keymap.c index caf4300187f..865e8dd3202 100644 --- a/src/keymap.c +++ b/src/keymap.c | |||
| @@ -1845,26 +1845,38 @@ push_key_description (c, p) | |||
| 1845 | *p++ = 'L'; | 1845 | *p++ = 'L'; |
| 1846 | } | 1846 | } |
| 1847 | else if (c == ' ') | 1847 | else if (c == ' ') |
| 1848 | { | 1848 | { |
| 1849 | *p++ = 'S'; | 1849 | *p++ = 'S'; |
| 1850 | *p++ = 'P'; | 1850 | *p++ = 'P'; |
| 1851 | *p++ = 'C'; | 1851 | *p++ = 'C'; |
| 1852 | } | 1852 | } |
| 1853 | else if (c < 128) | 1853 | else if (c < 128) |
| 1854 | *p++ = c; | 1854 | *p++ = c; |
| 1855 | else if (c < 512) | ||
| 1856 | { | ||
| 1857 | *p++ = '\\'; | ||
| 1858 | *p++ = (7 & (c >> 6)) + '0'; | ||
| 1859 | *p++ = (7 & (c >> 3)) + '0'; | ||
| 1860 | *p++ = (7 & (c >> 0)) + '0'; | ||
| 1861 | } | ||
| 1862 | else | 1855 | else |
| 1863 | { | 1856 | { |
| 1864 | unsigned char work[4], *str; | 1857 | if (! NILP (current_buffer->enable_multibyte_characters)) |
| 1865 | int i = CHAR_STRING (c, work, str); | 1858 | c = unibyte_char_to_multibyte (c); |
| 1866 | bcopy (str, p, i); | 1859 | |
| 1867 | p += i; | 1860 | if (NILP (current_buffer->enable_multibyte_characters) |
| 1861 | || SINGLE_BYTE_CHAR_P (c) | ||
| 1862 | || ! char_valid_p (c, 0)) | ||
| 1863 | { | ||
| 1864 | int bit_offset; | ||
| 1865 | *p++ = '\\'; | ||
| 1866 | /* The biggest character code uses 19 bits. */ | ||
| 1867 | for (bit_offset = 18; bit_offset >= 0; bit_offset -= 3) | ||
| 1868 | { | ||
| 1869 | if (c >= (1 << bit_offset)) | ||
| 1870 | *p++ = ((c & (7 << bit_offset)) >> bit_offset) + '0'; | ||
| 1871 | } | ||
| 1872 | } | ||
| 1873 | else | ||
| 1874 | { | ||
| 1875 | unsigned char work[4], *str; | ||
| 1876 | int i = CHAR_STRING (c, work, str); | ||
| 1877 | bcopy (str, p, i); | ||
| 1878 | p += i; | ||
| 1879 | } | ||
| 1868 | } | 1880 | } |
| 1869 | 1881 | ||
| 1870 | return p; | 1882 | return p; |
| @@ -1894,6 +1906,7 @@ Control characters turn into C-whatever, etc.") | |||
| 1894 | SPLIT_NON_ASCII_CHAR (without_bits, charset, c1, c2); | 1906 | SPLIT_NON_ASCII_CHAR (without_bits, charset, c1, c2); |
| 1895 | 1907 | ||
| 1896 | if (charset | 1908 | if (charset |
| 1909 | && CHARSET_DEFINED_P (charset) | ||
| 1897 | && ((c1 >= 0 && c1 < 32) | 1910 | && ((c1 >= 0 && c1 < 32) |
| 1898 | || (c2 >= 0 && c2 < 32))) | 1911 | || (c2 >= 0 && c2 < 32))) |
| 1899 | { | 1912 | { |