An Introduction to Programming in Emacs Lisp An Introduction to Programming in Emacs Lisp Revised Third Edition by Robert J. Chassell This is an Introduction to Programming in Emacs Lisp, for people who are not programmers. Edition 3.10, 28 October 2009 Copyright c 1990–1995, 1997, 2001–2014 Free Software Foundation, Inc. Published by the: GNU Press, http://www.fsf.org/licensing/gnu-press/ a division of the email: sales@fsf.org Free Software Foundation, Inc. Tel: +1 (617) 542-5942 51 Franklin Street, Fifth Floor Fax: +1 (617) 542-2652 Boston, MA 02110-1301 USA ISBN 1-882114-43-4 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; there being no Invariant Section, with the Front-Cover Texts being “A GNU Manual”, and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License”. (a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.” i Short Contents Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 List Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 Practicing Evaluation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3 How To Write Function Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4 A Few Buffer–Related Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5 A Few More Complex Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 6 Narrowing and Widening . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 7 car, cdr, cons: Fundamental Functions. . . . . . . . . . . . . . . . . . . . . . 73 8 Cutting and Storing Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 9 How Lists are Implemented . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 10 Yanking Text Back . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 11 Loops and Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 12 Regular Expression Searches. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 13 Counting via Repetition and Regexps . . . . . . . . . . . . . . . . . . . . . . . 146 14 Counting Words in a defun. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 15 Readying a Graph. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 16 Your .emacs File. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 17 Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 18 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 A The the-the Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 B Handling the Kill Ring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 C A Graph with Labeled Axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 D Free Software and Free Manuals . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 E GNU Free Documentation License . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 ii Table of Contents Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 On Reading this Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 For Whom This is Written . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Lisp History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 A Note for Novices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Thank You . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1 List Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1 Lisp Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.1 Lisp Atoms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.2 Whitespace in Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.3 GNU Emacs Helps You Type Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 Run a Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Generate an Error Message. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.4 Symbol Names and Function Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.5 The Lisp Interpreter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.5.1 Byte Compiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.6 Evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.6.1 Evaluating Inner Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.7 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.7.1 Error Message for a Symbol Without a Function . . . . . . . . . . . . . . . . 10 1.7.2 Error Message for a Symbol Without a Value . . . . . . . . . . . . . . . . . . . 10 1.8 Arguments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.8.1 Arguments’ Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.8.2 An Argument as the Value of a Variable or List . . . . . . . . . . . . . . . . . 12 1.8.3 Variable Number of Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.8.4 Using the Wrong Type Object as an Argument . . . . . . . . . . . . . . . . . . 13 1.8.5 The message Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.9 Setting the Value of a Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9.1 Using set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9.2 Using setq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9.3 Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.10 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2 Practicing Evaluation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.1 Buffer Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2 Getting Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.3 Switching Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.4 Buffer Size and the Location of Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.5 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 iii 3 How To Write Function Definitions . . . . . . . . . . . . . . . . . . . . . 26 3.1 The defun Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.2 Install a Function Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.2.1 Change a Function Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.3 Make a Function Interactive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.3.1 An Interactive multiply-by-seven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.4 Different Options for interactive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.5 Install Code Permanently . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.6 let . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.6.1 The Parts of a let Expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.6.2 Sample let Expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.6.3 Uninitialized Variables in a let Statement . . . . . . . . . . . . . . . . . . . . . . 35 3.7 The if Special Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.7.1 The type-of-animal Function in Detail . . . . . . . . . . . . . . . . . . . . . . . . 36 3.8 If–then–else Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.9 Truth and Falsehood in Emacs Lisp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.10 save-excursion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.10.1 Template for a save-excursion Expression . . . . . . . . . . . . . . . . . . . . 40 3.11 Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.12 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4 A Few Buffer–Related Functions . . . . . . . . . . . . . . . . . . . . . . . . 45 4.1 Finding More Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.2 A Simplified beginning-of-buffer Definition . . . . . . . . . . . . . . . . . . . . . . . 46 4.3 The Definition of mark-whole-buffer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.3.1 Body of mark-whole-buffer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.4 The Definition of append-to-buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.4.1 The append-to-buffer Interactive Expression . . . . . . . . . . . . . . . . . . 50 4.4.2 The Body of append-to-buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.4.3 save-excursion in append-to-buffer . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.5 Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.6 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5 A Few More Complex Functions . . . . . . . . . . . . . . . . . . . . . . . . 56 5.1 The Definition of copy-to-buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.2 The Definition of insert-buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.2.1 The Interactive Expression in insert-buffer . . . . . . . . . . . . . . . . . . . 57 A Read-only Buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 ‘b’ in an Interactive Expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.2.2 The Body of the insert-buffer Function . . . . . . . . . . . . . . . . . . . . . . 58 5.2.3 insert-buffer With an if Instead of an or . . . . . . . . . . . . . . . . . . . . 58 5.2.4 The or in the Body. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.2.5 The let Expression in insert-buffer . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5.2.6 New Body for insert-buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 5.3 Complete Definition of beginning-of-buffer . . . . . . . . . . . . . . . . . . . . . . . . 62 iv 5.3.1 Optional Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 5.3.2 beginning-of-buffer with an Argument . . . . . . . . . . . . . . . . . . . . . . . 63 What happens in a large buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 What happens in a small buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.3.3 The Complete beginning-of-buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 5.4 Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 5.5 optional Argument Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6 Narrowing and Widening . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.1 The save-restriction Special Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.2 what-line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 6.3 Exercise with Narrowing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 7 car, cdr, cons: Fundamental Functions . . . . . . . . . . . . . . . . . . 73 7.1 car and cdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 7.2 cons. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 7.2.1 Find the Length of a List: length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 7.3 nthcdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 7.4 nth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 7.5 setcar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 7.6 setcdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 7.7 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 8 Cutting and Storing Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 8.1 zap-to-char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 8.1.1 The interactive Expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 8.1.2 The Body of zap-to-char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 8.1.3 The search-forward Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 8.1.4 The progn Special Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 8.1.5 Summing up zap-to-char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 8.2 kill-region . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 8.2.1 condition-case. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 8.2.2 Lisp macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 8.3 copy-region-as-kill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 8.3.1 The Body of copy-region-as-kill. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 The kill-append function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 The kill-new function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 8.4 Digression into C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 8.5 Initializing a Variable with defvar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 8.5.1 defvar and an asterisk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 8.6 Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 8.7 Searching Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 v 9 How Lists are Implemented. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 9.1 Symbols as a Chest of Drawers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 9.2 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 10 Yanking Text Back . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 10.1 Kill Ring Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 10.2 The kill-ring-yank-pointer Variable. . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 10.3 Exercises with yank and nthcdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 11 Loops and Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 11.1 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 11.1.1 A while Loop and a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 11.1.2 An Example: print-elements-of-list . . . . . . . . . . . . . . . . . . . . . . 109 11.1.3 A Loop with an Incrementing Counter . . . . . . . . . . . . . . . . . . . . . . . . 110 Example with incrementing counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 The parts of the function definition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Putting the function definition together . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 11.1.4 Loop with a Decrementing Counter . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Example with decrementing counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 The parts of the function definition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Putting the function definition together . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 11.2 Save your time: dolist and dotimes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 The dolist Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 The dotimes Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 11.3 Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 11.3.1 Building Robots: Extending the Metaphor . . . . . . . . . . . . . . . . . . . . 118 11.3.2 The Parts of a Recursive Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 11.3.3 Recursion with a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 11.3.4 Recursion in Place of a Counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 An argument of 3 or 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 11.3.5 Recursion Example Using cond . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 11.3.6 Recursive Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Recursive Pattern: every . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Recursive Pattern: accumulate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Recursive Pattern: keep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 11.3.7 Recursion without Deferments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 11.3.8 No Deferment Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 11.4 Looping Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 vi 12 Regular Expression Searches . . . . . . . . . . . . . . . . . . . . . . . . . . 131 12.1 The Regular Expression for sentence-end . . . . . . . . . . . . . . . . . . . . . . . . . 131 12.2 The re-search-forward Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 12.3 forward-sentence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 The while loops. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 The regular expression search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 12.4 forward-paragraph: a Goldmine of Functions . . . . . . . . . . . . . . . . . . . . . 137 The let* expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 The forward motion while loop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 12.5 Create Your Own TAGS File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 12.6 Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 12.7 Exercises with re-search-forward . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 13 Counting via Repetition and Regexps . . . . . . . . . . . . . . . . 146 13.1 The count-words-example Function. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 13.1.1 The Whitespace Bug in count-words-example . . . . . . . . . . . . . . . 149 13.2 Count Words Recursively . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 13.3 Exercise: Counting Punctuation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 14 Counting Words in a defun . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 14.1 What to Count? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 14.2 What Constitutes a Word or Symbol?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 14.3 The count-words-in-defun Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 14.4 Count Several defuns Within a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 14.5 Find a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 14.6 lengths-list-file in Detail. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 14.7 Count Words in defuns in Different Files . . . . . . . . . . . . . . . . . . . . . . . . . . 165 14.7.1 The append Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 14.8 Recursively Count Words in Different Files. . . . . . . . . . . . . . . . . . . . . . . . . 167 14.9 Prepare the Data for Display in a Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 14.9.1 Sorting Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 14.9.2 Making a List of Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 14.9.3 Counting function definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 15 Readying a Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 15.1 The graph-body-print Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 15.2 The recursive-graph-body-print Function . . . . . . . . . . . . . . . . . . . . . . 183 15.3 Need for Printed Axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 15.4 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 [...]... Arguments” in The GNU Emacs Manual If you are reading this in Info using GNU Emacs, you can read through this whole document just by pressing the space bar, SPC (To learn about Info, type C-h i and then select Info.) A note on terminology: when I use the word Lisp alone, I often am referring to the various dialects of Lisp in general, but when I speak of Emacs Lisp, I am referring to GNU Emacs Lisp in particular... is like having a dragon’s cave of treasures In addition to learning about Emacs as an editor and Emacs Lisp as a programming language, the examples and guided tours will give you an opportunity to get acquainted with Emacs as a Lisp programming environment GNU Emacs supports programming and provides tools that you will want to become comfortable using, such as M- (the key which invokes the find-tag command)... word.) Although Emacs Lisp is usually thought of in association only with Emacs, it is a full computer programming language You can use Emacs Lisp as you would any other programming language Perhaps you want to understand programming; perhaps you want to extend Emacs; or perhaps you want to become a programmer This introduction to Emacs Lisp is designed to get you started: to guide you in learning the fundamentals... environments GNU Emacs Lisp is largely inspired by Maclisp, which was written at MIT in the 1960s It is somewhat inspired by Common Lisp, which became a standard in the 1980s However, Emacs Lisp is much simpler than Common Lisp (The standard Emacs distribution contains an optional extensions file, cl.el, that adds many Common Lisp features to Emacs Lisp. ) A Note for Novices If you don’t know GNU Emacs, you... GNU Emacs integrated environment is written in the programming language called Emacs Lisp The code written in this programming language is the software—the sets of instructions—that tell the computer what to do when you give it commands Emacs is designed so that you can write new code in Emacs Lisp and easily install it as an extension to the editor (GNU Emacs is sometimes called an “extensible editor”,... the number of such paragraphs This book is intended as an approachable hill, rather than as a daunting mountain This introduction to Programming in Emacs Lisp has a companion document, The GNU Emacs Lisp Reference Manual The reference manual has more detail than this introduction In the reference manual, all the information about one topic is concentrated in one place You should turn to it if you are... without them.) 1.1.3 GNU Emacs Helps You Type Lists When you type a Lisp expression in GNU Emacs using either Lisp Interaction mode or Emacs Lisp mode, you have available to you several commands to format the Lisp expression so it is easy to read For example, pressing the TAB key automatically indents the line the cursor is on by the right amount A command to properly indent the code in a region is customarily... city in Massachusetts and have some information attached to the name as well, such as “great programming center” Another way to think about this is to imagine a symbol as being a chest of drawers The function definition is put in one drawer, the value in another, and so on What is put in the drawer holding the value can be changed without affecting the contents of the drawer holding the function definition,... evaluating the expression by putting the cursor at the beginning of the next line immediately following the expression, or inside the expression Here is another copy of the expression: (+ 2 (+ 3 3)) If you place the cursor at the beginning of the blank line that immediately follows the expression and type C-x C-e, you will still get the value 8 printed in the echo area Now try putting the cursor inside... will see (this is a quoted list) appear in the echo area In both cases, what you are doing is giving a command to the program inside of GNU Emacs called the Lisp interpreter—giving the interpreter a command to evaluate the expression The name of the Lisp interpreter comes from the word for the task done by a human who comes up with the meaning of an expression—who “interprets” it You can also evaluate . An Introduction to Programming in Emacs Lisp An Introduction to Programming in Emacs Lisp Revised Third Edition by Robert J. Chassell This is an Introduction to Programming in Emacs Lisp, . get acquainted with Emacs as a Lisp programming environment. GNU Emacs supports programming and provides tools that you will want to become comfortable using, such as M (the key which invokes the find-tag. daunting mountain. This introduction to Programming in Emacs Lisp has a companion document, The GNU Emacs Lisp Reference Manual. The reference manual has more detail than this introduction. In the reference