awesome
来自 awesome 网站
- awesome 是一个高度可配置的下一代 窗口管理器 框架,适用于 Xorg。它速度非常快且可扩展 [..]。它主要面向高级用户、开发人员以及任何处理日常计算任务并希望对其图形环境进行精细控制的用户。
安装
启动
使用 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 更新时,配置的 API 经常会发生变化。因此,当 awesome 出现奇怪的问题或您想修改配置时,请记住重复执行上述命令。
有关配置 awesome 的更多信息,请查看 awesome 文档中的配置部分。
示例
以下是一些不错的 rc.lua 示例
扩展
awesome 提供了多种扩展
| 扩展名 | 功能 | 版本 |
|---|---|---|
| 显示所有打开的客户端的视图 | Awesome 3.5+ | |
| 动态标签 | Awesome 3.5 | |
| 弹出通知 | Awesome 3.5+ | |
| 其他 小部件 | Awesome 3.5 |
自启动
要实现 XDG Autostart 规范,请安装 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
}
然后,使其 可执行。
要将程序添加到自动启动,只需将 run "program [some arguments]" 追加到 autorun.sh。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 的默认配置已激活布局小部件。
要临时设置多个布局,请运行
$ setxkbmap -layout "us,de"
点击小部件应会切换布局。如果您想要一个组合键来更改布局,您可以附加 -option "grp:alt_shift_toggle"。例如,这将允许您通过按 Shift+Alt 来更改布局。因此,完整的命令将是
$ setxkbmap -layout "us,de" -option "grp:alt_shift_toggle"
设置 EN 和 RU 布局及语音输入变体
$ setxkbmap -model pc105 -option "grp:shifts_toggle,compose:sclk" "us,ru(phonetic_YAZHERTY)"
其中
- Compose 键设置为“Scroll Lock”,语言切换设置为 Left Shift + Right 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 是一个 Lua 库,它允许您使用外部文件对 awesome 进行主题化,从而可以轻松地动态更改您的整个 awesome 颜色和壁纸,而无需更改 rc.lua。
默认主题位于 /usr/share/awesome/themes/default。将其复制到 ~/.config/awesome/themes/default(可以选择全部复制),然后更改 rc.lua
-- 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”等来轻松更改主题,并且可以研究本地复制的主题,进行修改和测试。另请参阅 [1] 获取其他主题化选项。例如,要添加一个无用的间隙,请添加
beautiful.useless_gap = 5
到您 rc.lua 的主题化部分的底部。
壁纸
Beautiful 可以处理您的壁纸,因此您无需在 .xinitrc 或 .xsession 文件中进行设置。这允许您为每个主题设置特定的壁纸。
有两种方法可以指定壁纸
- 在您的
theme.lua中-- absolute path theme.wallpaper = "/path/to/wallpaper.png" -- relative to your themes directory theme.wallpaper = theme_path .. "path/to/wallpaper.png"
- 或在
rc.lua中,位于beautiful.init和local function set_wallpaper之间-- absolute path beautiful.wallpaper = "/path/to/wallpaper.png" -- relative to the configuration directory beautiful.wallpaper = awful.util.get_configuration_dir() .. "path/to/wallpaper.png"
要设置随机背景图像,请将 [2] 添加到 rc.lua (v3.5+)。要自动从给定目录获取图像,请改用 [3]。
技巧与提示
隐藏/显示 wibox
对于 awesome 4.0
awful.key({ modkey }, "b",
function ()
myscreen = awful.screen.focused()
myscreen.mywibox.visible = not myscreen.mywibox.visible
end,
{description = "toggle statusbar"}
),
仅在按下 ModKey 时显示 wibox(或执行其他操作)无法在 awesome 内部完成,但有一个 Python 脚本可以做到:autohidewibox。
屏幕截图
请参阅 键盘输入 以确保 PrtSc 按钮已正确分配。然后安装一个 屏幕捕获程序,例如 scrot。
添加到 globalkeys 数组
awful.key({ }, "Print", function () awful.util.spawn("scrot -e 'mv $f ~/screenshots/ 2>/dev/null'", false) end),
此函数将屏幕截图保存在 ~/screenshots/ 中,根据需要进行编辑。
移除窗口间隙
从 awesome 3.4 开始,可以移除窗口之间的细小间隙;在 awful.rules.rules 表中有一个 properties 部分,在此部分添加
size_hints_honor = false
透明度
请参阅 复合管理器。
在 awesome 3.5 中,可以使用信号动态设置窗口透明度。例如,rc.lua 可能包含以下内容
client.connect_signal("focus", function(c)
c.border_color = beautiful.border_focus
c.opacity = 1
end)
client.connect_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 将在您的桌面上创建一个透明窗口,因此 awesome 的 rc.lua 中为桌面定义的任何操作在 conky 所在的位置将不起作用。
wiboxes
wiboxes 具有内置的伪透明度。要启用它,请在您的主题文件中(例如 ~/.config/awesome/themes/default/theme.lua,通常是 /usr/share/awesome/themes/default/theme.lua 的副本)的颜色后追加两个十六进制数字,如下所示
theme.bg_normal = "#000000AA"
其中“AA”是透明度值。
要通过按 Modkey + PgUp/PgDown 来更改实际选中窗口的透明度,您还可以使用 transset-dfAUR 并对您的 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
[...]
)
小部件间距
默认的 rc.lua 将小部件(包括键盘布局和时钟)放置在间距很小的 wibox 中。可以使用 spacing 属性在小部件之间添加额外的间距
{ -- 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 将内容传递给小部件
您可以轻松地将文本发送到 awesome 小部件。只需创建一个新小部件
mywidget = widget({ type = "textbox", name = "mywidget" })
mywidget.text = "initial text"
要从外部源更新文本,请使用 awesome-client
echo -e 'mywidget.text = "new text"' | awesome-client
不要忘记将小部件添加到您的 wibox 中。
在 awesome 中使用其他面板
如果您喜欢 awesome 的轻量级和功能性,但又不喜欢其默认面板的外观,您可以安装其他面板,例如 xfce4-panel。
然后将其添加到您的 rc.lua 的 自动启动部分。您也可以注释掉为每个屏幕创建 wibox 的部分(从 mywibox[s] = awful.wibox({ position = "top", screen = s }) 开始),但这并非必需。不要忘记通过输入以下命令检查您的 rc.lua 是否有错误
$ 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 文件,从而减慢启动速度。如果您更喜欢其他启动程序的方式,可以通过在 rc.lua 中删除 local menubar = require("menubar") 和对 menubar 变量的其他引用来禁用菜单栏。
弹出菜单
自 awesome 3 起,默认有一个简单的菜单,简化了自定义菜单。[4] 如果您想要一个 freedesktop.org 菜单,可以查看 awesome-freedesktop。
如果您希望在点击 Awesome 图标或在桌面空白区域右键单击时使用外部应用程序菜单,可以按照 Xdg-menu#Awesome 中的说明进行操作。但是,当您添加或删除程序时,此菜单不会更新。因此,请务必运行命令来更新您的菜单。它可能看起来像
$ xdg_menu --format awesome --root-menu /etc/xdg/menus/arch-applications.menu >~/.config/awesome/archmenu.lua
标题栏
在 awesome 中启用标题栏非常容易,只需在配置文件中将 `titlebars_enabled` 变量设置为 true 即可。(在 rules 区域)
{ rule_any = {type = { "normal", "dialog" }
}, properties = { titlebars_enabled = true }
},
但是,您可能希望能够切换标题栏的显示/隐藏。您可以通过简单地在您的快捷键绑定中添加类似以下内容来实现:(在 Key bindings 的 clientkeys 中。并且不要将代码放在 clientkeys 区域的末尾)
-- 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 Controller 激活的屏幕键盘在尝试输入一个字符后似乎会冻结。这是因为应接收输入的客户端必须处于焦点状态才能接收输入,键盘会等待直到成功发送此输入。手动聚焦另一个客户端会将输入发送到该客户端,并暂时解冻键盘,直到输入下一个字符。
要使键盘正常工作,关键是防止它获得焦点。将以下信号添加到您的配置中(或与现有的客户端焦点信号合并)
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 :1 -ac -br -noreset -screen 1152x720 & $ DISPLAY=:1.0 awesome -c ~/.config/awesome/rc.lua.new
这种方法的优点是,如果您引入了错误,您不会破坏当前 awesome 桌面,从而可能导致 X 应用程序崩溃并丢失工作。一旦您对新配置满意,请将 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 不起作用。它与 awmtt 的区别在于,它不会先尝试运行测试文件,而是直接运行默认配置。
要简单地打开一个加载了 awesome 的 Xephyr 窗口,请运行
$ aawmtt
awesome 的输出现在将打印到您的终端,并且在更改配置文件夹中的任何文件时,awesomewm 将被重新加载。
如果您想修改要监视文件更改的目录,或者您的配置文件位置,只需运行
$ aawmtt --config "location_of_config_file" --watch "directory_to_watch_for_changes"
默认情况下,要监视更改的目录是您的配置文件目录的父目录,因此默认情况下它将是“~/.config/awesome”。
日志文件
如果您使用 LightDM,awesome 会将错误记录到 `$HOME/.xsession-errors`。如果您使用 .xinitrc 来启动 awesome,FAQ 中的“日志、错误消息或任何内容在哪里?”条目可能是一个有用的资源。
Mod4 键
Awesome 建议重新映射 mod4,它默认应该是 Super 或“Windows”键。如果由于某种原因它没有映射到 mod4,请使用 xmodmap 来找出是什么。要更改映射,请使用 xev 来查找要映射的键的键码和名称。然后将类似以下内容添加到 ~/.xinitrc
xmodmap -e "keycode 115 = Super_L" -e "add mod4 = Super_L" exec awesome
在这种情况下,问题是某些 xorg 安装识别键码 115,但错误地将其识别为“Select”键。上述命令明确地将键码 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#灰色窗口、应用程序无法随 WM 调整大小、菜单立即关闭 和 [5]。
Eclipse:无法调整主窗口大小/移动
如果您卡住并且无法移动或调整主窗口的大小(使用 mod4 + 鼠标左键/右键),请编辑 workbench.xml 并将 fullscreen/maximized 设置为 false(如果已设置),并将宽度和高度减小到小于您单屏桌面区域的数字。
workbench.xml 可以在 eclipse_workspace/.metadata/.plugins/org.eclipse.ui.workbench/ 中找到。编辑以下行
<window height="xx" maximized="true" width="xx" x="xx" y="xx"
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 } },
请参阅 [6]。
阻止鼠标滚轮切换标签页
在您的 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/min。为缓解此问题,您可以强制更频繁地进行垃圾回收,方法是将此添加到您的 ~/.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://lua.ac.cn/pil/ - Programming in Lua (first edition)
- https://awesomewm.org/ - 官方 Awesome 网站
- https://bbs.archlinux.org/viewtopic.php?id=88926 - 分享你的 awesome!