10

I am working with a lot of *cpp and *h files which contain a lengthy copyright notice at the beginning. I would like emacs to show these files as if this was not there, without actually removing the text.

Thas is, this:

/*
 * Copyright (C) 2006-2008 Author A
 * Copyright (C) 2006-2008 Author B
 * Copyright (C) 2006-2008 Author C
 * Copyright (C) 2006-2008 Author D
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * As a special exception, you may use this file as part of a free
 * software library without restriction. Specifically, if other files
 * instantiate templates or use macros or inline functions from this
 * file, or you compile this file and link it with other files to
 * produce an executable, this file does not by itself cause the
 * resulting executable to be covered by the GNU General Public
 * License. This exception does not however invalidate any other
 * reasons why the executable file might be covered by the GNU Library
 * General Public License.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

 #ifndef FILENAME
 #define FILENAME
 ...

should simply look like this

#ifndef FILENAME
#define FILENAME
...
13

Emacs comes with elide-head.el which does exactly what you're asking for.

To use it, add elide-head to a major mode hook or find-file-hook (in your case c-mode-common-hook should work). It can hide GPL license comments out of the box; to hide other lengthy headers, customize elide-head-headers-to-hide.

Note that it does not hide just any comment at the top of the buffer but uses regular expressions to match the beginning and the end of a license.

  • 1
    I like this command. Very nice. – Tu Do Jan 3 '15 at 19:20
  • Beats me every time. Whenever I write something, there was someone else who thought of it first :) – wvxvw Jan 3 '15 at 22:12
12

Here's one way to do that:

Add this to your init file:

(defun hide-banner ()
  (save-excursion
    (let* ((start (progn (beginning-of-buffer) (point)))
           (end (progn (forward-comment (buffer-size)) (point)))
           (over (make-overlay start end)))
      (overlay-put over 'invisible t))))

In the buffer where you want to hide the initial comment add:

// -*- eval: (hide-banner) -*-

Or add the same code to the buffer hook. Or you could certainly change the way the comment you want to hide is identified (if you wanted it to pick up the #ifndef / #define pair, then you'd need to modify the hide-banner function to search for that rather than the end of the first comment.

  • Works! This is so much better, thank you. In case any body els needs this, here is my hook: (add-hook 'c-mode-common-hook 'hide-banner) – Beginner Jan 3 '15 at 9:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.