2008-12-26

showing and hiding blocks of code

When I'm writing some code, I find it often useful to hide most function bodies, and only see the one I am working on. This way, I can keep the overview, and concentrate on the part I am working on. Emacs has support for showing/hiding blocks of code, using the HideShow-package. HideShow works with C/C++, Lisp, Scheme, Java, Perl, PHP, TCL, VHDL and Fortran. It also seems to work with Javascript (at least JS2).

You can enable Hide-Show for C/C++ code by adding the following to your .emacs:

(add-hook 'c-mode-common-hook
  (lambda()
    (local-set-key (kbd "C-c <right>") 'hs-show-block)
    (local-set-key (kbd "C-c <left>")  'hs-hide-block)
    (local-set-key (kbd "C-c <up>")    'hs-hide-all)
    (local-set-key (kbd "C-c <down>")  'hs-show-all)
    (hs-minor-mode t)))
You can hide or show either the current block, or the whole file. To show the former, consider a C-function:
int my_function (int a, int b)
{
 return a + b;
}
Now, when calling hs-hide-block, we get:
int my_function (int a, int b)...
HideShow has one problem: the truly bizarre default key bindings, such as 'C-c @ ESC C-s' for hs-show-all. This is the reason I am adding these alternative key bindings in the add-hook above - 'C-c' and the arrow keys; alternatively, you could use the 'Super'-key instead of C-c.

If you'd like to hide everything by default when you open a file, you can do so by adding

(hs-hide-all)
to the above hook function.

Side-note: Even though there are many keys on your keyboard, there is a finite number of easy combinations, especially when the arrow-keys are involved. They are popular, and not just by emacs -- for example, window managers often use Ctrl-Alt-<arrow-key> for switching between virtual desktops. So, it's good to think a little bit where to 'spend' your easiest key bindings.

8 comments:

  1. Thanks for the great tip.

    I introduced this great tip to Korean emacs user in myblog.
    ( http://tkhwang.tistory.com/35 )

    It seems that you didn't open trackback. T_T;

    ReplyDelete
  2. @tkhwang: nice -- and i've enabled the trackback support.

    ReplyDelete
  3. How would you take a few lines of variable declarations and turn that into a hideable block?

    ReplyDelete
  4. @Terrence Brannon: well, hide-show is for hiding *blocks*; for most languages, it would not make much sense to put the variables in a separate block, so hide-show is not a good solution for that.

    Instead, you could look at e.g, folding mode, but that requires specially formatted comments.

    ReplyDelete
  5. yeah, I tried to put my comments in a "block":

    # variable decls {

    my $x = 12;
    my $y = 33;
    my $z =33;

    # }

    but the mode tries to interpret comments as a block and expects a certain number of lines for the comments

    yes, i may have to goto folding mode, but I really liked this.

    ReplyDelete
  6. Isn't this something similar to what we see in org-mode. The headings are shown and hidden in cyclic manner?

    I wonder if we could adapt your solution to a case where we could do the same in f90-mode or c-mode etc.

    ReplyDelete
  7. Thanks for the tip!

    I am wonder if it's easy or not to customize the color of the 3 dots ? I think that it would be better to view something that differs from three real dots, no?

    It should be cool also if we can start the buffer in hs-hide-all except for the comments of the code which are sometimes more important than the function definition itself, it is easy to customize ?

    ReplyDelete
  8. @Anonymous: you can customize how it looks, see the documentation for the variable hs-set-up-overlay. It does require some elisp though.

    ReplyDelete