fvwm 基本配置

作者:John M. Fisk

本文主要面向并献给所有加入全球 Linux 用户社区的新手和新来者。欢迎加入!本文将尝试向您介绍最通用和流行的 X 窗口管理器之一:fvwm(据我所知,它最初代表“Frugal Virtual Window Manager”,意为“节俭型虚拟窗口管理器”)。它当之无愧的流行度基于诸多因素,包括相对节省内存消耗、高度可定制的类似 Motif 3 的外观、虚拟桌面以及通过模块扩展功能的能力。

在我们开始之前,请允许我声明几个前提条件:

1. 您已安装 X 窗口系统和 fvwm 窗口管理器并使其正常工作;并且

2. 您愿意进行一些调整。

如果您符合以上条件,请继续阅读!

首先,一些背景知识:窗口管理器的概念本质上相当简单。X 窗口系统本身负责监督某些基本任务,例如管理显示硬件(显示器、键盘和鼠标)、处理鼠标和键盘事件以及创建显示器上出现的窗口。而窗口究竟如何显示和行为方式则由窗口管理器决定。诸如 fvwm 之类的窗口管理器通过提供装饰性的窗口框架、窗口控件、菜单、虚拟桌面等来控制您与程序的交互方式。更换不同的窗口管理器,即使在其下运行的程序完全相同,您也可以创建完全不同的外观和感觉。

fvwm 由 Robert Nation 开发,是最初的 MIT 窗口管理器之一 twmTabbed Window Manager,选项卡式窗口管理器,最初名为 Tom's Window Manager,以纪念其作者 Tom LaStrange)的衍生品。 fvwm 目前由 Chuck Hines 维护。最新的官方版本是 fvwm-1.24r,尽管 beta 版本—pre2.0pl40(截至 1995 年 12 月中旬)—也已可用。这些版本可以在以下位置找到: ftp://sunsite.unc.edu/pub/Linux/X11/window-managers/ ftp://ftp.hpc.uh.edu/pub/fvwm/ ftp://ftp.x.org/contrib/

此外,还有许多优秀的 WWW 页面专门介绍 fvwm,其中提供了丰富的信息、屏幕截图和示例 .fvwmrc 配置文件。其中包括

T.J. Kelly 的 fvwm 主页: www.cs.hmc.edu/~tkelly/docs/proj/fvwm.html

Todd Postma 的 fvwm 信息: http://xenon.chem.uidaho.edu/~fvwm/

Jens Frank 的 fvwm 文档: namu19.gwdg.de/fvwm/fvwm.html

Erik Kahler 的 fvwm 主页: mars.superlink.net/user/ekahler/fvwm.html

此时,可能值得一提的是,如果您认真对待自定义 fvwm,即使您不打算编译自己的版本,最好也获取源代码。为什么?某些 Linux 发行版不包含每个程序的完整文档。获取 fvwm 的源代码可确保您拥有完整的文档,包括各种 fvwm 模块的手册页。此外,如果您确实选择自己编译 fvwm,则可以确定要包含哪些功能。

那么,让我们开始吧!

我们将尝试涵盖的一些基本知识包括:

1. 管理配置文件

2. 在启动时启动程序

3. 向 fvwm 弹出菜单添加项目

4. 颜色自定义

请记住,此处提供的信息旨在用作入门指南。我建议您在阅读本文的同时,浏览 fvwm 的手册页。权威信息来源是程序源代码发行版附带的手册页和文档。

管理配置文件

您需要了解的关于 fvwm 的第一件事是配置文件的位置。当 fvwm 启动时,它首先在您的主目录中查找 .fvwmrc。例如,如果您的用户名是 johndoe,则 fvwm 会查找文件 /home/johndoe/.fvwmrc。如果此文件不存在,则它会查找系统范围的配置文件 /usr/lib/X11/fvwm/system.fvwmrc。如果这两个文件都不存在,它将直接退出。

您要做的第一件事之一是复制默认的系统范围配置文件,并将其放在您的主目录中:

$ cp /usr/lib/X11/fvwm/system.fvwmrc ~/.fvwmrc

务必将其复制到 ~/.fvwmrc,而不是 ~/system.fvwmrc。在您的主目录中创建文件副本是一个好主意,原因有以下几点:

1. 如果您的 .fvwmrc 文件损坏,fvwm 将退回到使用系统范围的配置文件。

2. 如果 ~/.fvwmrc 不小心被删除,您可以使用 system.fvwmrc 文件重新创建它。

3. 在多用户系统上,它允许每个用户自定义其自己的 .fvwmrc 文件。

一开始要考虑的另一个问题是顺序自定义。很有可能,在几周或几个月的时间里,当您自定义 fvwm 以使其按您想要的方式工作时,您会对配置文件进行许多小的和大的更改。当您不小心覆盖或删除 system.fvwmrc 或您的 .fvwmrc 时会发生什么?真是糟糕透了。

对于任何运行,并可能管理自己的 Linux 系统的人来说,管理系统配置文件非常重要。明智的做法是制定周密的计划,说明如何实施和跟踪更改。永远不要做您无法撤消的事情。 fvwm 使用单个配置文件,这使得这项任务相当简单。以下是一些建议。

在默认配置文件中进行任何更改之前,请对其进行备份并赋予其独特的后缀,例如 .dist。例如,在您首次编辑 system.fvwmrc 文件之前,您可以通过以下方式复制它:

# cp system.fvwmrc system.fvwmrc.dist

.dist 后缀会提醒您,这是一个来自发行版的原始文件。为了进一步保护它,您应该将其复制到 root(超级用户)拥有的目录,并将该目录的权限设置为仅读取和执行,root 用户除外。为此,您可以例如在您的 /etc 或 /usr/local 目录中创建一个名为 backups/ 的目录,然后将所有默认配置文件复制到此目录。

为此,以 root 用户身份登录并输入:

# mkdir /etc/backups
# chmod 755 /etc/backups

目录 权限设置为 755(以 root 用户身份)允许 root 用户完全读取、写入和执行权限,同时阻止其他所有人拥有写入权限。有了读取和执行权限,用户可以更改到该目录并执行文件列表,但不能(因为他们没有该目录的写入权限)删除文件。

在您创建备份目录并设置适当的权限后,您应该以 root 用户身份使用 .dist 后缀创建重要配置文件的备份副本。您还可以通过以下方式将每个文件的权限设置为只读:

# chmod 744 /etc/backups/system.fvwmrc.dist

这会将文件权限限制为除 root 用户外的所有用户只读。备份默认配置文件只有在实际有效时才有用。显然,您需要创建工作配置文件的备份副本。然而,这仍然没有解决如何跟踪您的每个更改的问题。以下是一些建议。

1. 在您修改了配置文件并确保其正常工作后,复制它并按顺序编号每个文件,例如:

fvwmrc.01
fvwmrc.02
fvwmrc.03 ...

可以通过以 #(井号)字符开头的行添加注释,并且可能应该包括日期和所做的修改。如果空间是一个问题,您可以压缩所有您当前未使用的文件。

2. 使用 RCS,即“版本控制系统”,来跟踪您的更改。在您对文件进行任何更改之前,运行 RCS check-in 程序:

$ ci -l .fvwmrc

它会要求您提供文件描述;输入:

fvwm configuration file
.

单独一行的 . 结束描述。

然后,每次您对文件进行更改时,运行相同的命令。它会要求您描述您刚刚所做的更改;输入类似:

Added Calculator, xjed, and Emacs to the
"Application" pop-up menu.
.

这样您以后就可以找到此更改。

RCS 将跟踪您对 .fvwmrc 所做的所有更改,并保存在名为“.fvwmrc,v”的文件中。它不是存储每个新版本的文件的完整副本,而是仅存储您所做的更改以及文件的最新版本。

您以后如何找到更改?命令行:

$ rlog .fvwmrc | less

将为您提供您所做的所有更改的历史记录。每个更改都有一个修订号,从 1.1 开始。

如果您想将文件的当前副本与您之前检入的版本进行比较,请使用此命令:

$ rcsdiff -u .fvwmrc | less

您可以使用以下命令检索您想要的任何版本的文件(覆盖当前版本):

$ co -rrevision .fvwmrc

如果您想了解有关如何使用 RCS 的更多信息,可以通过以下方式获得:

$ man rcsintro

它提供了您需要了解的概念和命令的良好概述。[Linux Journal 还在第 10 期第 36 页发表了对 RCS 的概述—编者注]

使用 RCS 系统仅比简单地复制每个修改后的文件稍微复杂一点的版本控制方法。但是,基础知识很容易掌握,并且可以用于任何正在进行顺序修订的文件—编程项目、文章、学期论文等。

开始运行

现在您已将 .fvwmrc 文件复制到您的主目录,并决定如何跟踪对其所做的更改,您就可以开始进行调整了!您可能首先感兴趣的事情之一是在 fvwm 启动时自动启动程序。您可能想要启动一两个 xterm、时钟或日历、xbiff(在邮件到达时警告您)等等。 fvwm 允许您在 .fvwmrc 中定义一个 InitFunction,用于处理初始化时的程序启动。在讨论此问题之前,我们需要简要提及 xinit。

xinit 是负责启动 X 窗口系统的程序,并且与 fvwm 一样,它使用 .xinitrc 文件。用户可以在其主目录中创建此文件的个性化副本作为 ~/.xinitrc,或者简单地使用位于 /usr/lib/X11/xinit/xinitrc 中的系统范围默认值。要查看 xinit 如何在启动时启动程序,让我们看一下 Slackware 2.2.0 附带的默认 xinitrc 文件:

# start some nice programs
xsetroot -solid SteelBlue &
fvwm

在这个简单的示例中,xsetroot 将根窗口的颜色设置为 SteelBlue。完成后,启动 fvwm。 xinit 手册页中给出了一个稍微复杂的示例:

xrdb -load $HOME/.Xresources
xsetroot -solid gray &
xclock -g 50x50-0+0 -bw 0 &
xload -g 50x50-50+0 -bw 0 &
xterm -g 80x24+0+0 &
xterm -g 80x24+0-0 &
twm

在此示例中,在启动 twm 之前启动了多个程序。需要指出的重要一点是,启动程序的节(例如 xclock 和 xterm)需要以 & 符号 (&) 结尾,以便让它们在后台运行。同样重要的是,窗口管理器必须最后启动,并且在前台运行(即,不要在线尾添加 & 符号)。

fvwm 提供了一种类似的方法,使用 InitFunction 在启动时启动程序。要了解如何操作,让我们看一下 .fvwmrc 中的示例条目:

Function "InitFunction"
# Module  "I"  FvwmBanner
# Get the fvwm GoodStuff button bar running
  Module  "I"  GoodStuff
# Module  "I"  FvwmPager 0 3
# Then, the analog clock - Swallowed by GoodStuff
  Exec  "I"  exec xclock -g 140x160-145+138 &
  Wait  "I"  xclock
# Start xmailbox - swallowed by GoodStuff
  Exec  "I"  exec xmailbox &
  Wait  "I"  xmailbox
# Fire up xload - also swallowed by GoodStuff
  Exec  "I"  exec xload -geometry 80x80+100+100 &
  Wait  "I"  xload
# Now, start up xcalendar
  Exec  "I"  exec xcalendar -g 345x382+793+372 &
  Wait  "I"  xcalendar
# Finally, fire up a full screen xterm
  Exec  "I"  exec xterm -sb -j -ls -g 84x48+4+4 &
  Wait  "I"  xterm
EndFunction

由于通过示例进行解释最容易,让我们看看要添加第二个 xterm 到启动项中需要做什么。首先,InitFunction 通常使用两行节来启动程序,这些节采用以下形式:

  Exec  "I"  exec program_name -options &
  Wait  "I"  program_title

例如,启动 xcalendar 的节看起来像这样:

# Now, start up xcalendar
  Exec  "I"  exec xcalendar -g 345x382+793+372 &
  Wait  "I"  xcalendar

以井号 (#) 字符开头的行被视为注释,fvwm 会忽略它们。第一行以保留字 Exec 开头,并带有四个参数:

1. "I"(在双引号中)。

2. 单词 exec

3. 用于启动程序的命令。

4. 任何命令行选项,后跟一个 & 符号 (&)。

下一行以单词 Wait 开头,它会导致 fvwm 函数暂停,直到名称在命令行中给出的窗口被绘制到显示器上。在本例中,InitFunction 在标题为 xcalendar 的窗口绘制到显示器上时暂停。窗口绘制完成后,fvwm 继续。

请注意,这有点夸大其词,但目前来说很有用。 Wait 函数主要用于在多个桌面上启动程序时—我们暂时不会涉及这一点。假设您像本例中一样使用单个桌面,则可以安全地省略 Wait 节。

回到我们启动另一个 xterm 的任务,我们可以通过添加以下内容来启动第二个 xterm:

  Exec  "I"  exec xterm &
  Wait  "I"  xterm

这足以让第二个 xterm 运行起来。

如果您添加了此条目并启动了 fvwm,您会发现当 fvwm 进入初始化过程中启动第二个 xterm 的点时,它将绘制 xterm 窗口的轮廓,并等待您定位它,然后再继续。如果您每次启动 fvwm 都必须这样做,那将非常不方便。解决此问题的方法是添加一个命令行选项来指定 xterm 的几何形状,这使您可以从命令行控制窗口的放置位置。

关于几何形状的说明

应用程序的几何形状条目可能类似于这样:

 -geometry 420x360+5+20

如果这看起来有点神秘,请不要担心,它实际上非常简单。将此语句转换为通俗易懂的英语,意思就是:

“应用程序窗口的宽度为 420 像素,高度为 320 像素,其左边框距离显示器左边缘 5 像素,顶边框距离显示器顶边缘 20 像素。”

很简单,对吧?在指定窗口的几何形状时,实际上只有几个规则需要牢记。首先,尺寸通常以像素为单位,尽管有时,尤其是在 xterm 和某些文本编辑器中,宽度和高度尺寸将以字符为单位。您会在上面的示例 .xinitrc 文件中注意到,xterm 的宽度和高度尺寸被指定为 80x24,即 80 个字符宽,24 列高。如果您记住您的整个显示屏幕可能为 640x480 或 800x600 或 1024x768 像素,具体取决于您的分辨率,您就可以感受到屏幕有多少被应用程序窗口占据,例如 400x300 像素。

第二组数字指定了距显示屏幕边缘的水平(x 偏移)和垂直(y 偏移)距离。同样,这非常简单:将屏幕视为方格纸,其中左上角为 0,0,值随着您从左到右和从上到下移动而增加。

如果您的屏幕为 640x480 像素,则您的左上角将被视为 0,0;左下角将为 0,480(请记住,垂直位置随着您从上到下移动而增加);右上角将为 640,0;右下角将为 640,480。需要记住的另一件事是,水平和垂直位置通常(但并非总是如此,我们稍后会看到)根据应用程序窗口的左侧和顶部指定。

例如,假设您想将 xterm 窗口放在屏幕的左上角。您决定使其距离显示器左侧 10 像素,距离顶部 50 像素。您还希望窗口的宽度为 400 像素,高度为 320 像素。很简单。您可以使用以下几何形状选项来实现此目的:

-geometry 400x320+10+50

请注意它采用的一般形式:

-geometry WIDTHxHEIGHT+horizPOS+verticalPOS

在像素值之前使用加号 + 表示窗口相对于其侧或顶部边缘的位置。但是,使用减号 - 表示相反的含义:水平位置是应用程序窗口的侧和显示器的侧之间的像素距离,垂直位置是应用程序窗口的底部边缘和显示器的底部边缘之间的像素距离。

如果这看起来有点令人困惑,请尝试稍微玩一下。启动 fvwm,并在 xterm 中输入以下命令:

xterm -g +5+5 &
xterm -g -5-5 &
xterm -g -5+5 &
xterm -g +5-5 &

尝试这些命令,看看 xterm 被放在哪里。请注意,您通常可以将 -geometry 缩写为简单的 -g

我们稍微偏离了关于启动时启动程序的讨论。实际上,弄清楚您想要启动的所有应用程序的正确几何形状非常容易。第一步是准备好纸和笔,因为您需要记下一些笔记。

自定义启动桌面通常从启动您希望在 fvwm 启动时出现的所有应用程序开始。尝试各种命令行选项以获得您想要的外观和感觉。阅读程序的手册页通常有助于您确定运行时可用的选项。一旦应用程序开始运行,您通常可以通过单击鼠标在“L”形窗口角之一上并将其拖动到更大或更小的尺寸来调整其大小。单击并拖动标题栏或侧边框可让您定位窗口。

一旦您启动、定位和调整大小了所有内容,使其达到您想要的状态,请记下每个应用程序以及您使用的任何命令行选项(如果有)。要获取每个窗口的几何形状,我们将使用一个很棒的小程序,称为 xwininfo

通过在命令提示符下输入以下命令,从 xterm 启动它:

$ xwininfo

请注意,您没有为此命令使用 & 符号。您的鼠标光标将变为十字准线,并显示以下说明:

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

单击应用程序窗口会生成如下输出:

xwininfo: Window id: 0x2c00007 "ez ~/fvwm_LJ.ez*"
  Absolute upper-left X:  92
  Absolute upper-left Y:  28
  Relative upper-left X:  0
  Relative upper-left Y:  0
  Width: 528
  Height: 724
  Depth: 8
  Visual Class: PseudoColor
  Border width: 0
  Class: InputOutput
  Colormap: 0x21 (installed)
  Bit Gravity State: ForgetGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: WhenMapped
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: no
  Corners:  +92+28  -532+28  -532-148  +92-148
  -geometry 528x724+85+0

在本例中,我单击了 EZ 编辑器的窗口,这产生了大量信息。具体而言,您要查找的几何形状设置在最后一行。对您要启动的所有应用程序执行此操作,您的工作就差不多完成了。在 .fvwmrc 中找到定义 InitFunction 的部分,添加或修改条目以启动您想要的应用程序—不要忘记在每个 Exec 行的末尾添加 & 符号!—您应该一切就绪。一旦您将一切都设置成您想要的方式,请不要忘记备份您新修改的 .fvwmrc 文件。

在我们离开关于启动时启动程序的主题之前,还有一件事。 fvwm 附带了许多模块,这些模块是必须由 fvwm 派生的单独程序—您无法从命令行启动这些程序。有许多模块通常可以在 /usr/lib/X11/fvwm 目录中找到。在启动时启动的几个更常见的模块包括 FvwmBanner,它在根窗口上放置一个装饰性横幅;FvwmPager,当您有多个桌面运行时,它充当虚拟桌面管理器;以及 GoodStuff 按钮栏。 InitFunction 中用于启动 fvwm 模块的条目与常规应用程序略有不同,因为它更简单:

  Module  "I"  GoodStuff
  Module  "I"  fvwmPager 0 3

您会注意到不需要 ExecWait 语句。只需使用保留字 Module,后跟 "I",然后是要启动的模块名称以及任何选项。

还不错,对吧?这应该为您提供自定义启动桌面的基础知识。下个月,我将介绍 fvwm 启动后启动程序—以及更多内容!

John Fisk (fiskjm@ctrvax.vanderbilt.edu) 在范德比尔特大学医疗中心担任普通外科住院医师和研究员三年后,他决定“挂起听诊器”,转而从事医疗信息管理职业。他目前是中田纳西州立大学的全日制学生,并希望在进入医疗信息学研究员职位之前完成计算机科学研究生学位。在他为数不多的空闲时间里,他和妻子 Faith 喜欢在田纳西州美丽的 Great Smoky Mountains 徒步旅行和露营。自从一年半前首次安装 Slackware 2.0.0 以来,他一直是狂热的 Linux 爱好者。

加载 Disqus 评论