水木某大牛写的emacs python代码折叠代码, 试了下, 非常好用. 感谢作者:
代码如下:
发信人: jcjbrian (Brian Jiang), 信区: Emacs
标 题: Re: python代码怎么折叠啊? 发信站: 水木社区 (Sun Sep 6 16:59:38 2009), 转信 最近刚好写了一个python的折叠功能。 能简单。 是基于emacs自带的python mode。可以支持各种类型的block (如if, for等)。 关键是: mypython-fold/unfold-block。 我把它绑到了F10. 可以自己改。 其他都只是些支持代码。 -------(defface codepilot-folding-overlay '((default (:inherit region :box (:line-width 1 :color "DarkSeaGreen1" :style released-button))) (((class color)) (:background "DarkSeaGreen2" :foreground "black"))) "*Font used by folding overlay." :group 'codepilot) (defun cptree-ov-delete () (interactive) (dolist (o (overlays-at (point))) (cptree-delete-overlay o 'cptree))) (defvar cptree--overlay-keymap nil "keymap for folding overlay") (unless cptree--overlay-keymap (let ((map (make-sparse-keymap))) (define-key map [mouse-1] 'cptree-ov-delete) (define-key map "\r" 'cptree-ov-delete) (setq cptree--overlay-keymap map))) (defun cptree-delete-overlay(o prop) (when (eq (overlay-get o 'cptree-tag) prop) (delete-overlay o) t)) (defun cptree-hide-region (from to prop) "Hides a region by making an invisible overlay over it and save the overlay on the hide-region-overlays \"ring\"" (interactive) (let ((new-overlay (make-overlay from to))) ;;(overlay-put new-overlay 'invisible nil) (overlay-put new-overlay 'cptree-tag prop) (overlay-put new-overlay 'face 'codepilot-folding-overlay) (overlay-put new-overlay 'display (propertize (format "...<%d lines>..." (1- (count-lines (overlay-start new-overlay) (overlay-end new-overlay)))))) (overlay-put new-overlay 'priority (- 0 from)) (overlay-put new-overlay 'keymap cptree--overlay-keymap) (overlay-put new-overlay 'pointer 'hand))) (require 'python) (defun mypython-fold/unfold-block () "fold the block" (interactive) (let (ret b e) (dolist (o (overlays-at (if (python-open-block-statement-p) (save-excursion (python-end-of-statement) (point) ) (point)))) (when (cptree-delete-overlay o 'cptree) (setq ret t))) (unless ret (save-excursion (unless (python-open-block-statement-p) (python-beginning-of-block)) (python-end-of-statement) (setq b (point)) (python-end-of-block) (setq e (1- (point))) (cptree-hide-region b e 'cptree))))) (define-key python-mode-map [(f10)] 'mypython-fold/unfold-block)