function! Yo() perl << EOF use encoding 'UTF-8'; use open ':utf8'; my $fileencoding = VIM::Eval('&fileencoding'); die "Error: кодировка файла не UTF-8!" unless $fileencoding eq 'utf-8'; sub bytelength($) { use bytes; length(shift); } sub remove_yo($) { my $x = shift; $x =~ tr/ёЁ/еЕ/; $x; } $yofile = VIM::Eval('expand(g:yofile)') || 'yo.txt'; VIM::Msg("Загрузка базы: $yofile..."); open(FI, "<$yofile") || die "Error: не получается открыть файл: $yofile!"; my %always_yo; my %maybe_yo; while () { chomp; if (/^([^?]+)(\??)$/) { my $w = $1; my $q = $2 eq '?' ? 0 : 1; my $w2 = remove_yo($w); push @{$q?$always_yo{$w2}:$maybe_yo{$w2}}, $w; } } close(FI); VIM::DoCommand("redraw"); my $auto = 0; my $interactive = 0; my $cancel; my $currow = ($curwin->Cursor())[0]; foreach my $row ($currow..$curbuf->Count()) { $_ = $curbuf->Get($row); utf8::upgrade($_); my $l = $_; while(!$cancel && /(\p{Cyrillic}+)/g) { my $w = $1; my $offset = $-[0]; my $length = $+[0] - $-[0]; next if $w =~ /[ёЁ]/ || $w !~ /[еЕ]/; my $w2 = lc(remove_yo($w)); my $w3 = ""; if (defined($always_yo{$w2})) { if (length(@{$always_yo{$w2}}) != 1) { } else { $w3 = ${$always_yo{$w2}}[0]; $auto++; } } elsif (defined($maybe_yo{$w2})) { $curwin->Cursor($row, 0); my $bytestart = bytelength(substr($l, 0, $offset)) + 1; my $byteend = $bytestart + bytelength(substr($l, $offset, $length)); VIM::DoCommand("match IncSearch /\\%${row}l\\%${bytestart}c\\_.*\\%${row}l\\%${byteend}c/"); VIM::DoCommand("redraw"); my $cnt = 0; my $choice = join "\n", map "&" . ($cnt++) . ":$_", @{$maybe_yo{$w2}}; $choice .= "\n" . join "\n", map "&$_", ("Yes","No","Cancel"); my $q = VIM::Eval("confirm(\"Выберите один из вариантов замены:\",\"$choice\")"); VIM::DoCommand("match"); if ($q == 0 || $q == $cnt+3) { $cancel = 1; } elsif ($q == $cnt+1) { $w3 = ${$maybe_yo{$w2}}[0]; $interactive++; } elsif ($q == $cnt+2) { } else { $w3 = ${$maybe_yo{$w2}}[$q-1]; $interactive++; } } if ($w3 ne "") { while($w =~ /\p{Lu}/g) { substr($w3, $-[0], 1) = uc(substr($w3, $-[0], 1)); } substr($l, $offset, $length) = $w3; $curbuf->Set($row, $l); } } last if $cancel; VIM::DoCommand("redraw"); } VIM::DoCommand("match"); VIM::Msg("Ёфикация завершена. Ёфицировано слов: " . ($auto+$interactive) . ", из них автоматически: $auto, интерактивно: $interactive"); EOF endfunction