; Comment out region

(defun comment-out-region (arg)
  "Insert comment string at beginning of each line in the region."
  (interactive "P")
  (let (start end)
    (if (< (point) (mark))
        (setq start (point) end (mark-marker))
        (setq start (mark) end (point-marker)))
    (save-excursion
      (untabify start (marker-position end))
      (goto-char start)
      (if (not (bolp))
	  (progn (end-of-line) (forward-char)))
      (while (< (point) (marker-position end))
	(if (eq arg '-)
	    (if (looking-at comment-start)
		(delete-char (length comment-start)))
	    (insert comment-start))
	(end-of-line)
	(forward-char)))))

;(defun uncomment-out-region (arg)
;  (interactive nil)
;  (comment-out-region '-))


; Mini-Find Tag

(defvar last-mini-tag "" "Last tag sought by mini-find-tag.")

(defun mini-find-tag (tagname &optional next)
  "Search for a definition of TAGNAME in current buffer.
 If TAGNAME is a null string, the expression in the buffer
around or before point is used as the tag name.
 If second arg NEXT is non-nil (interactively, with prefix arg),
searches for the next definition in the buffer
that matches the tag name used in the previous mini-find-tag."

  (interactive (if current-prefix-arg
		   '(nil t)
		 (list (read-string "Mini-find tag: "))))
  (if (equal tagname "")             ;See definition of find-tag.
      (setq tagname (save-excursion
		      (buffer-substring
		       (progn (backward-sexp 1) (point))
		       (progn (forward-sexp 1) (point))))))
  (let ((pt (save-excursion
	      (if (not next)
		  (goto-char (point-min))
		(setq tagname last-mini-tag))
	      (setq last-mini-tag tagname)
	      (if (re-search-forward
		     (concat "^(def.*" tagname)
		     nil t)
		  (point)
		nil))))
    (if pt
	(progn (set-mark-command nil)
	       (goto-char pt))
      (signal 'search-failed '()))))

; indent-differently

(defun indent-differently ()
  "Make the current line indent like the body of a special form by
changing the operator's scheme-indent-hook appropriately."
  (interactive nil)
  (let ((here (point)))
    (save-excursion
      (back-to-indentation)
      (backward-up-list 1)
      (forward-char 1)
      (let ((i -1)
	    (function nil)
	    (p (point)))
	(while (<= (point) here)
	  (setq i (+ i 1))
	  (forward-sexp 1)
	  (if (= i 0)
	      (setq function (buffer-substring p (point)))))
	(setq i (- i 1))
	(let ((name (intern (downcase function))))
	  (cond ((equal (get name 'scheme-indent-hook) i)
		 (message "Indent %s nil" name)
		 (put name 'scheme-indent-hook nil))
		(t
		 (message "Indent %s %d" name i)
		 (put name 'scheme-indent-hook i))))))
    (scheme-indent-line)))