untabfy + indent-region

最初は, untabify + indent-region だけで, マクロでも良いような関数作った.
でも, そうだ. タブ幅も変更できるようにしよう!とか考えたら, 妙に時間がかかった.



悩んだのは, 関数で (setq tab-width 8) とか変更しても, すぐに反映されないところ.
M-: でやるとすぐに反映されるのに, どうしてだーとか思って, 色々調べた.


最終的に 2ch のログを見つけて, (redraw-frame ...) ってやれば OK って分かってできた.
こんなの.

;; untabify & indent
(defun my-indent-region-and-untabify-or-change-tab-width (arg)
  "indent-region + untabify を実行する.
1 以上の数値引数が与えられたならば, 与えられた値 * 4 を tab-width とする."
  (interactive "P")
  (if (and arg (> (prefix-numeric-value arg) 0))
      (progn
        (setq tab-width (* (prefix-numeric-value arg) 4))
        (redraw-frame (car (frame-list)))
        (message "tab-width %d" tab-width))
    (save-excursion
      (indent-region (point-min) (point-max) nil)
      (untabify (point-min) (point-max)))))

前置引数を与えないと, untabify + indent-region.
save-excursion はイラナイと思うけど, なんかつけといた.
1 以上の数値前置引数を与えると, その与えられた値 * 4 を tab-width の値と変更する.
それだけ.
最初は, tab-width を変更した後,
indent-region + untabify もするように if でなくて when でやってた.
でも, どうにも上手くいかないから*1,
いいやってことでこんな関数におちついた.

追記


こんなのに変更した.

(defun my-indent-region-and-untabify-or-change-tab-width (arg)
  "indent-region + untabify を実行する.
数値引数として 0 が与えられたならば, untabify のみを実行する.
1 以上の数値引数が与えられたならば, 与えられた値 * 4 を tab-width とする."
  (interactive "P")
  (cond
   ((and arg (> (prefix-numeric-value arg) 0))
    (setq tab-width (* (prefix-numeric-value arg) 4))
    (redraw-frame (car (frame-list)))
    (message "tab-width %d" tab-width))
   ((= (prefix-numeric-value arg) 0)
    (untabify (point-min) (point-max)))
   (t (save-excursion
        (indent-region (point-min) (point-max) nil)
        (untabify (point-min) (point-max))))))

数値引数 として, 0 が与えられたなら, untabify のみを実行するようにした.
delete-trailing-whitespace もやるべきか悩みどころ.

更新時刻

  • 1かいめ 2007年, 2月26日, 23:21
  • 2かいめ 2007年, 2月26日, 23:50

*1:タブ幅の変更がやっぱり反映されないんだよね.