Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229191
  • 博文数量: 3
  • 博客积分: 2673
  • 博客等级: 少校
  • 技术积分: 93
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-01 13:02
个人简介

hi there

文章分类

全部博文(3)

文章存档

2009年(3)

我的朋友

分类: LINUX

2009-01-14 22:05:02

Emacs技巧:hide-ifdef mode 代码折叠

Created: Fang lungang(Ark) 01/14/2009 Modified: Fang lungang(Ark) 01/14/2009 22:28>

home

Emacs 的 hide-ifdef-mode 能够折叠 #ifdef 等条件预编译代码块。本文介绍几个相关的小技巧。

编辑 C 文件时自动激活 hide-ifdef

(require 'hideif)
(setq hide-ifdef-initially nil)
(add-hook 'c-mode-common-hook
(lambda ()
(hide-ifdef-mode 1)
))

hide-if-0

首先是一个小函数,把所有的 #if 0 包含的代码给折叠起来。

(defun my-hide-if-0()
"hide #if 0 blocks, inspired by internet. --lgfang"
(interactive)
(require 'hideif)
(save-excursion
(goto-char (point-min))
(while (re-search-forward "^[ \t]*#if[ \t]*0" nil t) (hide-ifdef-block)) )
)

把它加到 c-mode 的 hook 里,这样每次打开一个 c 文件, #if 0 就自动被折叠起来:

(add-hook 'c-mode-hook 'my-hide-if-0)

toggle hide/show

hide-ifdef-mode 没有提供类似 hs-toggle-hiding 的函数,折叠和展开分别对 应于各自的函数,也就对应于不同的快捷键。这样,使用起来还是不甚方便,而 且多占用一个快捷键(在 Emacs 中非常宝贵的资源 :) 。所以我自己写了个函 数,并把它绑定到 M-. (这个组合键默认是用于 etags 的,但我用xcscope,所 以就把这个键给重用了)。把下列代码加入到配置文件里,在某个 "#ifdef" 代 码块内按 M-. 就会把相应的快给折起来,再按一下就又展开。

(add-hook 'c-mode-common-hook
(lambda ()
(define-key c-mode-base-map (kbd "M-.") 'my-hif-toggle-block)
))

;;; for hideif
(defun my-hif-toggle-block ()
"toggle hide/show-ifdef-block --lgfang"
(interactive)
(require 'hideif)
(let* ((top-bottom (hif-find-ifdef-block))
(top (car top-bottom)))
(goto-char top)
(hif-end-of-line)
(setq top (point))
(if (hif-overlay-at top)
(show-ifdef-block)
(hide-ifdef-block))))

(defun hif-overlay-at (position)
"An imitation of the one in hide-show --lgfang"
(let ((overlays (overlays-at position))
ov found)
(while (and (not found) (setq ov (car overlays)))
(setq found (eq (overlay-get ov 'invisible) 'hide-ifdef)
overlays (cdr overlays)))
found))
阅读(4152) | 评论(3) | 转发(0) |
0

上一篇:没有了

下一篇:Emacs技巧:快速打开最近打开过的文件

给主人留下些什么吧!~~

chinaunix网友2009-04-07 07:47:26

恩,没注意到.. 谢谢,你的emacs心得写得很不错,我rss订阅了.

chinaunix网友2009-04-05 23:03:58

>>能不能再写一个在#ifdef #else #endif之间移动的函数,类似于{}之间的移动. 这个系统自带了啊。 C-c C-p runs the command c-backward-conditional C-c C-n runs the command c-forward-conditional C-c C-u runs the command c-up-conditional

chinaunix网友2009-04-04 03:46:24

真的很好用,能不能再写一个在#ifdef #else #endif之间移动的函数,类似于{}之间的移动.