Awesome
created by Raymond: [email protected]
Awesome简介
什么是平铺式窗口管理?
这里首先需要解释一下窗口管理器(Windows Manager)和桌面环境(Desktop Environment)的概念。窗口管理器负责绘制窗口的边框,处理窗口运行比如移动、最小化之类的行为。而桌面环境则是窗口管理器的超集,它使用窗口管理器及其其他软件提供一个完整的工作环境。比如说,gnome就是一个桌面环境,默认使用metacity作为窗口管理器。
那么什么是平铺式窗口管理器?简单来说,所谓的平铺就是之所有的窗口都不会相互重叠,而是自动的被调整大小使得它们能够刚好占满整个屏幕。这和传统的桌面环境的概念相差很大,也许你会疑问这样的环境下如何工作?
事实上对于Linux这种需要大量使用命令行的操作系统来说平铺式窗口管理在很多情况下能够极大的提升你的工作效率。举个例子,很多时候你都需要打开好几个shell。在gnome底下这就意味着好几个会相互遮挡命令行窗口,大多数时候如果你想要同时看到这些窗口上面的内容就得费神费力的调整它们的位置和大小。而在平铺是窗口下面你完全不需要为这些事情烦心。
另外一个可能会促使你使用平铺的理由就是,用它来调整、切换窗口几乎可以不使用鼠标。这对于硬派的linux狂热者以及痛恨使用笔记本触控板的人来说也是一个不错的选择。
看看下面这个来我桌面的屏幕截图能对awesome有一个直观的印象
显然它并不像gnome,KDE一样有眼花缭乱的桌面特效,但平铺式窗口关注的主要是在其下工作的效率。 如果你是第一次看到Awesome这样的桌面截图一定会觉得手足无措,最常见的窗口边框不见了,你甚至都没法儿关闭或者是最小化一个窗口。事实上在 Awesome中是用不着窗口边框的。它默认就提供了9个标签,你大可把不同的窗口分散在这9个标签中而不用去费神调整它们之间的位置,想要切换的时候简单的用快捷件就可以在各个虚拟桌面之间切换。
显然它并不像gnome,KDE一样有眼花缭乱的桌面特效,但平铺式窗口关注的主要是在其下工作的效率。比如说在写php代码的时候我可以在一个标签中打开四五个shell运行vim同时修改多个文件,然后在另外一个标签中打开一个浏览器。这样可以很快速的输入代码和切换窗口,而你的手甚至不需要离开键盘!
同时awesome对于多头显示提供了良好的支持,在使用多个显示器的时候尤其拉风:
为什么是Awesome
平铺式窗口管理器并不是一个新概念,在施乐公司几十年前最早开始研究图形界面的时候就已经有了平铺的概念了(尽管和现在我说的不太一样),linux下面也有不少成熟的平铺式窗口管理器--Ion, XMonad都是有名的平铺窗口管理器。但是比较之下Awesome有不少鲜明的特点:
- 体积小,运行迅速。不过在3.0以后的版本似乎向变得巨大和缓慢的方向发展的趋势
- 支持多种窗口布局。事实上awesome并不仅仅支持平铺,它还支持好几种各不相同的窗口布局方案
- 使用Lua脚本的配置文件使得它的灵活性非常高。由于lua脚本的强大能力,Awesome 3.0甚至把窗口管理器运行的逻辑部分放到了配置文件里面。好处是这使得很多其他窗口管理器里面不可能做到的用法在这里变成了可能,坏处是配置文件及其庞大和复杂。
- 更新迅速。它的作者一直在不停地完善awesome,每次版本升级都能带来一些方便的新特性。不过弊端是造成了awesome的配置文件一直都在改变,说不定什么时候自己以前的配置文件就不能用了
- 多显示器支持。事实上我一直很羡慕官方网站上awesome运行在多显示器机器上面的截图,口水流了一地。
对于喜欢折腾自己电脑的人来说Awesome是一个很不错的玩具 8) 不过Awesome所依赖的几个底层库还没有进入稳定版本,而awesome自身也在频繁的更改当中,因此在ubuntu源中的awesome还是老旧的 2.4版(不过ArchLinux源里面倒是有最新版的包),想要用awesome的ubuntu用户还是得自己编译才行。
老版本的Awesome2配置文件和编译方法差异很大,这里讨论的Awesome指的是Awesome3。 官方网站: http://awesome.naquadah.org/
编译 & 安装
现在你可以直接在终端输入: $sudo apt-get install awesome 来完成安装. 如果你要自行编译请往下看。
官方wiki中的编译指南地址:http://awesome.naquadah.org/wiki/index.php?title=Awesome-3-Ubuntu-git
注意:这里说的步骤仅在8.04和8.10源下测试通过。由于从最新的源代码编译软件时效性很强,所以下面的步骤有可能会过时。
- 升级系统
$ sudo apt-get install build-essential autoconf automake libtool gperf $ sudo apt-get install dpatch fakeroot git git-core
- 安装编译所需的包
$ sudo apt-get install libx11-dev libxinerama-dev $ sudo apt-get install libxrandr-dev libpango1.0-dev $ sudo apt-get install libimlib2-dev libgtk2.0-dev $ sudo apt-get install libxcb-shm0-dev libxcb-render0-dev $ sudo apt-get install libxcb-randr0-dev libxcb-shape0-dev $ sudo apt-get install libcairo2-dev libxcb-xinerama0-dev $ sudo apt-get install liblua5.1-filesystem0 liblua5.1-logging $ sudo apt-get install libdirectfb-dev libxt-dev gperf
- 安装asciidoc(可选, 如果你不需要创建文档的话可以跳过这步)
$ sudo apt-get install asciidoc
- 安装lua相关的包
$ sudo apt-get install lua5.1 liblua5.1-0-dev
- 安装CMake
从如下地址下载:
http://packages.ubuntu.com/intrepid/i386/cmake/download
并且安装
$ sudo dpkg -i cmake*.deb
- 安装libev
从如下地址下载:
http://packages.ubuntu.com/intrepid/i386/libev3/download
http://packages.ubuntu.com/intrepid/i386/libev-dev/download
并且安装:
$ sudo dpkg -i libev*.deb
- 安装luadoc
http://packages.ubuntu.com/intrepid/all/luadoc/download
http://packages.ubuntu.com/intrepid/all/liblua5.1-doc0/download
并且安装
$ sudo dpkg -i *lua*doc*.deb
- 编译依赖项
获取xcb-util:
$ git clone git://anongit.freedesktop.org/git/xcb/util $ cd util && ./autogen.sh && make && sudo make install
如果你用的是8.10则可以通过源来安装libcairo2-dev:
sudo apt-get install libcairo2-dev
如果你用的是8.04的话,似乎源里面还没有libcairo2-dev这个包(我现在用的是8.10,,没法儿确认源里 面是不是已经加上了这个包),需要按照以下步骤自己编译安装:
$ apt-get source libcairo2-dev $ cd cairo-1.6.0 $ sed -i.orig -e '/dh_shlibdeps/s/^/#/;s/--disable-xcb/--enable-xcb/' debian/rules $ sudo dpkg-buildpackage -rfakeroot $ sudo dpkg -i ../libcairo2_1.6.0-0ubuntu2_i386.deb ../libcairo2-dev_1.6.0-0ubuntu2_i386.deb $ cd ../..
注意: 不要让包管理器把libcairo2和libcairo2-dev更新掉,否则会把他们改为老板本,导致awesome无法运行
- 下载awesome并且编译安装
$ git clone git://git.naquadah.org/awesome.git $ make && sudo make install
如果cmake报错说缺少某样软件包,用apt-cache search XXX命令搜索,并且像从源安装其它deb 包一样把它装上
注意: 如果编译过程终止并且显示错误信息 'error stating path', 只需要手工创建如下目录并且重新开始编译:
/usr/bin/lua5.1: /usr/share/lua/5.1/luadoc/taglet/standard.lua:447: error stating path `/path/to/awesome/.build-bill-i486-linux-gnu-4.2.3/luadoc' stack traceback:
$ mkdir /path/to/awesome/.build-bill-i486-linux-gnu-4.2.3/luadoc $ make
如果这个无法解决问题的话可以试试如下命令:
$ rm -rf /path/to/awesome/.build-bill-i486-linux-gnu-4.2.3/luadoc $ mkdir /path/to/awesome/.build-bill-i486-linux-gnu-4.2.3/luadoc $ make
- 创建 ~/.xinitrc 并且链接到 ~/.Xsession
~/.xinitrc中内容如下:
#!/usr/bin/env bash xsetroot -solid black & exec /usr/local/bin/awesome
创建一个从.xinitrc到.Xsession的软链接
ln -s ~/.xinitrc ~/.Xsession
- 大功告成。你只需要在登录界面选择'Sessions',并且在列表中选择'Xsession'。照常登录就能运行.xinitrc中的内容进入awesome了。
使用入门
相关概念
标签 Tag
你可以把窗口放在不同的标签中从而实现对大量窗口的管理。每个窗口可以被放到多个标签中,每个标签有它自己的布局(layout)。 标签类似于gnome中的虚拟桌面,但却更为强大--你可以合并标签,或者同时显示多个标签中的内容,然后再回到单个标签的显示中去。
布局 Layout
布局是根据屏幕上的可用空间来调整窗口位置、尺寸的方式。Awesome支持多种布局
平铺 Tiled
平铺模式下屏幕被分为mater和stacking两个区域。master中的窗口包含了需要最多关注的窗口(通常这表示master中的窗口会占据更大的屏幕空间),而stacking区域中包含了其它窗口。如果你想的话master区域可以被划分为多行和多列
最大化 Max
每个窗口都是全屏显示
放大 Magnifier
当前窗口(也就是被鼠标点选中,正在操作的窗口)会显示在屏幕中间,占据大部分屏幕空间。剩下的窗口都处在stacking区域,并放到当前窗口的后面。
浮动 Floating
每个窗口都可以自由的移动和调整大小,就好像普通的窗口管理器一样。无论当前是什么布局,对话框窗口总是处在浮动状态
状态栏
状态栏可以显示在屏幕边缘,它可以包含多个widget
标题栏 Titlebar
类似状态栏,但是它可以显示在每个窗口的四个边缘
Widget
Widget可以包含文本、图像、进度条、函数图像等等,你可以把它放在状态栏或者标题栏里面
默认键位
如果你是一个和我一样懒的人,不介意自己的手指头被默认键位扭曲得像麻花的话,那么完全可以参照我这里给出的部分默认键位的介绍:)
当然你可以通过修改配置文件来更改这些键位。这里的Mod4可以在配置文件中定义,默认是Windows键。
Mod4 + Enter 打开一个终端 Mod4 + F1 运行命令 Mod4 + Shift + c 关掉当前窗口 Mod4 + m 最大化当前窗口 Mod4 + Control + r 重启awesome Mod4 + Shift + q 退出awesome Mod4 + j 切换到下一个窗口 Mod4 + k 切换到前一个窗口 Mod4 + Left 查看前一个tag Mod4 + Right 查看后一个tag Mod4 + 1-9 切换到tag 1-9 Mod4 + Control + j 切换到下一个屏幕 Mod4 + Control + k 切换到前一个屏幕 Mod4 + Shift + j 当前窗口和前一个窗口互换位置 Mod4 + Shift + k 当前窗口和后一个窗口互换位置 Mod4 + h 把主区域(master width)的宽度增大5% Mod4 + l 把主区域(master width)的宽度减少5% Mod4 + Shift + h 增加主区域窗口的数量 Mod4 + Shift + l 减少主区域窗口的数量 Mod4 + Control + h 增加非主区域窗口的数量 Mod4 + Control + l 减少非主区域窗口的数量 Mod4 + space 把当前tag更换为下一种布局 Mod4 + Shift + space 把当前tag更换为前一种布局 Mod4 + Control + space 切换当前窗口是否为浮动的 Mod4 + Shift + i 显示当前窗口的class和instance。这在写脚本的时候尤其有用 Mod4 + Shift + r 重绘当前窗口
Mod4 + t 标记窗口(可标记多个) Mod4 + Shift + F1~F9 把标记的窗口移动到第一~第九桌面上
Ctrl + Mod4 + 1~9 把当前桌面和1~9桌面同时显示 Mod4 + 1~9 恢复
Mod4 + Esc 快速切换到上一个桌面
配置
修改xinitrc
你已经按照之前的步骤安装上了Awesome。但是你会发现进去以后几乎什么都没有,gnome程序的界面没有了主题变得极其丑陋,屏保也不会自动运行了。其实只需要一些设置你就能让它变得很顺手。
首先我们来修改.xinitrc中的内容。
#!/usr/bin/env bash sleep 100 xsetroot -solid black & #启动屏保程序 gnome-screensaver & #启用gnome的主题,否则你的awesome下的gnome程序会非常难看 gnome-settings-daemon & #电源管理程序 gnome-power-manager & #网络管理程序 nm-applet & #自动更新程序 update-notifier & exec /usr/local/bin/awesome
编写rc.lua 让我们来点花样
从3.0开始awesome转而使用lua作为配置文件的格式,配置文件位于~/.config/awesome/rc.lua。这一改变极大的增加了awesome的灵活性,但是也让配置文件变的庞大而复杂。
还好lua不是一门很复杂的语言,所以基本上用不着多少关于lua的专门介绍就可以看明白这个配置文件
注意1:以下的讨论仅适用于awesome3.x版本。8.04源里面的2.4版本用的是完全不同配置文件格式,不能和3.0的通用
注意2:Awesome3的配置文件的格式、lua库函数一直都在变动当中,所以以下说的方法可能只适用于一个特定的git仓库中的版本。等到它稳定以后我会重新更新的:)
因为rc.lua实在是很庞大,没办法每一行都介绍它的意思,所以下面只是介绍一下默认的配置文件中的一些比较有用的部分:
杂项
-- 下面这一行指明了当前配置文件使用的主题文件。awesome的主题非常简单,只需要指明几个颜色就可以了 theme_path = "/usr/local/share/awesome/themes/default" -- 这里设置默认的终端程序。默认的xterm显示中文有问题,我用的是urxvt terminal = "urxvt" -- 还记得之前提到的Mod4键么?你可以在这里重新设置它为其他任意一个键 modkey = "Mod4"
浮动窗口
你下载文件时Firefox打开了一个下载窗口,结果它却可怕的占据了屏幕的一半大小,把其他窗口挤得大小便失禁。英明神武的你当然不想这样。解决方法就是把这样的窗口设置为浮动, 在它们启动的时候就自动把他们设置为浮动窗口,这样就不会让你的屏幕天下大乱了.
-- 需要自动设置为浮动的程序 -- 只需要把你想要设置为浮动窗口的程序的Instance或者class按照下面的格式写进去就行 -- 了。在awesome下用Mod4 + Ctr + i就可以看到当前程序的instance和class名字 floatapps = { ["MPlayer"] = true, ["gimp"] = true, ["smplayer"] = true, ["mocp"] = true, ["Codeblocks"] = true, ["Dialog"] = true, ["Download"] = true, ["empathy"] = true, } -- 把指定的程序自动移动到某个特定的屏幕的某个tag上面 apptags = { ["smplayer"] = { screen = 1, tag = 7 }, ["amarokapp"] = { screen = 1, tag = 8 }, ["VirtualBox"] = { screen = 1, tag = 9 }, ["Firefox"] = { screen = 1, tag = 1}, ["Thunderbird-bin"] = { screen = 1, tag = 7 }, ["Linux-fetion"] = { screen = 1, tag = 6 }, }
我要我的tags
如果你觉得默认的9个tag太多或者是太少,或者是觉得不想用1-9这样的数字来作为Tag 的名字的话,往下看:
-- 下面这个循环创建了默认的9个tag tags = {} for s = 1, screen.count() do -- 每个屏幕都有一个tag的table(这里所说的table指的是lua中的概念,大致等价于数组) tags[s] = {} -- 每个屏幕创建9个tag,把9改为其他数字就能改变tag的数目 for tagnumber = 1, 9 do tags[s][tagnumber] = tag({ name = tagnumber, layout = layouts[1] }) tags[s][tagnumber].screen = s end -- 另最后一个屏幕的第一个tag处于选中状态 tags[s][1].selected = true end -- 默认的tag名字是数字1-9,对于鼠标点击来说有点太小。 -- 你可以通过如下的方法设置自己的tag名称 tags[1][1].name = "Internet" tags[1][2].name = "Term" tags[1][3].name = "IRC" tags[1][4].name = "Tag1" tags[1][5].name = "Tag2" tags[1][6].name = "Tag3" tags[1][7].name = "Email" tags[1][8].name = "Music" tags[1][9].name = "Virtual"
时间
第一次用awesome的人肯定会很奇怪屏幕右上角不断增长的数字是什么?我第一次看到它的时候花了很长时间才反应过来它不是CPI。
-- 显示时间 -- 默认显示的是从1970年1月1日到现在经过了多少秒。话说应该没人喜欢这样的时间显示 -- 难道awesome的作者觉得有人可以心算这个数字得到当前的时间? 囧 -- 查找awful.hooks.timer.register这一行,改为如下的设置就可以显示正常的时间了 awful.hooks.timer.register(1, function () mytextbox.text = " " .. os.date() .. " " end)
开机自动启动
每次开机都重复打开一些程序并且把它们移动到特定的Tag上面是一件很乏味的事情。Awesome并没有提供一个类似gnome的session管理之类的东西,但是我们可以通过修改配置文件来达到开机自动启动程序的目的。
在rc.lua的任意位置添加如下代码:
-- Autorun programs autorun = true autorunApps = { "firefox", "thunderbird", "amarok", "linux-fetion", "amule", } if autorun then for app = 1, #autorunApps do awful.util.spawn(autorunApps[app]) end end
其中把autorunApps中的内容替换为你想要运行的程序就可以了。 注意:X下的程序需要在Awesome启动完毕之后再运行,因而不能放在.xinirc中自动启动。另外在rc.lua中也只能通过awful.util.spawn("cmd")的方式来运行程序,其他的方式比如os.execute或者io.popen都会使awesome失去响应,原因还不清楚。
待续
社区
很遗憾,国内用这个的人似乎还是很少。Awesome的官方网站上页只有一个邮件列表,没有论坛之类的东西。能找到国人讨论的地方有irc.oftc.net的#awesome-cn频道,#awesome是英文频道,欢迎大家没事来讨论。
另外在我的blog上面有一些awesome官方资料的翻译:http://confusedfly.yo2.cn/