Unicode completion plugin.
[profile.git] / .vim / autoload / unicode.vim
1 " unicodePlugin : A completion plugin for Unicode glyphs
2 " Author: C.Brabandt <cb@256bit.org>
3 " Version: 0.17
4 " Copyright: (c) 2009 by Christian Brabandt
5 "                        The VIM LICENSE applies to unicode.vim, and unicode.txt
6 "                        (see |copyright|) except use "unicode" instead of "Vim".
7 "                        No warranty, express or implied.
8 "  *** ***       Use At-Your-Own-Risk!   *** ***
9 "
10 " GetLatestVimScripts: 2822 17 :AutoInstall: unicode.vim
11
12 " ---------------------------------------------------------------------
13
14
15 if exists("g:unicode_URL")
16         let s:unicode_URL=g:unicode_URL
17 else
18         "let s:unicode_URL='http://www.unicode.org/Public/UNIDATA/Index.txt'
19         let s:unicode_URL='http://www.unicode.org/Public/UNIDATA/UnicodeData.txt'
20 endif
21 if !exists("g:UnicodeShowPreviewWindow")
22         let g:UnicodeShowPreviewWindow = 0
23 endif
24
25 " HTML entitities
26 let s:html = {}
27 let s:html[0x0022] = "&quot;"
28 let s:html[0x0026] = "&amp;"
29 let s:html[0x0027] = "&apos;"
30 let s:html[0x003C] = "&lt;"
31 let s:html[0x003E] = "&gt;"
32 let s:html[0x0022] = "&quot;"
33 let s:html[0x0026] = "&amp;"
34 let s:html[0x0027] = "&apos;"
35 let s:html[0x003C] = "&lt;"
36 let s:html[0x003E] = "&gt;"
37 let s:html[0x00A0] = "&nbsp;"
38 let s:html[0x00A1] = "&iexcl;"
39 let s:html[0x00A2] = "&cent;"
40 let s:html[0x00A3] = "&pound;"
41 let s:html[0x00A4] = "&curren;"
42 let s:html[0x00A5] = "&yen;"
43 let s:html[0x00A6] = "&brvbar;"
44 let s:html[0x00A7] = "&sect;"
45 let s:html[0x00A8] = "&uml;"
46 let s:html[0x00A9] = "&copy;"
47 let s:html[0x00AA] = "&ordf;"
48 let s:html[0x00AB] = "&laquo;"
49 let s:html[0x00AC] = "&not;"
50 let s:html[0x00AD] = "&shy;"
51 let s:html[0x00AE] = "&reg;"
52 let s:html[0x00AF] = "&macr;"
53 let s:html[0x00B0] = "&deg;"
54 let s:html[0x00B1] = "&plusmn;"
55 let s:html[0x00B2] = "&sup2;"
56 let s:html[0x00B3] = "&sup3;"
57 let s:html[0x00B4] = "&acute;"
58 let s:html[0x00B5] = "&micro;"
59 let s:html[0x00B6] = "&para;"
60 let s:html[0x00B7] = "&middot;"
61 let s:html[0x00B8] = "&cedil;"
62 let s:html[0x00B9] = "&sup1;"
63 let s:html[0x00BA] = "&ordm;"
64 let s:html[0x00BB] = "&raquo;"
65 let s:html[0x00BC] = "&frac14;"
66 let s:html[0x00BD] = "&frac12;"
67 let s:html[0x00BE] = "&frac34;"
68 let s:html[0x00BF] = "&iquest;"
69 let s:html[0x00C0] = "&Agrave;"
70 let s:html[0x00C1] = "&Aacute;"
71 let s:html[0x00C2] = "&Acirc;"
72 let s:html[0x00C3] = "&Atilde;"
73 let s:html[0x00C4] = "&Auml;"
74 let s:html[0x00C5] = "&Aring;"
75 let s:html[0x00C6] = "&AElig;"
76 let s:html[0x00C7] = "&Ccedil;"
77 let s:html[0x00C8] = "&Egrave;"
78 let s:html[0x00C9] = "&Eacute;"
79 let s:html[0x00CA] = "&Ecirc;"
80 let s:html[0x00CB] = "&Euml;"
81 let s:html[0x00CC] = "&Igrave;"
82 let s:html[0x00CD] = "&Iacute;"
83 let s:html[0x00CE] = "&Icirc;"
84 let s:html[0x00CF] = "&Iuml;"
85 let s:html[0x00D0] = "&ETH;"
86 let s:html[0x00D1] = "&Ntilde;"
87 let s:html[0x00D2] = "&Ograve;"
88 let s:html[0x00D3] = "&Oacute;"
89 let s:html[0x00D4] = "&Ocirc;"
90 let s:html[0x00D5] = "&Otilde;"
91 let s:html[0x00D6] = "&Ouml;"
92 let s:html[0x00D7] = "&times;"
93 let s:html[0x00D8] = "&Oslash;"
94 let s:html[0x00D9] = "&Ugrave;"
95 let s:html[0x00DA] = "&Uacute;"
96 let s:html[0x00DB] = "&Ucirc;"
97 let s:html[0x00DC] = "&Uuml;"
98 let s:html[0x00DD] = "&Yacute;"
99 let s:html[0x00DE] = "&THORN;"
100 let s:html[0x00DF] = "&szlig;"
101 let s:html[0x00E0] = "&agrave;"
102 let s:html[0x00E1] = "&aacute;"
103 let s:html[0x00E2] = "&acirc;"
104 let s:html[0x00E3] = "&atilde;"
105 let s:html[0x00E4] = "&auml;"
106 let s:html[0x00E5] = "&aring;"
107 let s:html[0x00E6] = "&aelig;"
108 let s:html[0x00E7] = "&ccedil;"
109 let s:html[0x00E8] = "&egrave;"
110 let s:html[0x00E9] = "&eacute;"
111 let s:html[0x00EA] = "&ecirc;"
112 let s:html[0x00EB] = "&euml;"
113 let s:html[0x00EC] = "&igrave;"
114 let s:html[0x00ED] = "&iacute;"
115 let s:html[0x00EE] = "&icirc;"
116 let s:html[0x00EF] = "&iuml;"
117 let s:html[0x00F0] = "&eth;"
118 let s:html[0x00F1] = "&ntilde;"
119 let s:html[0x00F2] = "&ograve;"
120 let s:html[0x00F3] = "&oacute;"
121 let s:html[0x00F4] = "&ocirc;"
122 let s:html[0x00F5] = "&otilde;"
123 let s:html[0x00F6] = "&ouml;"
124 let s:html[0x00F7] = "&divide;"
125 let s:html[0x00F8] = "&oslash;"
126 let s:html[0x00F9] = "&ugrave;"
127 let s:html[0x00FA] = "&uacute;"
128 let s:html[0x00FB] = "&ucirc;"
129 let s:html[0x00FC] = "&uuml;"
130 let s:html[0x00FD] = "&yacute;"
131 let s:html[0x00FE] = "&thorn;"
132 let s:html[0x00FF] = "&yuml;"
133 let s:html[0x0152] = "&OElig;"
134 let s:html[0x0153] = "&oelig;"
135 let s:html[0x0160] = "&Scaron;"
136 let s:html[0x0161] = "&scaron;"
137 let s:html[0x0178] = "&Yuml;"
138 let s:html[0x0192] = "&fnof;"
139 let s:html[0x02C6] = "&circ;"
140 let s:html[0x02DC] = "&tilde;"
141 let s:html[0x0391] = "&Alpha;"
142 let s:html[0x0392] = "&Beta;"
143 let s:html[0x0393] = "&Gamma;"
144 let s:html[0x0394] = "&Delta;"
145 let s:html[0x0395] = "&Epsilon;"
146 let s:html[0x0396] = "&Zeta;"
147 let s:html[0x0397] = "&Eta;"
148 let s:html[0x0398] = "&Theta;"
149 let s:html[0x0399] = "&Iota;"
150 let s:html[0x039A] = "&Kappa;"
151 let s:html[0x039B] = "&Lambda;"
152 let s:html[0x039C] = "&Mu;"
153 let s:html[0x039D] = "&Nu;"
154 let s:html[0x039E] = "&Xi;"
155 let s:html[0x039F] = "&Omicron;"
156 let s:html[0x03A0] = "&Pi;"
157 let s:html[0x03A1] = "&Rho;"
158 let s:html[0x03A3] = "&Sigma;"
159 let s:html[0x03A4] = "&Tau;"
160 let s:html[0x03A5] = "&Upsilon;"
161 let s:html[0x03A6] = "&Phi;"
162 let s:html[0x03A7] = "&Chi;"
163 let s:html[0x03A8] = "&Psi;"
164 let s:html[0x03A9] = "&Omega;"
165 let s:html[0x03B1] = "&alpha;"
166 let s:html[0x03B2] = "&beta;"
167 let s:html[0x03B3] = "&gamma;"
168 let s:html[0x03B4] = "&delta;"
169 let s:html[0x03B5] = "&epsilon;"
170 let s:html[0x03B6] = "&zeta;"
171 let s:html[0x03B7] = "&eta;"
172 let s:html[0x03B8] = "&theta;"
173 let s:html[0x03B9] = "&iota;"
174 let s:html[0x03BA] = "&kappa;"
175 let s:html[0x03BB] = "&lambda;"
176 let s:html[0x03BC] = "&mu;"
177 let s:html[0x03BD] = "&nu;"
178 let s:html[0x03BE] = "&xi;"
179 let s:html[0x03BF] = "&omicron;"
180 let s:html[0x03C0] = "&pi;"
181 let s:html[0x03C1] = "&rho;"
182 let s:html[0x03C2] = "&sigmaf;"
183 let s:html[0x03C3] = "&sigma;"
184 let s:html[0x03C4] = "&tau;"
185 let s:html[0x03C5] = "&upsilon;"
186 let s:html[0x03C6] = "&phi;"
187 let s:html[0x03C7] = "&chi;"
188 let s:html[0x03C8] = "&psi;"
189 let s:html[0x03C9] = "&omega;"
190 let s:html[0x03D1] = "&thetasym;"
191 let s:html[0x03D2] = "&upsih;"
192 let s:html[0x03D6] = "&piv;"
193 let s:html[0x2002] = "&ensp;"
194 let s:html[0x2003] = "&emsp;"
195 let s:html[0x2009] = "&thinsp;"
196 let s:html[0x200C] = "&zwnj;"
197 let s:html[0x200D] = "&zwj;"
198 let s:html[0x200E] = "&lrm;"
199 let s:html[0x200F] = "&rlm;"
200 let s:html[0x2013] = "&ndash;"
201 let s:html[0x2014] = "&mdash;"
202 let s:html[0x2018] = "&lsquo;"
203 let s:html[0x2019] = "&rsquo;"
204 let s:html[0x201A] = "&sbquo;"
205 let s:html[0x201C] = "&ldquo;"
206 let s:html[0x201D] = "&rdquo;"
207 let s:html[0x201E] = "&bdquo;"
208 let s:html[0x2020] = "&dagger;"
209 let s:html[0x2021] = "&Dagger;"
210 let s:html[0x2022] = "&bull;"
211 let s:html[0x2026] = "&hellip;"
212 let s:html[0x2030] = "&permil;"
213 let s:html[0x2032] = "&prime;"
214 let s:html[0x2033] = "&Prime;"
215 let s:html[0x2039] = "&lsaquo;"
216 let s:html[0x203A] = "&rsaquo;"
217 let s:html[0x203E] = "&oline;"
218 let s:html[0x2044] = "&frasl;"
219 let s:html[0x20AC] = "&euro;"
220 let s:html[0x2111] = "&image;"
221 let s:html[0x2118] = "&weierp;"
222 let s:html[0x211C] = "&real;"
223 let s:html[0x2122] = "&trade;"
224 let s:html[0x2135] = "&alefsym;"
225 let s:html[0x2190] = "&larr;"
226 let s:html[0x2191] = "&uarr;"
227 let s:html[0x2192] = "&rarr;"
228 let s:html[0x2193] = "&darr;"
229 let s:html[0x2194] = "&harr;"
230 let s:html[0x21B5] = "&crarr;"
231 let s:html[0x21D0] = "&lArr;"
232 let s:html[0x21D1] = "&uArr;"
233 let s:html[0x21D2] = "&rArr;"
234 let s:html[0x21D3] = "&dArr;"
235 let s:html[0x21D4] = "&hArr;"
236 let s:html[0x2200] = "&forall;"
237 let s:html[0x2202] = "&part;"
238 let s:html[0x2203] = "&exist;"
239 let s:html[0x2205] = "&empty;"
240 let s:html[0x2207] = "&nabla;"
241 let s:html[0x2208] = "&isin;"
242 let s:html[0x2209] = "&notin;"
243 let s:html[0x220B] = "&ni;"
244 let s:html[0x220F] = "&prod;"
245 let s:html[0x2211] = "&sum;"
246 let s:html[0x2212] = "&minus;"
247 let s:html[0x2217] = "&lowast;"
248 let s:html[0x221A] = "&radic;"
249 let s:html[0x221D] = "&prop;"
250 let s:html[0x221E] = "&infin;"
251 let s:html[0x2220] = "&ang;"
252 let s:html[0x2227] = "&and;"
253 let s:html[0x2228] = "&or;"
254 let s:html[0x2229] = "&cap;"
255 let s:html[0x222A] = "&cup;"
256 let s:html[0x222B] = "&int;"
257 let s:html[0x2234] = "&there4;"
258 let s:html[0x223C] = "&sim;"
259 let s:html[0x2245] = "&cong;"
260 let s:html[0x2248] = "&asymp;"
261 let s:html[0x2260] = "&ne;"
262 let s:html[0x2261] = "&equiv;"
263 let s:html[0x2264] = "&le;"
264 let s:html[0x2265] = "&ge;"
265 let s:html[0x2282] = "&sub;"
266 let s:html[0x2283] = "&sup;"
267 let s:html[0x2284] = "&nsub;"
268 let s:html[0x2286] = "&sube;"
269 let s:html[0x2287] = "&supe;"
270 let s:html[0x2295] = "&oplus;"
271 let s:html[0x2297] = "&otimes;"
272 let s:html[0x22A5] = "&perp;"
273 let s:html[0x22C5] = "&sdot;"
274 let s:html[0x2308] = "&lceil;"
275 let s:html[0x2309] = "&rceil;"
276 let s:html[0x230A] = "&lfloor;"
277 let s:html[0x230B] = "&rfloor;"
278 let s:html[0x2329] = "&lang;"
279 let s:html[0x232A] = "&rang;"
280 let s:html[0x25CA] = "&loz;"
281 let s:html[0x2660] = "&spades;"
282 let s:html[0x2663] = "&clubs;"
283 let s:html[0x2665] = "&hearts;"
284 let s:html[0x2666] = "&diams;"
285
286
287 let s:file=matchstr(s:unicode_URL, '[^/]*$')
288
289 let s:directory  = expand("<sfile>:p:h")."/unicode"
290 let s:UniFile    = s:directory . '/UnicodeData.txt'
291
292 fu! unicode#CompleteUnicode(findstart,base) "{{{1
293   if !exists("s:numeric")
294           let s:numeric=0
295   endif
296   if a:findstart
297         let line = getline('.')
298         let start = col('.') - 1
299         while start > 0 && line[start - 1] =~ '\w\|+'
300           let start -= 1
301         endwhile
302         if line[start] =~# 'U' && line[start+1] == '+' && col('.')-1 >=start+2
303                 let s:numeric=1
304         else
305                 let s:numeric=0
306         endif
307         return start
308   else
309         if exists("g:showDigraphCode")
310                 let s:showDigraphCode=g:showDigraphCode
311         else
312                 let s:showDigraphCode = 0
313         endif
314         if s:numeric
315                 let complete_list = filter(copy(s:UniDict),
316                         \ 'printf("%04X", v:val) =~? "^0*".a:base[2:]')
317         else
318                 let complete_list = filter(copy(s:UniDict), 'v:key =~? a:base')
319         endif
320         for [key, value] in sort(items(complete_list), "<sid>CompareList")
321                 "let key=matchstr(key, "^[^0-9 ]*")
322                 let dg_char=<sid>GetDigraphChars(value)
323                 if s:showDigraphCode
324                         if !empty(dg_char)
325                                 let fstring = printf("U+%04X %s (%s):'%s'", value, key, dg_char,
326                                         \ nr2char(value))
327                         else
328                                 let fstring=printf("U+%04X %s:%s", value, key, nr2char(value))
329                         endif
330                 else
331                         let fstring=printf("U+%04X %s:'%s'", value, key, nr2char(value))
332                 endif
333                 let istring = printf("U+%04X %s%s:'%s'", value, key,
334                         \ empty(dg_char) ? '' : '('.dg_char.')', nr2char(value))
335         
336                 if s:unicode_complete_name
337                         let dict = {'word':key, 'abbr':fstring}
338                         if g:UnicodeShowPreviewWindow
339                                 call extend(dict, {'info': istring})
340                         endif
341                         call complete_add(dict)
342                 else
343                         let dict = {'word':nr2char(value), 'abbr':fstring}
344                         if g:UnicodeShowPreviewWindow
345                                 call extend(dict, {'info': istring})
346                         endif
347                         call complete_add(dict)
348                 endif
349                 if complete_check()
350                         break
351                 endif
352         endfor
353
354         return {}
355   endif
356 endfu
357
358 fu! unicode#CompleteDigraph() "{{{1
359         let prevchar=getline('.')[col('.')-2]
360         let prevchar1=getline('.')[col('.')-3]
361         let dlist=<sid>GetDigraph()
362         if prevchar !~ '\s' && !empty(prevchar)
363                 let filter1 =  '( v:val[0] == prevchar1 && v:val[1] == prevchar)'
364                 let filter2 = 'v:val[0] == prevchar || v:val[1] == prevchar'
365
366                 let dlist1 = filter(copy(dlist), filter1)
367                 if empty(dlist1)
368                         let dlist = filter(dlist, filter2)
369                         let col=col('.')-1
370                 else
371                         let dlist = dlist1
372                         let col=col('.')-2
373                 endif
374                 unlet dlist1
375         else
376                 let col=col('.')
377         endif
378         let tlist=[]
379         for args in dlist
380                 let t=matchlist(args, '^\(..\)\s<\?\(..\?\)>\?\s\+\(\d\+\)$')
381                 if !empty(t)
382                         let format=printf("'%s' %s U+%04X",t[1], t[2], t[3])
383                         call add(tlist, {'word':nr2char(t[3]), 'abbr':format,
384                                 \ 'info': printf("Abbrev\tGlyph\tCodepoint\n%s\t%s\tU+%04X",
385                                 \ t[1],t[2],t[3])})
386            endif
387         endfor
388         call complete(col, tlist)
389         return ''
390 endfu
391
392 fu! unicode#SwapCompletion() "{{{1
393         if !exists('s:unicode_complete_name')
394                 let s:unicode_complete_name = 1
395         endif
396         if exists('g:unicode_complete_name')
397                 let s:unicode_complete_name = g:unicode_complete_name
398         else
399                 let s:unicode_complete_name = !s:unicode_complete_name
400         endif
401         echo "Unicode Completion Names " .
402         \ (s:unicode_complete_name ? 'ON':'OFF')
403 endfu
404
405 fu! unicode#Init(enable) "{{{1
406         if !exists("s:unicode_complete_name")
407                 let s:unicode_complete_name = 0
408         endif
409         if a:enable
410                 let b:oldfunc=&l:cfu
411                 if (<sid>CheckDir())
412                         let s:UniDict = <sid>UnicodeDict()
413                         setl completefunc=unicode#CompleteUnicode
414                         set completeopt+=menuone
415                         inoremap <C-X><C-G> <C-R>=unicode#CompleteDigraph()<CR>
416                         nnoremap <leader>un :call unicode#SwapCompletion()<CR>
417                 endif
418         else
419                 if exists("b:oldfunc") && !empty(b:oldfunc)
420                         let &l:cfu=b:oldfunc
421                 else
422                         setl completefunc=
423                 endif
424                 unlet! s:UniDict
425                 if maparg("<leader>un", 'n')
426                         nunmap <leader>un
427                 endif
428                 if maparg("<C-X><C-G>")
429                         iunmap <C-X><C-G>
430                 endif
431         endif
432         echo "Unicode Completion " . (a:enable? 'ON' : 'OFF')
433 endfu
434
435 fu! unicode#GetUniChar(...) "{{{1
436         try
437                 if (<sid>CheckDir())
438                         if !exists("s:UniDict")
439                                 let s:UniDict=<sid>UnicodeDict()
440                         endif
441                         let msg = []
442
443                 " Get glyph at Cursor
444                 " need to use redir, cause we also want to capture combining chars
445                         redir => a | exe "silent norm! ga" | redir end 
446                         let a = substitute(a, '\n', '', 'g')
447                         " Special case: no character under cursor
448                         if a == 'NUL'
449                                 call add(msg, "'NUL' U+0000 NULL")
450                                 "call add(msg, "No character under cursor!")
451                                 return
452                         endif
453                         let dlist = <sid>GetDigraph()
454                         " Split string, in case cursor was on a combining char
455                         for item in split(a, 'Octal \d\+\zs \?')
456
457                                 let glyph = substitute(item, '^<\(<\?[^>]*>\?\)>.*', '\1', '')
458                                 let dec   = substitute(item, '.*>\?> \+\(\d\+\),.*', '\1', '')
459                                 " Check for control char (has no name)
460                                 if dec <= 0x1F || ( dec >= 0x7F && dec <= 0x9F)
461                                         if dec == 0
462                                                 let dec = 10
463                                         endif
464                                         let dig = filter(copy(dlist), 'v:val =~ ''\D''.dec.''$''')
465                                         call add(msg, printf("'%s' U+%04X <Control Char> %s", glyph, dec,
466                                                         \ empty(dig) ? '' : '('.dig[0][0:1].')'))
467                                 " CJK Unigraphs start at U+4E00 and go until U+9FFF
468                                 elseif dec >= 0x4E00 && dec <= 0x9FFF
469                                         call add(msg, printf("'%s' U+%04X CJK Ideograph", glyph, dec))
470                                 elseif dec >= 0xF0000 && dec <= 0xFFFFD
471                                         call add(msg, printf("'%s' U+%04X character from Plane 15 for private use",
472                                         \ glyph, dec))
473                                 elseif dec >= 0x100000 && dec <= 0x10FFFD
474                                         call add(msg, printf("'%s' U+%04X character from Plane 16 for private use",
475                                 \ glyph, dec))
476                                 else
477                                         let dict = filter(copy(s:UniDict), 'v:val == dec')
478                                         if empty(dict)
479                                         " not found
480                                                 call add(msg, printf("Character '%s' U+%04X not found", glyph, dec))
481                                                 return
482                                         endif
483                                         let dig = filter(copy(dlist), 'v:val =~ ''\D''.dec.''$''')
484                                         if !empty(dig)
485                                                 let dchar = printf("(%s)", dig[0][0:1])
486                                         else
487                                                 let dchar = ''
488                                         endif
489                                         let html = <sid>GetHtmlEntity(dec)
490                                         call add(msg, printf("'%s' U+%04X %s %s %s", glyph, values(dict)[0],
491                                         \ keys(dict)[0], dchar, html))
492                                 endif
493                         endfor
494                         if exists("a:1") && !empty(a:1)
495                                 exe "let @".a:1. "=join(msg)"
496                         endif
497
498                         "call <sid>OutputMessage(msg)
499                 else
500                         call add(msg, printf("Can't determine char under cursor, %s not found", s:UniFile))
501                 endif
502         finally
503                 call <sid>OutputMessage(msg)
504         endtry
505 endfun
506
507 fu! unicode#OutputDigraphs(match, bang) "{{{1
508         let screenwidth = 0
509         let digit = a:match + 0
510         for dig in sort(<sid>GetDigraph(), '<sid>CompareDigraphs')
511                 " display digraphs that match value
512                 if dig !~# a:match && digit == 0
513                         continue
514                 endif
515                 let item = matchlist(dig, '\(..\)\s\(\%(\s\s\)\|.\{,4\}\)\s\+\(\d\+\)$')
516
517                 " if digit matches, we only want to display digraphs matching the
518                 " decimal values
519                 if digit > 0 && digit !~ item[3]
520                         continue
521                 endif
522
523                 let screenwidth += strdisplaywidth(dig) + 2
524
525                 " if the output is too wide, echo an output
526                 if screenwidth > &columns || !empty(a:bang)
527                         let screenwidth = 0
528                         echon "\n"
529                 endif
530
531                 echohl Title
532                 echon item[2]
533                 echohl Normal
534                 echon item[1]. " ". item[3] . " "
535         endfor
536 endfu
537
538 fu! <sid>GetDigraphChars(code) "{{{1
539         let dlist = <sid>GetDigraph()
540         let ddict = {}
541         for digraph in dlist
542                 let key=matchstr(digraph, '\d\+$')+0
543                 let val=split(digraph)
544                 let ddict[key] = val[0]
545         endfor
546         return get(ddict, a:code, '')
547 endfu
548
549 fu! <sid>UnicodeDict() "{{{1
550         let dict={}
551         let list=readfile(s:UniFile)
552         for glyph in list
553         let val                  = split(glyph, ";")
554         let Name                 = val[1]
555         let dict[Name]   = str2nr(val[0],16)
556         endfor
557         return dict
558 endfu
559
560 fu! <sid>CheckUniFile(force) "{{{1
561         if (!filereadable(s:UniFile) || (getfsize(s:UniFile) == 0)) || a:force
562                 call s:WarningMsg("File " . s:UniFile . " does not exist or is zero.")
563                 call s:WarningMsg("Let's see, if we can download it.")
564                 call s:WarningMsg("If this doesn't work, you should download ")
565                 call s:WarningMsg(s:unicode_URL . " and save it as " . s:UniFile)
566                 sleep 10
567                 if exists(":Nread")
568                         sp +enew
569                         " Use the default download method. You can specify a different one,
570                         " using :let g:netrw_http_cmd="wget"
571                         exe ":lcd " . s:directory
572                         exe "0Nread " . s:unicode_URL
573                         $d _
574                         exe ":w!" . s:UniFile
575                         if getfsize(s:UniFile)==0
576                                 call s:WarningMsg("Error fetching Unicode File from " . s:unicode_URL)
577                                 return 0
578                         endif
579                         bw
580                 else
581                         call s:WarningMsg("Please download " . s:unicode_URL)
582                         call s:WarningMsg("and save it as " . s:UniFile)
583                         call s:WarningMsg("Quitting")
584                         return 0
585                 endif
586         endif
587         return 1
588 endfu
589
590 fu! <sid>CheckDir() "{{{1
591         try
592                 if (!isdirectory(s:directory))
593                         call mkdir(s:directory)
594                 endif
595         catch
596                 call s:WarningMsg("Error creating Directory: " . s:directory)
597                 return 0
598         endtry
599         return <sid>CheckUniFile(0)
600 endfu
601
602 fu! <sid>GetDigraph() "{{{1
603         if exists("s:dlist") && !empty(s:dlist)
604                 return s:dlist
605         else
606                 redir => digraphs
607                         silent digraphs
608                 redir END
609                 let s:dlist=[]
610                 let s:dlist=map(split(substitute(digraphs, "\n", ' ', 'g'),
611                         \ '..\s<\?.\{1,2\}>\?\s\+\d\{1,5\}\zs'),
612                         \ 'substitute(v:val, "^\\s\\+", "", "")')
613                 " special case: digraph 57344: starts with 2 spaces
614                 "return filter(dlist, 'v:val =~ "57344$"')
615                 let idx=match(s:dlist, '57344$')
616                 let s:dlist[idx]='       '.s:dlist[idx]
617
618                 return s:dlist
619         endif
620 endfu
621
622 fu! <sid>CompareList(l1, l2) "{{{1
623         return a:l1[1] == a:l2[1] ? 0 : a:l1[1] > a:l2[1] ? 1 : -1
624 endfu
625
626 fu! <sid>CompareDigraphs(d1, d2) "{{{1
627         let d1=matchstr(a:d1, '\d\+$')+0
628         let d2=matchstr(a:d2, '\d\+$')+0
629         if d1 == d2
630                 return 0
631         elseif d1 > d2
632                 return 1
633         else
634                 return -1
635         endif
636 endfu
637
638 fu! <sid>OutputMessage(msg) " {{{1
639         redraw
640         echohl Title
641         if type(a:msg) == type([])
642                 " List
643                 for item in a:msg
644                         echom item
645                 endfor
646         elseif type(a:msg) == type("")
647                 " string
648                 echom a:msg
649         endif
650         echohl Normal
651 endfu
652
653 fu! <sid>WarningMsg(msg) "{{{1
654         echohl WarningMsg
655         let msg = "UnicodePlugin: " . a:msg
656         if exists(":unsilent") == 2
657                 unsilent echomsg msg
658         else
659                 echomsg msg
660         endif
661         echohl Normal
662 endfun
663
664 fu! <sid>GetHtmlEntity(hex) "{{{1
665         return get(s:html, a:hex, '')
666 endfu
667 " Modeline "{{{1
668 " vim: ts=4 sts=4 fdm=marker com+=l\:\" fdl=0