Hatena::ブログ(Diary)

make for h @ppy_things;

2010-10-12(Tue)

Emacsからrakeを呼び出してみた

最近「プログラミングしてないなぁ……」とか思っちゃったので, 試しにTwitterのUser Streamsを使ったプログラムを書こうとしたのですが, ErlangからUser Streamsが使えなかったので*1別のプログラムに逃避した次第です, こんにちは. id:siritoriごめん.

で, 何作ろうかと考えてたら, 「そういえばEmacsからrake呼び出したいなぁ. あるのかなぁ. ありそうだよねぇ」とふと思い立った. 調べると, testタスクを実行するのはあっても, その他タスクを実行するのがなかったので, ちょっとだけ作ってみた.

(defvar rake:output-buffer "*rake output*")

(defun rake:invoke ()
  (interactive)
  (let ((task-suggestions (rake:task-suggestions)))
    (if task-suggestions
      (rake:run (completing-read "rake " task-suggestions))
      (message "Not found target"))))

(defmacro rake:deftask (task)
  (list 'defun (prog1 (intern (concat "rake:run-" task))) '()
        '(interactive)
        (list 'rake:run task)))

(defmacro rake:task (task)
  (list 'lambda '()
        '(interactive)
        (list 'rake:run task)))

(defun rake:task-suggestions ()
  (reverse (reduce #'(lambda (suggestions line)
                       (if (string-match "rake \\([^ ]+\\)" line)
                           (cons (match-string 1 line) suggestions)
                         suggestions))
                   (split-string (shell-command-to-string "rake -T") "[\r\n]+")
                   :initial-value nil)))

(defun rake:run (task)
  (call-process-shell-command (format "rake %s" task) nil rake:output-buffer))

使い方は.emacsとかに:

(require 'rake)

(global-set-key "\C-cr" 'rake:invoke)

(global-set-key "\C-cRd" (rake:task "default")) ;; C-c R dでdefaultタスクを実行する

(rake:deftask "test") ;; testタスクを実行する関数rake:run-testを定義し,
(global-set-key "\C-cRt" 'rake:run-test) ;; C-c R tでrake:run-testを呼び出す

な感じで. 一応タスク名を補完するようにしてあるけども, それをちょっとがんばったくらいで他がガタガタ. 後々ちゃんとさせる.

Lispは不慣れなので, 「この書き方よりもこっちの方がいいよ」とかあったら突っ込んでいただけると嬉しいです.

自分用メモ

あとなんかあるかなぁ……

*1:「使えたよ」という方がいたら教えていただけると嬉しいです

2009-04-13(Mon)

actionscript-modeのロード時にエラー

久しぶりにActionScriptでなんか書こうと思ったら, Emacsで*.asファイルを開いても, シンタックスハイライトされない! *Messages*を読むと:

Loading /Users/takkkun/elisp/actionscript-mode.el (source)...
File mode specification error: (void-function c-identifier-re)

エラーだ. actionscript-modeを使いたいのに, actionscript-mode.elでどうにかなっているっぽい. c-identifier-reという関数がマズいのかな?

以前まで使えていたのになぁ. ちなみにバージョンは:

というコトで調べてみるっす.

追記(同日 12:49): 解決!

原因はごくごく単純. actionscript-modeが必要とするcc-modeを, 別の*.elが既に読込んでしまっていたのが原因でした. ちなみに問題であろうコードは下記のやつ.

(when (load "js2" t)
  (setq c-basic-offset 2
        js2-basic-offset 2
        js2-mirror-mode nil
        js2-electric-keys nil
        js2-strict-missing-semi-warning nil
        js2-strict-inconsistent-return-warning nil))

js2-modeの挙動を変えるために書いたコードが…… たしかに前回actionscript-modeで書いた後にこのコードを書いたと思う. でもこの時点でcc-modeを読込んじゃうってどうなんだろう?

2008-08-31(Sun)

タブキーを押したときにソフトタブに置き換える

.emacsファイルに以下のように書けばいいみたい. tab-width nのnにはお好みのタブ幅を.

(setq-default tab-width 4 indent-tabs-mode nil)

ただしコレだとタブ(\t)を入力するコトができなくなっちゃう. まぁどうしてもタブを入力したい! っていうケースもそうそうないからいいかなぁ.