Raku 允许使用 Unicode 字符作为变量名。许多运算符是用 Unicode 符号定义的(特别是 集合/包运算符)以及一些引号结构。因此,了解如何在编辑器、Raku shell 和命令行中输入这些符号非常重要,尤其是在键盘上没有这些符号作为实际字符时。

有关在各种操作系统和环境下输入 Unicode 的一般信息,请参阅维基百科的 Unicode 输入页面

XCompose (Linux) §

Xorg 包含使用 Compose 键 的二合字支持。AltGr + Shift 的默认值可以重新映射为更简单的值,例如 Capslock。在 GNOME 2MATE 中,可以在 首选项 → 键盘 → 布局 → 选项 → Compose 键位置 中进行设置。因此,例如,要输入 »+«,可以键入 CAPSLOCK > > + CAPSLOCK < <

XCompose 允许使用 .XCompose 文件自定义二合字序列,https://github.com/kragen/xcompose/blob/master/dotXCompose 是一个非常完整的示例。在 GNOME 中,XCompose 被覆盖并替换为硬编码列表,但可以通过在环境中设置 GTK_IM_MODULE=xim 来恢复 XCompose。可能还需要安装 xim 桥接器,例如 uim-xim

让 compose 在所有程序中生效§

您可能在所有程序中使用 compose 键时遇到问题。在这种情况下,您可以尝试使用 ibus

input_module=xim
export GTK_IM_MODULE=$input_module
export XMODIFIERS=@im=$input_module
export QT_IM_MODULE=$input_module

如果您希望此设置对所有用户生效,您可以将它放在 /etc/profile.d/compose.sh 文件中,这是最简单的方法,因为您无需处理不同的 GUI 环境如何设置其环境变量。

如果您使用 KDE,您可以将此文件放在 ~/.config/plasma-workspace/env/compose.sh 中,这应该可以正常工作。其他桌面环境可能有所不同。请查找如何在您的环境中设置环境变量,或者使用上述系统范围的选项。

ibus §

如果您在使用 xim 输入模块输入高码点符号(例如 🐧)时遇到问题,您可以改用 ibus。您需要为您的发行版安装 ibus 包。然后,您需要将其设置为在您的桌面环境加载时启动。需要运行的命令是

ibus-daemon --xim --verbose --daemonize --replace

设置 --xim 还可以让不使用 ibus 的程序仍然使用 xim 输入法,并保持向后兼容性。

XKB (Linux) §

X 窗口系统使用 XKB 扩展接收键盘事件,这使得读取各种键盘的输出成为可能,前提是存在配置文件。

XKB 提供了多布局移位级别的概念。例如,符号 a 是标记为“A”的键在级别 1 的输出;符号 A 属于级别 2 布局,通常使用 Shift 键访问。还有更多级别可用;可以将某个键(例如右 Alt 键或 AltGr)配置为第三级切换键。第三级修饰符和 Shift 键的组合将切换到第四个布局:级别 4。XKB 提供了添加第五级切换键的可能性,该键与 Shift 键组合使用将切换到第六个布局:级别 6。

有关更深入的解释,请参阅 此页面

这种方法的优点是,输入通常在普通键盘上无法访问的字符就像按下 Shift 键加另一个键来输出大写字母一样简单。

单用户配置§

对于个人配置,只需在 symbols 子目录中创建一个 .xkb 文件和一个符号文件即可。可以使用以下命令创建 .xkb 文件

setxkbmap -print > raku.xkb

以下是一个示例文件

xkb_keymap {
  xkb_keycodes  { include "evdev+aliases(qwerty)" };
  xkb_types     { include "complete" };
  xkb_compat    { include "complete" };
  xkb_symbols   { include "pc+raku(raku)+inet(evdev)+level3(ralt_switch)+compose(caps)" };
};

此文件声明了键盘生成的键码和屏幕上产生的符号。

在本例中,有一个 PC 型键盘,其配置位于 symbols/raku 文件中,该文件可能包含多个变体,其中选定的变体是名为 raku 的变体。 evdev 通用输入事件接口 管理事件收集。此配置使用右 Alt 键作为第三级切换键,使用 Caps Lock 键作为 Compose 键。

选择配置文件的基目录(例如,可能是 $HOME/.config/xkb)并将 raku.xkb 放入其中后,需要创建一个 symbols 目录,并将一个键布局文件放入其中。以下是一个示例文件,名为 raku

default  partial alphanumeric_keys modifier_keys
xkb_symbols "basic" {

    name[Group1]= "English (US)";

    key <TLDE> {  [     grave,  asciitilde  ]  };
    key <AE01> {  [    1,  exclam     ]  };
    key <AE02> {  [    2,  at    ]  };
    key <AE03> {  [    3,  numbersign  ]  };
    key <AE04> {  [    4,  dollar    ]  };
    key <AE05> {  [    5,  percent    ]  };
    key <AE06> {  [    6,  asciicircum  ]  };
    key <AE07> {  [    7,  ampersand  ]  };
    key <AE08> {  [    8,  asterisk  ]  };
    key <AE09> {  [    9,  parenleft  ]  };
    key <AE10> {  [    0,  parenright  ]  };
    key <AE11> {  [     minus,  underscore  ]  };
    key <AE12> {  [     equal,  plus    ]  };

    key <AD01> {  [    q,  Q     ]  };
    key <AD02> {  [    w,  W    ]  };
    key <AD03> {  [    e,  E    ]  };
    key <AD04> {  [    r,  R    ]  };
    key <AD05> {  [    t,  T    ]  };
    key <AD06> {  [    y,  Y    ]  };
    key <AD07> {  [    u,  U    ]  };
    key <AD08> {  [    i,  I    ]  };
    key <AD09> {  [    o,  O    ]  };
    key <AD10> {  [    p,  P    ]  };
    key <AD11> {  [ bracketleft,  braceleft  ]  };
    key <AD12> {  [ bracketright,  braceright  ]  };

    key <AC01> {  [    a,  A     ]  };
    key <AC02> {  [    s,  S    ]  };
    key <AC03> {  [    d,  D    ]  };
    key <AC04> {  [    f,  F    ]  };
    key <AC05> {  [    g,  G    ]  };
    key <AC06> {  [    h,  H    ]  };
    key <AC07> {  [    j,  J    ]  };
    key <AC08> {  [    k,  K    ]  };
    key <AC09> {  [    l,  L    ]  };
    key <AC10> {  [ semicolon,  colon    ]  };
    key <AC11> {  [ apostrophe,  quotedbl  ]  };

    key <AB01> {  [    z,  Z     ]  };
    key <AB02> {  [    x,  X    ]  };
    key <AB03> {  [    c,  C    ]  };
    key <AB04> {  [    v,  V    ]  };
    key <AB05> {  [    b,  B    ]  };
    key <AB06> {  [    n,  N    ]  };
    key <AB07> {  [    m,  M    ]  };
    key <AB08> {  [     comma,  less    ]  };
    key <AB09> {  [    period,  greater    ]  };
    key <AB10> {  [     slash,  question  ]  };

    key <BKSL> {  [ backslash,         bar  ]  };
};

partial alphanumeric_keys
xkb_symbols "raku" {

   include "raku(basic)"
   name[Group1]= "English (raku operators, with AltGr)";

   key <TLDE> { [     grave, asciitilde, dead_grave, leftsinglequotemark   ] }; //‘
   key <AE01> { [         1,     exclam,      U00B9                        ] }; //¹
   key <AE02> { [         2,         at,      U00B2                        ] }; //²
   key <AE03> { [         3, numbersign,      U00B3,      U2026            ] }; //³…
   key <AE04> { [         4,     dollar,      U2074                        ] }; //⁴
   key <AE05> { [         5,    percent,      U2075                        ] }; //⁵
   key <AE06> { [         6,asciicircum,      U2076                        ] }; //⁶
   key <AE07> { [         7,  ampersand,      U2077                        ] }; //⁷
   key <AE08> { [         8,   asterisk,      U2078,      multiply         ] }; //⁸×
   key <AE09> { [         9,  parenleft,      U2079                        ] }; //⁹
   key <AE10> { [         0, parenright,      U2070                        ] }; //⁰
   key <AE11> { [     minus, underscore,      U2212,      U207B            ] }; //⁻−
   key <AE12> { [     equal,       plus,      U2261,      U207A            ] }; //≡⁺
   key <BKSL> { [ backslash,        bar,      U2262,      U221E            ] }; //≢∞
   key <AD03> { [         e,          E,   EuroSign,      U1D452           ] }; //€𝑒
   key <AD05> { [         t,          T,      U03C4,      U2296            ] }; //τ⊖
   key <AD07> { [         u,          U,      U222A,      U2229            ] }; //∪∩
   key <AD09> { [         o,          O,      U2218                        ] }; //∘
   key <AD10> { [         p,          P,      U03C0                        ] }; //π
   key <AD11> { [ bracketleft,  braceleft,    U2260,      U201E            ] }; //≠„
   key <AD12> { [ bracketright, braceright,   U2245,      U201A            ] }; //≅‚
   key <AC01> { [         a,          A,      U2208,      U2209            ] }; //∈∉
   key <AC02> { [         s,          S,      U220B,      U220C            ] }; //∋∌
   key <AC09> { [         l,          L,      UFF62,      UFF63            ] }; //「」
   key <AC10> { [ semicolon,      colon,      U201C,      U201D            ] }; //“”
   key <AC11> { [apostrophe,   quotedbl,  rightsinglequotemark             ] }; //’
   key <AB02> { [         x,          X,      U2284,      U2285            ] }; //⊄ ⊅
   key <AB03> { [         c,          C,      U2282,      U2283            ] }; //⊂ ⊃
   key <AB05> { [         b,          B,      U228E,      U228D            ] }; //⊎⊍
   key <AB06> { [         n,          N,      U269B                        ] }; //⚛
   key <AB08> { [     comma,       less,   guillemotleft, U2264            ] }; //«≤
   key <AB09> { [    period,    greater,  guillemotright, U2265            ] }; //»≥
   key <AB10> { [     slash,   question,   division,      U2216            ] }; //÷∖

   include "level3(ralt_switch)"
};

此文件包含两个布局:第一个是美国键盘的基本布局,只有两个移位级别,第二个包含第一个布局,并使用两个额外的移位级别将一些 Unicode 符号添加到某些键中。此文件的格式在 这里 有记录。

对于不同的键盘,需要将标记为basic的第一个布局更改为与特定国家布局相关的布局。通常这些布局位于/usr/share/X11/xkb/symbols目录中。之后,需要修改第二个布局以符合特定语言键布局。

如果用户的基本目录是 $HOME/.config/xkb,则此命令将加载新的配置

xkbcomp -I$HOME/.config/xkb $HOME/.config/xkb/raku.xkb $DISPLAY

(可能有一些关于未定义符号的警告)

虽然这是一种非侵入式方法,但用户必须在需要时手动加载配置文件。

系统范围的配置§

这种方法的优点是,由于它修改了系统文件,用户可以使用桌面管理器提供的常用界面选择新的布局并使其永久生效。

缺点是用户必须拥有系统的 root 权限,并且系统升级可能会覆盖用户的布局文件。

要修改系统范围的配置,用户必须找到描述其语言映射的特定文件,并在其中添加上一节中显示的raku部分。

为了使新的布局显示在系统菜单中,用户必须在evdev规则文件中添加一个特定的描述,通常在/usr/share/X11/xkb/rules/evdev.xml中。找到与用户的语言键盘布局相对应的部分。例如,us布局的开头如下所示

  […]
  <layoutList>
    <layout>
      <configItem>
        <name>us</name>
        <!-- Keyboard indicator for English layouts -->
        <shortDescription>en</shortDescription>
        <description>English (US)</description>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
          […]

用户必须添加新定义的变体

        <variant>
          <configItem>
            <name>raku</name>
            <description>raku (Raku operators, with AltGr)</description>
            <languageList>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>

退出并重新登录后,新的变体应该出现在布局和变体的列表中。或者,用户现在可以使用以下命令加载布局

setxkbmap -layout us -variant raku

这实际上重新加载了us键盘的raku变体,但不幸的是,在多键盘使用的情况下,它会禁用其他键盘布局。

KDE§

如果您使用的是 KDE,请打开开始菜单并输入“Autostart”,然后单击Autostart,它应该是第一个结果。在打开的设置窗口中,单击添加程序,输入ibus-daemon,然后单击确定。然后进入弹出的窗口的应用程序选项卡。在命令字段中,输入上面显示的完整 ibus-daemon 命令,并将--desktop选项设置为--desktop=plasma。单击确定。现在,它应该在您再次登录时自动启动。

如何使用双键组合输入 Unicode 字符§

使用 XCompose 输入法,可以使用简单的双键组合输入 Unicode 字符。以下是一个配置示例,它将启用输入 Raku 使用的所有 Unicode 字符。此示例使用两个 Super 键作为dead keys。例如,要输入π符号,需要按住并释放右Super(或“Windows”)键,然后按住并释放p键。

<Super_R> <less>               : "«" guillemotleft
<Super_R> <greater>            : "»" guillemotright
<Super_R> <minus>              : "⁻"   U207B
<Super_R> <0>                  : "⁰"   U2070
<Super_R> <1>                  : "¹"   U00B9
<Super_R> <2>                  : "²"   U00B2
<Super_R> <3>                  : "³"   U00B3
<Super_R> <4>                  : "⁴"   U2074
<Super_R> <5>                  : "⁵"   U2075
<Super_R> <6>                  : "⁶"   U2076
<Super_R> <7>                  : "⁷"   U2077
<Super_R> <8>                  : "⁸"   U2078
<Super_R> <9>                  : "⁹"   U2079
<Super_R> <asterisk>           : "×"   U00D7
<Super_R> <slash>              : "÷"   U00F7
<Super_R> <E>                  : "𝑒"   U1D452
<Super_R> <p>                  : "π"   U03C0
<Super_R> <t>                  : "τ"   U03C4
<Super_R> <grave>              : "‘"   U2018
<Super_R> <apostrophe>         : "’"   U2019
<Super_R> <comma>              : "‚"   U201A
<Super_R> <colon>              : "“"   U201C
<Super_R> <quotedbl>           : "”"   U201D
<Super_R> <L>                  : "„"   U201E
<Super_R> <period>             : "…"   U2026
<Super_R> <bracketleft>        : "≡"   U2261
<Super_R> <bracketright>       : "≢"   U2262
<Super_L> <8>                  : "∞"   U221E
<Super_L> <O>                  : "∅"   U2205
<Super_L> <e>                  : "∈"   U2208
<Super_L> <E>                  : "∉"   U2209
<Super_L> <3>                  : "∋"   U220B
<Super_L> <numbersign>         : "∌"   U220C
<Super_L> <minus>              : "−"   U2212
<Super_L> <slash>              : "∖"   U2216
<Super_L> <o>                  : "∘"   U2218
<Super_L> <U>                  : "∩"   U2229
<Super_L> <u>                  : "∪"   U222A
<Super_L> <asciitilde>         : "≅"   U2245
<Super_L> <equal>              : "≠"   U2260
<Super_L> <less>               : "≤"   U2264
<Super_L> <greater>            : "≥"   U2265
<Super_L> <c>                  : "⊂"   U2283
<Super_L> <C>                  : "⊃"   U2283
<Super_L> <v>                  : "⊄"   U2284
<Super_L> <V>                  : "⊅"   U2285
<Super_R> <d>                  : "⊆"   U2286
<Super_R> <D>                  : "⊇"   U2287
<Super_R> <f>                  : "⊈"   U2288
<Super_R> <F>                  : "⊉"   U2289
<Super_R> <U>                  : "⊍"   U228D
<Super_R> <u>                  : "⊎"   U228E
<Super_L> <t>                  : "⊖"   U2296
<Super_L> <L>                  : "「"   UFF62
<Super_L> <l>                  : "」"   UFF63

用户可以将这些行添加到其 ~/.XCompose 文件中。要激活更改,用户需要退出其 X 会话并重新登录。请注意,由于 Ubuntu Gnome 使用一个Super键用于其自身目的,用户可能希望将一个或两个 Super_* 键替换为例如 Meta_R。

WinCompose (Windows) §

WinCompose 为 Windows 添加了组合键功能。它可以通过 GitHub 上的WinCompose 版本页面安装,也可以通过Chocolatey 包管理器安装。

安装并运行程序后,右键单击托盘图标并选择选项 → 组合 → 行为 → 组合键以设置所需的键。

WinCompose 在选项 → 组合 → 序列中有多个来源可供选择。建议启用XCompose并禁用Xorg,因为Xorg没有提供少数操作符的序列,并且Xorg还有一些序列与XCompose中存在的操作符序列冲突。可以通过右键单击托盘图标并选择显示序列来查看序列。如果您想添加自己的序列,可以通过在%USERPROFILE%中添加/修改.XCompose,或者在选项菜单中编辑用户定义的序列来实现。

终端、shell 和编辑器:§

XTerm§

XTerm 主要通过在 ~/.Xdefaults 中将 utf8utf8Fonts 选项设置为 1,以及将 locale 选项设置为 UTF-8 来启用 Unicode 支持。以下是一个支持显示足够 Unicode 字符以供 Raku 编程的示例配置。

XTerm*faceName:           xft:Noto Mono:style=Regular
XTerm*faceNameDoublesize: xft:Noto Emoji:style=Regular
XTerm*faceSize:           10
XTerm*locale:             UTF-8
XTerm*titleModes:         16
XTerm*utf8:               1
XTerm*utf8Fonts:          1
XTerm*utf8Title:          true

URxvt§

与 XTerm 类似,URxvt 主要通过在 ~/.Xdefaults 中将 locale 选项设置为 en_US.UTF-8 来启用 Unicode 支持。以下是一个支持显示足够 Unicode 字符以供 Raku 编程的示例配置。

URxvt*font:              xft:Noto Mono:pixelsize=14:style=Regular,\
                         xft:Noto Emoji:pixelsize=14:style=Regular
URxvt*letterSpace:       -1
URxvt*locale:            en_US.UTF-8
URxvt*skipBuiltInGlyphs: true

Unix shell§

在 bash shell 中,可以通过输入 Ctrl-Shift-u,然后输入 Unicode 代码点值,最后按回车键来输入 Unicode 字符。例如,要输入元素运算符 (∈) 的字符,请使用以下组合键(为了清晰起见,添加了空格)

Ctrl-Shift-u 2208 Enter

如果在 Unix shell 中启动了 REPL,则这也是在 raku REPL 中输入 Unicode 字符的方法。

Screen§

GNU Screen 确实支持 digraph 命令,但其 digraph 表格相当有限。借助 bindkeyexec,可以使用外部程序将字符插入到当前屏幕窗口中。

bindkey ^K exec .! digraphs

这将把 control-k 绑定到 shell 命令 digraphs。如果您更喜欢 Raku 友好的 digraph 表格而不是 RFC 1345,可以使用 digraphs,或者根据您的需要进行更改。

Vim §

Vim 中,Unicode 字符的输入(在插入模式下)是先按下 Ctrl-V(也表示为 ^V),然后按下 u,最后输入要输入的 Unicode 字符的十六进制值。例如,希腊字母 λ(lambda)可以通过以下组合键输入

^Vu03BB

您也可以使用 Ctrl-K/^K 以及 digraph 来输入一些字符。因此,使用 digraphs 的上述方法的另一种方法如下所示

^Kl*

Vim 提供的 digraph 列表在 这里 有记录;您可以使用 :digraph 命令添加自己的 digraph。

有关在 Vim 中输入特殊字符的更多信息,请参阅 Vim Wikia 页面关于 输入特殊字符 的内容。

vim-raku§

Vim 的 vim-raku 插件可以配置为选择性地用基于 Unicode 的运算符替换基于 ASCII 的运算符。这将在您键入时动态转换基于 ASCII 的运算符。

Emacs §

Emacs 中,Unicode 字符的输入是先输入和弦 C-x 8 RET,此时 minibuffer 中会出现文本 Unicode (name or hex):。然后输入 Unicode 代码点的十六进制数字,最后按回车键。现在 Unicode 字符将出现在文档中。因此,要输入希腊字母 λ(lambda),请使用以下组合键

C-x 8 RET 3bb RET

有关 Unicode 及其在 Emacs 中的输入的更多信息,请参阅 Unicode Encoding Emacs wiki 页面

您也可以使用 RFC 1345 字符助记符,方法是键入

C-x RET C-\ rfc1345 RET

C-u C-\ rfc1345 RET

要键入特殊字符,请键入 & 后跟助记符。Emacs 将在回显区域显示可能的字符。例如,希腊字母 λ(lambda)可以通过键入以下内容来输入

&l*

您可以使用 C-\ 切换 输入法

您可以用来插入特殊字符的另一种 输入法TeX。通过键入 C-u C-\ TeX RET 来选择它。您可以使用前缀(如 \)来输入特殊字符。例如,要输入 λ,请键入

\lambda

要查看输入法提供的字符和序列,请运行 describe-input-method 命令

C-h I TeX

Raku 中的一些有用字符§

智能引号§

这些字符在不同的语言中用作引号。在 Raku 中,它们用作 引号字符

现在可以构建这样的结构

say What?!;
say Whoa!“;
say „This works too!;
say There are just too many ways;
say here: no problem at all!# You can nest them!

这在 shell 中非常有用

raku -e 'say ‘hello world’'

因为您可以直接复制粘贴一些代码,而无需担心引号。

法式引号§

这些字符在法语和德语中用作引号。在 Raku 中,它们用作 插值词引号超运算符 以及 POD6 中的尖括号替代方案。

符号Unicode 代码点ASCII 等效项
«U+00AB<<
»U+00BB>>

因此,现在可以构建这样的结构

say (12) »+« (34);     # OUTPUT: «(4 6)␤» - element-wise add 
[123] »+=» 42;         # add 42 to each element of @array 
say «moo»;                 # OUTPUT: «moo␤» 
 
my $baa = "foo bar";
say «$baa $baa ber».raku;  # OUTPUT: «("foo", "bar", "foo", "bar", "ber")␤»

集合/包运算符§

所有 集合/包运算符 都有与集合理论相关的符号,下面列出了它们的 Unicode 代码点及其 ASCII 等效项。要组合这样的字符,只需输入字符组合和弦(例如,在 Vim 中为 Ctrl-V u;在 Bash 中为 Ctrl-Shift-u),然后输入 Unicode 代码点的十六进制数字。

运算符Unicode 代码点ASCII 等效项
U+2208(elem)
U+2209!(elem)
U+220B(cont)
U+220C!(cont)
U+2261(==)
U+2262!(==)
U+2286(<=)
U+2288!(<=)
U+2282(<)
U+2284!(<)
U+2287(>=)
U+2289!(>=)
U+2283(>)
U+2285!(>)
U+222A(|)
U+2229(&)
U+2216(-)
U+2296(^)
U+228D(.)
U+228E(+)

数学符号§

维基百科包含 Unicode 中的数学运算符和符号 的完整列表,以及指向其数学含义的链接。

希腊字符§

希腊字符可以用作变量名。有关希腊语和科普特语字符及其 Unicode 代码点的列表,请参见 Unicode 维基百科文章中的希腊语

例如,要将值 3 赋值给 π,请在 Vim 中输入以下内容(为了清晰起见,在「和」之间添加了空格到组合序列中)

my $«Ctrl-V u 03C0» = 3;  # same as: my $π = 3;
say $«Ctrl-V u 03C0»;     # same as: say $π;

上标和下标§

可以使用 U+207xU+208x 和(不太常见)U+209x 范围在 Unicode 中直接创建有限的 上标和下标 集。但是,要生成平方值(2 的幂)或立方值(3 的幂),需要使用 U+00B2U+00B3,因为这些是在 Latin1 补充 Unicode 块 中定义的。

因此,要编写函数 exp(x) 在零周围的 泰勒级数 展开,您需要在例如 vim 中输入以下内容

exp(x) = 1 + x + x«Ctrl-V u 00B2»/2! + x«Ctrl-V u 00B3»/3!
+ ... + x«Ctrl-V u 207F»/n!
# which would appear as
exp(x) = 1 + x + x²/2! + x³/3! + ... + xⁿ/n!

或者指定列表中从 1k 的元素

A«Ctrl-V u 2081», A«Ctrl-V u 2082», ..., A«Ctrl-V u 2096»
# which would appear as
A₁, A₂, ..., Aₖ