header

2013年7月10日水曜日

JavaScriptの文字列内でzencodingを展開するEmacsの関数作りました


こんにちはカナダのトロントに住んでいます。7月は以外と暑いです。結構蒸し蒸ししています。あと急に雨が降ることがあり結構日本の夏と似てると思います。。。
さて本題の件ですが、Backbone.jsの本を読んでいてコード写経をしていたのですがふと文字列内でzencoding展開できたら楽かなーと思い実装してみました。

コード

(eval-when-compile (require 'cl))
(require 'flyspell)

(defun my/zencoding-expand ()
"Execute zencoding if current point is in string and
you can execute from minibuffer if you push C-u before this command"
(interactive)
(lexical-let*
((quote "['\"]")
(statement "")
(correct-condition-p
(lambda ()
(and (flyspell-generic-progmode-verify)
(case (face-at-point)
(font-lock-string-face t)
(font-lock-comment-face nil)
(t nil)))))
(move-start-point
(lambda ()
(if (funcall correct-condition-p)
(while (and (funcall correct-condition-p)
(search-backward-regexp quote))))
(forward-char 1)))
(move-end-point
(lambda ()
(while (flyspell-generic-progmode-verify)
(forward-char 1))
(backward-char 2)))
(set-statement
(lambda ()
(funcall move-start-point)
(set-mark-command nil)
(funcall move-end-point)
(kill-region (region-beginning) (region-end))
(setq statement (car kill-ring))))
(do-zencoding-from-minibuffer
(lambda ()
(setq statement (read-from-minibuffer "zencoding: "))
(insert (zencoding-transform (car (zencoding-expr statement))))))
(flyspell-state (if flyspell-mode t nil)))
(when (and (funcall correct-condition-p)
(case major-mode
(js2-mode t)
(javascript-mode t)
(t nil)))
(if current-prefix-arg
(funcall do-zencoding-from-minibuffer)
(when flyspell-state (turn-off-flyspell))
(funcall move-start-point)
(set-mark-command nil)
(funcall move-end-point)
(funcall set-statement)
(insert (zencoding-transform (car (zencoding-expr statement))))
(when flyspell-state (turn-on-flyspell))))))


yasnippetと同じキーに登録する場合は以下を追加してください。

(defadvice yas-expand-from-trigger-key
(around ad-add-zencoding-expand activate)
(if (flyspell-generic-progmode-verify)
(my/zencoding-expand)
ad-do-it))


動作としては"",''などの文字列内ではzencodingの展開そうでなければ普通のyasnippetの展開となります。あとC-uを押したあとに実行するとminibufferに展開前の文字列を入力&展開
できます。

おわりに

"",''などの文字列の中かを判別するのにflyspell-generic-progmode-verifyを使っていますがよく考えたらface-at-pointで十分判別できそうとか思ったり、、、でもユーザーが色変えてたら意味ないとか、そもそもflyspell-generic-progmode-verifyの実装をみてないのでこれも大丈夫かわからないのですが、一応動いています。。。
まぁここまでやらなくても、

(defun insert-zencoding-from-minibuffer ()
(interactive)
(insert (zencoding-transform
(car (zencoding-expr (read-from-minibuffer "zencoding: "))))))


みたいに書いて(試してません)別のキーバインドに登録してもいいかもしれません。
ではよかったら使ってみてください。
gistに登録してので


git clone https://gist.github.com/5958399.git


でもクローンできます。


0 件のコメント:

コメントを投稿

Popular Posts

Blogger templates

Blogger news