diff options
Diffstat (limited to 'autoload/digraph_search.vim')
-rw-r--r-- | autoload/digraph_search.vim | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/autoload/digraph_search.vim b/autoload/digraph_search.vim new file mode 100644 index 0000000..172b17c --- /dev/null +++ b/autoload/digraph_search.vim @@ -0,0 +1,75 @@ +" Search for digraphs +function! digraph_search#Search() abort + + " Get the search string + let l:search = input('Digraph search: ') + if !strlen(l:search) + return + endif + + " Look for the uppercased search in the table + let l:results = [] + for l:digraph in digraph_search#Digraphs() + if stridx(l:digraph['name'], toupper(l:search)) != -1 + call add(l:results, l:digraph) + endif + endfor + + " Print results, or if there weren't any, say so + redraw + echo 'Digraphs matching '.toupper(l:search).':' + if len(l:results) + for l:result in l:results + echo l:result['char'] + \.' '.l:result['keys'] + \.' '.l:result['name'] + endfor + else + echo 'None!' + endif + +endfunction + +" Get private memoized list of digraph dictionary objects +function! digraph_search#Digraphs() abort + + " We haven't been called yet; get the digraph list + if !exists('s:digraphs') + let s:digraphs = [] + let l:table = 0 + for l:line in readfile($VIMRUNTIME.'/doc/digraph.txt') + + " Flag whether we're in one of the digraph tables; look for the heading + let l:table = l:table && strlen(l:line) + \ || l:line =~# '\C\*digraph-table\%(-mbyte\)\=\*$' + " Skip to next line if not in a table + if !l:table + continue + endif + + " Check whether this row matches a parseable digraph row + let l:match = matchlist(l:line, + \ '^\(\S\)\+\s\+' + \ . '\(\S\S\)\s\+' + \ . '\%(0x\)\=\x\+\s\+' + \ . '\d\+\s\+' + \ . '\(.\+\)' + \ ) + " Skip to next line if not a table row match + if !len(l:match) + continue + endif + + " Add to the digraphs list; key is digraph, value is full name + call add(s:digraphs, { + \ 'char': l:match[1], + \ 'keys': l:match[2], + \ 'name': l:match[3], + \ }) + endfor + endif + + " Return the list, whether newly-generated or from the first call + return s:digraphs + +endfunction |