本章应以易读、有益且有趣的方式讨论指尖与眼睛之间的事物。我们的基本问题应该是 “生命、宇宙以及一切的意义。”
如果您在午夜叫醒任何在生活中见过电脑的人,并问他们如何启用斯洛伐克字符,他们肯定会提到字体之类的东西。事实上,字体用于在屏幕上显示字符——无论是在文本模式还是图形模式下。用于控制台和旨在操作字体的程序的字体位于 kbd 包中。安装后,字体文件位于目录/usr/lib/kbd/consolefonts/.
对于我们来说,最重要的是文件名中包含iso02, lat2, latin2或数字852的文件。这表明这些字体支持 ISO-8859-2 (latin2) 或 DOS 代码页 852,这些也是斯洛伐克语变音符号的标准。
注意,原始软件包名为 kbd,但存在其扩展版本,该版本出现在发行版中——console-tools。它们之间的差异很小,对于 kbd,我们将使用 setfont 命令,对于 console-tools,则使用 consolechars。此外,提供的字体名称略有不同,因此我将列出两个软件包的等效项。
存在几种用于存储字体的文件格式,但原理是相同的——文件包含 256 个图像(字形),所有图像都具有相同的尺寸(例如 8x16 像素——字体大小),并且每个图像都显示一个字符。
为了使这 256 个图像对我们有用,需要将字体从文件加载到显卡的字符生成器中。以下命令之一用于此目的
setfont 字体名称
consolechars -f字体名称
字体名称可以是字体文件的绝对路径或相对路径,或者文件名(如果它位于目录中)/usr/lib/kbd/consolefonts/, 无论是否带有扩展名。
为了更容易理解这些图像,请尝试替换为字体名称字符串t850并观察所有虚拟控制台上的结果。
您始终可以使用以下命令之一返回标准字体
sh$ setfont |
sh$ consolechars -d |
到底发生了什么? setfont/consolechars 程序将所有 256 个图像加载到 EGA/VGA 卡的字符生成器中。从那时起,在所有控制台上,ASCII 代码(例如 65)的字符将呈现为我们字体文件中的第 65 个图像。我再次提醒并两次强调,对于所有虚拟控制台,字体始终是相同的,这些控制台在相同的 EGA/VGA 卡字符生成器上显示字符。
重要的是要意识到,在内部,这实际上只是图像,并且字体中某个字符的形状与其 ASCII 代码没有任何关系。如果您自己创建了一个字体(在 kbd/console-tools 的文档中,您有关于所有格式的信息),其中第 65 个图像的形状为字母z,加载后,当您输入 Alt-6-5 时,这是字母 ASCII 代码A,将显示字符z。但是,如果您将此字符保存到文件中,则此文件中将包含值为 65 的字节,即字母A.
ISO-8859-2(以及其他)标准利用了这一点 - 它以相同的方式呈现与 ASCII 的共同字符,并将特定于给定字母表的字符 “映射” 到不太常用的 ASCII 表字符。我们不必关心哪个标准将变音符号放在哪里(除非我们创建自己的字体),重要的是,例如,英文文本保持不变(英语与斯洛伐克语共享所有字符),而斯洛伐克语文本不再包含与斯洛伐克语无关的愚蠢字符。
斯洛伐克语 (ISO-8859-2) 字体是 kbd 和 console-tools 包的一部分
lat2-{08,10,12,14,16}, lat2a-16, iso02.{08,14,16}
lat2-{08,10,12,14,16}, lat2u-16, iso02.f{08,14,16}
使用以下命令加载字体
sh$ setfont meno-zo-zoznamu |
sh$ consolechars -f meno-zo-zoznamu |
我建议使用lat2a-16,或者lat2u-16。其他字体可以完美地显示斯洛伐克字符,但当应用程序使用字符绘制框架时(例如 mc),就会出现问题。
至于字体iso02.*来自 kbd 包,使用它们时,需要在 setfont 命令中使用参数-m latin2u.trans。因此,加载这些字体之一的完整命令是
sh$ setfont iso02.16 -m latin2u.trans |
sh$ consoletrans -f lat2u-16 -m iso02 |
在文件latin2u.trans (iso02.acm)中,包含所谓的 应用程序字符集映射 (ACM),这是一个转换表,其中包含字体中每个字符及其 UTF-8 编码形式的行。
如果您找到了想要使用的字体,并希望在每次启动时自动加载它,那么没有什么比这更容易的了。初始化脚本rc.sysinit大致执行以下操作:检查文件是否存在/etc/sysconfig/i18n和程序(脚本)/sbin/setsysfont。如果是,则运行 setsysfont。它加载/etc/sysinfo/i18n并根据此文件中定义的变量,使用 consolechars 或 setfont 命令加载字体。
因此,只需在文件/etc/sysconfig/i18n中正确设置变量,脚本/sbin/setsysfont将为我们完成一切。您可以随时运行此脚本以加载设置为系统标准的字体。
文件中的变量/etc/sysinit/i18n是(仅使用不带路径和扩展名的文件名!)
SYSFONT=lat2a-16 |
SYSFONT=lat2u-16 SYSFONTACM=iso02 |
setsysfont 脚本包含在两个软件包中,您可以随时通过简单地输入以下内容来加载设置为系统标准的文件中的字体/etc/sysinit/i18n简单地输入
sh$ /sbin/setsysfont |
根据我们所说的,即对于所有虚拟控制台,只能设置一个公共字体,因此为每个用户单独加载字体设置没有太大意义。字体设置与您当前所在的计算机相关,而不是与您通过 ssh 等方式连接的计算机相关,这也与此有关。
尽管如此,我仍然可以想象这样一种情况,即一台计算机的多个用户中的一些用户需要不同的字体。在这种情况下,他们可以将字体加载命令插入到 shell 在登录和注销时执行的脚本中。对于 bash,它可能看起来像这样
if tty 2>/dev/null |grep '/dev/tty[0-9]*$' &>/dev/null && ! [ -f ~/.font ]; then setfont -o ~/.font gr928a-8x16 fi |
if tty 2>/dev/null |grep '/dev/tty[0-9]*$' &>/dev/null && [ -f ~/.font ]; then setfont ~/.font rm -f ~/.font fi |
这绝不是理想的解决方案,但它达到了目的(至少在第一次注销之前)。稍微研究一下,以便字体(和键盘布局)仅在第一次登录和最后一次注销时更改,并且 setfont 在 iX 下也没有太大意义,等等...在 Tips-HOWTO 中,有一种方法可以找出用户仍在多少个虚拟控制台上登录。
顺便说一句,为了清楚起见,这仅在本地计算机上有效 - 考虑一下为什么 setfont(以及 loadkeys)无法通过远程终端工作,以及如果不是这样,您是否会从中获得任何好处。
如果您认真对待这样的解决方案,那么最好考虑修改脚本/etc/profile.d/lang.sh,在该脚本中还会检查用户文件的内容~/.i18n,并据此加载脚本、键盘布局描述或某些变量...
当斯洛伐克语字体在控制台上运行并且我们的民族字符显示正确时,我们在斯洛伐克语方面遇到了第二个问题 - 如何获取这些字符?如果您只想阅读此文件而无需随后去看精神科医生,只需加载一些支持斯洛伐克语的字体就足够了。但由于您是一个有意识的 Linux 用户/有意识的女 Linux 用户,您立即想为 斯洛伐克语-HOWTO 做出贡献,并使用键盘输入斯洛伐克语文本。为此,您需要对键盘做一些事情。
目录/usr/lib/kbd/keymaps/i386/qwertz/和qwerty/在安装 kbd/console-tools 包后,还包含斯洛伐克语键盘布局的描述。对于我们来说,感兴趣的文件是
sk-prog-qwerty.map.gz |
sk-qwerty.map.gz |
sk-prog-qwertz.map.gz |
sk-qwertz.map.gz |
这些文件包含斯洛伐克语键盘布局的定义,它们之间的区别在于 Y 和 Z 键的位置,以及可以使用它们直接输入的斯洛伐克字符的数量(无需死键)。最像斯洛伐克打字机的是sk-qwertz,而与美国键盘相比,更改最少的是sk-prog-qwerty.
目录中的文件/usr/lib/kbd/keymaps/i386/include/包含基本键盘布局的描述(azerty, qwerty, qwertz),附加键(keypad, windowkeys),或问题键(delete, backspace, ctrl)。文件linux-*.inc.gz特定于 Linux(而不是语言)。例如,键(F1-F12,与 Ctrl 和 Shift 组合,最多 F48)、Shift-PgUp 和 Shift -PgDown 等。
键盘映射*.inc.gz不描述完整的键盘布局,而仅描述其某些部分。它们用于从文件 include (include) 中*.map.gz,这有利于简化键盘配置。例如,通过更改布局文件中的一行sk-qwerty,我们可以获得 qwertz 布局,或者(您可能会使用它)简单地禁用 euro 和 cent 字符,我们(目前?)不需要这些字符,并且它们不必要地占用了我们的 E 和 C 字符。
以下命令用于加载键盘布局描述文件
loadkeys 名称
其中名称可以是键盘映射文件的绝对路径或相对路径,或者文件名(如果它位于目录中)/usr/lib/kbd/keymaps/, 无论是否带有扩展名。。我们可以在上面提到的*.map.gz文件中找到标准斯洛伐克语键盘布局描述。如果您想返回标准布局,则命令
sh$ loadkeys -d |
如果您不喜欢任何标准斯洛伐克语键盘映射文件,这很可能归功于行
include "euro" |
我们只会讨论基本知识,这些知识将帮助我们修改现有的斯洛伐克语键盘 kmap 文件,以便您解决(我已知的)复杂问题,或根据自己的喜好调整键盘布局。
E 和 C 的问题是由于欧盟引入了单一货币造成的。罪魁祸首不是 EU,而是某人将 euro 和 cent 符号放在 AltGr-E 和 AltGr-C 上,这些是我们的普通 E 和 C。也就是说,大多数国家键盘的设计方式是,加载文件后,美国布局仍然有效,并且 Pause 键用于切换到国家模式,或者我们可以在同时按住 AltGr 键(右 Alt)时输入国家键。文件euro.inc,它定义了这两个问题符号,是从文件qwerty-layout.inc中包含的,而
qwerty-layout.inc
又包含斯洛伐克语键盘映射本身(sk-qwerty, sk-prog-qwertz,…)。解决方案非常简单 - 编辑qwerty-layout.inc(或qwertz-layout.inc),并用字符注释掉#行
include "euro" |
欧元的前一个问题也可以通过在文件
sk-qwerty.kmap.gz
本身中定义 E 和 C 字符来解决sk-qwerty.kmap.gz(或您使用的其他文件),使用单词keycode:keycode 18 = e keycode 46 = c |
在键盘映射文件中,对于每个键(或至少对于每个我们想要重新定义的键),都有一行大致如下
keycode 3 = two at lcaron two nul nul nul nul Meta_two Meta_two... |
后面的数字keycode表示某个键,而后面的字符串=表示当按下此键时,键盘驱动程序应生成的字符,无论是单独按下还是与特殊键 Shift、AltGr、Control、Alt、ShiftL、ShiftR、Ctrl 和 CtrlR 组合按下。这为我们提供了每个键 256 个可能的字符。
大多数情况下,只修改前 16 个修饰符组合。这是行
keymaps 0-15 |
在以下列表中,列出了这 16 个组合(按行排列)
无 | Shift | AltGr | Shift-AltGr |
Control | Shift-Control | AltGr-Control | Shift-AltGr-Control |
Alt | Shift-Alt | AltGr-Alt | Shift-AltGr-Alt |
Control-Alt | Shift-Control-Alt | AltGr-Control-Alt | Shift-AltGr-Control-Alt |
从斯洛伐克语键盘的角度来看,只有前四个是重要的 - 前两个通常是不变的美国字符,例如two at,即 2 @,而后两个是斯洛伐克字母表的字符,如果我们在按下此键的同时按住 AltGr 键(右 Alt),键盘驱动程序将发送到应用程序,例如lcaron two,即我们的 ľ 2。
为了输入斯洛伐克字符,您不必一直用鼻子按住 AltGr,但您可以使用 Pause/Break 键,它在国家键盘的上下文中充当 AltGr Lock。将其理解为,当您通过按 Pause/Break 键切换到斯洛伐克语模式时,每个键代码行中的前两个和后两个字符串会交换,例如
two at lcaron two -> lcaron two two at |
那时,您可以使用 AltGr 键输入美国键盘的字符,或者通过再次按下 Pause/Break 键切换回 US 模式。
代码为 41 的键的行(字符 ` 和 ~),在文件sk-qwerty.map.gz中具有以下形式
keycode 41 = grave asciitilde dead_diaeresis dead_circumflex ... |
我个人不喜欢这里放置了死键 dead_diaeresis(字符上方的两个点)和 dead_circumflex(软音符),因为我不需要它们 --- 毕竟斯洛伐克语键盘上有 ä 和 ť。即使没有,我也可以随意使用死键软音符来输入它们。我们将在关于组合序列的部分中详细讨论这一点。现在我想在这个位置放置字符 ; (分号) 和 ° (度数),就像我的键盘上的标签一样。所以我将该行更改为如下
keycode 41 = grave asciitilde semicolon degree ... |
顺便说一句,那个度数可能不是度数,而是字母上方十字的死字符,例如捷克语中的 u 上方,但这样的键对我们来说真的没用。我们宁愿写度数。
您可以在文件
us.map.gz
中找到用于定义各个键的字符名称,用于 ASCII 字符us.map.gz。程序showkey
将输出所有键的数字代码showkey
kmap 文件中特定于斯洛伐克语的字符名称规则
名称中的第一个字母指定我们想要为其使用变音符号的 ASCII 字符。
我们向其添加变音符号标识符
caron --- 软音符 |
acute --- 长音符 |
diaeresis --- 上方两个点 |
circumflex --- 扬抑符 |
例如
scaron = š |
uacute = ú |
Ocircumflex = ô |
其他特定于斯洛伐克语的字符名称
0xa7 --- § (段落) |
degree --- ° 度 |
为了正确解释带有变音符号的字符标识符,需要在 kmap 文件开头指定代码页,该键盘布局描述将用于该代码页。这是因为同一个字符在不同的代码页中可能具有不同的 ASCII 代码。隐式值为iso-8859-1,因此对于斯洛伐克语键盘映射,需要插入行
charset "iso-8859-2" |
另一个例子:如果您想使用斯洛伐克语布局qwertz和美国布局qwerty,您需要交换 Y 和 Z 字符
keycode 21 = y Y z Z keycode 44 = z Z y Y |
乍一看,这可能效果很好,但是当 Caps Lock 键启用时,问题就会显现出来 - Y 和 Z 字符仍然以小写字母书写。在编写键盘布局描述时,可以通过在给定键的代码行中的每个字母之前添加字母来处理此类问题+。字母+指定以下字母的 letter 属性,因此当按下 Caps Lock 键时,将写入大写字母。所有字母 a-z、A-Z 都会自动分配此属性,但这仅在键代码行具有以下形式时才成立
keycode 21 = y |
因此,在我们的例子中,我们必须显式地为所有字符分配此属性。因此,键盘映射的最终修改将是
keycode 21 = +y +Y +z +Z keycode 44 = +z +Z +y +Y |
对于字母交换,此解决方案可靠地工作,不幸的是,仍然没有一种方法可以实现例如在启用 Caps Lock 键的情况下,只需按下键即可输入带有变音符号的大写字母,就像 X Window System 的斯洛伐克语键盘布局描述中那样。
与死键相关的 kmap 文件中的行具有以下形式
compose 'c1' 'c2' to 'c3' |
将死字符想象成完全普通的字符,不同之处在于键盘驱动程序不会将它们发送到应用程序,而是会 “悬挂” 在某个地方,直到键盘传来下一个字符。键盘驱动程序也不会发送此字符,而是尝试将其与之前的死字符连接起来,然后才释放连接结果。嗯,以及如何进行连接,正是行compose在键盘映射文件中告诉它的。
下表列出了斯洛伐克语中使用的死字符列表,以及它们在组合序列中标记的含义和字符。
编写组合序列的步骤
每个组合序列都以关键字开头compose.
后面是死键的组合字符(根据表 死键),例如\'.
第二个是我们要与死键组合的字符,例如A.
在关键字to之后,是死键和不带变音符号的字符的连接结果,即ú.
在创建组合序列时,最好加载斯洛伐克语字体,以便您可以立即检查结果。 loadkeys 命令从标准输入读取的能力也很有帮助。例如
sh$ loadkeys include "/usr/lib/kbd/keymaps/i386/include/windowkeys.map.gz" keycode 41 = grave asciitilde semicolon dead_diaeresis compose '"' 'a' to '�' # ukončenie zad�vania: EOF - Ctrl-D sh$ |
您可以使用命令
dumpkeys
将当前键盘布局的描述保存到文件中sh$ dumpkeys > subor |
如果您没有加载斯洛伐克语键盘布局描述,则必须将这些字符作为 Alt 序列输入,或者以 0xed 格式插入它们的十六进制代码,对于 ú。程序
showfont
将为您输出当前字体的字符及其十六进制代码
showfont
showcfont
再次我们的组合序列和一些额外的序列
compose '\'' 'A' to '�' # dlh� A cez dĺžeň compose '^' 'O' to '�' # O s vok�ňom cez m�kčeň compose '^' 'a' to '�' # širok� a cez m�kčeň, compose '^' 'A' to 0x84 # ...preto nepotrebujeme dead_diaeresis |
顺便说一句,在文件/usr/lib/kbd/keymaps/compose/compose.latin2中,您有 ISO-8859-2 标准的组合序列列表。
为了设置我们想要在系统启动时加载的键盘布局,我们使用文件/etc/sysconfig/keyboard。对于像甜菜一样的斯洛伐克人来说,它至少应该看起来像这样
KEYTABLE=sk-qwerty # zavedie rozloženie kl�ves sk-qwerty KBCHARSET=iso-8859-2 # ...a spom�nan� s�bor compose.latin2 |
启动时设置键盘由脚本 keytable 负责,该脚本直接从rc.sysinit调用,因此无需在运行级别目录中创建链接3/multiuser,或5/X.
在 initscripts 的文档中,它写道:“如果您将键盘布局描述(使用 dumpkeys)保存到文件 /etc/sysconfig/console/default.kmap 中,它将在系统启动时在挂载/检查文件系统之前加载。如果您需要在出现问题时输入 root 密码,这可能会很有用。它必须是 “转储” 的键盘布局描述,而不是从 /usr/lib/kbd/keytables/ 复制的文件,因为这些文件通常仍然包含(include)来自此目录结构的其他描述。”
挂载文件系统后,如果存在可执行文件/etc/rc.d/init.d/keytable和目录/usr/lib/kbd/keymaps/,将执行命令
sh# /etc/rc.d/init.d/keytable start |
这将加载键盘布局描述,就像您在文件
/etc/sysconfig/keyboard
中使用变量指定的那样/etc/sysconfig/keyboard,因此您无需在各个rc[1-5].d/目录中创建链接。我们所说的关于在虚拟控制台上登录的某个用户更改字体的内容,也适用于键盘布局。最简单的解决方案(在第一次注销后会失效)可能如下
if tty 2>/dev/null |grep '/dev/tty[0-9]*$' &>/dev/null && ! [ -f ~/.keymap ]; then dumpkeys > ~/.keymap loadkeys gr.map fi |
if tty 2>/dev/null |grep '/dev/tty[0-9]*$' &>/dev/null && [ -f ~/.keymap ]; then loadkeys ~/.keymap rm -f ~/.keymap fi |
如果我没有在任何地方犯错,那么至少在 RedHat 和 Mandrake 发行版中,在这些更改之后,斯洛伐克语支持(字体 + 键盘)应该可以正常工作。
SYSFONT=lat2a-16 |
SYSFONT=lat2u-16 SYSFONTACM=iso02 |
KEYTABLE=sk-qwertz KBCHARSET=iso-8859-2 |
此外,如果您使用与标准布局不同的键盘布局输入 root 密码(us),请将其描述插入到文件/etc/sysconfig/console/default.kmap中。注意,您不能只是复制文件或创建链接!如果您想使用例如布局sk-qwertz,请执行以下操作
sh$ loadkeys sk-qwertz sh# dumpkeys >/etc/sysconfig/console/default.kmap |
如果您只想一次性设置斯洛伐克语字体和键盘,则这些命令应该可以做到
sh$ setfont lat2a-16 sh$ loadkeys sk-qwertz |
sh$ consolechars -f lat2u-16 -m iso02 sh$ loadkeys sk-qwertz |
...以及返回标准设置
sh$ setfont sh$ loadkeys -d |
sh$ consolechars -d sh$ loadkeys -d |