Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-11-09

StumpWM (2)

| 23:46 | StumpWM (2)  - わだばLisperになる を含むブックマーク はてなブックマーク - StumpWM (2)  - わだばLisperになる

StumpWMをインストールしてから一ヶ月位常用してみていますが、もとからWMに高機能を求めていないせいか別段不自由することもなく使えています。

この間に使ってみて分かった細々としたことを書いてみたいと思います。

WMの終了方法

前回WMの終了の方法さえ分からず、Lisp式を評価する方法で、(cl-user::quit)などとしていましたが、プレフィクスキー(EmacsのCtrl-xのようなもので、デフォルトでは、Ctrl-t)+;でコマンド入力のところで、quitを実行するらしいことが分かりました。

StumpWM内部のコマンドを定義する

下準備

定義するコマンドは、~/.stumpwmrcに記述するのが一般的かと思います。下記の例は、全部、~/.stumpwmrcに記述しています。

定義する

define-stumpwm-commandによって定義できます。emacsを実行するコマンドは下記のように定義できます。

(define-stumpwm-command "emacs" ()
  (run-or-raise "emacs-22.0.50" '(:class "Emacs")))

run-or-raiseは、ウィンドウを最前面に持ってくるか、実行されていない場合プロセスを実行します。

他にも色々方法はあるようです。

コマンドにショートカットキーを定義する

define-keyで定義します。下記の例では、通常のプレフィクスキー+C-eでStumpWM内で定義したコマンドemacsを実行するようにしています。

(define-key *root-map* (kbd "C-e") "emacs")

フォント

set-fontで指定可能です。UTF-8環境でフォントのエンコードをiso10646-1にすれば、日本語も化けないで表示されます。

(set-font "-kochi-gothic-medium-r-normal-*-*-110-*-*-p-*-iso10646-1")

便利なところ

最新のStumpWMには、内部のコマンドをシェルから実行できる、stumpishというシェルスクリプトが附属してきます。

これを使用するとウィンドウの切り替えを自動で実行できたりするので、例えば、emacsclient等と組み合わせると便利です。

#!/bin/sh

stumpish emacs #StumpWM内のコマンド
emacsclient $*
stumpish other #直前にフォーカスがあったウィンドウにフォーカス

exit 0

上記は、

  1. stumpish emacsで、Emacsのウィンドウにフォーカスし、
  2. emacsclientを実行し、
  3. 終了したら、元のウィンドウにフォーカスを戻す

という内容です。

同じようにslimeからHyperSpecを呼び出すついでにfirefoxにフォーカスするようなものも便利です。

その他、小物

(define-stumpwm-command "init" ()
  (stumpwm::load-rc-file))

設定を変更して、初期化ファイルを読み込ませるのが面倒なので定義してみています。

困っていること

一番良く使うアプリケーションはfirefoxなのですが、どうやらEmacsや、他のアプリケーションのようにウィンドウに一定の名前が付かないせいか、run-or-raiseだと実行する度に新しいfirefoxのプロセスが実行されてしまいます。

その場しのぎの対策

firefoxのウィンドウには、ffという名前を付けて、プロセスが実行されているならウィンドウの切り替えだけ、プロセスが起動されていないならば、firefoxを起動という風にしてみています。firefoxのウィンドウへの名前づけは、WMが起動するたびに手動で行っているので、若干面倒なものがあります。

run-or-raiseは、WM内のWindowの名前を見て判断しているので、プロセスを見て判断するものを定義して使ってみています。

;; psを実行して、firefox-binの文字列をgrep
(defun get-firefox-ps (&optional (owner "g000001"))
  (let ((ps (with-output-to-string (out)
	      (sb-ext:run-program "/bin/ps" '("-ef")
				  :environment '("LANG=C")
				  :output out)))
	(scn (cl-ppcre:create-scanner (format nil "~A.*firefox-bin" owner))))
    (with-input-from-string (str ps)
      (series:iterate ((line (series:scan-stream str #'read-line)))
		      (when (cl-ppcre:scan scn line)
			(return-from get-firefox-ps line))))))

;; get-firefox-psを実行し、ffというウィンドウに切り換えるか、
;; run-or-raiseでfirefoxを起動。
(defun run-or-raise-firefox ()
  (if (get-firefox-ps)
      (select-window (current-group) "ff")
      (run-or-raise "firefox" '(:class "Firefox" :title "Firefox"))))

;; ffでfirefoxを実行するStumpWMのコマンド定義
(define-stumpwm-command "ff" ()
  (run-or-raise-firefox))

まとめ

まだまだ使い方も分っていないStumpWMですが、Common Lispで拡張できるというのはやはり面白くこれからも掘り下げてみたいと思っています。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20071109