跳转到内容

awesome

来自 Arch Linux 中文维基

来自awesome网站:

AwesomeXorg 下可高度定制的新一代窗口管理器,运行快捷、扩展性强。Awesome主要面向高级用户、开发者和那些希望完美控制自己电脑的图形界面的人。

安装

安装位于官方软件仓库的软件包 awesome

注意:自2019年起,awesome 就没有新的正式版本发布了。如果你遇到了任何问题或者想要缺失的特性,安装 awesome-gitAUR

启动

使用 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配置文件语法有时会变化,所以你可能得动手修改下载的配置文件。

扩展

下列扩展对 awesome 来说是可用的:

E 功能 版本
显示所有已打开客户端的视图 Awesome 3.5+
动态标签 Awesome 3.5
弹出通知 Awesome 3.5+
额外的 widgets Awesome 3.5

自动启动

要实现 XDG 自动启动规范,安装 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

然后,让它可执行

要添加自启动程序, 只需要向 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/键盘配置英语Xorg/Keyboard configuration

主题

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 的主题配置部分。

注意:Awesome 不支持点阵字体,如果你的系统上只安装了点阵字体,字体渲染将损坏。

设置墙纸

Beautiful 可以设置墙纸,所以你就不用在 .xinitrc 或者 .xsession 中自己设置了。这允许你给每个主题配一个墙纸。

有两种方式设置墙纸:

  • theme.lua 中:
    -- 绝对路径
    theme.wallpaper = "/path/to/wallpaper.png"
    
    -- 相对于主题目录的相对路径
    theme.wallpaper = theme_path .. "path/to/wallpaper.png"
    
  • 或在 rc.lua 中,位于 beautiful.initlocal 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

附注: 请提供模板的second参数以more detailed indications。(在 Talk:Awesome 中讨论)

当使用 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

本文或本章节可能需要合并到Xorg#合成

附注: 请提供模板的second参数以more detailed indications。(在 Talk:Awesome 中讨论)

如果你用 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 键

本文或本章节可能需要合并到Xorg/键盘配置

附注: 请提供模板的second参数以more detailed indications。(在 Talk:Awesome 中讨论)

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(如果已设置),并将宽度和高度减小到小于你的单屏桌面区域的值。

注意: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: 菜单出现在错误的位置,一些窗口打不开

本文或本节内容已经过时。

原因: 这个 issue 已经关闭了,请重新测试,如果不再需要,删除这个章节。 (在Talk:Awesome讨论)

参见 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.keypress 参数。相反,回调函数作为第四个参数传递,该参数名为 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
}

额外链接