2011年5月5日木曜日

【XYZZYTips】タブキー押下時に囲み文字を抜ける

Eclipseだと文字列を書いたりしている場合に、タブキーを押すと文字列(「"」で囲まれた範囲)から抜けることができるのですが、それと似たようなことをXYZZYでもできないだろうかということで、タブキーを押したときに隣にある文字列が囲み文字列(「"」、「'」、「>」)などのときは、カーソルを一つさきにすすめるというマクロを作ってみました。
;;囲み文字の手前で\TABを押下すると一文字先に移動する
(setq *backword-char-item-list* '((#\) "()") (#\] "[]") (#\} "{}") (#\' "\'\'") (#\" "\"\"") (#\> "<>")))
(add-hook '*post-command-hook*
   #'(lambda()
      (if (and (eq *last-command-char* #\TAB)
               (stringp (find (buffer-substring (point) (+ (point) 1))
                              (mapcar (lambda(list) (format nil "~:C" (first list))) *backword-char-item-list*):test
                               #'equal
                        )
               )
          )(forward-char))))

  • 1行目の「*post-command-hook*」でボタンを押したときのイベントをキャッチします。
  • 「*last-command-char*」に押したボタンの種類が入るので、これを利用してタブが押されたかどうかを判定します。
  • (find)関数では指定した値がリストの中に含まれている場合、指定した文字列を返すので、タブを押したときに隣の文字が囲み文字だったかを判定し、その場合カーソルを1文字分すすめるようにします。

Eclipseのようにカーソル位置が文字列の中央になっている場合でも、文字列から抜けるからぬけるということはできないのですが、実際使ってみるとこの程度の機能で自分の要件は満たされるなと感じています。それにEclipseの場合、突然タブを押しても文字列から抜けるのではなく、タブ文字が挿入されるだけに戻ったり、その逆になったりすることがあるので、で、今の仕様の方がわかりやすくていいかなと本人は思っています。

これはいい!!と思った方、ご利用いただけると大変うれしいです。

0 件のコメント:

コメントを投稿