分类: LINUX
2009-02-23 09:23:47
Created: Fang lungang 01/15/2009 Modified: Fang lungang 02/20/2009 15:58>
Emacs 还有一种代码折叠的方式叫做 selective-display ,它单纯根据每行的缩
进折叠。我通常用它来折叠 C 代码中的 "case" 块,因为很多时候 case:
与
break;
之间的代码并没有用大括号包含起来,无法使用 hs-minor-mode 。
可是 selective-display 直接使用也不方便:需要先判定要折叠(隐藏)的代码
的缩进列数 n ,然后再 C-u n C-x $
,展开时的 C-x $
按起来也不甚方便。所
以我写了个函数能够自动折叠、展开与当前行缩进相同的所有行,并绑定到 M-'
,这样使用起来就方便多了。
(define-key global-map (kbd "M-'") 'my-toggle-selective-display)
(defun my-toggle-selective-display()
"set-selective-display to current column or toggle
selective-display --lgfang"
(interactive)
(let ((arg (progn (back-to-indentation) (current-column))))
(set-selective-display (if (eq arg selective-display) nil arg))))
对于如下代码,当光标在第三行的任一位置时按 M-'
,代码会折叠如第二栏;再按一次又会重新展开。
1 switch (ch) { | switch (ch) {
2 case 'H': | case 'H':...
3 Hflag = 1; | case 'L':...
4 Lflag = Pflag = 0; | case 'P':...
5 break; | case 'R':...
6 case 'L': | case 'f':...
7 Lflag = 1; | case 'i':...
8 Hflag = Pflag = 0; | case 'l':...
9 break; | case 'n':...
10 case 'P': | case 'p':...
11 Pflag = 1; | case 'r':...
12 Hflag = Lflag = 0; | case 'v':...
13 break; | default:...
14 case 'R': | }
15 Rflag = 1; |
16 break; |
17 case 'f': |
18 fflag = 1; |
19 iflag = nflag = 0; |