(たぶん車輪の再発明)現在のカーソルより右から始まる行を非表示にする。

hide-unhide-toggle-deeper-lineという関数を作った。
明日もう少し綺麗にする。*1

これが

#|  <-"|"の位置にカーソルをおく 
def f
  puts("foo")
  puts("bar")
end

こうなる*2

#l|  <-"|"の位置にカーソルをおく 
def f
end

コード

(require 'cl)
(require 'outline)

(defmacro count-length (action size)
  `(let ((%from (point))
	 (%to (progn ,action (point))))
     (* (- %to %from) ,size)))

(defun my-count-current-depth ()
  (save-excursion 
    (goto-char (point-at-bol))
    (+ (count-length (skip-chars-forward my-skip-chars) 1)
       (count-length (skip-chars-forward "\t") tab-width))))

(defvar my-hide-deeper-p nil)
(defvar my-skip-chars " \;#") ;;ここにskipしたい文字を追加する
(make-variable-buffer-local 'my-hide-deeper-p)

(defun my-hide-deeper-line (beg end depth)
  (save-excursion
    (goto-char beg)
    (while (< (point) end)
      (when (or (= (point-at-bol) (point-at-eol))
		(< depth (my-count-current-depth)))
	(outline-flag-region (point-at-bol) (+ 1 (point-at-eol)) t))
      (goto-char (+ 1 (point-at-eol))))))

(defun my-hide-deeper--current-line ()
  (let ((current-depth (min (my-count-current-depth)
			    (- (point) (point-at-bol)))))
    (print current-depth)
    (multiple-value-bind (beg end)
	(if (region-active-p) 
	    (values (region-beginning) (region-end))
	  (values (point-min) (point-max)))
      (my-hide-deeper-line beg end current-depth))))
  
(defun hide-unhide-toggle-deeper-line () (interactive)
  (unwind-protect
      (if my-hide-deeper-p 
	  (show-all) 
	(my-hide-deeper--current-line))
    (setq my-hide-deeper-p (not my-hide-deeper-p))))

;; (require 'key-chord)
;; (key-chord-define-global "kl" 'hide-unhide-toggle-deeper-line)

*1:たぶん

*2:clipboardに入る時は、非表示の部分も一緒