awesome
来自awesome网站:
Awesome 是 Xorg 下可高度定制的新一代窗口管理器,运行快捷、扩展性强。Awesome主要面向高级用户、开发者和那些希望完美控制自己电脑的图形界面的人。
安装
启动
使用 xinit 运行 awesome。要使用其包括的 xsession 文件,参考显示管理器页面。
与GNOME一同使用
你可以设置 GNOME 使用 awesome 作为其窗口管理器,但必须让 GNOME 在后台运行。详见 awesome-gnomeAUR。
XFCE
详见 XFCE#使用不同的窗口管理器。
配置
配置文件是一个lua脚本:~/.config/awesome/rc.lua。
创建配置文件
创建配置文件所在的文件夹:
$ mkdir -p ~/.config/awesome/
编译后,awesome会自动使用~/.config/awesome/rc.lua里的所有配置。这个文件并不会自动创建,所以我们先要从模板复制一个过来:
$ cp /etc/xdg/awesome/rc.lua ~/.config/awesome
配置文件的语法会随着Awesome的版本升级而变化,所以当你升级了之后遇到问题时,重复上面的步骤,或者你得手动修改配置文件。
要获得关于配置Awesome的更多信息,请看Awesome wiki的配置部分。
例子
扩展
下列扩展对 awesome 来说是可用的:
| E | 功能 | 版本 |
|---|---|---|
| 显示所有已打开客户端的视图 | Awesome 3.5+ | |
| 动态标签 | Awesome 3.5 | |
| 弹出通知 | Awesome 3.5+ | |
| 额外的 widgets | Awesome 3.5 |
自动启动
要实现 XDG 自动启动规范,安装 xorg-xrdb包和 dex包,并将以下行添加到 ~/.config/awesome/rc.lua:
~/.config/awesome/rc.lua
awful.spawn.with_shell(
'if (xrdb -query | grep -q "^awesome\\.started:\\s*true$"); then exit; fi;' ..
'xrdb -merge <<< "awesome.started:true";' ..
'dex --environment Awesome --autostart --search-paths "${XDG_CONFIG_HOME:-$HOME/.config}/autostart:${XDG_CONFIG_DIRS:-/etc/xdg}/autostart";'
)
尤其是对于没有托盘图标的守护进程,使用自动启动目标的 systemd 用户单元是一个有趣的替代方案,因为它们可以被配置为保持运行状态,即被监控并在意外停止后自动重启。
最后, 也可以创建 autorun.sh 然后插入下列文字:
~/.config/awesome/autorun.sh
#!/bin/sh
run() {
if ! pgrep -f "$1" ;
then
"$@"&
fi
然后,让它可执行。
要添加自启动程序, 只需要向 autorun.sh 添加 run "program [some arguments]"。 run 函数检查是否已经有一个带着一些参数的 program 实例,并且只在没有该实例时运行 program。你可以通过运行你的 autorun.sh 来检查它:
$ ~/.config/awesome/autorun.sh
如果配置成功, 将以下行添加到 rc.lua:
~/.config/awesome/rc.lua
awful.spawn.with_shell("~/.config/awesome/autorun.sh")
或者,添加你希望运行的命令(包括设置环境变量)到 xinitrc(或 xprofile,当使用显示管理器时)。
改变键盘布局
有许多方法配置键盘布局。
setxkbmap 配置方法
Awesome的默认配置已经激活了键盘布局 widget。
要暂时设置多键盘布局,运行
$ setxkbmap -layout "us,de"
点击 widget 将改变键盘布局。如果你想要一个组合键来改变键盘布局,你可用加上 -option "grp:alt_shift_toggle"。这是一个通过按 Shift+Alt 改变键盘布局的例子,完整的命令如下:
$ setxkbmap -layout "us,de" -option "grp:alt_shift_toggle"
设置带有音标的英语和俄语键盘布局:
$ setxkbmap -model pc105 -option "grp:shifts_toggle,compose:sclk" "us,ru(phonetic_YAZHERTY)"
其中
- Compose key is 设为 "Scroll Lock" ,语言切换键设为左 Shift + 右 Shift。
- 键盘上有105个键。
如果使用 LightDM 开启会话,添加上述命令到 .xprofile 文件。
rc.lua 配置方法 (自 v.4 版本开始可用)
你可以使用 awesome 自身来切换键盘布局 (自 v.4 版本开始可用)。要通过按 Shift+Alt 改变键盘布局, 添加这两行到 globalkeys:
~/.config/awesome/rc.lua
-- Key bindings
globalkeys = gears.table.join(
-- ...
awful.key({ "Shift" }, "Alt_L", function () mykeyboardlayout.next_layout(); end),
awful.key({ "Mod1" }, "Shift_L", function () mykeyboardlayout.next_layout(); end)
)
这需要你提前通过 setxkbmap 命令或 X 配置文件设置你想要切换的键盘布局。
当你找到了设置你的键盘布局的适合方法,添加到 #自启动。
Xorg 配置方法
详见 Xorg/键盘配置。
主题
Beautiful 是一个允许你使用外部文件给 awesome 配置主题的 lua 库,可以让你非常容易地动态地改变背景图片和颜色主题,而不需要改变 rc.lua。
默认的主题文件在 /usr/share/awesome/themes/default。把它复制到 ~/.config/awesome/themes/default(可选复制其他所有主题)然后修改一下 rc.lua 中的 theme_path。
-- beautiful.init(gears.filesystem.get_configuration_dir() .. "/themes/default/theme.lua")
local theme_path = string.format("%s/.config/awesome/themes/%s/theme.lua", os.getenv("HOME"), "default")
beautiful.init(theme_path)
如果你同时也复制了其他主题,你可以把 "default" 替换为 "sky","gtk" 或 "zenburn" 来容易地切换主题,并且本地主题文件可以被学习、修改和用于测试。额外的主题配置选项参考这里。例如要添加一个 useless gap,添加
beautiful.useless_gap = 5
到你的 rc.lua 的主题配置部分。
设置墙纸
Beautiful 可以设置墙纸,所以你就不用在 .xinitrc 或者 .xsession 中自己设置了。这允许你给每个主题配一个墙纸。
有两种方式设置墙纸:
- 在
theme.lua中:-- 绝对路径 theme.wallpaper = "/path/to/wallpaper.png" -- 相对于主题目录的相对路径 theme.wallpaper = theme_path .. "path/to/wallpaper.png"
- 或在
rc.lua中,位于beautiful.init和local function set_wallpaper之间:-- 绝对路径 beautiful.wallpaper = "/path/to/wallpaper.png" -- 相对于主题目录的相对路径 beautiful.wallpaper = awful.util.get_configuration_dir() .. "path/to/wallpaper.png"
要设置随机墙纸,添加这个到 rc.lua(v3.5+)。要从一个特点目录自动获取墙纸,使用这个。
小技巧
显示/隐藏wibox
从 awesome 4.0 开始:
awful.key({ modkey }, "b",
function ()
myscreen = awful.screen.focused()
myscreen.mywibox.visible = not myscreen.mywibox.visible
end,
{description = "toggle statusbar"}
),
在 awesome 中,只在按下 Modkey 时显示 wibox(或执行其他操作)是不可能的,但这里有一个 Python 脚本实现了这个功能:autohidewibox。
截图
设置键盘输入,确保 PrtSc 键被正确绑定了。然后安装一个截图工具,例如 scrot。
在配置文件中的 globalkeys 中输入并保存:
awful.key({ }, "Print", function () awful.util.spawn("scrot -e 'mv $f ~/screenshots/ 2>/dev/null'") end),
这里的 ~/screenshots/ 可以改成你截图想要保存的地方。
移除窗口间隔
自 awesome 3.4 起,移除创建之间的小间隔是可能的。在 awful.rules.rules 表格中的 properties 章节添加:
size_hints_honor = false
透明度
参见合成器。
在 awesome 3.5 中, 窗口透明度可以用信号动态设置。例如,rc.lua 可以包含下列内容:
client.add_signal("focus", function(c)
c.border_color = beautiful.border_focus
c.opacity = 1
end)
client.add_signal("unfocus", function(c)
c.border_color = beautiful.border_normal
c.opacity = 0.7
end)
Conky
当使用 conky 时,你必须设置它让它创建自己的窗口,而不是使用桌面。为此,编辑 ~/.conkyrc以包含
own_window yes own_window_transparent yes own_window_type desktop
否则你可能会看到奇怪的表现,比如所有的窗口都变得完全透明。注意由于 conky 将会在你的桌面上创建一个透明窗口,所有定义于 rc.lua 的动作在 conky 所在的位置都不会工作。
wiboxes
Wiboxes具有内置的伪透明功能。要启用它,在主题文件中的颜色后附加2位十六进制数字(例如~/.config/awesome/themes/default/theme.lua, 通常为 /usr/share/awesome/themes/default/theme.lua 的复制品),如下所示:
theme.bg_normal = "#000000AA"
其中 "AA" 为透明度。
To change transparency for the actual selected window by pressing Modkey + PgUp/PgDown you can also use transset-dfAUR and the following modification to your rc.lua:
globalkeys = gears.table.join(
-- your keybindings
[...]
awful.key({ modkey }, "Next", function (c)
awful.util.spawn("transset-df --actual --inc 0.1")
end),
awful.key({ modkey }, "Prior", function (c)
awful.util.spawn("transset-df --actual --dec 0.1")
end),
-- Your other key bindings
[...]
)
Widget 间隔
默认 rc.lua 在一个 wibox 里放置包括键盘布局和时钟等所有 widgets,widgets 之间只有很小的间隔。使用 spacing 属性在 widgets 之间增加额外的间隔是可能的:
{ -- Right widgets
layout = wibox.layout.fixed.horizontal,
spacing = 10,
mykeyboardlayout,
...
ImageMagick
如果你用 ImageMagick 的 display 命令来设置你的墙纸,可能会遇到 xcompmgr 效果不好的问题。请注意 awsetbg 可能会用 display 如果它没有其他选项。安装 habak,feh,hsetroot 或者其他的包应该会解决这个问题。(grep -A 1 wpsetters /usr/bin/awsetbg 来看你有哪些选项)
使用 awesome-client 给文本插件传递信息
只需要创建一个新的插件,就可以很容易的传递信息。
mywidget = widget({ type = "textbox", name = "mywidget" })
mywidget.text = "initial text"
使用 awesome-client 从外部更新“initial text":
echo -e 'mywidget.text = "new text"' | awesome-client
不要忘记把插件增加到 wibox。
使用其他任务栏
如果你喜欢 awesome 既轻量又强大的功能,但又不喜欢默认那个任务栏的外观,你可以安装其他的,比如 xfce4-panel包。
然后要把它添加到配置文件 rc.lua 的自动启动部分,你可以注释掉配置文件中给每个桌面创建 wiboxes 的那部分(开头是mywibox[s] = awful.wibox({ position = "top", screen = s })),但不是必要的。检查配置文件没有错误之后就可以执行命令生效:
$ awesome -k rc.lua
另外你还需要改变 modkey+R 的快捷键绑定,来用一些其他的应用启动器替代awesome自带的启动器。别忘了添加
properties = { floating = true } },
{ rule = { instance = "$yourapplicationlauncher" },
到你的 rc.lua。
菜单栏中的应用程序目录
Awesome 软件包含有 menubar(默认情况下,按下 Mod+p 会在屏幕上方打开一个类似于 dmenu 的应用程序菜单)。它搜索位于$XDG_DATA_DIRS/applications 及 $XDG_DATA_HOME/applications/ 目录下的 .desktop 文件。
通过修改 menubar.menu_gen.all_menu_dirs,你可以扩充或取代这些目录:
~/.config/awesome/rc.lua
table.insert(menubar.menu_gen.all_menu_dirs, "/path/to/custom/applications/")
注意每次 awesome 启动都会重新读取 .desktop 文件,因此文件过多会拖慢 Awesome 的启动速度。如果你更喜欢使用其他方式来运行程序,可以通过在 rc.lua 移除 local menubar = require("menubar") 及其它涉及到 menubar 的变量来禁用菜单栏。
应用菜单
自 awesome 3 以来,默认提供了一个简单的菜单,简化了自定义菜单。如果你想要一个freedesktop.org的菜单,可以查看awesome-freedesktop。
如果想要在点击Awesome图标,或者在桌面空白处右键点击时,看到较传统模式的应用菜单,可以参照Xdg-menu#Awesome的说明。但应用菜单不会在安装或卸载程序时进行更新。所以,确保运行类似如下的命令,更新应用菜单:
xdg_menu --format awesome --root-menu /etc/xdg/menus/arch-applications.menu >~/.config/awesome/archmenu.lua
标题栏
你可以很容易地在配置文件中rule把 titlebars_enabled 设置为 true 来启用标题栏。
{ rule_any = {type = { "normal", "dialog" }
}, properties = { titlebars_enabled = true }
},
如果想要切换标题栏的显示与否,可以把以下代码加入配置文件中键位绑定部分的clientkeys部分中间位置(因为这段代码是以逗号结尾,请不要放在 clientkeys 的最后),然后通过按 modkey + Ctrl + t 来切换。
-- working toggle titlebar
awful.key({ modkey, "Control" }, "t", function (c) awful.titlebar.toggle(c) end,
{description = "Show/Hide Titlebars", group="client"}),
如果想默认情况下隐藏标题栏,仅需要在配置文件中标题栏创建后(即在 "manage" 信号处理器内)加入以下代码:
awful.titlebar.hide(c)
电池通知
参考这篇博文以向 rc.lua 添加一个简单的电池通知。注意它需要 naughty 用来通知(3.5 版本起默认安装)。Awesome wiki 上也有其他的参考案例。
媒体控制
使用 amixer(1)(通过 alsa-utils包 安装)和 playerctl包 的组合控制音量和媒体播放是可能的。下列代码可以被添加到你的 rc.lua 配置文件中与快捷键相关的章节:
-- Volume Keys
awful.key({}, "XF86AudioLowerVolume", function ()
awful.util.spawn("amixer -q -D pulse sset Master 5%-", false) end),
awful.key({}, "XF86AudioRaiseVolume", function ()
awful.util.spawn("amixer -q -D pulse sset Master 5%+", false) end),
awful.key({}, "XF86AudioMute", function ()
awful.util.spawn("amixer -D pulse set Master 1+ toggle", false) end),
-- Media Keys
awful.key({}, "XF86AudioPlay", function()
awful.util.spawn("playerctl play-pause", false) end),
awful.key({}, "XF86AudioNext", function()
awful.util.spawn("playerctl next", false) end),
awful.key({}, "XF86AudioPrev", function()
awful.util.spawn("playerctl previous", false) end),
Steam 键盘
可通过 Steam 控制器激活的屏幕Steam键盘在尝试输入一个字符后似乎会冻结。这是因为本应接收输入的客户端必须处于焦点状态才能接收输入,而键盘会等待输入成功发送。手动将焦点切换到另一个客户端会将输入发送到此客户端,并再次解冻键盘,直到输入下一个字符。
让键盘正常工作的诀窍在于防止它获得焦点。请将以下信号添加到您的配置中(或与现有的客户端焦点信号合并):
client.connect_signal("focus", function(c)
if awful.rules.match(c, { name = "^Steam Keyboard$" }) then
awful.client.focus.history.previous()
end
end)
每当键盘获得焦点时,焦点将返回至上一个客户端。由于键盘输入是由 Steam 客户端处理的,因此不需要焦点,现在输入文本将正常工作。
故障排除
调试 rc.lua
Xephyr 允许你在一个 X 客户端窗口内运行另一个 X。用这种方式可以在不破坏现有桌面的情况下对 rc.lua 进行测试。首先把 rc.lua 复制到一个新文件(例如 rc.lua.new),接着进行修改。然后在 Xephyr 中运行新的 awesome 实例,使用 rc.lua.new 作为配置文件,就像这样:
$ Xephyr -ac -br -noreset -screen 1152x720 :1 & $ DISPLAY=:1.0 awesome -c ~/.config/awesome/rc.lua.new
这种方式的巨大优势在于如果你弄坏了 rc.lua.new,你不至于把现有的 awesome 桌面弄得一团糟,并且很可能还会把 XWindow 弄崩溃了,没保存的工作全部丢失。一旦你觉得新的配置文件不错,就用 rc.lua.new 代替 rc.lua,然后重启 awesome。
自动重载
作为上述方法的补充,你可以使用 inotify-tools包 以在更新 ~/.config/awesome 目录下的配置文件时,在 Xephyr 内自动重载 awesome 实例 :
#!/usr/bin/env bash Xephyr :1 -ac -br -noreset -screen 1920x1080 -dpi 96 & sleep 1 DISPLAY=:1.0 awesome -c ~/.config/awesome/rc.lua.new & instance=$! while inotifywait -r -e close_write ~/.config/awesome; do kill -s SIGHUP $instance done
使用 awmtt
awmttAUR (Awesome WM Testing Tool) 是一个基于 Xephyr 的易于使用的脚本。默认情况下,它会测试 ~/.config/awesome/rc.lua.test 。如果该文件不存在,它会测试当前使用的 rc.lua 。也可以指定要测试的配置文件所在路径:
$ awmtt start -C ~/.config/awesome/rc.lua.new
当测试完成后,使用以下命令关闭窗口:
$ awmtt stop
或者通过以下命令立即查看变化:
$ awmtt restart
aawmtt
aawmttAUR (Another Awesome WM Testing Tool) 是 awmttAUR 的另一种实现,默认包含Live-Reload功能。它与 awmtt-ng 类似,但针对 Xorg 显示检测问题做了一些修复,因为 awmtt-ng 在某些机器上无法正常检测 Xorg 显示。它与 awmtt 的不同之处在于,它不会先尝试运行测试文件,而是直接运行默认配置。
要打开一个已加载 awesome 的 Xephyr 窗口,请运行:
$ aawmtt
现在,awesome 的输出将打印到您的终端,并且当您更改配置文件夹中的任何文件时,awesome 将重新加载。
如果你想修改被监视以检测文件更改的目录,或者配置文件的位置,只需运行:
$ aawmtt --config "location_of_config_file" --watch "directory_to_watch_for_changes"
默认情况下,会被监视以检测更改的目录是配置文件的父目录,因此默认情况下,该目录将是“~/.config/awesome”。
日志文件
如果你正在使用 LightDM, awesome 会将日志记录到 `$HOME/.xsession-errors`。如果你使用 .xinitrc 启动 awesome, awesome FAQ 中的 "Where are logs, error messages or something?" 也许是有用的资源。
Mod4 键
Awesome建议重新映射 mod4 键,该键默认应为超级键或“Windows”键。如果由于某种原因它未被映射到 mod4,请使用 xmodmap 来找出其映射情况。要更改映射,请使用 xev 来查找要映射的键的键码和名称。然后在 ~/.xinitrc 中添加类似以下的内容
xmodmap -e "keycode 115 = Super_L" -e "add mod4 = Super_L" exec awesome
此案例中的问题是,某些 Xorg 安装能够识别键码115,但错误地将其识别为“选择”键。上述命令明确地将键码115重新映射到正确的“Super_L”键。
要使用 setxkbmap 重新映射 mod4(与 xmodmap 冲突)参见:
tail -50 /usr/share/X11/xkb/rules/evdev
要将 caps lock 键设为 mod4,添加下列内容到 ~/.xinitrc:
setxkbmap -option caps:hyper
修复 Java (GUI 只显示灰色)
参见 Java#灰色窗口,应用程序不随窗口管理器调整大小,菜单立即关闭和这篇文档。
Eclipse: 不能调整或移动主窗口
如果你遇到卡顿,无法移动或调整主窗口大小(使用 mod4 键 + 鼠标左/右键),请编辑 workbench.xml 文件,将 fullscreen/maximized 设置为 false(如果已设置),并将宽度和高度减小到小于你的单屏桌面区域的值。
Netbeans: 代码预测出现在错误的屏幕上
如果你有两个显示器,同时使用 Netbeans 的代码预测(Ctrl + Space),代码预测可能会出现在错误的屏幕。下列代码能修复问题:
.config/awesome/rc.lua
awful.rules.rules = {
...
{
rule_matches = { -- Fix Netbeans
class = {
"sun-awt-X11-XWindowPeer", "NetBeans IDE 8.2"
},
name = {
"win1"
}
}, properties = { screen = 1 } -- even with screen 1 here, this still works on the seccond screen, too (do not know why).
},
...
IntelliJ: 菜单出现在错误的位置,一些窗口打不开
参见 GitHub issue #2204。下列代码能解决问题:
.config/awesome/rc.lua
clientbuttons_jetbrains = gears.table.join(
awful.button({ modkey }, 1, awful.mouse.client.move),
awful.button({ modkey }, 3, awful.mouse.client.resize)
)
...
awful.rules.rules = {
...
{
rule = {
class = "jetbrains-.*",
}, properties = { focus = true, buttons = clientbuttons_jetbrains }
},
{
rule = {
class = "jetbrains-.*",
name = "win.*"
}, properties = { titlebars_enabled = false, focusable = false, focus = true, floating = true, placement = awful.placement.restore }
},
...
}
scrot: 无法使用键盘快捷键进行鼠标选区的截图
使用 scrot 时,在为鼠标选择选项分配键盘快捷键时,你可能会遇到问题(形式上是 scrot -s)。要修复它,向你的 rc.lua 添加下列内容:
awful.key( { modkey, }, <shortcut>, nil, function () awful.spawn("scrot -s") end)
注意 nil 被传送到 awful.key 的 press 参数。相反,回调函数作为第四个参数传递,该参数名为 release。.
YouTube: 全屏出现在背景
参见此处。如果在全屏模式下,YouTube 视频出现在你的浏览器下层,添加这些到你的 rc.lua:
{ rule = { instance = "plugin-container" },
properties = { floating = true } },
如果你使用 Chromium 浏览器,添加:
{ rule = { instance = "exe" },
properties = { floating = true } },
或:
{ rule = { role = "_NET_WM_STATE_FULLSCREEN" },
properties = { floating = true } },
参见此处。
防止鼠标滚轮更改标签
在你的 rc.lua 中,修改鼠标绑定为下列内容:
-- {{{ Mouse bindings
root.buttons(gears.table.join(
awful.button({ }, 3, function () mymainmenu:toggle() end)
))
-- }}}
Xdg-menu 生成重复菜单项
如果你将 /usr/share/applications 中的桌面文件复制到 ~/.local/share/applications,Xdg-menu将会生成重复条目,尽管直接覆盖原始文件可能更可取,例如为特定应用程序使用不同的主题。解决这个问题的一种方法是使用awk过滤生成的输出,以删除与前一条目名称相同的条目。
xdg_menu --format awesome --root-menu /etc/xdg/menus/arch-applications.menu | awk -F, '{if (a!=$1) print $a; a=$1}' >~/.config/awesome/archmenu.lua
Xfce4 中部分快捷键因按键重叠而失效
检查你的
$ xfce4-keyboard-settings
关于像“Super L”这样的重叠键或应由 awesome 运行的组合键。
内存泄漏
有些用户即使没有进行任何操作也会遇到内存泄漏问题。当使用大量小部件时,内存泄漏的速度可能高达每分钟5 MB。为了缓解这一问题,您可以通过在 ~/.config/awesome/rc.lua 文件中添加以下内容来强制执行更频繁的垃圾收集:
-- Run garbage collector regularly to prevent memory leaks
gears.timer {
timeout = 30,
autostart = true,
callback = function() collectgarbage() end
}
额外链接
- https://awesomewm.org/apidoc/documentation/90-FAQ.md.html - FAQ
- https://www.lua.org/pil/ - Lua编程指南(第一版)
- https://awesomewm.org/ - awesome 官方网站
- https://bbs.archlinux.org/viewtopic.php?id=88926 - 分享你的awesome!
- https://web.archive.org/web/20111222025635/http://www.penguinsightings.org/desktop/awesome/ - 一条评论
- https://web.archive.org/web/20120427051008/http://compsoc.tardis.ed.ac.uk/wiki/AwesomeWM_guide - Awesome 指南