Homepage: https://www.gnu.org/software/emacs
Author: Brian Marick, Daniel LaLiberte
Hides selected code within ifdef
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 behaviours 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.