An Introduction to Programming in Emacs Lisp Most of the GNU Emacs integrated environment is written

  • View
    0

  • Download
    0

Embed Size (px)

Text of An Introduction to Programming in Emacs Lisp Most of the GNU Emacs integrated environment is written

  • An Introduction to

    Programming in Emacs Lisp

  • An Introduction to

    Programming in Emacs Lisp

    Second Edition

    by Robert J. Chassell

  • Copyright c© 1990, ’91, ’92, ’93, ’94, ’95, ’97, 2001 Free Software Foundation, Inc.

    Published by the Free Software Foundation, Inc. 59 Temple Place, Suite 330 Boston, MA 02111-1307 USA

    Edition 2.04, 2001 Dec 17

    ISBN-1882114-41-8

    Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Section being the Preface, with the Front-Cover Texts being no Front-Cover Texts, and with the Back-Cover Texts being no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”.

  • i

    Short Contents

    Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix 1 List Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 Practicing Evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3 How To Write Function Definitions . . . . . . . . . . . . . . . . . . 27 4 A Few Buffer–Related Functions . . . . . . . . . . . . . . . . . . . . 47 5 A Few More Complex Functions . . . . . . . . . . . . . . . . . . . . 57 6 Narrowing and Widening . . . . . . . . . . . . . . . . . . . . . . . . . 69 7 car, cdr, cons: Fundamental Functions . . . . . . . . . . . . . 73 8 Cutting and Storing Text . . . . . . . . . . . . . . . . . . . . . . . . . 81 9 How Lists are Implemented . . . . . . . . . . . . . . . . . . . . . . . 103 10 Yanking Text Back . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 11 Loops and Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 12 Regular Expression Searches . . . . . . . . . . . . . . . . . . . . . . 135 13 Counting: Repetition and Regexps . . . . . . . . . . . . . . . . . . 151 14 Counting Words in a defun . . . . . . . . . . . . . . . . . . . . . . 163 15 Readying a Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 16 Your ‘.emacs’ File . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 17 Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 18 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 Appendix A The the-the Function . . . . . . . . . . . . . . . . . . 217 Appendix B Handling the Kill Ring . . . . . . . . . . . . . . . . . . . 219 Appendix C A Graph with Labelled Axes . . . . . . . . . . . . . . . 229 Appendix D GNU Free Documentation License . . . . . . . . . . . 251 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

  • ii

  • iii

    Table of Contents

    Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix On Reading this Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix For Whom This is Written . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x Lisp History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi A Note for Novices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi Thank You . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii

    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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    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 . . . . . . . . . . . . . . . . . . . . . . . . 12 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 . . . . . . . . . . . . . . . . . . . . . . . . . 15

    1.9 Setting the Value of a Variable . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9.1 Using set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9.2 Using setq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.9.3 Counting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

    1.10 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    2 Practicing Evaluation . . . . . . . . . . . . . . . . . . . . . 21 2.1 Buffer Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.2 Getting Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.3 Switching Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.4 Buffer Size and the Location of Point . . . . . . . . . . . . . . . . . . . . 25 2.5 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

  • iv

    3 How To Write Function Definitions . . . . . . . . 27 3.1 The defun Special Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 Install a Function Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    3.2.1 Change a Function Definition . . . . . . . . . . . . . . . . . . . 30 3.3 Make a Function Interactive . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    3.3.1 An Interactive multiply-by-seven . . . . . . . . . . . . . 31 3.4 Different Options for interactive . . . . . . . . . . . . . . . . . . . . . . 32 3.5 Install Code Permanently . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.6 let . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    3.6.1 The Parts of a let Expression . . . . . . . . . . . . . . . . . . 35 3.6.2 Sample let Expression . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.6.3 Uninitialized Variables in a let Statement . . . . . . . 36

    3.7 The if Special Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.7.1 The type-of-animal Function in Detail . . . . . . . . . 38

    3.8 If–then–else Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.9 Truth and Falsehood in Emacs Lisp . . . . . . . . . . . . . . . . . . . . . 40 3.10 save-excursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    3.10.1 Template for a save-excursion Expression . . . . 42 3.11 Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.12 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    4 A Few Buffer–Related Functions . . . . . . . . . . . 47 4.1 Finding More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.2 A Simplified beginning-of-buffer Definition . . . . . . . . . . . . 48 4.3 The Definition of mark-whole-buffer . . . . . . . . . . . . . . . . . . . 50

    4.3.1 Body of mark-whole-buffer . . . . . . . . . . . . . . . . . . . 50 4.4 The Definition of append-to-buffer . . . . . . . . . . . . . . . . . . . . 51

    4.4.1 The append-to-buffer Interactive Expression . . . 52 4.4.2 The Body of append-to-buffer . . . . . . . . . . . . . . . . 52 4.4.3 save-excursion in append-to-buffer . . . . . . . . . . 53

    4.5 Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.6 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    5 A Few More Complex Functions . . . . . . . . . . . 57 5.1 The Definition of copy-to-buffer. . . . . . . . . . . . . . . . . . . . . . . 57 5.2 The Definition of insert-buffer . . . . . . . . . . . . . . . . . . . . . . . . 58

    5.2.1 The Interactive Expression in insert-buffer . . . . 58 A Read-only Buffer. . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 ‘b’ in an Interactive Expression . . . . . . . . . . . . . . . . . 59

    5.2.2 The Body of the insert-buffer Function . . . . . . . 59 5.2.3 insert-buffer With an if Instead of an or . . . . . 59 5.2.4 The or in the Body . . . . . . . . . . . . . . . . . . . . . . . .