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 |

2010-05-17

StumpWMの日々 (5) 〜オフライン時のスタートアップ〜

| 13:44 | StumpWMの日々 (5) 〜オフライン時のスタートアップ〜 - わだばLisperになる を含むブックマーク はてなブックマーク - StumpWMの日々 (5) 〜オフライン時のスタートアップ〜 - わだばLisperになる

最近自分はオフラインでPCを使うことが多いのですが、オフラインの時には、スタートアップ時にネット接続がが必須なアプリが起動してくるのがちょっと嫌でした。

stumpwm/contrib/net.lispにはデフォルトの接続デバイスを判定する関数があるのですが、これが、"lo"(ローカルループバック)を検出している時には、ネットに接続していないと言えるので、これを利用してみることにしました。

(LOAD "../stumpwm/contrib/net")

(WHEN (STRING/= "lo" (STUMPWM.CONTRIB.NET::NET-DEVICE))
  (SKYPE)
  (CHROME)
  (FIREFOX)
  (THUNDERBIRD) )

最近は常時ネットに接続している人がほとんどだと思うのであまり役に立たなそうですが、自分的にはかなり快適になりました :)

2010-05-08

StumpWMの日々 (4)

| 15:53 | StumpWMの日々 (4) - わだばLisperになる を含むブックマーク はてなブックマーク - StumpWMの日々 (4) - わだばLisperになる

StumpWMではGNU Screenや、Emacsのようにキー操作で画面を切り替えたりします。

EmacsのC-xのようにプレフィックスキーと他のキーを組み合わせる操作が殆どなのですが、これだと2ストロークになってしまいボリュームの操作などには面倒です。

ちょっと調べたら、*top-map*というキーマップに登録すれば対象のキー一つでコマンドが実行できる様子。

ということで設定

(PROGN
  ;; amixer
  (LOAD "stumpwm/contrib/amixer")
  (DEFINE-KEY *TOP-MAP* (KBD "XF86AudioRaiseVolume") "amixer-master-1+")
  (DEFINE-KEY *TOP-MAP* (KBD "XF86AudioLowerVolume") "amixer-master-1-")
  (DEFINE-KEY *TOP-MAP* (KBD "XF86AudioMute") "amixer-master-toggle")
  )

こんな感じでボリューム操作ができるようになりました。

2010-05-07

StumpWMの日々 (3)

| 20:27 | StumpWMの日々 (3) - わだばLisperになる を含むブックマーク はてなブックマーク - StumpWMの日々 (3) - わだばLisperになる

KMRCLとCiNiiのことばかりなので、久々にStumpWMのことでも書いてみようかなと思います

StumpWMを使い出してからなんだかんだで3年位になろうとしていますが、いまいちどうやったら良いのか良く分からないことが結構あります。

例えば、

  1. ウィンドウのグループ/配置を記憶しておいて、ウィンドウマネージャー起動時にお気に入りの配置に復帰させる

方法が分かりません。

ものぐさなのでこの3年間ずっと放置していましたが、ちょっと挑戦してみることにしました。

ウィンドウの配置は、 dump-desktop でファイルに書き出すことができます。

デフォルトでは、どうやら、~/.stumpwm.dディレクトリに書き出される様子。

初期化ファイルで、restore-from-fileを使い、ダンプしたものを読み込めばグループの構成自体は復帰できるようです。

また、GSELECTという関数でグループを変更できるので、グループを変更→アプリを起動→次のグループへ を繰り返せば、目的は達成できるのではないかと考え、

(RESTORE-FROM-FILE "~/.stumpwm.d/g000001")

(PROGN
  ;; emacs用のグループ選択
  (GSELECT (FIND-GROUP (CURRENT-SCREEN) "emacs"))
  (EMACS)
  (GSELECT (FIND-GROUP (CURRENT-SCREEN) "skype"))
  (SKYPE)
  (GSELECT (FIND-GROUP (CURRENT-SCREEN) "web"))
  (CHROME)
  (FIREFOX)
  (GSELECT (FIND-GROUP (CURRENT-SCREEN) "shell"))
  (SCREEN)
  )

のように書いてみました。

結果から書くとこの書き方では駄目で、アプリの起動とグループの切り替えはバラバラに動いてしまい最後に選択したグループに全部のアプリが寄ってきてしまいます。

うーん、みなさんどうやってるんでしょう。

2009-08-02

StumpWMの日々 (2)

| 03:21 | StumpWMの日々 (2) - わだばLisperになる を含むブックマーク はてなブックマーク - StumpWMの日々 (2) - わだばLisperになる

前回の設定からあまり変化なしなのですが、適当にウェブアプリ用のユーティリティをつくったりしてみています。

といっても単にURLを含んだdefine-stumpwm-commandを書くのが面倒だったのでマクロに纏めただけです。

ウェブアプリをコマンドで呼び出す

(defmacro define-webapp-command (name args url)
  `(define-stumpwm-command ,name (,@args)
     (run-shell-command ,(format nil "/usr/bin/firefox \"~A\"" url))))

(progn ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
  ;; 
  ;; web apps
  ;; 
  (define-webapp-command "ff" () 
    "http://friendfeed.com/")
  (define-webapp-command "chaton-cl" () 
    "http://practical-scheme.net/chaton/common-lisp-jp/")
  (define-webapp-command "chaton-gauche" ()
    "http://practical-scheme.net/chaton/gauche/")
  (define-webapp-command "twitter" ()
    "http://twitter.com/home")
  (define-webapp-command "gmail" ()
    "http://mail.google.com/mail")
  (define-webapp-command "ldr" ()
    "http://reader.livedoor.com/reader/"))

この場合、名前が文字列だったりするので、マクロにする必要はないのですが、なんとなくdefine-〜の習慣でマクロにしています。

firefoxとの連携

自分は、Firefoxのフォームの入力に任意のエディタを呼び出す、It's All Textというアドオンを利用しているのですが、

emacsが呼び出されて、入力が終った後は、再びFirefoxにフォーカスが戻ってきて欲しいので、

#!/bin/sh

stumpish emacs #emacsにフォーカス
emacsclient $*
stumpish firefox #firefoxにフォーカスを戻す

exit 0

のようなものを定義して利用していますが地味に便利です。(ちなみに、2年前くらいのエントリーに書いた内容と同じです)

stumpishというのは、stumpwmのコマンドをシェルから実行できるコマンドなのですが、これで外部と連携することができます。

2009-07-25

StumpWMの日々 (1)

| 14:46 | StumpWMの日々 (1) - わだばLisperになる を含むブックマーク はてなブックマーク - StumpWMの日々 (1) - わだばLisperになる

StumpWMとは

StumpWMとはCommon Lispで書かれたタイル型のウィンドウマネージャーです。

いつの間にやらUbuntuやDebianでは、パッケージでstumpwmというのが提供されるようになっていて、コマンド一発で導入できるようになっています。素晴らしい!

StumpWMをカスタマイズしたい

さて、StumpWMを使い初めて約2年になろうとしているのですが、最初の頃にちょっとカスタマイズした位で面倒になり、ずっとその頃の設定のまま使っていました。

しかし、普段からどうも使い難いなあというところが溜って来たので色々カスタマイズして遊んでみることにしてみました。

StumpWMを自分用にカスタマイズする

StumpWMでは、~/.stumpwmrcに設定記述することによって起動時に設定が読み込まれます。

  • 分割した画面の移動

デフォルトでは、(C-t 矢印キー)なのですが、手が矢印キーに移動するのは面倒なのでvi風にhjklに割付けてみました。

(define-key *root-map* (kbd "j") "move-focus down")
(define-key *root-map* (kbd "k") "move-focus up")
(define-key *root-map* (kbd "l") "move-focus right")
(define-key *root-map* (kbd "h") "move-focus left")

移動が面倒なためかウィンドウの分割機能も利用していなかったようなのですが、移動がスムースになったので以前より分割しては移動したり、ウィンドウを消したりするようになりました。どこがどう生活に影響してくるか分からないものです。

  • インプットウィンドウのキーバインド

デフォルトでは、コマンド入力の保管に(TAB)確定に(Return)という割付けなのですが、(TAB)も(Return)もあまり利用したくないので、(C-i)と(C-m)にもそれぞれ割り付けてみました。

また、文字単位での前方への削除も(C-h)でできるようにしました。(Backspace)もあまり使わない自分にはこれが便利です。

ついでに単語単位での前方削除も追加し、なんとなくインプットウィンドウも中央に出してみています。

これらのキーバインドは、*input-map*に格納されているようなので、これをいじればカスタマイズ可能です。

;; input windowを中央に出す。
(setq *input-window-gravity* :center)

(define-key *input-map* (kbd "C-i") 'input-complete-forward)
(define-key *input-map* (kbd "C-m") 'input-submit)
(define-key *input-map* (kbd "C-h") 'input-delete-backward-char)
(define-key *input-map* (kbd "M-C-h") 'input-backward-kill-word)
  • コマンド定義

コマンド定義はdefine-stumpwm-commandで以前から普通に行なっていますが、最近ではウェブアプリが多くなっているのでfirefoxを呼び出したりすることが多いかもしれません。

上記でコマンド入力が楽になったのでキーバインドに直接割り付けなくてもインプットウィンドウでの呼び出しが楽にできるようになり、沢山コマンドを作成して登録するようになりました。

(progn
  ;; LDR
  (define-stumpwm-command "ldr" ()
    (run-shell-command "/usr/bin/firefox \"http://reader.livedoor.com/reader/\"")))
  ;; gmail
...

という感じ。

まとめ

ちょっと工夫してみただけで随分使いやすくなりました。

これからも、ちょこちょこカスタマイズのエントリーを書いて行きたいと思っています。

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で拡張できるというのはやはり面白くこれからも掘り下げてみたいと思っています。

2007-10-15

StumpWM

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

del.icio.usのLispタグからStumpWMの紹介のムービーが流れてきたのでチェック。

The StumpWM Experience : male : Free Download, Borrow, and Streaming : Internet Archive

StumpWMはCommon Lispで書かれたウィンドウマネージャーということで、前から興味はあったのですが、この動画を観ると思いのほか使えそうなので、インストールしてみることにしました。

最初、asdf-install可能だったので、cmuclで試してみましたが、どうやら、登録されているのは古めで、試すなら、最新の方が良さそうだったので、READMEを参照しつつ再度sbclで試してみることにしました。

以下、Ubuntu 7.04 + SBCL 1.0.10 + Git版StumpWMで試しています。

StumpWMのソースの取得

$ git clone git://git.savannah.nongnu.org/stumpwm.git

で取得します。

ASDFで導入できるようにする。

ダウンロードしたものの中にstumpwm.asdがあるので、asdf::*central-registry*に登録されているパスにリンクを張ります。

専用イメージの作成

別にイメージを作成しなくても良いとは思うのですが、起動が少し速いのでイメージを作成してみることにします。cl-ppcreとclxに依存しているので、それも読み込みます。

;; make-stumpwm-core.lisp
;;
;; cd $coredir 
;; sbcl --load make-stumpwm-core.lisp

(require :asdf)
(asdf:oos 'asdf:load-op :clx)
(asdf:oos 'asdf:load-op :cl-ppcre)
(asdf:oos 'asdf:load-op :stumpwm)
(save-lisp-and-die "stumpwm-sbcl.core" :purify t)

のようなファイルを作成し、

$ sbcl --load make-stumpwm-core.lisp

を実行して、イメージを作成しました。

ウィンドウマネージャーの起動

色々方法はあると思うのですが、自分は、最初に古いstumpwmを試してしまったということもありスクリプトを色々作って対応しました。

最新だと色々準備されている様子なので、そっちを使った方が良いとは思います。

#!/bin/sh

sbcl --core ~/cl/stumpwm-sbcl.core --load ~/cl/stumpwm-sbcl.lisp
;; STUMPWM - stumpwm-sbcl.lisp
;; ================================================================
(stumpwm:stumpwm)
(cl-user::quit)

のような、stumpwmというシェルスクリプトと起動で読み込ませるファイルを作成し、

~/.xsessionに

#!/bin/sh

#~色々環境設定記述~

$HOME/bin/stumpwm

のように記述し起動させることにしました。

カスタマイズ

環境設定は、.stumpwmrcで設定します。サンプルが付いているので、それを参照しつつ設定という感じです。

使ってみる

使ってみた感じとしては、GNU Screenのウィンドウマネージャー版みたいな感じです。

初期設定では、Control-tがプレフィックスキーになっていて、そのあとにコマンドを入力します。

C-t :で式を評価できたりします。

詳細なドキュメントはないので、サンプルの初期化ファイルと、ソースを読んで、使い方を探るという感じです。

ウィンドウマネージャーの終了方法

とりあえず、どうやって終了するのか分からないので、式評価のプロンプトに(cl-user::quit)として終了させています。

まとめ

とりあえず、Common Lispで色々できるというところと、ムービーでは結構便利そうに使っていたので、しばらく常用してみたいと思います。