App Engine Python のローカルサーバを起動する関数
こちらに触発されて、自家製コマンドを elisp の関数に置き換える勝手プロジェクト進行中(笑
一日一善ならぬ、一日一関数(爆。手始めとして、App Engine Python のローカルサーバを起動するコマンドを置き換えてみました。
#!/bin/sh set -x -e -u bin=/usr/local/bin/dev_appserver.py [ -f `pwd`/app.yaml -a -x ${bin} ] && \ ${bin} --datastore_path=`pwd`/dev_appserver.datastore `pwd` exit 0
必須要件は下記 3点ほど。
- dev_appserver.py の有無、かつ起動したいアプリディレクトリ内の app.yaml の有無の確認。
- /tmp が tmpfs のため、datastore のパスをオプション(--datastore_path)で渡すこと
- カレントを移動せずに済むよう
はフルパスで渡すこと
で、完成したのが下記の通り。
(defun dev-appserver-pwd () (interactive) (let ( (target (file-name-directory (buffer-file-name (get-buffer (buffer-name))))) (dev-appserver (executable-find "dev_appserver.py")) ) (if (and dev-appserver (file-exists-p (format "%sapp.yaml" target))) (progn (setq buf-name (format "** dev_appserver Output: %s **" target)) (get-buffer-create buf-name) (start-process "dev-appserver-pwd" buf-name dev-appserver (format "--datastore_path=%sdev_appserver.datastore" target) target) ))))
sh の方が端的。elisp の方が冗長か。しかし、emacs からターミナルに移動する必要がなくなったので、良しとしましょう。
追記
- 機能分離できそうな関数を選別したこと
- エラー処理
- ファイルを編集中ではないバッファ(*scratch* など)で実行してしまった
- あるいは app.yaml の無いディレクトリのファイルで実行してしまった
(defun get-directory-name-from-buffer-name () (let ((target (buffer-file-name (get-buffer (buffer-name))))) (if target (file-name-directory traget)))) (defun dev-appserver-pwd () (interactive) (let ( (target (get-directory-name-from-buffer-name)) (dev-appserver (executable-find "dev_appserver.py")) ) (if target (if (and dev-appserver (file-exists-p (format "%sapp.yaml" target))) (progn (setq buf-name (format "** dev_appserver Output: %s **" target)) (get-buffer-create buf-name) (start-process "dev-appserver-pwd" buf-name dev-appserver (format "--datastore_path=%sdev_appserver.datastore" target) target)) (message "dev_appserver.py or app.yaml is not exist!")) (message "Current Buffer is not file for google appeengine.") )))