hideif

Homepage: https://www.gnu.org/software/emacs

Author: Brian Marick, Daniel LaLiberte

Summary

Hides selected code within ifdef

Commentary

To initialize, toggle the hide-ifdef minor mode with

M-x hide-ifdef-mode

This will set up key bindings and call hide-ifdef-mode-hook if it
has a value.  To explicitly hide ifdefs using a buffer-local
define list (default empty), type

M-x hide-ifdefs  or C-c @ h

Hide-ifdef suppresses the display of code that the preprocessor wouldn't
pass through.  Support complete C/C++ expression and precedence.
It will automatically scan for new #define symbols and macros on the way
parsing.

The hidden code is marked by ellipses (...).  Be
cautious when editing near ellipses, since the hidden text is
still in the buffer, and you can move the point into it and modify
text unawares.
You can make your buffer read-only while hide-ifdef-hiding by setting
hide-ifdef-read-only to a non-nil value.  You can toggle this
variable with hide-ifdef-toggle-read-only (C-c @ C-q).

You can undo the effect of hide-ifdefs by typing

M-x show-ifdefs  or C-c @ s

Use M-x hide-ifdef-define (C-c @ d) to define a symbol.
Use M-x hide-ifdef-undef (C-c @ u) to undefine a symbol.

If you define or undefine a symbol while hide-ifdef-mode is in effect,
the display will be updated.  The global define list hide-ifdef-env
is affected accordingly.  You can save changes to this globally define
list with hide-ifdef-set-define-alist.  This adds entries to
hide-ifdef-define-alist.

If you have defined a hide-ifdef-mode-hook, you can set
up a list of symbols that may be used by hide-ifdefs as in the
following example:

(add-hook 'hide-ifdef-mode-hook
     (lambda ()
	 (unless hide-ifdef-define-alist
	   (setq hide-ifdef-define-alist
		'((list1 (ONE . 1) (TWO . 2))
		  (list2 (TWO . 2) (THREE . 3)))))
	 (hide-ifdef-use-define-alist 'list2))) ; use list2 by default

Currently recursive #include is not yet supported, a quick and reliable
way is to let the compiler generates all the #include-d defined macros
into a file, then open it in Emacs with hide-ifdefs (C-c @ h).
Take gcc and hello.c for example, hello.c #include-s :

  $ gcc -dM -E hello.c -o hello.hh

Then, open hello.hh and perform hide-ifdefs.

You can call hide-ifdef-use-define-alist (C-c @ U) at any time to specify
another list to use.

To cause ifdefs to be hidden as soon as hide-ifdef-mode is called,
set hide-ifdef-initially to non-nil.

If you set hide-ifdef-lines to t, hide-ifdefs hides all the #ifdef lines.
In the absence of highlighting, that might be a bad idea.  If you set
hide-ifdef-lines to nil (the default), the surrounding preprocessor
lines will be displayed.  That can be confusing in its own
right.  Other variations on display are possible, but not much
better.

You can explicitly hide or show individual ifdef blocks irrespective
of the define list by using hide-ifdef-block and show-ifdef-block.

You can move the point between ifdefs with forward-ifdef, backward-ifdef,
up-ifdef, down-ifdef, next-ifdef, and previous-ifdef.

If you have minor-mode-alist in your mode line (the default) two labels
may appear.  "Ifdef" will appear when hide-ifdef-mode is active.  "Hiding"
will appear when text may be hidden ("hide-ifdef-hiding" is non-nil).

Written by Brian Marick, at Gould, Computer Systems Division, Urbana IL.
Extensively modified by Daniel LaLiberte (while at Gould).

Extensively modified by Luke Lee in 2013 to support complete C expression
evaluation and argumented macro expansion; C++11, C++14, C++17, GCC
extension literals and gcc/clang matching behaviors are supported in 2021.
Various floating point types and operations are also supported but the
actual precision is limited by the Emacs internal floating representation,
which is the C data type "double" or IEEE binary64 format.
C99 and GNU style variadic arguments support is completed in 2022/E.

Dependencies

Reverse dependencies