功能丰富的 Perl: 有趣的 Ion 窗口管理器

管理窗口的一种简单却很有功效的方法

请关注 Ion 窗口管理器这个功能强大却很简单的程序,可以用它来管理应用程序在桌面上调用的窗口。Ion 并非华而不实,一旦习惯了它,您的工作效率将因此得到极大的提高,而且您会感到奇怪:为什么以前还使用过 其他窗口管理器。

Teodor Zlatanov (tzz@bu.edu), 程序员, Gold Software Systems

Teodor ZlatanovTeodor Zlatanov 于 1999 年获取了波士顿大学计算机工程系硕士学位。他从 1992 年就开始做程序员,使用 Perl、Java、C 和 C++ 进行编程。他的兴趣包括开放源代码工作、Perl、文本解析、3 层客户机-服务器数据库体系结构和 UNIX 系统管理。欢迎通过电子邮件提供建议和指正;您可以通过 tzz@bu.edu 与他联系。



2004 年 9 月 29 日

通过本专栏,您将体验 X Window System 的 Ion 窗口管理器。 X 窗口管理器是管理应用程序 调用的窗口的程序。例如,如果您在 X 终端上运行 XTerm 或者 Web 浏览器,那么很可能会有一个在后台 运行的窗口管理器,帮助您控制弹出的窗口。

在 Microsoft® Windows® 中,窗口管理器与操作系统的其余部分是高度集成的。 桌面上根本没有 Explorer 窗口的 Windows 机器是让人难以想像的。

在 UNIX® 中,具体地讲是在 Linux™ 中,出于各种文化和技术的原因,桌面的演化遵循的 是一条不同的路线。UNIX 采用 X 作为它选择的窗口系统,X 窗口管理器是典型的 UNIX 实用程序: 小、快,而且可配置。twm 等窗口管理器倾向于满足最低限度要求,而 Enlightenment 窗口管理器 精心设计的系统可以显示您所见过的最漂亮的图形。(要获得关于 MacOS X 中 Ion 的资料,请参阅 参考资料部分)。

在现在的 UNIX 桌面上,窗口管理器与桌面系统的其余部分之间的集成通常比以前更紧密(CDE、KDE 和 Gnome 都是这样),但它仍然完全可以运行与原定桌面不同的窗口管理器。

本文是为那些愿意切换并配置其窗口管理器(通常简称 WM)的用户准备的。如果您不是这样 的用户,那么要小心。Ion 不是一个容易使用的 WM,而且,如果您错误地配置了 Ion 或者 X (比如以总有一个不能启动的方式),那么绝对需要具备自救的能力。保持警惕!

进入 Ion

Ion 是一种平铺(tiling)窗口管理器。也存在其他一些与 lon 类似的窗口管理器 (请参阅 参考资料中列出的 Ion 主页链接),但是,我认为, Ion 最好地实现了速度、特色、扩展性和可配置性的平衡。Ion 的大小只有 150 千字节 (在 Debian Linux 版本 2 中,要再加上模块的 160 千字节)。它运行起来很

Ion 实际上可以实现窗口重叠。我希望您学习改为使用平铺窗口,但是您也可以借助 重叠窗口(“PWM”或者“浮动的”)工作台。它们之所以被称为 PWM 工作台,是因为 Ion 的前身 PWM 只实现了传统的重叠窗口管理。这些工作台也被称为是“浮动的”,因为 看起窗口浮在屏幕上。平铺工作台通常称作 Ion 工作台,因为它们始终在 Ion 之内, 不同于浮动工作台。

首先要了解一个定义。平铺窗口管理器不允许窗口重叠。在意识到窗口重叠是向用户隐藏 内容的主要原因之一以前,您可能会觉得有些奇怪。在导航方面, 平铺窗口管理器是非常有效的,因为它们 所管理的管口没有 z-plane(深度)。这样,用户只需要进行二维管理。 (请参阅 完全内幕)。

您可能马上想到这样一个问题。如果在工作台上窗口过多,无法安置,而您又不想将它们压缩 到小得无法管理时,怎么办?在这里,Ion 平铺特性以外的另一个优秀特性登场了:标签(tab)。 标签是 Ion 的 z-plane,只可惜只能有一个标签是可见的。这样,如果一个窗口帧有标签 A、B 和 C,那么只能看到这些标签中的一个。其他标签以及属于它们的窗口都隐藏了起来。记住这一点,因为如果您 想用好 Ion 的话,这是最基本的知识。当今的很多应用程序都支持标签,所以,即使以前没有使用过 Ion,您也可能知道它们是如何工作的。

您可以查看 Ion 主页上(请参阅 参考资料)关于 Ion 的平铺方式和 标签的屏幕截图。那些屏幕截图看起来并不吸引人,因为 Ion 本身并不很吸引人 —— 但它确实(难以置信地)实用。 它的惟一目标是完成工作,自始至终没有使用任何华而不实的东西,比如主题。在使用 Ion 之前,我 使用过 Enlightenment,我必须承认,因为缺乏主题,Ion 在开始时一点都不吸引人,但是最后,Ion 让我全神贯注于窗口 内部的内容,而不是它们的装饰品。所以我建议,如果 您要尝试 Ion,那么至少给它一天时间。第一印象是如此不好,使得您可能会厌恶 Ion,而您厌恶的理由恰恰 是它成为优秀的窗口管理器的原因:它的简单。

出于任何理由不喜欢使用鼠标的用户群将发现,Ion 特别实用。Ion 使您能够通过键盘接口使用每一项功能,在 Ion 中没有必要使用鼠标。但那些喜欢使用鼠标的人仍可以使用鼠标;只是,一旦您学会了击键,使用键盘做事情将更为简单和迅速。

最后,我要指出的是,有很多的窗口管理器,Ion 可能并不是适合您的那一个。在 Ion 主页的 链接部分,有其他类似于 Ion 的窗口管理器。仔细研究可以用于您的平台的窗口管理器,并根据您希望 窗口管理器具有哪些功能来进行选择。不过,一定要试试 Ion。我想您会乐意这样做。


Ion 历史

从开始到现在,Ion 一直由芬兰电脑爱好者 Tuomo Valkonen 进行开发。其前身是来自同一作者的 PWM 窗口管理器。虽然 Ion 是一个遵循 Lesser GNU Public License 的软件包,但 Tuomo 是 Ion 项目的惟一所有者。最近,Tuomo 将最 新版本的 Ion 添加到了子版本仓库中;在 Ion 主页上,有通过那个仓库获得最新的 Ion 版本的说明。

在 2004 年 7 月之前,Ion 有三个不同的版本。Ion 1 是最原始的 Ion,是用 C 编写的。它有一个简单的 配置格式,实际上,它类似于经典的 UNIX 窗口管理器。Ion 1 没有浮动的(重叠的窗口)工作台,特性很少。 不过,在满足最低限度要求、精简以及特别实用的方法方面,Ion 1 是革命性的。Ion 1 可能不是第一个 使用平铺工作台(这个思想完全不再新颖),但是,它确实在这方面做得很多,这要归功于标签。标签是 Ion 的 平铺方法成功的根本,据我所知,在 PWM 之前,没有窗口管理器具有这一特色 —— 或者就算它们这样做了,也没有 一个像 Ion 这样如此广泛地使用标签,甚至连终端窗口都标签化了。

Ion 2 大部分是对 Ion 的重写。它仍是用 C 编写的,为了更好地组织 Ion 代码,它整理了对象层次结构。Ion 最大的变化是添加了可选的浮动工作台以及 Lua 脚本语言,该语言适用于 Ion,就像 Lisp 适用于 Emacs,它是一种定制和扩展的基本手段。

Ion 3 现在正处于开发之中,到目前为止,就用户可以看见的特性而言,它没有对 Ion 2 进行显著更新 (尽管已经在测试一些非常好的特性:比如会话管理支持、 mod_autows、 一个非常好的 dock、便签簿等)。如果您乐于尝试新事物,那么您可以查看 Ion 3 的仓库,以获得关于这些特性的更多资料。

Ion 3 简化了 Ion 2 引入的很多特性,添加了更好的模块来扩展 Ion,对 Ion 进行了较少的 内部重写(尽管从脚本方面讲,它改变了很多,这反映了它从 Ion 2 中得到了教训)。在决定使用 Ion 3 之前,一定要检查它的状态。到撰写本文时,Ion 3 还是最新的发行版本,并且只有很少的文档。


我的 Ion 配置

尽管在开始使用 Ion 时,您当然会接受其默认键绑定,但是您可能发现它们很难用。而 workstar 或者 vi 的用户可能会发现其默认按键很好用,但是,如果键盘上有空闲的功能键,那么您应该修改默认的键绑定。我将向您展示我使用 Ion 2 的个人配置, 我设置了一些不同的键绑定。

注意,您可以保持默认的键绑定, 同时安装新的键绑定。对新用户来说,这可能是 最安全的。

在展示之前,首先我需要解释我的键绑定。我的键盘几乎完全用于使用 Emacs 和 vi(编程)、 shell 交互和电子邮件(使用 Emacs gnus 邮件阅读器和新闻阅读器)。我将所有的 F 键 (从 F1 到 F12,要么与 Control 组合,要么与 Shift 组合)都用于 Emacs 编程了。 我将 Alt-F1 到 Alt-F12 留给了 Ion。在我的 Logitech、Sun 和 Memorex 键盘上,额外的键用来启动应用程序,我马上将要解释如何使用 xmodmap。

我的设置中最不同寻常的部分是数字键区(keypad)。我只将数字键区用于 Ion 导航。 我不需要按任何转义(Control、Alt 或者 Shift)键来使用数字键区,我已经以这种方式进行了设置。这样,当我在键盘上输入时,只需要将我的右手移动到数字键区就可以访问全部 Ion 导航。 就我的经验而言,这是一个非常有效的设置,您也应该考虑试一下。键盘上别的地方可以实现数字键区的全部功能,所以不再需要它们做任何事情(99% 情况下如此)。剩下 1% 的可能必须使用数字键区,所以它们应该将我的设置映射到其他键,或者可以将设置映射到随 Alt 转义键按下的数字键区。

如果您认为您绝对需要数字键区,那么可以花一些时间来考虑以下这个问题。您要在数字键区上使用什么? 您的手落在其上的频率有多高?另一方面,您将手移动到鼠标上来安排屏幕上的 窗口的频率有多高?您可能会发现,数字键区在您日常的计算机应用中并不是必需的。作为一个 证据,可以考虑膝上型计算机。如果已经用了一些日子,您可能会注意到,上面没有单独的数字键区。 对于大部分用户而言,这不会带来什么麻烦,而且他们很少使用常见的膝上型电脑的“重叠键区”。

Ion 2 配置是用名为 Lua 的语言编写的。Ion 主页上有关于使用 Lua 配置 Ion 的文档链接 (请参阅 参考资料)。Ion 2 中引入的对象层次结构是通过 Lua 来处理的,所以, 如果您计划定制 Ion 2 的所有部分(除了键绑定的最简单修改以外),那么应该去阅读描述对象 层次结构的 Ion 2 文档。

我的 Ion 2 配置由若干个文件组成。其中有 ion.lua,它控制着全局的 Ion 2 选项。对 Ion 平铺工作台,我使用的是 ionws.lua(目前其中只是有键绑定)。对于全局键绑定,我 使用的是 tzz-ion-bindings.lua。由于我没有在 Ion 中使用 PWM(浮动的)工作台,所以我的定制中 不包括 PWM 键绑定。Ion 2 附带的默认 PWM 绑定应该足够用了;如果您想让它们像用于 Ion 工作台的面向数字键区的绑定那样简单,那么您应该考虑数字键区在浮动工作台中可以做什么。 您可能会发现,使用浮动窗口时,鼠标是不可缺少的(这正是我为什么不喜欢使用浮动窗口的原因)。

您可能不理解我凭什么反对使用鼠标。它们是很好的点击设备,但人们怀疑它们的广泛使是造成 Carpal Tunnel Syndrome(CTS)和 Repetitive Stress Injuries(RSI)的原因,这些都是计算机 用户常为之痛苦的。我的经验是减少鼠标的使用会让我的手腕感觉好多了(几年前我自己几乎也差点患上 CTS),但是我不是医生,所以如果您担心 CTS 和 RSI,应该去咨询医生。大部分 专家建议尽可能少使用鼠标,但是,当然,对键盘的过度使用同样不利于您的健康(尤其是如果 您的姿势不对)。组合击键(同时敲击两个或者更多的键)对您的健康尤为不利,应该尽量避免。这里给出了 我的设置,明确地避免了使用组合击键来完成在 Ion 中的标签和帧之间的移动,这是最常用到的导航任务。

如果您打字很多,那么少使用鼠标还可以提高您的工作效率,因为您将不必再那么多次地在键盘和鼠标之间 移动您的手。记住,要确保健康有效地使用计算机,您可以做的最好的事情就是经常休息 5 分钟。

以下是我的 ion.lua 配置文件。Lua 是一门非常复杂的语言,但是您会立刻就明白“--”表示的是注释的开始。

清单 1. ion.lua
--
-- Ion main configuration file
--
-- Modules.
load_module("query")
load_module("menu")
load_module("ionws")
load_module("floatws")
load_module("dock")
-- Set default modifier. Alt should usually be mapped to Mod1 on
-- XFree86-based systems. The flying window keys are probably Mod3
-- or Mod4; see the output of 'xmodmap'.
DEFAULT_MOD = "Mod1+"
-- Maximum delay between clicks in milliseconds to be considered a
-- double click.
--set_dblclick_delay(250)
-- For keyboard resize, time (in milliseconds) to wait after latest
-- key press before automatically leaving resize mode (and doing
-- the resize in case of non-opaque move).
--set_resize_delay(1500)
-- Opaque resize?
enable_opaque_resize(true)
-- Movement commands warp the pointer to frames instead of just
-- changing focus. Enabled by default.
enable_warp(true)
-- Kludges to make apps behave better.
include("kludges")
-- Make some bindings.
include("tzz-ion-bindings")
-- Define some menus (menu module required to actually use them)
include("ion-menus")
-- How to shorten window titles when the full title doesn't fit in
-- the available space? The first-defined matching rule that succeeds
-- in making the title short enough is used.
add_shortenrule("(.*) - Mozilla(<[0-9]+>)", "$1$2$|$1$<...$2")
add_shortenrule("(.*) - Mozilla", "$1$|$1$<...")
add_shortenrule("XMMS - (.*)", "$1$|...$>$1")
add_shortenrule("[^:]+: (.*)(<[0-9]+>)", "$1$2$|$1$<...$2")
add_shortenrule("[^:]+: (.*)", "$1$|$1$<...")
add_shortenrule("(.*)(<[0-9]+>)", "$1$2$|$1$<...$2")
add_shortenrule("(.*)", "$1$|$1$<...")
-- List of directories to look for manuals in the F1 man page query.
query_man_    "/usr/man",
    "/usr/share/man",
    "/usr/X11R6/man",
    "/usr/local/man"
}

lua 已经出现了大约十年,但它到现在还没有广为人知。它不同于我所了解的其他任何脚本语言, 并且我也不是惟一发现它有些难用的 Ion 用户。据说一旦您习惯了使用它,您将 获益匪浅。

如果您用清单 1 中的设置与 Ion 2 所附带的默认的 ion.lua 进行比较,您将发现,它们没有太多的不同。 我的 ion.lua 主要用来加载已经定制的后继 Lua 文件,稍后您将看到这一点。

我的 draw.lua 文件控制的是 Ion 2 中的绘制选项,它们完全是从 Ion 附带的默认 look-clean.lua 中复制而来,所以在这里没有对它们进行讨论。look-clean.lua 文件有很好的注释,所以,如果您想定制 Ion 的颜色和外观,应该去通读该文件。我在 draw.lua 文件中所做的惟一修改是将帧标题的字体变得 更大,因为不管在哪里,我都喜欢大字体(为了让眼睛得到休息,您应该使用所能使用的最大字体)。

全局键绑定位于 tzz-ion-bindings.lua 中。如果您键盘上的具体符号的位置与我的不同,那么您 应该重新分配它们。例如,我分配给工作台 0 到 6 的键,在数字键区上,这些数字构成了 3/4 个 圆。您可以使用 xev 程序来找出用于重新映射的键的名称。

记住,DEFAULT_MOD 是 Mod1,即普通的 Linux(和大部分 UNIX)系统中的 Alt 键。Alt 键也称为 Meta 键,不过,在 Emacs 中,您当然可以通过 Esc 键来访问 Meta,(而在 Solaris 中,Meta 键 看起来像是一颗钻石,Alt 键就只是 Alt 键)。如果您能理解最后一句话,那么您就会赞同我的观点!

清单 2. tzz-ion-bindings.lua
-- Load a library to create common queries.
include("querylib")
-- Load a library to create menu display callbacks.
include("menulib")
global_bindings{
-- use the keys *around* the numbers on the keypad to switch
-- to workspaces 0 through 6
    kpress("KP_Divide", function(s) s:switch_nth(0) end),
    kpress("KP_Multiply", function(s) s:switch_nth(1) end),
    kpress("KP_Subtract", function(s) s:switch_nth(2) end),
    kpress("KP_Add", function(s) s:switch_nth(3) end),
    kpress("KP_Enter", function(s) s:switch_nth(4) end),
    kpress("KP_Decimal", function(s) s:switch_nth(5) end),
    kpress("KP_0", function(s) s:switch_nth(6) end),
-- convenient Ion control functionality
    kpress(DEFAULT_MOD..KEYF11, querylib.query_restart),
    kpress(DEFAULT_MOD..KEYF12, querylib.query_exit),
-- sometimes I need to "walk" through workspaces, instead
-- of switching to specific ones
    kpress(DEFAULT_MOD.."Shift+Left", WScreen.switch_prev),
    kpress(DEFAULT_MOD.."Shift+Right", WScreen.switch_next),
-- these are assigned with xmodmap to keys on my Logitech keyboard
    kpress("XF86Mail", make_exec_fn("emacs -name gnus -f gnus")),
    kpress("XF86Standby", make_exec_fn("xlock -mode matrix")),
    kpress("XF86AudioMute", make_exec_fn("aumix.sh")),
    kpress("XF86AudioRaiseVolume", make_exec_fn("/usr/bin/aumix -v+3")),
    kpress("XF86AudioLowerVolume", make_exec_fn("/usr/bin/aumix -v-3")),
    kpress("Shift+XF86AudioRaiseVolume", make_exec_fn("/usr/bin/aumix -v+1")),
    kpress("Shift+XF86AudioLowerVolume", make_exec_fn("/usr/bin/aumix -v-1")),
    kpress("XF86AudioPlay", make_exec_fn("xmms --play")),
    kpress("XF86AudioStop", make_exec_fn("xmms --pause")),
    kpress("XF86AudioPrev", make_exec_fn("xmms --rew")),
    kpress("XF86AudioNext", make_exec_fn("xmms --fwd")),
-- I run a lot of terminals, so this is a way to make sure that no
-- matter what X resources are loaded, I get a consistent look to my
-- terminals.
    kpress("XF86PowerOff", make_exec_fn("Eterm -f yellow --shade 100
	--term-name xterm --double-buffer -L 500000 --font
	-misc-fixed-bold-r-normal--14-130-75-75-c-70-iso10646-1")),
    kpress("Mod1+XF86PowerOff", make_exec_fn("xterm -bg black
	-fg yellow -fn -misc-fixed-bold-r-normal--14-130-75-75-c-70-iso10646-1
	-cr blue -geometry 80x50 -name term")),
-- essential programs for me
    kpress("XF86Start", make_exec_fn("emacs")),
    kpress("XF86Search", make_exec_fn("mozilla")),
-- miscellaneous menus
    kpress("Print", make_bigmenu_fn("mainmenu")),
    mpress("Button2", make_pmenu_fn("windowlist")),
    mpress("Button3", make_pmenu_fn("mainmenu")),
}
mplex_bindings{
    kpress_waitrel(DEFAULT_MOD.."Return",
                   make_mplex_clientwin_fn(WClientWin.toggle_fullscreen)),
-- Alt+W is short and sweet, yet hard to press accidentally
    kpress_waitrel(DEFAULT_MOD.."W", WMPlex.close_sub_or_self),
}
genframe_bindings{
    -- Tag an object
    kpress(DEFAULT_MOD.."Shift+A", WGenFrame.attach_tagged),
    -- Tag viewed object
    kpress(DEFAULT_MOD.."T", make_mplex_sub_fn(WRegion.toggle_tag)),
-- 6 and 4 on the keypad go back and forth between tabs.
-- this is very essential to my setup.  I couldn't use Ion without
-- these key bindings.
    kpress("KP_6", WGenFrame.switch_next),
    kpress("KP_4", WGenFrame.switch_prev),
-- miscellaneous frame-oriented bindings
    kpress(DEFAULT_MOD.."A", querylib.query_attachclient),
    kpress(DEFAULT_MOD.."G", querylib.query_gotoclient),
    kpress(DEFAULT_MOD.."F3", querylib.query_exec),
    kpress(DEFAULT_MOD.."F4", querylib.query_ssh),
    kpress(DEFAULT_MOD.."F5", querylib.query_editfile),
    kpress(DEFAULT_MOD.."F6", querylib.query_runfile),
    kpress(DEFAULT_MOD.."F7", querylib.query_lua),
    kpress(DEFAULT_MOD.."F9", querylib.query_workspace),
    kpress(DEFAULT_MOD.."M", make_menu_fn("ctxmenu")),
    mpress("Button3", make_pmenu_fn("ctxmenu"),"tab"),
}

最后是我的 Ion 平铺工作台绑定。当然,这些也是面向数字键区的。

清单 3. ionws.lua
ionws_bindings{
-- I seldom have more than 2 vertical splits in an Ion workspace, so
-- I don't need dedicated keys to moving left and right between
-- them.  Since 6 and 4 were taken for tab navigation, I use the keypad
-- 5 to go to the next split to the left.  I can always go right with
-- Alt+Tab.
    kpress("KP_5" WIonWS.goto_left),
    kpress(DEFAULT_MOD.."Tab" WIonWS.goto_right),
-- horizontal splits are more frequent for me, so it's convenient to
-- move between them with the up/down (8 and 2) keypad keys.
    kpress("KP_Down", WIonWS.goto_below),
    kpress("KP_Up", WIonWS.goto_above),
}
ionframe_bindings{
-- these bindings left me make new splits in Ion.  They all use
-- the Pause key, because it's not used for anything else.
    kpress(DEFAULT_MOD.."Pause", function(frame) frame:split_empty("bottom") end),
    kpress("Pause", function(frame) frame:split_empty("right") end),
    kpress("Shift+Pause", function(frame) frame:close("right") end),
-- standard Ion functions to use the mouse when necessary
    mclick("Button1", WGenFrame.p_switch_tab, "tab"),
    mdblclick("Button1", WIonFrame.toggle_shade, "tab"),
    mdrag("Button1", WGenFrame.p_tabdrag, "tab"),
    mdrag("Button1", WGenFrame.p_resize, "border"),
    mclick("Button2", WGenFrame.p_switch_tab, "tab"),
    mdrag("Button2", WGenFrame.p_tabdrag, "tab"),
    mdrag(DEFAULT_MOD.."Button3", WGenFrame.p_resize),
}
ionframe_moveres_bindings{
-- resizing keys.  As much as I use Ion without the mouse,
-- I find it very convenient for resizing as opposed to the keyboard.
-- Your mileage may vary.
    kpress("AnyModifier+Escape", WIonFrame.cancel_resize),
    kpress("AnyModifier+Return", WIonFrame.end_resize),
    kpress("Left", function(f) f:do_resize( 1, 0, 0, 0) end),
    kpress("Right",function(f) f:do_resize( 0, 1, 0, 0) end),
    kpress("Up",   function(f) f:do_resize( 0, 0, 1, 0) end),
    kpress("Down", function(f) f:do_resize( 0, 0, 0, 1) end),
    kpress("F",    function(f) f:do_resize( 1, 0, 0, 0) end),
    kpress("B",	   function(f) f:do_resize( 0, 1, 0, 0) end),
    kpress("P",    function(f) f:do_resize( 0, 0, 1, 0) end),
    kpress("N",    function(f) f:do_resize( 0, 0, 0, 1) end),
    kpress("Shift+Left", function(f) f:do_resize(-1, 0, 0, 0) end),
    kpress("Shift+Right",function(f) f:do_resize( 0,-1, 0, 0) end),
    kpress("Shift+Up",   function(f) f:do_resize( 0, 0,-1, 0) end),
    kpress("Shift+Down", function(f) f:do_resize( 0, 0, 0,-1) end),
    kpress("Shift+F",    function(f) f:do_resize(-1, 0, 0, 0) end),
    kpress("Shift+B",    function(f) f:do_resize( 0,-1, 0, 0) end),
    kpress("Shift+P",    function(f) f:do_resize( 0, 0,-1, 0) end),
    kpress("Shift+N",    function(f) f:do_resize( 0, 0, 0,-1) end),
}

注意,当您在 ion.lua 中加载 ionws 模块时,会自动加载 ionws.lua。 这就是在我的 ion.lua 文件中没有显式的“explicit ionws”的原因。


结束语

多样性可以为生活增添乐趣,我希望您能通过本文获得足够多的乐趣。Ion 是一个非正统的 窗口管理器,如果您给它一个机会,它会证明自己。这些日子,当我查看 Windows 以及其他浮动窗口桌面环境时,我就在想,如果不被浮动的窗口分心,用户的效率会高出多少。这并不是说 浮动窗口一直都不好,而是说在大部分情形下,当窗口彼此重叠时,用户需要将它们移开,它们会浪费时间和屏幕空间。

Ion 主页上有很多关于 Ion 的基本原理与开发的链接和解释。您也可以访问它来查看屏幕截图。 只是要记住,Ion 的优点在于它简单而不显眼,所以,不能因为看不到迷人的窗口帧和 生动的背景,就认为 Ion 没有尽力改善您的计算机环境。

参考资料

  • 任何对 Ion 感兴趣的人都应该访问 Ion 窗口管理器主页。 这个站点包括下载、文档、讨论列表、链接,以及运行中的 Ion 屏幕截图。
  • 如果您是一位 OSX 用户,那么还应该去看看 How to Run the Ion Window Manager on OSX
  • X.org 是 X Window 系统的基础。
  • CDE 在历史上曾是重要的管理器,但直到现在,它还没有得到广泛应用。默认情况下,它使用 DTWM。
  • KDE 是当前主要的 UNIX 桌面环境之一。默认情况下,它使用 KWin
  • Gnome 是当前另一个主要的 UNIX 桌面环境。默认情况下,它使用 Metacity WM
  • Enlightenment 是一个优秀的管理器,它可以满足您 所有高级特性需要。其他令人印象深刻的窗口管理器包括 fvwmicewm (后者不仅富有想像力,而且非常紧凑)。
  • 除了 Ion 以外,其他轻量级的窗口管理器包括 LarsWMTrsWMRatpoison。 其中最后一个是基于 GNU screen 的 Ratpoison,它还能够令您不再使用鼠标。同时,请参阅 discussion of GNU screen, Ratpoison, and other minimal window managers
  • Ion 使用了具有十多年历史的 Lua 配置和脚本语言。Lua 值得深入学习的地方有很多: Programming in Lua(Ingram/Bertram Books,2003 年)一书可以在线获得;有一个活跃的 lua-users 邮件列表; lua-users wiki 包含指向教程和非官方 FAQ 的链接。
  • 关于键重新映射的经典参考资料是 Jamie Zawinksi's XKey Caps 页;另外,请参阅 MIT 的 xmodmap 帮助页
  • 阅读 developerWorks 上“Cultured Perl”系列中 Ted 的所有 developerWorks 上所有功能丰富的 Perl 文章
  • 要获得关于 XFree86 的概要介绍以及安装使用教程,请参阅 介绍 XFree86 4.x (developerWorks,2001 年 10 月)。
  • 改良的 Perl:程序员面向 Linux 的设置 (developerWorks,2001 年 3 月)中, Ted 深入介绍了作为优化的 Perl 开发者环境的一部分的 Enlightenment 窗口管理器。
  • developerWorks Linux 专区中,可以找到 更多为 Linux 开发者准备的参考资料。
  • 在 Developer Bookstore Linux 专栏中可以定购 打折出售的 Linux 书籍
  • 可以从 developerWorks 的 Speed-start your Linux app 专区下载能够运行于 Linux 之上的、经过精挑细选的 developerWorks Subscription 产品的免费测试版本,其中包括 WebSphere® Studio Site Developer、WebSphere SDK for Web services、WebSphere Application Server、DB2® Universal Database Personal Developers Edition、Tivoli® Access Manager 和 Lotus® Domino Server。想更快速地开始上手,请参阅针对各种产品的 how-to 文章和技术支持。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=49091
ArticleTitle=功能丰富的 Perl: 有趣的 Ion 窗口管理器
publish-date=09292004