awesome

出自 ArchWiki

来自 awesome 网站

awesome 是一个高度可配置的下一代框架窗口管理器,用于 Xorg。它非常快速且可扩展 [..]。它主要面向高级用户、开发人员以及处理日常计算任务并希望对其图形环境进行细粒度控制的任何人员。

安装

安装 awesome 软件包。开发版本是 awesome-gitAUR,它被认为是不稳定的,并且可能具有不同的配置 API。

启动

使用 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 文档中的配置部分

示例

注意: awesome 配置的 API 会定期更改,因此您可能需要修改您下载的任何文件。

以下是一些 rc.lua 的好例子

扩展

有几个可用于 awesome 的扩展

扩展 功能 版本
显示所有已打开客户端的视图 Awesome 3.5+
动态标签 Awesome 3.5
弹出通知 Awesome 3.5+
附加小部件 Awesome 3.5

自动启动

要实现 XDG Autostart 规范,请安装 xorg-xrdbdex,并将以下行添加到 ~/.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.shrun 函数检查是否已存在具有相同参数的 program 实例,并且仅在没有实例时才运行 program。您可以通过运行 autorun.sh 来检查它

$ ~/.config/awesome/autorun.sh

如果一切正常,请将以下行添加到您的 rc.lua

~/.config/awesome/rc.lua
awful.spawn.with_shell("~/.config/awesome/autorun.sh")

更改键盘布局

有多种方法可以配置键盘布局。

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)"

其中

  • 组合键设置为 "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 方法

或者,参见 Keyboard configuration in 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 中主题部分的底部。

注意: Awesome 不支持位图字体;如果您的系统上仅安装了位图字体,则字体渲染将损坏。

壁纸

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.initlocal 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

截图

参见 Keyboard input 以确保 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

透明度

参见 composite manager

在 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 合并的候选对象。

注意: 请使用模板的第二个参数来提供更详细的说明。 (在 Talk:Awesome 中讨论)

如果使用 conky,则必须将其设置为创建自己的窗口而不是使用桌面。为此,请编辑 ~/.conkyrc 以包含

own_window yes
own_window_transparent yes
own_window_type desktop

否则可能会观察到奇怪的行为,例如所有窗口都变得完全透明。另请注意,由于 conky 将在您的桌面上创建一个透明窗口,因此在 awesome 的 rc.lua 中为桌面定义的任何操作都将无法在 conky 所在的位置工作。

wiboxes

wiboxes 有内置的伪透明度。要启用它,请将 2 个十六进制数字附加到主题文件中的颜色(例如 ~/.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

本文或本节是与 Composite manager 合并的候选对象。

注意: 请使用模板的第二个参数来提供更详细的说明。 (在 Talk:Awesome 中讨论)

如果您使用 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.luaautorun 部分。您也可以注释掉为每个屏幕创建 wibox 的部分 (从 mywibox[s] = awful.wibox({ position = "top", screen = s }) 开始),但这并非必要。不要忘记通过键入以下内容检查您的 rc.lua 是否有错误

$ awesome -k rc.lua

您还应该更改您的 modkey+R 键绑定,以便启动其他应用程序启动器而不是内置的 awesome。有关示例,请参见 List of applications/Other#应用程序启动器。不要忘记添加

      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

标题栏

通过在配置文件中将变量 titlebars_enabled 设置为 true,可以很容易地在 awesome 中启用标题栏。(在规则区域中)

   { rule_any = {type = { "normal", "dialog" }
     }, properties = { titlebars_enabled = true }
   },

但是,您可能希望能够切换标题栏的开或关。您可以通过简单地将类似这样的内容添加到您的键绑定中来做到这一点:(在键绑定的 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(通过 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 激活的屏幕 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 :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 测试工具) 是 Xephyr 周围一个易于使用的包装脚本。默认情况下,它将使用 ~/.config/awesome/rc.lua.test。如果找不到该测试文件,它将使用您实际的 rc.lua。您还可以指定要测试的配置文件的位置

$ awmtt start -C ~/.config/awesome/rc.lua.new

完成测试后,使用以下命令关闭窗口

$ awmtt stop

或者通过发出以下命令立即查看您对配置文件所做的更改

$ awmtt restart

aawmtt

aawmttAUR (另一个 Awesome WM 测试工具) 是 awmttAUR 的替代实现,默认情况下包含 Live-Reload。它类似于 awmtt-ng,但包含一些针对 XOrg Display 检测的修复,这些修复在某些使用 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 键

本文或本节是与 Configuring_keyboard_layouts_in_X 合并的候选对象。

注意: 请使用模板的第二个参数来提供更详细的说明。 (在 Talk:Awesome 中讨论)

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 + 空格),则代码预测可能会出现在错误的屏幕上。这为我解决了问题

.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:菜单出现在错误的位置,某些窗口无法打开

本文或本节已过时。

原因: 此问题已关闭,请重新测试并在不再需要时删除本节。 (在 Talk:Awesome 中讨论)

参见 GitHub 问题 #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.keypress 参数。相反,回调函数作为第四个参数传递,即名为 release 的参数。

YouTube:全屏在后台显示

如果 YouTube 视频在全屏模式下出现在您的 Web 浏览器下方,或者在控件隐藏的面板下方,请将此添加到 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 生成重复的菜单项

如果您将 desktop-files 从 /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
}

参见