不用 X 的最佳选择

作者:Alessandro Rubini

如果您的系统没有运行 X-Windows,您可能会错过使交互式程序易于使用的鼠标支持。gpm,通用鼠标服务器,正是为您设计的。您无需使用来自各个鼠标供应商的众多鼠标驱动程序,其中一些工作良好,另一些则不然,您可以运行 gpm,它可以与所有鼠标通信,并且工作得非常好。本文解释了如何设置 gpm 以与您的鼠标和程序一起工作,并解释了如何设置您的文本控制台以获得最佳效果。

gpm 程序源自较早的 selection 程序,该程序仅用于 Linux 控制台上的剪切和粘贴。在客户端请求鼠标事件之前,gpm 的行为类似于 selection。由于 gpm 将每个控制台作为一个独立的实体进行管理,因此您可以像使用多窗口图形环境一样使用多控制台文本屏幕。本文指的是 gpm-1.0

配置鼠标设备

Linux 的一个主要问题是硬件兼容性,鼠标也不例外。公司总是发布新的鼠标,并且它们都为 DOS 提供了不同的鼠标驱动程序。Linux 用户只能独自面对他们的设备而没有驱动程序。幸运的是,公司倾向于收敛于少数“标准”协议,这些协议受到 XFree86 和 gpm 的支持。此外,gpm 软件包还包括 gpm-test,它可以帮助检测您自己的鼠标端口和协议,并建议您应该使用哪些命令行选项来调用守护程序。

您必须在命令行上向 gpm 提供协议名称和选项,以及您自己的偏好设置。这些设置将影响所有鼠标响应,直到服务器终止。一个偏好设置允许按钮重新排序:左撇子可以通过使用命令行选项 -B 321 重新排序按钮,而双按钮设备的所有者可以使用 -B 132 将右键用作中键,这是一种在 Emacs 中粘贴剪贴板的有用方法,而无需修改 Emacs 本身。当前版本的 gpm 服务器复制了 mconv2MultiMouse 的功能,并且可以充当“中继器”。您可以合并来自两个不同设备的事件,并将它们传递给 X 服务器。如果您使用带有内部指针和外部鼠标的笔记本电脑,这将非常有用。但是,如果您想在每只手中使用一个鼠标,但保持内部轨迹球处于活动状态,gpm 就无能为力了——一次最多只能读取两个鼠标设备。

如果您读取两个鼠标,则会自动启用“中继器”选项,但可以独立触发;如果您将 gpm 用作中继器,则可以将 X 服务器配置为读取 /dev/gpmdata,这是一个命名管道 fifo,gpm 在控制台处于图形模式时会将接收到的鼠标数据包放入其中。此选项旨在供总线鼠标的所有者使用,他们希望在不杀死和重启守护程序的情况下复用纯文本和 X 操作。新型双模式鼠标的所有者也会喜欢它,因为只有在鼠标初始化时按下中键时,它们才会运行三键协议,因为设备仅在启动时初始化。

gpm 如何工作?

gpm 守护程序的核心目前围绕 select() 系统调用构建,该进程在系统的用户空间内存中运行。守护程序的主循环监听 Unix 域套接字和鼠标,并将它们结合使用,以复用事件检索和新客户端的管理。gpm 的主循环可以(并且已经)用于构建网络服务的并发守护程序,只需修改一些细节即可。

最初选择用户空间服务器用于鼠标是为了帮助低端设备的所有者——该进程可以在不使用时换出,从而节省一点宝贵的内存。不幸的是,当您使用 Emacs 时,鼠标事件传递中的可察觉延迟会严重降低性能,并且在稍微负载的机器上同时使用鼠标和键盘是完全不合理的。

可以通过将进程锁定在内存中来消除换入延迟,但在 Emacs 的情况下,应该将两个进程锁定在内存中。gpm-2.0 的目标是取代当前版本,它将在用户进程和内核模块之间提供选择。运行内核模块的优点主要是上下文切换更少(并且完全没有换入延迟),而主要的缺点是内存浪费。模块替代方案将为客户端应用程序提供相同的接口,但将使用设备节点而不是套接字。

配置键盘

Linux 键盘是完全可定制的(您会怀疑吗?),并且可以为智能纯文本使用量身定制。其思想是减少上下文切换时间,以从您的多任务大脑中获得更多性能。这是虚拟控制台背后的基本思想。

以下是一些改进键盘的建议。我将描述一些有用的更改,然后给出 loadkeys 程序的相应行以实现更改。

  • Caps_Lock:为什么在“a”键附近有一个“Caps Lock”键?当大写锁定对于编写愚蠢的 BASIC 程序有用时,他们将其放置在远离字母键的位置;现在它没有那么有用了,他们把它变成了你小指的陷阱。只需摆脱它并将其变成 Control 键。

    alt-CapsLock will still yield CapsLock
    keycode 58 = Control
    control keycode 58 = Control
    
  • Control:左下角的 Control 键是我们放在“a”旁边的键的副本。您可以将其变成 Last_Console,从而实现快速的编辑器/编译器上下文切换。此外,这使您的手腕在打字时很有用。Last_Console 切换到您上次访问的控制台,并且是 Linux 键盘的几个奇特功能之一。

    keycode 29 = Last_Console
    
  • 数字小键盘除非您习惯了桌面计算器,否则数字小键盘太靠右,无法在键入数字时使用,并且可以变成控制台切换暂存器:按下 Alt-F8 需要一只手,而 Alt-F1 也不容易,至少在功能键位于顶部的键盘上是这样。同样,X-Windows 用户可以将小键盘配置为虚拟桌面的映射,前提是 Num_Lock 键保持原样:xmodmap 无法区分未 Num_Lock 的小键盘和箭头键。“0”键则适合成为另一个 Last_Console,如果您没有摆脱 Caps_Lock,这将非常有用。

    keycode  29 = Last_Console # KP_0
    keycode  79 = Console_1    # KP_1
    keycode  80 = Console_2    # KP_2
    keycode  81 = Console_3    # KP_3
    keycode  75 = Console_4    # KP_4
    keycode  76 = Console_5    # KP_5
    keycode  77 = Console_6    # KP_6
    keycode  71 = Console_7    # KP_7
    keycode  72 = Console_8    # KP_8
    keycode  73 = Console_9    # KP_9
    keycode  98 = Console_10   # KP_Divide
    keycode  55 = Console_11   # KP_Multiply
    keycode  96 = Console_12   # KP_Enter
    keycode  78 = Console_13   # KP_Add
    keycode  74 = Console_14   # KP_Subtract
    
  • Home 和 End 将 Home 配置为 Control -a,将 End 配置为 Control-e 会很有用。这适用于 bashtcshEmacs,无需任何其他调整。

    keycode 102 = Control_a
    keycode 107 = Control_e
    
  • Escape:如果您习惯了 Sparc2、旧 PC 或旧式的忠实 Apple II,您会喜欢将 Esc 键放在“1”附近。此更改迫使您重新定位反引号/波浪号对。此处所做的确切更改可能不适用于您的键盘,您最好使用 showkeys 检查您的键码。

    keycode  41 = Escape  # Escape
    alt     keycode   1 = Meta_Escape
    # recycle grave/asciitilde near the Enter key
    keycode  43 = grave   # asciitilde
    control keycode  41 = nul
    alt     keycode  41 = Meta_grave
    
  • 反斜杠:反斜杠/竖线对应该靠近“Z”,默认键盘配置将重复的 less/greater 放在那里。

    keycode  86 = backslash        bar
    control keycode  43 = Control_backslash
    alt     keycode  43 = Meta_backslash
    

上面列出的修改适用于我的键盘。在应用这些更改之前,请使用 showkeys 检查您的实际键码。showkeyskbd 软件包的一部分。如果您是真正的打字员,您可以充分利用十二个功能键。阅读 keytables(5) 手册页以进行进一步探索。有关如何修改键盘的更多信息,请参阅 Linux Journal #14 中的 Kernel Korner。

生成新的控制台

“当我只有 6 个控制台时,我为什么要使用数字小键盘在 15 个控制台之间切换?”我听到您说。Linux 可以处理多达 63 个虚拟控制台,而 6 个(或其他任何数字)只是您的系统中配置的“登录提示”的数量。实际上,控制台是在您的系统生命周期内动态创建和销毁的。

不同的 login: 提示由 init 进程生成,该进程通过读取文件 /etc/inittab 知道该怎么做;此文件指定应在何处调用 getty。即使您不完全理解 inittab,也可以使用它:要打开多于(或少于)6 个控制台进行登录,您只需复制(或删除)行即可。但是,您必须小心行中的第一个字段——它是该行的唯一“键”,并且必须正好是两个字母长。

对于 9 以上的控制台登录会话,我的选择是 cAcB 等,前九个条目是 c1c9

一种更有趣且节省内存的 Linux 会话方法是仅使用 /etc/inittab 生成一个或两个 getty,并根据需要动态分配其他 getty。有很多方法可以生成新的控制台

  • gpm-root:此工具可以在系统中编号最低的空闲控制台上生成新的 getty:只需按 control-mouse 唤醒程序,然后在正确的菜单项上再次按下鼠标按钮,您很快就会看到新创建的 login: 提示——就这么简单。当您从该控制台注销时,一切都会自动清理。这种生成控制台的方式的优点是 /etc/utmp 文件保持最新状态,因此 who 命令会告诉您真相。

  • open:微小的 open 实用程序会生成一个新的控制台并在其中执行程序。您可以使用 loadkeys 创建一个调用 open 的热键。因此,只需按一下键(或元键)即可登录。这种方法不会更新 utmp 数据库,并且仅当热键被馈送到 shell 提示符时才有效。

  • spawn_console:守护程序 spawn_console 是 kbd 软件包的一部分。它响应内核发送的信号(响应 Spawn_Console 键符)创建控制台。即使没有 shell 来获取您的按键,这种方法也有效,并且不会更新 utmp 数据库。

有什么区别?

第一个提出的方法不需要您进行任何干预——您应该仅在启动时调用 gpm 服务器和 gpm-root 客户端,而您已经应该这样做了。然后 gpm-root 客户端会处理所有事情。实际上,控制台仅通过打开它来创建,因此只需要 fork()exec() 即可。清理在子进程终止时执行。

其他方法在 kbd-0.90 的文档中进行了解释,并且仅在您需要再次更改键盘配置、运行额外的守护程序程序或检索额外的软件包(open 不是 kbd 软件包的一部分)时才稍微困难一些。额外的努力很小,因为所有艰苦的工作都在内核中实现。

更改文本模式

旧版本的 Linux 不允许控制台大小调整,并且应该从启动到关闭对控制台使用单一视频模式,通常是裸 80x25。Linux-95 (Linux-1.2) 允许控制台大小调整。用户程序 SVGATextMode 尽管名称笨拙,但它是一个很好的实用程序,可以动态更改文本控制台的外观。

该工具利用 ioctl(VT_RESIZE) 系统调用来更改内核中视频缓冲区的管理方式,并修改视频板中的内部寄存器,以便向您的显示器发送正确的信号。该程序必须以 root 权限运行,因为这两项任务都是特权任务。SVGATextMode 并非控制台大小调整领域的唯一选择,但它目前是最灵活的选择。

安装该程序很容易——只需 make && make install 即可。然后配置文件 /etc/TextConfig——您需要告诉 SVGATextMode 您的视频板中安装了哪个芯片组。TextConfig 文件充满了有用的注释。

唯一棘手的任务是将正在运行的应用程序重新排序到新的 tty 大小。配置文件提供了一个 ResetProg 行,您可以在其中放置一个可执行文件的路径名,该文件将处理此问题;它通常由向应用程序发送 SIGWINCH 组成,如示例 ResetProg 中所述。

特定模式的定义以 XF86Config 行为模型。X-Windows 配置文档和任何以前的 X-Windows 配置经验都可以帮助您使用文本模式。如果您要微调您的 X-Windows 屏幕,您可以轻松地使用 SVGATextMode 运行您的测试。其快速的周期时间使试错法更好,因为您无需为每次试验重新启动 X 服务器。微调文本模式的屏幕时序可以产生一个好的配置,可以粘贴到您的 XF86Config 文件中。或者,如果您已经设置了 X-Windows,您可以利用该知识来设置 SVGATextMode。

SVGATextMode 提供的其他功能包括自动字体加载和光标重塑。仅最后一个功能就足以成为在您的笔记本电脑上运行 SVGATextMode 的充分理由——无需再对内核进行修补即可拥有块光标。

与控制台大小调整相关的问题

如果您使用 SVGATextMode,尤其是在小型计算机上,您会注意到有时控制台大小调整会失败,即使您有足够的交换空间可用,有时甚至有足够的 RAM。问题与所需的内存类型有关;内核需要原子地完成系统调用 (ioctl()),并且它需要为每个活动控制台获取一个连续的内存块。没有时间换出某些进程或缩小缓冲区缓存,并且内核仅保留可用 RAM 的 1/64 用于这些“紧急”问题。因此,计算机越小,您使用的控制台越多,您就越容易调整大小失败。调整到较小的状态并不总是有帮助,因为内核必须确保在开始将视频数据复制到新区域之前,有空间容纳所有活动控制台,并且只有在最后才能释放旧缓冲区。如果失败,只需重试即可;第二次可能会成功。

另一个问题是 ResetProg 的作用。为什么有些应用程序可以很好地调整大小(例如 jed),另一些应用程序完全卡住(例如 selection),还有一些应用程序需要发送 SIGWINCH 信号?因为周围窗口的大小调整是一个异步事件,它不适合应用程序的正常环境。

应用程序分为三种类型:过于专注的应用程序经常查看窗口大小,并在事件发生时立即感知新情况;更传统的应用程序等待事件的异步通知(信号,即 SIGWINCH,用于 WINdow CHange),并以正确的方式响应通知;而某些应用程序根本不响应窗口大小的更改,并且忽略 SIGWINCH---当前版本的 selection 是在控制台大小调整可用之前编写的。因此,虽然调整大小的 xterm 会自行发送 SIGWINCH,但调整大小的控制台不会发送任何内容,并且需要外部 ResetProg 来填补空白。

文本控制台工具

以下工具在文本控制台上特别有效,有时甚至比在图形模式下更好。

  • gpm-root:gpm-root 是一个根窗口管理器。它的作用是在屏幕背景上绘制菜单,就像您在 X 环境中所做的那样。默认情况下,它响应 control-mouse 事件,因为仅鼠标操作留给选择机制,如果您在文本控制台上工作,这是一个至关重要的功能。gpm-root 绘制的菜单从用户本地配置文件中读取,并且可以根据您自己的偏好进行定制。gpm-root 允许控制台切换、控制台锁定、打开新控制台以创建新的系统登录、检索系统信息和执行外部命令,以及递归菜单。用户配置文件在需要时会重新解析,以简化试错菜单编写。

  • Emacs Emacs 编辑器通过加载 gpm 发行版中附带的 t-mouse.el 软件包来实现鼠标灵敏度。X Window 系统下可用的所有功能都在文本控制台上复制,包括滚动条。滚动条作用于屏幕的最后一列,平滑滚动是通过可变分辨率小部件实现的——您将鼠标向左移动得越多,响应垂直运动发生的滚动就越少。元鼠标按钮按下会独立于鼠标位置触发滚动条。

  • Jed:Jed 编辑器也对鼠标敏感。鼠标支持由 Jed 的作者开发,因此完美集成。如果您拥有一台小型计算机,Jed 是 Emacs 的一个很好的替代品——它在磁盘使用量和内存占用方面都小得多,但提供相同的基本命令和界面,以及它自己的扩展语言。好吧,如果您学习了“elisp”来配置 Emacs,难道您不会学习“slang”来配置 Jed 吗?

  • dialog:dialog 程序没有什么特别之处,只是它在文本控制台上运行得绝对比在 xterm 下更好。在控制台上使用 dialog 菜单管理 Slackware 安装非常轻松,尤其是当您可以与鼠标交互时。相反,在 xterm 下,dialog 菜单看起来很丑陋,并且可用的鼠标事件仅限于按钮按下,因此您几乎被迫使用键盘。此外,curses 库倾向于使用 xterm 提供的备用屏幕,因此消息框只是不可见的,您会想知道为什么终端在周围空转而没有任何消息显示。

  • mc:mcThe Midnite Commander)是一个功能强大的文件管理器,以著名的 DOS 命令 nc 为模型,但比原始命令强大得多。mc 是完全可配置和可扩展的,并且在管理您的文件系统状态方面做得很好。您可以使用鼠标和键盘使用其菜单,而 shift-mouse 像往常一样运行选择。

  • screen:screen 实用程序是打开大量控制台的可行替代方案。它在单个物理连接上管理最多十个终端会话。screen 提供了许多功能,如果您使用 vt100 或运行 kermit 的旧 PC 连接到您的 linux 机器,则它是必备工具。如果您真的渴望控制台并且没有足够的控制台,它也很有用。screen 的主要缺点是它模拟 vt100,因此您会丢失 Linux 控制台提供的所有额外功能。具体来说,您无法在 screen 下运行 gpm 感知程序。screen 的一个非常好的功能是视觉铃声功能。它也提供剪切和粘贴功能,但基于鼠标的选择更易于使用。

  • minicom:minicom 是一个易于使用的通信软件包,类似于 DOS 的 telix,具有面向菜单的设置。它提供了一个很好的脚本实用程序,使您的程序可以直接与串行连接的远程端对话。我使用 minicom 远程控制 Nicolet 示波器,无需担心通信参数。

  • gnuplot:它的名字说明了很多。一个可以读取外部 ASCII 文件的绘图程序,它的主要优点是能够管理许多不同的输出设备——包括裸终端。这意味着您无需启动 X-Windows 即可查看您的数据图。tty 图的粒度很粗糙,但 gnuplot 做得很好。它具有相当完整的内部帮助工具,您可以生成漂亮的 PostScript(或其他图形格式)图形,而无需进入图形环境。

进一步阅读

上面描述的所有工具都附带手册页或信息文件。mc 有一个很好的内部帮助实用程序。gpm-root 和 lisp 库 t-mouse.el 是 gpm 软件包的一部分。

纯文本资源

The Best Without X

Alessandro Rubini 正在攻读计算机科学博士学位课程,并在家中饲养了两台小型 Linux 计算机。他天性狂野,热爱徒步旅行、划独木舟和骑自行车。他编写了 gpm,可以通过 rubini@ipvvis.unipv.it 联系到他。

加载 Disqus 评论