如何在vim中搜索所有CJK字符?

kev*_*kev 7 regex unicode vim cjk

我可以使用unicode代码点搜索CJKchar(例如?):

/\%u5c0f
/[\u5c0f]
Run Code Online (Sandbox Code Playgroud)

我不能通过使用来搜索所有CJK字符[\u4E00-\u9FFF],因为vim手册说:

?help /[]
NOTE: The other backslash codes mentioned above do not work inside []!

这是一种做这项工作的方法吗?

tch*_*ist 2

Vim 实际上无法自己完成此操作,因为您无法访问 Unicode 属性,例如\\p{Han}.

\n\n

从 Unicode v6.0 开始,汉字字符的代码点范围为:

\n\n
2E80-2E99 2E9B-2EF3 2F00-2FD5 3005-3005 3007-3007 3021-3029 3038-303B 3400-4DB5 4E00-9FCB F900-FA2D FA30-FA6D FA70-FAD9 20000-2A6D6 2A700-2B734 2B740-2B81D 2F800-2FA1D \n
Run Code Online (Sandbox Code Playgroud)\n\n

而在 Unicode v6.1 中,汉码点的范围已更改为:

\n\n
2E80-2E99 2E9B-2EF3 2F00-2FD5 3005-3005 3007-3007 3021-3029 3038-303B 3400-4DB5 4E00-9FCC F900-FA6D FA70-FAD9 20000-2A6D6 2A700-2B734 2B740-2B81D 2F800-2FA1D \n
Run Code Online (Sandbox Code Playgroud)\n\n

我似乎还记得 Vim 在表达星体代码点方面存在困难,而这是正常工作所必需的。例如,使用\\x{HHHHHH}Java 7 或 Perl 的灵活表示法,您将拥有:

\n\n
[\\x{2E80}-\\x{2E99}\\x{2E9B}-\\x{2EF3}\\x{2F00}-\\x{2FD5}\\x{3005}-\\x{3005}\\x{3007}-\\x{3007}\\x{3021}-\\x{3029}\\x{3038}-\\x{303B}\\x{3400}-\\x{4DB5}\\x{4E00}-\\x{9FCC}\\x{F900}-\\x{FA6D}\\x{FA70}-\\x{FAD9}\\x{20000}-\\x{2A6D6}\\x{2A700}-\\x{2B734}\\x{2B740}-\\x{2B81D}\\x{2F800}-\\x{2FA1D}]\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,范围的最后一部分是\\x{2F800}-\\x{2FA1D},它超出了 BMP。但你真正需要的是\\p{Han}(意思是,\\p{Script=Han})。这再次表明,不\xe2\x80\x99t 支持至少UTS#18 级别 1 的正则表达式方言:基本 Unicode 支持不足以处理 Unicode。Vim\xe2\x80\x99s 正则表达式不足以完成基本的 Unicode 工作。

\n\n
\n\n

编辑添加

\n\n

这里\xe2\x80\x99 是转储适用于任何给定 Unicode 脚本的代码点范围的程序。

\n\n
#!/usr/bin/env perl\n#\n# uniscrange - given a Unicode script name, print out the ranges of code \n#              points that apply.\n# Tom Christiansen <tchrist@perl.com>\n\nuse strict;\nuse warnings;\n\nuse Unicode::UCD qw(charscript);\n\nfor my $arg (@ARGV) {\n    print "$arg: " if @ARGV > 1;\n    dump_range($arg);\n}\n\nsub dump_range {\n    my($scriptname) = @_;\n\n    my $alist = charscript($scriptname);\n    unless ($alist) {\n        warn "Unknown script \'$scriptname\'\\n";\n        return;\n    }\n\n    for my $aref (@$alist) {\n        my($start, $stop, $name) = @$aref;\n        die "got $name, not $scriptname\\n" unless $name eq $scriptname;\n        printf "%04X-%04X ", $start, $stop;\n    }\n    print "\\n";\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它的答案取决于 Perl \xe2\x80\x94 的版本,以及您运行它的 Unicode \xe2\x80\x94 的版本。

\n\n
$ perl5.8.8 ~/uniscrange Latin Greek\nLatin: 0041-005A 0061-007A 00AA-00AA 00BA-00BA 00C0-00D6 00D8-00F6 00F8-01BA 01BB-01BB 01BC-01BF 01C0-01C3 01C4-0241 0250-02AF 02B0-02B8 02E0-02E4 1D00-1D25 1D2C-1D5C 1D62-1D65 1D6B-1D77 1D79-1D9A 1D9B-1DBF 1E00-1E9B 1EA0-1EF9 2071-2071 207F-207F 2090-2094 212A-212B FB00-FB06 FF21-FF3A FF41-FF5A \nGreek: 0374-0375 037A-037A 0384-0385 0386-0386 0388-038A 038C-038C 038E-03A1 03A3-03CE 03D0-03E1 03F0-03F5 03F6-03F6 03F7-03FF 1D26-1D2A 1D5D-1D61 1D66-1D6A 1F00-1F15 1F18-1F1D 1F20-1F45 1F48-1F4D 1F50-1F57 1F59-1F59 1F5B-1F5B 1F5D-1F5D 1F5F-1F7D 1F80-1FB4 1FB6-1FBC 1FBD-1FBD 1FBE-1FBE 1FBF-1FC1 1FC2-1FC4 1FC6-1FCC 1FCD-1FCF 1FD0-1FD3 1FD6-1FDB 1FDD-1FDF 1FE0-1FEC 1FED-1FEF 1FF2-1FF4 1FF6-1FFC 1FFD-1FFE 2126-2126 10140-10174 10175-10178 10179-10189 1018A-1018A 1D200-1D241 1D242-1D244 1D245-1D245\n\n$ perl5.10.0 ~/uniscrange Latin Greek\nLatin: 0041-005A 0061-007A 00AA-00AA 00BA-00BA 00C0-00D6 00D8-00F6 00F8-01BA 01BB-01BB 01BC-01BF 01C0-01C3 01C4-0293 0294-0294 0295-02AF 02B0-02B8 02E0-02E4 1D00-1D25 1D2C-1D5C 1D62-1D65 1D6B-1D77 1D79-1D9A 1D9B-1DBE 1E00-1E9B 1EA0-1EF9 2071-2071 207F-207F 2090-2094 212A-212B 2132-2132 214E-214E 2184-2184 2C60-2C6C 2C74-2C77 FB00-FB06 FF21-FF3A FF41-FF5A \nGreek: 0374-0375 037A-037A 037B-037D 0384-0385 0386-0386 0388-038A 038C-038C 038E-03A1 03A3-03CE 03D0-03E1 03F0-03F5 03F6-03F6 03F7-03FF 1D26-1D2A 1D5D-1D61 1D66-1D6A 1DBF-1DBF 1F00-1F15 1F18-1F1D 1F20-1F45 1F48-1F4D 1F50-1F57 1F59-1F59 1F5B-1F5B 1F5D-1F5D 1F5F-1F7D 1F80-1FB4 1FB6-1FBC 1FBD-1FBD 1FBE-1FBE 1FBF-1FC1 1FC2-1FC4 1FC6-1FCC 1FCD-1FCF 1FD0-1FD3 1FD6-1FDB 1FDD-1FDF 1FE0-1FEC 1FED-1FEF 1FF2-1FF4 1FF6-1FFC 1FFD-1FFE 2126-2126 10140-10174 10175-10178 10179-10189 1018A-1018A 1D200-1D241 1D242-1D244 1D245-1D245\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以使用该corelist -a Unicode命令查看哪个版本的 Unicode 与哪个版本的 Perl 对应。这是选定的输出:

\n\n
$ corelist -a Unicode\n  v5.8.8     4.1.0     \n  v5.10.0    5.0.0     \n  v5.12.2    5.2.0     \n  v5.14.0    6.0.0     \n  v5.16.0    6.1.0     \n
Run Code Online (Sandbox Code Playgroud)\n