下一页 上一页 目录

3. 控制台配置(文本模式)

关于 Linux 控制台配置的参考文档是 Andries Brouwer 的 Keyboard and Console HOWTO,可以在 LDP 仓库中找到。如其中所述,字符字体和键盘映射的配置是使用 KBD 软件包完成的,该软件包在所有 Linux 发行版中都有。

3.1 键盘映射

PC 上的每个按键都有一个数字代码。当我们按下其中一个按键时,键盘控制器处理器会将这个扫描码(也称为 scancode)以及按键被按下或释放的信号发送给计算机。事件序列随后由键盘驱动程序处理,并存储在字符队列中,应用程序通过调用操作系统函数来读取该队列。

键盘映射是一个文本文件,它建立按键的 scancode 与按下该按键时要生成的字符(或字符序列)之间的对应关系,称为 keycode。例如

    # atribuição da tecla '-' do teclado numérico à tecla com código 74
    keycode  74 = KP_Subtract     

    # atribuição da tecla '4' do teclado numérico à tecla com código 75
    keycode  75 = KP_4            

    # etc...

    keycode  76 = KP_5            # tecla 5
    keycode  77 = KP_6            # tecla 6
    keycode  78 = KP_Add          # soma
    keycode  79 = KP_1            # tecla 1
    keycode  80 = KP_2            # tecla 2

除了字母、数字和符号键之外,还有其他称为修饰键的按键,它们允许生成不对应于任何图形符号的代码:Shift Control AltMeta。后者通常在 PC 键盘上找不到,仅在 Sun、SGI、HP 和 Digital 等制造商的工作站中找到(他们不喜欢被称为“DEC”)。文本编辑器 Emacs 大量使用 Meta 键。

映射文件还允许指定称为“死键”(deadkeys)的特殊按键。当按下它们时,它们不会在屏幕上显示字符,而只是改变后续按键的行为,例如,当输入 ~ 后跟 a 时,会生成一个 `ã`。

3.2 屏幕翻译映射

屏幕翻译映射允许指定当程序想要显示字符 Y 时,要在屏幕上显示的字符 X。通过这种方式,我们可以使当在屏幕上写入代码为 c-cedilhado 的字符时,实际上显示另一个代码不同的字符,但其在我们字符字体中的图像对应于 c-cedilhado 的图像。

只有当我们想要使用字体,而该字体的字符没有与键盘映射中使用的集合直接对应的代码时,才需要此映射。

3.3 KBD 软件包的命令

Loadkeys

允许加载键盘映射。例如,以下命令加载存储在 portugal.map 文件中的映射。

    loadkeys /usr/lib/kbd/keytables/portugal.map
Setfont

允许加载屏幕字符字体,从而可以更改文本模式下使用的字体。例如,以下命令将加载具有 Latin-1 字符集的字体

    setfont lat1u-16.psf
Showfont

显示当前控制台中使用的字体中存在的所有字符。X 也有一个名为 showfont 的命令,用于显示特定字体的特征,但不显示字符本身。对于后一个目的,使用 xfd 命令。如果 KBD 软件包的 showfont 程序在 X 终端仿真器(如 xterm)中调用,它将生成一个错误“GIO_SCRNMAP: Invalid argument”,但不会造成任何损坏。

Mapscr

允许加载屏幕翻译映射。假设存在 /etc/portugal.trad 文件。如果我们执行命令

    mapscrn /etc/portugal.trad
那么从那时起,将使用那里定义的翻译。
Loadunimap

加载 Unicode 到屏幕字体的翻译映射。默认映射,名为“def.uni”,认为我们正在使用 IBM-PC 的标准字体。当我们使用具有 Unicode 标准中定义的字符的字体时,需要此命令,因为 setfont 程序会自动加载适当的映射表。以下命令将加载 latin-1 字体的翻译映射

    loadunimap lat1

3.4 加载字符字体

KBD 软件包包含两种类型的 Latin-1 编码字体

在较新版本的 KBD 中,文件使用 gzip 压缩。需要加载一种字体,该字体在 ISO 8859-1 标准中具有拉丁重音字符,并且具有半图形符号。名称为 iso01.* 的字体没有这些符号。最推荐的字体是 lat1u-16.psf

旧版本的 KBD 软件包将这些字体保存在 /usr/lib/kbd/consolefonts 目录中,在 0.92 版本之后,该目录被更改为 /usr/share/consolefonts。根据您的发行版及其更新程度,目录可能是其中之一。

Slackware

创建了脚本 /etc/rc.d/rc.font,其中包含以下内容

    #!/bin/sh
    #
    # /etc/rc.d/rc.font
    #
    # Seleciona uma das fontes de caracteres disponiveis em
    # /usr/lib/kbd/consolefonts.
    #
    setfont lat1u-16.psf

    # O comando a seguir é totalmente desnecessário
    # com a fonte lat1u-16.psf.
    # loadunimap lat1u

    # Remova o comentário da linha abaixo se estiver usando uma fonte sem
    # tabela de mapeamento de Unicode para tela:
    # loadunimap lat1

Debian

编辑文件 /etc/kbd/config 并放置包含以下内容的行

    CONSOLE_FONT=lat1u-16.psf
该文件由脚本 /etc/rc.boot/kbd 处理。执行它以激活新字体,而无需“重启”。永远记住:Linux 不是 Windows!

Red Hat

编辑文件 /etc/sysconfig/i18n 并查看是否包含以下内容

    LANG=pt_BR
    LINGUAS=pt_BR
    LC_CTYPE=ISO-8859-1
    LC_ALL=pt_BR
    SYSFONT=lat1u-16
    SYSTERM=linux-lat

Conectiva Red Hat Linux

如果您在安装期间选择了正确的语言,则无需执行任何其他操作。配置与 Red Hat 完全相同。

S.u.S.E.

编辑文件 /etc/rc.config 并查找以“FONT=”开头的行(在我使用 S.u.S.E. 版本 5.6 的机器上是第 64 行),并放置

    FONT=lat1u-16.psf

编辑目录 /etc/rc.d 中包含的脚本 boot.setupsingle。查找包含命令 /usr/bin/loadunimap 的行,并删除它或在其开头放置一个“#”以将其作为注释。请参阅关于此命令的评论,在 加载字符字体 部分。

测试字体

尝试一些按键,如 ``,.|!"#$%&/()=?'', 等,并使用命令 showfont 显示正在使用的字体。

3.5 加载键盘映射

接下来,需要加载适当的键盘映射。在 KBD 软件包的 0.92 版本之前,这些映射位于 /usr/lib/kbd/keytables 目录中,之后移动到 /usr/share/keytables。根据发行版,您将拥有一个或另一个目录。各种类型键盘的映射将在后面介绍。

Slackware。

创建了脚本 /etc/rc.d/rc.keyboard,其中包含以下内容

    #!/bin/sh
    #
    # /etc/rc.d/rc.keyboard
    #
    # Seleciona um dos mapas de teclado disponíveis no diretório
    # /usr/lib/kbd/keytables
    #
    loadkeys abnt2
并将以下行添加到 /etc/rc.d/rc.S 中,紧接在 /etc/rc.d/rc.keyboard 的处理之前
    # Carrega uma fonte de caracteres se existe um script rc.font.
    if [ -x /etc/rc.d/rc.font ]; then
      /etc/rc.d/rc.font start
    fi

    # Carrega um mapa de teclado se existe um script rc.keyboard.
    if [ -x /etc/rc.d/rc.keyboard ]; then
      /etc/rc.d/rc.keyboard start
    fi

Debian。

确保已安装 kbd 软件包,然后执行以下操作

Red Hat。

确保已安装 kbd 软件包。将提供的键盘映射文件(请参阅 必要的文件 部分)复制到 /usr/lib/kbd/keytables/ 目录(或从 Red Hat 5.2 开始的 /usr/lib/kbd/keymaps/i386/qwerty/)。无需解压缩它们。

编辑 /etc/sysconfig/keyboard 文件,并将要使用的映射名称放在 KEYTABLE 变量中,例如

    KEYTABLE="abnt2"

Conectiva Red Hat Linux。

CRHL 已经带有葡萄牙语的键盘映射。如果您在安装期间选择了正确的键盘,则无需执行任何其他操作。否则,编辑文件 /etc/sysconfig/keyboard 并放置

    KEYTABLE="nome"
其中“名称”是 br-abnt2ptus-acentos,具体取决于您的键盘布局是 ABNT-2、葡萄牙语还是美式键盘。

S.u.S.E..

确保已安装 kbd 软件包。将提供的键盘映射文件(请参阅 必要的文件 部分)复制到 /usr/lib/kbd/keytables/ 目录。无需解压缩它们。

解压缩适当的键盘映射,复制到 /etc/default.keytab 文件,例如使用如下命令

    zcat /usr/lib/kbd/keytables/pt.map.gz > /etc/default.keytab

测试键盘

尝试按下 c-cedilhado 键(如果键盘没有此键,请输入 'c)。验证所有带重音符号的字母(大写和小写)是否正确生成并在屏幕上显示。如果出现任何奇怪的字符,请检查是否加载了正确的键盘映射和字符字体,因为可能其中一个操作失败了。

如果显示的不是小写 c-cedilha 而是大写,则可能是加载了不正确的 Unicode 映射表。如果在 S.u.S.E. 发行版中未对系统脚本进行前面提到的更改,则会发生此问题。

3.6 检查错误

但是,如果某些字符仍然不显示怎么办?好吧,首先检查是否加载了适当的字体和键盘映射。一个特殊情况是当我们想要使用不遵循 ISO Latin-1 编码的字体时(PC 控制台的标准字体就是这种情况)。那么我们必须说服屏幕在每种情况下显示正确的字符。

我们可以求助于 mapscrn 命令。但是,翻译表文件必须由我们创建,遵循一个缓慢的尝试和错误的过程,直到找到我们想要其图像的字符。或者,以更简单的方式,我们可以使用 showfont 命令。

如果我们使用正确的字符字体,则不需要使用后一个命令。甚至建议不要使用这种资源,因为虽然它允许在一台计算机上创建“自定义”字符表,但在另一台没有相同配置的计算机上读取在该机器上生成的带重音符号的文档将很困难。


下一页 上一页 目录