こんにちはカナダのトロントに住んでいます。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 件のコメント:
コメントを投稿