タイル型ウィンドウマネージャawesomeとその便利な機能とか設定10選


10月になってもPCが熱暴走するような南国暮らしも長くなったなーと実感する今日この頃、いかがお過ごしでしょうか。 こんばんわ、myuhe a.k.a 暑いのが大の苦手な南国人 です。

さて、いきなりですが、これまでWMはubuntu標準のGNOMEを使っていました。あまりこだわりもなかったですし、compizとかと併用すればそこそこ便利にも使えるので、そのまま使っていたのです。
んですが、EmacsとKeySnailの引きこもりライフも長くなり、だんだんとWMに不満が出てきました。何といってもマウス操作を頻繁に強要されます。compizもキー
バインドをある程度あてられますが、どうしてもキーバインドがあてられなくてイラっとすることもしばしばでした。
良い方法はないかなーと探していて、見つけたのがawesomeでした。

awesomeとは

awesomeとは、タイル型WMの一つです。awesomeとかタイル型WMについては以下が詳しいです。
日本タイル型ウィンドウマネージャ推進委員会 Wiki – SourceForge.JP
awesome – 日本タイル型ウィンドウマネージャ推進委員会 Wiki – SourceForge.JP

つまり、しょっちゅうマウス操作をしなくてもよくなりそうな感じです。素晴らしいです。というわけで、早速インストールしてみます。

その前に、ubuntuリポジトリのawesomeはバージョンが少し古いので、PPAから新しめのものをいただきます。

sudo add-apt-repository ppa:klaus-vormweg/ppa

それでは、早速apt-get

sudo apt-get install awesome awesome-extra

これで、使えます。簡単です。

カスタマイズ事始

デフォルトの状態でも、いろいろと便利機能が使えるようになっているのですが、少し物足りません。というわけで手を加えていきたいと思います。
awesomeの設定は、luaで記述していきます。luaです。全く書けません。まあ、書けなくてもどうにかなりそうですので、まずは、luaを快適に書けるようlua-modeを導入します。以下のサイトからlua-mode.elを落してきます。
Lua-mode
そして、.emacsなりに以下のように書いておきます。

(setq auto-mode-alist (cons '("\.lua$" . lua-mode) auto-mode-alist))
(autoload 'lua-mode "lua-mode" "Lua editing mode." t)

これで、Emacsで快適に編集できるはずです。
次にカスタマイズのベースとなる設定ファイルを持ってきます。/etc/xdg/awesome/rc.luaを~/.config/awesomeにコピーしておきます。このコピーしたrc.luaを編集していきます。
これから、個人的に便利だなーと思った機能とか、設定を紹介します。
当方、luaを全く知らないのでほとんどコピペです。おかしいところあるかもしれないので、先に謝っておきます。ごめんなさい。

expose風にタグを選択

macのexepose、便利ですよね。とうちのおじいちゃんが言ってました。
awesomeでもexpose風に選択することができます。まず、以下のサイトからrevelation.luaを落としてきます。
revelation.lua at master from bioe007’s awesome-configs – GitHub
次にrc.luaの始めの方に以下のように書いておきます。

require("revelation") 

そして、globalkeysに以下のような設定を書いておくと、prefixキーとsキーの同時押しでexposeもどきが起動します。

awful.key({ modkey }, "s",  revelation.revelation),

シェルのプロンプトをポップアップする。

タイル型WMはシェルから操作することが多くなりがちです。いつ、どんな時にでもシェルをさくっと使える状態となっていると、すごく快適です。
以下のコードをglobalkeysの中に書いておくと下からニョキっとプロンプトがでてきます。タブで補完もできるというおまけつきです。

require("obvious.popup_run_prompt")
awful.key({ modkey }, "r", obvious.popup_run_prompt.run_prompt), 

Run or Raise

起動に時間がかかるEmacsやFirefoxはいったん起動したらそれを落とさずいろいろな形で使いまわします。以下の設定は任意のアプリケーションが起動しいたなかったら起動して、起動していた場合はそれにフォーカスするというものです。同じタイル型WMのstumpWMやXmonadにも同様の機能があるみたいですね。

--- Spawns cmd if no client can be found matching properties
-- If such a client can be found, pop to first tag where it is visible, and give it focus
-- @param cmd the command to execute
-- @param properties a table of properties to match against clients. Possible entries: any properties of the client object
function run_or_raise(cmd, properties)
   local clients = client.get()
   local focused = awful.client.next(0)
   local findex = 0
   local matched_clients = {}
   local n = 0
   for i, c in pairs(clients) do
      --make an array of matched clients
      if match(properties, c) then
         n = n + 1
         matched_clients[n] = c
         if c == focused then
            findex = n
         end
      end
   end
   if n > 0 then
      local c = matched_clients[1]
      -- if the focused window matched switch focus to next in list
      if 0 < findex and findex < n then
         c = matched_clients[findex+1]
      end
      local ctags = c:tags()
      if table.getn(ctags) == 0 then
         -- ctags is empty, show client on current tag
         local curtag = awful.tag.selected()
         awful.client.movetotag(curtag, c)
      else
         -- Otherwise, pop to first tag client is visible on
         awful.tag.viewonly(ctags[1])
      end
      -- And then focus the client
      client.focus = c
      c:raise()
      return
   end
   awful.util.spawn(cmd)
end

-- Returns true if all pairs in table1 are present in table2
function match (table1, table2)
   for k, v in pairs(table1) do
      if table2[k] ~= v and not table2[k]:find(v) then
         return false
      end
   end
   return true
end

キーバインドの割り当てにはglobalkeysに以下のように書いておきます。

awful.key({ modkey }, "e", function () run_or_raise("emacs",{ class = "Emacs" }) end),

Emacs開く時にできる微妙な隙間をなくしたい

デフォルトで使っているとアプリケーションによっては周りに変な隙間ができたりすることがあります。Emacsもそうだったのですが、すごく気になります。そんな時は、awful.rules.rulesの中のpropertiesでsize_hints_honorをfalseにしておくとウィンドウがぴったりきます。

{ rule = { class = "Emacs" },
      properties = { tag = tags[1][1], size_hints_honor = false } },

dmenuのプロンプトをつくる

dmenuというのは、軽量なコマンドランチャ。タイル型WMと相性がすこぶる良いです。以下の設定は、dmenuをパネル上で起動する設定です。globalkeysの中に追加します。

awful.key({ modkey },            ";",
              function ()
                 awful.util.spawn("dmenu_run -i -p 'Run command:' -nb '" .. 
                                  beautiful.bg_normal .. "' -nf '" .. beautiful.fg_normal .. 
                                  "' -sb '" .. beautiful.bg_focus .. 
                                  "' -sf '" .. beautiful.fg_focus .. "'") 
              end)

CPUとメモリの状態をパネルに表示

見た目も手をいれます。以下の設定はパネルにCPUとメモリの状態をリアルタイムに表示するものです。

require("vicious")
-- Directory containing icons for the wibox
icon_path = os.getenv('HOME') .. '/.config/awesome/icons/'

-- CPU usage
cpuicon = widget({ type = "imagebox" })
cpuicon.image = image(icon_path .. 'cpu.png')
cpugraph = awful.widget.graph()
cpugraph:set_width(30)
cpugraph:set_height(16)
cpugraph:set_border_color(beautiful.border_widget)
cpugraph:set_background_color(beautiful.bg_widget)
cpugraph:set_color(beautiful.fg_widget)
vicious.register(cpugraph, vicious.widgets.cpu, '$1')

-- Memory usage
memoryicon = widget({ type = 'imagebox' })
memoryicon.image = image(icon_path .. 'mem.png')
memory = awful.widget.progressbar()
memory:set_width(8)
memory:set_height(16)
memory:set_vertical(true)
memory:set_border_color(beautiful.border_widget)
memory:set_background_color(beautiful.bg_widget)
memory:set_color(beautiful.fg_widget)
vicious.register(memory, vicious.widgets.mem, '$1', 9)

メニューからシャットダウン

awesomeはコマンドを使わないとシャットダウンできません。できれば、マウスでポチッとしたらシャットダウンできるようにしたいです。最初の方で言ってた事と言い分が違ってる気がしますが、気にしません。awful.menuの中に以下のように設定します。

mymainmenu = awful.menu({ items = 
                          {
                          { "awesome", myawesomemenu, beautiful.awesome_icon },
                          { "Ubuntu", debian.menu.Debian_menu.Debian },
                          { "open terminal", terminal }, 
                          { "Shutdown", function () awful.util.spawn_with_shell("gksu 'shutdown -h now'") end}
                       }
                    })

パネルにランチャーアイコンを置く

アプリを起動するのにいちいちコマンドを打ちたくありません。もう何が何だかわかりませんが、そんな気分なのです。というわけでパネルにアイコンを設置して、アイコンクリックで起動できるようにします。以下の設定を書いてemacslauncherをmywibox[s].widgetsの中に追加しておきます。

emacslauncher = awful.widget.launcher({ image = image( "/usr/share/icons/hicolor/24x24/apps/emacs23.png"),
                                     command = "emacs23"})

ターミナルをポップアップ

いついかなる時にでも、ターミナルは起動できるようにしておきたいです。このような望みをかなえるものとしてEmacsではshell-pop.el、アプリケーションとしてはtildaとかguakeなどがありますが同様の機能をawesomeで実現するものです。以下のサイトからscratchディレクトリ以下のファイルをローカルの~/.config/awesomeの中に保存します。そして、globalkeysに以下のコードを追加します。
awesome-configs – configuration files for awesome window manager

require("scratch")
awful.key({ modkey, "Control" }, "z",      function (c) scratch.pad.set(c, 0.60, 0.60, true)  end)

任意のウィンドウをワンキーで開いたり閉じたりしたい

先ほどの設定は、ターミナルをポップアップさせる設定だったのですが、ターミナル以外でもポップアップさせたい時もあります。そんな時のための設定です。まず以下のようにrc.luaに書いておきます。

require("scratch")

globalkeyに次のコードを追加します。

awful.key({ modkey, "Shift"}, "z", function () scratch.pad.toggle() end),

そして、clientkeysに次のコードを追加します。

awful.key({ modkey, "Control" }, "z",      function (c) scratch.pad.set(c, 0.60, 0.60, true)  end),

以上の設定をしてから、ポップアップしたいウィンドウを選択してから、prefixキー + Ctrl + z でそのウィンドウがフロートウィンドウとなるはずです。
この状態で prefixキー + Shift + z を押すと表示がトグルされます。

タイル型WMジャンキー

まだ、awesomeを使いはじめて日が浅いですが、ほとんどGNOMEを起動しなくなりました。他にもタイル型WMには様々なものがあります。WMをいろいろと変えられるというのもLinuxの良いところ。また他のWMも折を見て試してみたいと思います。
最後になりましたが、私のrc.luaを晒しておきます。他のファイルにも依存しているのでこのままでは動きませんが、参考になれば幸いです。
gist: 626278 – GitHub