1
2 scriptencoding utf-8
3
4
5
6
7
8
9
10
11
12 "normal $Fxh\"
13 if !exists("g:transsymb")
14 let g:transsymb={
15 \"ru": {
16 \'a': 'а',
17 \'b': 'б',
18 \'c': {
19 \"none": 'ц',
20 \"'": 'ч',
21 \'x': 'ч',
22 \'h': 'ч'
23 \},
24 \'d': 'д',
25 \'e': {
26 \"none": 'е',
27 \"'": 'э',
28 \"x": 'э',
29 \'"': 'ё'
30 \},
31 \'f': 'ф',
32 \'g': 'г',
33 \'h': 'х',
34 \'i': {
35 \"none": 'и',
36 \"'": 'й',
37 \'x': 'й'
38 \},
39 \'j': 'й',
40 \'k': 'к',
41 \'l': 'л',
42 \'m': 'м',
43 \'n': 'н',
44 \'o': {
45 \"none": 'о',
46 \"'": 'ё',
47 \'x': 'ё'
48 \},
49 \'p': 'п',
50 \'q': 'я',
51 \'r': 'р',
52 \'s': {
53 \"none": 'с',
54 \'h': 'ш'
55 \},
56 \'t': 'т',
57 \'u': {
58 \"none": 'у',
59 \"'": 'ю',
60 \'x': 'ю'
61 \},
62 \'v': 'в',
63 \'w': {
64 \"none": 'ш',
65 \"'": 'щ',
66 \'x': 'щ',
67 \'h': 'щ'
68 \},
69 \'x': {
70 \"none": 'ь',
71 \'x': 'ъ',
72 \"options": {
73 \"capital": "none"
74 \}
75 \},
76 \'X': {
77 \"none": 'ъ',
78 \"options":{
79 \"capital": "none"
80 \}
81 \},
82 \'y': 'ы',
83 \'z': {
84 \"none": 'з',
85 \'h': 'ж'
86 \},
87 \'''': {
88 \"none": 'ь',
89 \'''': nr2char(0x201C),
90 \"options": {
91 \"capital": "none"
92 \}
93 \},
94 \'"': {
95 \"none": 'ъ',
96 \"options": {
97 \"capital": "none"
98 \}
99 \},
100 \'<': {
101 \'<': '«',
102 \'=': nr2char(0x2264)
103 \},
104 \'>': {
105 \'>': '»',
106 \'=': nr2char(0x2265)
107 \},
108 \'+': {
109 \'-': nr2char(0x00b1)
110 \},
111 \'(': {
112 \'c': {
113 \')': nr2char(0x00a9),
114 \"options": {
115 \"capital": "none"
116 \}
117 \},
118 \'r': {
119 \')': nr2char(0x00ae),
120 \"options": {
121 \"capital": "none"
122 \}
123 \}
124 \},
125 \'^': {
126 \'t': {
127 \')': nr2char(0x2122),
128 \'m': nr2char(0x2122),
129 \"options": {
130 \"capital": "none"
131 \}
132 \}
133 \},
134 \'#': '№',
135 \'.': {
136 \'.': {
137 \'.': '…'
138 \}
139 \},
140 \'-': {
141 \'-': {
142 \"none": nr2char(0x2013),
143 \'-': nr2char(0x2014)
144 \}
145 \},
146 \'~': nr2char(0x00a0),
147 \'_': {
148 \'<': {
149 \"none": nr2char(0x2039),
150 \'<': nr2char(0x226A)
151 \},
152 \'>': {
153 \"none": nr2char(0x203A),
154 \'>': nr2char(0x226B)
155 \},
156 \'/': nr2char(0x00F7),
157 \'`': {
158 \"none": nr2char(0x2018),
159 \'!': nr2char(0x201B),
160 \'`': nr2char(0x201F)
161 \},
162 \',': nr2char(0x201A),
163 \'''': nr2char(0x2019),
164 \'%': nr2char(0x2030),
165 \'.': nr2char(0x2219),
166 \'0': nr2char(0x221E),
167 \'\': nr2char(0x221a),
168 \'u': nr2char(0x2229),
169 \'U': nr2char(0x222a),
170 \'i': {
171 \"none": nr2char(0x222b),
172 \'i': nr2char(0x222c)
173 \},
174 \'o': nr2char(0x222e),
175 \'~': nr2char(0x2248),
176 \'n': nr2char(0x2205),
177 \'c': nr2char(0x2103)
178 \},
179 \',': {
180 \',': nr2char(0x201E)
181 \},
182 \'`': {
183 \'`': nr2char(0x201D)
184 \},
185 \"checked": "\<SID>"
186 \},
187 \"ru:html": {
188 \'a': 'а',
189 \'b': 'б',
190 \'c': {
191 \"none": 'ц',
192 \"'": 'ч',
193 \'x': 'ч',
194 \'h': 'ч'
195 \},
196 \'d': 'д',
197 \'e': {
198 \"none": 'е',
199 \"'": 'э',
200 \"x": 'э',
201 \'"': 'ё'
202 \},
203 \'f': 'ф',
204 \'g': 'г',
205 \'h': 'х',
206 \'i': {
207 \"none": 'и',
208 \"'": 'й',
209 \'x': 'й'
210 \},
211 \'j': 'й',
212 \'k': 'к',
213 \'l': 'л',
214 \'m': 'м',
215 \'n': 'н',
216 \'o': {
217 \"none": 'о',
218 \"'": 'ё',
219 \'x': 'ё'
220 \},
221 \'p': 'п',
222 \'q': 'я',
223 \'r': 'р',
224 \'s': {
225 \"none": 'с',
226 \'h': 'ш'
227 \},
228 \'t': 'т',
229 \'u': {
230 \"none": 'у',
231 \"'": 'ю',
232 \'x': 'ю'
233 \},
234 \'v': 'в',
235 \'w': {
236 \"none": 'ш',
237 \"'": 'щ',
238 \'x': 'щ',
239 \'h': 'щ'
240 \},
241 \'x': {
242 \"none": 'ь',
243 \'x': 'ъ',
244 \"options": {
245 \"capital": "none"
246 \}
247 \},
248 \'X': {
249 \"none": 'ъ',
250 \"options":{
251 \"capital": "none"
252 \}
253 \},
254 \'y': 'ы',
255 \'z': {
256 \"none": 'з',
257 \'h': 'ж'
258 \},
259 \'''': {
260 \"none": 'ь',
261 \'''': "“",
262 \"options": {
263 \"capital": "none"
264 \}
265 \},
266 \'"': {
267 \"none": 'ъ',
268 \"options": {
269 \"capital": "none"
270 \}
271 \},
272 \'<': {
273 \"none": "<",
274 \'<': "«"
275 \},
276 \'>': {
277 \"none": ">",
278 \'>': "»"
279 \},
280 \'+': {
281 \'-': "±"
282 \},
283 \'(': {
284 \'c': {
285 \')': "©",
286 \"options": {
287 \"capital": "none"
288 \}
289 \},
290 \'r': {
291 \')': "®",
292 \"options": {
293 \"capital": "none"
294 \}
295 \}
296 \},
297 \'^': {
298 \'t': {
299 \')': "™",
300 \'m': "™",
301 \"options": {
302 \"capital": "none"
303 \}
304 \}
305 \},
306 \'#': "№",
307 \'.': {
308 \'.': {
309 \'.': "…"
310 \}
311 \},
312 \'-': {
313 \'-': {
314 \"none": "–",
315 \'-': "—"
316 \}
317 \},
318 \'&': "&",
319 \'~': " ",
320 \'[': "[",
321 \']': "]",
322 \'_': {
323 \'<': {
324 \"none": "‹",
325 \'<': "≪"
326 \},
327 \'>': {
328 \"none": "›",
329 \'>': "≫"
330 \},
331 \'/': "÷",
332 \'`': {
333 \"none": "‘",
334 \'!': "‛",
335 \'`': "‟"
336 \},
337 \',': "‚",
338 \'''': "’",
339 \'%': "‰",
340 \'.': "∙",
341 \'0': "∞",
342 \'\': "√",
343 \'u': "∩",
344 \'U': "∪",
345 \'i': {
346 \"none": "∫",
347 \'i': "∬"
348 \},
349 \'o': "∮",
350 \'~': "≈",
351 \'n': "∅",
352 \'c': "℃"
353 \},
354 \',': {
355 \',': "„"
356 \},
357 \'`': {
358 \'`': "”"
359 \},
360 \"checked": "\<SID>"
361 \},
362 \"ru:latex": {
363 \'a': 'а',
364 \'b': 'б',
365 \'c': {
366 \"none": 'ц',
367 \"'": 'ч',
368 \'x': 'ч',
369 \'h': 'ч'
370 \},
371 \'d': 'д',
372 \'e': {
373 \"none": 'е',
374 \"'": 'э',
375 \"x": 'э',
376 \'"': 'ё'
377 \},
378 \'f': 'ф',
379 \'g': 'г',
380 \'h': 'х',
381 \'i': {
382 \"none": 'и',
383 \"'": 'й',
384 \'x': 'й'
385 \},
386 \'j': 'й',
387 \'k': 'к',
388 \'l': 'л',
389 \'m': 'м',
390 \'n': 'н',
391 \'o': {
392 \"none": 'о',
393 \"'": 'ё',
394 \'x': 'ё'
395 \},
396 \'p': 'п',
397 \'q': 'я',
398 \'r': 'р',
399 \'s': {
400 \"none": 'с',
401 \'h': 'ш'
402 \},
403 \'t': 'т',
404 \'u': {
405 \"none": 'у',
406 \"'": 'ю',
407 \'x': 'ю'
408 \},
409 \'v': 'в',
410 \'w': {
411 \"none": 'ш',
412 \"'": 'щ',
413 \'x': 'щ',
414 \'h': 'щ'
415 \},
416 \'x': {
417 \"none": 'ь',
418 \'x': 'ъ',
419 \"options": {
420 \"capital": "none"
421 \}
422 \},
423 \'X': {
424 \"none": 'ъ',
425 \"options":{
426 \"capital": "none"
427 \}
428 \},
429 \'y': 'ы',
430 \'z': {
431 \"none": 'з',
432 \'h': 'ж'
433 \},
434 \'''': {
435 \"none": 'ь',
436 \"options": {
437 \"capital": "none"
438 \}
439 \},
440 \'"': {
441 \"none": 'ъ',
442 \"options": {
443 \"capital": "none"
444 \}
445 \},
446 \'<': {
447 \'=': "\\leqslant"
448 \},
449 \'>': {
450 \'=': "\\geqslant"
451 \},
452 \'+': {
453 \'-': "\\pm"
454 \},
455 \'(': {
456 \'c': {
457 \')': "\\copyright",
458 \"options": {
459 \"capital": "none"
460 \}
461 \},
462 \'r': {
463 \')': "\\textregistered",
464 \"options": {
465 \"capital": "none"
466 \}
467 \}
468 \},
469 \'^': {
470 \'t': {
471 \')': "\\texttrademark",
472 \'m': "\\texttrademark",
473 \"options": {
474 \"capital": "none"
475 \}
476 \},
477 \'s': {
478 \')': "\\textservicemark",
479 \'m': "\\textservicemark",
480 \"options": {
481 \"capital": "none"
482 \}
483 \}
484 \},
485 \'#': "\\textnumero",
486 \'.': {
487 \'.': {
488 \'.': "\\dots"
489 \}
490 \},
491 \'-': {
492 \'+': "\\mp"
493 \},
494 \'_': {
495 \'<': {
496 \"none": "\\textlangel",
497 \'<': "\\ll"
498 \},
499 \'>': {
500 \"none": "\\textrangel",
501 \'>': "\\gg"
502 \},
503 \'/': "\\div",
504 \'`': {
505 \"none": nr2char(0x2018),
506 \'!': nr2char(0x201B)
507 \},
508 \',': nr2char(0x201A),
509 \'''': nr2char(0x2019),
510 \'%': "\\textperthousand",
511 \'.': "\\cdot",
512 \'0': "\\infty",
513 \'\': "\\sqrt",
514 \'u': "\\bigcap",
515 \'U': "\\bigcup",
516 \'i': {
517 \"none": "\\int",
518 \'i': {
519 \"none": "\\iint",
520 \"i": {
521 \"none": "\\iiint",
522 \"i": "\\iiiint"
523 \}
524 \}
525 \},
526 \'o': "\\oint",
527 \'O': "\\textohm",
528 \'~': "\\approx",
529 \'c': "\\textcelsius",
530 \'n': "\\varnothing"
531 \},
532 \"checked": "\<SID>"
533 \},
534 \}
535 endif
536
537 if !exists("g:trPluginloaded")
538 augroup TransliterationScript
539 autocmd!
540 execute "autocmd FuncUndefined TransliterateString source \<sfile>"
541 execute "autocmd FuncUndefined PrintTransTable source \<sfile>"
542 execute "autocmd FuncUndefined InitToF source \<sfile>"
543 execute "autocmd FuncUndefined TrShow source \<sfile>"
544 augroup END
545 execute "command -range=% -nargs=? TrText ".
546 \"execute \"source ".expand("<sfile>")."\" | ".
547 \"call \<SID>transCommandFunc(<line1>, <line2>, 0, <args>)"
548 execute "command -range=% -nargs=? ".
549 \"TrSelection ".
550 \"execute \"source ".expand("<sfile>")."\" | ".
551 \"call \<SID>transCommandFunc(<line1>, <line2>, 1, <args>)"
552 execute "command -nargs=? StartToF call InitToF(<args>)"
553 execute "command -nargs=? TrShow echo TrShow(<args>)"
554 let g:trPluginloaded=0
555 finish
556 endif
557 if g:trPluginloaded
558 finish
559 endif
560 augroup TransliterationScript
561 autocmd!
562 augroup END
563 let g:trPluginloaded=1
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637 "none"
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664 "stop"
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682 Translit:
683
684
685
686
687
688
689
690
691
692 "stop"
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825 if !exists("g:trPluginBrkSeqSymbs")
826 let g:trPluginBrkSeqSymbs=['@']
827 endif
828 if !exists("g:trPluginEscNext")
829 let g:trPluginEscNext=['\']
830 endif
831 if !exists("g:trPluginStopStartTrSymbs")
832 let g:trPluginStopStartTrSymbs=[['%'], ['%']]
833 endif
834 if !exists("g:trPluginDefaultTranssymb")
835 let g:trPluginDefaultTranssymb=g:transsymb["ru"]
836 endif
837 TODO
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854 " "
855 " "
856
857 " "
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918 "exitstatus"
919 "trsuc"
920 "trerr"
921 "trans"
922 "deltai"
923 "upper"
924
925
926
927
928 function s:transGetChar(transsymb, string, brkseq)
929
930 let l:i=0
931 let l:isupper=0
932 let l:string=a:string
933
934
935 if l:string[0]=~"\\u" && !has_key(a:transsymb, l:string[0]) &&
936 \has_key(a:transsymb, tolower(l:string[0])) &&
937 \!(type(a:transsymb[tolower(l:string[0])])==type({}) &&
938 \has_key(a:transsymb[tolower(l:string[0])],"options") &&
939 \has_key(a:transsymb[tolower(l:string[0])]["options"],
940 \"capital") &&
941 \a:transsymb[tolower(l:string[0])]["options"]["capital"]==
942 \"none")
943 let l:isupper=1
944 let l:string[0]=tolower(l:string[0])
945 endif
946
947 if has_key(a:transsymb, l:string[0])
948
949
950 if type(a:transsymb[l:string[0]])==type('')
951 let l:i=1
952 if DoesListBeginWith(l:string[1:-1], a:brkseq)
953 let l:i+=len(a:brkseq)
954 endif
955 return {
956 \"exitstatus": "trsuc",
957 \"trans": a:transsymb[l:string[0]],
958 \"deltai": l:i,
959 \"upper": l:isupper
960 \}
961
962 elseif type(a:transsymb[l:string[0]])==type({})
963
964 if len(l:string)>1 && !DoesListBeginWith(l:string[1:-1],
965 \a:brkseq)
966
967 let l:lastreturnedstatus=s:transGetChar(
968 \a:transsymb[l:string[0]], l:string[1:-1], a:brkseq)
969 if l:lastreturnedstatus["upper"] && !l:isupper
970 let l:lastreturnedstatus["exitstatus"]="trerr"
971 endif
972 let l:i=1
973 else
974
975 let l:lastreturnedstatus={
976 \"exitstatus": "trerr",
977 \"trans": "",
978 \"deltai": 0,
979 \"upper": l:isupper
980 \}
981 endif
982
983 if l:lastreturnedstatus["exitstatus"]=="trerr"
984
985 let l:i=0
986
987 if has_key(a:transsymb[l:string[0]], "none")
988 let l:lastreturnedstatus={
989 \"exitstatus": "trsuc",
990 \"trans": a:transsymb[l:string[0]]["none"],
991 \"deltai": 1,
992 \"upper": l:isupper
993 \}
994 if DoesListBeginWith(l:string[1:-1], a:brkseq)
995 let l:i+=len(a:brkseq)
996 endif
997
998 else
999 let l:lastreturnedstatus={
1000 \"exitstatus": "trerr",
1001 \"trans": l:string[0],
1002 \"deltai": 1,
1003 \"upper": l:isupper
1004 \}
1005 endif
1006 endif
1007 endif
1008
1009 return {
1010 \"exitstatus": l:lastreturnedstatus["exitstatus"],
1011 \"trans": l:lastreturnedstatus["trans"],
1012 \"deltai": l:lastreturnedstatus["deltai"]+l:i,
1013 \"upper": l:isupper
1014 \}
1015
1016 else
1017 if DoesListBeginWith(l:string, a:brkseq)
1018 return {
1019 \"exitstatus": "trerr",
1020 \"trans": "",
1021 \"deltai": len(a:brkseq),
1022 \"upper": 0
1023 \}
1024 endif
1025 if !has_key(a:transsymb, "other")
1026 return {
1027 \"exitstatus": "trerr",
1028 \"trans": l:string[0],
1029 \"deltai": 1,
1030 \"upper": l:isupper
1031 \}
1032 else
1033 return {
1034 \"exitstatus": "trsuc",
1035 \"trans": a:transsymb["other"],
1036 \"deltai": 1,
1037 \"upper": 0
1038 \}
1039 endif
1040 endif
1041 endfunction
1042
1043
1044 function StringToList(string)
1045 let l:returnedlist=[]
1046 let l:i=0
1047 while l:i!=len(a:string)
1048 call add(l:returnedlist, matchstr(a:string[(l:i):-1], '.'))
1049 let l:i+=len(l:returnedlist[-1])
1050 endwhile
1051 return l:returnedlist
1052 endfunction
1053
1054 function DoesListBeginWith(list, beginning)
1055 if type(a:beginning)!=type([])
1056 if !len(a:list)
1057 return 0
1058 endif
1059 if a:list[0]==a:beginning
1060 return 1
1061 endif
1062 return 0
1063 endif
1064 if len(a:list)<len(a:beginning)
1065 return 0
1066 endif
1067 if a:list[0:(len(a:beginning)-1)]==a:beginning
1068 return 1
1069 endif
1070 return 0
1071 endfunction
1072
1073 function TransliterateString(string, ...)
1074
1075
1076 if len(a:000)
1077 if type(a:000[0])==type({})
1078 let l:transsymb=a:000[0]
1079
1080 if !has_key(l:transsymb, "checked") ||
1081 \l:transsymb["checked"]!="\<SID>"
1082 silent! if CheckTransTable(l:transsymb)
1083 echoerr "В таблице транслитерации обнаружены ошибки!"
1084 return ""
1085 else
1086 call extend(l:transsymb, {"checked": "\<SID>"}, "force")
1087 endif
1088 endif
1089 else
1090 echoerr "Не является словарём!"
1091 return ""
1092 endif
1093 else
1094 if !exists("b:transsymb")
1095 let l:transsymb=g:trPluginDefaultTranssymb
1096 else
1097 let l:transsymb=b:transsymb
1098 endif
1099 endif
1100 if type(a:string)!=type("")
1101 echoerr "В качестве первого аргумента должна быть указана строка!"
1102 return ""
1103 endif
1104
1105 if !exists("b:trPluginBrkSeqSymbs")
1106 let l:brkseq=g:trPluginBrkSeqSymbs
1107 else
1108 let l:brkseq=b:trPluginBrkSeqSymbs
1109 endif
1110 let l:returnedstring=""
1111 let l:i=0
1112 let l:string=StringToList(a:string)
1113
1114 while l:i<len(l:string)
1115 let l:trsymb=s:transGetChar(l:transsymb, l:string[(l:i):-1], l:brkseq)
1116
1117
1118
1119
1120 if l:trsymb["exitstatus"]=="trsuc"
1121 if l:trsymb["upper"]
1122 let l:trsymb["trans"]=toupper(l:trsymb["trans"])
1123 endif
1124 let l:returnedstring.=l:trsymb["trans"]
1125 let l:i+=l:trsymb["deltai"]
1126 continue
1127 endif
1128
1129
1130 if DoesListBeginWith(l:string[(l:i):-1],g:trPluginEscNext)
1131 let l:i+=len(g:trPluginEscNext)
1132 if l:i>=len(l:string)
1133 let l:returnedstring.=join(g:trPluginEscNext, "")
1134 break
1135 endif
1136 let l:returnedstring.=l:string[l:i]
1137 let l:i+=1
1138 continue
1139
1140 elseif DoesListBeginWith(l:string[(l:i):-1],
1141 \g:trPluginStopStartTrSymbs[0])
1142 let l:i+=len(g:trPluginStopStartTrSymbs[0])
1143 while !DoesListBeginWith(l:string[(l:i):-1],
1144 \g:trPluginStopStartTrSymbs[1]) &&
1145 \l:i<len(l:string)
1146
1147 if DoesListBeginWith(l:string[(l:i):-1], g:trPluginEscNext)
1148 let l:i+=len(g:trPluginEscNext)
1149 if l:i>=len(l:string)
1150 let l:returnedstring.=join(g:trPluginEscNext, "")
1151 break
1152 endif
1153 let l:returnedstring.=l:string[l:i]
1154 let l:i+=1
1155 continue
1156 endif
1157
1158 let l:returnedstring.=l:string[l:i]
1159 let l:i+=1
1160 endwhile
1161 let l:i+=len(g:trPluginStopStartTrSymbs[1])
1162 continue
1163 endif
1164
1165 if l:trsymb["exitstatus"]=="trerr"
1166 if l:trsymb["upper"]
1167 let l:trsymb["trans"]=toupper(l:trsymb["trans"])
1168 endif
1169 let l:returnedstring.=l:trsymb["trans"]
1170 let l:i+=l:trsymb["deltai"]
1171 continue
1172 endif
1173 let l:i+=1
1174 endwhile
1175 return l:returnedstring
1176 endfunction
1177
1178 execute "command! -range=% -nargs=? TrText ".
1179 \"call \<SID>transCommandFunc(<line1>, <line2>, 0, <args>)"
1180 execute "command! -range=% -nargs=? ".
1181 \"TrSelection ".
1182 \"call \<SID>transCommandFunc(<line1>, <line2>, 1, <args>)"
1183 let s:transTable={}
1184
1185 function s:transCommandFunc(linestart, lineend, isVisual, ...)
1186
1187 let l:lastMot =""
1188 let l:firstMot =""
1189 let l:linecount=0
1190 let l:linestart=0
1191 let l:savedwin=winsaveview()
1192 let l:savedpaste=&paste
1193 set paste
1194
1195
1196 if a:isVisual
1197 let l:linestart=line("'<")
1198 let l:linecount=line("'>")-l:linestart
1199 let l:firstMot = virtcol("'<")
1200 if visualmode()=="\<C-v>"
1201 let l:lastMot=(virtcol("'>")-((&selection=="exclusive")?(1):(0))-
1202 \l:firstMot+1)
1203 if l:lastMot<0
1204 let l:firstMot+=l:lastMot
1205 let l:lastMot =-l:lastMot
1206 endif
1207 let l:lastMot .= 'l'
1208 let l:firstMot.= '|'
1209 elseif visualmode()=='V'
1210 let l:firstMot = '0'
1211 let l:lastMot = '$'
1212 elseif visualmode()=='v'
1213 let l:firstMot ="gv"
1214 endif
1215
1216 else
1217 let l:linestart=a:linestart
1218 let l:linecount=a:lineend-l:linestart
1219 let l:firstMot ='0'
1220 let l:lastMot ='$'
1221 endif
1222
1223 if l:linecount<0
1224 let l:linestart+=l:linecount
1225 let l:linecount=-l:linecount
1226 endif
1227
1228 let l:i=0
1229 let l:savedtReg=@t
1230 execute "normal! ".l:linestart."gg"
1231
1232 let l:savedformatoptions=&formatoptions
1233 set formatoptions-=a
1234
1235 if len(a:000)
1236
1237 let s:transTable=a:000[0]
1238 if type(s:transTable)!=type({})
1239 echoerr "Аргумент не является словарем!"
1240 return 2
1241 else
1242 silent! if CheckTransTable(s:transTable)
1243 echoerr "Таблица транслитерации не прошла проверку!"
1244 return 1
1245 else
1246 call extend(l:transsymb, {"checked": "\<SID>"}, "force")
1247 endif
1248 endif
1249 else
1250
1251 if !exists("b:transsymb")
1252 let s:transTable=g:trPluginDefaultTranssymb
1253 else
1254 let s:transTable=b:transsymb
1255 endif
1256 endif
1257
1258 while l:i<=l:linecount
1259 execute "normal! ".l:firstMot."\"tc".l:lastMot.
1260 \"\<C-r>=TransliterateString(@t,s:transTable)\<C-m>\<ESC>j"
1261 let l:i+=1
1262 endwhile
1263
1264 let @t=l:savedtReg
1265 let &formatoptions=l:savedformatoptions
1266 let &paste=l:savedpaste
1267 call winrestview(l:savedwin)
1268 return 0
1269 endfunction
1270
1271 function CheckTransTable(transsymb)
1272
1273 echohl Error
1274 let l:errcount_r=0
1275 for l:key in keys(a:transsymb)
1276
1277 if type(l:key)!=type("")
1278 echo "Найдено неправильное значение ключа:"
1279 echo "«".strtrans(string(l:key))."»."
1280 echo "Ключ словаря должен иметь тип «String»"
1281 let l:errcount_r+=1
1282 continue
1283 endif
1284
1285
1286
1287
1288
1289
1290 let l:keyLength=strlen(substitute(l:key, '.', '.', ''))
1291
1292 if !l:keyLength
1293 echo "Найдено неправильное значение ключа:"
1294 echo "ключ словаря не может иметь нулевую длину."
1295 let l:errcount_r+=1
1296
1297 elseif l:keyLength>1
1298
1299 if l:key=="none"
1300 if type(a:transsymb[l:key])!=type("")
1301 echo "Найдено неправильное значение:"
1302 echo "«„".l:key."“: „".
1303 \strtrans(string(a:transsymb[l:key])).
1304 \"“»."
1305 echo "Значение, соответствующее ключу \"none\""
1306 echo "должно иметь тип «String»."
1307 let l:errcount_r+=1
1308 continue
1309 endif
1310
1311 elseif l:key=="options"
1312
1313 if type(a:transsymb[l:key])!=type({})
1314 echo "Найдено неправильное значение:"
1315 echo "«„".l:key."“: „".
1316 \strtrans(string(a:transsymb[l:key])).
1317 \"“»."
1318 echo "Значение, соответствующее ключу \"options\""
1319 echo "должно иметь тип «Dictionary»."
1320 let l:errcount_r+=1
1321 continue
1322 endif
1323
1324 for l:key_p in keys(a:transsymb[l:key])
1325
1326 if type(l:key_p)!=type("")
1327 echo "Найдено неправильное значение ключа:"
1328 echo "«„".l:key."“: „"
1329 \strtrans(string(l:key))."“»."
1330 echo "Ключ словаря должен иметь тип «String»"
1331 let l:errcount_r+=1
1332 continue
1333 endif
1334
1335 if l:key_p=="capital"
1336
1337 if type(a:transsymb[l:key][l:key_p])!=type("")
1338 echo "Найдено неправильное значение:"
1339 echo "«„".l:key."“: „".l:key_p."“: „".
1340 \strtrans(
1341 \string(
1342 \a:transsymb[l:key][l:key_p]
1343 \)
1344 \)."“»."
1345 echo "Значение, соответствующее ключу ".
1346 \"\"capital\""
1347 echo "в словаре, соответствующем ключу ".
1348 \"\"options\","
1349 echo "должно иметь тип «String»"
1350 let l:errcount_r+=1
1351 continue
1352 endif
1353
1354 if a:transsymb[l:key][l:key_p]!="none"
1355 echo "Найдено неправильное значение:"
1356 echo "«„".l:key."“: „".l:key_p."“: „".
1357 \strtrans(
1358 \string(
1359 \a:transsymb[l:key][l:key_p]
1360 \)
1361 \)."“»."
1362 echo "Значение, соответствующее ключу ".
1363 \"\"capital\""
1364 echo "в словаре, соответствующем ключу ".
1365 \"\"options\","
1366 echo "неверно."
1367 let l:errcount_r+=1
1368 continue
1369 endif
1370
1371 else
1372 echo "Найден неправильный ключ:"
1373 echo "«„".l:key."“: „".l:key_p."“»."
1374 echo "Такой настройки не существует."
1375 let l:errcount_r+=1
1376 endif
1377 endfor
1378
1379 elseif l:key=="other"
1380
1381 if type(a:transsymb[l:key])!=type("")
1382 echo "Найдено неправильное значение:"
1383 echo "«„".l:key."“: „".
1384 \strtrans(string(a:transsymb[l:key])).
1385 \"“»."
1386 echo "Значение, соответствующее ключу \"other\""
1387 echo "должно иметь тип «String»."
1388 let l:errcount_r+=1
1389 continue
1390 endif
1391
1392 elseif l:key=="checked"
1393
1394 if type(a:transsymb[l:key])!=type("")
1395 echo "Найдено неправильное значение:"
1396 echo "«„".l:key."“: „".
1397 \strtrans(string(a:transsymb[l:key])).
1398 \"“»."
1399 echo "Значение, соответствующее ключу \"checked\""
1400 echo "должно иметь тип «String»."
1401 let l:errcount_r+=1
1402 continue
1403 endif
1404
1405 else
1406 echo "Неизвестный длинный ключ:"
1407 echo "«".l:key."»."
1408 let l:errcount_r+=1
1409 endif
1410
1411 else
1412
1413 if type(a:transsymb[l:key])!=type("") &&
1414 \type(a:transsymb[l:key])!=type({})
1415 echo "Найдено неправильное значение:"
1416 echo "«„".l:key."“: „".
1417 \strtrans(string(a:transsymb[l:key])).
1418 \"“»."
1419 echo "Значение, соответствующее односимвольному ключу"
1420 echo "должно иметь тип «String» или «Dictionary»."
1421 let l:errcount_r+=1
1422 continue
1423 endif
1424
1425 if type(a:transsymb[l:key])==type({})
1426 echohl None
1427 echo "Проверка словаря, соответствующего символу «".l:key."»."
1428 let l:errcount_r+=CheckTransTable(a:transsymb[l:key])
1429 echohl Error
1430 endif
1431 endif
1432 endfor
1433
1434 echohl None
1435 return l:errcount_r
1436 endfunction
1437
1438
1439 if !exists("g:trPluginStopTrSymbs")
1440 let g:trPluginStopTrSymbs={
1441 \ '%': '',
1442 \ '\': '\',
1443 \ '<': '<'}
1444 endif
1445 if !exists("g:trPluginStartTrSymbs")
1446 let g:trPluginStartTrSymbs={
1447 \'%': '',
1448 \'{': '{',
1449 \'>': '>'}
1450 endif
1451
1452
1453 function s:CreatMapToF(mapkey)
1454 if a:mapkey==''''
1455 execute "inoremap <expr> <buffer> ' \<SID>AddSymbToF('''')"
1456 return 0
1457 endif
1458 execute "inoremap <expr> <buffer> ".a:mapkey." \<SID>AddSymbToF('".a:mapkey.
1459 \"')"
1460 return 0
1461 endfunction
1462 function s:CreatMapsToF(transsymb, crntrs)
1463 for key in keys(a:transsymb)
1464 if key!~"^.$"
1465 continue
1466 endif
1467 if !has_key(b:trPluginToFMainDict["maps"], key)
1468 call extend(b:trPluginToFMainDict["maps"],
1469 \{ key : maparg(key, "i") })
1470 call s:CreatMapToF(key)
1471 endif
1472 if key=~"\\l" && !has_key(b:trPluginToFMainDict["maps"], toupper(key))&&
1473 \!( type(a:transsymb[key])==type({}) &&
1474 \has_key(a:transsymb[key],"options") &&
1475 \has_key(a:transsymb[key]["options"],"capital") &&
1476 \ a:transsymb[key]["options"]["capital"]=="none")
1477 call extend(b:trPluginToFMainDict["maps"],
1478 \{ toupper(key) : maparg(toupper(key), "i") })
1479 call s:CreatMapToF(toupper(key))
1480 endif
1481 if type(a:transsymb[key])==type({})
1482 call s:CreatMapsToF(a:transsymb[key], 0)
1483 endif
1484 endfor
1485 if a:crntrs
1486 for key in keys(b:trPluginToFMainDict["StopTrSymbs"])
1487 call extend(b:trPluginToFMainDict["maps"],
1488 \{ key : maparg(key, "i") }, "keep")
1489 call s:CreatMapToF(key)
1490 endfor
1491 for key in keys(b:trPluginToFMainDict["StartTrSymbs"])
1492 call extend(b:trPluginToFMainDict["maps"],
1493 \{ key : maparg(key, "i") }, "keep")
1494 call s:CreatMapToF(key)
1495 endfor
1496 call extend(b:trPluginToFMainDict["maps"], {
1497 \join(b:trPluginToFMainDict["BrkSeqSymbs"], ""):
1498 \maparg(join(b:trPluginToFMainDict["BrkSeqSymbs"], ""),
1499 \"i") }, "keep")
1500 execute "inoremap <expr> <buffer> ".
1501 \join(b:trPluginToFMainDict["BrkSeqSymbs"], "").
1502 \" \<SID>ClrSeq()"
1503 endif
1504 return b:trPluginToFMainDict["maps"]
1505 endfunction
1506
1507 function InitToF(...)
1508
1509 if exists("b:trPluginToFMainDict") &&
1510 \has_key(b:trPluginToFMainDict, "transsymbseq") &&
1511 \b:trPluginToFMainDict["transsymbseq"]!=[]
1512 call s:StopToF()
1513 endif
1514 let b:trPluginToFMainDict={
1515 \"maps": {},
1516 \"lastpos": [line('.'), col('.')],
1517 \"transsymbseq": [],
1518 \"trseq": [],
1519 \"dotranslit": 0,
1520 \"lastupper": -1,
1521 \"StopTrSymbs": "",
1522 \"StartTrSymbs": "",
1523 \"BrkSeqSymbs": ""
1524 \}
1525
1526 if len(a:000)
1527 if type(a:000[0])==type({})
1528 let l:transsymb=a:000[0]
1529 if !has_key(l:transsymb, "checked") ||
1530 \l:transsymb["checked"]!="\<SID>"
1531 silent! if CheckTransTable(l:transsymb)
1532 echoerr "Таблица транслитерации не прошла проверку!"
1533 return 1
1534 else
1535 call extend(l:transsymb, {"checked": "\<SID>"}, "force")
1536 endif
1537 endif
1538 elseif type(a:000[0])==type("")
1539 if a:000[0]=="stop"
1540 return s:StopToF()
1541 elseif a:000[0]=="default"
1542 let l:transsymb=g:trPluginDefaultTranssymb
1543 elseif a:000[0]=="i" || a:000[0]=="l" || a:000[0]=="c" ||
1544 \a:000[0]=="!"
1545
1546 echoerr "Транслитерация по мере ввода для других режимов".
1547 \" не сделана!"
1548 if len(a:000)>1
1549 return InitToF(a:000[1])
1550 endif
1551 else
1552 if exists(a:000[0])
1553 execute "let l:transsymb=".a:000[0]
1554 if type(l:transsymb)!=type({})
1555 echoerr "Не удалось загрузить табилцу транслитерации!"
1556 return 2
1557 else
1558 silent! if CheckTransTable(l:transsymb)
1559 echoerr "Таблица транслитерации не прошла проверку!"
1560 return 1
1561 else
1562 call extend(l:transsymb, {"checked": "\<SID>"},
1563 \"force")
1564 endif
1565 endif
1566 else
1567 echoerr "Указанное имя переменной не существует!"
1568 return 4
1569 endif
1570 endif
1571 elseif type(a:000[0])==type(0) && a:000[0]==0
1572 return s:StopToF()
1573 else
1574 echoerr "Неправильный аргумент!"
1575 return 3
1576 endif
1577 else
1578 let l:transsymb=g:trPluginDefaultTranssymb
1579 endif
1580
1581 if !exists("b:trPluginStartTrSymbs")
1582 let b:trPluginToFMainDict["StartTrSymbs"]=g:trPluginStartTrSymbs
1583 else
1584 let b:trPluginToFMainDict["StartTrSymbs"]=b:trPluginStartTrSymbs
1585 endif
1586 if !exists("b:trPluginStopTrSymbs")
1587 let b:trPluginToFMainDict["StopTrSymbs"]=g:trPluginStopTrSymbs
1588 else
1589 let b:trPluginToFMainDict["StopTrSymbs"]=b:trPluginStopTrSymbs
1590 endif
1591 if !exists("b:trPluginBrkSeqSymbs")
1592 let b:trPluginToFMainDict["BrkSeqSymbs"]=g:trPluginBrkSeqSymbs
1593 else
1594 let b:trPluginToFMainDict["BrkSeqSymbs"]=b:trPluginBrkSeqSymbs
1595 endif
1596
1597 let b:trPluginToFMainDict["transsymbseq"]=[l:transsymb]
1598 let b:trPluginToFMainDict["lastupper"]=-1
1599 let b:trPluginToFMainDict["trseq"]=[]
1600 call s:CreatMapsToF(b:trPluginToFMainDict["transsymbseq"][0], 1)
1601 let b:trPluginToFMainDict["dotranslit"]=1
1602 return 0
1603 endfunction
1604
1605 function s:StopToF()
1606 let b:trPluginToFMainDict["transsymbseq"]=[]
1607 let b:trPluginToFMainDict["trseq"]=[]
1608 let b:trPluginToFMainDict["dotranslit"]=0
1609 let b:trPluginToFMainDict["lastupper"]=-1
1610 call s:DeleteMaps()
1611 return 0
1612 endfunction
1613
1614 function s:BSSeq()
1615 let l:returnedSeq=""
1616 if len(b:trPluginToFMainDict["trseq"])>1
1617 let l:i=len(substitute(b:trPluginToFMainDict["trseq"][-2],
1618 \".", ".", "g"))
1619 while l:i>0
1620 let l:returnedSeq.="\<BS>"
1621 let l:i-=1
1622 endwhile
1623 endif
1624 return l:returnedSeq
1625 endfunction
1626
1627 function s:TransToF(symb, transsymb)
1628 let l:symb=a:symb
1629
1630 if b:trPluginToFMainDict["lastupper"]!=0 && l:symb=~"\\u" &&
1631 \!has_key(a:transsymb, l:symb) &&
1632 \ has_key(a:transsymb, tolower(l:symb)) &&
1633 \ !(type(a:transsymb[tolower(l:symb)])==type({}) &&
1634 \has_key(a:transsymb[tolower(l:symb)],"options") &&
1635 \has_key(a:transsymb[tolower(l:symb)]["options"],
1636 \"capital") &&
1637 \a:transsymb[tolower(l:symb)]["options"]["capital"]=="none")
1638 let b:trPluginToFMainDict["lastupper"]=1
1639 let l:symb=tolower(l:symb)
1640 endif
1641 if b:trPluginToFMainDict["lastupper"]==-1 && l:symb!~"\\u"
1642 let b:trPluginToFMainDict["lastupper"]=0
1643 endif
1644
1645 if has_key(a:transsymb, l:symb)
1646
1647 if type(a:transsymb[l:symb])==type("")
1648 call add(b:trPluginToFMainDict["trseq"],
1649 \((b:trPluginToFMainDict["lastupper"]==1)?
1650 \(toupper(a:transsymb[l:symb])
1651 \): (a:transsymb[l:symb])))
1652 if b:trPluginToFMainDict["lastupper"]==1
1653 let l:symb=toupper(a:transsymb[l:symb])
1654 else
1655 let l:symb=a:transsymb[l:symb]
1656 endif
1657 let l:symb=s:BSSeq().l:symb
1658 call s:ClrSeq()
1659
1660 else
1661 call add(b:trPluginToFMainDict["transsymbseq"],
1662 \b:trPluginToFMainDict["transsymbseq"][-1][l:symb])
1663 if has_key(b:trPluginToFMainDict["transsymbseq"][-1], "none")
1664 call add(b:trPluginToFMainDict["trseq"],
1665 \((b:trPluginToFMainDict["lastupper"]==1)?
1666 \(toupper(b:trPluginToFMainDict["transsymbseq"][-1]["none"])
1667 \):(b:trPluginToFMainDict["transsymbseq"][-1]["none"])))
1668 let l:symb=((b:trPluginToFMainDict["lastupper"]==1)?
1669 \(toupper(b:trPluginToFMainDict["transsymbseq"][-1]["none"])
1670 \):(b:trPluginToFMainDict["transsymbseq"][-1]["none"]))
1671 let l:symb=s:BSSeq().l:symb
1672 else
1673
1674 if !len(b:trPluginToFMainDict["trseq"])
1675 call add(b:trPluginToFMainDict["trseq"], "")
1676 endif
1677 let b:trPluginToFMainDict["trseq"][-1].=l:symb
1678 endif
1679 endif
1680
1681 else
1682 return 0
1683 endif
1684
1685 return l:symb
1686 endfunction
1687
1688 function s:ClrSeq()
1689 let b:trPluginToFMainDict["trseq"]=[]
1690 let b:trPluginToFMainDict["transsymbseq"]=
1691 \b:trPluginToFMainDict["transsymbseq"][0:0]
1692 let b:trPluginToFMainDict["lastupper"]=-1
1693 return ""
1694 endfunction
1695
1696 function AddSymbToF(symb)
1697 return s:AddSymbToF(a:symb)
1698 endfunction
1699 function s:AddSymbToF(symb)
1700 let l:curpos=[line('.'), col('.')]
1701
1702 if !b:trPluginToFMainDict["dotranslit"]
1703 if has_key(b:trPluginToFMainDict["StartTrSymbs"], a:symb)
1704 let b:trPluginToFMainDict["dotranslit"]=1
1705 let b:trPluginToFMainDict["lastpos"]=l:curpos
1706 return b:trPluginToFMainDict["StartTrSymbs"][a:symb]
1707 else
1708 if has_key(b:trPluginToFMainDict["maps"], a:symb) &&
1709 \b:trPluginToFMainDict["maps"][a:symb]!=""
1710 execute "return \"".
1711 \escape(b:trPluginToFMainDict["maps"][a:symb],
1712 \"\\\"<")."\""
1713 endif
1714 return a:symb
1715 endif
1716 endif
1717
1718 if has_key(b:trPluginToFMainDict["StopTrSymbs"], a:symb)
1719 call s:ClrSeq()
1720 let b:trPluginToFMainDict["dotranslit"]=0
1721 let b:trPluginToFMainDict["lastpos"]=l:curpos
1722 return b:trPluginToFMainDict["StopTrSymbs"][a:symb]
1723 endif
1724
1725 if l:curpos[0]!=b:trPluginToFMainDict["lastpos"][0] || (
1726 \l:curpos[1]!=b:trPluginToFMainDict["lastpos"][1])
1727 call s:ClrSeq()
1728 endif
1729
1730 let l:returnedTrans=s:TransToF(a:symb,
1731 \b:trPluginToFMainDict["transsymbseq"][-1])
1732 let l:symb=""
1733 if type(l:returnedTrans)==type(0)
1734 call s:ClrSeq()
1735 let l:returnedTrans=s:TransToF(a:symb,
1736 \b:trPluginToFMainDict["transsymbseq"][-1])
1737 if type(l:returnedTrans)!=type(0)
1738 let l:symb=l:returnedTrans
1739 else
1740 let l:symb=a:symb
1741 endif
1742 else
1743 let l:symb=l:returnedTrans
1744 endif
1745
1746 if len(b:trPluginToFMainDict["trseq"])
1747 let b:trPluginToFMainDict["lastpos"]=[line('.'), col('.')+len(l:symb)]
1748 if len(b:trPluginToFMainDict["trseq"])>1
1749 let b:trPluginToFMainDict["lastpos"][1]-=
1750 \len(b:trPluginToFMainDict["trseq"][-2])*
1751 \(len("\<BS>")+1)
1752 endif
1753 endif
1754 return l:symb
1755 endfunction
1756
1757 function s:DeleteMaps()
1758 for key in keys(b:trPluginToFMainDict["maps"])
1759 if b:trPluginToFMainDict["maps"][key]!=""
1760 silent! execute "inoremap <buffer> ".key." ".
1761 \b:trPluginToFMainDict["maps"][key]
1762 else
1763 silent! execute "iunmap <buffer> ".key
1764 endif
1765 endfor
1766 let b:trPluginToFMainDict["maps"]={}
1767 endfunction
1768
1769
1770 function s:PrintN(string, n)
1771 let l:len=a:n-len(StringToList(a:string))
1772 if l:len<=0
1773 return a:string
1774 endif
1775 let l:returnedstring=a:string
1776 while l:len>0
1777 let l:returnedstring.=" "
1778 let l:len-=1
1779 endwhile
1780 return l:returnedstring
1781 endfunction
1782 function s:PrintL(list, counts)
1783 return s:PrintN(a:list[0], a:counts[0])." ".
1784 \s:PrintN(a:list[1], a:counts[1])." ".
1785 \a:list[2]
1786 endfunction
1787
1788 function s:TrShow(transsymb, ...)
1789
1790 let l:indent=""
1791 if len(a:000)
1792 let l:indent=a:000[0]
1793 endif
1794
1795
1796 let l:returnedlist=[]
1797 let l:skipindent=0
1798
1799 if has_key(a:transsymb, "none")
1800 let l:endl=" "
1801 if has_key(a:transsymb, "options") &&
1802 \has_key(a:transsymb["options"], "capital") &&
1803 \a:transsymb["options"]["capital"]=="none"
1804 let l:endl="c"
1805 endif
1806 call add(l:returnedlist, [l:indent, a:transsymb["none"], l:endl])
1807 endif
1808
1809 for key in keys(a:transsymb)
1810 if key=~"^.$"
1811 if type(a:transsymb[key])==type("")
1812 call add(l:returnedlist, [l:indent.key, a:transsymb[key], " "])
1813 continue
1814 elseif type(a:transsymb[key])==type({})
1815 call extend(l:returnedlist,
1816 \s:TrShow(a:transsymb[key], l:indent.key))
1817 endif
1818 endif
1819 endfor
1820
1821 if has_key(a:transsymb, "other")
1822 call add(l:returnedlist, [l:indent, a:transsymb["other"], "0"])
1823 endif
1824
1825 return l:returnedlist
1826 endfunction
1827
1828 function TrShow(...)
1829 let l:columns=0
1830 if len(a:000)
1831 if type(a:000[0])==type({})
1832 let l:transsymb=a:000[0]
1833 if !has_key(l:transsymb, "checked") ||
1834 \l:transsymb["checked"]!="\<SID>"
1835 silent! if CheckTransTable(l:transsymb)
1836 echoerr "Таблица транслитерации не прошла проверку!"
1837 return 1
1838 else
1839 call extend(l:transsymb, {"checked": "\<SID>"}, "force")
1840 endif
1841 endif
1842 elseif type(a:000[0])==type("") && a:000[0]=="default"
1843 if !exists("b:transsymb")
1844 let l:transsymb=g:trPluginDefaultTranssymb
1845 else
1846 let l:transsymb=b:transsymb
1847 endif
1848 else
1849 echoerr "Неправильный аргумент!"
1850 return 3
1851 endif
1852 if len(a:000)>1
1853 if type(a:000[1])==type(0) || type(a:000[1])==type("")
1854 if a:000[1]>0
1855 let l:columns=a:000[1]
1856 else
1857 echoerr "Неверное количество столбцов!"
1858 return 4
1859 endif
1860 else
1861 echoerr "Количество столбцов должно быть числом!"
1862 return 5
1863 endif
1864 endif
1865 else
1866 if !exists("b:transsymb")
1867 let l:transsymb=g:trPluginDefaultTranssymb
1868 else
1869 let l:transsymb=b:transsymb
1870 endif
1871 endif
1872 let l:gotlist=s:TrShow(l:transsymb)
1873 let l:counts=[0, 0]
1874 for item in l:gotlist
1875 let l:len=len(substitute(item[0], ".", ".", "g"))
1876 if l:len>l:counts[0]
1877 let l:counts[0]=l:len
1878 endif
1879 let l:len=len(substitute(item[1], ".", ".", "g"))
1880 if l:len>l:counts[1]
1881 let l:counts[1]=l:len
1882 endif
1883 endfor
1884 if !l:columns
1885
1886
1887
1888
1889
1890
1891
1892 let l:columns=(winwidth(0)+2)/(l:counts[0]+l:counts[1]+6)
1893 endif
1894 let l:i=0
1895 let l:returnedstring=""
1896 let l:len=len(l:gotlist)
1897 let l:lnum=l:len/l:columns
1898 if !l:lnum
1899 let l:lnum=1
1900 endif
1901
1902 while 1
1903 let l:returnedstring.=
1904 \s:PrintL(l:gotlist[(l:i/l:columns+(l:i%l:columns)*l:lnum)],
1905 \l:counts)
1906
1907 if l:i==l:len-1
1908 break
1909 elseif l:i%l:columns==l:columns-1
1910 let l:returnedstring.="\n"
1911 else
1912 let l:returnedstring.=" ║ "
1913 endif
1914 let l:i+=1
1915 endwhile
1916 return l:returnedstring
1917 endfunction
1918
1919