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 |

2011-01-13

Climacsでのrun-or-raise

| 19:38 | Climacsでのrun-or-raise - わだばLisperになる を含むブックマーク はてなブックマーク - Climacsでのrun-or-raise - わだばLisperになる

前回重要なことを書くのを忘れていたので追記的エントリーなのですが、Climacsのように処理系内部から別スレッドで立ち上げる場合、StumpWMのrun-or-raiseをどういう風に処理するかが問題になります。

raiseの方は既に立ち上がっているものにフォーカスすれば良いだけなのでそのままでOKなのですが、runの方は起動していない場合は通常実行可能ファイルを実行するのでここを少し書き換える必要があります。

ということで、run-or-raiseを改造してfun-run-or-raiseというのをでっち上げて使ってみています。

(in-package :stumpwm)

(defun fun-run-or-raise (fun props &optional (all-groups *run-or-raise-all-groups*) (all-screens *run-or-raise-all-screens*))
  (labels
      ;; Raise the window win and select its frame.  For now, it
      ;; does not select the screen.
      ((goto-win (win)
         (let* ((group (window-group win))
                (frame (window-frame win))
                (old-frame (tile-group-current-frame group)))
           (frame-raise-window group frame win)
           (focus-all win)
           (unless (eq frame old-frame)
             (show-frame-indicator group)))))
    (let* ((matches (find-matching-windows props all-groups all-screens))
           ;; other-matches is list of matches "after" the current
           ;; win, if current win matches. getting 2nd element means
           ;; skipping over the current win, to cycle through matches
           (other-matches (member (current-window) matches))
           (win (if (> (length other-matches) 1)
                    (second other-matches)
                    (first matches))))
      (if win
          (goto-win win)
          #+sbcl (sb-thread:make-thread fun
                                        :name (format nil "~A" fun))))))

(defcommand climacs () ()
   ""
   (fun-run-or-raise (lambda ()
                       (climacs:climacs :new-process "climacs"))
                     '(:class "Climacs")))

これで起動していない場合は、処理系内から別スレッドで起動できるようになりました。

2011-01-12

climacs-client

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

今年は、EmacsからClimacsというCommon Lisp+CLIM(Common Lisp Interface Manager)で実装されたEmacs系エディタに乗り換えようとあがいているのですが、なかなか機能が充実しているGNU Emacsの環境から移行するのは難しいです。

しかし、CLでなんでも書けるのは楽しいところ。このブログもClimacsからDrakma経由で投稿してみたりしています。

プログラミング用のエディタとしては、エディタの足りない機能を実装していたら本来作りたかったもののプログラミングに辿り着かないですが、それもまた楽しいです。

随時、設定などもこのブログに書いて行きたいと思っていますが、今回は、シェルからClimacsを呼ぶ方法を考えてみました。

Climacsは、シェルから通常のエディタのように起動させるには一捻り必要なようです。

イメージを実行可能なものとしてダンプしたり何通りかあると思いますが、今回は、StumpWMとClimacsを同一のイメージから起動させて、StumpWMのstumpishから起動する方法を書いてみます。

結構適当ですが、下のスクリプトのような感じになりました。with-climacsは@quekさんの作でClimacs外からclimacsの関数を呼び出す時に便利なマクロです。

climacs-client

#!/bin/sh

FILE=$1

stumpish eval "(progn (esa-io::with-climacs (esa-io:com-find-file \"$FILE\"))(stumpwm::climacs))"

stumpishはevalでCLの式を評価できるので文字列として実行したい式を渡します。

式の内容ですが、

  1. esa-io::com-find-fileでファイルを開き
  2. stumpwm::climacsで画面をClimacsに遷移させる

という感じになっています。Climacsへの画面遷移は、StumpWMお馴染みのrun-or-raisです。

これをclimacs-clientのような名前にしてスクリプトにすれば、

$ climacs-client /tmp/foo.lisp

のように開けます。