view src/testdir/view_util.vim @ 34336:d2ad8733db75 v9.1.0101

patch 9.1.0101: upper-case of German sharp s should be U+1E9E Commit: https://github.com/vim/vim/commit/bd1232a1faf56b614a1e74c4ce51bc6e0650ae00 Author: glepnir <glephunter@gmail.com> Date: Mon Feb 12 22:14:53 2024 +0100 patch 9.1.0101: upper-case of German sharp s should be U+1E9E Problem: upper-case of ? should be U+1E9E (CAPITAL LETTER SHARP S) (fenuks) Solution: Make gU, ~ and g~ convert the U+00DF LATIN SMALL LETTER SHARP S (?) to U+1E9E LATIN CAPITAL LETTER SHARP S (?), update tests (glepnir) This is part of Unicode 5.1.0 from April 2008, so should be fairly safe to use now and since 2017 is part of the German standard orthography, according to Wikipedia: https://en.wikipedia.org/wiki/Capital_%E1%BA%9E#cite_note-auto-12 There is however one exception: UnicodeData.txt for U+00DF LATIN SMALL LETTER SHARP S does NOT define U+1E9E LATIN CAPITAL LETTER SHARP S as its upper case version. Therefore, toupper() won't be able to convert from lower sharp s to upper case sharp s (the other way around however works, since U+00DF is considered the lower case character of U+1E9E and therefore tolower() works correctly for the upper case version). fixes: #5573 closes: #14018 Signed-off-by: glepnir <glephunter@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Mon, 12 Feb 2024 22:45:02 +0100
parents 9fc3b3928ad5
children a20bd67056d7
line wrap: on
line source

" Functions about view shared by several tests

" Only load this script once.
if exists('*Screenline')
  finish
endif

" 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

" Get text on the screen, including composing characters.
" ScreenLines(lnum, width) or
" ScreenLines([start, end], width)
func ScreenLines(lnum, width) abort
  redraw!
  if type(a:lnum) == v:t_list
    let start = a:lnum[0]
    let end = a:lnum[1]
  else
    let start = a:lnum
    let end = a:lnum
  endif
  let lines = []
  for l in range(start, end)
    let lines += [join(map(range(1, a:width), 'screenstring(l, v:val)'), '')]
  endfor
  return lines
endfunc

func ScreenAttrs(lnum, width) abort
  redraw!
  if type(a:lnum) == v:t_list
    let start = a:lnum[0]
    let end = a:lnum[1]
  else
    let start = a:lnum
    let end = a:lnum
  endif
  let attrs = []
  for l in range(start, end)
    let attrs += [map(range(1, a:width), 'screenattr(l, v:val)')]
  endfor
  return attrs
endfunc

" Create a new window with the requested size and fix it.
func NewWindow(height, width) abort
  exe a:height . 'new'
  exe a:width . 'vsp'
  set winfixwidth winfixheight
  redraw!
endfunc

func CloseWindow() abort
  bw!
  redraw!
endfunc


" When using RunVimInTerminal() we expect modifyOtherKeys level 2 to be enabled
" automatically.  The key + modifier Escape codes must then use the
" modifyOtherKeys encoding.  They are recognized anyway, thus it's safer to use
" than the raw code.

" Return the modifyOtherKeys level 2 encoding for "key" with "modifier"
" (number value, e.g. CTRL is 5).
func GetEscCodeCSI27(key, modifier)
  let key = printf("%d", char2nr(a:key))
  let mod = printf("%d", a:modifier)
  return "\<Esc>[27;" .. mod .. ';' .. key .. '~'
endfunc

" Return the modifyOtherKeys level 2 encoding for "key" with "modifier"
" (character value, e.g. CTRL is "C").
func GetEscCodeWithModifier(modifier, key)
  let modifier = get({'C': 5}, a:modifier, '')
  if modifier == ''
    echoerr 'Unknown modifier: ' .. a:modifier
  endif
  return GetEscCodeCSI27(a:key, modifier)
endfunc

" Return the kitty keyboard protocol encoding for "key" with "modifier"
" (number value, e.g. CTRL is 5).
func GetEscCodeCSIu(key, modifier)
  let key = printf("%d", char2nr(a:key))
  let mod = printf("%d", a:modifier)
  return "\<Esc>[" .. key .. ';' .. mod .. 'u'
endfunc

" Return the kitty keyboard protocol encoding for a function key:
" CSI {key}
" CSS 1;{modifier} {key}
func GetEscCodeFunckey(key, modifier)
  if a:modifier == 0
    return "\<Esc>[" .. a:key
  endif

  let mod = printf("%d", a:modifier)
  return "\<Esc>[1;".. mod .. a:key
endfunc

" Return the kitty keyboard protocol encoding for "key" without a modifier.
" Used for the Escape key.
func GetEscCodeCSIuWithoutModifier(key)
  let key = printf("%d", char2nr(a:key))
  return "\<Esc>[" .. key .. 'u'
endfunc