indent-region + untabify + delete-trailing-whitespace

plus さんから昨日のuntabfy + indent-regionについてメールを貰いました.
こんな感じです.
# 一部コメントを削除してあります. plus さんの環境が書かれていたので.
# 毎回ブログに貼っつけてすいません m(_ _)m

(defun my-indent-region-and-untabify-or-change-tab-width (arg)
 "indent-region + untabify を実行する.
数値引数として 0 が与えられたならば, untabify のみを実行する.
1 以上の数値引数が与えられたならば, 与えられた値 * 4 を tab-width とする."
 (interactive "P")
 (setq arg (if arg
               (prefix-numeric-value arg)
             -1))
 (save-excursion
   (save-restriction
     (if (and transient-mark-mode mark-active)
         (narrow-to-region (region-beginning) (region-end))
       ;; (widen)
       ;;   ↑この (widen) はちとやりすぎかも?
       ;;     narrowing されている場合に見えていない部分にも
       ;;     untabify, indent-region がかかってしまいます
       )
     (cond
      ((> arg 0)
       (setq tab-width (* arg 4))
       ;; (redraw-frame (car (frame-list)))
       ;;   ↑私の環境では必要ありませんでした
       (message "tab-width %d" tab-width))
      ((= arg 0)
       (untabify (point-min) (point-max)))
      (t
       (indent-region (point-min) (point-max) nil)
       (untabify (point-min) (point-max)))))))

リージョンが指定されていると, その範囲をナローイングして,
そこだけに適用するようになっています.



それを受けてこのように改造してみました.
関数名を変更してあります.

(defun my-correct-externals-of-code (arg)
 "コードの外観を修正する関数.
前置引数なし : indent-region + untabify + delete-trailing-whitespace.
前置引数として 0 (C-0) : untabify.
前置引数として 1 (C-1) : delete-trailing-whitespace.
前置引数として 11 (C-1 C-1) : untabify + delete-trailing-whitespace.
前置引数として 22 (C-2 C-2) : indent-region + delete-trailing-whitespace.
1 以上の前置引数(11, 22 を除く) : その数値 * 2 を tab-width の値とする.
通常は, カレントバッファ全体が適用範囲となる.
ただし, region が指定されていた場合は, その範囲を適用範囲とする."
 (interactive "P")
 (setq arg (if arg
               (prefix-numeric-value arg)
             -1))
 (save-excursion
   (save-restriction
     (if (and transient-mark-mode mark-active)
         (narrow-to-region (region-beginning) (region-end))
       (widen))
     (cond
      ((= arg 0)
       (untabify (point-min) (point-max))
       (message "did untabify."))
      ((= arg 1)
       (delete-trailing-whitespace)
       (message "did delete-trailing-whitespace."))
      ((= arg 11)
       (untabify (point-min) (point-max))
       (delete-trailing-whitespace)
       (message "did untabify + delete-trailing-whitespace."))
      ((= arg 22)
       (indent-region (point-min) (point-max) nil)
       (untabify (point-min) (point-max))
       (message "did indent-region + untabify"))
      ((> arg 1)
       (setq tab-width (* arg 2))
       (redraw-frame (car (frame-list)))
       (message "tab-width %d" tab-width))
      (t
       (indent-region (point-min) (point-max) nil)
       (untabify (point-min) (point-max))
       (delete-trailing-whitespace))))))

変更点は, 大きくは, delete-trailing-whitespace も行うようにしたこと,
前置引数を指定したときの挙動が増えたことです.
前置引数を与えたときの挙動は, 次のようなものになります.

  • C-0 M-x my-correct-externals-of-code とすると, untabify.
  • C-1 M-x my-correct-externals-of-code とすると, delete-trailing-whitespace.
  • C-1 C-1 M-x my-correct-externals-of-code とすると, untabify + delete-trailing-whitespace.
  • C-2 C-2 M-x my-correct-externals-of-code とすると, indent-region + untabify.
  • その他の数値引数を与えると, その値 * 2 を tab-width の値として設定します.

前置引数を与えないと, indent-region + untabify + delete-trailing-whitespace を行います.
また, C-0 とか何をやったのか, ひどく分かりづらいので,
行ったことを message でミニバッファに出すようにしました.

更新時刻

2007年, 2月28日, 2:27