emacsタブ拡張

標準のlisp-modeのタブ動作では、望み通りにインデントされないことがあるので、バックタブ(Shift+Tab)用の関数を作成。


標準のタブでのインデント:

(multiple-value-bind (a b c) (values 1 2 3)
                     (list a b c))


作成したバックタブ用関数でのインデント:
※ 一つ上のS式の位置より、半角スペース二つ分後ろにインデントされる

(multiple-value-bind (a b c) (values 1 2 3)
  (list a b c))


.emacsに追加したソースは下記の通り

(defun backtab ()
  (interactive)
  (let ((old (progn (forward-line 0) (point)))
	(end (progn (backward-up-list) (point)))
	(beg (progn (forward-line 0) (point))))
    (goto-char old)
    (let ((ts (thing-at-point 'whitespace)))
      (unless (and (= (length ts) 1)
		   (char-equal ?\n (aref ts 0)))
	(delete-char (length ts))))
    (while (< beg end)
      (let ((c (char-after beg)))
	(insert-char (if (char-equal c ?\t) ?\t ?  ) 1))
      (setq beg (+ beg 1)))
    (insert-char ?  2)))

;; 良く分からないのでグローバルで設定
(global-set-key [backtab] 'backtab)