ESSでyatexのごとくリージョン選択したところに括弧を挿入してくれるようにするelisp

括弧のネストが(ryシリーズの続き。

(interactive "r")

でいけるはずだったんだけど、リージョンを選択していないときの処理が分からなかった。この辺だな。具体的にどう回避するとか例を挙げておいてくれればいいのに。。。

というわけで、以下で代用。

(interactive)

regionを逆からmarkした時にerrorが起こったりして、ちょっとはまった。自分ではそういうことやらないんだけど、S式単位で選択すると逆からmarkになっていたのだった。

(defun insert-braces (arg)
  "A pair of brace is insert automatically."
  (interactive "p")
  (let()
    (progn
      (insert "{}")
      (backward-char 1)))
  )

(defun insert-brackets (arg)
  "A pair of square bracket is insert automatically."
  (interactive "p")
  (let()
    (progn
      (insert "[]")
      (backward-char 1)))
  )

(defun insert-parens (arg)
  "A pair of round bracket is insert automatically."
  (interactive "p")
  (let()
    (progn
      (insert "()")
      (backward-char 1)))
  )

(defun insert-double-quotation (arg)
  "A pair of double quatation is insert automatically."
  (interactive "p")
  (let()
    (progn
      (insert "\"\"")
      (backward-char 1)))
  )

(defun insert-angle (arg)
  "A pair of angle bracket is insert automatically."
  (interactive "p")
  (let()
    (progn
      (insert "<>")
      (backward-char 1)))
  )

(defun insert-braces-region (&optional open close)
  (interactive)
  (if mark-active
      (let ((beg (region-beginning))
	    (end (region-end)))
	(save-excursion
	  (goto-char end)
	  (insert (or close "}"))
	  (goto-char (if (> (point) beg)
			 ;;逆からmarkされた時がおかしくなる時の対策
			 beg
		       (point)
		       ))
	  (insert (or open "{"))))
    (insert "}"))))

(defun insert-brackets-region ()
  (interactive)
  (if mark-active
      (insert-braces-region "[" "]")
    (insert "]")))

(defun insert-parens-region ()
  (interactive)
  (if mark-active
      (insert-braces-region "(" ")")
    (insert ")")))

(defun insert-double-quotation-region ()
  (interactive)
  (if mark-active
      (insert-braces-region "\"" "\"")
    (insert "\"")))

(add-hook 'ess-mode-hook
          '(lambda()
             (progn
               (define-key ess-mode-map "{" 'insert-braces)
               (define-key ess-mode-map "(" 'insert-parens)
               (define-key ess-mode-map "\"" 'insert-double-quotation)
               (define-key ess-mode-map "[" 'insert-brackets)
               (define-key ess-mode-map "}" 'insert-braces-region)
               (define-key ess-mode-map ")" 'insert-parens-region)
               (define-key ess-mode-map "]" 'insert-brackets-region)
               (define-key ess-mode-map "\"" 'insert-double-quotation-region)
               )))