本文向你介紹 Subtle 這個有趣的偽平鋪式窗口管理器。
Author: | 吳吉慶 |
---|---|
email: | jiqingwu@gmail.com |
home: | http://hi.baidu.com/jiqing0925 |
create: | 2011-02-19 |
update: | 2011-02-20 |
目錄
自從發現 Musca 后,大部分時間都在用 Musca ,用它可以方便地構建我的集成工作環境。可惜作者已經很久很久沒有繼續開發了,等我有時間了,要好好研究一下 Musca 的代碼。
在網上亂逛,偶然發現了一個窗口管理器的截圖,它自稱是手動平鋪的窗口管理器,叫subtle。這個東西在我以前寫的 《平鋪式窗口管理器Musca初體驗》 一文中曾提了一下,但當時我也是道聽途說。
這次,嘿嘿,又讓我撞見它,我的手又癢了。於是我搜索到它的 主頁 ,看見它的開發很活躍,於是想體驗一下,看看它會不會比 Musca 更好用。
體驗的結果令我驚訝,subtle雖然也號稱是手動平鋪的管理器,但和 Musca 與 ion 的思想完全不同,可以說是一款很有特色的窗口管理器。果然有點 subtle 的意思。如何有特色,且聽我與諸位看官分解。
既然要體驗,就先裝一個吧。
subtle是C開發的,本身很小巧,不過它選用了ruby做配置和擴展語言。大概作者很喜歡ruby吧。不過,這綁定推廣ruby的行為,讓對 ruby 不感冒的用戶有點為難。而且要安裝體積比較大的ruby1.9以上的版本。
好了,不再多愁善感了,開始行動。在 這裡 上下載一個源碼包,我下載了最新的,解開后,第一步居然不是 make 而是 rake ,好吧,安裝rake和ruby::
sudo apt-get install rake ruby1.9.1
然後rape一下,哦,不對,是rake一下::
rake (in /home/jiqing/subtle-0.9.2573-lambda) rake aborted! no such file to load -- mkmf /home/jiqing/subtle-0.9.2573-lambda/Rakefile:12:in `require' (See full trace by running task with --trace)
google之,原來要ruby1.8-dev,真是得寸進尺::
sudo apt-get install ruby1.8-dev
再rake::
rake (in /home/jiqing/subtle-0.9.2573-lambda) rake aborted! Ruby 1.9.0 or higher required /home/jiqing/subtle-0.9.2573-lambda/Rakefile:176 (See full trace by running task with --trace)
真想rape之了,都裝了ruby1.9.1還叫什麼叫。:
ls -l /usr/bin/ruby
發現居然是到ruby1.8的符號鏈接。rape!
sudo ln -sf /usr/bin/ruby1.9.1 /usr/bin/ruby
然後你就可以順利地rake它了。:
rake sudo rake install
rake出來的執行文件除了subtle,還有:
在你的 .xinitrc 中添加 exec /usr/bin/subtle ,startx就進入了 subtle。如果你使用某種登錄管理器,要把subtle加入可選擇的會話列表中,我不會,嘿嘿,歡迎會的同鞋補充吧。
進入subtle后,先別動,冷靜觀察,上面有個細長狀態欄,其它就是一片廣袤的黑色屏幕。
狀態欄左邊有四個標籤,每一個標籤代表一個view,其實就是工作區(虛擬桌面),你可以通過小鍵盤上的 + 切換到下一個 view,通過小鍵盤上的 - 切換到上一個view。也可以通過Win+n 切換到第n個view。
為了給大家直觀的印象,先放張圖片吧,不過這是我改了配置后的截圖。
W+Enter,W表示windows鍵,會啟動一個終端。:
cp /etc/xdg/subtle/subtle.rb ~/.config/subtle/
這就生成咱自己的subtle.rb配置文件了,用你喜歡的編輯器打開它,它是配置文件,同時也是咱的幫助。
vim ~/.config/subtle/subtle.rb
搜索 == Grabs ,找到 Grabs 一節,這是綁定鍵盤和滑鼠按鍵的部分,如何使用,有詳細的解說。:
grab "W-Return", "urxvt"
這表示按 Win+Enter,會打開一個urxvt的終端,如果你用的不是rxvt,就改成你的終端模擬器的名稱,保存然後Win+Ctrl+r,讓subtle重新載入配置。幸好我用的也是rxvt,不然按了Win+Enter還沒反應。作者也太不考慮廣大用戶的感受了,如果把urxvt換成 x-terminal-emulator ,不就能適用各種終端了嗎。
現在默認的終端窗口是最大化的,跟我來體驗一下:
聰明的你,早就發現了,小鍵盤上9個鍵直觀地對應著9個方位。
接著按 Win+KeyPad_5 ,發現終端窗口變小了,佔據了屏幕中間某個區域;再接著按,發現終端窗口的大小又變了,不過還是在屏幕中間。再按的話,又變成最大化了。不只Win+KeyPad_5,連續Win+其它的小鍵盤數字鍵,也會改變窗口的位置和大小,不過相對位置還是對應於小鍵盤數字鍵所在的方位。
這是怎麼做到的,在subtle.rb的Grabs一節中有這樣的鍵綁定::
grab "W-KP_7", [ :top_left, :top_left66, :top_left33 ] grab "W-KP_8", [ :top, :top66, :top33 ] grab "W-KP_9", [ :top_right, :top_right66, :top_right33 ] grab "W-KP_4", [ :left, :left66, :left33 ] grab "W-KP_5", [ :center, :center66, :center33 ] grab "W-KP_6", [ :right, :right66, :right33 ] grab "W-KP_1", [ :bottom_left, :bottom_left66, :bottom_left33 ] grab "W-KP_2", [ :bottom, :bottom66, :bottom33 ] grab "W-KP_3", [ :bottom_right, :bottom_right66, :bottom_right33 ]
那裡的 :top , :top_left 都是什麼玩意,哈哈,這就要提到subtle里很有特色的一個概念: gravity 。
什麼是gravity,就是窗口的位置和大小。在subtle.rb中搜索 == Gravities ,找到那一節,可以看到詳細的說明。
往下看,就發現了那些 :top 、 :top_left 之類的定義,以 :top 為例,:
gravity :top, [ 0, 0, 100, 50 ] gravity :top66, [ 0, 0, 100, 66 ] gravity :top33, [ 0, 0, 100, 34 ]
後面的四個值都不是像素值,而是比例,以 gravity :top, [ 0, 0, 100, 50 ] 為例,可以這樣理解,窗口在最左邊,最上邊,寬度100%的屏幕,高度占 50%的屏幕。
回頭再看看, grab "W-KP_8", [ :top, :top66, :top33 ] 原來Win+KeyPad_8對應了一個gravity的列表,難怪連續按會改變窗口的大小和位置呢。
現在我們已經有一個終端窗口了,按Win+KeyPad_4,讓它靠左邊呆著。按Win+Return,再打開一個終端窗口,按Win+KeyPad_6,讓它靠右邊呆著。看,嚴絲合縫地平鋪了吧。
你可以按Win+方向鍵遍歷各個平鋪在表面的窗口,如果窗口多了,被蓋住的看不見的窗口你是遍歷不了的,怎麼辦?對上層的窗口按Win+l,讓它降到下一層,被蓋住的窗口就上來了。
居然沒有提供一個遍歷當前工作區所有窗口的快捷鍵,多少有些可惡吧。
對於平鋪的兩個終端窗口,我們聚焦在左邊的終端窗口,再次按 Win+KeyPad4,改變它的大小,它變大了,但右邊的終端沒有改變,這樣右邊終端的一部分區域就被蓋住了。再按 Win+KeyPad4,左邊終端又變小了,屏幕中間空出一部分區域,右邊的終端並沒有變大來填充。
當一個窗口的大小改變時,有其它窗口的大小也會跟著改變,這才是平鋪式窗口管理器的本質吧?而當一個窗口的位置和大小的改變獨立於其它窗口時,它就是浮動式窗口管理器吧?我想這就是平鋪與浮動的本質區別,從這個意義上看,subtle是真的平鋪式窗口管理器嗎?
subtle中也有浮動的概念,你對聚焦的窗口按Win+f,它就有了浮動的屬性,但是有什麼分別嗎?即使被你平鋪的窗口,你按住窗口鍵,用滑鼠左鍵同樣能自由地改變它的位置,用滑鼠右鍵同樣能改變它的大小。
要說subtle的特色,我看就在於它是一個提供了一組快捷鍵,能快速改變窗口布局的浮動式窗口管理器。
除了Grab和Gravity,還有一個Tag值得一提。 Tag的主要作用是控制窗口放在哪個view中。看下面的例子::
tag "terms" do match "xterm|[u]?rxvt" gravity :right end view "dev", "terms"
這表示如果我啟動rxvt,就會匹配到terms這個Tag,而匹配terms這個 Tag的窗口都會放入dev這個view中。也就是說,不管我在哪個view中啟動rxvt,都必定放入dev這個view中,這算什麼。
文檔中還說,每個應用程序的窗口必定關聯到一個view,如果沒有顯式關聯,就會關聯到default view。如果你沒有顯式指定default view,第一個 view就是default view。
也就是說,如果我沒有把gvim匹配到某個tag,也沒有關聯到某個view,我想在第三個view中,啟動gvim,結果gvim會被放入第一個view,我還得去第一個view找它。這算什麼特性?
窗口又不能在view之間移動,只能通過Win+s,讓它具有stick屬性,從而在所有view中可見。這個……,俺非常不喜歡。
Tags這個特性,有些stupid,請作者看見不要生氣,請心平氣和地把這當作用戶的反饋,認真對待吧。
除了Grab、Gravity、views、Tags,還有Hooks屬性,用戶可以通過這個定義subtle中的行為會觸發一些什麼事件。我卻不知道如何在subtle啟動時觸發外部的程序(如conky等)啟動,不知道有沒有這個功能呢?
另外,依賴ruby也不是白依賴的,你可以安裝用ruby寫的sublets,加一些時鐘、cpu利用率之類的插件,不過我沒弄成功。我耳邊不禁響起《色戒》中梁朝偉的聲音:有這麼難嗎?有興趣的朋友有時間玩玩看。
體驗完,我又用回 Musca 啦,小聲告訴你:我現在寫這篇文檔,也不是在用subtle,哈哈。不過,subtle體現了一種新的思想,推薦朋友們嘗試一下,尤其是喜歡ruby的同學。儘管我不喜歡它的風格,沒有堅持用下去,我想應該會有人喜歡的。
(全文完)
[火星人 ] Subtle: 有趣的偽平鋪式窗口管理器已經有460次圍觀