我们知道,在KDE中可以通过窗口管理器方便地将窗口设置为总在最前、设置出现在所有工作区等, 但是Ubuntu 6.06的Gnome中无法做到这一点。Gnome所用的窗口管理器MetaCity认为这些不是窗口管理器的任务, 因此没有实现这些功能。好在Gnome的一名开发者为我们开发了Devil’s Pie 这个程序,它能够根据预先设定的动作自动控制Gnome中的窗口。
原理
Devil’s Pie启动之后会监视新窗口的建立,如果新建的窗口满足指定的条件则按照预定的动作设置该窗口的属性。 例如,如果设置“标题为GVIM的窗口最大化”这样的条件,那么gvim启动时就会被 Devil’s Pie 检测到并被最大话。
Devil’s Pie的配置文件为 /etc/devilspie 和 ~/.devilspie/*.ds。每当有窗口启动时,Devil’s Pie会针对此窗口 执行所有的配置文件,遇到匹配的条件则对此窗口执行相应的动作。
安装
Ubuntu 6.06 下安装很简单:
$ sudo apt-get install devilspie
若需要从源代码编译,可以从官方主页下载最新版。
关于版本
Ubuntu 6.06 自带的版本是 0.16,以下教程都以该版本为准。0.12之前的版本使用 XML 配置文件, 而0.13之后的版本使用一种类似于 LISP 的语言―――― S-expression作为配置文件, 其扩展名为 .ds。
最新版本是 0.17(2006/09/22时的情况),如果你想使用最新版,可以自己编译。
入门
假设我们要让 Firefox 在 2 号桌面启动。 我们在自己的主目录下建立 .devilspie 目录,并创建一个名为 firefox.ds 的文件。
$ cd ~
$ mkdir .devilspie
$ gedit .devilspie/firefox.ds
然后输入以下的内容并保存,注意大小写。
(if
(contains (window_name) "Mozilla Firefox")
(set_workspace 2)
)
然后从终端中输入以下命令:
$ devilspie
之后启动 Firefox,你会发现 Firefox 被移动到了2号工作区。
(如果不能正常工作,请参考 FAQ篇。)
我们当然不能每次都手动启动 Devil’s Pie,因此要将其加入到自动启动中。选择 主菜单中的系统->首选项->会话,然后选择启动程序拦,单击添加, 输入启动命令为devilspie,确定。下次登录时系统会自动启动 Devil’s Pie 了。
命令参考
流程控制
if [#if]
条件判断命令,相当于 C语言的 if 语句。
格式
(if a b) - 如果满足条件 a,则执行b。
(if a b c) - 如果满足条件 a,则执行b,否则执行c。
使用例
(if (contains (window_name) "Firefox") (set_workspace 2))
如果窗口名匹配字符串"Firefox",则将该窗口移动到2号工作区。
begin [#begin]
连续执行一连串的动作,相当于C语言的程序块。
格式
(begin a b c ...) - 连续执行 a、b、c……
使用例
(if (contains (window_name) "Firefox") (begin (set_workspace 2) (maximize)))
如果窗口名匹配字符串"Firefox",则将该窗口移动到2号工作区,然后将其最大化。
逻辑运算
and [#and]
当两个条件均为真时返回真;只要有一个条件为假,则返回假。相当于 C 语言的 && 运算符。
格式
(and a b) - 如果条件 a 和 b 均为真,则全体的值为真
or [#or]
当两个条件有一个为真,则返回真,两个均为假时返回假。相当于 C 语言的 || 运算符。
格式
(or a b) - 只要条件 a 和 b 有一个为真,则全体的值为真
not [#not]
返回与给定条件相反的真假值,相当于 C 语言的 ! 运算符。
格式
(not a) - 若 a 为真,则返回假;若 a 为假,则返回真
字符串测试
is [#is]
当给定两个字符串完全相等时返回真,否则返回假。相当于 C 语言的 strcmp 函数。
格式
(is "foo" "foo") - 返回真
(is "foo" "bar") - 返回假
contains [#contains]
给定两个字符串,若前者包含后者(即后者是前者的子字符串),则返回真,否则返回假。
格式
(contains haystack needle) - 若 haystack 包含 needle 则返回真
使用例
(if (contains (window_name) "Firefox") (set_workspace 2))
如果窗口名称包含字符串 "Firefox" 则将窗口移动到2号工作区。
matches [#matches]
给定一个字符串和一个正规表达式,如果字符串匹配正规表达式则返回真,否则返回假。
格式
(matches str pattern) - 若 str 匹配 pattern 则返回真
使用例
(if (matches (window_name) "Firefox$") (set_workspace 2))
当窗口名称的末尾是 "Firefox" 时将其移动到2号工作区。
(matches “foobar” “[o]{2}b”) - 真
(matches “foobar” “[0-9]+”) - 假
窗口变量
窗口变量返回对象窗口的某种属性。
windowname [#windowname]
返回窗口名称,即窗口标题栏上显示的文字。
格式
(window_name)
windowrole [#windowrole]
返回窗口角色名,该属性由窗口内部的 WMWINDOWROLE 变量定义。
格式
(window_role)
applicationname [#applicationname]
返回应用程序名。
格式
(application_name)
动作
指定针对对象窗口进行的操作,大部分为修改窗口属性。
debug [#debug]
输出调试信息,包括配置文件的读取、执行的窗口动作等。相当于命令行选项 -d。
格式
(debug)
print [#print]
输出指定的字符串,一般用作调试。
格式
(print text)
使用例
(print (application_name))
输出对象窗口的应用程序名称。
geometry [#geometry]
设置窗口位置。给定的字符串必须是一个合法的位置指定字符串。该字符串的格式如下:
[=][<width>{xX}<height>][{+-}<xoffset>{+-}<yoffset>]
详细说明可参考 man XParseGeometry 文档。
格式
(geometry geo) - 用字符串 geo 设置窗口位置。
应用例
(geometry "400×300+0-22")
(geometry "640×480")
(geometry "+10+10")
fullscreen [#fullscreen]
设置窗口为全屏显示。
格式
(fullscreen)
focus [#focus]
设置对象窗口为活动窗口。
格式
(focus)
center [#center]
将对象窗口移动到屏幕正中央。
格式
(center)
maximize [#maximize]
将对象窗口最大化。
格式
(maximize)
maximizevertically [#maximizevertically]
将对象窗口在垂直方向上最大化。
格式
(maximize_vertically)
maximizehorizontally [#maximizehorizontally]
将对象窗口在水平方向上最大化。
格式
(maximize_horizontally)
minimize [#minimize]
将对象窗口最小化。
格式
(minimize)
shade [#shade]
格式
(shade)
unshade [#unshade]
格式
(unshade)
close [#close]
关闭对象窗口。
格式
(close)
pin [#pin]
将对象窗口固定在所有的工作区上。
格式
(pin)
unpin [#unpin]
解除对象窗口的 pin 状态。
setworkspace [#setworkspace]
将窗口移动到指定的工作区上。
格式
(set_workspace num)
使用例
(set_workspace 1)
skippager [#skippager]
格式
(skip_pager)
skiptasklist [#skiptasklist]
格式
(skip_tasklist)
above [#above]
使对象窗口总在最前。
格式
(above)
below [#below]
使对象窗口总在最底层。
格式
(below)
undecorate [#undecorate]
删除对象窗口上的所有窗口修饰。
格式
(undecorate)
wintype [#wintype]
设置窗口类型。窗口类型可以是以下字符串:”normal”, “dialog”, “menu”, “toolbar”, “splashscreen”, “utility”, “dock”, “desktop”。
格式
(wintype type)
使用例
(wintype "normal")
FAQ [#faq]
为什么我的脚本不起作用?
很有可能你的 windowname、applicationname 等匹配字符串设置不正确。 首先确定对象窗口的正确的 windowname、applicationname 之后再修改配置文件。
如何确定一个窗口的 windowname、applicationname、window_role?
最简单的方法就是使用 print 动作输出 windowname 等变量。在 .devilspie 目录下建立 windowname.ds、applicationname.ds、windowrole.ds 三个文件,内容分别如下:
window_name.ds
(print (window_name))
application_name.ds
(print (application_name)))
window_role.ds
(print (window_role))
然后从命令行运行 Devil’s Pie,再打开对象窗口,查看终端的输出结果。
为什么我的配置文件中,第二条以后的命令都不能执行?
这是 Devil’s Pie 的一个bug,每一个 .ds 文件只有第一个命令(第一对括号内的内容)才能被执行。 因此,你无法把所有配置都写到一个文件中,而只能为每一条配置建立一个单独的配置文件。
如何在 vim 中使用语法高亮显示?
Devil’s Pie 的配置文件语法与 LISP 相同,因此你可以在 vim 中使用下面的命令来设置语法高亮。
:set syntax=lisp
如何终止正在执行中的 Devil’s Pie?
$ killall devilspie
参考
本文参考了以下网站,在此表示感谢。
相关推荐
Devil’s Pie是一个运行在类UNIX操作系统下,可为X11标准的桌面环境定制窗口规则的工具。 通过它,你可以为不同的程序、不同的窗口定制特定的规则。例如在哪个工作区打开、放在屏幕上哪个位置等等。这可以极大地...
在实际应用中,要使用pie.js和pie.htc,你需要在HTML文档的部分引入pie.js脚本,并设置CSS样式。例如: ```html <!DOCTYPE html> <script src="path/to/pie.js"> 你的内容 ``` 在CSS文件(如styles.css...
float piefloat pie float pie float pie float pie
如果您使用的是基于GNOME Shell的发行版,则可能要尝试我的后续项目 。 您可以阅读一些。 Gnome-Pie是Linux的循环应用程序启动器。 它由几个馅饼组成,每个馅饼都包含多个切片。 用户按下一个按键即可打开所需的...
总之,PIE算法通过并行化处理,提升了大规模数据集的索引构建和查询效率。然而,实际应用中需要面对数据划分不均、通信开销大等问题,开发者需要通过优化策略来改善这些问题,以充分发挥PIE算法的优势。对于那些对此...
PIE-UAV用户使用手册V2.6(20151202),仅供学习和研究,请勿商用
然而,由于上传和分享的限制,你提供的版本已经将这些原始的.mat文件转换为了.jpg图像文件,这使得它们更容易被其他不使用MATLAB的软件或系统处理和分析。 CMU_PIE人脸库的特点在于其多样性和丰富性。它包括了41308...
在本教程中,我们将探讨如何使用Java、Appium和Android模拟器进行自动化测试。这个“Java+appium+Android模拟器自动化demo”旨在教你如何在Android Studio环境下设置一个完整的自动化测试框架,以便对Android应用...
要使用Pie.js,你需要按照以下步骤操作: 1. 首先,在HTML文档的`<head>`部分引入pie.js库的脚本文件,例如:`<script src="path/to/pie.js"></script>` 2. 对于需要应用CSS3效果的元素,添加一个特定的类名,如...
4. `使用方式介绍.png` 提供了图形化的指导,展示了如何将PIE整合到项目中,对于开发者来说是一个非常实用的快速参考。 要使用PIE,开发者通常需要在CSS中添加特定的属性,如`behavior`,然后引用`PIE.htc`文件,...
在Python的可视化库matplotlib中,`pie()`函数是用来绘制饼状图的重要工具。饼状图是一种数据表示方式,常用于展示各个部分占总体的比例。在本篇内容中,我们将深入探讨如何使用`matplotlib.pyplot.pie()`函数来创建...
1. 加载北京城镇化数据,这涉及到使用PIE-Engine Studio平台上的数据集,具体通过PIE-Engine Studio的编程接口加载数据。 2. 加载行政区划数据,这一步骤需要获取北京地区的行政区划数据,以便于后续的数据分析和...
PIE-SAR的使用教程提供了详细的软件使用指南,包括新建、打开、保存、另存地图等多种操作。用户可以按照教程的指令进行操作,以便快速掌握软件的使用。 新建 PIE-SAR的新建功能允许用户创建新的雷达影像数据处理...
作为PIE-Engine产品家族的核心部分,PIE-EngineStudio提供了一个地理空间数据分析和计算平台,它基于云计算技术,支持海量卫星遥感影像和地理要素数据的结合使用。 PIE-EngineStudio平台旨在通过交互式编程验证和...
在使用PIE-Engine Studio进行影像操作时,通常需要对遥感影像数据有一定的了解,包括影像数据的来源、分辨率、波段信息、以及如何使用这些数据进行空间分析等。此外,PIE-Engine Studio还可能涉及到不同类型的遥感...
PIE FACE 数据库用于计算机视觉中的人脸识别,多姿态,多角度,有不同光照
流程化生产模块是软件的一大亮点,它允许用户自定义处理流程,实现批处理自动化,极大地提高了工作效率。用户可以根据具体需求设置一系列处理步骤,然后一键执行,减少了重复工作。 最后,质量评价模块用于评估处理...
PIE-8(PHY Interface Extensions for 8 GT/s PCI Express)是针对PCI Express接口制定的技术规范,其版本号为2.01,具体关注的是支持8 GT/s(Gigatransfers per second,吉比特每秒)速率的PCIe技术。该规范主要由...
《MultiPie人脸数据集在人脸识别技术中的应用与详解》 人脸识别技术是计算机视觉领域的一个重要研究方向,近年来在安全、身份验证、监控等场景中得到了广泛应用。其中,MultiPie人脸数据集作为一项重要的资源,为...
要使用PIE.js,你需要遵循以下步骤: 1. **引入库**:首先在页面中引入PIE.js 文件,通常是在`<head>`标签内添加一个`<script>`标签,链接到下载的PIE.js 文件。 2. **设置CSS**:为需要应用CSS3效果的元素添加...