1
0
forked from aniani/vim

patch 8.0.1553: cannot see what digraph is used to insert a character

Problem:    Cannot see what digraph is used to insert a character.
Solution:   Show the digraph with the "ga" command. (Christian Brabandt)
This commit is contained in:
Bram Moolenaar 2018-02-27 21:09:30 +01:00
parent 8195247054
commit 5f73ef8d20
10 changed files with 132 additions and 53 deletions

View File

@ -1,4 +1,4 @@
*various.txt* For Vim version 8.0. Last change: 2018 Feb 25 *various.txt* For Vim version 8.0. Last change: 2018 Feb 27
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -40,23 +40,35 @@ CTRL-L Clear and redraw the screen. The redraw may happen
:as[cii] or *ga* *:as* *:ascii* :as[cii] or *ga* *:as* *:ascii*
ga Print the ascii value of the character under the ga Print the ascii value of the character under the
cursor in decimal, hexadecimal and octal. For cursor in decimal, hexadecimal and octal.
example, when the cursor is on a 'R': Mnemonic: Get Ascii value.
For example, when the cursor is on a 'R':
<R> 82, Hex 52, Octal 122 ~ <R> 82, Hex 52, Octal 122 ~
When the character is a non-standard ASCII character, When the character is a non-standard ASCII character,
but printable according to the 'isprint' option, the but printable according to the 'isprint' option, the
non-printable version is also given. When the non-printable version is also given.
character is larger than 127, the <M-x> form is also
printed. For example: When the character is larger than 127, the <M-x> form
is also printed. For example:
<~A> <M-^A> 129, Hex 81, Octal 201 ~ <~A> <M-^A> 129, Hex 81, Octal 201 ~
<p> <|~> <M-~> 254, Hex fe, Octal 376 ~ <p> <|~> <M-~> 254, Hex fe, Octal 376 ~
(where <p> is a special character) (where <p> is a special character)
The <Nul> character in a file is stored internally as The <Nul> character in a file is stored internally as
<NL>, but it will be shown as: <NL>, but it will be shown as:
<^@> 0, Hex 00, Octal 000 ~ <^@> 0, Hex 00, Octal 000 ~
If the character has composing characters these are If the character has composing characters these are
also shown. The value of 'maxcombine' doesn't matter. also shown. The value of 'maxcombine' doesn't matter.
Mnemonic: Get Ascii value. {not in Vi}
If the character can be inserted as a digraph, also
output the two characters that can be used to create
the character:
<ö> 246, Hex 00f6, Oct 366, Digr o: ~
This shows you can type CTRL-K o : to insert ö.
{not in Vi}
*g8* *g8*
g8 Print the hex values of the bytes used in the g8 Print the hex values of the bytes used in the

View File

@ -1974,6 +1974,41 @@ do_digraph(int c)
return c; return c;
} }
/*
* Find a digraph for "val". If found return the string to display it.
* If not found return NULL.
*/
char_u *
get_digraph_for_char(val)
int val;
{
int i;
int use_defaults;
digr_T *dp;
static char_u r[3];
for (use_defaults = 0; use_defaults <= 1; use_defaults++)
{
if (use_defaults == 0)
dp = (digr_T *)user_digraphs.ga_data;
else
dp = digraphdefault;
for (i = 0; use_defaults ? dp->char1 != NUL
: i < user_digraphs.ga_len; ++i)
{
if (dp->result == val)
{
r[0] = dp->char1;
r[1] = dp->char2;
r[2] = NUL;
return r;
}
++dp;
}
}
return NULL;
}
/* /*
* Get a digraph. Used after typing CTRL-K on the command line or in normal * Get a digraph. Used after typing CTRL-K on the command line or in normal
* mode. * mode.

View File

@ -49,6 +49,9 @@ do_ascii(exarg_T *eap UNUSED)
char buf1[20]; char buf1[20];
char buf2[20]; char buf2[20];
char_u buf3[7]; char_u buf3[7];
#ifdef FEAT_DIGRAPHS
char_u *dig;
#endif
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
int cc[MAX_MCO]; int cc[MAX_MCO];
int ci = 0; int ci = 0;
@ -94,7 +97,15 @@ do_ascii(exarg_T *eap UNUSED)
else else
#endif #endif
buf2[0] = NUL; buf2[0] = NUL;
vim_snprintf((char *)IObuff, IOSIZE, #ifdef FEAT_DIGRAPHS
dig = get_digraph_for_char(cval);
if (dig != NULL)
vim_snprintf((char *)IObuff, IOSIZE,
_("<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"),
transchar(c), buf1, buf2, cval, cval, cval, dig);
else
#endif
vim_snprintf((char *)IObuff, IOSIZE,
_("<%s>%s%s %d, Hex %02x, Octal %03o"), _("<%s>%s%s %d, Hex %02x, Octal %03o"),
transchar(c), buf1, buf2, cval, cval, cval); transchar(c), buf1, buf2, cval, cval, cval);
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
@ -121,9 +132,19 @@ do_ascii(exarg_T *eap UNUSED)
) )
IObuff[len++] = ' '; /* draw composing char on top of a space */ IObuff[len++] = ' '; /* draw composing char on top of a space */
len += (*mb_char2bytes)(c, IObuff + len); len += (*mb_char2bytes)(c, IObuff + len);
vim_snprintf((char *)IObuff + len, IOSIZE - len, #ifdef FEAT_DIGRAPHS
c < 0x10000 ? _("> %d, Hex %04x, Octal %o") dig = get_digraph_for_char(c);
: _("> %d, Hex %08x, Octal %o"), c, c, c); if (dig != NULL)
vim_snprintf((char *)IObuff + len, IOSIZE - len,
c < 0x10000 ? _("> %d, Hex %04x, Oct %o, Digr %s")
: _("> %d, Hex %08x, Oct %o, Digr %s"),
c, c, c, dig);
else
#endif
vim_snprintf((char *)IObuff + len, IOSIZE - len,
c < 0x10000 ? _("> %d, Hex %04x, Octal %o")
: _("> %d, Hex %08x, Octal %o"),
c, c, c);
if (ci == MAX_MCO) if (ci == MAX_MCO)
break; break;
if (enc_utf8) if (enc_utf8)

View File

@ -1,5 +1,6 @@
/* digraph.c */ /* digraph.c */
int do_digraph(int c); int do_digraph(int c);
char_u *get_digraph_for_char(int val);
int get_digraph(int cmdline); int get_digraph(int cmdline);
int getdigraph(int char1, int char2, int meta_char); int getdigraph(int char1, int char2, int meta_char);
void putdigraph(char_u *str); void putdigraph(char_u *str);

View File

@ -259,3 +259,14 @@ endfunc
func CanRunGui() func CanRunGui()
return has('gui') && ($DISPLAY != "" || has('gui_running')) return has('gui') && ($DISPLAY != "" || has('gui_running'))
endfunc endfunc
" Get line "lnum" as displayed on the screen.
" Trailing white space is trimmed.
func! Screenline(lnum)
let chars = []
for c in range(1, winwidth(0))
call add(chars, nr2char(screenchar(a:lnum, c)))
endfor
let line = join(chars, '')
return matchstr(line, '^.\{-}\ze\s*$')
endfunc

View File

@ -16,9 +16,9 @@ func s:get_chars(lnum)
let numchars = strchars(getline('.'), 1) let numchars = strchars(getline('.'), 1)
for i in range(1, numchars) for i in range(1, numchars)
exe 'norm ' i . '|' exe 'norm ' i . '|'
let c=execute('ascii') let c = execute('ascii')
let c=substitute(c, '\n\?<.\{-}Hex\s*', 'U+', 'g') let c = substitute(c, '\n\?<.\{-}Hex\s*', 'U+', 'g')
let c=substitute(c, ',\s*Octal\s*\d*', '', 'g') let c = substitute(c, ',\s*Oct\(al\)\=\s\d*\(, Digr ..\)\=', '', 'g')
call add(chars, c) call add(chars, c)
endfor endfor
return chars return chars

View File

@ -4,15 +4,15 @@ if !has("digraphs") || !has("multi_byte")
finish finish
endif endif
func! Put_Dig(chars) func Put_Dig(chars)
exe "norm! o\<c-k>".a:chars exe "norm! o\<c-k>".a:chars
endfu endfu
func! Put_Dig_BS(char1, char2) func Put_Dig_BS(char1, char2)
exe "norm! o".a:char1."\<bs>".a:char2 exe "norm! o".a:char1."\<bs>".a:char2
endfu endfu
func! Test_digraphs() func Test_digraphs()
new new
call Put_Dig("00") call Put_Dig("00")
call assert_equal("∞", getline('.')) call assert_equal("∞", getline('.'))
@ -214,7 +214,7 @@ func! Test_digraphs()
bw! bw!
endfunc endfunc
func! Test_digraphs_option() func Test_digraphs_option()
" reset whichwrap option, so that testing <esc><bs>A works, " reset whichwrap option, so that testing <esc><bs>A works,
" without moving up a line " without moving up a line
set digraph ww= set digraph ww=
@ -420,7 +420,7 @@ func! Test_digraphs_option()
bw! bw!
endfunc endfunc
func! Test_digraphs_output() func Test_digraphs_output()
new new
let out = execute(':digraph') let out = execute(':digraph')
call assert_equal('Eu € 8364', matchstr(out, '\C\<Eu\D*8364\>')) call assert_equal('Eu € 8364', matchstr(out, '\C\<Eu\D*8364\>'))
@ -436,7 +436,7 @@ func! Test_digraphs_output()
bw! bw!
endfunc endfunc
func! Test_loadkeymap() func Test_loadkeymap()
if !has('keymap') if !has('keymap')
return return
endif endif
@ -450,7 +450,7 @@ func! Test_loadkeymap()
bw! bw!
endfunc endfunc
func! Test_digraph_cmndline() func Test_digraph_cmndline()
" Create digraph on commandline " Create digraph on commandline
" This is a hack, to let Vim create the digraph in commandline mode " This is a hack, to let Vim create the digraph in commandline mode
let s = '' let s = ''
@ -458,4 +458,11 @@ func! Test_digraph_cmndline()
call assert_equal("€", s) call assert_equal("€", s)
endfunc endfunc
func Test_show_digraph()
new
call Put_Dig("e=")
call assert_equal("\n<е> 1077, Hex 0435, Oct 2065, Digr e=", execute('ascii'))
bwipe!
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@ -11,13 +11,13 @@ func Test_ga_command()
new new
set display=uhex set display=uhex
call assert_equal("\nNUL", Do_ga('')) call assert_equal("\nNUL", Do_ga(''))
call assert_equal("\n<<01>> 1, Hex 01, Octal 001", Do_ga("\x01")) call assert_equal("\n<<01>> 1, Hex 01, Oct 001, Digr SH", Do_ga("\x01"))
call assert_equal("\n<<09>> 9, Hex 09, Octal 011", Do_ga("\t")) call assert_equal("\n<<09>> 9, Hex 09, Oct 011, Digr HT", Do_ga("\t"))
set display= set display=
call assert_equal("\nNUL", Do_ga('')) call assert_equal("\nNUL", Do_ga(''))
call assert_equal("\n<^A> 1, Hex 01, Octal 001", Do_ga("\x01")) call assert_equal("\n<^A> 1, Hex 01, Oct 001, Digr SH", Do_ga("\x01"))
call assert_equal("\n<^I> 9, Hex 09, Octal 011", Do_ga("\t")) call assert_equal("\n<^I> 9, Hex 09, Oct 011, Digr HT", Do_ga("\t"))
call assert_equal("\n<e> 101, Hex 65, Octal 145", Do_ga('e')) call assert_equal("\n<e> 101, Hex 65, Octal 145", Do_ga('e'))
@ -26,8 +26,8 @@ func Test_ga_command()
endif endif
" Test a few multi-bytes characters. " Test a few multi-bytes characters.
call assert_equal("\n<é> 233, Hex 00e9, Octal 351", Do_ga('é')) call assert_equal("\n<é> 233, Hex 00e9, Oct 351, Digr e'", Do_ga('é'))
call assert_equal("\n<ẻ> 7867, Hex 1ebb, Octal 17273", Do_ga('ẻ')) call assert_equal("\n<ẻ> 7867, Hex 1ebb, Oct 17273, Digr e2", Do_ga('ẻ'))
" Test with combining characters. " Test with combining characters.
call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401", Do_ga("e\u0301")) call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401", Do_ga("e\u0301"))

View File

@ -7,17 +7,7 @@ if !has('gui_running') && has('unix')
set term=ansi set term=ansi
endif endif
function! s:screenline(lnum) abort source shared.vim
let line = []
for c in range(1, winwidth(0))
call add(line, nr2char(screenchar(a:lnum, c)))
endfor
return s:trim(join(line, ''))
endfunction
function! s:trim(str) abort
return matchstr(a:str,'^\s*\zs.\{-}\ze\s*$')
endfunction
function! Test_simple_matchadd() function! Test_simple_matchadd()
new new
@ -30,7 +20,7 @@ function! Test_simple_matchadd()
call matchadd('Conceal', '\%2l ') call matchadd('Conceal', '\%2l ')
redraw! redraw!
let lnum = 2 let lnum = 2
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
@ -53,7 +43,7 @@ function! Test_simple_matchadd_and_conceal()
call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'}) call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'})
redraw! redraw!
let lnum = 2 let lnum = 2
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
@ -79,7 +69,7 @@ function! Test_matchadd_and_conceallevel_3()
call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'}) call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'})
redraw! redraw!
let lnum = 2 let lnum = 2
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
@ -92,7 +82,7 @@ function! Test_matchadd_and_conceallevel_3()
call matchadd('ErrorMsg', '\%2l Test', 20, -1, {'conceal': 'X'}) call matchadd('ErrorMsg', '\%2l Test', 20, -1, {'conceal': 'X'})
redraw! redraw!
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2) , screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2) , screenattr(lnum, 7))
call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 10)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 10))
@ -116,7 +106,7 @@ function! Test_default_conceal_char()
call matchadd('Conceal', '\%2l ', 10, -1, {}) call matchadd('Conceal', '\%2l ', 10, -1, {})
redraw! redraw!
let lnum = 2 let lnum = 2
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
@ -129,7 +119,7 @@ function! Test_default_conceal_char()
set listchars=conceal:+ set listchars=conceal:+
redraw! redraw!
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
@ -153,7 +143,7 @@ function! Test_syn_and_match_conceal()
syntax match MyConceal /\%2l / conceal containedin=ALL cchar=* syntax match MyConceal /\%2l / conceal containedin=ALL cchar=*
redraw! redraw!
let lnum = 2 let lnum = 2
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
@ -165,7 +155,7 @@ function! Test_syn_and_match_conceal()
call clearmatches() call clearmatches()
redraw! redraw!
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
@ -191,7 +181,7 @@ function! Test_clearmatches()
redraw! redraw!
let lnum = 2 let lnum = 2
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
@ -204,7 +194,7 @@ function! Test_clearmatches()
call setmatches(a) call setmatches(a)
redraw! redraw!
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7))
call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10))
@ -232,7 +222,7 @@ function! Test_using_matchaddpos()
redraw! redraw!
let lnum = 2 let lnum = 2
call assert_equal(expect, s:screenline(lnum)) call assert_equal(expect, Screenline(lnum))
call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 2))
call assert_notequal(screenattr(lnum, 2) , screenattr(lnum, 7)) call assert_notequal(screenattr(lnum, 2) , screenattr(lnum, 7))
call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 7))
@ -254,13 +244,13 @@ function! Test_matchadd_repeat_conceal_with_syntax_off()
1put ='TARGET_TARGETTARGET' 1put ='TARGET_TARGETTARGET'
call cursor(1, 1) call cursor(1, 1)
redraw redraw
call assert_equal('TARGET_TARGETTARGET', s:screenline(2)) call assert_equal('TARGET_TARGETTARGET', Screenline(2))
setlocal conceallevel=2 setlocal conceallevel=2
call matchadd('Conceal', 'TARGET', 10, -1, {'conceal': 't'}) call matchadd('Conceal', 'TARGET', 10, -1, {'conceal': 't'})
redraw redraw
call assert_equal('t_tt', s:screenline(2)) call assert_equal('t_tt', Screenline(2))
quit! quit!
endfunction endfunction
@ -276,13 +266,13 @@ function! Test_matchadd_and_syn_conceal()
syntax on syntax on
syntax keyword coqKwd bool conceal cchar=- syntax keyword coqKwd bool conceal cchar=-
redraw! redraw!
call assert_equal(expect, s:screenline(1)) call assert_equal(expect, Screenline(1))
call assert_notequal(screenattr(1, 10) , screenattr(1, 11)) call assert_notequal(screenattr(1, 10) , screenattr(1, 11))
call assert_notequal(screenattr(1, 11) , screenattr(1, 12)) call assert_notequal(screenattr(1, 11) , screenattr(1, 12))
call assert_equal(screenattr(1, 11) , screenattr(1, 32)) call assert_equal(screenattr(1, 11) , screenattr(1, 32))
call matchadd('CheckedByCoq', '\%<2l\%>9c\%<16c') call matchadd('CheckedByCoq', '\%<2l\%>9c\%<16c')
redraw! redraw!
call assert_equal(expect, s:screenline(1)) call assert_equal(expect, Screenline(1))
call assert_notequal(screenattr(1, 10) , screenattr(1, 11)) call assert_notequal(screenattr(1, 10) , screenattr(1, 11))
call assert_notequal(screenattr(1, 11) , screenattr(1, 12)) call assert_notequal(screenattr(1, 11) , screenattr(1, 12))
call assert_equal(screenattr(1, 11) , screenattr(1, 32)) call assert_equal(screenattr(1, 11) , screenattr(1, 32))

View File

@ -778,6 +778,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1553,
/**/ /**/
1552, 1552,
/**/ /**/