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 (<FI>) {
		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