分类: LINUX
2009-01-14 22:05:02
Created: Fang lungang(Ark) 01/14/2009 Modified: Fang lungang(Ark) 01/14/2009 22:28>
Emacs 的 hide-ifdef-mode 能够折叠 #ifdef
等条件预编译代码块。本文介绍几个相关的小技巧。
(require 'hideif)
(setq hide-ifdef-initially nil)
(add-hook 'c-mode-common-hook
(lambda ()
(hide-ifdef-mode 1)
))
首先是一个小函数,把所有的 #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)
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))
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