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 |

2009-01-12

対になるものは先に入力する派

| 19:43 | 対になるものは先に入力する派 - わだばLisperになる を含むブックマーク はてなブックマーク - 対になるものは先に入力する派 - わだばLisperになる

自分は、()や、[]、""等は先に入力する派で、M-(やM-[、M-"等に割り当てて入力しています。(※まだpareditは使うには至っていません)

M-)も愛用しているのですが、文字列の中でM-)すると上手く動いてくれません。

これが結構不満でLispマシンだと上手く動くだけにEmacsでもZmacs風に文字列の中でもM-)が効くようにしたいところです。

ということで原因を探ることにしてみました。

M-)はmove-past-close-and-reindentという関数なのですが、

;;!はポイント
(let ((foo "bar!")))

のようなポイント位置で実行すると上手く動きません。

原因はmove-past-close-and-reindentというよりも、その中で使われているup-listが上の"bar!"のような文字列中では上手く機能しないことが原因でした。

恐らく、""を先行入力する人はそれ程多くないのであまり問題にならないのでしょう。

ということで、up-listにadviceをかけようと思いましたが、様子見ということで、とりあえずmove-past-close-and-reindentにadviceを掛けてみることにしました。

;; EMACS
(progn
  (defadvice move-past-close-and-reindent (before mpcar-before ())
    (cond (;; "foo"のうち foo"の上にいる場合
           (not (thing-at-point 'list))
           (cond ( ;; "foo"のうち 後の"の上にいる場合
                  (= ?\" (following-char))
                  (forward-char 1))
                 (t ;; "foo"のうち fooの上にいる場合
                  (forward-sexp)
                  (forward-char 1))))
          (;; "foo"のうち 前の"の上にいる場合
           (= ?\" (following-char))
           (forward-sexp))
          (t nil)))

  (ad-activate 'move-past-close-and-reindent)
  ;; 解除
  ;(ad-deactivate 'move-past-close-and-reindent)
  )

という風にしたのですが、とりあえずは目的の動作になっています。

もっと良い方法がありましたら是非とも教えて下さい!