0
|
1 ;;; -*- Mode:Emacs-Lisp -*-
|
|
2
|
|
3 ;;; "hide-copyleft.el" by Jamie Zawinski <jwz@lucid.com>, 19-jan-91.
|
|
4 ;;; Last modified 7-sep-91.
|
|
5 ;;;
|
|
6 ;;; I sometimes find it tiresome to have fifteen lines of copyright notice at
|
|
7 ;;; the beginning of each file. Meta-< does not take you to the beginning of
|
|
8 ;;; the code, it takes you a windowfull or two away, which can be tedious on
|
|
9 ;;; slow terminal lines.
|
|
10 ;;;
|
|
11 ;;; I know what the copyright notice says; so this code makes all but the first
|
|
12 ;;; line of it be invisible, by using Emacs's selective-display feature. The
|
|
13 ;;; text is still present and unmodified, but it is invisible.
|
|
14 ;;;
|
|
15 ;;; Elide the copyright notice with "Meta-X hide-copyleft-region". Make it
|
|
16 ;;; visible again with "Control-U Meta-X hide-copyleft-region". Or, if you're
|
|
17 ;;; sure you're not gonna get sued, you can do something like this in your
|
|
18 ;;; .emacs file:
|
|
19 ;;;
|
|
20 ;;; (autoload 'hide-copyleft-region "hide-copyleft" nil t)
|
|
21 ;;; (autoload 'unhide-copyleft-region "hide-copyleft" nil t)
|
|
22 ;;; (setq emacs-lisp-mode-hook 'hide-copyleft-region
|
|
23 ;;; c-mode-hook 'hide-copyleft-region)
|
|
24 ;;;
|
|
25 ;;; This code (obviously) has quite specific knowledge of the wording of the
|
|
26 ;;; various copyrights I've run across. Let me know if you find one on which
|
|
27 ;;; it fails.
|
|
28
|
|
29 (defvar copylefts-to-hide
|
|
30 ;; There are some extra backslashes in these strings to prevent this code
|
|
31 ;; from matching the definition of this list as the copyright notice!
|
|
32 '(;; GNU
|
|
33 ("free software\; you can redistribute it" .
|
|
34 "notice must be preserved on all")
|
|
35 ("free software\; you can redistribute it" .
|
|
36 "copy of the GNU General Public License.*\n?.*\n?.*\n?.*\n?02139,")
|
|
37 ("distributed in the hope that it will be useful\," .
|
|
38 "notice must be preserved on all")
|
|
39 ("free software\; you can redistribute it" .
|
|
40 "General Public License for more details\\.")
|
|
41 ;; X11
|
|
42 ("Permission to use\, copy, modify," .
|
|
43 "WITH THE USE OR PERFORMANCE")
|
|
44 ("Permission to use\, copy, modify," .
|
|
45 "without express or implied warranty")
|
|
46 ;; Motif
|
|
47 ("Copyright.*OPEN\ SOFTWARE FOUNDATION" .
|
|
48 "X Window System is a trademark of the")
|
|
49 ("THIS SOFTWARE\ IS FURNISHED UNDER A LICENSE" .
|
|
50 "X Window System is a trademark of the")
|
|
51 ;; UPenn
|
|
52 ("Permission to use\, copy, and distribute" .
|
|
53 " provided \"as is\" without")
|
|
54 ;; Evans & Sutherland, Solbourne.
|
|
55 ("Copyright 19[0-9][0-9] by " .
|
|
56 "OR PERFORMANCE OF THIS SOFTWARE\\.")
|
|
57 ;; TI Explorer
|
|
58 ("RESTRICTED RIGHTS LEGEND" . "All rights reserved\\.\\(\n;;; ?$\\)?")
|
|
59 ("^%%BeginDocumentation" . "^%%EndDocumentation")
|
|
60 )
|
|
61 "An alist of pairs of regexps which delimit copyright notices to hide.
|
|
62 The first one found is hidden, so order is significant.")
|
|
63
|
|
64
|
|
65 (defun hide-copyleft-region (&optional arg)
|
|
66 "Make the legal drivel at the front of this file invisible. Unhide it again
|
|
67 with C-u \\[hide-copyleft-region]."
|
|
68 (interactive "P")
|
|
69 (if arg
|
|
70 (unhide-copyleft-region)
|
|
71 (save-excursion
|
|
72 (save-restriction
|
|
73 (if selective-display (error "selective-display is already on."))
|
|
74 (catch 'Abort
|
|
75 (let ((mod-p (buffer-modified-p))
|
|
76 (buffer-read-only nil)
|
|
77 (rest copylefts-to-hide)
|
|
78 pair start end max)
|
|
79 (widen)
|
|
80 (goto-char (point-min))
|
|
81 (while (and rest (not pair))
|
|
82 (save-excursion
|
|
83 (and (re-search-forward (car (car rest)) nil t)
|
|
84 (setq start (point))
|
|
85 (re-search-forward (cdr (car rest)) nil t)
|
|
86 (setq end (point)
|
|
87 pair (car rest))))
|
|
88 (setq rest (cdr rest)))
|
|
89 (setq x pair)
|
|
90 (or pair
|
|
91 (if (interactive-p)
|
|
92 (error "Couldn't find a CopyLeft to hide.")
|
|
93 (throw 'Abort nil)))
|
|
94 (goto-char end)
|
|
95 (forward-line 1)
|
|
96 ;; If the last line of the notice closes a C comment, don't
|
|
97 ;; hide that line (to avoid confusion...)
|
|
98 (if (save-excursion (forward-char -3) (looking-at "\\*/"))
|
|
99 (forward-line -1))
|
|
100 (setq end (point))
|
|
101 (goto-char start)
|
|
102 (forward-line 1)
|
|
103 (while (< (point) end)
|
|
104 (delete-char -1)
|
|
105 (insert "\^M")
|
|
106 (forward-line 1))
|
|
107 (setq selective-display t)
|
|
108 (set-buffer-modified-p mod-p)))))))
|
|
109
|
|
110 (defun unhide-copyleft-region ()
|
|
111 "If the legal nonsense at the top of this file is elided, make it visible again."
|
|
112 (save-excursion
|
|
113 (save-restriction
|
|
114 (widen)
|
|
115 (goto-char (point-min))
|
|
116 (let ((mod-p (buffer-modified-p))
|
|
117 (buffer-read-only nil)
|
|
118 end)
|
|
119 (or (search-forward "\^M" nil t) (error "Nothing hidden here, dude."))
|
|
120 (end-of-line)
|
|
121 (setq end (point))
|
|
122 (beginning-of-line)
|
|
123 (while (search-forward "\^M" end t)
|
|
124 (delete-char -1)
|
|
125 (insert "\^J"))
|
|
126 (set-buffer-modified-p mod-p)
|
|
127 (setq selective-display nil)))))
|
|
128
|