This is the GNU Emacs Lisp Reference Manual corresponding to Emacs version 24.5.
Copyright © 1990–1996, 1998–2015 Free Software Foundation, Inc.
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; with the Invariant Sections being “GNU General Public License,” 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.”
Published by the Free Software Foundation
51 Franklin St, Fifth Floor
Boston, MA 02110-1301
USA
ISBN 1-882114-74-4
Cover art by Etienne Suvasa.
[ < ] | [ > ] | [Contents] | [Index] | [ ? ] |
This is the GNU Emacs Lisp Reference Manual corresponding to Emacs version 24.5.
Copyright © 1990–1996, 1998–2015 Free Software Foundation, Inc.
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; with the Invariant Sections being “GNU General Public License,” 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.”
1 Introduction | Introduction and conventions used. | |
2 Lisp Data Types | Data types of objects in Emacs Lisp. | |
3 Numbers | Numbers and arithmetic functions. | |
4 Strings and Characters | Strings, and functions that work on them. | |
5 Lists | Lists, cons cells, and related functions. | |
6 Sequences, Arrays, and Vectors | Lists, strings and vectors are called sequences. Certain functions act on any kind of sequence. The description of vectors is here as well. | |
7 Hash Tables | Very fast lookup-tables. | |
8 Symbols | Symbols represent names, uniquely. | |
9 Evaluation | How Lisp expressions are evaluated. | |
10 Control Structures | Conditionals, loops, nonlocal exits. | |
11 Variables | Using symbols in programs to stand for values. | |
12 Functions | A function is a Lisp program that can be invoked from other functions. | |
13 Macros | Macros are a way to extend the Lisp language. | |
14 Customization Settings | Making variables and faces customizable. | |
15 Loading | Reading files of Lisp code into Lisp. | |
16 Byte Compilation | Compilation makes programs run faster. | |
17 Debugging Lisp Programs | Tools and tips for debugging Lisp programs. | |
18 Reading and Printing Lisp Objects | Converting Lisp objects to text and back. | |
19 Minibuffers | Using the minibuffer to read input. | |
20 Command Loop | How the editor command loop works, and how you can call its subroutines. | |
21 Keymaps | Defining the bindings from keys to commands. | |
22 Major and Minor Modes | Defining major and minor modes. | |
23 Documentation | Writing and using documentation strings. | |
24 Files | Accessing files. | |
25 Backups and Auto-Saving | Controlling how backups and auto-save files are made. | |
26 Buffers | Creating and using buffer objects. | |
27 Windows | Manipulating windows and displaying buffers. | |
28 Frames | Making multiple system-level windows. | |
29 Positions | Buffer positions and motion functions. | |
30 Markers | Markers represent positions and update automatically when the text is changed. | |
31 Text | Examining and changing text in buffers. | |
32 Non-ASCII Characters | Non-ASCII text in buffers and strings. | |
33 Searching and Matching | Searching buffers for strings or regexps. | |
34 Syntax Tables | The syntax table controls word and list parsing. | |
35 Abbrevs and Abbrev Expansion | How Abbrev mode works, and its data structures. | |
36 Processes | Running and communicating with subprocesses. | |
37 Emacs Display | Features for controlling the screen display. | |
38 Operating System Interface | Getting the user id, system type, environment variables, and other such things. | |
39 Preparing Lisp code for distribution | ||
Appendices | ||
Appendix A Emacs 23 Antinews | Info for users downgrading to Emacs 23. | |
Appendix B GNU Free Documentation License | The license for this documentation. | |
Appendix C GNU General Public License | Conditions for copying and changing GNU Emacs. | |
Appendix D Tips and Conventions | Advice and coding conventions for Emacs Lisp. | |
Appendix E GNU Emacs Internals | Building and dumping Emacs; internal data structures. | |
Appendix F Standard Errors | List of some standard error symbols. | |
Appendix G Standard Keymaps | List of some standard keymaps. | |
Appendix H Standard Hooks | List of some standard hook variables. | |
Index | Index including concepts, functions, variables, and other terms. | |
— The Detailed Node Listing — ——————————— Here are other nodes that are subnodes of those already listed, mentioned here so you can get to them in one step: Introduction | ||
1.1 Caveats | Flaws and a request for help. | |
1.2 Lisp History | Emacs Lisp is descended from Maclisp. | |
1.3 Conventions | How the manual is formatted. | |
1.4 Version Information | Which Emacs version is running? | |
1.5 Acknowledgments | The authors, editors, and sponsors of this manual. | |
Conventions | ||
1.3.1 Some Terms | Explanation of terms we use in this manual. | |
1.3.2 nil and t | How the symbols nil and t are used.
| |
1.3.3 Evaluation Notation | The format we use for examples of evaluation. | |
1.3.4 Printing Notation | The format we use when examples print text. | |
1.3.5 Error Messages | The format we use for examples of errors. | |
1.3.6 Buffer Text Notation | The format we use for buffer contents in examples. | |
1.3.7 Format of Descriptions | Notation for describing functions, variables, etc. | |
Format of Descriptions | ||
1.3.7.1 A Sample Function Description | A description of an imaginary
function, foo .
| |
1.3.7.2 A Sample Variable Description | A description of an imaginary
variable, electric-future-map .
| |
Lisp Data Types | ||
2.1 Printed Representation and Read Syntax | How Lisp objects are represented as text. | |
2.2 Comments | Comments and their formatting conventions. | |
2.3 Programming Types | Types found in all Lisp systems. | |
2.4 Editing Types | Types specific to Emacs. | |
2.5 Read Syntax for Circular Objects | Read syntax for circular structure. | |
2.6 Type Predicates | Tests related to types. | |
2.7 Equality Predicates | Tests of equality between any two objects. | |
Programming Types | ||
2.3.1 Integer Type | Numbers without fractional parts. | |
2.3.2 Floating-Point Type | Numbers with fractional parts and with a large range. | |
2.3.3 Character Type | The representation of letters, numbers and control characters. | |
2.3.4 Symbol Type | A multi-use object that refers to a function, variable, or property list, and has a unique identity. | |
2.3.5 Sequence Types | Both lists and arrays are classified as sequences. | |
2.3.6 Cons Cell and List Types | Cons cells, and lists (which are made from cons cells). | |
2.3.7 Array Type | Arrays include strings and vectors. | |
2.3.8 String Type | An (efficient) array of characters. | |
2.3.9 Vector Type | One-dimensional arrays. | |
2.3.10 Char-Table Type | One-dimensional sparse arrays indexed by characters. | |
2.3.11 Bool-Vector Type | One-dimensional arrays of t or nil .
| |
2.3.12 Hash Table Type | Super-fast lookup tables. | |
2.3.13 Function Type | A piece of executable code you can call from elsewhere. | |
2.3.14 Macro Type | A method of expanding an expression into another expression, more fundamental but less pretty. | |
2.3.15 Primitive Function Type | A function written in C, callable from Lisp. | |
2.3.16 Byte-Code Function Type | A function written in Lisp, then compiled. | |
2.3.17 Autoload Type | A type used for automatically loading seldom-used functions. | |
Character Type | ||
2.3.3.1 Basic Char Syntax | Syntax for regular characters. | |
2.3.3.2 General Escape Syntax | How to specify characters by their codes. | |
2.3.3.3 Control-Character Syntax | Syntax for control characters. | |
2.3.3.4 Meta-Character Syntax | Syntax for meta-characters. | |
2.3.3.5 Other Character Modifier Bits | Syntax for hyper-, super-, and alt-characters. | |
Cons Cell and List Types | ||
2.3.6.1 Drawing Lists as Box Diagrams | Drawing pictures of lists. | |
2.3.6.2 Dotted Pair Notation | A general syntax for cons cells. | |
2.3.6.3 Association List Type | A specially constructed list. | |
String Type | ||
2.3.8.1 Syntax for Strings | How to specify Lisp strings. | |
2.3.8.2 Non-ASCII Characters in Strings | International characters in strings. | |
2.3.8.3 Nonprinting Characters in Strings | Literal unprintable characters in strings. | |
2.3.8.4 Text Properties in Strings | Strings with text properties. | |
Editing Types | ||
2.4.1 Buffer Type | The basic object of editing. | |
2.4.2 Marker Type | A position in a buffer. | |
2.4.3 Window Type | Buffers are displayed in windows. | |
2.4.4 Frame Type | Windows subdivide frames. | |
2.4.5 Terminal Type | A terminal device displays frames. | |
2.4.6 Window Configuration Type | Recording the way a frame is subdivided. | |
2.4.7 Frame Configuration Type | Recording the status of all frames. | |
2.4.8 Process Type | A subprocess of Emacs running on the underlying OS. | |
2.4.9 Stream Type | Receive or send characters. | |
2.4.10 Keymap Type | What function a keystroke invokes. | |
2.4.11 Overlay Type | How an overlay is represented. | |
2.4.12 Font Type | Fonts for displaying text. | |
Numbers | ||
3.1 Integer Basics | Representation and range of integers. | |
3.2 Floating-Point Basics | Representation and range of floating point. | |
3.3 Type Predicates for Numbers | Testing for numbers. | |
3.4 Comparison of Numbers | Equality and inequality predicates. | |
3.5 Numeric Conversions | Converting float to integer and vice versa. | |
3.6 Arithmetic Operations | How to add, subtract, multiply and divide. | |
3.7 Rounding Operations | Explicitly rounding floating-point numbers. | |
3.8 Bitwise Operations on Integers | Logical and, or, not, shifting. | |
3.9 Standard Mathematical Functions | Trig, exponential and logarithmic functions. | |
3.10 Random Numbers | Obtaining random integers, predictable or not. | |
Strings and Characters | ||
4.1 String and Character Basics | Basic properties of strings and characters. | |
4.2 Predicates for Strings | Testing whether an object is a string or char. | |
4.3 Creating Strings | Functions to allocate new strings. | |
4.4 Modifying Strings | Altering the contents of an existing string. | |
4.5 Comparison of Characters and Strings | Comparing characters or strings. | |
4.6 Conversion of Characters and Strings | Converting to and from characters and strings. | |
4.7 Formatting Strings | format : Emacs’s analogue of printf .
| |
4.8 Case Conversion in Lisp | Case conversion functions. | |
4.9 The Case Table | Customizing case conversion. | |
Lists | ||
5.1 Lists and Cons Cells | How lists are made out of cons cells. | |
5.2 Predicates on Lists | Is this object a list? Comparing two lists. | |
5.3 Accessing Elements of Lists | Extracting the pieces of a list. | |
5.4 Building Cons Cells and Lists | Creating list structure. | |
5.5 Modifying List Variables | Modifying lists stored in variables. | |
5.6 Modifying Existing List Structure | Storing new pieces into an existing list. | |
5.7 Using Lists as Sets | A list can represent a finite mathematical set. | |
5.8 Association Lists | A list can represent a finite relation or mapping. | |
5.9 Property Lists | A list of paired elements. | |
Modifying Existing List Structure | ||
5.6.1 Altering List Elements with setcar | Replacing an element in a list. | |
5.6.2 Altering the CDR of a List | Replacing part of the list backbone. This can be used to remove or add elements. | |
5.6.3 Functions that Rearrange Lists | Reordering the elements in a list; combining lists. | |
Property Lists | ||
5.9.1 Property Lists and Association Lists | Comparison of the advantages of property lists and association lists. | |
5.9.2 Property Lists Outside Symbols | Accessing property lists stored elsewhere. | |
Sequences, Arrays, and Vectors | ||
6.1 Sequences | Functions that accept any kind of sequence. | |
6.2 Arrays | Characteristics of arrays in Emacs Lisp. | |
6.3 Functions that Operate on Arrays | Functions specifically for arrays. | |
6.4 Vectors | Special characteristics of Emacs Lisp vectors. | |
6.5 Functions for Vectors | Functions specifically for vectors. | |
6.6 Char-Tables | How to work with char-tables. | |
6.7 Bool-vectors | How to work with bool-vectors. | |
6.8 Managing a Fixed-Size Ring of Objects | Managing a fixed-size ring of objects. | |
Hash Tables | ||
7.1 Creating Hash Tables | Functions to create hash tables. | |
7.2 Hash Table Access | Reading and writing the hash table contents. | |
7.3 Defining Hash Comparisons | Defining new comparison methods. | |
7.4 Other Hash Table Functions | Miscellaneous. | |
Symbols | ||
8.1 Symbol Components | Symbols have names, values, function definitions and property lists. | |
8.2 Defining Symbols | A definition says how a symbol will be used. | |
8.3 Creating and Interning Symbols | How symbols are kept unique. | |
8.4 Symbol Properties | Each symbol has a property list for recording miscellaneous information. | |
Symbol Properties | ||
8.4.1 Accessing Symbol Properties | Accessing symbol properties. | |
8.4.2 Standard Symbol Properties | Standard meanings of symbol properties. | |
Evaluation | ||
9.1 Introduction to Evaluation | Evaluation in the scheme of things. | |
9.2 Kinds of Forms | How various sorts of objects are evaluated. | |
9.3 Quoting | Avoiding evaluation (to put constants in the program). | |
9.4 Backquote | Easier construction of list structure. | |
9.5 Eval | How to invoke the Lisp interpreter explicitly. | |
Kinds of Forms | ||
9.2.1 Self-Evaluating Forms | Forms that evaluate to themselves. | |
9.2.2 Symbol Forms | Symbols evaluate as variables. | |
9.2.3 Classification of List Forms | How to distinguish various sorts of list forms. | |
9.2.4 Symbol Function Indirection | When a symbol appears as the car of a list, we find the real function via the symbol. | |
9.2.5 Evaluation of Function Forms | Forms that call functions. | |
9.2.6 Lisp Macro Evaluation | Forms that call macros. | |
9.2.7 Special Forms | "Special forms" are idiosyncratic primitives, most of them extremely important. | |
9.2.8 Autoloading | Functions set up to load files containing their real definitions. | |
Control Structures | ||
10.1 Sequencing | Evaluation in textual order. | |
10.2 Conditionals | if , cond , when , unless .
| |
10.3 Constructs for Combining Conditions | and , or , not .
| |
10.4 Iteration | while loops.
| |
10.5 Nonlocal Exits | Jumping out of a sequence. | |
Nonlocal Exits | ||
10.5.1 Explicit Nonlocal Exits: catch and throw | Nonlocal exits for the program’s own purposes. | |
10.5.2 Examples of catch and throw | Showing how such nonlocal exits can be written. | |
10.5.3 Errors | How errors are signaled and handled. | |
10.5.4 Cleaning Up from Nonlocal Exits | Arranging to run a cleanup form if an error happens. | |
Errors | ||
10.5.3.1 How to Signal an Error | How to report an error. | |
10.5.3.2 How Emacs Processes Errors | What Emacs does when you report an error. | |
10.5.3.3 Writing Code to Handle Errors | How you can trap errors and continue execution. | |
10.5.3.4 Error Symbols and Condition Names | How errors are classified for trapping them. | |
Variables | ||
11.1 Global Variables | Variable values that exist permanently, everywhere. | |
11.2 Variables that Never Change | Certain "variables" have values that never change. | |
11.3 Local Variables | Variable values that exist only temporarily. | |
11.4 When a Variable is “Void” | Symbols that lack values. | |
11.5 Defining Global Variables | A definition says a symbol is used as a variable. | |
11.6 Tips for Defining Variables Robustly | Things you should think about when you define a variable. | |
11.7 Accessing Variable Values | Examining values of variables whose names are known only at run time. | |
11.8 Setting Variable Values | Storing new values in variables. | |
11.9 Scoping Rules for Variable Bindings | How Lisp chooses among local and global values. | |
11.10 Buffer-Local Variables | Variable values in effect only in one buffer. | |
11.11 File Local Variables | Handling local variable lists in files. | |
11.12 Directory Local Variables | Local variables common to all files in a directory. | |
11.13 Variable Aliases | Variables that are aliases for other variables. | |
11.14 Variables with Restricted Values | Non-constant variables whose value can not be an arbitrary Lisp object. | |
11.15 Generalized Variables | Extending the concept of variables. | |
Scoping Rules for Variable Bindings | ||
11.9.1 Dynamic Binding | The default for binding local variables in Emacs. | |
11.9.2 Proper Use of Dynamic Binding | Avoiding problems with dynamic binding. | |
11.9.3 Lexical Binding | A different type of local variable binding. | |
11.9.4 Using Lexical Binding | How to enable lexical binding. | |
Buffer-Local Variables | ||
11.10.1 Introduction to Buffer-Local Variables | Introduction and concepts. | |
11.10.2 Creating and Deleting Buffer-Local Bindings | Creating and destroying buffer-local bindings. | |
11.10.3 The Default Value of a Buffer-Local Variable | The default value is seen in buffers that don’t have their own buffer-local values. | |
Generalized Variables | ||
11.15.1 The setf Macro | The setf macro.
| |
11.15.2 Defining new setf forms | ||
Functions | ||
12.1 What Is a Function? | Lisp functions vs. primitives; terminology. | |
12.2 Lambda Expressions | How functions are expressed as Lisp objects. | |
12.3 Naming a Function | A symbol can serve as the name of a function. | |
12.4 Defining Functions | Lisp expressions for defining functions. | |
12.5 Calling Functions | How to use an existing function. | |
12.6 Mapping Functions | Applying a function to each element of a list, etc. | |
12.7 Anonymous Functions | Lambda expressions are functions with no names. | |
12.8 Accessing Function Cell Contents | Accessing or setting the function definition of a symbol. | |
12.9 Closures | Functions that enclose a lexical environment. | |
12.11 Declaring Functions Obsolete | Declaring functions obsolete. | |
12.12 Inline Functions | Defining functions that the compiler will expand inline. | |
12.13 The declare Form | Adding additional information about a function. | |
12.14 Telling the Compiler that a Function is Defined | Telling the compiler that a function is defined. | |
12.15 Determining whether a Function is Safe to Call | Determining whether a function is safe to call. | |
12.16 Other Topics Related to Functions | Cross-references to specific Lisp primitives that have a special bearing on how functions work. | |
Lambda Expressions | ||
12.2.1 Components of a Lambda Expression | The parts of a lambda expression. | |
12.2.2 A Simple Lambda Expression Example | A simple example. | |
12.2.3 Other Features of Argument Lists | Details and special features of argument lists. | |
12.2.4 Documentation Strings of Functions | How to put documentation in a function. | |
Macros | ||
13.1 A Simple Example of a Macro | A basic example. | |
13.2 Expansion of a Macro Call | How, when and why macros are expanded. | |
13.3 Macros and Byte Compilation | How macros are expanded by the compiler. | |
13.4 Defining Macros | How to write a macro definition. | |
13.5 Common Problems Using Macros | Don’t evaluate the macro arguments too many times. Don’t hide the user’s variables. | |
13.6 Indenting Macros | Specifying how to indent macro calls. | |
Common Problems Using Macros | ||
13.5.1 Wrong Time | Do the work in the expansion, not in the macro. | |
13.5.2 Evaluating Macro Arguments Repeatedly | The expansion should evaluate each macro arg once. | |
13.5.3 Local Variables in Macro Expansions | Local variable bindings in the expansion require special care. | |
13.5.4 Evaluating Macro Arguments in Expansion | Don’t evaluate them; put them in the expansion. | |
13.5.5 How Many Times is the Macro Expanded? | Avoid depending on how many times expansion is done. | |
Customization Settings | ||
14.1 Common Item Keywords | Common keyword arguments for all kinds of customization declarations. | |
14.2 Defining Customization Groups | Writing customization group definitions. | |
14.3 Defining Customization Variables | Declaring user options. | |
14.4 Customization Types | Specifying the type of a user option. | |
14.5 Applying Customizations | Functions to apply customization settings. | |
14.6 Custom Themes | Writing Custom themes. | |
Customization Types | ||
14.4.1 Simple Types | Simple customization types: sexp, integer, etc. | |
14.4.2 Composite Types | Build new types from other types or data. | |
14.4.3 Splicing into Lists | Splice elements into list with :inline .
| |
14.4.4 Type Keywords | Keyword-argument pairs in a customization type. | |
14.4.5 Defining New Types | Give your type a name. | |
Loading | ||
15.1 How Programs Do Loading | The load function and others.
| |
15.2 Load Suffixes | Details about the suffixes that load tries.
| |
15.3 Library Search | Finding a library to load. | |
15.4 Loading Non-ASCII Characters | Non-ASCII characters in Emacs Lisp files. | |
15.5 Autoload | Setting up a function to autoload. | |
15.6 Repeated Loading | Precautions about loading a file twice. | |
15.7 Features | Loading a library if it isn’t already loaded. | |
15.8 Which File Defined a Certain Symbol | Finding which file defined a certain symbol. | |
15.9 Unloading | How to "unload" a library that was loaded. | |
15.10 Hooks for Loading | Providing code to be run when particular libraries are loaded. | |
Byte Compilation | ||
16.1 Performance of Byte-Compiled Code | An example of speedup from byte compilation. | |
16.2 Byte-Compilation Functions | Byte compilation functions. | |
16.3 Documentation Strings and Compilation | Dynamic loading of documentation strings. | |
16.4 Dynamic Loading of Individual Functions | Dynamic loading of individual functions. | |
16.5 Evaluation During Compilation | Code to be evaluated when you compile. | |
16.6 Compiler Errors | Handling compiler error messages. | |
16.7 Byte-Code Function Objects | The data type used for byte-compiled functions. | |
16.8 Disassembled Byte-Code | Disassembling byte-code; how to read byte-code. | |
Debugging Lisp Programs | ||
17.1 The Lisp Debugger | A debugger for the Emacs Lisp evaluator. | |
17.2 Edebug | A source-level Emacs Lisp debugger. | |
17.3 Debugging Invalid Lisp Syntax | How to find syntax errors. | |
17.4 Test Coverage | Ensuring you have tested all branches in your code. | |
17.5 Profiling | Measuring the resources that your code uses. | |
The Lisp Debugger | ||
17.1.1 Entering the Debugger on an Error | Entering the debugger when an error happens. | |
17.1.2 Debugging Infinite Loops | Stopping and debugging a program that doesn’t exit. | |
17.1.3 Entering the Debugger on a Function Call | Entering it when a certain function is called. | |
17.1.4 Explicit Entry to the Debugger | Entering it at a certain point in the program. | |
17.1.5 Using the Debugger | What the debugger does; what you see while in it. | |
17.1.6 Debugger Commands | Commands used while in the debugger. | |
17.1.7 Invoking the Debugger | How to call the function debug .
| |
17.1.8 Internals of the Debugger | Subroutines of the debugger, and global variables. | |
Edebug | ||
17.2.1 Using Edebug | Introduction to use of Edebug. | |
17.2.2 Instrumenting for Edebug | You must instrument your code in order to debug it with Edebug. | |
17.2.3 Edebug Execution Modes | Execution modes, stopping more or less often. | |
17.2.4 Jumping | Commands to jump to a specified place. | |
17.2.5 Miscellaneous Edebug Commands | Miscellaneous commands. | |
17.2.6 Breaks | Setting breakpoints to make the program stop. | |
17.2.7 Trapping Errors | Trapping errors with Edebug. | |
17.2.8 Edebug Views | Views inside and outside of Edebug. | |
17.2.9 Evaluation | Evaluating expressions within Edebug. | |
17.2.10 Evaluation List Buffer | Expressions whose values are displayed each time you enter Edebug. | |
17.2.11 Printing in Edebug | Customization of printing. | |
17.2.12 Trace Buffer | How to produce trace output in a buffer. | |
17.2.13 Coverage Testing | How to test evaluation coverage. | |
17.2.14 The Outside Context | Data that Edebug saves and restores. | |
17.2.15 Edebug and Macros | Specifying how to handle macro calls. | |
17.2.16 Edebug Options | Option variables for customizing Edebug. | |
Breaks | ||
17.2.6.1 Edebug Breakpoints | Breakpoints at stop points. | |
17.2.6.2 Global Break Condition | Breaking on an event. | |
17.2.6.3 Source Breakpoints | Embedding breakpoints in source code. | |
The Outside Context | ||
17.2.14.1 Checking Whether to Stop | When Edebug decides what to do. | |
17.2.14.2 Edebug Display Update | When Edebug updates the display. | |
17.2.14.3 Edebug Recursive Edit | When Edebug stops execution. | |
Edebug and Macros | ||
17.2.15.1 Instrumenting Macro Calls | The basic problem. | |
17.2.15.2 Specification List | How to specify complex patterns of evaluation. | |
17.2.15.3 Backtracking in Specifications | What Edebug does when matching fails. | |
17.2.15.4 Specification Examples | To help understand specifications. | |
Debugging Invalid Lisp Syntax | ||
17.3.1 Excess Open Parentheses | How to find a spurious open paren or missing close. | |
17.3.2 Excess Close Parentheses | How to find a spurious close paren or missing open. | |
Reading and Printing Lisp Objects | ||
18.1 Introduction to Reading and Printing | Overview of streams, reading and printing. | |
18.2 Input Streams | Various data types that can be used as input streams. | |
18.3 Input Functions | Functions to read Lisp objects from text. | |
18.4 Output Streams | Various data types that can be used as output streams. | |
18.5 Output Functions | Functions to print Lisp objects as text. | |
18.6 Variables Affecting Output | Variables that control what the printing functions do. | |
Minibuffers | ||
19.1 Introduction to Minibuffers | Basic information about minibuffers. | |
19.2 Reading Text Strings with the Minibuffer | How to read a straight text string. | |
19.3 Reading Lisp Objects with the Minibuffer | How to read a Lisp object or expression. | |
19.4 Minibuffer History | Recording previous minibuffer inputs so the user can reuse them. | |
19.5 Initial Input | Specifying initial contents for the minibuffer. | |
19.6 Completion | How to invoke and customize completion. | |
19.7 Yes-or-No Queries | Asking a question with a simple answer. | |
19.8 Asking Multiple Y-or-N Questions | Asking a series of similar questions. | |
19.9 Reading a Password | Reading a password from the terminal. | |
19.10 Minibuffer Commands | Commands used as key bindings in minibuffers. | |
19.11 Minibuffer Windows | Operating on the special minibuffer windows. | |
19.12 Minibuffer Contents | How such commands access the minibuffer text. | |
19.13 Recursive Minibuffers | Whether recursive entry to minibuffer is allowed. | |
19.14 Minibuffer Miscellany | Various customization hooks and variables. | |
Completion | ||
19.6.1 Basic Completion Functions | Low-level functions for completing strings. | |
19.6.2 Completion and the Minibuffer | Invoking the minibuffer with completion. | |
19.6.3 Minibuffer Commands that Do Completion | Minibuffer commands that do completion. | |
19.6.4 High-Level Completion Functions | Convenient special cases of completion (reading buffer names, variable names, etc.). | |
19.6.5 Reading File Names | Using completion to read file names and shell commands. | |
19.6.6 Completion Variables | Variables controlling completion behavior. | |
19.6.7 Programmed Completion | Writing your own completion function. | |
19.6.8 Completion in Ordinary Buffers | Completing text in ordinary buffers. | |
Command Loop | ||
20.1 Command Loop Overview | How the command loop reads commands. | |
20.2 Defining Commands | Specifying how a function should read arguments. | |
20.3 Interactive Call | Calling a command, so that it will read arguments. | |
20.4 Distinguish Interactive Calls | Making a command distinguish interactive calls. | |
20.5 Information from the Command Loop | Variables set by the command loop for you to examine. | |
20.6 Adjusting Point After Commands | Adjustment of point after a command. | |
20.7 Input Events | What input looks like when you read it. | |
20.8 Reading Input | How to read input events from the keyboard or mouse. | |
20.9 Special Events | Events processed immediately and individually. | |
20.10 Waiting for Elapsed Time or Input | Waiting for user input or elapsed time. | |
20.11 Quitting | How C-g works. How to catch or defer quitting. | |
20.12 Prefix Command Arguments | How the commands to set prefix args work. | |
20.13 Recursive Editing | Entering a recursive edit, and why you usually shouldn’t. | |
20.14 Disabling Commands | How the command loop handles disabled commands. | |
20.15 Command History | How the command history is set up, and how accessed. | |
20.16 Keyboard Macros | How keyboard macros are implemented. | |
Defining Commands | ||
20.2.1 Using interactive | General rules for interactive .
| |
20.2.2 Code Characters for interactive | The standard letter-codes for reading arguments in various ways. | |
20.2.3 Examples of Using interactive | Examples of how to read interactive arguments. | |
20.2.4 Select among Command Alternatives | Select among command alternatives. | |
Input Events | ||
20.7.1 Keyboard Events | Ordinary characters–keys with symbols on them. | |
20.7.2 Function Keys | Function keys–keys with names, not symbols. | |
20.7.3 Mouse Events | Overview of mouse events. | |
20.7.4 Click Events | Pushing and releasing a mouse button. | |
20.7.5 Drag Events | Moving the mouse before releasing the button. | |
20.7.6 Button-Down Events | A button was pushed and not yet released. | |
20.7.7 Repeat Events | Double and triple click (or drag, or down). | |
20.7.8 Motion Events | Just moving the mouse, not pushing a button. | |
20.7.9 Focus Events | Moving the mouse between frames. | |
20.7.10 Miscellaneous System Events | Other events the system can generate. | |
20.7.11 Event Examples | Examples of the lists for mouse events. | |
20.7.12 Classifying Events | Finding the modifier keys in an event symbol. Event types. | |
20.7.13 Accessing Mouse Events | Functions to extract info from mouse events. | |
20.7.14 Accessing Scroll Bar Events | Functions to get info from scroll bar events. | |
20.7.15 Putting Keyboard Events in Strings | Special considerations for putting keyboard character events in a string. | |
Reading Input | ||
20.8.1 Key Sequence Input | How to read one key sequence. | |
20.8.2 Reading One Event | How to read just one event. | |
20.8.3 Modifying and Translating Input Events | How Emacs modifies events as they are read. | |
20.8.4 Invoking the Input Method | How reading an event uses the input method. | |
20.8.5 Quoted Character Input | Asking the user to specify a character. | |
20.8.6 Miscellaneous Event Input Features | How to reread or throw away input events. | |
Keymaps | ||
21.1 Key Sequences | Key sequences as Lisp objects. | |
21.2 Keymap Basics | Basic concepts of keymaps. | |
21.3 Format of Keymaps | What a keymap looks like as a Lisp object. | |
21.4 Creating Keymaps | Functions to create and copy keymaps. | |
21.5 Inheritance and Keymaps | How one keymap can inherit the bindings of another keymap. | |
21.6 Prefix Keys | Defining a key with a keymap as its definition. | |
21.7 Active Keymaps | How Emacs searches the active keymaps for a key binding. | |
21.8 Searching the Active Keymaps | A pseudo-Lisp summary of searching active maps. | |
21.9 Controlling the Active Keymaps | Each buffer has a local keymap to override the standard (global) bindings. A minor mode can also override them. | |
21.10 Key Lookup | Finding a key’s binding in one keymap. | |
21.11 Functions for Key Lookup | How to request key lookup. | |
21.12 Changing Key Bindings | Redefining a key in a keymap. | |
21.13 Remapping Commands | A keymap can translate one command to another. | |
21.14 Keymaps for Translating Sequences of Events | Keymaps for translating sequences of events. | |
21.15 Commands for Binding Keys | Interactive interfaces for redefining keys. | |
21.16 Scanning Keymaps | Looking through all keymaps, for printing help. | |
21.17 Menu Keymaps | Defining a menu as a keymap. | |
Menu Keymaps | ||
21.17.1 Defining Menus | How to make a keymap that defines a menu. | |
21.17.2 Menus and the Mouse | How users actuate the menu with the mouse. | |
21.17.3 Menus and the Keyboard | How users actuate the menu with the keyboard. | |
21.17.4 Menu Example | Making a simple menu. | |
21.17.5 The Menu Bar | How to customize the menu bar. | |
21.17.6 Tool bars | A tool bar is a row of images. | |
21.17.7 Modifying Menus | How to add new items to a menu. | |
21.17.8 Easy Menu | A convenience macro for defining menus. | |
Defining Menus | ||
21.17.1.1 Simple Menu Items | A simple kind of menu key binding. | |
21.17.1.2 Extended Menu Items | More complex menu item definitions. | |
21.17.1.3 Menu Separators | Drawing a horizontal line through a menu. | |
21.17.1.4 Alias Menu Items | Using command aliases in menu items. | |
Major and Minor Modes | ||
22.1 Hooks | How to use hooks; how to write code that provides hooks. | |
22.2 Major Modes | Defining major modes. | |
22.3 Minor Modes | Defining minor modes. | |
22.4 Mode Line Format | Customizing the text that appears in the mode line. | |
22.5 Imenu | Providing a menu of definitions made in a buffer. | |
22.6 Font Lock Mode | How modes can highlight text according to syntax. | |
22.7 Automatic Indentation of code | How to teach Emacs to indent for a major mode. | |
22.8 Desktop Save Mode | How modes can have buffer state saved between Emacs sessions. | |
Hooks | ||
22.1.1 Running Hooks | How to run a hook. | |
22.1.2 Setting Hooks | How to put functions on a hook, or remove them. | |
Major Modes | ||
22.2.1 Major Mode Conventions | Coding conventions for keymaps, etc. | |
22.2.2 How Emacs Chooses a Major Mode | How Emacs chooses the major mode automatically. | |
22.2.3 Getting Help about a Major Mode | Finding out how to use a mode. | |
22.2.4 Defining Derived Modes | Defining a new major mode based on another major mode. | |
22.2.5 Basic Major Modes | Modes that other modes are often derived from. | |
22.2.6 Mode Hooks | Hooks run at the end of major mode functions. | |
22.2.7 Tabulated List mode | Parent mode for buffers containing tabulated data. | |
22.2.8 Generic Modes | Defining a simple major mode that supports comment syntax and Font Lock mode. | |
22.2.9 Major Mode Examples | Text mode and Lisp modes. | |
Minor Modes | ||
22.3.1 Conventions for Writing Minor Modes | Tips for writing a minor mode. | |
22.3.2 Keymaps and Minor Modes | How a minor mode can have its own keymap. | |
22.3.3 Defining Minor Modes | A convenient facility for defining minor modes. | |
Mode Line Format | ||
22.4.1 Mode Line Basics | Basic ideas of mode line control. | |
22.4.2 The Data Structure of the Mode Line | The data structure that controls the mode line. | |
22.4.3 The Top Level of Mode Line Control | The top level variable, mode-line-format. | |
22.4.4 Variables Used in the Mode Line | Variables used in that data structure. | |
22.4.5 % -Constructs in the Mode Line | Putting information into a mode line. | |
22.4.6 Properties in the Mode Line | Using text properties in the mode line. | |
22.4.7 Window Header Lines | Like a mode line, but at the top. | |
22.4.8 Emulating Mode Line Formatting | Formatting text as the mode line would. | |
Font Lock Mode | ||
22.6.1 Font Lock Basics | Overview of customizing Font Lock. | |
22.6.2 Search-based Fontification | Fontification based on regexps. | |
22.6.3 Customizing Search-Based Fontification | Customizing search-based fontification. | |
22.6.4 Other Font Lock Variables | Additional customization facilities. | |
22.6.5 Levels of Font Lock | Each mode can define alternative levels so that the user can select more or less. | |
22.6.6 Precalculated Fontification | How Lisp programs that produce the buffer contents can also specify how to fontify it. | |
22.6.7 Faces for Font Lock | Special faces specifically for Font Lock. | |
22.6.8 Syntactic Font Lock | Fontification based on syntax tables. | |
22.6.9 Multiline Font Lock Constructs | How to coerce Font Lock into properly highlighting multiline constructs. | |
Multiline Font Lock Constructs | ||
22.6.9.1 Font Lock Multiline | Marking multiline chunks with a text property. | |
22.6.9.2 Region to Fontify after a Buffer Change | Controlling which region gets refontified after a buffer change. | |
Automatic Indentation of code | ||
22.7.1 Simple Minded Indentation Engine | A simple minded indentation engine. | |
Simple Minded Indentation Engine | ||
22.7.1.1 SMIE Setup and Features | SMIE setup and features. | |
22.7.1.2 Operator Precedence Grammars | A very simple parsing technique. | |
22.7.1.3 Defining the Grammar of a Language | Defining the grammar of a language. | |
22.7.1.4 Defining Tokens | Defining tokens. | |
22.7.1.5 Living With a Weak Parser | Working around the parser’s limitations. | |
22.7.1.6 Specifying Indentation Rules | Specifying indentation rules. | |
22.7.1.7 Helper Functions for Indentation Rules | Helper functions for indentation rules. | |
22.7.1.8 Sample Indentation Rules | Sample indentation rules. | |
22.7.1.9 Customizing Indentation | Customizing indentation. | |
Documentation | ||
23.1 Documentation Basics | Where doc strings are defined and stored. | |
23.2 Access to Documentation Strings | How Lisp programs can access doc strings. | |
23.3 Substituting Key Bindings in Documentation | Substituting current key bindings. | |
23.4 Describing Characters for Help Messages | Making printable descriptions of non-printing characters and key sequences. | |
23.5 Help Functions | Subroutines used by Emacs help facilities. | |
Files | ||
24.1 Visiting Files | Reading files into Emacs buffers for editing. | |
24.2 Saving Buffers | Writing changed buffers back into files. | |
24.3 Reading from Files | Reading files into buffers without visiting. | |
24.4 Writing to Files | Writing new files from parts of buffers. | |
24.5 File Locks | Locking and unlocking files, to prevent simultaneous editing by two people. | |
24.6 Information about Files | Testing existence, accessibility, size of files. | |
24.7 Changing File Names and Attributes | Renaming files, changing permissions, etc. | |
24.8 File Names | Decomposing and expanding file names. | |
24.9 Contents of Directories | Getting a list of the files in a directory. | |
24.10 Creating, Copying and Deleting Directories | Creating and Deleting Directories. | |
24.11 Making Certain File Names “Magic” | Special handling for certain file names. | |
24.12 File Format Conversion | Conversion to and from various file formats. | |
Visiting Files | ||
24.1.1 Functions for Visiting Files | The usual interface functions for visiting. | |
24.1.2 Subroutines of Visiting | Lower-level subroutines that they use. | |
Information about Files | ||
24.6.1 Testing Accessibility | Is a given file readable? Writable? | |
24.6.2 Distinguishing Kinds of Files | Is it a directory? A symbolic link? | |
24.6.3 Truenames | Eliminating symbolic links from a file name. | |
24.6.4 File Attributes | File sizes, modification times, etc. | |
24.6.5 Extended File Attributes | Extended file attributes for access control. | |
24.6.6 Locating Files in Standard Places | How to find a file in standard places. | |
File Names | ||
24.8.1 File Name Components | The directory part of a file name, and the rest. | |
24.8.2 Absolute and Relative File Names | Some file names are relative to a current directory. | |
24.8.3 Directory Names | A directory’s name as a directory is different from its name as a file. | |
24.8.4 Functions that Expand Filenames | Converting relative file names to absolute ones. | |
24.8.5 Generating Unique File Names | Generating names for temporary files. | |
24.8.6 File Name Completion | Finding the completions for a given file name. | |
24.8.7 Standard File Names | If your package uses a fixed file name, how to handle various operating systems simply. | |
File Format Conversion | ||
24.12.1 Overview | insert-file-contents and write-region .
| |
24.12.2 Round-Trip Specification | Using format-alist .
| |
24.12.3 Piecemeal Specification | Specifying non-paired conversion. | |
Backups and Auto-Saving | ||
25.1 Backup Files | How backup files are made; how their names are chosen. | |
25.2 Auto-Saving | How auto-save files are made; how their names are chosen. | |
25.3 Reverting | revert-buffer , and how to customize
what it does.
| |
Backup Files | ||
25.1.1 Making Backup Files | How Emacs makes backup files, and when. | |
25.1.2 Backup by Renaming or by Copying? | Two alternatives: renaming the old file or copying it. | |
25.1.3 Making and Deleting Numbered Backup Files | Keeping multiple backups for each source file. | |
25.1.4 Naming Backup Files | How backup file names are computed; customization. | |
Buffers | ||
26.1 Buffer Basics | What is a buffer? | |
26.2 The Current Buffer | Designating a buffer as current so that primitives will access its contents. | |
26.3 Buffer Names | Accessing and changing buffer names. | |
26.4 Buffer File Name | The buffer file name indicates which file is visited. | |
26.5 Buffer Modification | A buffer is modified if it needs to be saved. | |
26.6 Buffer Modification Time | Determining whether the visited file was changed "behind Emacs’s back". | |
26.7 Read-Only Buffers | Modifying text is not allowed in a read-only buffer. | |
26.8 The Buffer List | How to look at all the existing buffers. | |
26.9 Creating Buffers | Functions that create buffers. | |
26.10 Killing Buffers | Buffers exist until explicitly killed. | |
26.11 Indirect Buffers | An indirect buffer shares text with some other buffer. | |
26.12 Swapping Text Between Two Buffers | Swapping text between two buffers. | |
26.13 The Buffer Gap | The gap in the buffer. | |
Windows | ||
27.1 Basic Concepts of Emacs Windows | Basic information on using windows. | |
27.2 Windows and Frames | Relating windows to the frame they appear on. | |
27.3 Window Sizes | Accessing a window’s size. | |
27.4 Resizing Windows | Changing the sizes of windows. | |
27.5 Splitting Windows | Splitting one window into two windows. | |
27.6 Deleting Windows | Deleting a window gives its space to other windows. | |
27.7 Recombining Windows | Preserving the frame layout when splitting and deleting windows. | |
27.8 Selecting Windows | The selected window is the one that you edit in. | |
27.9 Cyclic Ordering of Windows | Moving around the existing windows. | |
27.10 Buffers and Windows | Each window displays the contents of a buffer. | |
27.11 Switching to a Buffer in a Window | Higher-level functions for switching to a buffer. | |
27.12 Choosing a Window for Display | How to choose a window for displaying a buffer. | |
27.13 Action Functions for display-buffer | Subroutines for display-buffer .
| |
27.14 Additional Options for Displaying Buffers | Extra options affecting how buffers are displayed. | |
27.15 Window History | Each window remembers the buffers displayed in it. | |
27.16 Dedicated Windows | How to avoid displaying another buffer in a specific window. | |
27.17 Quitting Windows | How to restore the state prior to displaying a buffer. | |
27.18 Windows and Point | Each window has its own location of point. | |
27.19 The Window Start and End Positions | Buffer positions indicating which text is on-screen in a window. | |
27.20 Textual Scrolling | Moving text up and down through the window. | |
27.21 Vertical Fractional Scrolling | Moving the contents up and down on the window. | |
27.22 Horizontal Scrolling | Moving the contents sideways on the window. | |
27.23 Coordinates and Windows | Converting coordinates to windows. | |
27.24 Window Configurations | Saving and restoring the state of the screen. | |
27.25 Window Parameters | Associating additional information with windows. | |
27.26 Hooks for Window Scrolling and Changes | Hooks for scrolling, window size changes, redisplay going past a certain point, or window configuration changes. | |
Frames | ||
28.1 Creating Frames | Creating additional frames. | |
28.2 Multiple Terminals | Displaying on several different devices. | |
28.3 Frame Parameters | Controlling frame size, position, font, etc. | |
28.4 Terminal Parameters | Parameters common for all frames on terminal. | |
28.5 Frame Titles | Automatic updating of frame titles. | |
28.6 Deleting Frames | Frames last until explicitly deleted. | |
28.7 Finding All Frames | How to examine all existing frames. | |
28.8 Minibuffers and Frames | How a frame finds the minibuffer to use. | |
28.9 Input Focus | Specifying the selected frame. | |
28.10 Visibility of Frames | Frames may be visible or invisible, or icons. | |
28.11 Raising and Lowering Frames | Raising a frame makes it hide other windows; lowering it makes the others hide it. | |
28.12 Frame Configurations | Saving the state of all frames. | |
28.13 Mouse Tracking | Getting events that say when the mouse moves. | |
28.14 Mouse Position | Asking where the mouse is, or moving it. | |
28.15 Pop-Up Menus | Displaying a menu for the user to select from. | |
28.16 Dialog Boxes | Displaying a box to ask yes or no. | |
28.17 Pointer Shape | Specifying the shape of the mouse pointer. | |
28.18 Window System Selections | Transferring text to and from other X clients. | |
28.19 Drag and Drop | Internals of Drag-and-Drop implementation. | |
28.20 Color Names | Getting the definitions of color names. | |
28.21 Text Terminal Colors | Defining colors for text terminals. | |
28.22 X Resources | Getting resource values from the server. | |
28.23 Display Feature Testing | Determining the features of a terminal. | |
Frame Parameters | ||
28.3.1 Access to Frame Parameters | How to change a frame’s parameters. | |
28.3.2 Initial Frame Parameters | Specifying frame parameters when you make a frame. | |
28.3.3 Window Frame Parameters | List of frame parameters for window systems. | |
28.3.4 Frame Size And Position | Changing the size and position of a frame. | |
28.3.5 Geometry | Parsing geometry specifications. | |
Window Frame Parameters | ||
28.3.3.1 Basic Parameters | Parameters that are fundamental. | |
28.3.3.2 Position Parameters | The position of the frame on the screen. | |
28.3.3.3 Size Parameters | Frame’s size. | |
28.3.3.4 Layout Parameters | Size of parts of the frame, and enabling or disabling some parts. | |
28.3.3.5 Buffer Parameters | Which buffers have been or should be shown. | |
28.3.3.6 Window Management Parameters | Communicating with the window manager. | |
28.3.3.7 Cursor Parameters | Controlling the cursor appearance. | |
28.3.3.8 Font and Color Parameters | Fonts and colors for the frame text. | |
Positions | ||
29.1 Point | The special position where editing takes place. | |
29.2 Motion | Changing point. | |
29.3 Excursions | Temporary motion and buffer changes. | |
29.4 Narrowing | Restricting editing to a portion of the buffer. | |
Motion | ||
29.2.1 Motion by Characters | Moving in terms of characters. | |
29.2.2 Motion by Words | Moving in terms of words. | |
29.2.3 Motion to an End of the Buffer | Moving to the beginning or end of the buffer. | |
29.2.4 Motion by Text Lines | Moving in terms of lines of text. | |
29.2.5 Motion by Screen Lines | Moving in terms of lines as displayed. | |
29.2.6 Moving over Balanced Expressions | Moving by parsing lists and sexps. | |
29.2.7 Skipping Characters | Skipping characters belonging to a certain set. | |
Markers | ||
30.1 Overview of Markers | The components of a marker, and how it relocates. | |
30.2 Predicates on Markers | Testing whether an object is a marker. | |
30.3 Functions that Create Markers | Making empty markers or markers at certain places. | |
30.4 Information from Markers | Finding the marker’s buffer or character position. | |
30.5 Marker Insertion Types | Two ways a marker can relocate when you insert where it points. | |
30.6 Moving Marker Positions | Moving the marker to a new buffer or position. | |
30.7 The Mark | How "the mark" is implemented with a marker. | |
30.8 The Region | How to access "the region". | |
Text | ||
31.1 Examining Text Near Point | Examining text in the vicinity of point. | |
31.2 Examining Buffer Contents | Examining text in a general fashion. | |
31.3 Comparing Text | Comparing substrings of buffers. | |
31.4 Inserting Text | Adding new text to a buffer. | |
31.5 User-Level Insertion Commands | User-level commands to insert text. | |
31.6 Deleting Text | Removing text from a buffer. | |
31.7 User-Level Deletion Commands | User-level commands to delete text. | |
31.8 The Kill Ring | Where removed text sometimes is saved for later use. | |
31.9 Undo | Undoing changes to the text of a buffer. | |
31.10 Maintaining Undo Lists | How to enable and disable undo information. How to control how much information is kept. | |
31.11 Filling | Functions for explicit filling. | |
31.12 Margins for Filling | How to specify margins for filling commands. | |
31.13 Adaptive Fill Mode | Adaptive Fill mode chooses a fill prefix from context. | |
31.14 Auto Filling | How auto-fill mode is implemented to break lines. | |
31.15 Sorting Text | Functions for sorting parts of the buffer. | |
31.16 Counting Columns | Computing horizontal positions, and using them. | |
31.17 Indentation | Functions to insert or adjust indentation. | |
31.18 Case Changes | Case conversion of parts of the buffer. | |
31.19 Text Properties | Assigning Lisp property lists to text characters. | |
31.20 Substituting for a Character Code | Replacing a given character wherever it appears. | |
31.21 Registers | How registers are implemented. Accessing the text or position stored in a register. | |
31.22 Transposition of Text | Swapping two portions of a buffer. | |
31.23 Dealing With Compressed Data | Dealing with compressed data. | |
31.24 Base 64 Encoding | Conversion to or from base 64 encoding. | |
31.25 Checksum/Hash | Computing cryptographic hashes. | |
31.26 Parsing HTML and XML | ||
31.27 Atomic Change Groups | Installing several buffer changes "atomically". | |
31.28 Change Hooks | Supplying functions to be run when text is changed. | |
The Kill Ring | ||
31.8.1 Kill Ring Concepts | What text looks like in the kill ring. | |
31.8.2 Functions for Killing | Functions that kill text. | |
31.8.3 Yanking | How yanking is done. | |
31.8.4 Functions for Yanking | Commands that access the kill ring. | |
31.8.5 Low-Level Kill Ring | Functions and variables for kill ring access. | |
31.8.6 Internals of the Kill Ring | Variables that hold kill ring data. | |
Indentation | ||
31.17.1 Indentation Primitives | Functions used to count and insert indentation. | |
31.17.2 Indentation Controlled by Major Mode | Customize indentation for different modes. | |
31.17.3 Indenting an Entire Region | Indent all the lines in a region. | |
31.17.4 Indentation Relative to Previous Lines | Indent the current line based on previous lines. | |
31.17.5 Adjustable “Tab Stops” | Adjustable, typewriter-like tab stops. | |
31.17.6 Indentation-Based Motion Commands | Move to first non-blank character. | |
Text Properties | ||
31.19.1 Examining Text Properties | Looking at the properties of one character. | |
31.19.2 Changing Text Properties | Setting the properties of a range of text. | |
31.19.3 Text Property Search Functions | Searching for where a property changes value. | |
31.19.4 Properties with Special Meanings | Particular properties with special meanings. | |
31.19.5 Formatted Text Properties | Properties for representing formatting of text. | |
31.19.6 Stickiness of Text Properties | How inserted text gets properties from neighboring text. | |
31.19.7 Lazy Computation of Text Properties | Computing text properties in a lazy fashion only when text is examined. | |
31.19.8 Defining Clickable Text | Using text properties to make regions of text do something when you click on them. | |
31.19.9 Defining and Using Fields | The field property defines
fields within the buffer.
| |
31.19.10 Why Text Properties are not Intervals | Why text properties do not use Lisp-visible text intervals. | |
Non-ASCII Characters | ||
32.1 Text Representations | How Emacs represents text. | |
32.2 Disabling Multibyte Characters | Controlling whether to use multibyte characters. | |
32.3 Converting Text Representations | Converting unibyte to multibyte and vice versa. | |
32.4 Selecting a Representation | Treating a byte sequence as unibyte or multi. | |
32.5 Character Codes | How unibyte and multibyte relate to codes of individual characters. | |
32.6 Character Properties | Character attributes that define their behavior and handling. | |
32.7 Character Sets | The space of possible character codes is divided into various character sets. | |
32.8 Scanning for Character Sets | Which character sets are used in a buffer? | |
32.9 Translation of Characters | Translation tables are used for conversion. | |
32.10 Coding Systems | Coding systems are conversions for saving files. | |
32.11 Input Methods | Input methods allow users to enter various non-ASCII characters without special keyboards. | |
32.12 Locales | Interacting with the POSIX locale. | |
Coding Systems | ||
32.10.1 Basic Concepts of Coding Systems | Basic concepts. | |
32.10.2 Encoding and I/O | How file I/O functions handle coding systems. | |
32.10.3 Coding Systems in Lisp | Functions to operate on coding system names. | |
32.10.4 User-Chosen Coding Systems | Asking the user to choose a coding system. | |
32.10.5 Default Coding Systems | Controlling the default choices. | |
32.10.6 Specifying a Coding System for One Operation | Requesting a particular coding system for a single file operation. | |
32.10.7 Explicit Encoding and Decoding | Encoding or decoding text without doing I/O. | |
32.10.8 Terminal I/O Encoding | Use of encoding for terminal I/O. | |
Searching and Matching | ||
33.1 Searching for Strings | Search for an exact match. | |
33.2 Searching and Case | Case-independent or case-significant searching. | |
33.3 Regular Expressions | Describing classes of strings. | |
33.4 Regular Expression Searching | Searching for a match for a regexp. | |
33.5 POSIX Regular Expression Searching | Searching POSIX-style for the longest match. | |
33.6 The Match Data | Finding out which part of the text matched, after a string or regexp search. | |
33.7 Search and Replace | Commands that loop, searching and replacing. | |
33.8 Standard Regular Expressions Used in Editing | Useful regexps for finding sentences, pages,... | |
Regular Expressions | ||
33.3.1 Syntax of Regular Expressions | Rules for writing regular expressions. | |
33.3.2 Complex Regexp Example | Illustrates regular expression syntax. | |
33.3.3 Regular Expression Functions | Functions for operating on regular expressions. | |
Syntax of Regular Expressions | ||
33.3.1.1 Special Characters in Regular Expressions | Special characters in regular expressions. | |
33.3.1.2 Character Classes | Character classes used in regular expressions. | |
33.3.1.3 Backslash Constructs in Regular Expressions | Backslash-sequences in regular expressions. | |
The Match Data | ||
33.6.1 Replacing the Text that Matched | Replacing a substring that was matched. | |
33.6.2 Simple Match Data Access | Accessing single items of match data, such as where a particular subexpression started. | |
33.6.3 Accessing the Entire Match Data | Accessing the entire match data at once, as a list. | |
33.6.4 Saving and Restoring the Match Data | Saving and restoring the match data. | |
Syntax Tables | ||
34.1 Syntax Table Concepts | Basic concepts of syntax tables. | |
34.2 Syntax Descriptors | How characters are classified. | |
34.3 Syntax Table Functions | How to create, examine and alter syntax tables. | |
34.4 Syntax Properties | Overriding syntax with text properties. | |
34.5 Motion and Syntax | Moving over characters with certain syntaxes. | |
34.6 Parsing Expressions | Parsing balanced expressions using the syntax table. | |
34.7 Syntax Table Internals | How syntax table information is stored. | |
34.8 Categories | Another way of classifying character syntax. | |
Syntax Descriptors | ||
34.2.1 Table of Syntax Classes | Table of syntax classes. | |
34.2.2 Syntax Flags | Additional flags each character can have. | |
Parsing Expressions | ||
34.6.1 Motion Commands Based on Parsing | Motion functions that work by parsing. | |
34.6.2 Finding the Parse State for a Position | Determining the syntactic state of a position. | |
34.6.3 Parser State | How Emacs represents a syntactic state. | |
34.6.4 Low-Level Parsing | Parsing across a specified region. | |
34.6.5 Parameters to Control Parsing | Parameters that affect parsing. | |
Abbrevs and Abbrev Expansion | ||
35.1 Abbrev Tables | Creating and working with abbrev tables. | |
35.2 Defining Abbrevs | Specifying abbreviations and their expansions. | |
35.3 Saving Abbrevs in Files | Saving abbrevs in files. | |
35.4 Looking Up and Expanding Abbreviations | Controlling expansion; expansion subroutines. | |
35.5 Standard Abbrev Tables | Abbrev tables used by various major modes. | |
35.6 Abbrev Properties | How to read and set abbrev properties. Which properties have which effect. | |
35.7 Abbrev Table Properties | How to read and set abbrev table properties. Which properties have which effect. | |
Processes | ||
36.1 Functions that Create Subprocesses | Functions that start subprocesses. | |
36.2 Shell Arguments | Quoting an argument to pass it to a shell. | |
36.3 Creating a Synchronous Process | Details of using synchronous subprocesses. | |
36.4 Creating an Asynchronous Process | Starting up an asynchronous subprocess. | |
36.5 Deleting Processes | Eliminating an asynchronous subprocess. | |
36.6 Process Information | Accessing run-status and other attributes. | |
36.7 Sending Input to Processes | Sending input to an asynchronous subprocess. | |
36.8 Sending Signals to Processes | Stopping, continuing or interrupting an asynchronous subprocess. | |
36.9 Receiving Output from Processes | Collecting output from an asynchronous subprocess. | |
36.10 Sentinels: Detecting Process Status Changes | Sentinels run when process run-status changes. | |
36.11 Querying Before Exit | Whether to query if exiting will kill a process. | |
36.12 Accessing Other Processes | Accessing other processes running on your system. | |
36.13 Transaction Queues | Transaction-based communication with subprocesses. | |
36.14 Network Connections | Opening network connections. | |
36.15 Network Servers | Network servers let Emacs accept net connections. | |
36.16 Datagrams | UDP network connections. | |
36.17 Low-Level Network Access | Lower-level but more general function to create connections and servers. | |
36.18 Misc Network Facilities | Additional relevant functions for net connections. | |
36.19 Communicating with Serial Ports | Communicating with serial ports. | |
36.20 Packing and Unpacking Byte Arrays | Using bindat to pack and unpack binary data. | |
Receiving Output from Processes | ||
36.9.1 Process Buffers | By default, output is put in a buffer. | |
36.9.2 Process Filter Functions | Filter functions accept output from the process. | |
36.9.3 Decoding Process Output | Filters can get unibyte or multibyte strings. | |
36.9.4 Accepting Output from Processes | How to wait until process output arrives. | |
Low-Level Network Access | ||
36.17.1 make-network-process | Using make-network-process .
| |
36.17.2 Network Options | Further control over network connections. | |
36.17.3 Testing Availability of Network Features | Determining which network features work on the machine you are using. | |
Packing and Unpacking Byte Arrays | ||
36.20.1 Describing Data Layout | Describing data layout. | |
36.20.2 Functions to Unpack and Pack Bytes | Doing the unpacking and packing. | |
36.20.3 Examples of Byte Unpacking and Packing | Samples of what bindat.el can do for you! | |
Emacs Display | ||
37.1 Refreshing the Screen | Clearing the screen and redrawing everything on it. | |
37.2 Forcing Redisplay | Forcing redisplay. | |
37.3 Truncation | Folding or wrapping long text lines. | |
37.4 The Echo Area | Displaying messages at the bottom of the screen. | |
37.5 Reporting Warnings | Displaying warning messages for the user. | |
37.6 Invisible Text | Hiding part of the buffer text. | |
37.7 Selective Display | Hiding part of the buffer text (the old way). | |
37.8 Temporary Displays | Displays that go away automatically. | |
37.9 Overlays | Use overlays to highlight parts of the buffer. | |
37.10 Size of Displayed Text | How large displayed text is. | |
37.11 Line Height | Controlling the height of lines. | |
37.12 Faces | A face defines a graphics style for text characters: font, colors, etc. | |
37.13 Fringes | Controlling window fringes. | |
37.14 Scroll Bars | Controlling vertical scroll bars. | |
37.15 Window Dividers | Separating windows visually. | |
37.16 The display Property | Enabling special display features. | |
37.17 Images | Displaying images in Emacs buffers. | |
37.18 Buttons | Adding clickable buttons to Emacs buffers. | |
37.19 Abstract Display | Emacs’s Widget for Object Collections. | |
37.20 Blinking Parentheses | How Emacs shows the matching open parenthesis. | |
37.21 Character Display | How Emacs displays individual characters. | |
37.22 Beeping | Audible signal to the user. | |
37.23 Window Systems | Which window system is being used. | |
37.24 Bidirectional Display | Display of bidirectional scripts, such as Arabic and Farsi. | |
The Echo Area | ||
37.4.1 Displaying Messages in the Echo Area | Explicitly displaying text in the echo area. | |
37.4.2 Reporting Operation Progress | Informing user about progress of a long operation. | |
37.4.3 Logging Messages in *Messages* | Echo area messages are logged for the user. | |
37.4.4 Echo Area Customization | Controlling the echo area. | |
Reporting Warnings | ||
37.5.1 Warning Basics | Warnings concepts and functions to report them. | |
37.5.2 Warning Variables | Variables programs bind to customize their warnings. | |
37.5.3 Warning Options | Variables users set to control display of warnings. | |
37.5.4 Delayed Warnings | Deferring a warning until the end of a command. | |
Overlays | ||
37.9.1 Managing Overlays | Creating and moving overlays. | |
37.9.2 Overlay Properties | How to read and set properties. What properties do to the screen display. | |
37.9.3 Searching for Overlays | Searching for overlays. | |
Faces | ||
37.12.1 Face Attributes | What is in a face? | |
37.12.2 Defining Faces | How to define a face. | |
37.12.3 Face Attribute Functions | Functions to examine and set face attributes. | |
37.12.4 Displaying Faces | How Emacs combines the faces specified for a character. | |
37.12.5 Face Remapping | Remapping faces to alternative definitions. | |
37.12.6 Functions for Working with Faces | How to define and examine faces. | |
37.12.7 Automatic Face Assignment | Hook for automatic face assignment. | |
37.12.8 Basic Faces | Faces that are defined by default. | |
37.12.9 Font Selection | Finding the best available font for a face. | |
37.12.10 Looking Up Fonts | Looking up the names of available fonts and information about them. | |
37.12.11 Fontsets | A fontset is a collection of fonts that handle a range of character sets. | |
37.12.12 Low-Level Font Representation | Lisp representation for character display fonts. | |
Fringes | ||
37.13.1 Fringe Size and Position | Specifying where to put the window fringes. | |
37.13.2 Fringe Indicators | Displaying indicator icons in the window fringes. | |
37.13.3 Fringe Cursors | Displaying cursors in the right fringe. | |
37.13.4 Fringe Bitmaps | Specifying bitmaps for fringe indicators. | |
37.13.5 Customizing Fringe Bitmaps | Specifying your own bitmaps to use in the fringes. | |
37.13.6 The Overlay Arrow | Display of an arrow to indicate position. | |
The | ||
37.16.1 Display Specs That Replace The Text | Display specs that replace the text. | |
37.16.2 Specified Spaces | Displaying one space with a specified width. | |
37.16.3 Pixel Specification for Spaces | Specifying space width or height in pixels. | |
37.16.4 Other Display Specifications | Displaying an image; adjusting the height, spacing, and other properties of text. | |
37.16.5 Displaying in the Margins | Displaying text or images to the side of the main text. | |
Images | ||
37.17.1 Image Formats | Supported image formats. | |
37.17.2 Image Descriptors | How to specify an image for use in :display .
| |
37.17.3 XBM Images | Special features for XBM format. | |
37.17.4 XPM Images | Special features for XPM format. | |
37.17.5 PostScript Images | Special features for PostScript format. | |
37.17.6 ImageMagick Images | Special features available through ImageMagick. | |
37.17.7 Other Image Types | Various other formats are supported. | |
37.17.8 Defining Images | Convenient ways to define an image for later use. | |
37.17.9 Showing Images | Convenient ways to display an image once it is defined. | |
37.17.10 Multi-Frame Images | Some images contain more than one frame. | |
37.17.11 Image Cache | Internal mechanisms of image display. | |
Buttons | ||
37.18.1 Button Properties | Button properties with special meanings. | |
37.18.2 Button Types | Defining common properties for classes of buttons. | |
37.18.3 Making Buttons | Adding buttons to Emacs buffers. | |
37.18.4 Manipulating Buttons | Getting and setting properties of buttons. | |
37.18.5 Button Buffer Commands | Buffer-wide commands and bindings for buttons. | |
Abstract Display | ||
37.19.1 Abstract Display Functions | Functions in the Ewoc package. | |
37.19.2 Abstract Display Example | Example of using Ewoc. | |
Character Display | ||
37.21.1 Usual Display Conventions | The usual conventions for displaying characters. | |
37.21.2 Display Tables | What a display table consists of. | |
37.21.3 Active Display Table | How Emacs selects a display table to use. | |
37.21.4 Glyphs | How to define a glyph, and what glyphs mean. | |
37.21.5 Glyphless Character Display | How glyphless characters are drawn. | |
Operating System Interface | ||
38.1 Starting Up Emacs | Customizing Emacs startup processing. | |
38.2 Getting Out of Emacs | How exiting works (permanent or temporary). | |
38.3 Operating System Environment | Distinguish the name and kind of system. | |
38.4 User Identification | Finding the name and user id of the user. | |
38.5 Time of Day | Getting the current time. | |
38.6 Time Conversion | Converting a time from numeric form to calendrical data and vice versa. | |
38.7 Parsing and Formatting Times | Converting a time from numeric form to text and vice versa. | |
38.8 Processor Run time | Getting the run time used by Emacs. | |
38.9 Time Calculations | Adding, subtracting, comparing times, etc. | |
38.10 Timers for Delayed Execution | Setting a timer to call a function at a certain time. | |
38.11 Idle Timers | Setting a timer to call a function when Emacs has been idle for a certain length of time. | |
38.12 Terminal Input | Accessing and recording terminal input. | |
38.13 Terminal Output | Controlling and recording terminal output. | |
38.14 Sound Output | Playing sounds on the computer’s speaker. | |
38.15 Operating on X11 Keysyms | Operating on key symbols for X Windows. | |
38.16 Batch Mode | Running Emacs without terminal interaction. | |
38.17 Session Management | Saving and restoring state with X Session Management. | |
38.18 Desktop Notifications | Desktop notifications. | |
38.19 Notifications on File Changes | File notifications. | |
38.20 Dynamically Loaded Libraries | On-demand loading of support libraries. | |
Starting Up Emacs | ||
38.1.1 Summary: Sequence of Actions at Startup | Sequence of actions Emacs performs at startup. | |
38.1.2 The Init File | Details on reading the init file. | |
38.1.3 Terminal-Specific Initialization | How the terminal-specific Lisp file is read. | |
38.1.4 Command-Line Arguments | How command-line arguments are processed, and how you can customize them. | |
Getting Out of Emacs | ||
38.2.1 Killing Emacs | Exiting Emacs irreversibly. | |
38.2.2 Suspending Emacs | Exiting Emacs reversibly. | |
Terminal Input | ||
38.12.1 Input Modes | Options for how input is processed. | |
38.12.2 Recording Input | Saving histories of recent or all input events. | |
Preparing Lisp code for distribution | ||
39.1 Packaging Basics | The basic concepts of Emacs Lisp packages. | |
39.2 Simple Packages | How to package a single .el file. | |
39.3 Multi-file Packages | How to package multiple files. | |
39.4 Creating and Maintaining Package Archives | Maintaining package archives. | |
Tips and Conventions | ||
D.1 Emacs Lisp Coding Conventions | Conventions for clean and robust programs. | |
D.2 Key Binding Conventions | Which keys should be bound by which programs. | |
D.3 Emacs Programming Tips | Making Emacs code fit smoothly in Emacs. | |
D.4 Tips for Making Compiled Code Fast | Making compiled code run fast. | |
D.5 Tips for Avoiding Compiler Warnings | Turning off compiler warnings. | |
D.6 Tips for Documentation Strings | Writing readable documentation strings. | |
D.7 Tips on Writing Comments | Conventions for writing comments. | |
D.8 Conventional Headers for Emacs Libraries | Standard headers for library packages. | |
GNU Emacs Internals | ||
E.1 Building Emacs | How the dumped Emacs is made. | |
E.2 Pure Storage | Kludge to make preloaded Lisp functions shareable. | |
E.3 Garbage Collection | Reclaiming space for Lisp objects no longer used. | |
E.4 Memory Usage | Info about total size of Lisp objects made so far. | |
E.6 Writing Emacs Primitives | Writing C code for Emacs. | |
E.7 Object Internals | Data formats of buffers, windows, processes. | |
Object Internals | ||
E.7.1 Buffer Internals | Components of a buffer structure. | |
E.7.2 Window Internals | Components of a window structure. | |
E.7.3 Process Internals | Components of a process structure. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacsテキストエディターのほとんどの部分は、Emacs Lispと呼ばれるプログラミング言語で記述されています。新しいコードをEmacs Lispで記述して、このエディターの拡張としてインストールできます。しかしEmacs Lispは、単なる“拡張言語”を越えた言語であり、それ自体で完全なコンピュータープログラミング言語です。他のプログラミング言語で行なうすべてのことに、この言語を使用できます。
Emacs Lispはエディターの中で使用するようにデザインされているので、テキストのスキャンやパースのための特別な機能をもち、同様にファイル、バッファー、ディスプレー、サブプロセスを処理する機能をもちます。Emacs Lispは編集機能と密に統合されています。したがって編集コマンドはLispプログラムから簡単に呼び出せる関数であり、カスタマイズのためのパラメーターは普通のLisp変数です。
このマニュアルはEmacs Lispの完全な記述を試みます。初心者のためのEmacs Lispのイントロダクションは、Free Software Foundationからも出版されている、Bob ChassellのAn Introduction to Emacs Lisp Programmingを参照してください。このマニュアルは、Emacsを使用した編集に熟知していることを前提としています。これの基本的な情報については、The GNU Emacs Manualを参照してください。
おおまかに言うと、前の方のチャプターでは多くのプログラミング言語に対応するEmacs Lispの機能について説明し、後のチャプターではEmacs Lispに特異な機能や、特に編集に関連した機能を説明します。
これは Emacs 24.5に対応したGNU Emacs Lisp Reference Manualです。
1.1 Caveats | 不備な点と、助けを求める方法。 | |
1.2 Lisp History | Emacs LispはMaclispが由来です。 | |
1.3 Conventions | このマニュアルがフォーマットされた方法。 | |
1.4 Version Information | 実行中のEmacsのバージョンは? | |
1.5 Acknowledgments | このマニュアルの著者、編集者、スポンサー。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルは幾多のドラフトを経てきました。ほとんど完璧ではありますが、不備がないとも言えません。(ほとんどの特定のモードのように)それらが副次的であるとか、まだ記述されていないという理由により、カバーされていないトピックもあります。わたしたちがそれらを完璧に扱うことはできないので、いくつかの部分は意図的に省略しました。
このマニュアルは、それがカバーしている事柄については完全に正しくあるべきあり、故に、特定の説明テキスト、チャプターやセクションの順番にたいしての批判に開かれているべきです。判りにくかったり、このマニュアルでカバーされていない何かを学ぶためにソースを見たり実験から学ぶ必要があるなら、このマニュアルはおそらくフィクスされるべきなのかもしれません。わたしたちにそれを教えてください。
このマニュアルを使用するときは、間違いを見つけたらすぐに訂正を送ってください。関数または間数グループの単純な現実例を考えたときは、ぜひそれを記述して送ってください。それが妥当ならコメントでノード名と関数名や変数名を参照してください。あなたが訂正を求めるエディションのバージョンも示してください。
M-x report-emacs-bugを使用してコメントや訂正を送ってください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lisp(LISt Processing language: リスト処理言語)は、MIT(Massachusetts Institute of Technology: マサチューセッツ工科大学)で、AI(artificial intelligence: 人工知能)の研究のために、1950年代末に最初に開発されました。Lisp言語の強力なパワーは、編集コマンドの記述のような、他の目的にも適っています。
長年の間に何ダースものLisp実装が構築されてきて、それぞれ特異な点があります。これらの多くは、1960年代にMITのProject MACで記述された、Maclispに影響を受けています。最終的に、Maclisp後裔の実装者は共同して、Common Lispと呼ばれる標準のLispシステムを開発しました。その間に、MITのGerry SussmanとGuy Steeleにより、簡潔だがとても強力なLisp方言である、Schemeが開発されました。
GNU Emacs LispはMaclispから多く、Common Lispから少し影響を受けています。Common Lispを知っている場合、多くの類似点に気がつくでしょう。しかしCommon Lispの多くの機能は、GNU Emacsが要求するメモリー量を削減するために、省略されるか単純化されています。ときには劇的に単純化がされているために、Common Lispユーザーは混乱するかもしれません。わたしたちは時折GNU Emacs LispがCommon Lispと異なるか示すでしょう。Common Lispを知らない場合、それについて心配する必要はありません。このマニュアルは自己完結しています。
cl-libライブラリーを通じて、Common Lispをかなりエミュレートできます。Overview in Common Lisp Extensionsを参照してください。
Emacs LispはSchemeの影響は受けていません。しかしGNUプロジェクトにはGuileと呼ばれるScheme実装があります。拡張が必要な新しいGNUソフトウェアーでは、Guileを使用します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、このマニュアルで使用する表記規約を説明します。あなたはこのセクションはスキップして、後で参照したいと思うかもしれません。
1.3.1 Some Terms | このマニュアルで使用する用語の説明。 | |
1.3.2 nil and t | シンボルnil とt の使用方法。
| |
1.3.3 Evaluation Notation | 評価の例で使用するフォーマット。 | |
1.3.4 Printing Notation | テキストのプリント例で使用するフォーマット。 | |
1.3.5 Error Messages | エラー例で使用するフォーマット。 | |
1.3.6 Buffer Text Notation | 例のバッファー内容で使用するフォーマット。 | |
1.3.7 Format of Descriptions | 関数や変数などの説明にたいする表記。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルでは、“Lispリーダー”および“Lispプリンター”という用語で、Lispのテキスト表現を実際のLispオブジェクトに変換したり、その逆を行なうLispルーチンを参照します。詳細については、Printed Representation and Read Syntaxを参照してください。あなた、つまりこのマニュアルを読んでいる人のことは“プログラマー”と考えて“あなた”と呼びます。“ユーザー”とは、あなたの記述したものも含めて、Lispプログラムを使用する人を指します。
Lispコードの例は、(list 1 2 3)
のようなフォーマットです。
Examples of Lisp code are formatted like this: (list 1 2 3)
.
メタ構文変数(metasyntactic
variables)を表す名前や、説明されている関数の引数名前は、first-numberのような形式です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
nil
and t
Emacs
Lispでは、シンボルnil
には3つの異なる意味があります。1つ目は‘nil’という名前のシンボル、2つ目は論理値のfalse、3つ目は空リスト
— つまり要素が0のリストです。変数として使用した場合、nil
は常に値nil
をもちます。
Lispリーダーに関する限り、‘()’と‘nil’は同一です。これらは同じオブジェクト、つまりシンボルnil
を意味します。このシンボルを異なる方法で記述するのは、完全に人間の読み手を意図したものです。Lispリーダーが‘()’か‘nil’のどちらかを読み取った後は、プログラマーが実際にどちらの表現で記述したかを判断する方法はありません。
このマニュアルでは、空リストを意味することを強調したいときは()
と記述し、論理値のfalseを意味することを強調したいときはnil
と記述します。この慣習はLispプログラムで使用してもよいでしょう。
(cons 'foo ()) ; 空リストを強調します (setq foo-flag nil) ; 論理値のfalseを強調します
論理値が期待されているコンテキストでは、非nil
はtrueと判断されます。しかし論理値のtrueを表す好ましい方法はt
です。trueを表す値を選択する必要があり、他に選択の根拠がない場合は、t
を使用してください。シンボルt
は、常に値t
をもちます。
Emacs
Lispでは、nil
とt
は、常に自分自身を評価する、特別なシンボルです。そのためプログラムでこれらを定数として使用する場合、クォートする必要はありません。これらの値を変更使用と試みると、結果はsetting-constant
エラーとなります。Variables that Never Changeを参照してください。
objectが、2つのカノニカルなブーリーン値(t
またはnil
)の場合は、非nil
をリターンします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
評価することができるLisp式のことを、フォーム(form)と呼びます。フォームの評価により、常に結果としてLispオブジェクトが生成されます。このマニュアルの例では、これを‘⇒’で示します:
(car '(1 2)) ⇒ 1
これは、“(car '(1 2))
を評価すると1になる”と読むことができます。
フォームがマクロ呼び出しの場合、それは評価されるための新しいLispのフォームに展開されます。展開された結果は‘→’で示します。展開されたフォームを評価した結果を示すこともあれば、示さない場合もあります。
(third '(a b c)) → (car (cdr (cdr '(a b c)))) ⇒ c
1つのフォームを説明するために、同じ結果を生成する別のフォームを示すこともあります。完全に等価な2つのフォームは、‘≡’で示します。
(make-sparse-keymap) ≡ (list 'keymap)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルの例の多くは、それらが評価されるときにテキストをプリントします。(*scratch*バッファーのような)Lisp
Interactionバッファーでコード例を実行する場合、プリントされるテキストはそのバッファーに挿入されます。(関数eval-region
で評価するなど)他の方法でコード例を実行する場合、プリントされるテキストはエコーエリアに表示されます。
このマニュアルの例はプリントされるテキストがどこに出力されるかに関わらず、それを‘-|’で示します。フォームを評価することにより戻される値は、‘⇒’とともに後続の行で示します。
(progn (prin1 'foo) (princ "\n") (prin1 'bar)) -| foo -| bar ⇒ bar
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーをシグナルする例も、いくつかあります。これは通常、エコーエリアにエラーメッセージを表示します。エラーメッセージの行は、‘error→’で始まります。‘error→’自体は、エコーエリアに表示されないことに注意してください。
(+ 23 'x) error→ Wrong type argument: number-or-marker-p, x
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファー内容の変更を説明する例もあり、それらの例ではテキストの“before(以前)”と“after(以後)”のバージョンを示します。それらの例では、バッファー内容の該当する部分を、ダッシュを用いた2行の破線(バッファー名を含む)で示します。さらに、‘∗’はポイントの位置を示します(もちろんポイントのシンボルは、バッファーのテキストの一部ではなく、それはポイントが現在配されている2つの文字の間の位置を示します)。
---------- Buffer: foo ---------- This is the ∗contents of foo. ---------- Buffer: foo ---------- (insert "changed ") ⇒ nil ---------- Buffer: foo ---------- This is the changed ∗contents of foo. ---------- Buffer: foo ----------
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルでは関数(function)、変数(variable)、コマンド(command)、ユーザーオプション(user option)、スペシャルフォーム(special form)を、統一されたフォーマットで記述します。記述の最初の行には、そのアイテムの名前と、もしあれば引数(argument)が続きます。 そのアイテムの属するカテゴリー(function、variableなど)は、行の先頭に表示します。 それ以降の行は説明行で、例を含む場合もあります。
1.3.7.1 A Sample Function Description | 架空の関数foo にたいする記述例。
| |
1.3.7.2 A Sample Variable Description | 架空の変数electric-future-map にたいする記述例。
|
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数の記述では、関数の名前が最初に記述されます。同じ行に引数の名前のリストが続きます。引数の値を参照するために、引数の名前は記述の本文にも使用されます。
引数リストの中にキーワード&optional
がある場合、その後の引数が省略可能であることを示します(省略された引数のデフォルトはnil
です)。その関数を呼び出すときは、&optional
を記述しないでください。
キーワード&rest
(これの後には1つの引数名を続けなければなりません)は、その後に任意の引数を続けることができることを表します。&rest
の後に記述された引数名の値には、その関数に渡された残りのすべての引数がリストとしてセットされます。この関数を呼び出すときは、&rest
を記述しないでください。
以下はfoo
という架空の関数(function)の説明です:
関数foo
はinteger2からinteger1を減じてから、その結果に残りすべての引数を加えます。integer2が与えられなかった場合、デフォルトして数値19が使用されます。
(foo 1 5 3 9) ⇒ 16 (foo 5) ⇒ 14
より一般的には、
(foo w x y…) ≡ (+ (- x w) y…)
慣例として引数の名前には、(たとえばinteger、integer1、bufferのような)期待されるタイプ名が含めます。(buffersのような)複数形のタイプは、しばしばそのタイプのオブジェクトのリストを意味します。objectのような引き数名は、それが任意のタイプであることを表します(Emacsオブジェクトタイプのリストは、Lisp Data Typesを参照してください)。他の名前をもつ引数(たとえばnew-file)は、関数に固有の引数で、関数がドキュメント文字列をもつ場合、引数のタイプはその中で説明されるべきです(Documentationを参照してください)。
&optional
や&rest
により修飾される引数の、より完全な説明は、Lambda Expressionsを参照してください。
コマンド(command)、マクロ(macro)、スペシャルフォーム(special form)の説明も同じフォーマットをもちますが、‘Function’が‘Command’、‘Macro’、‘Special Form’に置き換えられます。コマンドは単にインタラクティブに呼び出すことができる関数です。マクロは関数とは違う方法(引数は評価されません)で引数を処理しますは、同じ方法で記述されます。
マクロとスペシャルフォームにたいする説明には、特定のオプション引数や繰り替えされる引数のために、より複雑な表記が使用されます。なぜなら引数リストが、より複雑な方法で別の引数に分離されるからです。‘[optional-arg]’はoptional-argがオプションであることを意味し、‘repeated-args…’は0個以上の引数を表します。カッコ(parentheses)は、複数の引数をリスト構造の追加レベルにグループ化するのに使用されます。以下は例です:
この架空のスペシャルフォームは、 bodyフォームを実行してから変数varをインクリメントするループを実装します。最初の繰り返しでは変数は値fromをもちます。以降の繰り返しでは、変数は1(incが与えられた場合はinc)増加されます。varがtoに等しい場合、bodyを実行する前にループをexitします。以下は例です:
(count-loop (i 0 10) (prin1 i) (princ " ") (prin1 (aref vector i)) (terpri))
fromとtoが省略された場合、ループを実行する前にvarにnil
がバインドされ、繰り返しの先頭においてvarが非nil
の場合は、ループをexitします。以下は例です:
(count-loop (done) (if (pending) (fixit) (setq done t)))
このスペシャルフォームでは、引数fromおよびtoはオプションですが、両方を指定するか、両方を未指定にしなければなりません。これらの引数が与えられた場合、オプションでincも同様に指定することができます。これらの引数は、フォームのすべての残りの要素を含むbodyと区別するために、引数varとともにリストにグループ化されます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数(variable)とは、オブジェクトにバインド(bind)(またはset)される名前です。変数がバインドされたオブジェクトのことを値(value)と呼びます。このような場合、その変数が値をもつ、という言い方もします。ほとんどすべての変数はユーザーがセットすることができますが、特にユーザーが変更できる特定の変数も存在し、これらはユーザーオプション(user options)と呼ばれます。通常の変数およびユーザーオプションは、関数と同様のフォーマットを使用して説明されますが、それらには引数がありません。
以下は架空の変数electric-future-map
にたいする説明です。
この変数の値はElectric Command Futureモードで使用される完全なキーマップです。このマップの関数により、まだ実行していないコマンドの編集が可能になります。
ユーザーオプションも同じフォーマットをもちますが、‘Variable’が‘User Option’に置き換えられます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の機能は使用しているEmacsに関する情報を提供します。
この関数は実行しているEmacsのバージョンを説明する文字列をreturnそます。バグレポートにこの文字列を含めるときに役立ちます。
(emacs-version) ⇒ "GNU Emacs 23.1 (i686-pc-linux-gnu, GTK+ Version 2.14.4) of 2009-06-01 on cyd.mit.edu"
hereが非nil
の場合、関数はテキストをバッファーのポイントの前に挿入し、nil
をreturnします。この関数がインタラクティブに呼び出された場合は、同じ情報をエコーエリアに出力しますが、プレフィクス引数を与えた場合は、hereが非nil
になります。
この変数の値は、Emacsがビルドされた日時を示します。値は、current-time
の値と同様の、4つの整数からなるリストです(Time of Dayを参照してください)。
emacs-build-time ⇒ (20614 63694 515336 438000)
この変数の値は実行中のEmacsのバージョンで、"23.1.1"
のような文字列です。この文字列の最後の数字は、実際にはEmacsのリリースバージョン番号の一部ではなく、任意のディレクトリーにおいてEmacsがビルドされる度にインクリメントされます。"22.0.91.1"
のように4つの数字から構成される値は、それがリリースではないテストバージョンであることを示します。
Emacsのメジャーバージョン番号を示す整数です。Emacs 23.1では、値は23になります。
Emacsのマイナーバージョン番号をしめす整数です。Emacs 23.1では、値は1になります。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマニュアルは当初、Robert Krawitz、Bil Lewis、Dan LaLiberte、Richard M. Stallman、Chris Welty、GNUマニュアルグループのボランティアーにより、数年を費やして記述されました。Robert J. Chassellはこのマニュアルのレビューと編集をDefense Advanced Research Projects Agency、ARPA Order 6082のサポートのもとに手助けしてくれ、Computational Logic, IncのWarren A. Hunt, Jr.によりアレンジされました。それ以降も、追加のセクションがMiles Bader、Lars Brinkhoff、Chong Yidong、Kenichi Handa、Lute Kamstra、Juri Linkov、Glenn Morris、Thien-Thi Nguyen、Dan Nicolaescu、Martin Rudalics、Kim F. Storm、Luc Teirlinck、Eli Zaretskii、およびその他の人たちにより記述されました。
Drew Adams、Juanma Barranquero、Karl Berry、Jim Blandy、Bard Bloom、Stephane Boucher、David Boyes、Alan Carroll、Richard Davis、Lawrence R. Dodd、Peter Doornbosch、David A. Duff、Chris Eich、Beverly Erlebacher、David Eckelkamp、Ralf Fassel、Eirik Fuller、Stephen Gildea、Bob Glickstein、Eric Hanchrow、Jesper Harder、George Hartzell、Nathan Hess、Masayuki Ida、Dan Jacobson、Jak Kirman、Bob Knighten、Frederick M. Korz、Joe Lammens、Glenn M. Lewis、K. Richard Magill、Brian Marick、Roland McGrath、Stefan Monnier、Skip Montanaro、John Gardiner Myers、Thomas A. Peterson、Francesco Potortì、Friedrich Pukelsheim、Arnold D. Robbins、Raul Rockwell、Jason Rumney、Per Starbäck、Shinichirou Sugou、Kimmo Suominen、Edward Tharp、Bill Trost、Rickard Westman、Jean White、Eduard Wiebe、Matthew Wilding、Carl Witty、Dale Worley、Rusty Wright、David D. Zuhnにより訂正が提供されました。
より完全な貢献者のリストは、Emacsソースリポジトリーの関連する変更ログエントリーを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispのオブジェクト(object)とは、Lispおプログラムにより操作されるデータです。型(type)やデータ型(data type)は、可能なオブジェクトの集合を意味します。
すべてのオブジェクトは少なくとも1つの型に属します。同じ型のオブジェクトは、同様な構造をもち、通常は同じコンテキストで使用されます。型は重複でき、オブジェクトは複数の型に属することができます。結果として、あるオブジェクトが特定の型に属するかどうかを尋ねることはできますが、オブジェクトが“その”型だけに属するかどうかは決定できません。
多くはありませんがEmacsにはいくつかの基本オブジェクト型が組み込まれています。これらの型は、他のすべての型を構成するもとであり、基本型(primitive types)と呼ばれます。すべてのオブジェクトはただ1つの基本型に属します。これらの型には、整数(integer)、浮動小数点数(float)、コンス(cons)、シンボル(symbol)、文字列(string)、ベクター(vector)、ハッシュテーブル(hash-table)、サブルーチン(subr)、バイトコード関数(byte-code function)、およびbufferのような編集に関連した特別な型(Editing Typesを参照してください)が含まれます。
基本型にはそれぞれ、オブジェクトがその型のメンバーかどうかのチェックを行なう、対応するLisp関数があります。
他の多くの言語とは異なり、Lispのオブジェクトは自己記述(self-typing)的です。オブジェクトの基本型は、オブジェクト自体に暗に含まれます。たとえばオブジェクトがベクターの場合、それを数字として扱うことはできません。Lispはベクターが数字でないことを知っているのです。
多くの言語では、プログラマーは各変数にたいしてデータ型を宣言しなければならず、コンパイラーは型を知っていますが、データの中に型はありません。Emacs Lispには、このような型宣言はありません。Lisp変数は任意の型の値をもつことができ、変数に保存した値と型を記憶します(実際には、特定の型の値だけをもつことができる少数のEmacs Lisp変数があります。Variables with Restricted Valuesを参照してください)。
このチャプターでは、GNU Emacs Lispの各標準型の意味、プリント表現(printed representation)、入力構文(read syntax)を説明します。これらのデータ型を使用する方法についての詳細は、以降のチャプターを参照してください。
2.1 Printed Representation and Read Syntax | Lispオブジェクトがテキストとして表現される方法。 | |
2.2 Comments | コメントとコメント書式の慣例。 | |
2.3 Programming Types | すべてのLispシステムに存在する型。 | |
2.4 Editing Types | Emacs固有の型。 | |
2.5 Read Syntax for Circular Objects | 循環構造にたいする入力構文。 | |
2.6 Type Predicates | 型に関連するテスト。 | |
2.7 Equality Predicates | 2つのオブジェクトが等しいかのテスト。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オブジェクトのプリント表現(printed
representation)とは、オブジェクトにたいしてLispプリンター(関数prin1
)が生成する出力のフォーマットです。すべてのデータ型は一意なプリント表現をもちます。オブジェクトの入力構文(read
syntax)とは、オブジェクトにたいしてLispリーダー(関数read
)が受け取る入力のフォーマットです。これは一意である必要はありません。多くの種類のオブジェクトが複数の構文をもちます。Reading and Printing Lisp Objectsを参照してください。
ほとんどの場合、オブジェクトのプリント表記が、入力構文としても使用されます。しかしLispプログラム内の定数とすることに意味が無いいくつかの型には、入力構文がありません。これらのオブジェクトはハッシュ表記(hash notation)でプリントされ、‘#<’、説明的な文字列(典型的には型名にオブジェクトの名前を続けたもの)、‘>’で構成される文字列です。たとえば:
(current-buffer) ⇒ #<buffer objects.texi>
ハッシュ表気は読み取ることができないので、Lispリーダーは‘#<’に遭遇すると、常にエラーinvalid-read-syntax
をシグナルします。
他の言語では、式はテキストであり、これ以外の形式はありません。Lispでは、第一に式はLispオブジェクトであって、オブジェクトの入力構文であるテキストは副次的なものに過ぎません。たいてい、この違いを強調する必要はありませんが、このことを心に留めておかないと、たまに混乱することがあるでしょう。
インタラクティブに式を評価するとき、Lispインタープリターは最初にそれのテキスト表現を読み取り、Lispオブジェクトを生成してから、そのオブジェクトを評価します(Evaluationを参照してください)。しかし評価と読み取りは、別の処理です。読み取りによりテキストにより表現されたLispオブジェクトを読み取り、Lispオブジェクトがreturnされます。後でオブジェクトは評価されるかもしれないし、評価されないかもしれません。オブジェクトを読み取るための基本的な関数read
の説明は、Input Functionsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コメント(comment)hqあ、プログラム中に記述されたテキストであり、そのプログラムを読む人間ためだけに存在し、プログラムの意味には何の影響ももちません。Lispでは、それが文字列や文字定数にある場合をのぞき、セミコロン(‘;’)でコメントが開始されます。行の終端までがコメントになります。Lispリーダーはコメントを破棄します。コメントはLispシステム内でプログラムを表すLispオブジェクトの一部にはなりません。
‘#@count’構成は、次のcount個の文字をスキップします。これはプログラムにより生成されたバイナリーデータを含むコメントにたいして有用です。Emacs Lisp倍とコンパイラーは、出力ファイルにこれを使用します(Byte Compilationを参照してください)。しかしソースファイル用ではありません。
コメントのフォーマットにたいする慣例は、Tips on Writing Commentsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispには2種類の一般的な型があります。1つはLispプログラミングに関わるもので、もう1つは編集に関わるものです。前者はさまざまな形で多くのLisp実装に存在します。後者はEmacs Lispに固有です。
2.3.1 Integer Type | 小数部のない数字。 | |
2.3.2 Floating-Point Type | 広い範囲をもつ、小数部をもつ数字。 | |
2.3.3 Character Type | 文字、数字、コントロール文字にたいする表現。 | |
2.3.4 Symbol Type | 関数、変数、プロパティーリストを参照する、一意に識別される多目的オブジェクト。 | |
2.3.5 Sequence Types | リストと配列はどちらもシーケンスに分類されます。 | |
2.3.6 Cons Cell and List Types | コンスセル、および(コンスセルにより作られる)リスト。 | |
2.3.7 Array Type | 配列には文字列とベクターが含まれます。 | |
2.3.8 String Type | (効率的な)文字の配列。 | |
2.3.9 Vector Type | 1次元の配列。 | |
2.3.10 Char-Table Type | 文字によりインデックスされる1次元の疎な配列。 | |
2.3.11 Bool-Vector Type | t とnil からなる、1次元の配列。
| |
2.3.12 Hash Table Type | とても高速な参照用のテーブル。 | |
2.3.13 Function Type | 他の場所から呼び出せる実行可能なコードの断片。 | |
2.3.14 Macro Type | より基本的だが少し見栄えの悪い、式を他の式に展開する手法。 | |
2.3.15 Primitive Function Type | Lispから呼び出せる、Cで記述された関数。 | |
2.3.16 Byte-Code Function Type | Lispで記述されてからコンパイルされた関数。 | |
2.3.17 Autoload Type | 頻繁に使用されない関数を自動的にロードするために使用される型。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
整数の値の範囲はマシンに依存します、最小のレンジは-536,870,912から536,870,911(30ビットでは
-2**29
から
2**29 - 1)
ですが、多くのマシンはこれより広い範囲を提供します。Emacs
Lispの数学関数は整数のオーバーフローをチェックしません。したがってEmacsのh整数が30ビットの場合、(1+
536870911)
は-536,870,912になります。
整数にたいする入力構文は、(10を基数とする)数字のシーケンスで、オプションで先頭に符号、最後にピリオドがつきます。Lispインタープリターにより生成されるプリント表記には、先頭の ‘+’や、最後の‘.’はありません。
-1 ; 整数の-1. 1 ; 整数の1. 1. ; これも整数の1. +1 ; これも整数の1.
特別な例外として、数字シーケンスが有効なオブジェクトとしては大きすぎる、または小さすぎる整数を指定する場合、Lispリーダーはそれを浮動小数点数(Floating-Point Typeを参照してください)として読み取ります。たとえば、Emacsの整数が30ビットの場合、536870912
は浮動小数点数の536870912.0
として読み取られます。
詳細は、Numbersを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
浮動小数点数は、コンピューターにおける科学表記に相当するものです。浮動小数点数を10の指数をともなう有理数として考えることができます。正確な有効桁数と可能な指数は、マシン固有です。Emacsは値の保存にCデータ型のdouble
を使用し、内部的には10の指数ではなく、2の指数として記録します。
浮動小数点数のプリント表現には、(後に最低1つの数字をともなう)小数点と、指数のどちらか一方、または両方が必要です。たとえば‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は、いずれも浮動小数点数の1500を記述し、これらはすべて等価です。
詳細は、Numbersを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispでの文字(character)は、整数以外の何者でもありません。他の言い方をすると、文字は文字コードで表現されます。たとえば文字Aは、整数の65として表現されます。
プログラムで文字を個別に使用するのは稀であり、文字のシーケンスとして構成される文字列(strings)として扱われるのがより一般的です。String Typeを参照してください。
文字列やバッファーの中の文字は、現在のところ0から4194303の範囲 — つまり22ビットに制限されています(Character Codesを参照してください)。0から127のコードはASCIIコードで、残りは非ASCIIです(Non-ASCII Charactersを参照してください)。キーボード入力を表す文字は、Control、Meta、Shiftなどの修飾キーをエンコードするために、より広い範囲をもちます。
メッセージのために、文字にたいして人間が読むことができるテキストによる説明を生成する特別な関数が存在します。Describing Characters for Help Messagesを参照してください。
2.3.3.1 Basic Char Syntax | 標準的な文字の構文。 | |
2.3.3.2 General Escape Syntax | 文字をコードにより指定する方法。 | |
2.3.3.3 Control-Character Syntax | コントロール文字の構文。 | |
2.3.3.4 Meta-Character Syntax | メタ文字の構文。 | |
2.3.3.5 Other Character Modifier Bits | ハイパー、スーパー、アルト文字の構文。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字は実際には整数なので、文字のプリント表現は10進数です。文字にたいする入力構文も利用可能ですが、Lispプログラムでこの方法により文字を記述するのは、明解なプログラミングではありません。文字にたいしては、Emacs Lispが提供する、特別な入力構文を常に使用するべきです。これらの構文フォーマットはクエスチョンマークで開始されます。
英数字にたいする通常の入力構文は、クエスチョンマークと、その後にその文字を記述します。したがって文字Aにたいしては‘?A’、文字Bにたいしては‘?B’、文字aにたいしては‘?a’となります。
たとえば:
?Q ⇒ 81 ?q ⇒ 113
句読点文字にも同じ構文を使用できますが、Lispコードを編集するためのEmacsコマンドが混乱しないように、‘\’を追加するのがよい場合がしばしばあります。たとえば開きカッコを記述するために‘?\(’と記述します。その文字が‘\’の場合、それをクォートするために、‘?\\’のように2つ目の‘\’を使用しなければなりません。
control-g、backspace、tab、newline、vertical tab、formfeed、space、return、del、escapeはそれぞれ‘?\a’、‘?\b’、‘?\t’、‘?\n’、‘?\v’、‘?\f’、‘?\s’、‘?\r’、‘?\d’、‘?\e’と表すことができます(後にダッシュのついた‘?\s’は違う意味をもちます — これは後続の文字にたいして“super”の修飾を適用します)。したがって、
?\a ⇒ 7 ; control-g, C-g ?\b ⇒ 8 ; backspace, BS, C-h ?\t ⇒ 9 ; tab, TAB, C-i ?\n ⇒ 10 ; newline, C-j ?\v ⇒ 11 ; vertical tab, C-k ?\f ⇒ 12 ; formfeed character, C-l ?\r ⇒ 13 ; carriage return, RET, C-m ?\e ⇒ 27 ; escape character, ESC, C-[ ?\s ⇒ 32 ; space character, SPC ?\\ ⇒ 92 ; backslash character, \ ?\d ⇒ 127 ; delete character, DEL
バックスラッシュが“エスケープ文字(escape character)”の役割を果たすので、これらのバックスラッシュで始まるシーケンスはエスケープシーケンス(escape sequences)とも呼ばれます。この用語法は、文字ESCとは関係ありません。‘\s’は文字定数としての使用を意図しており、文字定数の内部では、単にスペースを記述します。
エスケープという特別な意味を与えずに、任意の文字の前にバックスラッシュの使用することは許されており、害もありませんしたがって‘?\+’は‘?+’と等価です。ほとんどの文字の前にバックスラッシュを追加することに理由はありません。しかし、Lispコードを編集するEmacsコマンドが混乱するのを避けるために、文字‘()\|;'`"#.,’の前にはバックスラッシュを追加するべきです。space、tab、newline、formfeedのような空白文字の前にもバックスラッシュを追加できます。しかし、tabやspaceのような実際の空白文字のかわりに、‘\t’や‘\s’のような可読性のあるエスケープシーケンスを使用するほうが明解です(スペースを後にともなうバックスラッシュを記述する場合、後続のテキストと区別するために、文字定数の後に余分なスペースを記述するべきです)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
特に重要なコントロール文字にたいする特別なエスケープシーケンスに加えて、Emacsは非ASCIIテキスト文字の指定に使用できる、何種類かのエスケープ構文を提供します。
最初に、文字をUnicodeの値で指定することができます。?\unnnn
はUnicodeのコードポイント‘U+nnnn’の文字を表します。ここでnnnnは、(慣例により)正確に4桁の16進数です。バックスラッシュは、後続の文字がエスケープシーケンスを形成することを示し、‘u’はUnicodeエスケープシーケンスを指定します。
U+ffff
より大きなコードポイントをもつUnicode文字を指定するために、若干異なる構文が存在します。?\U00nnnnnn
はコードポイント‘U+nnnnnn’の文字を表します。ここでnnnnnnは6桁の16進数です。Unicode
Standardは‘U+10ffff’までのコードポイントだけを定義するので、これより大きいコードポイントを指定すると、Emacsはエラーをシグナルします。
次に、文字を16進の文字コードで指定できます。16進エスケープシーケンスは、バックスラッシュ、‘x’、および16進の文字コードにより構成されます。したがって‘?\x41’は文字A、‘?\x1’は文字C-a、?\xe0
は
grave accentつきの文字‘a’を表します。
任意の数の16進数を使用できるので、この方法により任意の文字コードを表すことができます。
最後に、8進の文字コードにより文字を指定できます。8進エスケープシーケンスは、3桁までの8進数字をともなうバックスラッシュにより形成されます。したがって‘?\101’は文字A、‘?\001’は文字C-a、?\002
は文字C-bを表します。この方法で指定できるのは、8進コード777までの文字だけです。
これらのエスケープシーケンスは、文字列内でも使用されます。Non-ASCII Characters in Stringsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他の入力構文を使用してコントロール文字を表すことができます。これは後にバックスラッシュ、カレット、対応する非コントロール文字(大文字か小文字)をともなうクエスチョンマークから構成されます。たとえば‘?\^I’と‘?\^i’はどちらも、値が9である文字C-iにたいする、有効な入力構文です。
‘^’のかわりに、‘C-’を使用することもできます。したがって‘?\C-i’は、‘?\^I’や‘?\^i’と等価です。
?\^I ⇒ 9 ?\C-I ⇒ 9
文字列やバッファーの中では、ASCIIのコントロール文字だけが許されますが、キーボード入力にたいしては‘C-’により任意の文字をコントロール文字にすることができます。これらの非ASCIIのコントロール文字にたいするコントロール文字には 非コントロール文字にたいするコードと同様に、2**26 ビットが含まれます。通常のテキスト端末には、非ASCIIコントロール文字を生成する方法がありませんが、Xおよび他のウィンドウシステムを使用することにより、簡単に生成することができます。
歴史的な理由により、EmacsはDEL文字を、?のコントロール文字として扱います:
?\^? ⇒ 127 ?\C-? ⇒ 127
結果として、Xでは有意な入力文字であるControl-?文字を、‘\C-’を使用して表現することは今のところできません。さまざまなLispファイルがこの方法によりDELを参照するため、これを変更するのは簡単ではありません。
コントロール文字の表現はファイルや文字列のなかで見ることができますが、わたしたちは‘^’構文を推奨します。キーボード入力にたいするコントロール文字に好ましいのは、‘C-’構文です。どちらを使用するかはプログラムの意味に影響しませんが、プログラムを読む人の理解を助けるでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メタ文字(meta character)とは、META修飾キーとともにタイプされた文字です。そのような文字を表す整数には 2**27 のビットがセットされています。基本的な文字コードの広い範囲を利用可能にするために、メタや他の修飾にたいして上位ビットを使用します。
文字列では、メタ文字を示すASCII文字に、 2**7 ビットが付加されます。したがって文字列に含めることができるメタ文字のコードは1から255の範囲となり、メタ文字は通常のASCII文字のメタ修飾されたバージョンとなります。文字列内でのMETA処理の詳細については、Putting Keyboard Events in Stringsを参照してください。
メタ文字の入力構文には‘\M-’を使用します。たとえば‘?\M-A’はM-Aを意味します。8進文字コード(以下参照)や、‘\C-’、その他の文字にたいする他の構文とともに‘\M-’を使用できます。したがって、M-Aは‘?\M-A’や‘?\M-\101’と記述できます。同様に、C-M-bは‘?\M-\C-b’、‘?\C-\M-b’、‘?\M-\002’と記述することができます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
グラフィック文字(graphic character)の大文字小文字は、文字コードで示されます。たとえばASCIIでは、文字‘a’と文字‘A’は区別されます。しかしASCIIにはコントロール文字が大文字なのか小文字なのかを表現する方法がありません。コントロール文字がタイプされたときシフトキーが使用されたかを示すために、Emacsは 2**25 のビットを使用します。この区別は、X端末や、他の特別な端末を使用しているときだけ可能です。通常のテキスト端末は、これらの違いを報告しません。シフトをあらわすビットのためのLisp構文は‘\S-’です。したがって‘?\C-\S-o’や‘?\C-\S-O’は、shifted-control-o文字を表します。
Xウィンドウシステムは文字にセットできる、他に3つ修飾ビット — hyper、super、altを定義します。これらのビットにたいする構文は、‘\H-’、‘\s-’、‘\A-’です(これらのプレフィクスでは、大文字小文字は意味があります)。したがって‘?\H-\M-\A-x’はAlt-Hyper-Meta-xを表します(‘-’が後にない‘\s’は、スペース文字を表すことに注意してください)。 数値的には、ビット値2**22はalt、2**23はsuper、2**24はhyperです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacs Lispでのシンボル(symbol)とは、名前をもつオブジェクトです。シンボル名は、そのシンボルのプリント表現としての役割があります。Lispの通常の使用では、1つのobarray(Creating and Interning Symbolsを参照してください)により、シンボル名は一意です — 2つのシンボルが同じ名前をもつことはありません。
シンボルは、変数、関数名としての役割や、プロパティーリストを保持する役割をもつことができます。他のすべてのLispオブジェクトから区別するためだけの役割をもつ場合もあり、データ構造内にそのようなシンボルが存在することは、確実に認識されるでしょう。与えられたコンテキストにおいて、通常はこれらのうちの1つの使用だけが意図されます。しかし3つすべての方法で、1つのシンボルを独立して使用することもできます。
名前がコロン(‘:’)で開始されるシンボルは、キーワードシンボル(keyword symbol)と呼ばれます。これらのシンボルは自動的に定数として振る舞い、通常は未知のシンボルと、いくつかの特定の候補を比較することだけに使用されます。Variables that Never Changeを参照してください。
シンボル名にはどんな文字でも含めることができます。ほとんどのシンボル名は英字、数字、‘-+=*/’などの句読点文字で記述されます。このような名前には、特別な句読点文字は必要ありません。名前が数字のように見えない限りは、名前にはどのような文字も使用できます(名前が数字のように見える場合は、名前の先頭に‘\’を記述して、強制的にシンボルとして解釈させます)。文字‘_~!@$%^&:<>{}?’はあまり使用されませんが、これらも特別な句読点文字を必要としません。他の文字も、バックスラッシュでエスケープすることにより、シンボル名に含めることができます。しかし、文字列内でのバックスラッシュの使用とは対照的に、シンボル名でのバックスラッシュは、バックスラッシュの後の1文字をエスケープするだけです。たとえば文字列内では、‘\t’はタブ文字を表します。しかしシンボル名の中では、‘\t’は英字‘t’をクォートするに過ぎません。 名前にタブ文字をもつシンボルを記述するには、(バックスラッシュを前置した)実際のタブを使用しなければなりません。しかし、そのようなことを行なうことは、めったにありません。
Common Lispに関する注意:Common Lispでは、明示的にエスケープされない限り、小文字は常に大文字に“フォールドされ(folded)”ます。Emacs Lispでは大文字と小文字は区別されます。
以下はシンボル名の例です。4番目の例の中の‘+’は、シンボルが数字として読み取られるのを防ぐために、エスケープされていることに注意してください。6番目の例では、名前の残りの部分により数字としては不正なので、エスケープの必要はありません。
foo ; ‘foo’という名前のシンボル。 FOO ; ‘foo’とは別の、‘FOO’という名前のシンボル。
1+ ; ‘1+’という名前のシンボル ; (整数の‘+1’ではありません)。
\+1 ; ‘+1’という名前のシンボル ; (とても読みやすい名前とはいえません)。
\(*\ 1\ 2\) ; ‘(* 1 2)’という名前のシンボル(悪い名前)。 +-*/_~!@$%^&=:<>{} ; ‘+-*/_~!@$%^&=:<>{}’という名前のシンボル。 ; これらの文字はエスケープする必要はありません。
シンボル名がプリント表現としての役割をもつというルールの例外として、‘##’があります。これは、名前が空文字列の、internされたシンボルのプリント表現です。さらに‘#:foo’は、internされていないfooという名前のシンボルにたいするプリント表現です(通常、Lispリーダーはすべてのシンボルをinternします。Creating and Interning Symbolsを参照してください)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シーケンス(sequence)とは、要素の順序セットを表現する、Lispオブジェクトです。Emacs Lispには、2種類のシーケンス — リスト(lists)と配列(arrays)があります。
リストはもっとも一般的に使用されるシーケンスです。リストは任意の型の要素を保持でき、要素の追加・削除により簡単に長さを変更できます。リストについては、次のサブセクションを参照してください。
配列は固定長のシーケンスです。配列はさらに文字列(strings)、ベクター(vectors)、文字テーブル(char-tables)、ブールベクター(bool-vectors)に細分されます。ベクターは任意の型の要素を保持できますが、文字列の要素は文字でなければならず、ブールベクターの要素はt
かnil
でなければなりません。文字テーブルはベクターと似ていますが、有効な文字によりインデックスづけされる点が異なります。文字列内の文字は、バッファー内の文字のようにテキストプロパティーをもつことができます(Text Propertiesを参照してください)。しかしベクターは、その要素が文字のときでも、テキストプロパティーをサポートしません。
リスト、文字列、およびその他の配列型も、重要な類似点を共有します。たとえば、それらはすべて長さlをもち、要素は0からl-1でインデックスづけされます。いくつかの関数はシーケンス関数と呼ばれ、これらは任意の種類のシーケンスを許容します。たとえば、関数length
は、任意の種類のシーケンスの長さを報告します。Sequences, Arrays, and Vectorsを参照してください。
シーケンスは読み取りにより常に新たに作成されるので、同じシーケンスを2回読み取るのは、一般的に不可能です。シーケンスにたいする入力構文を2回読み取った場合、内容が等しい2つのシーケンスを得ます。これには1つ例外があります。空リスト()
は、常に同じオブジェクトnil
を表します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コンスセル(cons cell)は、CARスロット、CDRスロットと呼ばれる2つのスロットから構成されるオブジェクトです。各スロットは、任意のLispオブジェクトを保持できます。そのときCARスロットに保持されるオブジェクトが何であれ、わたしたちは“このコンスセルのCAR”のような言い方をします。これはCDRの場合も同様です。
リスト(list)は、コンスセルの連続するシリーズで、各コンスセルのCDRスロットは、次のコンスセル、または空リストを保持します。空リストは実際にはシンボルnil
です。詳細については、Listsを参照してください。ほとんどのコンスセルはリストの一部として使用されるので、わたしたちはコンスセルにより構成される任意の構造を、リスト構造(list
structure)という用語で参照します。
Cプログラマーにたいする注意: Lispのリストはコンスセルにより構築される、リンクリスト(linked list)として機能します。Lispではポインターは暗黙的なので、わたしたちはコンスセルのスロットが、値を“保持(hold)”するのか、それとも値を“指す(point)”のかを区別しません。
コンスセルはLispの中心なので、“コンスセルではないオブジェクト”にたいする単語もあります。これらのオブジェクトはアトム(atoms)と呼ばれます。
リストにたいする入力構文とプリント表現は等しく、それは左カッコ、任意の数の要素、右カコから構成されます。以下はリストの例です:
(A 2 "A") ; 3要素のリスト。 () ; 要素がないリスト(空リスト)。 nil ; 要素がないリスト(空リスト)。 ("A ()") ; 1要素のリスト: 文字列"A ()"
。 (A ()) ; 2要素のリスト:A
と空リスト。 (A nil) ; 同上 ((A B C)) ; 1要素のリスト ; (この要素は、3要素のリスト)。
読み取りにおいては、カッコの内側は、リストの要素になります。つまり、コンスセルは各要素から作成されます。コンスセルのCARスロットは要素を保持し、CDRスロットはリスト内の次のコンスセル(このコンスセルはリスト内の次の要素を保持します)を参照します。最後のコンスセルのCDRスロットは、nil
を保持するようにセットされます。
CAR、CDRという名称は、Lispの歴史に由来します。オリジナルのLisp実装はIBM 704コンピューターで実行されていました。ワードを2つの部分、つまり“address”と呼ばれる部分と、“decrement”と呼ばれる部分に分割していて、その際CARはaddress部から内容を取り出す命令で、CDRはdecrement部から内容を取り出す命令でした。対照的に“cons
cells”は、これらを作成する関数cons
から命名されました。この関数は関数の目的、すなわちセルを作る(construction of
cells)という目的から命名されました。
2.3.6.1 Drawing Lists as Box Diagrams | リストを絵で書いたら。 | |
2.3.6.2 Dotted Pair Notation | コンスセルの一般的な構文。 | |
2.3.6.3 Association List Type | 特別に構成されるリスト。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コンスセルを表現するドミノのような1対のボックスによる図により、リストを説明することができます(Lispリーダーがこのような図を読み取ることはできません。人間およびコンピューターが理解できるテキスト表記と異なり、ボックスの図は人間だけが理解できます)。この図は3要素のリスト(rose
violet buttercup)
を表したものです:
--- --- --- --- --- --- | | |--> | | |--> | | |--> nil --- --- --- --- --- --- | | | | | | --> rose --> violet --> buttercup
この図では、ボックスは任意のLispオブジェクトへの参照を保持できるスロットを表します。ボックスのペアはコンスセルを表します。矢印はLispオブジェクト(アトム、または他のコンスセル)への参照を表します。
この例では、1番目のボックスは1番目のコンスセルで、それのCARはrose
(シンボル)を参照または“保持(holds)”します。2番目のボックスは1番目のコンスセルのCDRを保持し、次のボックスペア、すなわち2番目のコンスセルを参照します。2番目のコンスセルのCARはviolet
で、CDRは3番目のコンスセルです。(最後の)3番目のコンスセルのCDRは、nil
です。
同じリスト(rose violet buttercup)
を、違うやり方で描いた別の図で表してみましょう:
--------------- ---------------- ------------------- | car | cdr | | car | cdr | | car | cdr | | rose | o-------->| violet | o-------->| buttercup | nil | | | | | | | | | | --------------- ---------------- -------------------
要素がないリストは空リスト(empty
list)で、これはシンボルnil
と同じです。別の言い方をすると、nil
はシンボルであり、リストでもあります。
以下は、リスト(A ())
、または等価な(A nil)
をボックスと矢印で描いたものです:
--- --- --- --- | | |--> | | |--> nil --- --- --- --- | | | | --> A --> nil
以下はもっと複雑な例です。これは、1番目の要素が2等疎のリスとである、3要素のリスト((pine needles) oak
maple)
を表します:
--- --- --- --- --- --- | | |--> | | |--> | | |--> nil --- --- --- --- --- --- | | | | | | | --> oak --> maple | | --- --- --- --- --> | | |--> | | |--> nil --- --- --- --- | | | | --> pine --> needles
同じリストを2番目のボックス表記で表すと、以下のようになります:
-------------- -------------- -------------- | car | cdr | | car | cdr | | car | cdr | | o | o------->| oak | o------->| maple | nil | | | | | | | | | | | -- | --------- -------------- -------------- | | | -------------- ---------------- | | car | cdr | | car | cdr | ------>| pine | o------->| needles | nil | | | | | | | -------------- ----------------
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ドットペア表記(dotted pair
notation)はCARとCDRが明示的に表されたコンスセルにたいする、一般的な構文です。この構文では、(a
.
b)
は、CARがオブジェクトaで、CDRがオブジェクトbという意味になります。CDRがリスとである必要がないので、ドットペア表記は、より一般的なリスト構文です。しかしキスと構文が機能するでような場合には、より扱いにくくなります。ドットペア表記では、リスト‘(1
2 3)’は、‘(1 . (2 . (3
.
nil)))’と記述されます。nil
で終端されたリストにたいしては、どちらの表記法も使用できますが、リスト表記の方が、通常は明解で便利です。リストをプリントする場合、コンスセルのCDRがリスとでないときだけ、ドットペア表記が使用されます。
以下はボックスを使用してドットペア表記を表した例です。この例はペア(rose . violet)
を表します。
--- --- | | |--> violet --- --- | | --> rose
最後のCDRが非nil
のコンスセルのチェーンを表すために、ドットペア表記とリスト表記を組み合わせることができます。リストの最後の要素の後にドットを記述して、その後に最後のコンスセルのCDRを記述します。たとえば、(rose
violet . buttercup)
は、(rose . (violet
. buttercup))
と等価です。オブジェクトは以下のようになります:
--- --- --- --- | | |--> | | |--> buttercup --- --- --- --- | | | | --> rose --> violet
構文(rose . violet .
buttercup)
は無効です。なぜならこれが意味することは何もないからです。何かあるにしても、violet
のためにCDRがすでに使用されているコンスセルのCDRにbuttercup
を置く、ということになります。
リスト(rose violet)
は(rose . (violet))
と等価であり、以下のようになります:
--- --- --- --- | | |--> | | |--> nil --- --- --- --- | | | | --> rose --> violet
同様に3要素のリスト(rose violet buttercup)
は、(rose . (violet
. (buttercup)))
と等価です。
これは以下のようになります:
--- --- --- --- --- --- | | |--> | | |--> | | |--> nil --- --- --- --- --- --- | | | | | | --> rose --> violet --> buttercup
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
連想リスト(association list)またはalistは、要素がコンスセルであるように特別に構成されたリストです。各要素においては、CARがキー(key)で、CDRが連想値(associated value)であると考えます(連想値がCDRのCARに保存される場合もあります)。リストの先頭に連想値を追加したり削除するのが簡単なので、連想リストはスタック(stack)にしばしば使用されます。
たとえば、
(setq alist-of-colors '((rose . red) (lily . white) (buttercup . yellow)))
これは変数alist-of-colors
に3葉疎のalistをセットします。最初の要素では、rose
がキーで、red
が値になります。
alistと、alistに関数についての詳細な説明は、Association Listsを参照してください。テーブルを照合する、(多くのキーの操作を、より速く行なう)他の手段については、Hash Tablesを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
配列(array)は、他のLispオブジェクトを保持または参照する、任意の数のスロットから構成され、メモリーの連続ブロックに配列されます。配列の任意の要素へのアクセス時間は、大体同じです。対照的に、リストの要素にたいするアクセスは、リスト内でのその要素の位置に比例した時間を要します(リストの最後の要素にアクセスするには、リストの最初の要素にアクセスするより、長い時間を要します)。
Emacsは文字列(strings)、ベクター(vectors)、ブールベクター(bool-vectors)、文字テーブル(char-tables)という、4種の配列を定義します。
文字列は文字の配列で、ベクターは任意のオブジェクトの配列です。ブールベクターはt
かnil
だけを保持できます。この種の配列は、もっとも大きい整数までの、任意の長さをもつことができます。文字テーブルは、任意の有効な文字コードによりインデックスづけされる疎な配列で、任意のオブジェクトを保持することができます。
配列の最初の要素はインデックス0、2番目の要素はインデックス1、...となります。これは0基準zero-originのインデックスづけと呼ばれます。たとえば、4要素の配列は、インデックス0、1、2、3をもちます。利用できる最大のインデックス値は、配列の長さより1小さくなります。1度配列が作成されると、長さは固定されます。
Emacs Lispのすべての配列は、1次元です(他のほとんどのプログラミング言語は多次元配列をサポートしますが、これらは必須ではありません。ネストされた1次元配列により同じ効果を得ることができます)。各種の配列のは、独自の入力構文をもちます。詳細は以降のセクションを参照してください。
配列型はシーケンス型のサブセットであり、文字列型、ベクター型、ブールベクター型、文字テーブル型が含まれます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字列(string)とは、文字の配列です。Emacsがテキストエディターであることから予想できるように、文字列は、たとえばLispシンボルの名前、ユーザーへのメッセージ、バッファーから抽出されたテキストの表現など、多くの目的のために使用されます。Lispの文字列は定数です。文字列を評価すると、それと同じ文字列がreturnされます。
文字列を操作する関数については、Strings and Charactersを参照してください。
2.3.8.1 Syntax for Strings | Lisp文字列を指定する方法。 | |
2.3.8.2 Non-ASCII Characters in Strings | 文字列内の国際化文字。 | |
2.3.8.3 Nonprinting Characters in Strings | 文字列内の印刷不可能なリテラル文字。 | |
2.3.8.4 Text Properties in Strings | テキストプロパティーをともなう文字列。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字列にたいする入力構文は、"like
this"
のように、ダブルクォート、任意個の文字、もう1つのダブルクォートから構成されます。文字列内にダブルクォートを含める場合は、それの前にバックスラッシュを記述します。したがって、"\""
は1つのダブルクォート文字だけを含む文字列です。同様に、バックスラッシュを含める場合は、"this
\\ is a single embedded backslash"
のように、それの前にもう1つのバックスラッシュを記述します。
文字列にたいする入力構文では、改行(newline)は特別ではありません。ダブルクォートの間に改行を記述すれば、その改行は文字列内の文字となります。しかしエスケープされた改行 — 前に‘\’をともなう改行 —は文字列の一部とはなりません。同様に、エスケープされたスペース‘\ ’も無視されます。
"It is useful to include newlines in documentation strings, but the newline is \ ignored if escaped." ⇒ "It is useful to include newlines in documentation strings, but the newline is ignored if escaped."
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacdの文字列内の非ASCII文字にたいしては、2つのテキスト表現 — マルチバイト(multibyte)とユニバイト(unibyte)があります(Text Representationsを参照してください)。大まかに言うと、ユニバイト文字列にはraw(生)バイトが保存され、マルチバイト文字列には人間が読めるテキストが保存されます。ユニバイト文字列内の各文字はバイトであり、値は0から255となります。対照的に、マルチバイト文字列内の各文字は、0から4194303の値をもつかもしれません(Character Typeを参照してください)。両方とも、127より上の文字は非ASCIIです。
文字をリテラルとして記述することにより、文字列に非ASCII文字を含めることができます。マルチバイトのバッファーや文字列、あるいはマルチバイトとしてvisitされたファイル等の、マルチバイトのソースから文字列定数を読み込む場合、Emacsは非ASCII文字をマルチバイト文字として読み取り、その文字列を自動的にマルチバイト文字列にします。ユニバイトのソースから文字列定数を読み込む場合、Emacsは非ASCII文字をユニバイト文字として読み取り、その文字列を湯にバイト文字列にします。
マルチバイト文字列内にリテラルとして文字を記述するかわりに、エスケープシーケンスを使用して文字コードとして記述できます。エスケープシーケンスについての詳細は、General Escape Syntaxを参照してください。
文字列定数内でUnicodeスタイルのエスケープシーケンス‘\uNNNN’または‘\U00NNNNNN’を使用する場合、(たとえASCII文字の場合でも)Emacsは自動的に文字列をマルチバイトとみなします。
文字列定数内で、16進エスケープシーケンス(‘\xn’)、および8進エスケープシーケンス(‘\n’)を使用することもできます。しかし注意してください: 文字列定数が16進または8進のエスケープシーケンスを含み、それらのエスケープシーケンスすべてがユニバイト文字(256より小)を指定していて、その文字列内に他にリテラルの非ASCII文字またはUnicodeスタイルのエスケープシーケンスが存在しない場合、Emacsは自動的に文字列をユニバイト文字列とみなします。つまり文字列内のすべての非ASCII文字は8ビットのrawバイトとみなされます。
16進および8進のエスケープシーケンスではエスケープされた文字コードは可変個の数字を含むかもしれないので、それに続く文字で、16進および8進として有効ではない最初の文字は、エスケープシーケンスを終了させます。文字列内の次の文字が16進または8進として解釈できる文字の場合は、‘\ ’(バックスラッシュとスペース)を記述して、エスケープシーケンスを終了できます。たとえば‘\xe0\ ’はgrave accentつきの‘a’という、1文字を表します。文字列内の‘\ ’は、バックスラッシュー改行と同様です。これは文字列内の文字とはなりませんが、先行する16進エスケープを終了します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リテラル文字と同様に、文字列定数内でバックスラッシュによるエスケープシーケンスを使用できます(ただし文字定数を開始するクエスチョンマークは使用しません)。たとえば、非プリント文字のタブとC-aを含む文字列は、"\t,
\C-a"
のように、それらの間にカンマとスペースを記述します。文字にたいする入力構文の説明は、Character Typeを参照してください。
しかし、バックスラッシュによるエスケープシーケンスとともに記述できるすべての文字が、文字列内で有効というわけではありません。文字列が保持できるコントロール文字は、ASCIIコントロール文字だけです。ASCIIコントロール文字では、文字列の大文字小文字は区別されません。
正確に言うと、文字列はメタ文字を保持できません。しかし文字列がキーシーケンスとして使用される場合、文字列内でメタで修飾されたASCII文字を表現するための方法を提供する、特別な慣習があります。文字列定数内でメタ文字を示すために‘\M-’構文を使用した場合、これは文字列内の文字の
2**7
のビットをセットします。その文字列がdefine-key
またはlookup-key
で使用される場合、この数字コードは等価なメタ文字に変換されます。Character Typeを参照してください。
文字列はhyper、super、altで修飾された文字を保持できません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字列は、その文字自身に加えて、文字のプロパティーも保持することができます。これにより、特別なことをしなくても、文字列とバッファーとの間でテキストをコピーするプログラムが、テキストプロパティーをコピーすることが可能になります。テキストプロパティーが何を意味するかについての説明は、Text Propertiesを参照してください。テキストプロパティーをもつ文字列は、特別な入力構文とプリント構文を使用します。
#("characters" property-data...)
ここでproperty-dataは3個でグループ化された、0個以上の要素から構成されます:
beg end plist
要素begおよびendは整数で、文字列内のインデックスの範囲を指定します。plistはその範囲にたいするプロパティーリストです。たとえば、
#("foo bar" 0 3 (face bold) 3 4 nil 4 7 (face italic))
これはテキスト内容が‘foo
bar’で、最初の3文字はface
プロパティーに値bold
をもち、最後の3文字はface
プロパティーに値italic
をもつことを表します。(4番目の文字にはテキストプロパティーはないので、プロパティーリストはnil
です。実際には、範囲の中の指定されていない文字はデフォルトではプロパティーをもたないので、範囲のプロパティーリストをnil
と指定する必要ありません)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ベクター(vector)は、任意の型の要素からなる1次元の配列です。ベクター内の任意の要素へのアクセスに要す時間は、一定です(リストの場合、要素へのアクセスに要す時間は、リストの先頭からその要素までの距離に比例します)。
ベクターのプリント表現は、左角カッコ(left square bracket)、要素、右角カッコ(right square bracket)から構成されます。これは入力構文でもあります。数字や文字列と同様に、ベクターは評価において定数と判断されます。
[1 "two" (three)] ; 3要素のベクター。
⇒ [1 "two" (three)]
ベクターに作用する関数については、Vectorsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字テーブル(char-table)は、任意の型の要素をもつ1次元の配列で、文字コードによりインデックスづけされます。文字テーブルは、文字コードに情報を割り当てることを必要とする多くの処理を簡単にするための、特別な追加の機能をもちます — たとえば、文字テーブルは、継承するための親、デフォルト値、特別な目的のために使用する少数の余分なスロットをもつことができます。文字テーブルは、文字セット全体にたいして1つの値を指定することもできます。
文字テーブルのプリント表現はベクターと似ていますが、最初に余分な‘#^’があります1。
文字テーブルを操作する特別な関数については、Char-Tablesを参照してください。文字テーブルの使用には以下が含まれます:
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ブールベクター(bool-vector)は、要素がt
かnil
でなければならない、1次元の配列です。
ブールベクターのプリント表現は文字列と似ていますが、後に長さを記述した‘#&’で始まります。これに続く文字列定数は、ビットマップとして実際に内容を指定するブールベクターです
—
文字列定数内のそれぞれの“文字”は8ビットを含み、これはブールベクターの次の8要素を指定します(1はt
、0はnil
です)。文字の最下位ビットブールベクターの最下位のインデックスに対応します。
(make-bool-vector 3 t) ⇒ #&3"^G" (make-bool-vector 3 nil) ⇒ #&3"^@"
‘C-g’の2進コードは111、‘C-@’はコード0の文字なので、この結果は道理にかなっています。
長さが8の倍数でない場合、プリント表現には余分な要素が表示されますが、これらの余分な要素に意味はありません。たとえば以下の例では、最初の3ビットだけが使用されるので、2つのブールベクターは等価です:
(equal #&3"\377" #&3"\007") ⇒ t
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ハッシュテーブルは非常に高速な照合テーブルの一種で、キーを対応する値にマップするalistと似ていますが、より高速です。ハッシュテーブルのプリント表現、以下のようにハッシュテーブルのプロパティーと内容を指定します:
(make-hash-table) ⇒ #s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ())
ハッシュテーブルについての詳細な情報は、Hash Tablesを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他のプログラミング言語の関数と同様に、Lisp関数は実行可能なコードです。他の言語とは異なり、Lispの関数はLispオブジェクトでもあります。Lispのコンパイルされていない関数はラムダ式
— つまり1番目の要素がシンボルlambda
であるリストです(Lambda Expressionsを参照してください)。
ほとんどのプログラミング言語では、名前のないの関数はありません。Lispでは、関数に本質的な名前はありません。名前がなくても、ラムダ式を関数として呼び出すことができます。これを強調するために、わたしたちはこれを無名関数(anonymous function)とも呼びます(Anonymous Functionsを参照してください)。Lispの名前つき関数は、関数セルに有効な関数がセットされた単なるシンボルです(Defining Functionsを参照してください)。
ほとんどの場合、関数はLispプログラム内のLisp式に名前が記述されたところで呼び出されます。しかし、実行時に関数オブジェクトを構築または取得してから、基本関数funcall
およびapply
により呼び出すことができます。Calling Functionsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispマクロ(Lisp
macro)は。Lisp言語を拡張する、ユーザー定義の構成です。これはオブジェクトとしてではなく関数のように表現されますが、引数の渡し方の意味が異なります。Lispマクロの形式はリストです。これは、最初の要素がmacro
で、(lambda
シンボルを含む)CDRがLisp関数オブジェクトであるようなリストです。
Lispマクロオブジェクトは通常、ビルトインのdefmacro
関数で定義されますが、macro
で始まる任意のリストも、Emacsにとってはマクロです。マクロを記述する方法の説明は、Macrosを参照してください。
警告: Lispマクロとキーボードマクロ(Keyboard Macrosを参照してください)は、完全に別物です。修飾なしで“マクロ”という単語を使用したときは、キーボードマクロではなく、Lispマクロのことを指します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
基本関数(primitive function)とは、Cプログラミング言語で記述された、Lispから呼び出せる関数です。基本関数はsubrsやビルと陰関数(built-in functions)とも呼ばれます(単語“subr”は、“サブルーチン(subroutine)”が由来です)。ほとんどの基本関数、呼び出されたとき、すべての引数を評価します。すべての引数を評価しない基本関数は、スペシャルフォーム(special form)と呼ばれます(Special Formsを参照してください)。
呼び出す側からすれば、その関数が基本関数かどうかは、問題になりません。しかし、基本関数をLispで記述された関数で再定義した場合は、問題になります。理由は、その基本関数がCコードから直接呼び出されているかもしれないからです。Lispから再定義した関数を呼び出すと、これは新しい定義を使用するでしょうが、Cコードから呼び出すと、ビルトインの定義が使用されるでしょう。したがって、基本関数の再定義はしないでください。
関数(function)という用語により、LispやCで記述された、すべてのEmacs関数を参照します。Lispで記述された関数についての情報は、Function Typeを参照してください。
基本関数に入力構文はなく、サブルーチン名とともにハッシュ表記でプリントします。
(symbol-function 'car) ; そのシンボルの関数セルに ; アクセスします。 ⇒ #<subr car> (subrp (symbol-function 'car)) ; これは基本関数か? ⇒ t ; イェース。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バイトコード関数オブジェクト(byte-code function objects)は、Lispコードをバイトコンパイルすることにより生成されます(Byte Compilationを参照してください)。内部的には、バイトコード関数オブジェクトは、ベクターによく似ています。しかしバイトコード関数オブジェクトが関数呼び出しのように見える場合、評価プロセスにより、このデータ型は特別に処理されます。Byte-Code Function Objectsを参照してください。
バイトコード関数オブジェクトのプリント表現と入力構文は、ベクターのものと似ていますが、開き角カッコ‘[’の前に‘#’があります。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
autoloadオブジェクト(autoload
object)は、最初の要素がシンボルautoload
のリストです。これはシンボルの関数定義として保存され、実際の定義にたいする代替としての役割をもちます。autoloadオブジェクトは、必要な時にロードされるLispコードファイルのなかで、実際の定義を見つけることができることを宣言します。これにはファイル名と、加えて実際の定義についての他のいくつかの情報が含まれます。
ファイルがロードされた後、そのシンボルは、autoloadオブジェクトではない、新しい関数定義をもつはずです。新しい定義は、最初からそこにあったかのように呼び出されます。ユーザーの観点からは、関数呼び出しは期待された動作、つまりロードされたファイル内の関数定義を使用します。
autoloadオブジェクトは通常、シンボルの関数セルにオブジェクトを保存する、関数autoload
により作成されます。詳細は、Autoloadを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
前のセクションの型は一般的なプログラミングの目的のために使用され、これらのほとんどは、ほとんどのLisp方言で一般的です。Emacs Lispは、編集に関する目的のために、いくつかの追加のデータ型を提供します。
2.4.1 Buffer Type | 編集のための基本オブジェクト。 | |
2.4.2 Marker Type | バッファー内の位置。 | |
2.4.3 Window Type | バッファーはウィンドウ内に表示されます。 | |
2.4.4 Frame Type | ウィンドウはフレームを細分します。 | |
2.4.5 Terminal Type | フレームを表示する端末デバイス。 | |
2.4.6 Window Configuration Type | フレームが細分化された方法を記録する。 | |
2.4.7 Frame Configuration Type | すべてのフレームの状態を記録する。 | |
2.4.8 Process Type | 背後のOS上で実行されるEmacsのサブプロセス。 | |
2.4.9 Stream Type | 文字の受信と送信。 | |
2.4.10 Keymap Type | キーストロークがどの関数を呼び出すか。 | |
2.4.11 Overlay Type | オーバーレイが表示される方法。 | |
2.4.12 Font Type | テキストを表示するフォント。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファー(buffer)とは、編集されるテキストを保持するオブジェクトです(Buffersを参照してください)。ほとんどのバッファーはディスクファイル(Filesを参照してください)の内容を保持するので、それらは編集できますが、他の目的のために使用されるものもいくつかあります。ほとんどのバッファーは、ユーザーにより閲覧されることも意図しているので、いつかはウィンドウ内(Windowsを参照してください)に表示されます。しかしバッファーはウィンドウに表示される必要はありません。バッファーはそれぞれ、ポイント(point)と呼ばれる位置指定をもちます(Positionsを参照してください)。ほとんどの編集コマンドは、カレントバッファー内のポイントに隣接する内容を処理します。常に1つのバッファーがカレントバッファー(current buffer)です。
バッファーの内容は文字列によく似ていますが、バッファーはEmacs Lispの文字列と同じようには使用されず、利用可能な操作は異なります。文字列にテキストを“挿入”するためには、部分文字列の結合が必要で、結果は完全に新しい文字列オブジェクトなのに比べて、バッファーでは既存のバッファーに効率的にテキストを挿入して、バッファーの内容を変更できます。
標準的なEmacs関数の多くは、カレントバッファー内の文字を操作したりテストするためのものです。このマニュアルには、これらの関数の説明のために、1つのチャプターをあてています(Textを参照してください)。
他のデータ構造のいくつかは、各バッファーに関連付けられています:
ローカルキーマップと変数リストは、具ローマルナバインディングや値を個別にオーバーライドするためのエントリーを含みます。これらは、実際にプログラムを変更することなく、異なるバッファーでのプログラムの振る舞いをカスタマイズするために使用されます。
バッファーはインダイレクト(indirect: 間接) — つまり他のバッファーとテキストを共有するが、それぞれ別に表示する — かもしれません。Indirect Buffersを参照してください。
バッファーに入力構文はありません。バッファーはバッファー名を含むハッシュ表記でプリントされます。
(current-buffer) ⇒ #<buffer objects.texi>
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マーカー(marker)は、特定のバッファー内の位置を表します。したがってマーカーには2つの内容 — 1つはバッファー、もう1つは位置 — をもちます。バッファーのテキストの変更では、マーカーが常にバッファー内の同じ2つの文字の間に位置することを確実にするために、必要に応じて自動的に位置の値が再配置されます。
マーカーは入力構文をもちません。マーカーは、カレントの文字位置と、そのバッファー名を与える、ハッシュ表記でプリントされます。
(point-marker) ⇒ #<marker at 10779 in objects.texi>
マーカーのテスト、作成、コピー、移動の方法についての情報は、Markersを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウ(window)はEmacsがバッファーを表示するために使用する端末スクリーンの部分を記述します。すべてのウィンドウは関連付けられた1つのバッファーをもち、バッファーの内容はそのウィンドウに表示されます。対照的に、あるバッファーは、1つのウィンドウに表示されるか、ウィンドウに表示されないか、それとも複数のウィンドウに表示されるかもしれません。
同時に複数のウィンドウが存在するかもしれませんが、常に1つのウィンドウが選択されたウィンドウ(selected window)になります。Emacsがコマンドにたいして準備できているときに、(通常は)カーソルが表示されるウィンドウが、選択されたウィンドウです。選択されたウィンドウは通常、カレントバッファーを表示しますが、これは必須ではありません。
スクリーン上でウィンドウはフレームにグループ化されます。各ウィンドウは、ただ1つだけのフレームに属します。Frame Typeを参照してください。
ウィンドウは入力構文をもちません。ウィンドウは、ウィンドウ番号、表示されているバッファー名を与える、ハッシュ表記でプリントされます。与えられたウィンドウに表示されるバッファーは頻繁に変更されるかもしれないので、一意にウィンドウを識別するためにウィンドウ番号が存在します。
(selected-window) ⇒ #<window 1 on objects.texi>
ウィンドウに作用する関数の説明は、Windowsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレーム(frame)とは、1つ以上のEmacsウィンドウを含むスクリーン領域です。スクリーン領域を参照するためにEmacsが使用するLispオブジェクトを指す場合も、“フレーム”という用語を使用します。
フレームは入力構文をもちません。フレームはフレームのタイトル、(フレームを一意に識別するのに便利な)メモリー内のアドレスを与えるハッシュ表記でプリントされます。
(selected-frame) ⇒ #<frame emacs@psilocin.gnu.org 0xdac80>
フレームに作用する関数の説明は、Framesを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
端末(terminal)は、1つ以上のEmacsフレーム(Frame Typeを参照してください)を表示する能力があるデバイスです。
端末は入力構文をもちません。端末は、その端末の順序番号、TTYデバイスファイル名を与える、ハッシュ表記でプリントされます。
(get-device-terminal nil) ⇒ #<terminal 1 on /dev/tty>
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウ構成(window configuration)は、フレーム内のウィンドウの位置、サイズ、内容についての情報を保持します。これにより後で同じウィンドウ配置を再作成できます。
ウィンドウ構成は入力構文をもちません。ウィンドウ構成のプリント表現は、‘#<window-configuration>’のようになります。ウィンドウ構成に関連するいくつかの関数の説明は、Window Configurationsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレーム構成(frame
configuration)は、すべてのフレーム内のウィンドウの位置、サイズ、内容についての情報を保持します。これは基本型ではありません —
実際のところ、これはCARがframe-configuration
で、CDRがalistのリストです。各alist要素は、その要素のCARに示される1つのフレームを記述します。
フレーム構成に関連するいくつかの関数の説明は、Frame Configurationsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
単語プロセス(process)は通常、実行中のプログラムを意味します。Emacs自身はこの種のプロセス内で実行されます。しかしEmacs Lispでは、プロセスとはEmacsプロセスにより作成されたサブプロセスを表す、Lispオブジェクトです。シェル、GDB、ftp、コンパイラーなどのプログラムは、Emacsのサブプロセスとして実行され、Emacsの能力を拡張します。さらに操作を行なうために、Emacsサブプロセスは、Emacsからテキスト入力を受け取り、テキスト出力をEmacsにreturnします。Emacsは、サブプロセスにシグナルを送ることもできます。
プロセスオブジェクトは入力構文をもちません。プロセスオブジェクトは、プロセス名を与えるハッシュ表記でプリントされます。
(process-list) ⇒ (#<process shell>)
プロセスの作成、削除、プロセスに関する情報のreturn、入力やシグナルの送信、出力の受信を行なう関数についての情報は、Processesを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ストリーム(stream)とは、文字のソースまたはシンクとして — つまり入力として文字を供給したり、出力として文字を受け入れるために使用できるオブジェクトです。多くの異なるタイプ — マーカー、バッファー、文字列、関数を、この方法で使用できます。ほとんどの場合、入力ストリーム(文字列ソース)は、キーボード、バッファー、ファイルから文字を受け取り、出力ストリーム(文字シンク)は文字を*Help*バッファーのようなバッファー、エコーエリアに文字を送ります。
オブジェクトnil
は、他の意味に加えて、ストリームとして使用されることがあります。nil
は変数standard-input
やstandard-output
の値を表します。オブジェクトt
も、入力としてミニバッファー(Minibuffersを参照してください)、出力としてエコーエリア(The Echo Areaを参照してください)の使用を指定するストリームになります。
ストリームは特別なプリント表現や入力構文をもたず、何であれ、それらの基本型としてプリントされます。
パース関数およびプリント関数を含む、ストリームに関連した関数の説明は、Reading and Printing Lisp Objectsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーマップ(keymap)は、ユーザーがタイプした文字を、コマンドにマップします。このマップは、ユーザーのコマンド入力が実行される方法を制御します。キーマップは、実際にはCARがシンボルkeymap
のリストです。
キーマップの作成、プレフィクスキーの処理、ローカルキーマップやグローバルキーマップ、キーバインドの変更についての情報は、Keymapsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オーバーレイ(overlay)は、バッファーの一部に適用するプロパティーを指定します。それぞれのオーバーレイはバッファーの指定された範囲に適用され、プロパティーリスト(プロパティー名と値が交互に記述された要素のリスト)を含みます。オーバーレイプロパティーは、バッファーの指定された一部を、一時的に異なるスタイルで表示するために使用されます。オーバーレイは入力構文をもたず、バッファーメイト範囲の位置を与えるハッシュ表記でプリントされます。
オーバーレイを作成したり使用する方法についての情報は、Overlaysを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
fontは、グラフィカルな端末上のテキストを表示する方法を指定します。実際には異なる3つのフォント型 — フォントオブジェクト(font objects)、フォントスペック(font specs)、フォントエンティティー(font entities) — が存在しますこれらは入力構文をもちません。これらのプリント構文は、‘#<font-object>’、‘#<font-spec>’、‘#<font-entity>’のようになります。これらのLispオブジェクトの説明は、Low-Level Font Representationを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
複雑なLispオブジェクトにおける共有された構造、または循環する構造を表すために、リーダー構成‘#n=’と‘#n#’を使用することができます。
後でオブジェクトを参照するには、オブジェクトの前で#n=
を使用します。その後で、他の場所にある同じオブジェクトを参照するために、#n#
を使用することができます。ここでnは任意の整数です。たとえば以下は、1番目の要素が3番目の要素にも繰り替えされるリストを作成する方法です:
(#1=(a) b #1#)
これは、以下のような通常の構文とは異なります
((a) b (a))
これは1番目の要素と3番目の要素がそっくりなリストですが、これらは同じLispオブジェクトではありません。以下で違いを見ることができます:
(prog1 nil (setq x '(#1=(a) b #1#))) (eq (nth 0 x) (nth 2 x)) ⇒ t (setq x '((a) b (a))) (eq (nth 0 x) (nth 2 x)) ⇒ nil
“要素”として自身を含むような、循環する構造を作成するために、同じ構文を使用できます。以下は例です:
#1=(a #1#)
これは、2番目の要素がそのリスト自身であるリストを作成します。これが実際にうまくいくのか、以下で確認できます:
(prog1 nil (setq x '#1=(a #1#))) (eq x (cadr x)) ⇒ t
変数print-circle
を非nil
値にバインドした場合、Lispプリンターは、循環および共有されるLispオブジェクトを記録するこの構文を、生成することができます。Variables Affecting Outputを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispインタープリター自身は、関数が呼び出されたときに、その関数に渡された実際の引数にたいする型チェックは行ないません。それが行なえないのは、Lispにおける関数の引数は、他のプログラミング言語のようなデータ型宣言をもたないからです。したがって実際の引数が、その関数が使用できる型に属するかどうかをテストするのは、それぞれの関数に任されています。
すべてのビルトイン関数は、適切なときに実際の引数の型チェックを行い、引数の型が違う場合は、wrong-type-argument
エラーをシグナルします。たとえば以下は、+
の引数に、+
が扱うことができない引数を渡したとき何が起こるかの例です:
(+ 2 'a) error→ Wrong type argument: number-or-marker-p, a
異なる型にたいして異なる処理をプログラムに行なわせる場合は、明示的に型チェックを行なわなければなりません。オブジェクトの型をチェックするもっとも一般的な方法は、型述語(type predicate)関数の呼び出しです。Emacsはそれぞれの型にたいする型述語をもち、組み合わされた型にたいする述語もあります。
型述語関数は1つの引数をとり、その引数が適切な型であればt
、そうでない場合はnil
をreturnします。述語関数にたいする一般的なLisp慣習にしたがい、ほとんどの型述語の名前は、‘p’で終わります。
以下はリストにたいしてチェックを行なう述語listp
と、シンボルにたいしてチェックを行なう述語symbolp
の例です。
(defun add-on (x) (cond ((symbolp x) ;; If X is a symbol, put it on LIST. (setq list (cons x list))) ((listp x) ;; If X is a list, add its elements to LIST. (setq list (append x list))) (t ;; We handle only symbols and lists. (error "Invalid argument %s in add-on" x))))
以下の表は、事前定義された型述語(アルファベット順)と、さらに情報を得るためのリファレンスです。
atom
atomを参照してください。
arrayp
arraypを参照してください。
bool-vector-p
bool-vector-pを参照してください。
bufferp
bufferpを参照してください。
byte-code-function-p
byte-code-function-pを参照してください。
case-table-p
case-table-pを参照してください。
char-or-string-p
char-or-string-pを参照してください。
char-table-p
char-table-pを参照してください。
commandp
commandpを参照してください。
consp
conspを参照してください。
custom-variable-p
custom-variable-pを参照してください。
display-table-p
display-table-pを参照してください。
floatp
floatpを参照してください。
fontp
Low-Level Font Representationを参照してください。
frame-configuration-p
frame-configuration-pを参照してください。
frame-live-p
frame-live-pを参照してください。
framep
framepを参照してください。
functionp
functionpを参照してください。
hash-table-p
hash-table-pを参照してください。
integer-or-marker-p
integer-or-marker-pを参照してください。
integerp
integerpを参照してください。
keymapp
keymappを参照してください。
keywordp
Variables that Never Changeを参照してください。
listp
listpを参照してください。
markerp
markerpを参照してください。
wholenump
wholenumpを参照してください。
nlistp
nlistpを参照してください。
numberp
numberpを参照してください。
number-or-marker-p
number-or-marker-pを参照してください。
overlayp
overlaypを参照してください。
processp
processpを参照してください。
sequencep
sequencepを参照してください。
stringp
stringpを参照してください。
subrp
subrpを参照してください。
symbolp
symbolpを参照してください。
syntax-table-p
syntax-table-pを参照してください。
vectorp
vectorpを参照してください。
window-configuration-p
window-configuration-pを参照してください。
window-live-p
window-live-pを参照してください。
windowp
windowpを参照してください。
booleanp
booleanpを参照してください。
string-or-null-p
string-or-null-pを参照してください。
あるオブジェクトがどの型かチェックするもっとも一般的な方法は、関数type-of
の呼び出しです。オブジェクトは、ただ1つだけの基本型に属することを思い出してください。type-of
は、それがどの型(Lisp Data Typesを参照してください)か告げます。しかしtype-of
は基本型以外の型については何も知りません。ほとんどの場合、type-of
より型述語を使用するほうが便利でしょう。
この関数はobjectの基本型を名前とする、シンボルをreturnします。retuen値はシンボルbool-vector
、buffer
、char-table
、compiled-function
、cons
、float
、font-entity
、font-object
、font-spec
、frame
、hash-table
、integer
、marker
、overlay
、process
、string
、subr
、symbol
、vector
、window
、window-configuration
のうちの1つです。
(type-of 1) ⇒ integer
(type-of 'nil)
⇒ symbol
(type-of '()) ; ()
はnil
です。
⇒ symbol
(type-of '(x))
⇒ cons
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ここでは、2つのオブジェクトの同一性をテストする関数を説明します。(たとえば文字列などの)特定の型のオブジェクト同士で、内容の同一性をテストするのは、別の関数を使用します。これらの述語にたいしては、そのデータ型を説明する、適切なチャプターを参照してください。
この関数はobject1とobject2が同じオブジェクトの場合はt
、それ以外はnil
をreturnします。
object1とobject2が、同じ値をもつ整数の場合、これらは同じオブジェクトと判断されます(eq
はt
をreturnします)。object1とobject2が、同じ名前のシンボルの場合、通常は同じオブジェクトです。しかし例外もあります。Creating and Interning Symbolsを参照してください。(リスト、ベクター文字列などの)他の型にたいしては、同じ内容(または要素)の2つの引数が、両者eq
である必要はありません。これらが同じオブジェクトの場合だけeq
であり、その場合は、一方の内容を変更すると、もう一方の内容にも同じ変更が反映されます。
(eq 'foo 'foo) ⇒ t
(eq 456 456) ⇒ t
(eq "asdf" "asdf") ⇒ nil
(eq "" "") ⇒ t ;; この例外は省スペースのためにEmacs Lispが ;; ただ1つのマルチバイトの空文字列を作成するためです。
(eq '(1 (2 (3))) '(1 (2 (3)))) ⇒ nil
(setq foo '(1 (2 (3)))) ⇒ (1 (2 (3))) (eq foo foo) ⇒ t (eq foo '(1 (2 (3)))) ⇒ nil
(eq [(1 2) 3] [(1 2) 3]) ⇒ nil
(eq (point-marker) (point-marker)) ⇒ nil
make-symbol
関数は、internされていないシンボルをreturnします。これはLisp式内で、その名前を記述したシンボルとは区別されます。同じ名前の、異なるシンボルは、eq
ではありません。Creating and Interning Symbolsを参照してください。
(eq (make-symbol "foo") 'foo) ⇒ nil
この関数は、object1とobject2が同じ構成要素をもつ場合はt
、それ以外はnil
をreturnします。eq
は引数が同じオブジェクトなのかテストするのにたいして、equal
は同一でない引数の内部を調べて、それらの要素または内容が同一化をテストします。したがって2つのオブジェクトがeq
ならば、それらはequal
です。しかし、その逆は常に真ではありません。
(equal 'foo 'foo) ⇒ t
(equal 456 456) ⇒ t
(equal "asdf" "asdf") ⇒ t
(eq "asdf" "asdf") ⇒ nil
(equal '(1 (2 (3))) '(1 (2 (3)))) ⇒ t
(eq '(1 (2 (3))) '(1 (2 (3)))) ⇒ nil
(equal [(1 2) 3] [(1 2) 3]) ⇒ t
(eq [(1 2) 3] [(1 2) 3]) ⇒ nil
(equal (point-marker) (point-marker)) ⇒ t
(eq (point-marker) (point-marker)) ⇒ nil
文字列の比較は大文字小文字を区別しますが、テキストプロパティーは考慮しません — これは文字列内の文字だけを比較します。Text Propertiesを参照してください。テキストプロパティーも比較する場合は、equal-including-properties
を使用します。記述的な理由により、ユニバイト文字列とマルチバイト文字列は、それらが同じ文字シーケンスを含み、それらすべてのコードが0から127(ASCII)、または160から255(8ビットグラフィック
)の場合に限り、equal
です(Text Representationsを参照してください)。
(equal "asdf" "ASDF") ⇒ nil
しかし2つの別のバッファーは、それらのテキスト内容が同じでも、equal
と判断されることはありません。
equal
のテストは再帰により実装されています。たとえば2つのコンスセルxとyを与えると、(equal
x y)
は、以下の式の両方がt
をreturnする場合に限り、t
をreturnします:
(equal (car x) (car y)) (equal (cdr x) (cdr y))
これは再帰処理なので、循環するリストがあると無限再帰となります(エラーとなります)。
この関数はすべてのケースにおいてequal
と同様に振る舞いますが、2つの文字列がequal
になるためには、それらが同じテキストプロパティーをもつ必要があります。
(equal "asdf" (propertize "asdf" 'asdf t)) ⇒ t
(equal-including-properties "asdf" (propertize "asdf" 'asdf t)) ⇒ nil
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacsは2つの数値データ型 — 整数(integers)と浮動小数点数(floating-point numbers)をサポートします。整数は-3、0、7、13、511などの整数です。浮動小数点数は-4.5、0.0、2.71828などの小数部をもちます・これらは指数記数法でも表現できます — ‘1.5e2’は‘150.0’と同じです。ここで‘e2’は10の2乗をあらわし、それに1.5を乗じるという意味です。整数計算は正確であり、オーバーフローするときもあります。浮動小数点数の計算においては、数値は固定された精度をもつため、、しばしば丸め誤差(rounding errors)を引き起こします。
3.1 Integer Basics | 整数の表現と範囲。 | |
3.2 Floating-Point Basics | 浮動少数の表現と範囲。 | |
3.3 Type Predicates for Numbers | 数にたいするテスト。 | |
3.4 Comparison of Numbers | 同一性と非同一性の述語。 | |
3.5 Numeric Conversions | 手動小数点数から整数、または疎の逆の変換。 | |
3.6 Arithmetic Operations | 加減乗除の方法。 | |
3.7 Rounding Operations | 浮動小数点数の明示的な丸め。 | |
3.8 Bitwise Operations on Integers | 論理的なadd、or、not、shift。 | |
3.9 Standard Mathematical Functions | 三角法、指数、対数関数。 | |
3.10 Random Numbers | 予測可能または不可能な乱数の取得。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
整数の値の範囲はマシンに依存します。最小の範囲は-536,870,912から536,870,911(30ビット長の -2**29 から 2**29 - 1) ですが、多くのマシンはこれより広い範囲を提供します。このチャプターの例の多くは、最小の整数は30ビット長であると仮定します。
Lispリーダーは、(オプションで最初の符号記号と、最後のピリオドをともなう)数字のシーケンスとして整数を読み取ります。Emacsの範囲を超える整数は、浮動小数点数として扱われます。
1 ; 整数1。 1. ; 整数1。 +1 ; これも整数1。 -1 ; 整数-1。 9000000000000000000 ; 浮動小数点数9e18. 0 ; 整数0 -0 ; 整数0
基数が10以外の整数の構文は、‘#’の後に基数を指定する文字 — 2進は‘b’、8進は‘o’、16進は‘x’、‘radixr’は基数radix — を記述します。基数を指定する文字の大文字小文字は区別されません。したがって‘#binteger’はintegerを2進として読み取り、‘#radixrinteger’はintegerを基数radixとして読み取ります。radixに指定できる値は2から36です。たとえば:
#b101100 ⇒ 44 #o54 ⇒ 44 #x2c ⇒ 44 #24r1k ⇒ 44
整数にたいして処理を行なうさまざまな関数、特にビット演算(Bitwise Operations on Integersを参照してください)を理解するためには、数を2進形式で見ることが助けになることがしばしばあります。
30ビットの2進では、10進数の整数5は以下のようになります:
0000...000101 (全部で30ビット)
(‘...’は30ビットのワードを満たすのに充分なビットを意味し、この場合の‘...’は12個の0ビットを意味します。以下の例でも、2進の整数を読みやすくするために、‘...’の表記を使用します)
整数の-1は、以下のようになります:
1111...111111 (全部で30ビット)
-1は30個の1で表現されます(これは2の補数表記と呼ばれます)。
-1から4を減じることにより、負の整数-5が得られます。10進の整数4は、2進では100です。したがって、-5は以下のようになります:
1111...111011 (全部で30ビット)
この実装では、0ビットの2進の最大は、10進の536,870,911です。これは2進では以下のようになります:
0111...111111 (全部で30ビット)
算術関数は整数が範囲の外かをチェックしないので、536,870,911に1を加えると、その値は負の整数-536,870,912になります:
(+ 1 536870911) ⇒ -536870912 ⇒ 1000...000000 (全部で30ビット)
このチャプターで説明する多くの関数は、数字の位置として引数にマーカー(Markersを参照してください)を受け取ります。そのような関数にたいする実際の引数は数字かマーカーなので、わたしたちはこれらの引数にnumber-or-markerという名前を与えることがあります。引数の値がマーカーの場合、マーカーの位置が使用され、マーカーのバッファーは無視されます。
この変数の値は、Emacs Lispが扱える整数の最大値です。典型的な値は32ビットでは 2**29 - 1 、64ビットでは 2**61 - 1 です。
この変数の値は、Emacs Lispが扱える最小の整数です。これは負の整数です。典型的な値は32ビットでは -2**29 、64ビットでは -2**61、 です。
Emacs
Lispでは、テキスト文字は整数により表現されます。0から(max-char)
までの整数は、有効な文字として判断されます。Character Codesを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
浮動小数点数は整数ではない数を表現するのに便利です。浮動小数点数の範囲は、使用しているマシンでのCデータ型のdouble
と同じ範囲です。現在Emacsでサポートされているすべてのコンピューターでは、これは倍精度のIEEE浮動小数点数です。
浮動小数点数にたいする入力構文は、小数点と指数のどちらか1つ、または両方が必要とします。オプションの符号(‘+’か‘-’)は、その数字と指数の前に記述します。たとえば、‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は、値が1500の浮動小数点数を記述する5つの方法です。これらはすべて等価です。Common Lispと同様、Emacs Lispは、浮動小数点数の小数点の後に、少なくとも1つの数字を必要とします。‘1500.’は整数であり、浮動小数点数ではありません。
Emacs
Lispは-0.0
を、equal
と=
に関して、通常の0と数学的に同じものとして扱います。これは、(他の処理がこれらを区別するとしても、-0.0
と0.0
は数学的に等しいとする)IEEE浮動小数点数規格にしたがっています。
IEEE浮動小数点数規格は、浮動小数点数として、正の無限大と、負の無限大をサポートします。この規格はNaNまたは“not-a-number(数字ではない)”と呼ばれる値クラスも提供します。数学関数は、正しい答えが存在しないような場合に、このような値をreturnします。たとえば(/
0.0 0.0)
はNaNをreturnします。NaN値に符号がついていたとしても、実用的な目的にたいして、Emacs
Lispにおける異なるNaN値に、意味のある違いはありません。
以下は、これらの特別な浮動小数点数にたいする入力構文です:
‘1.0e+INF’と‘-1.0e+INF’
‘0.0e+NaN’と‘-0.0e+NaN’
以下の関数は浮動小数点数を扱うために特化したものです:
この述語は浮動小数引数がNaNのときはt
、それ以外はnil
をreturnします。
この関数はコンスセル(s
.
e)
をreturnします。ここでsとeは、浮動小数点数のsignificand(浮動小数点数を2の指数表現したときの仮引数)と指数です。
xが有限の場合、sは0.5以上1.0未満の浮動小数点数で、eは整数で、 x = s * 2**eです。 xが0または無限の場合、sはxと等しくなります。xがNaNの場合は、sもNaNです。xが0の場合、eは0です。
この関数は、significandがsig、指数がexpの浮動小数点数をreturnします。
koの関数はx2の、x1の値にコピーして、その結果をreturnします。x1とx2は浮動小数でなければなりません。
この関数はxの2進指数をreturnします。より正確にいうと、この値は|x|の2を底とする対数を、整数に切り下げたものです。
(logb 10) ⇒ 3 (logb 10.0e20) ⇒ 69
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションの関数は、数または数の特定の型にたいしてテストを行ないます。関数integerp
およびfloatp
は、引き数として任意のLispオブジェクト型をとることができます(そうでないと、あまり使用する機会がありません)。しかし、述語zerop
は、引き数として数を要求します。Predicates on Markersのinteger-or-marker-p
とnumber-or-marker-p
も参照してください。
この述語は、引数が浮動小数かどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。
この述語は引数が整数かどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。
この述語は引数が数(整数か浮動小数)かどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。
この述語(名前は“natural
number(自然数)”が由来です)は、引数が正の整数かどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。0は整数と判断されます。
wholenump
は、natnump
にたいするシノニムです。
この述語は、引数が0かどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。引数は数でなければなりません。
(zerop x)
は、(= x 0)
と等価です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
数が数値的に等しいかテストするためには、eq
ではなく、通常は=
を使用するべきです。同じ数値をもつ、多くの浮動小数オブジェクトが存在するかもしれません。これらを比較するのにeq
を使用する場合、これは2つの値が同じオブジェクトかどうかをテストすることになります。対照的に、=
はオブジェクトの数値的な値だけを比較します。
Emacs
Lispでは、それぞれの整数はは、一意なLispオブジェクトです。したがって、整数に関しては、eq
は=
と同じです。未知の整数の値を比較するのに、eq
を使用するのが便利な場合があります。なぜなら未知の値が数字でない場合でも、eq
はエラーを報告しません。対照的に、引数が数でもマーカーでもない場合、=
はエラーをシグナルします。しかし、整数の比較においてさえ、使用できる場合は=
を使用するのが、よいプログラミング習慣です。
数の比較において、2つの数が同じデータ型(どちらも整数、またはどちらも浮動小数)で、同じ値の場合は等しい数として扱う、equal
のほうが便利なときもあります。対照的に、=
は、整数と浮動小数点数を等しい数と扱うことができます。Equality Predicatesを参照してください。
他の欠点もあります。浮動小数演算は正確ではないので、浮動小数値を比較するのが悪いアイデアのときが、しばしばあります。通常は、近似的に等しいことをテストするほうがよいでしょう。以下はこれを行なう関数です:
(defvar fuzz-factor 1.0e-6) (defun approx-equal (x y) (or (= x y) (< (/ (abs (- x y)) (max (abs x) (abs y))) fuzz-factor)))
Common Lispに関する注意: Common Lispは複数ワード整数を実装していて、2つの別の整数オブジェクトが、同じ数値的な値をもつことができるので、Common Lispでの数の比較は、常に
=
が要求されます。Emacs Lispの整数は範囲が制限されているため、与えられた値に対応する整数オブジェクトは、1つだけです。
この関数は、すべての引数が数値的に等しいかどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。
この関数はeq
と同様に振る舞いますが、引数が両方とも数のときは例外です。これは数を型と数値的な値により比較するので、(eql
1.0 1)
はnil
をreturnしますが、(eql 1.0 1.0)
と(eql 1
1)
はt
をreturnします。
この関数は引数が数値的に等しいかどうかをテストして、もし異なる場合はt
、等しい場合はnil
をreturnします。
この関数は、各引数がそれぞれ、その後の引数より小さいかどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。
この関数は、各引数がそれぞれ、その後の引数以下かどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。
この関数は、各引数がそれぞれ、その後の引数より大きいかどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。
この関数は、各引数がそれぞれ、その後の引数以上かどうかをテストして、もしそうならt
、それ以外はnil
をreturnします。
この関数は引数の最大をreturnします。引数のどれかが浮動小数の場合は、たとえ最大が整数であっても、浮動小数として値がreturnされます。
(max 20) ⇒ 20 (max 1 2.5) ⇒ 2.5 (max 1 3 2.5) ⇒ 3.0
この関数は引数の最小をreturnします。引数のどれかが浮動小数の場合は、たとえ最小が整数であっても、浮動小数として値がreturnされます。
(min -4 1) ⇒ -4
この関数はnumberの絶対値をreturnします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
整数を浮動少数に変換するには、関数float
を使用します。
これは浮動小数に変換されたnumberをreturnします。すでにnumberが浮動小数の場合、float
はそれを変更せずにreturnします。
浮動小数点数を整数に変換する関数が4つあります。これらは浮動小数点数を丸める方法がことなります。これらはすべて引数numberと、オプション引数としてdivisorを受け取ります。引数は両方とも整数または浮動小数点数です。divisorがnil
のこともあります。divisorがnil
または省略された場合、これらの関数はnumberを整数に変換するか、それが既に整数の場合は変更せずにreturnします。divisorが非nil
の場合、これらの関数はnumberをdivisorで除してから、その結果を整数に変換します。divisorが(整数か浮動小数かに関わらず)0の場合、Emacsはarith-error
エラーをシグナルします。
これは0に向かって丸めることにより整数に変換したnumberをreturnします。
(truncate 1.2) ⇒ 1 (truncate 1.7) ⇒ 1 (truncate -1.2) ⇒ -1 (truncate -1.7) ⇒ -1
これは、下方(負の無限大に向かって)に丸めることにより整数に変換したnumberをreturnします。
divisorが指定された場合、mod
に相当する種類の除算演算を使用して、下方に丸めを行ないます。
(floor 1.2) ⇒ 1 (floor 1.7) ⇒ 1 (floor -1.2) ⇒ -2 (floor -1.7) ⇒ -2 (floor 5.99 3) ⇒ 1
これは、上方(正の無限大に向かって)に丸めることにより整数に変換したnumberをreturnします。
(ceiling 1.2) ⇒ 2 (ceiling 1.7) ⇒ 2 (ceiling -1.2) ⇒ -1 (ceiling -1.7) ⇒ -1
これは、もっとも近い整数に向かって丸めることにより整数に変換したnumberをreturnします。2つの整数から等距離にある値の丸めでは、偶数の整数をreturnします。
(round 1.2) ⇒ 1 (round 1.7) ⇒ 2 (round -1.2) ⇒ -1 (round -1.7) ⇒ -2
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispは伝統的な4つの算術演算(加減乗除)、同様に剰余とmodulusの関数、および1加算、1減算の関数を提供します。%
を除き、これらの各関数は引き数として整数か浮動小数を受け取り、浮動小数の引数がある場合は、浮動小数点数をreturnします。
Emacs Lispの算術関数は整数のオーバーフローをチェックしません。したがって(1+
536870911)
は-536870912に評価されるかもしれず、それはハードウェアーに依存します。
この関数はnumber-or-marker + 1をreturnします。例えば、
(setq foo 4) ⇒ 4 (1+ foo) ⇒ 5
この関数はCの演算子++
とは類似しません —
この関数は変数をインクリメントしません。この関数は和を計算するだけです、したがって以下を続けて評価すると、
foo ⇒ 4
変数をインクリメントしたい場合は、以下のようにsetq
を使用しなければなりません:
(setq foo (1+ foo)) ⇒ 5
この関数はnumber-or-marker - 1をreturnします。
この関数は引数すべてを加算します。引数を与えない場合、+
は0をreturnします。
(+) ⇒ 0 (+ 1) ⇒ 1 (+ 1 2 3 4) ⇒ 10
-
関数は2つの目的 — 符号反転と減算
—を果たします。-
に1つの引数を与えた場合、値は引数の符号を反転したものになります。複数の引数がある場合、number-or-markerからmore-numbers-or-markersまでの各値を蓄積的に減算します。引数がない場合、結果は0です。
(- 10 1 2 3 4) ⇒ 0 (- 10) ⇒ -10 (-) ⇒ 0
この関数はすべての引数を乗じて、積をreturnします。引数がない場合、*
は1をreturnします。
(*) ⇒ 1 (* 1) ⇒ 1 (* 1 2 3 4) ⇒ 24
この関数はdividendをdivisorで除し、商をreturnします。追加の引数divisorsがある場合、その後さらにdividendをdivisorsで順に除します。各引数は数かマーカーです。
すべての引数が整数の場合、結果は各除算の後に商を0へ向かって丸めることにより得られる整数になります。
(/ 6 2) ⇒ 3
(/ 5 2) ⇒ 2
(/ 5.0 2) ⇒ 2.5
(/ 5 2.0) ⇒ 2.5
(/ 5.0 2.0) ⇒ 2.5
(/ 25 3 2) ⇒ 4
(/ -17 6) ⇒ -2
整数を整数0で除すると、Emacsはarith-error
エラー(Errorsを参照してください)をシグナルします。浮動小数の除算においては、0でない数を0で除することにより、正の無限大または負の無限大を得ます(Floating-Point Basicsを参照してください)。
この関数は、dividendをdivisorで除した後、その剰余を整数でreturnします。引数は整数かマーカーでなければなりません。
任意の2つの整数dividendとdivisorにたいして、
(+ (% dividend divisor) (* (/ dividend divisor) divisor))
は、divisorが非0の場合は常にdividendと等しくなります。
(% 9 4) ⇒ 1 (% -9 4) ⇒ -1 (% 9 -4) ⇒ 1 (% -9 -4) ⇒ -1
この関数はdividendのdivisorにたいするmodulo、言い換えるとdividendをdivisorで除した後の剰余(ただし符号はdivisorと同じ)えおreturnします。引数は数かマーカーでなければなりません。
%
とは異なり、mod
は浮動小数の引数を許容します。これは商を整数に下方(負の無限大に向かって)へ丸めて、剰余を計算するのにこの商を使用します。
divisorが0のときmod
は、両方の引数が整数の場合はarith-error
エラーをシグナルし、それ以外はNaNをreturnします。
(mod 9 4) ⇒ 1
(mod -9 4) ⇒ 3
(mod 9 -4) ⇒ -3
(mod -9 -4) ⇒ -1
(mod 5.5 2.5) ⇒ .5
任意の2つの数dividendとdivisorにたいして、
(+ (mod dividend divisor) (* (floor dividend divisor) divisor))
は常にdividendになります(ただし引数のどちらかが浮動小数の場合は丸め誤差の範囲内で等しく、dividendが整数でdivisorが0の場合はarith-error
となります)。floor
については、Numeric Conversionsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数ffloor
、fceiling
、fround
、ftruncate
は、浮動小数の引数をとり、値が近くの整数であるような浮動少数をreturnします。ffloor
は一番近い下方の整数、fceiling
は一番近い上方の整数、ftruncate
は0に向かう方向で一番近い整数、fround
は一番近い整数をreturnします。
この関数はfloatを次に小さい整数値に丸めて、その値を浮動小数点数としてreturnします。
この関数はfloatを次に大きい整数値に丸めて、その値を浮動小数点数としてreturnします。
この関数はfloatを0方向の整数値に丸めて、その値を浮動小数点数としてreturnします。
この関数はfloatを一番近い整数値に丸めて、その値を浮動小数点数としてreturnします。2つの整数値との距離が等しい値にたいする丸めでは、偶数の整数をreturnします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コンピューターの中では、整数はビット(bit: 0か1の数字)のシーケンスである、2進数で表されます。ビット演算は、そのようなシーケンスの中の個々のビットに作用します。たとえば、シフト(shifting)はシーケンス全体を1つ以上左または右に移動して、“移動された”のと同じパターンを再生します。
Emacs Lispのビット演算は、整数だけに適用されます。
lsh
はlogical
shiftの略で、integer1のビットを左にcount個シフトします。countが負の場合は右にシフトし、シフトにより空きになったビットには0がセットされます。count
isが負の場合、lsh
は左端(最上位)に0をシフトするので、integer1が負の場合でも、正の結果が生成されます。これと対照的なのが、以下で説明するash
です。
以下に、lsh
でビットパターンの位置を1つ左にシフトする例を2つ紹介します。ここでは下位8ビットの2進パターンだけを表示しており、残りのビットはすべて0です。
(lsh 5 1) ⇒ 10 ;; 10進の5は、10進の10になります。 00000101 ⇒ 00001010 (lsh 7 1) ⇒ 14 ;; 10進の7は、10進の14になります。 00000111 ⇒ 00001110
この例が説明するように、ビットパターンを左に1シフトすると、生成される数は、元の数の2倍になります。
ビットパターンを左に2シフトすると、以下(8ビット2進数)の結果が生成されます:
(lsh 3 2)
⇒ 12
;; 10進の3は、10進の12になります。
00000011 ⇒ 00001100
一方、右に1シフトすると、以下のようになります:
(lsh 6 -1)
⇒ 3
;; 10進の6は10進の3になります。
00000110 ⇒ 00000011
(lsh 5 -1)
⇒ 2
;; 10進の5は、10進の2になります。
00000101 ⇒ 00000010
例が明かにするように、右に1シフトすることにより、正の整数の値が2で除され、下方に丸められます。
関数lsh
は、他のEmacs
Lisp算術関数と同様、オーバーフローをチェックしないので、左にシフトすることにより上位ビットが捨てられ、その数の符号が変化するかもしれません。たとえば30ビットの実装では、536,870,911を左にシフトすると、-2が生成されます。
(lsh 536870911 1) ; 左シフト
⇒ -2
2進では、この引数は以下のようになります:
;; 10進の536,870,911
0111...111111 (全部で30ビット)
これを左にシフトすると、以下のようになります:
;; 10進の-2
1111...111110 (全部で30ビット)
ash
(算術シフト(arithmetic
shift))は、integer1の中のビット位置を左にcountシフトします。countが負の場合は右にシフトします。
ash
はlsh
と同じ結果を与えますが、例外はinteger1とcountがとみに負の場合です。この場合、lsh
は左にできる空きビットに0を置きますが、ash
は1を置きます。
したがってash
でビットパターンの位置を右に1シフトすると、以下のようになります:
(ash -6 -1) ⇒ -3
;; 10進の-6は、10進の-3になります
1111...111010 (30 bits total)
⇒
1111...111101 (30 bits total)
対照的に、lsh
でビットパターンの位置を1右にシフトすると、以下のようになります:
(lsh -6 -1) ⇒ 536870909
;; 10進の-6は、10進の536,870,909になります。
1111...111010 (30 bits total)
⇒
0111...111101 (30 bits total)
他にも例を示します:
; 30ビットの2進数 (lsh 5 2) ; 5 = 0000...000101 ⇒ 20 ; = 0000...010100
(ash 5 2) ⇒ 20 (lsh -5 2) ; -5 = 1111...111011 ⇒ -20 ; = 1111...101100 (ash -5 2) ⇒ -20
(lsh 5 -2) ; 5 = 0000...000101 ⇒ 1 ; = 0000...000001
(ash 5 -2) ⇒ 1
(lsh -5 -2) ; -5 = 1111...111011 ⇒ 268435454 ; = 0011...111110
(ash -5 -2) ; -5 = 1111...111011 ⇒ -2 ; = 1111...111110
この関数は、引数の“論理積(logical and)”をreturnします。すべての引数のn番目のビットがセットされている場合に限り、結果のn番目のビットがセットされます(“セット”とは、そのビットの値が0ではなく1であることを意味します)。
たとえば、13と12の“論理積”は — 4ビット2進数を使用すると1101と1100の論理積は1100を生成します。この2進数では両方とも、左の2ビットがセット(つまり1)されているので、returnされる値の左2ビットがセットされます。しかし右の2ビットにたいしては、少なくとも1つの引数でそのビットが0なので、returnされる値の右2ビットは0になります。
したがって、
(logand 13 12) ⇒ 12
logand
に何の引数も綿さない場合は、値-1がreturnされます。-1を2進数で表すとすべてのビットが1なので、-1はlogand
にたいする単位元(identity
element)です。
; 30ビット2進数 (logand 14 13) ; 14 = 0000...001110 ; 13 = 0000...001101 ⇒ 12 ; 12 = 0000...001100
(logand 14 13 4) ; 14 = 0000...001110 ; 13 = 0000...001101 ; 4 = 0000...000100 ⇒ 4 ; 4 = 0000...000100
(logand)
⇒ -1 ; -1 = 1111...111111
この関数は、引数の“論理和(inclusive
or)”をreturnします。少なくとも1つの引数でn番目のビットがセットされていれば、結果のn番目のビットがセットされます。引数を与えない場合の結果は、この処理にたいする単位元である0です。logior
に渡す引数が1つだけの場合、その引数がreturnされます。
; 30ビット2進数 (logior 12 5) ; 12 = 0000...001100 ; 5 = 0000...000101 ⇒ 13 ; 13 = 0000...001101
(logior 12 5 7) ; 12 = 0000...001100 ; 5 = 0000...000101 ; 7 = 0000...000111 ⇒ 15 ; 15 = 0000...001111
この関数は、引数の“排他的論理和(exclusive
or)”をreturnします。n番目のビットがセットされている引数の数が奇数個の場合だけ、結果のn番目のビットがセットされます。引数を与えない場合の結果は、この処理の単位元である0となります。logxor
に渡す引数が1つだけの場合、その引数がreturnされます。
; 30ビット2進数 (logxor 12 5) ; 12 = 0000...001100 ; 5 = 0000...000101 ⇒ 9 ; 9 = 0000...001001
(logxor 12 5 7) ; 12 = 0000...001100 ; 5 = 0000...000101 ; 7 = 0000...000111 ⇒ 14 ; 14 = 0000...001110
この関数は引数の論理的な補数(logical complement)をreturnします。integerのn番目のビットが0の場合に限り、結果のn番目のビットが1になります。逆も成り立ちます。
(lognot 5) ⇒ -6 ;; 5 = 0000...000101 (全部で30ビット) ;; becomes ;; -6 = 1111...111010 (全部で30ビット)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらの数学的関数は、引き数として整数と同様に浮動小数点数も許容します。
これらは三角関数です、引数argはラジアン単位です。
(asin arg)
の値は、sinの値がargとなるような
-pi/2
から
pi/2
(境界値を含む)の数です。argが範囲外([-1, 1]の外)の場合、asin
はNaNをreturnします。
(acos arg)
の値は、cosの値がargとなるような、0から
pi
(境界値を含む)の数です。argが範囲外([-1, 1]の外)の場合、acos
はNaNをreturnします。
(atan y)
の値は、tanの値がyとなるような、
-pi/2
から
pi/2
(境界値を含まない)の数です。オプションの第2引数xが与えられた場合、(atan y
x)
の値はベクトル[x, y]
とX
軸が成す角度のラジアン値です。
これは指数関数です。この関数はeの指数argをreturnします。
この関数は底をbaseとするargの対数をreturnします。baseを指定しない場合、自然底(natural
base)eが使用されます。argまたhbaseが負の場合、log
はNaNをreturnします。
この関数はxにyを乗じてreturnします。引数が両方とも整数で、yが正の場合、結果は整数になります。この場合オーバーフローによる切り捨てが発生するので、注意してください。xが有限の負数で、yが有限の非整数の場合、expt
はNaNをreturnします。
これはargの平方根をreturnします。argが有限で0より小さい場合、sqrt
はNaNをreturnします。
加えて、Emacsは以下の数学的な定数を定義します:
自然対数e(2.71828…)。
円周率pi(3.14159…)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
決定論的なコンピュータープログラムでは、真の乱数を生成することはできません。しかしほとんどの目的には、疑似乱数(pseudo-random numbers)で充分です。一連の疑似乱数は、決定論的な手法により生成されます。真の乱数ではありませんが、それらにはランダム列を模する特別な性質があります。たとえば疑似ランダム系では、すべての可能な値は、均等に発生します。
疑似乱数は“シード(seed:
種)”から生成されます。与えられた任意のシードから開始することにより、random
関数は常に同じ数列を生成します。デフォルトでは、Emacsは開始時に乱数シードを初期化することにより、それぞれのEmacsの実行において、random
の値シーケンスは(ほとんど確実に)異なります。
再現可能な乱数シーケンスが欲しい場合もあります。たとえば乱数シーケンスに依存するプログラムをデバッグする場合、プログラムの各実行において同じ挙動を得ることが助けになります。再現可能なシーケンスを作成するには、(random
"")
を実行します。これは特定のEmacsの実行可能ファイルにたいして、シードに定数値をセットします(しかし、この実行可能ファイルは、その他のEmacsビルドと異なるものになるでしょう)。シード値として、他のさまざまな文字列を使用することができます。
この関数は疑似乱数の整数をreturnします。繰り返し呼び出すと、一連の疑似乱数の整数をreturnします。
limitが正の整数の場合、値は負ではないlimit未満の値から選択されます。それ以外では、値はmost-negative-fixnum
からmost-positive-fixnum
の間の、Lispで表現可能な任意の整数(Integer Basicsを参照してください)になるでしょう。
limitがt
の場合は、Emacsを再起動したときに、新しいシードを選択することを意味します。
limitが文字列の場合、その文字列定数にもとづいた新しいシードを選択することを意味します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispの文字列は、文字列の順序列(ordered sequence)を含む配列です。文字列はシンボル、バッファー、ファイルの名前に使用されます。その他にも、ユーザーにたいしてメッセージを送ったりバッファー間でコピーする文字列を保持したり等の、他の多くの目的にたいして使用されます。文字列は特に重要なので、Emacs Lispは特別に文字列を操作するための、多くの関数をもちます。Emacs Lispプログラムは、個々の文字より、文字列を多用します。
キーボードの文字イベントの文字列にたいする特別な考慮は、Putting Keyboard Events in Stringsを参照してください。
4.1 String and Character Basics | 文字列と文字の基本的なプロパティー。 | |
4.2 Predicates for Strings | オブジェクトが文字列か文字化をテストする。 | |
4.3 Creating Strings | 新しい文字列を割り当てる関数。 | |
4.4 Modifying Strings | 既存の文字列の内容を変更する。 | |
4.5 Comparison of Characters and Strings | 文字または文字列を比較する。 | |
4.6 Conversion of Characters and Strings | 文字から文字列、文字から文字列への変換。 | |
4.7 Formatting Strings | format :
printf のEmacsバージョン。
| |
4.8 Case Conversion in Lisp | 大文字小文字変換関数。 | |
4.9 The Case Table | 大文字小文字変換のカスタマイズ。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字(character)とは、テキスト内の1つの文字を表すLispオブジェクトです。Emacs Lispでは、文字は単なる整数です。ある整数が文字か文字でないかを区別するのは、それが使用される方法だけです。Emacsでの文字表現についての詳細は、Character Codesを参照してください。
文字列(string)とは、固定された文字シーケンスです。これは配列(array)と呼ばれるシーケンス型で、配列長が固定で、1度作成したら変更できないことを意味します(Sequences, Arrays, and Vectorsを参照してください)。Cとは異なり、Emacs Lispの文字列は文字コードを判断することにより終端されません。
文字列は配列であり、したがって同様にシーケンスでもあるので、Sequences, Arrays, and Vectorsにドキュメントされている一般的な配列関数やシーケンス関数で、文字列を処理できます。たとえば、文字列内の特定の文字にアクセスしたり変更することができますしかし表示された文字列の幅を計算するために、length
を使用するべきではないことに注意してください。かわりにstring-width
を使用してください(Size of Displayed Textを参照してください)。
Emacs文字列での非ASCIIにたいすテキスト表現は2つ — ユニバイト(unibyte)とマルチバイト(multibyte)がありますほとんどのLispプログラミングでは、これら2つの表現を気にする必要はありません。詳細は、Text Representationsを参照してください。
キーシーケンスがユニバイト文字列で表されることがあります。ユニバイト文字列がキーシーケンスの場合、範囲128から255までの文字列要素は、範囲128から255の文字コードではなく、メタ文字(これは非常に大きな整数です)を表します。文字列はhyper、super、altで修飾された文字を保持できません。文字列はASCIIコントロール文字を保持できますが、それは他のコントロール文字です。文字列はASCIIコントロール文字の大文字小文字を区別できません。そのような文字をシーケンスに保存したい場合は、文字列ではなくベクターを使用しなければなりません。キーボード入力文字についての情報は、Character Typeを参照してください。
文字列は正規表現を保持するために便利です。string-match
(Regular Expression Searchingを参照してください)を使用して、文字列にたいして正規表現をマッチすることもできます。関数match-string
(Simple Match Data Accessを参照してください)と、replace-match
(see section Replacing the Text that Matched)は、文字列にたいして正規表現をマッチした後に、文字列を分解、変更するのに便利です。
バッファーのように、文字列は文字列内の文字自身と、その文字にたいするテキストプロパティーを含みます。Text Propertiesを参照してください。文字列からバッファーや他の文字列にテキストをコピーする、すべてのLispプリミティブ(Lisp primitives)は、コピーされる文字のプロパティーもコピーします。
文字列を表示したり、バッファーにコピーする関数についての情報は、Textを参照してください。文字または文字列の構文についての情報は、Character TypeとString Typeを参照してください。異なるテキスト表現間で変換したり、文字コードをエンコード、デコードする関数については、Non-ASCII Charactersを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
一般的なシーケンスや配列にたいする述語についての情報は、Sequences, Arrays, and Vectors、およびArraysを参照してください。
この関数はobjectが文字列の場合はt
、それ以外はnil
をreturnします。
この関数は、objectが文字列またはnil
の場合はt
、それ以外はnil
をreturnします。
この関数は、objectが文字列または文字(たとえば整数)の場合はt
、それ以外はnil
をreturnします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数は、新たに文字列を作成したり、文字列同士を結合して文字列を作成したり、文字列の一部から文字列を作成する関数です。
この関数は、characterをcount回繰り返すことにより作成された文字列をreturnします。countが負の場合は、エラーをシグナルします。
(make-string 5 ?x) ⇒ "xxxxx" (make-string 0 ?x) ⇒ ""
この関数に対応する他の関数にはmake-vector
(Vectorsを参照してください)、およびmake-list
(Building Cons Cells and Listsを参照してください)が含まれます。
この関数は、文字charactersを含む文字列をreturnします。
(string ?a ?b ?c) ⇒ "abc"
この関数は、stringから、インデックスstartの文字(その文字を含む)から、endまでの文字(その文字は含まない)の範囲の文字から構成される、新しい文字列をreturnします。文字列の最初の文字がインデックス0になります。
(substring "abcdefg" 0 3) ⇒ "abc"
上記の例では、‘a’のインデックスは0、‘b’のインデックスは1、‘c’のインデックスは2です。インデックス3 —
この文字列の4番目の文字 —
は、部分文字列がコピーされる文字位置までをマークします。したがって文字列"abcdefg"
から、‘abc’がコピーされます。
負のかすは、文字列の最後から数えることを意味するので、-1は文字列の最後の文字のインデックスです。たとえば:
(substring "abcdefg" -3 -1) ⇒ "ef"
この例では、‘e’のインデックスは-3、‘f’のインデックスは-2、‘g’のインデックスは-1です。したがって、‘e’と‘f’が含まれ、‘g’は含まれません。
endにnil
が使用された場合、それは文字列の長さを意味します。したがって、
(substring "abcdefg" -3 nil) ⇒ "efg"
引数endを省略した場合、それはnil
を指定したのと同じです。(substring string
0)
は、stringのすべてをコピーしてreturnします。
(substring "abcdefg" 0) ⇒ "abcdefg"
しかし、この目的のためにはcopy-sequence
を推奨します(see section Sequences)。
stringからコピーされた文字がテキストプロパティーをもつ場合、そのプロパティーは新しい文字列へもコピーされます。Text Propertiesを参照してください。
substring
の最初の引数にはベクターも指定できます。たとえば:
(substring [a b (c) "d"] 1 3) ⇒ [b (c)]
startが整数でない場合、またはendが整数でもnil
でもない場合は、wrong-type-argument
エラーがシグナルされます。startがendの後の文字を指す場合、またはstringにたいして範囲外の整数をどちらかに指定した場合は、args-out-of-range
エラーがシグナルされます。
この関数に対応するのはbuffer-substring
(Examining Buffer Contentsを参照してください)で、これはカレントバッファー内のテキストの一部を含む文字列をreturnします。文字列の先頭はインデックス0ですが、バッファーの先頭はインデックス1です。
これはsubstring
と同じようにL機能しますが、値からすべてのテキストプロパティーを破棄します。startを省略したり、nil
を指定することができ、この場合0に等しくなります。したがって(substring-no-properties string)
は、すべてのテキストプロパティーが削除されたstringのコピーをreturnします。
この関数は、渡された引数内の文字からなる、新しい文字列をreturnします(もしあればテキストプロパティーも)。引数には文字列、数のリスト、数のベクターを指定できます。引数は変更されません。concat
に引数を指定しない場合、空文字列をreturnします。
(concat "abc" "-def")
⇒ "abc-def"
(concat "abc" (list 120 121) [122])
⇒ "abcxyz"
;; nil
hあ空のシーケンス。
(concat "abc" nil "-def")
⇒ "abc-def"
(concat "The " "quick brown " "fox.")
⇒ "The quick brown fox."
(concat)
⇒ ""
この関数は常に、任意の既存の文字列にたいしてeq
ではない、新しい文字列を構築しますが、結果が空文字列の時は例外です(スペースを省くために、Emacsは空のマルチバイト文字列を1つだけ作成します)。
他の結合関数(concatenation functions)についての情報は、Mapping Functionsのmapconcat
、Functions for Vectorsのvconcat
、Building Cons Cells and Listsのappend
を参照してください。シェルコマンドで使用される文字列の中に、個々のコマンドライン引数を結合するには、combine-and-quote-stringsを参照してください。
この関数は、正規表現separators(Regular Expressionsを参照してください)にもとづいて、stringを部分文字列に分解します。separatorsにたいする各マッチは、分割位置を定義します。分割位置の間にある部分文字列を、リストにまとめてreturnします。
omit-nullsがnil
(または省略)の場合、連続する2つのseparatorsへのマッチ、またはstringの最初か最後にマッチしたときの空文字列が結果に含まれます。omit-nullsがt
の場合、これらの空文字列は結果から除外されます。
separatorsがnil
(または省略)の場合、デフォルトはsplit-string-default-separators
の値になります。
特別なケースとして、separatorsがnil
(または省略)の場合、常に結果から空文字列が除外されます。したがって:
(split-string " two words ") ⇒ ("two" "words")
結果は、ほとんど有用ではないであろう("" "two" "words"
"")
という結果ではありません。このような結果が必要な時は、separatorsに明示的な値を使用します:
(split-string " two words " split-string-default-separators) ⇒ ("" "two" "words" "")
他にも例を示します:
(split-string "Soup is good food" "o") ⇒ ("S" "up is g" "" "d f" "" "d") (split-string "Soup is good food" "o" t) ⇒ ("S" "up is g" "d f" "d") (split-string "Soup is good food" "o+") ⇒ ("S" "up is g" "d f" "d")
空のマッチはカウントされます。例外は、空でないマッチを使用することにより、すでに文字列の最後に到達しているとき、またはstringが空の時で、この場合split-string
は最後の空マッチを探しません。
(split-string "aooob" "o*") ⇒ ("" "a" "" "b" "") (split-string "ooaboo" "o*") ⇒ ("" "" "a" "b" "") (split-string "" "") ⇒ ("")
しかし、separatorsが空文字列にマッチできるとき、通常はomit-nullsはt
にすれば、前の3つの例の不明瞭さは、ほとんど発生しません:
(split-string "Soup is good food" "o*" t) ⇒ ("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d") (split-string "Nice doggy!" "" t) ⇒ ("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!") (split-string "" "" t) ⇒ nil
空でないマッチより空のマッチを優先するような、一部の“非貪欲(non-greedy)”な値をseparatorsに指定することにより、幾分奇妙(しかし予見可能)な振る舞いが発生する場合があります。繰り返しますが、そのような値は実際にはまれです:
(split-string "ooo" "o*" t) ⇒ nil (split-string "ooo" "\\|o+" t) ⇒ ("o" "o" "o")
オプションの引数trimが非nil
の場合、その値は各部分文字列の最初と最後からトリムするテキストにマッチする正規表現を指定します。トリムにより、その部分文字列が空になるような場合、それは空文字列として扱われます。
文字列を分割して、call-process
やstart-process
に適した、個々のコマンドライン引数のリストにする必要がある場合は、split-string-and-unquoteを参照してください。
split-string
のseparatorsにたいするデフォルト値です。通常の値は、"[ \f\t\n\r\v]+"
です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
既存の文字列の内容を変更するもっとも基本的な方法は、aset
(see section Functions that Operate on Arrays)を使用する方法です。(aset string idx
char)
は、stringのインデックスidxに、charを格納します。それぞれの文字は1文字以上を占有しますが、すでにインデックスの場所にある文字のバイト数が、charが要するバイト数と異なる場合、aset
はエラーをシグナルします。
より強力な関数はstore-substring
です:
この関数は、インデックスidxで開始される位置にobjを格納することにより、文字列stringの内容の一部を変更します。objは文字、または(stringより小さい)文字列です。
既存の文字列の長さを変更するのは不可能なので、stringの実際の長さにobjが収まらない場合、またはstringのその位置に現在ある文字のバイト数が、新しい文字に必要なバイト数と異なる場合はエラーになります。
パスワードを含む文字列をクリアーするときは、clear-string
を使用します:
これはstringをユニバイト文字列として、内容を0にクリアーします。これによりstringの長さも変更されるでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は引数が同じ文字を表す場合はt
、それ以外はnil
をreturnします。case-fold-search
が非nil
の場合、この関数は大文字小文字の違いを無視します。
(char-equal ?x ?x) ⇒ t (let ((case-fold-search nil)) (char-equal ?x ?X)) ⇒ nil
この関数は、2つの文字列の文字が正確にマッチする場合は、t
をreturnします。引数にシンボルを指定することもでき、この場合はシンボル名が使用されます。case-fold-search
とは無関係に、大文字小文字は常に意味をもちます。
この関数は、equal
で2つの文字列を比較するのと等価です(Equality Predicatesを参照してください)。特に、2つの文字列のテキストプロパティーは無視されます。テキストプロパティーだけが異なる文字列を区別する必要がある場合は、equal-including-properties
を使用します。しかしequal
とは異なり、どちらかの引数が文字列でもシンボルでもない場合、string=
はエラーをシグナルします。
(string= "abc" "abc") ⇒ t (string= "abc" "ABC") ⇒ nil (string= "ab" "ABC") ⇒ nil
技術的な理由により、ユニバイト文字列とマルチバイト文字列がequal
なのは、それらが同じ文字コードのシーケンスを含み、それらすべてのコードが0から127(ASCII)か、160から255(eight-bit-graphic
)のときだけです。しかしユニバイト文字列をマルチバイト文字列に変更する際、コードが160から255の範囲にあるすべての文字はより高いコードに変換され、ASCII文字は変換されないまま残ります。したがってユニバイト文字列と、それを変換したマルチバイト文字列は、その文字列のすべてがASCIIのときだけequal
です。マルチバイト文字列中で、もし文字コード160から255の文字があったとしても、それは完全に正しいとは言えません。結果として、すべてがASCIIではないユニバイト文字列とマルチバイト文字列がequal
であるという状況は、もしかしたらEmacs
Lispプロプラマーが直面するかもしれない、とても希少な偽術的に不可解な状況だといえます。Text Representationsを参照してください。
string-equal
はstring=
に対する別名です。
この関数は、2つの文字列を1文字づつ比較します。この関数は、同時に2つの文字列をスキャンして、対応する文字同士がマッチしない最初のペアを探します。2つの文字列内で、小さいほうの文字がstring1の文字の場合、string1が小さいことになり、この関数はt
をreturnします。小さいほうの文字がstring2の文字の場合、string1が大きいことになり、この関数はnil
をreturnします。2つの文字列が完全にマッチした場合、値はnil
になります。
文字のペアは、文字コードで比較されます。ASCII文字セットでは、小文字英字は大文字英字より、高い数値をもつことに留意してください。数字および多くの句読点文字は、大文字英字より低い数値をもちます。ASCII文字は、任意の非ASCII文字より小さくなります。ユニバイト非ASCII文字は、任意のマルチバイト非ASCII文字より、常に小さくなります(Text Representationsを参照してください)。
(string< "abc" "abd") ⇒ t (string< "abd" "abc") ⇒ nil (string< "123" "abc") ⇒ t
文字列の長さが異なり、string1の長さまでマッチする場合、結果はt
になります。string2の長さまでマッチする場合、結果はnil
になります。文字を含まない文字列は、他の任意の文字列より小さくなります。
(string< "" "abc") ⇒ t (string< "ab" "abc") ⇒ t (string< "abc" "") ⇒ nil (string< "abc" "ab") ⇒ nil (string< "" "") ⇒ nil
引数としてシンボルを指定することもでき、この場合はシンボルのプリント名が使用されます。
string-lessp
はstring<
にたいする別名です。
この関数は、string1がstring2のプレフィクス(接頭辞)の場合(たとえばstring2がstring1で始まる場合)、非nil
をreturnします。オプションの引数ignore-caseが非nil
の場合、比較において大文字小文字の違いは無視されます。
この関数は、suffixがstringのサフィックス(接尾辞)の場合(たとえばstringがsuffixで終わる場合)、非nil
をreturnします。オプションの引数ignore-caseが非nil
の場合、比較において大文字小文字の違いは無視されます。
この関数は、string1の指定された部分を、string2の指定された部分と比較します。string1の指定された部分とは、インデックスstart1(その文字を含む)から、インデックスend1(その文字を含まない)までです。start1にnil
を指定すると文字列の最初という意味になり、end1にnil
を指定すると文字列の長さを意味します同様に、string2の指定された部分とは、インデックスstart2からインデックスend2までです。
文字列は、文字列内の文字の数値により比較されます。たとえば、str1とstr2は、最初に異なる文字でstr1の文字の数値が小さいときに、“小さい”と判断されます。ignore-caseが非nil
の場合、文字は比較を行なう前に小文字に変換されます。比較のためにユニバイト文字列はマルチバイト文字列に変換されるので(Text Representationsを参照してください)、ユニバイト文字列と、それを変換したマルチバイト文字列は、常に等しくなります。
2つの文字列の指定された部分がマッチした場合、値はt
になります。それ以外では、値は整数で、これは何文字が一致して、どちらの文字が小さいかを示します。この値の絶対値は、2つの文字列の先頭から一致した文字数に1加えた値になります。string1(または指定された部分)のほうが小さい場合、符号は負になります。
この関数はassoc
と同様に機能しますが、keyは文字列かシンボルでなければならず、比較はcompare-strings
を使用して行なわれます。テストする前にシンボルは文字列に変換されます。case-foldが非nil
の場合、大文字小文字の違いは無視されます。assoc
とは異なり、この関数はコンスではない文字列またはシンボルのalist要素もマッチできます。特に、alistは実際のalistではなく、文字列またはリストでも可能です。Association Listsを参照してください。
バッファー内のテキストを比較する方法として、Comparing Textの関数compare-buffer-substrings
も参照してください。文字列にたいして正規表現のマッチを行なう関数string-match
も、ある種の文字列比較に使用することができます。Regular Expression Searchingを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは文字、文字列、整数の間で変換を行なう関数を説明します。format
(Formatting Stringsを参照してください)、およびprin1-to-string
(Output Functionsを参照してください)も、Lispオブジェクトを文字列に変換できます。read-from-string
(Input Functionsを参照してください)は、Lispオブジェクトの文字列表現を、オブジェクトに“変換”できます。関数string-to-multibyte
およびstring-to-unibyte
は、テキスト表現を文字列に変換します(Converting Text Representationsを参照してください)。
テキスト文字と一般的なインプットイベントにたいするテキスト説明を生成する関数(single-key-description
およびtext-char-description
)については、Documentationを参照してください。これらの関数は主にヘルプメッセージを作成するために使用されます。
この関数はnumberの10進プリント表現からなる文字列をreturnします。引数が負の場合、return値はマイナス記号から開始されます。
(number-to-string 256) ⇒ "256"
(number-to-string -23) ⇒ "-23"
(number-to-string -23.5) ⇒ "-23.5"
int-to-string
は、この関数にたいする半ば廃れた(semi-obsolete)エイリアスです。
Formatting Stringsの関数format
も参照してください。
この関数はstring内の文字の数値的な値をreturnします。baseが非nil
の場合、値は2以上16以下でなければならず、整数はその基数に変換されます。baseがnil
の場合、基数に10が使用されます。浮動少数の変換は基数が10のときだけ機能します。わたしたちは浮動小数点数にたいして他の基数を実装していません。なえならこれには多くの作業が必要で、その割にその機能が有用には思えないからです。stringが整数のように見えるが、その値がLispの整数に収まらないほど大きな値の場合、string-to-number
は浮動小数の結果をreturnします。
解析ではstringの先頭にあるスペースとタブはスキップして、それから与えられた基数で数字として解釈できるところまでstringを読み取ります(スペースとタブだけではなく、先頭にある他の空白文字を無視するシステムもあります)。stringを数字として解釈できない場合、この関数は0をreturnします。
(string-to-number "256") ⇒ 256 (string-to-number "25 is a perfect square.") ⇒ 25 (string-to-number "X256") ⇒ 0 (string-to-number "-4.5") ⇒ -4.5 (string-to-number "1e5") ⇒ 100000.0
string-to-int
は、この関数にたいする半ば廃れたエイリアスです。
この関数は、1つの文字characterを含む新しい文字列をreturnします。関数string
のほうがより一般的なので、この関数は半ば廃れています。Creating Stringsを参照してください。
この関数は、stringの最初の文字をreturnします。これはほとんど(aref string
0)
と同じで、例外は文字列が空のときに0をreturnすることです(文字列の最初の文字がASCIIコード0のヌル文字のときも、0をreturnします)。この関数は、残すのに充分なほど有用と思えない場合、将来削除されるかもしれません。
以下は、文字列へ/からの変換に使用できる、その他の関数です:
concat
この関数はベクターまたはリストから文字列に変換します。Creating Stringsを参照してください。
vconcat
この関数は文字列をベクターに変換します。Functions for Vectorsを参照してください。
append
この関数は文字列をリストに変換します。Building Cons Cells and Listsを参照してください。
byte-to-string
この関数は文字データのバイトをユニバイト文字列に変換します。Converting Text Representationsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フォーマット(formatting)とは、定数文字列内のなまざまな場所を、計算された値で置き換えることにより、文字列を構築することを意味します。この定数文字列は、他の値がプリントされる方法、同様にどこに表示するかを制御します。これはフォーマット文字列(format string)と呼ばれます。
フォーマットは、表示されるメッセージを計算するために便利なことがしばしばあります。実際に、関数message
およびerror
は、ここで説明する機能と同じフォーマットを提供します。これらの関数とformat
の違いは、フォーマットされた結果を使用する方法だけです。
この関数は、stringをコピーしてから、対応するobjectsをエンコードする、コピー内の任意のフォーマット指定(format specification)を置換することにより作成される、新しい文字列をreturnします。引数objectsは、フォーマットされる計算された値です。
string内のフォーマット指定以外の文字は、(もしあれば)テキストプロパティーを含め、出力に直接コピーされます。
フォーマット指定は、‘%’で始まる文字シーケンスです。したがってstring内に‘%d’があれば、format
はそれを、フォーマットされる値の1つ(引数objectsのうちの1つ)にたいするプリント表現で置き換えます。たとえば:
(format "The value of fill-column is %d." fill-column) ⇒ "The value of fill-column is 72."
format
は文字‘%’をフォーマット指定と解釈するので、決して最初の引数に不定な文字列(arbitrary
string)を渡すべきではありません。これは特に何らかのLispコードにより生成された文字列の場合に当てはまります。その文字列が決して文字‘%’を含まないと確信できないときは、以下で説明するように最初の引数に"%s"
を渡して、不定な文字列を2番目の引数として渡します:
(format "%s" arbitrary-string)
stringに複数のフォーマット指定が含まれる場合、フォーマット指定はobjectsから連続して値を引き当てます。つまり、string内の1番目のフォーマット指定は1番目の値、2番目のフォーマット指定は2番目の値、...を使用します。余分なフォーマット指定(対応する値がない場合)は、エラーとなります。フォーマットされる値が余分にある場合は、無視されます。
ある種のフォーマット指定は、特定の型の値を要求します。その要求に適合しない値を与えた場合、エラーがシグナルされます。
以下は有効なフォーマット指定の表です:
フォーマット指定を、クォートなし(つまりprin1
ではなくprinc
を使用して。Output Functionsを参照してください)の、オブジェクトのプリント表現で置き換えます。したがって、文字列は‘"’文字なしの、文字列内容だけが表示され、シンボルは‘\’文字なしで表されます。
オブジェクトが文字列の場合、文字列のプロパティーは出力にコピーされます。‘%s’のテキストプロパティー自身もコピーされますが、オブジェクトのテキストプロパティーが優先されます。
フォーマット指定を、クォートあり(つまりprin1
を使用して。Output Functionsを参照してください)の、オブジェクトのプリント表現で置き換えます。したがって、文字列は‘"’文字で囲まれ、必要となる特別文字の前に‘\’文字が表示されます。
フォーマット指定を8進表現の整数で置き換えます。
フォーマット指定を10進表現の整数で置き換えます。
フォーマット指定を16進表現の整数で置き換えます。‘%x’の場合は小文字、‘%X’の場合は大文字が使用されます。
フォーマット指定を、与えられた値の文字で置き換えます。
フォーマット指定を、浮動小数点数の指数表現で置き換えます。
フォーマット指定を、浮動小数点数にたいする10進少数表記で置き換えます。
フォーマット指定を、指数または10進少数のどちらか短いほうの表記を使用した浮動小数点数で置き換えます。
フォーマット指定を1つの‘%’で置き換えます。このフォーマット指定は、値を使用しません。たとえば、(format "%% %d"
30)
は"% 30"
をreturnします。
他のフォーマット文字は、‘Invalid format operation’エラーになります。
以下にいくつかの例を示します:
(format "The name of this buffer is %s." (buffer-name)) ⇒ "The name of this buffer is strings.texi." (format "The buffer object prints as %s." (current-buffer)) ⇒ "The buffer object prints as strings.texi." (format "The octal value of %d is %o, and the hex value is %x." 18 18 18) ⇒ "The octal value of 18 is 22, and the hex value is 12."
フォーマット指定はフィールド幅(width)をもつことができ、これは‘%’とフォーマット指定文字(specification
character)の間の10進の数字です。そのオブジェクトのプリント表現が、このフィールド幅より少ない文字で構成される場合、format
はパディングしてフィールド幅に拡張します。フォーマット指定‘%%’では、フィールド幅の指定は無視されます。シールド幅指定により行なわれるパディングは通常、左側にスペースを挿入します。
(format "%5d is padded on the left with spaces" 123) ⇒ " 123 is padded on the left with spaces"
フィールド幅が小さすぎる場合でも、format
はオブジェクトのプリント表現を切り詰めません。したがって、情報を失う危険を犯すことなく、フィールドの最小幅を指定することができます。以下の2つの例では、‘%7s’は最小幅に7を指定します。1番目の例では、‘%7s’に挿入される文字列は3文字だけなので、4つのブランクスペースによりパディングされます。2番目の例では、文字列"specification"
は13文字ですが、切り詰めはされません。
(format "The word `%7s' has %d letters in it." "foo" (length "foo")) ⇒ "The word ` foo' has 3 letters in it." (format "The word `%7s' has %d letters in it." "specification" (length "specification")) ⇒ "The word `specification' has 13 letters in it."
‘%’の直後、オプションのフィールド幅指定の前に、フラグ文字(flag characters)を置くこともできます。
フラグ‘+’は、正数の前にプラス符号を挿入するので、数には常に符号がつきます。フラグとしてスペースを指定すると、正数の前に1つのスペースが挿入されます(それ以外は、正数は最初の数字から開始されます)。これらのフラグは、正数と負数が同じ列数を使用することを確実にするのに便利です。これらは‘%d’、‘%e’、‘%f’、‘%g’以外では無視され、両方が指定された場合は、‘+’が優先されます。
フラグ‘#’は“代替形式(alternate form)”を指定し。これは使用するフォーマットに依存します。‘%o’にたいしては、結果を‘0’で開始させます。‘%x’と‘%X’にたいしては、結果のプレフィクスは‘0x’または‘0X’になります。‘%e’、‘%f’、‘%g’にたいしては、‘#’フラグは、少数部が0のときも小数点が含まれることを意味します。
フラグ‘0’は、スペースの代わりに文字‘0’でパディングします。このフラグは‘%s’、‘%S’、‘%c’のような、非数値のフォーマット指定文字では無視されます。もれらのフォーマット指定文字で‘0’フラグを指定できますが、それでもスペースでパディングされます。
フラグ‘-’はフィールド幅指定により挿入されるパディングに作用し、もしパディングがある場合、左側ではなく右側にパディングされます。‘-’と‘0’の両方が指定された場合、‘0’フラグは無視されます。
(format "%06d is padded on the left with zeros" 123) ⇒ "000123 is padded on the left with zeros" (format "%-6d is padded on the right" 123) ⇒ "123 is padded on the right" (format "The word `%-7s' actually has %d letters in it." "foo" (length "foo")) ⇒ "The word `foo ' actually has 3 letters in it."
すべてのフォーマット指定文字には、その文字の前(フィールド幅がある場合は、その後)に、オプションで精度(precision)を指定できます。精度は小数点‘.’と、その後に桁文字列(digit-string)を指定します。浮動少数のフォーマット指定(‘%e’、‘%f’、‘%g’)では、精度は表示する小数点以下の桁数を指定します。0の場合は小数点も省略されます。‘%s’と‘%S’にたいしては、文字列を精度で指定された幅に切り詰めます。したがって‘%.3s’では、objectにたいするプリント表現の最初の3文字だけが表示されます。他のフォーマット指定文字にたいしては、精度は効果がありません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
大文字小文字変換関数(character case functions)は、1つの文字または文字列の内容の大文字小文字を変換します。関数は通常、アルファベット文字(英字‘A’から‘Z’と‘a’から‘z’、同様に非ASCIIの英字)だけを変換し、それ以外の文字は変換しません。大文字小文字テーブル(case table。The Case Tableを参照してください)で指定することにより大文字小文字の変換に異なるマッピングを指定できます。
これらの関数は、引数として渡された文字列は変更しません。
以下の例では文字‘X’と‘x’を使用し、これらのASCIIコードは88と120です。
この関数は、string-or-char(文字か文字列)を小文字に変換します。
string-or-charが文字列の場合、この関数は引数の大文字を小文字に変換した、新しい文字列をreturnします。string-or-charが文字の場合、この関数は対応する小文字(正数)をreturnします。元の文字が小文字の場合、または英字でない場合、return値は元の文字と同じです。
(downcase "The cat in the hat") ⇒ "the cat in the hat" (downcase ?X) ⇒ 120
この関数は、string-or-char(文字か文字列)を大文字に変換します。
string-or-charが文字列の場合、この関数は引数の小文字を大文字に変換した、新しい文字列をreturnします。string-or-charが文字の場合、この関数は対応する大文字(正数)をreturnします。元の文字が大文字の場合、または英字でない場合、return値は元の文字と同じです。
(upcase "The cat in the hat") ⇒ "THE CAT IN THE HAT" (upcase ?x) ⇒ 88
この関数は文字列または文字をキャピタライズ(capitalize: 先頭が大文字で残りは小文字)します。この関数は、string-or-charが文字列の場合、string-or-charの各単語がキャピタライズされた新しいコピーをreturnします。これは各単語の最初の文字が大文字に変換され、残りは小文字に変換されることを意味します。
単語の定義は、カレント構文テーブル(current syntax table)の単語構成構文クラス(word constituent syntax class)に割り当てられた、連続する文字の任意シーケンスです(Table of Syntax Classesを参照してください)。
string-or-charが文字の場合、この関数はupcase
と同じことを行ないます。
(capitalize "The cat in the hat") ⇒ "The Cat In The Hat"
(capitalize "THE 77TH-HATTED CAT") ⇒ "The 77th-Hatted Cat"
(capitalize ?x) ⇒ 88
この関数は、string-or-charが文字列の場合、string-or-charの中の単語の頭文字をキャピタライズし、頭文字以外の文字は変更しません。この関数は、string-or-charの各単語の頭文字が大文字に変換された新しいコピーをreturnします。
単語の定義は、カレント構文テーブル(current syntax table)の単語構成構文クラス(word constituent syntax class)に割り当てられた、連続する文字の任意シーケンスです(Table of Syntax Classesを参照してください)。
upcase-initials
の引数が文字の場合、upcase-initials
の結果はupcase
と同じになります。
(upcase-initials "The CAT in the hAt") ⇒ "The CAT In The HAt"
文字列を比較する関数(大文字小文字の違いを無視するものや、オプションで大文字小文字の違いを無視できるもの)については、Comparison of Characters and Stringsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
特別な大文字小文字テーブル(case table)をインストールすることにより、大文字小文字の変換をカスタマイズできます。大文字小文字テーブルは大文字と小文字の間のマッピングを指定します。大文字小文字テーブルはLispオブジェクトにたいする大文字小文字変換関数(前のセクションを参照してください)と、バッファー内のテキストに適用される関数の両方に影響します。それぞれのバッファーには大文字小文字テーブルがあります。新しいバッファーの大文字小文字テーブルを初期化するために使用される、標準の大文字小文字テーブル(standard case table)もあります。
大文字小文字テーブルは、サブタイプがcase-table
の文字テーブル(char-table。Char-Tablesを参照してください)です。この文字テーブルは、それぞれの文字を対応する小文字にマップします。大文字小文字テーブルは、関連するテーブルを保持する、3つの追加スロットをもちます:
upcase(大文字)テーブルは、それぞれの文字を対応する大文字にマップします。
canonicalize(正準化)テーブルは、大文字小文字に関連する文字セットのすべてを、その文字セットの特別なメンバーにマップします。
equivalence(同値)テーブルは、大の字小文字に関連した文字セットのそれぞれを、そのセットの次の文字にマップします。
単純な例では、小文字へのマッピングを指定することだけが必要です。3つの関連するテーブルは、このマッピングから自動的に計算されます。
大文字と小文字が1対1で対応しない言語もいくつかあります。これらの言語では、2つの異なる小文字が、同じ大文字にマップされます。このような場合、大文字と小文字の両方にたいするマップを指定する必要があります。
追加のcanonicalizeテーブルは、それぞれの文字を、正準化された等価文字にマップします。大文字小文字に関連する任意の2文字は、同じ正準等価文字(canonical equivalent character)をもちます。たとえば‘a’と‘A’は大文字小文字変換に関係があるので、これらの文字は同じ正準等価文字(両方の文字が‘a’、または両方の文字が‘A’)をもつべきです。
追加のequivalencesテーブルは、各等価クラスの文字(同じ正準等価文字をもつ文字)を循環的にマップします(通常のASCIIでは、これは‘a’を‘A’に‘A’を‘a’にマップし、他の等価文字セットにたいしても同様にマップします)。
大文字小文字テーブルを構築する際は、canonicalizeにnil
を指定できます。この場合、Emacsは大文字と小文字のマッピングで、このスロットを充填します。equivalencesにたいしてnil
を指定することもできます。この場合、Emacsはcanonicalizeから、このスロットを充填します。実際に使用される大文字小文字テーブルでは、これらのコンポーネントは非nil
です。canonicalizeを指定せずにequivalencesを指定しないでください。
以下は大文字小文字テーブルに作用する関数です:
この述語は、objectが有効な大文字小文字テーブルの場合は、非nil
をreturnします。
この関数は、tableを標準大文字小文字テーブルにして、これ以降に作成される任意のバッファーにたいしてこのテーブルが使用されます。
これは標準大文字小文字テーブル(standard case table)をreturnします。
この関数は、カレントバッファーの大文字小文字テーブルをreturnします。
これはカレントバッファーの大文字小文字テーブルを、tableにセットします。
with-case-table
マクロはカレント大文字小文字テーブルを保存してから、tableをカレント大文字小文字テーブルにセットし、その後にbodyフォームを評価してから、最後に大文字小文字テーブルをリストアします。return値は、bodyの最後のフォームの値です。throw
またはエラー(Nonlocal Exitsを参照してください)により異常終了した場合でも、大文字小文字テーブルはリストアされます。
ASCII文字の大文字小文字変換を変更する言語環境(language
environment)がいくつかあります。たとえばTurkishの言語環境では、ASCII文字の‘I’にたいする小文字は、Turkishの“dotless
i”です。これは、(ASCIIベースのネットワークプロトコル実装のような)ASCIIの通常の大文字小文字変換を要求するコードに干渉する可能性があります。このような場合は、変数ascii-case-tableにたいしてwith-case-table
マクロを使用します。これにより、変更されていないASCII文字セットの大文字小文字テーブルが保存されます。
ASCII文字セットにたいする大文字小文字テーブルです。すべての言語環境セッティングにおいて、これを変更するべきではありません。
以下の3つの関数は、非ASCII文字セットを定義するパッケージにたいして便利なサブルーチンです。これらはcase-tableに指定された大文字小文字テーブルを変更します。これは標準構文テーブルも変更します。Syntax Tablesを参照してください。通常これらの関数は、標準大文字小文字テーブルを変更するために使用されます。
この関数は、対応する文字のペア(一方は大文字、もう一方は小文字)を指定します。
この関数は文字lとrを、大文字小文字不変区切り(case-invariant delimiter)mpマッチングペアにします。
この関数はcharを、構文syntaxの、大文字小文字不変(case-invariant)とします。
このコマンドは、カレントバッファーの大文字小文字テーブルの内容にたいする説明を表示します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リスト(list)は0個以上の要素(任意のLispオブジェクト)のシーケンスを表します。リストとベクターの重要な違いは、、2つ以上のリストが、構造の一部を共有できることです。加えて、リスト全体をコピーすることなく、要素の挿入、削除ができます。
5.1 Lists and Cons Cells | コンスセルからリストが作られる方法。 | |
5.2 Predicates on Lists | このオブジェクトはリストか? 2つのリストを比較する。 | |
5.3 Accessing Elements of Lists | リストの一部を抽出する。 | |
5.4 Building Cons Cells and Lists | リスト構造の作成。 | |
5.5 Modifying List Variables | 変数に保存されたリストにたいする変更。 | |
5.6 Modifying Existing List Structure | 既存のリストに新しい要素を保存する。 | |
5.7 Using Lists as Sets | リストは有限な数学集合を表現できます。 | |
5.8 Association Lists | リストは有限な関係またはマッピングを表現できます。 | |
5.9 Property Lists | 要素ペアのリスト |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispでのリストは基本データ型ではありません。リストはコンスセル(cons cells)から構築されます(Cons Cell and List Typesを参照してください)。コンスセルは、順序つきペアを表現するデータオブジェクトです。つまり、コンスセルは2つのスロットをもち、それぞれのスロットはLispオブジェクトを保持(holds)、または参照(refers to)します。1つのスロットはCAR、もう1つはCDRです(これらの名前は歴史的なものです。Cons Cell and List Typesを参照してください)。CDRは“could-er(クダー)”と発音されます。
わたしたちは、コンスセルのCARスロットに現在保持されているオブジェクトが何であれ、“このコンスセルのCARは、...”のような言い方をします。これはCDRの場合も同様です。
リストとは、“互いにつながった(chained together)”一連のコンスセルであり、各セルは次のセルを参照します。リストの各要素にたいして、それぞれ1つのコンスセルがあります。慣例により、コンスセルのCARはリストの要素を保持し、CDRはリストをチェーンするのに使用されます(CARとCDRの間の非対称性は完全に慣例的なものです。コンスセルのレベルでは、CARスロットとCDRスロットは同じようなプロパティーをもちます)。したがって、リスト内の各コンスセルのCDRスロットは、次のコンスセルを参照します。
これも慣例的なものですが、リスト内の最後のコンスセルのCDRはnil
です。わたしたちは、このようなnil
で終端された構造を、真リスト(true
list)と呼びます。Emacs
Lispでは、シンボルnil
は、シンボルであり、要素なしのリストでもあります。便宜上、シンボルnil
は、そのCDR(およびCAR)にnil
をもつと考えます。
したがって真リストのCDRは、常に真リストです。空でない真リストのCDRは、1番目の要素以外を含む真リストです。
リストの最後のコンスセルのCDRがnil
以外の何らかの値の場合、このリストのプリント表現はドットペア表記(dotted pair
notation。Dotted Pair Notationを参照してください)を使用するので、わたしたちはこの構造をドットリスト(dotted
list)と呼びます。他の可能性もあります。あるコンスセルのCDRが、そのリストのそれより前にある要素を指すかもしれません。わたしたちは、この構造を循環リスト(circular
list)と呼びます。
ある目的にたいしては、そのリストが真リストか、循環リストなのか、ドットリストなのかが問題にならない場合もあります。そのプログラムが、リストを充分に下って最後のコンスセルのCDRを確認しようとしないなら、これは問題になりません。しかし、リストを処理するの関数のいくつかは、真リストを要求し、ドットリストの場合はエラーをシグナルします。リストの最後を探そうと試みる関数のほとんどは、循環リストを与えると無限ループに突入します。
ほとんどのコンスセルはリストの一部として使用されるので、わたしたちはコンスセルで構成される任意の構造を、リスト構造(list structure)と呼びます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の述語は、あるLispオブジェクトがアトムなのか、コンスセルなのか、それともリストなのか、またはオブジェクトがnil
かどうかテストします(これらの述語の多くは、他の述語で定義することもできますが、多用されるので、定義する価値があるのです)。
この関数は、objectがコンスセルの場合はt
、それ以外はnil
をreturnします。たとえnil
はリストですが、コンスセルではありません。
この関数は、objectがアトムの場合はt
、それ以外はnil
をreturnします。シンボルnil
はアトムであり、リストでもあります。そのようなLispオブジェクトはnil
だけです。
(atom object) ≡ (not (consp object))
この関数は、objectがコンスセルかnil
の場合はt
をreturnします。それ以外はnil
をreturnします。
(listp '(1)) ⇒ t
(listp '()) ⇒ t
この関数はlistp
の反対です。objectがリストでない場合はt
をreturnします。それ以外はnil
をreturnします。
(listp object) ≡ (not (nlistp object))
この関数は、objectがnil
の場合はt
、それ以外はnil
をreturnします。この関数はnot
と等価ですが、明解にするために、objectをリストだと考えるときはnull
、真偽値だと考えるときはnot
を使用します(Constructs for Combining Conditionsのnot
を参照してください)。
(null '(1)) ⇒ nil
(null '()) ⇒ t
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は、コンスセルcons-cellの1番目のスロットにより参照される値をreturnします。他の言い方をすると、この関数はcons-cellのCARをreturnします。
特別なケースとして、cons-cellがnil
の場合、この関数はnil
をreturnします。したがって、リストはすべて引数として有効です。引数がコンスセルでもnil
でもない場合、エラーがシグナルされます。
(car '(a b c)) ⇒ a
(car '()) ⇒ nil
この関数は、コンスセルcons-cellの2番目のスロットにより参照される値をreturnします。他の言い方をすると、この関数はcons-cellのCDRをreturnします。
特別なケースとして、cons-cellがnil
の場合、この関数はnil
をreturnします。したがって、リストはすべて引数として有効です。引数がコンスセルでもnil
でもない場合、エラーがシグナルされます。
(cdr '(a b c)) ⇒ (b c)
(cdr '()) ⇒ nil
この関数により、他のデータ型によるエラーを起こさずに、コンスセルのCARを取得できます。この関数は、objectがコンスセルの場合はobjectのCAR、それ以外はnil
をreturnします。この関数は、objectがリスとでないときはエラーをシグナルするcar
とは対象的です。
(car-safe object) ≡ (let ((x object)) (if (consp x) (car x) nil))
この関数により、他のデータ型によるエラーを起こさずに、コンスセルのCDRを取得できます。この関数は、objectがコンスセルの場合はobjectのCDR、それ以外はnil
をreturnします。この関数は、objectがリスとでないときはエラーをシグナルするcdr
とは対象的です。
(cdr-safe object) ≡ (let ((x object)) (if (consp x) (cdr x) nil))
このマクロはリストのCARを調べて、それをリストから取り去るのを1度に行なう便利な方法を提供します。この関数はlistnameに格納されたリストにたいして処理を行ないます。この関数はリストから1番目の要素を削除して、CDRをlistnameに保存し、その後で削除した要素をreturnします。
1番単純なケースは、リストに名前をつけるためのクォートされていないシンボルの場合です。この場合、このマクロは(prog1 (car listname) (setq listname (cdr listname)))
と等価です。
x ⇒ (a b c) (pop x) ⇒ a x ⇒ (b c)
より一般的なのは、listnameが汎変数(generalized
variable)の場合です。この場合、このマクロはsetf
を使用してlistnameに保存します。Generalized Variablesを参照してください。
リストに要素を追加するpush
マクロについては、Modifying List Variablesを参照してください。
この関数は、listのn番目の要素をreturnします。要素は0から数えられるので、listのCARは要素0になります。listの長さがn以下の場合、値はnil
です。
(nth 2 '(1 2 3 4)) ⇒ 3
(nth 10 '(1 2 3 4)) ⇒ nil (nth n x) ≡ (car (nthcdr n x))
関数elt
は似ていますが、これは任意の種類のシーケンスに適用されます。歴史的な理由により、この関数は逆の順序で引数を受け取ります。Sequencesを参照してください。
この関数は、listのn番目のCDRをreturnします。他の言い方をすると、この関数はlistの最初のn個のリンクをスキップしてから、それ以降をreturnします。
nが0の場合、nthcdr
はlist全体をreturnします。listの長さがn以下の場合、nthcdr
はnil
をreturnします。
(nthcdr 1 '(1 2 3 4)) ⇒ (2 3 4)
(nthcdr 10 '(1 2 3 4)) ⇒ nil
(nthcdr 0 '(1 2 3 4)) ⇒ (1 2 3 4)
この関数は、listの最後のリンクをreturnします。このリンクのcar
は、このリストの最後の要素です。listがnullの場合、nil
がreturnされます。nが非nil
の場合、n番目から最後までのリンクがreturnされます。nがlistの長さより大きい場合は、list全体がreturnされます。
この関数は、エラーや無限ループの危険なしで、listの長さをreturnします。この関数は一般的に、リスト内のコンスセルの個数をreturnします。しかし循環リストでは、単に上限値が値となるため、非常に大きくなる場合があります。
listがnil
でもコンスセルでもない場合、safe-length
は0をreturnします。
循環リストを考慮しなくてもよい場合に、リストの長さを計算するもっとも一般的な方法は、length
を使うことです。Sequencesを参照してください。
これは、(car (car cons-cell))
と同じです。
これは、(car (cdr cons-cell))
または(nth 1
cons-cell)
と同じです。
これは、(cdr (car cons-cell))
と同じです。
これは、(cdr (cdr cons-cell))
または(nthcdr 2
cons-cell)
と同じです。
この関数は、リストxから、最後の要素、または最後のn個の要素を削除してreturnします。nが0より大きい場合、この関数はリストのコピーを作成するので、元のリストに影響はありません。一般的に、(append
(butlast x n) (last x
n))
は、xと等しいリストをreturnします。
この関数は、リストのコピーを作成するのではなく、cdr
を適切な要素に変更することにより破壊的に機能するバージョンのbutlast
です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストはLispの核にあるので、リストを構築する多くの関数があります。cons
はリストを構築する基本的な関数です。しかしEmacsのソースコードでは、cons
よりlist
のほうが多く使用されているのは興味深いことです。
この関数は、新しいリスト構造を構築するための、もっとも基本的な関数です。この関数は、object1をCAR、object2をCDRとする、新しいコンスセルを作成して、それから新しいコンスセルをreturnします。引数object1とobject2は、任意のLispオブジェクトを指定できますが、ほとんどの場合、object2はリストです。
(cons 1 '(2)) ⇒ (1 2)
(cons 1 '()) ⇒ (1)
(cons 1 2) ⇒ (1 . 2)
リストの先頭に1つの要素を追加するために、cons
がよく使用されます。これは、リストに要素をコンスすると言います。2たとえば:
(setq list (cons newelt list))
この例で使用されているlist
という名前の変数と、以下で説明するlist
という名前の関数は、競合しないことに注意してください。任意のシンボルは、両方の役割を果たすことができます。
この関数は、objectsを要素とするリストを作成します。結果となるリストは、常にnil
終端されます。objectsを指定しない場合、空リストがreturnされます。
(list 1 2 3 4 5) ⇒ (1 2 3 4 5)
(list 1 2 '(3 4 5) 'foo) ⇒ (1 2 (3 4 5) foo)
(list) ⇒ nil
この関数は、各要素がobjectの、length個の要素からなるリストを作成します。make-list
とmake-string
(Creating Stringsを参照してください)を比較してみてください。
(make-list 3 'pigs) ⇒ (pigs pigs pigs)
(make-list 0 'pigs) ⇒ nil
(setq l (make-list 3 '(a b))) ⇒ ((a b) (a b) (a b)) (eq (car l) (cadr l)) ⇒ t
この関数は、sequencesのすべての要素を服務リストをreturnします。sequencesには、リスト、ベクター、ブールベクター、文字列も指定できますが、通常は最後にリストを指定するべきです。最後の引数を除くすべての引数はコピーされるので、変更される引数はありません(コピーを行なわずにリストを結合する方法については、Functions that Rearrange Listsのnconc
を参照してください)。
より一般的には、append
にたいする最後の引数は、任意のLispオブジェクトかもしれません。最後の引数は、コピーまたは変換されません。最後の引数は、新しいリストの最後のコンスセルのCDRになります。最後の引数もリストならば、このリストの要素は、実質的には結果リストの要素になります。最後の要素がリストでない場合、最後のCDRが(真リストで要求される)nil
ではないので、結果はドットリストになります。
以下はappend
を使用した例です:
(setq trees '(pine oak)) ⇒ (pine oak) (setq more-trees (append '(maple birch) trees)) ⇒ (maple birch pine oak)
trees ⇒ (pine oak) more-trees ⇒ (maple birch pine oak)
(eq trees (cdr (cdr more-trees))) ⇒ t
append
がどのように機能するか、ボックスダイアグラムで見ることができます。変数trees
はリスト(pine
oak)
にセットされ、それから変数more-trees
にリスト(maple birch pine
oak)
がセットされます。しかし変数trees
は継続して元のリストを参照します:
more-trees trees | | | --- --- --- --- -> --- --- --- --- --> | | |--> | | |--> | | |--> | | |--> nil --- --- --- --- --- --- --- --- | | | | | | | | --> maple -->birch --> pine --> oak
空のシーケンスは、append
によりreturnされる値に寄与しません。この結果、最後の引数にnil
を指定すると、それより前の引数のコピーを強制することになります。
trees ⇒ (pine oak)
(setq wood (append trees nil)) ⇒ (pine oak)
wood ⇒ (pine oak)
(eq wood trees) ⇒ nil
これは関数copy-sequence
が導入される以前は、リストをコピーする通常の方法でした。Sequences, Arrays, and Vectorsを参照してください。
以下は、append
の引数としてベクターと文字列を使用する例です:
(append [a b] "cd" nil) ⇒ (a b 99 100)
apply
(Calling Functionsを参照してください)の助けを借りることにより、リストのリストの中の、すべてのリストをappendできます。
(apply 'append '((a b c) nil (x y z) nil)) ⇒ (a b c x y z)
sequencesが与えられない場合、nil
がreturnされます:
(append) ⇒ nil
以下は、最後の引数がリストでない場合の例です:
(append '(x y) 'z) ⇒ (x y . z) (append '(x y) [z]) ⇒ (x y . [z])
2番目の例は、最後の引数はシーケンスですがリスとではない場合で、このシーケンスの要素は、結果リストの要素にはなりません。かわりに、最後の引数がリストでないときと同様、シーケンスが最後のCDRになります。
この関数は、要素はlistの要素ですが、順序が逆の新しいリストを作成します。元の引数listは、変更されません。
(setq x '(1 2 3 4)) ⇒ (1 2 3 4)
(reverse x) ⇒ (4 3 2 1) x ⇒ (1 2 3 4)
この関数はツリーtree
のコピーをreturnします。treeがコンスセルの場合、同じCARとCDRをもつ新しいコンスセルを作成してから、同じ方法によりCARとCDRを再帰的にコピーします。
通常、treeがコンスセル以外の場合、copy-tree
は単にtreeをreturnします。しかし、vecpが非nil
の場合、この関数はベクターでもコピーします(そしてベクターの要素を再帰的に処理します)。
これは、fromからseparationづつインクリメントして、toの直前で終わる、数字のリストをreturnします。separationには正または負の数を指定でき、デフォルトは1です。toがnil
、または数的にfromと等しい場合、値は1要素のリスト(from)
になります。separationが正でtoがfromより小さい場合、またはseparationが負でtoがfromより大きい場合、これらの引数は空のシーケンスを指示することになるので、値はnil
になります。
separationが0で、toがnil
でもなく、数的にfromとも等しくない場合、これらの引数は無限シーケンスを指示することになるので、エラーがシグナルされます。
引数はすべて数字です。浮動少数の計算は正確ではないので、浮動少数の引数には用心する必要があります。たとえばマシンに依存して、(number-sequence
0.4 0.8 0.2)
が3要素のリストをreturnするのに、(number-sequence 0.4 0.6
0.2)
が1要素のリスト(0.4)
をreturnすることがよく起こります。リストのn番目の要素は、厳密に(+
from (* n
separation))
という式により計算されます。したがって、リストに確実にtoが含まれるようにするには、この式に適切な型のtoを渡すことができます。別の方法として、toを少しだけ大きな値(separationが負の場合は、少しだけ小さな値)に置き換えることもできます。
いくつか例を示します:
(number-sequence 4 9) ⇒ (4 5 6 7 8 9) (number-sequence 9 4 -1) ⇒ (9 8 7 6 5 4) (number-sequence 9 4 -2) ⇒ (9 7 5) (number-sequence 8) ⇒ (8) (number-sequence 8 5) ⇒ nil (number-sequence 5 8 -1) ⇒ nil (number-sequence 1.5 6 2) ⇒ (1.5 3.5 5.5)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらの関数、および1つのマクロは、変数に格納されたリストを変更する便利な方法を提供します。
このマクロは、CARがelementで、CDRがlistnameで指定されたリストであるような新しいリストを作成して、そのリストをlistnameに保存します。単純なのは、listnameはリストに名前をつけるクォートされていないシンボルのときで、この場合マクロは(setq listname (cons element listname))
と等価です。
(setq l '(a b)) ⇒ (a b) (push 'c l) ⇒ (c a b) l ⇒ (c a b)
より一般的なのは、listname
が汎変数の場合です。この場合、このマクロは(setf listname (cons element listname))
と等価です。Generalized Variablesを参照してください。
リストから1番目の要素を取り出すpop
マクロについては、Accessing Elements of Listsを参照してください。
以下の2つの関数は、変数の値であるリストを変更します。
この関数は、elementがsymbolの値のメンバーでない場合は、symbolにelementをコンスすることにより、変数symbolをセットします。この関数は、リストが更新されているかに関わらず、結果のリストをreturnしますsymbolの値は、呼び出し前にすでにリストであることが望ましいです。elementがリストの既存メンバーか比較するために、add-to-list
はcompare-fnを使用します。compare-fnがnil
の場合は、equal
を使用します。
elementが追加される場合は通常、symbolの前に追加されますが、オプションの引数appendが非nil
の場合は、最後に追加されます。
引数symbolは、暗黙にクォートされません。setq
とは異なり、add-to-list
はset
のような通常の関数です。クォートしたい場合は自分で引数をクォートします。
以下はadd-to-list
を使用する方法をシナリオで示します:
(setq foo '(a b)) ⇒ (a b) (add-to-list 'foo 'c) ;;c
を追加。 ⇒ (c a b) (add-to-list 'foo 'b) ;; 効果なし。 ⇒ (c a b) foo ;;foo
が変更された。 ⇒ (c a b)
以下は(add-to-list 'var value)
と等価な式です:
(or (member value var) (setq var (cons value var)))
この関数は、古い値(リストでなければなりません)のorderで指定された位置に、elementを挿入することにより、変数symbolをセットします。elementがすでにこのリストのメンバーである場合、リスト内の要素の位置はorderにしたがって調整されます。メンバーかどうかは、eq
を使用してテストされます。この関数は、更新されているかどうかに関わらず、結果のリストをreturnします。
orderは通常、数字(正数か浮動小数)で、リストの要素は、その数字の昇順で並べられます。
orderを省略またはnil
にすることもできます。これにより、リストにelementがすでに存在する場合、elementの数字順序は変更されません。それ以外では、elementは数字順序をもちません。リストの数字順序をもたない要素は、リストの最後に配され、特別な順序はつきません。
orderに他の値を指定した場合、elementがすでに数字順序をもつときは数字順序が削除されます。それ以外は、nil
と同じです。
引数symbolは、暗黙にクォートされません。add-to-ordered-list
は、setq
などとは異なり、set
のような通常の関数です。必要な場合は引数を自分でクォートしてください。
順序の情報は、symbolのlist-order
プロパティーのハッシュテーブルに保存されます。
以下にadd-to-ordered-list
を使用する方法をシナリオで示します:
(setq foo '()) ⇒ nil (add-to-ordered-list 'foo 'a 1) ;;a
を追加。 ⇒ (a) (add-to-ordered-list 'foo 'c 3) ;;c
を追加。 ⇒ (a c) (add-to-ordered-list 'foo 'b 2) ;;b
を追加。 ⇒ (a b c) (add-to-ordered-list 'foo 'b 4) ;;b
を移動。 ⇒ (a c b) (add-to-ordered-list 'foo 'd) ;;d
を後に追加。 ⇒ (a c b d) (add-to-ordered-list 'foo 'e) ;;e
を追加。 ⇒ (a c b e d) foo ;;foo
が変更された。 ⇒ (a c b e d)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
基本関数setcar
およびsetcdr
により、コンスセルのCARおよびCDRの内容を変更できます。わたしたちは、これらが既存のリスト構造を変更することから、これらを“破壊的”処理と呼びます。
Common Lispに関する注意: Common Lispはリスト構造の変更に
rplaca
およびrplacd
を使用します。これらはsetcar
やsetcdr
と同じ方法でリスト構造を変更しますが、setcar
とsetcdr
は新しいCARまたはCDRをreturnするのにたいし、Common Lispの関数はコンスセルをreturnします。
5.6.1 Altering List Elements with setcar | リスト内の要素の置き換え。 | |
5.6.2 Altering the CDR of a List | リストの根幹部分の置き換え。これは要素の追加や削除に使用されます。 | |
5.6.3 Functions that Rearrange Lists | リスト内の要素の再配置、リストの合成。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
setcar
コンスセルのCARの変更は、setcar
により行なわれます。リストにたいして使用された場合、setcar
はリストの1つの要素を、他の要素に置き換えます。
この関数は、以前のCARを置き換えて、consの新しいCARにobjectを格納します。他の言い方をすると、この関数はconsのCARスロットを、objectを参照するように変更します。この関数は値objectをreturnします。たとえば:
(setq x '(1 2)) ⇒ (1 2)
(setcar x 4) ⇒ 4
x ⇒ (4 2)
コンスセルが、複数のリストが共有された構造の一部の場合、コンスに新しいCARを格納することにより、これら共有されたリストの各1つの要素を変更します。以下は例です:
;; 部分的に共有された2つのリストを作成。
(setq x1 '(a b c))
⇒ (a b c)
(setq x2 (cons 'z (cdr x1)))
⇒ (z b c)
;; 共有されたリンクのCARを置き換え。 (setcar (cdr x1) 'foo) ⇒ foo x1 ; 両方のリストが変更された。 ⇒ (a foo c) x2 ⇒ (z foo c)
;; 共有されていないリンクのCARを置き換え。 (setcar x1 'baz) ⇒ baz x1 ; 1つのリストだけが変更された。 ⇒ (baz foo c) x2 ⇒ (z foo c)
なぜb
を置き換えると両方が変更されるのかを説明するために、変数x1
とx2
の2つのリストによる共有構造を視覚化してみましょう:
--- --- --- --- --- --- x1---> | | |----> | | |--> | | |--> nil --- --- --- --- --- --- | --> | | | | | | --> a | --> b --> c | --- --- | x2--> | | |-- --- --- | | --> z
同じ関係を別のボックス図で示すと、以下のようになります:
x1: -------------- -------------- -------------- | car | cdr | | car | cdr | | car | cdr | | a | o------->| b | o------->| c | nil | | | | -->| | | | | | -------------- | -------------- -------------- | x2: | -------------- | | car | cdr | | | z | o---- | | | --------------
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
CDRを変更するもっとも低レベルの基本関数は、setcdr
です:
この関数は前のCDRを置き換えて、consの新しいCDRにobjectを格納します。他の言い方をすると、この関数はconsのCDRを、objectを参照するように変更します。この関数は値objectをreturnします。
以下はリストのCDRを、他のリストに置き換える例です。1番目の要素以外のすべての要素は、別のシーケンスまたは要素のために取り除かれます。1番目の要素はリストのCARなので変更されず、CDRを通じて到達することもできないからです。
(setq x '(1 2 3)) ⇒ (1 2 3)
(setcdr x '(4)) ⇒ (4)
x ⇒ (1 4)
リスト内のコンスセルのCDRを変更することにより、リストの途中から要素を削除できます。たとえば以下では、1番目のコンスセルのCDRを変更することにより、2番目の要素b
を、リスト(a
b c)
から削除します。
(setq x1 '(a b c)) ⇒ (a b c) (setcdr x1 (cdr (cdr x1))) ⇒ (c) x1 ⇒ (a c)
以下に結果をボックス表記で示します:
-------------------- | | -------------- | -------------- | -------------- | car | cdr | | | car | cdr | -->| car | cdr | | a | o----- | b | o-------->| c | nil | | | | | | | | | | -------------- -------------- --------------
以前は要素b
を保持していた2番目のコンスセルは、依然として存在して、そのCARもb
のままですが、すでにこのリストの一部を形成していません。
CDRを変更して、新しい要素を挿入するのも、同じくらい簡単です:
(setq x1 '(a b c)) ⇒ (a b c) (setcdr x1 (cons 'd (cdr x1))) ⇒ (d b c) x1 ⇒ (a d b c)
以下に結果をボックス表記で示します:
-------------- ------------- ------------- | car | cdr | | car | cdr | | car | cdr | | a | o | -->| b | o------->| c | nil | | | | | | | | | | | | --------- | -- | ------------- ------------- | | ----- -------- | | | --------------- | | | car | cdr | | -->| d | o------ | | | ---------------
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下では、リストの構成要素であるコンスセルのCDRを変更することにより、リストを“破壊的”に再配置する関数をいくつか示します。これらの関数が“破壊的”だという理由は、これらの関数が引数として渡された元のリストを処理して、return値となる新しいリストを形成するために、リストのコンスセルを再リンクするからです。
コンスセルを変更する他の関数については、Using Lists as Setsのdelq
を参照してください。
この関数は、listsの要素すべてを含むリストをreturnします。append
(Building Cons Cells and Listsを参照してください)とは異なり、listsはコピーされません。かわりにlistsの各リストの最後のCDRが、次のリストを参照するように変更されます。listsの最後のリストは、変更されません。たとえば:
(setq x '(1 2 3)) ⇒ (1 2 3)
(nconc x '(4 5)) ⇒ (1 2 3 4 5)
x ⇒ (1 2 3 4 5)
nconc
の最後の引数は変更されないので、上記の例のように、'(4
5)
のような定数リストを使用するのが理に適っています。また、同じ理由により、最後の引数がリスとである必要はありません。
(setq x '(1 2 3)) ⇒ (1 2 3)
(nconc x 'z) ⇒ (1 2 3 . z)
x ⇒ (1 2 3 . z)
しかし、(最後を除くすべての)他の引数はリストでなければなりません。
一般的な落とし穴としては、nconc
にたいしてクォートされたリスト定数を、最後以外の引数として使用したときです。これを行なう場合、実行するごとにプログラムはリスト定数を変更するでしょう!
何が起こるのかを以下に示します:
(defun add-foo (x) ; この関数ではfoo
(nconc '(foo) x)) ; を引数の前に追加させたい。
(symbol-function 'add-foo) ⇒ (lambda (x) (nconc (quote (foo)) x))
(setq xx (add-foo '(1 2))) ; 動いているように見える。
⇒ (foo 1 2)
(setq xy (add-foo '(3 4))) ; 何が起きているのか?
⇒ (foo 1 2 3 4)
(eq xx xy) ⇒ t
(symbol-function 'add-foo) ⇒ (lambda (x) (nconc (quote (foo 1 2 3 4) x)))
この関数は、listの要素の順番を逆転します。reverse
とは異なり、nreverse
はリストを形成するCDR内のコンスセルを逆転することにより、引数を変更します。listの最後に使用されているコンスセルは、最初のコンスセルになります。
たとえば:
(setq x '(a b c)) ⇒ (a b c)
x ⇒ (a b c) (nreverse x) ⇒ (c b a)
;; 最初のコンスセルが最後になった。
x
⇒ (a)
わたしたちは通常、混乱を避けるために、nreverse
の結果を、元のリストを保持していたのと同じ変数に格納します:
(setq x (nreverse x))
以下は、(a b c)
を視覚的に表した、nreverse
の例です:
元のリストの先頭: 逆転されたリスト: ------------- ------------- ------------ | car | cdr | | car | cdr | | car | cdr | | a | nil |<-- | b | o |<-- | c | o | | | | | | | | | | | | | | ------------- | --------- | - | -------- | - | | | | ------------- ------------
この関数は、listを安定的(しかし破壊的)にソートして、ソートされたリストをreturnします。この関数はpredicateを使用して要素を比較します。安定ソート(stable sort)では、同じソートキーをもつ要素が、ソートの前後で相対的に同じ順序が維持されます。安定性は、異なる条件によりソートするために要素を並び替えるために、連続したソートが使用されるときに重要です。
引数predicateは、2つの引数をとる関数でなければなりません。この関数はlistの2つの要素を引数として呼び出されます。昇順のソートを得るためのpredicateは、1番目の引数が、2番目の引数より“小さい”ときは非nil
、それ以外はnil
をreturnするようにします。
比較関数predicateは、少なくとも単独のsort
呼び出しにおいて、任意の与えられた引数にたいして信頼できる結果を与えなければありません。比較関数は非対称的(antisymmetric)
— つまりaがbより小さいとき、bはaより小さくない —
でなければなりません。比較関数は推移的(transitive) —
つまりaがbより小さく、bがcより小さい場合、cはaより小さい —
でなければなりません。これらの要求を満たさない比較関数を使用した場合、sort
の結果は予測できません。
sort
の破壊的な側面は、CDRを変更することにより、listを形成するコンスセルを再配置することです。非破壊的なソート関数の場合は、ソートされた要素を格納するために、あたらしいコンスセルを作成します。元のリストを破壊せずにソートされたコピーを作成したい場合は、copy-sequence
で最初にコピーしてから、それをソートします。
ソートはlist内のコンスセルのCARは変更しません。list内でCARに要素a
を保持していたコンスセル、ソート後にもa
を保持しますが、CDRは変更されるので、ソート後の位置は異なります。たとえば:
(setq nums '(1 3 2 6 5 4 0)) ⇒ (1 3 2 6 5 4 0)
(sort nums '<) ⇒ (0 1 2 3 4 5 6)
nums ⇒ (1 2 3 4 5 6)
警告:
nums
のリストには0が含まれていないことに注意してください。これは前と同じコンスセルですが、リストの1番目ではなくなります。引数を保持するように形成された変数が、ソートされたリストでも保持されると仮定しないでください!
かわりにsort
の結果を保存して、それを使用してください。元のリストを保持していた変数に、結果を書き戻すことはよく行なわれます。
(setq nums (sort nums '<))
ソート処理を行なう他の関数については、Sorting Textを参照してください。sort
の有用な例は、Access to Documentation Stringsのdocumentation
を参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストは順序なしの数学的集合 — リスト内に要素があれば集合の要素の値とされ、リスト内の順序は無視される —
を表すことができます。2つの集合を結合(union)するには、(重複する要素を気にしない場合は)append
を使用します。equal
である重複を取り除くには、delete-dups
を使用します。集合にたいする他の有用な関数には、memq
やdelq
、およびこれらのequal
バージョンであるmember
とdelete
が含まれます。
Common Lispに関する注意: 集合を処理するために、Common Lispには(要素の重複がない)関数
union
があります。これらの関数は標準のGNU Emacs Lispにはありませんが、cl-libはこれらを提供します。Lists as Sets in Common Lisp Extensionsを参照してください。
この関数は、objectがlistのメンバーかどうかをテストします。メンバーの場合、memq
はobjectで最初に見つかった要素から開始されるリストをreturnします。メンバーでない場合は、nil
をreturnします。memq
の文字‘q’は、この関数がobjectとリスト内の要素の比較に、eq
を使用することを示します。たとえば:
(memq 'b '(a b c b a)) ⇒ (b c b a)
(memq '(2) '((1) (2))) ; (2)
と(2)
はeq
ではない。
⇒ nil
この関数listからはobjectとeq
なすべての要素を破壊的に取り除いて、結果のリストをreturnします。delq
の文字‘q’は、この関数がobjectとリスト内の要素の比較に、eq
を使用することを示します(memq
やremq
と同様)。
delq
を呼び出すときは通常、元のリストを保持していた変数にreturn値を割り当てて使用する必要があります(理由は以下参照)。
delq
関数がリストの銭湯にある要素を削除する場合は、単にリストを読み進めて、この要素の後から開始される部分リストをreturnします。つまり:
(delq 'a '(a b c)) ≡ (cdr '(a b c))
リストの途中にある要素を削除するときは、必要なCDR(Altering the CDR of a Listを参照してください)を変更することにより削除します。
(setq sample-list '(a b c (4))) ⇒ (a b c (4))
(delq 'a sample-list) ⇒ (b c (4))
sample-list ⇒ (a b c (4))
(delq 'c sample-list) ⇒ (a b (4))
sample-list ⇒ (a b (4))
(delq 'a sample-list)
は何も取り除きませんが(これは単に短いリストをreturnします)、(delq 'c
sample-list)
は3番目の要素を取り除いて、sample-list
を変更することに注意してください。引数listを保持するように形成された変数が、実行後にもっと少ない要素になる、または元のリストを保持すると仮定しないでください!
かわりにdelq
の結果を保存して、それを使用してください。元のリストを保持していた変数に、結果を書き戻すことはよく行なわれます。
(setq flowers (delq 'rose flowers))
以下の例では、delq
が比較しようとしている(4)
と、sample-list
内の(4)
は、eq
ではありません:
(delq '(4) sample-list) ⇒ (a c (4))
与えられた値とequal
な要素を削除したい場合は、delete
(以下参照)を使用してください。
この関数は、objectとeq
なすべての要素が除かれた、listのコピーをreturnします。remq
の文字‘q’は、この関数がobjectとリスト内の要素の比較に、eq
を使用することを示します。
(setq sample-list '(a b c a b c)) ⇒ (a b c a b c)
(remq 'a sample-list) ⇒ (b c b c)
sample-list ⇒ (a b c a b c)
関数memql
は、eql
(浮動少数の要素は値で比較される)を使用してメンバーとeql
を比較することにより、objectがlistのメンバーかどうかをテストします。objectがメンバーの場合、memql
はlist内で最初に見つかった要素から開始されるリストをreturnします。それ以外はnil
をreturnします。
これをmemq
と比較してみましょう:
(memql 1.2 '(1.1 1.2 1.3)) ; 1.2
と1.2
はeql
。
⇒ (1.2 1.3)
(memq 1.2 '(1.1 1.2 1.3)) ; 1.2
と1.2
はeq
ではない。
⇒ nil
以下の3つの関数はmemq
、delq
、remq
と似ていますが、要素の比較にeq
ではなく、equal
を使用します。Equality Predicatesを参照してください。
関数member
は、メンバーとobjectをequal
を使用して比較して、objectがlistのメンバーかどうかをテストします。objectがメンバーの場合、member
はlistで最初に見つかったところから開始されるリストをreturnします。それ以外はnil
を参照してください。
これをmemq
と比較してみましょう:
(member '(2) '((1) (2))) ; (2)
and (2)
are equal
.
⇒ ((2))
(memq '(2) '((1) (2))) ; (2)
と(2)
はeq
ではない。
⇒ nil
;; 同じ内容の2つの文字列はequal
。
(member "foo" '("foo" "bar"))
⇒ ("foo" "bar")
この関数は、sequenceからobjectとequal
な要素を取り除いて、結果のシーケンスをreturnします。
sequenceがリストの場合、delete
がdelq
に対応するように、member
はmemq
に対応します。つまり、この関数はmember
と同様、要素とobjectの比較にequal
を使用します。マッチする要素が見つかったら、delq
が行なうように、その要素を取り除きます。delq
と同様、通常は元のリストを保持していた変数にreturn値を割り当てて使用します。
sequence
がベクターまたは文字列の場合、delete
はobject
とequal
なすべての要素を取り除いた、sequence
のコピーをreturnします。
たとえば:
(setq l '((2) (1) (2))) (delete '(2) l) ⇒ ((1)) l ⇒ ((2) (1)) ;;l
の変更に信頼性を要するときは ;;(setq l (delete '(2) l))
と記述する。
(setq l '((2) (1) (2)))
(delete '(1) l)
⇒ ((2) (2))
l
⇒ ((2) (2))
;; このケースではl
のセットの有無に違いはない
;; しかし他のケースに倣ってセットするべき。
(delete '(2) [(2) (1) (2)]) ⇒ [(1)]
この関数は、delete
に対応する非破壊的な関数です。この関数は、object
とequal
な要素を取り除いた、sequence
(リスト、ベクター、文字列)のコピーをreturnします。たとえば:
(remove '(2) '((2) (1) (2))) ⇒ ((1))
(remove '(2) [(2) (1) (2)]) ⇒ [(1)]
Common Lispに関する注意: GNU Emacs Lispの関数
member
、delete
、remove
は、Common Lispではなく、Maclispを継承しています。Common Lispでは、比較にequal
を使用しません。
この関数は、member
と同様ですが、objectが文字列で、大文字小文字とテキスト表現の違いを無視します。文字の大文字と小文字は等しいものとして扱われ、比較に先立ちユニバイト文字列はマルチバイト文字列に変換されます。
この関数は、listからすべてのequal
な重複を、破壊的に取り除いて。、結果をlistに保管して、それをreturnします。list内の要素にequal
な要素がいくつかある場合、delete-dups
は最初の要素を残します。
変数に格納されたリストに要素を追加したり、それを集合として使用する方法については、Modifying List Variablesの関数add-to-list
も参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
連想配列(association list。短くはalist)は、キーと値のマッピングを記録します。これは連想(associations)と呼ばれるコンスセルのリストです。各コンスセルにおいて、CARはキー(key)で、CDRは連想値(associated value)になります。3
以下はalistの例です。キーpine
は、値cones
に関連付けられます。キーoak
は、acorns
に関連付けられます。キーmaple
は、seeds
に関連付けられます。
((pine . cones) (oak . acorns) (maple . seeds))
alist内の値とキーには、任意のLispオブジェクトを指定できます。たとえば以下のalist0では、シンボルa
は数字1
に、文字列"b"
はリスト(2
3)
(alist要素のCDR)に関連付けられます。
((a . 1) ("b" 2 3))
要素のCDRのCARに連想値を格納するようにalistデザインするほうがよい場合があります。以下は、そのようなalistです。
((rose red) (lily white) (buttercup yellow))
この例では、red
がrose
に関連付けられる値だと考えます。この種のalistの利点は、CDRのCDRの中に、他の関連する情報
— 他のアイテムのリストでさえ —
を格納することができることです。不利な点は、与えられた値を含む要素を見つけるためにrassq
(以下参照)を使用できないことです。これらを検討することが重要でない場合には、任意の与えられたalistにたいして一貫している限り、選択は好みの問題といえます。
上記で示したのと同じalistは、要素のCDRに連想値をもつと考えることができます。この場合、rose
に関連付けられる値は、リスト(red)
になるでしょう。
連想リストは、新しい連想を簡単にリストの先頭に追加できるので、スタックに保持したいような情報を記録するのによく使用されます。連想リストから与えられたキーにたいする連想を検索する場合、それが複数ある場合は、最初に見つかったものがreturnされます。
Emacs Lispでは、連想リストがコンスセルではない場合、それはエラーではありません。alist検索関数は、単にそのような要素を無視します。多くの他のバージョンのLいspでは、このような場合はエラーをシグナルします。
いくつかの観点において、プロパティーリストは連想リストと似ていることに注意してください。それぞれのキーが1度だけ出現するような場合、プロパティーリストは連想リストと同様に振る舞います。プロパティーリストと連想リストの比較については、Property Listsを参照してください。
この関数は、alist要素にたいしてkeyを比較するのにequal
を使用して、alist内からkeyをもつ最初の連想をreturnします。CARがkeyとequal
の連想がalistにない場合、この関数はnil
をreturnします。たとえば:
(setq trees '((pine . cones) (oak . acorns) (maple . seeds))) ⇒ ((pine . cones) (oak . acorns) (maple . seeds)) (assoc 'oak trees) ⇒ (oak . acorns) (cdr (assoc 'oak trees)) ⇒ acorns (assoc 'birch trees) ⇒ nil
以下はキーと値がシンボルでない場合の例です:
(setq needles-per-cluster '((2 "Austrian Pine" "Red Pine") (3 "Pitch Pine") (5 "White Pine"))) (cdr (assoc 3 needles-per-cluster)) ⇒ ("Pitch Pine") (cdr (assoc 2 needles-per-cluster)) ⇒ ("Austrian Pine" "Red Pine")
関数assoc-string
はassoc
と似ていますが、文字列間の特定の違いを無視する点が異なります。Comparison of Characters and Stringsを参照してください。
この関数は、alistの中から、値valueをもつ最初の連想をreturnします。CDRがvalueとequal
の連想がalistにない場合、この関数はnil
をreturnします。
rassoc
はassoc
と似ていますが、CARではなく、alistの連想のCDRを比較します。この関数を、与えられた値に対応するキーを探す、“reverse
assoc
”と考えることができます。
この関数は、alistからkeyをもつ最初の連想をreturnする点はassoc
と同様ですが、比較にequal
ではなくeq
を使用します。CARがkeyとeq
な連想がalist内に存在しない場合、assq
はnil
をreturnします。eq
はequal
より早く、ほとんどのalistはキーにシンボルを使用するので、この関数はassoc
より多用されます。Equality Predicatesを参照してください。
(setq trees '((pine . cones) (oak . acorns) (maple . seeds))) ⇒ ((pine . cones) (oak . acorns) (maple . seeds)) (assq 'pine trees) ⇒ (pine . cones)
反対に、キーがシンボルではないalistでは通常、assq
は有用ではありません:
(setq leaves '(("simple leaves" . oak) ("compound leaves" . horsechestnut))) (assq "simple leaves" leaves) ⇒ nil (assoc "simple leaves" leaves) ⇒ ("simple leaves" . oak)
この関数は、alist内から値valueをもつ最初の連想をreturnします。alist内にCDRがvalueとeq
な連想が存在しない場合は、nil
をreturnします。
rassq
はassq
と似ていますが、CARではなく、alistの各連想のCDRを比較します。この関数を、与えられた値に対応するキーを探す、“reverse
assq
”と考えることができます。
たとえば:
(setq trees '((pine . cones) (oak . acorns) (maple . seeds))) (rassq 'acorns trees) ⇒ (oak . acorns) (rassq 'spores trees) ⇒ nil
rassq
は、要素のCDRのCARに保管された値の検索はできません:
(setq colors '((rose red) (lily white) (buttercup yellow))) (rassq 'white colors) ⇒ nil
この場合、連想(lily
white)
のCDRはwhite
ではなく、リスト(white)
です。これは連想をドットペア表記で記述すると明確になります:
(lily white) ≡ (lily . (white))
この関数は、keyにたいするマッチをalistから検索します。alistの各要素にたいして、この関数は、keyと要素(アトムの場合)、または要素のCAR(コンスの場合)を比較します。比較はtestに2つの引数
— 要素(または要素のCAR)とkey —
を与えて呼び出すことにより行なわれます。引数はこの順番で渡されるので、正規表現(Regular Expression Searchingを参照してください)を含むalistでは、string-match
を使用することにより有益な結果を得ることができます。testが省略されているかnil
の場合は、比較にequal
が使用されます。
alistの要素がこの条件によりkeyとマッチした場合、assoc-default
はこの要素の値をreturnします。要素がコンスの場合、値は要素のCDRです。それ以外の場合、return値はdefaultです。
keyにマッチする要素がalistに存在しない場合、assoc-default
はnil
をreturnします。
この関数は、深さ2がレベルのalistのコピーをreturnします。この関数は各連想の新しいコピーを作成するので、元のalistを変更せずに、新しいalistを変更できます。
(setq needles-per-cluster '((2 . ("Austrian Pine" "Red Pine")) (3 . ("Pitch Pine"))
(5 . ("White Pine")))) ⇒ ((2 "Austrian Pine" "Red Pine") (3 "Pitch Pine") (5 "White Pine")) (setq copy (copy-alist needles-per-cluster)) ⇒ ((2 "Austrian Pine" "Red Pine") (3 "Pitch Pine") (5 "White Pine")) (eq needles-per-cluster copy) ⇒ nil (equal needles-per-cluster copy) ⇒ t (eq (car needles-per-cluster) (car copy)) ⇒ nil (cdr (car (cdr needles-per-cluster))) ⇒ ("Pitch Pine")
(eq (cdr (car (cdr needles-per-cluster))) (cdr (car (cdr copy)))) ⇒ t
以下の例は、どのようにしてcopy-alist
が他に影響を与えずにコピーの連想を変更可能なのかを示します:
(setcdr (assq 3 copy) '("Martian Vacuum Pine")) (cdr (assq 3 needles-per-cluster)) ⇒ ("Pitch Pine")
この関数は、alistから、(delq
を使用した場合は、そのような要素を1つずつ削除するのにたいして)CARがkeyとeq
な要素すべてを削除します。この関数は短くなったalistをreturnし、alistの元のリスト構造を変更することもよくあります。正しい結果を得るために、alistに保存された値ではなく、assq-delete-all
のreturn値を使用してください。
(setq alist '((foo 1) (bar 2) (foo 3) (lose 4))) ⇒ ((foo 1) (bar 2) (foo 3) (lose 4)) (assq-delete-all 'foo alist) ⇒ ((bar 2) (lose 4)) alist ⇒ ((foo 1) (bar 2) (lose 4))
この関数は、alistからCDRがvalueとeq
なすべての要素を削除します。この関数は短くなったリストをreturnし、alistの元のリスト構造を変更することもよくあります。rassq-delete-all
はassq-delete-all
と似ていますが、CARではなくalistの各連想のCDRを比較します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プロパティーリスト(property list。短くはplist)は、ペアになった要素のリストです。各ペアはプロパティー名(通常はシンボル)とプロパティー値を対応づけます。以下はプロパティーリストの例です:
(pine cones numbers (1 2 3) color "blue")
このプロパティーリストは、pine
をcones
、numbers
を(1 2
3)
、color
を"blue"
に関連づけます。プロパティー名とプロパティー値には任意のLispオブジェクトを指定できますが、通常プロパティー名は(この例のように)シンボルです。
いくつかのコンテキストでプロパティーリストが使用されます。たとえば、関数put-text-property
はプロパティーリストを引数にとり、文字列またはバッファー内のテキストにたいして、テキストプロパティーと、テキストに適用するプロパティー値を指定します。Text Propertiesを参照してください。
プロパティーリストが頻繁に使用される他の例は、シンボルプロパティーの保管です。すべてのシンボルは、シンボルに関する様々な情報を記録するために、プロパティーのリストを処理します。これらのプロパティーはプロパティーリストの形式で保管されます。Symbol Propertiesを参照してください。
5.9.1 Property Lists and Association Lists | プロパティーリストと連想リストの利点の比較。 | |
5.9.2 Property Lists Outside Symbols | 他の場所に保管されたプロパティーリストへのアクセス。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
連想リスト(Association Listsを参照してください)は、プロパティーリストとよく似ています。連想リストとは対照的に、プロパティー名は一意でなければならないので、プロパティーリスト内でペアの順序に意味はありません。
様々なLisp関数や変数に情報を付加するためには、連想リストよりプロパティーリストの方が適しています。プログラムでこのような情報すべてを1つの連想リストに保持する場合、特定のLisp関数や変数にたいする連想をチェックする度に、リスト全体を検索する必要が生じ、それにより遅くなる可能性があります。対照的に、関数名や変数自体のプロパティーリストに同じ情報を保持すれば、検索ごとにそのプロパティーリストの長さだけを検索するようになり、通常はこちらの方が短い時間で済みます。変数のドキュメントがvariable-documentation
という名前のプロパティーに記録されているのは、これが理由です。同様にバイトコンパイラーも、特別に扱う必要がある関数を記録するためにプロパティーを使用します。
連想リストにも独自の利点があります。アプリケーションに依存しますが、プロパティーを更新するより、連想リストの先頭に連想を追加する方が速いでしょう。シンボルにたいするすべてのプロパティーは同じプロパティーリストに保管されるので、プロパティー名を異なる用途のために使用すると衝突の可能性があります(この理由により、そのプログラムで通常の変数や関数の名前につけるプレフィクスをプロパティー名の先頭につけることにより、一意と思われるプロパティー名を選ぶのはよいアイデアです)。連想リストは、連想をリストの先頭にpushし、後にある連想は無視されるので、スタックと同様に使用できます。これはプロパティーリストでは不可能です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数はプロパティーリストを操作するために使用されます。これらの関数はすべて、プロパティー名の比較にeq
を使用します。
この関数は、プロパティーリストplistに保管された、プロパティーpropertyの値をreturnします。この関数には、変形された(malformed)plist引数を指定できます。plistでpropertyが見つからなかった場合、この関数はnil
をreturnします。たとえば、
(plist-get '(foo 4) 'foo) ⇒ 4 (plist-get '(foo 4 bad) 'foo) ⇒ 4 (plist-get '(foo 4 bad) 'bad) ⇒ nil (plist-get '(foo 4 bad) 'bar) ⇒ nil
この関数は、プロパティーリストplistに、プロパティーpropertyの値として、valueを保管します。この関数はplistを破壊的に変更するかもしれず、元のリスト構造を変更せずに新しいリストを構築することもあります。この関数は変更されたプロパティーリストをreturnするので、plistを取得した場所に書き戻すことができます。たとえば、
(setq my-plist '(bar t foo 4)) ⇒ (bar t foo 4) (setq my-plist (plist-put my-plist 'foo 69)) ⇒ (bar t foo 69) (setq my-plist (plist-put my-plist 'quux '(a))) ⇒ (bar t foo 69 quux (a))
plist-get
と同様ですが、プロパティーの比較にeq
ではなくequal
を使用します。
plist-put
と同様ですが、プロパティーの比較にeq
ではなくequal
を使用します。
この関数は与えられたpropertyがplistに含まれる場合は、非nil
をreturnします。plist-get
とは異なり、この関数は存在しないプロパティーと、値がnil
のプロパティーを区別できます。実際にreturnされる値は、car
がpropertyで始まる、plistの後尾部分です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シーケンス(sequence)型は、2つの異なるLisp型 — リストと配列 — を結合した型です。他の言い方をすると、任意のリストはシーケンスであり、任意の配列はシーケンスです。すべてのシーケンスがもつ共通な属性は、それぞれが順序づけされた要素のコレクションであることです。
配列(array)は各スロットが要素である、固定長のオブジェクトです。すべての要素に一定時間でアクセスできます。配列の4つの型として、文字列、ベクター、文字テーブル、ブールベクターがあります。
リストは要素のシーケンスですが、要素は単一の基本オブジェクトではありません。リストはコンスセルにより作られ、要素ごとに1つのセルをもちます。n番目の要素を探すには、n個のコンスセルを走査する必要があるので、先頭から離れた要素ほどアクセスに時間を要します。しかしリストは要素の追加や削除が可能です。
以下の図は、これらの型の関連を表します:
_____________________________________________ | | | Sequence | | ______ ________________________________ | | | | | | | | | List | | Array | | | | | | ________ ________ | | | |______| | | | | | | | | | | Vector | | String | | | | | |________| |________| | | | | ____________ _____________ | | | | | | | | | | | | | Char-table | | Bool-vector | | | | | |____________| |_____________| | | | |________________________________| | |_____________________________________________|
6.1 Sequences | 任意の種類のシーケンスを許す関数。 | |
6.2 Arrays | Emacs Lispの配列の特徴。 | |
6.3 Functions that Operate on Arrays | 配列に特化した関数。 | |
6.4 Vectors | Emacs Lispベクターの特質。 | |
6.5 Functions for Vectors | ベクターのための特別な関数。 | |
6.6 Char-Tables | 文字テーブルを扱う方法。 | |
6.7 Bool-vectors | ブールベクターを扱う方法。 | |
6.8 Managing a Fixed-Size Ring of Objects | オブジェクトの固定サイズのリングを管理する。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、任意の種類のシーケンスを許す関数を説明します。
この関数は、objectがリスト、ベクター、文字列、ブールベクター、文字テーブルの場合はt
、それ以外はnil
をreturnします。
この関数は、sequence内の要素の数をreturnします。sequenceがドットリストの場合、wrong-type-argument
エラーがシグナルされます。循環リストは無限ループを引き起こします。文字テーブルでは、Emacsの最大文字コードより、常に1大きい値がreturnされます。
関連する関数safe-length
については、Definition of safe-lengthを参照してください。
(length '(1 2 3)) ⇒ 3
(length ()) ⇒ 0
(length "foobar") ⇒ 6
(length [1 2 3]) ⇒ 3
(length (make-bool-vector 5 nil)) ⇒ 5
Text Representationsのstring-bytes
も参照してください。
ディスプレー上での文字列の幅を計算する必要がある場合、文字数だけを数えて各文字のディスプレー幅を計算しないlength
ではなく、string-width
(Size of Displayed Textを参照してください)を使用するべきです。
この関数は、indexによりインデックスづけされた、sequenceの要素をreturnします。indexの値として妥当なのは、0からsequenceの長さより1小さい数までの範囲の整数です。sequenceがリストの場合、範囲外の値はnth
と同じように振る舞います。Definition of nthを参照してください。それ以外の場合、範囲外の値はargs-out-of-range
エラーを引き起こします。
(elt [1 2 3 4] 2) ⇒ 3
(elt '(1 2 3 4) 2) ⇒ 3
;; elt
がどの文字をreturnするか明確にするためにstring
を使用。
(string (elt "1234" 2))
⇒ "3"
(elt [1 2 3 4] 4) error→ Args out of range: [1 2 3 4], 4
(elt [1 2 3 4] -1) error→ Args out of range: [1 2 3 4], -1
この関数は、aref
(Functions that Operate on Arraysい)とnth
(Definition of nthを参照してください)を一般化したものです。
この関数は、sequenceのコピーをreturnします。コピーは元のシーケンスと同じ型で、同じ要素が同じ順番でもちます。
コピーに新しい要素を格納するのは、元のsequenceに影響を与えず、その逆も真です。しかし新しいシーケンス内の要素がコピーされたものでない場合は、元のシーケンスの要素と同一(eq
)になります。したがって、コピーされたシーケンスを通じて見つかった要素を変更すると、この変更は元のシーケンスでも見ることができます。
シーケンスがテキストプロパティーをともなう文字列の場合、コピー内のプロパティーリスト自身もコピーとなり、元のシーケンスのプロパティーリストと共有はされません。しかし、プロパティーリストの実際の値は共有されます。Text Propertiesを参照してください。
この関数は、ドットリストでは機能しません。循環リストのコピーは、無限ループを起こすでしょう。
シーケンスをコピーする別の方法は、Building Cons Cells and Listsのappend
、Creating Stringsのconcat
、Functions for Vectorsのvconcat
も参照してください。
(setq bar '(1 2)) ⇒ (1 2)
(setq x (vector 'foo bar)) ⇒ [foo (1 2)]
(setq y (copy-sequence x)) ⇒ [foo (1 2)]
(eq x y) ⇒ nil
(equal x y) ⇒ t
(eq (elt x 1) (elt y 1)) ⇒ t
;; 一方のシーケンスの要素を置き換え。
(aset x 0 'quux)
x ⇒ [quux (1 2)]
y ⇒ [foo (1 2)]
;; 共有された要素の内部を変更。
(setcar (aref x 1) 69)
x ⇒ [quux (69 2)]
y ⇒ [foo (69 2)]
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
配列(array)オブジェクトは、いくつかのLispオブジェクトを保持するスロットをもち、これらのオブジェクトは配列の要素と呼ばれます。配列内の任意の要素は、一定時間でアクセスされます。対照的に、リスト内の要素のアクセスに要する時間は、その要素がリスト内のどの位置にあるかに比例します。
Emacsは4つの配列型 —文字列(strings。String Typeを参照してください)、ベクター(vectors。Vector Typeを参照してください)、ブールベクター(bool-vectors。Bool-Vector Typeを参照してください)、文字テーブル(char-tables。Char-Table Typeを参照してください)
—
を定義し、これらはすべて1次元です。ベクターと文字テーブルは任意の型の要素を保持できますが、文字列は文字だけ、ブールベクターはt
かnil
しか保持できません。
4種のすべての配列は、これらの特性を共有します:
aref
により参照されたり、関数aset
により変更されるかもしれません(Functions that Operate on Arraysを参照してください)。
配列を作成したとき、文字テーブル以外では、長さを指定しなければなりません。文字テーブルの長さは、文字コードの範囲により決定されるので、長さを指定できません。
原則として、テキスト文字の配列が欲しい場合は、文字列とベクターのどちらかを使用できます。実際のところ、そのような用途にたいしては、4つの理由により、わたしたちは常に文字列を選択します:
対照的に、(キーシーケンスのような)キーボード入力文字の配列では、多くのキーボード入力文字は、文字列に収まる範囲の外にあるので、ベクターが必要になるでしょう。Key Sequence Inputを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、すべての型の配列に適用される関数を説明します。
この関数は、objectが配列(ベクター、文字列、ブールベクター、文字テーブル)の場合は、t
をreturnします。
(arrayp [a])
⇒ t
(arrayp "asdf")
⇒ t
(arrayp (syntax-table)) ;; 文字テーブル。
⇒ t
この関数は、arrayのindex番目の要素をreturnします。1番目の要素のインデクスは0です。
(setq primes [2 3 5 7 11 13]) ⇒ [2 3 5 7 11 13] (aref primes 4) ⇒ 11
(aref "abcdefg" 1)
⇒ 98 ; ‘b’のASCIIコードは98。
Sequencesの関数elt
も参照してください。
この関数は、arrayのindex番目の要素を、objectにセットします。この関数はobjectをeturnします。
(setq w [foo bar baz]) ⇒ [foo bar baz] (aset w 0 'fu) ⇒ fu w ⇒ [fu bar baz]
(setq x "asdfasfd") ⇒ "asdfasfd" (aset x 3 ?Z) ⇒ 90 x ⇒ "asdZasfd"
arrayが文字列でobjectが文字でない場合、結果はwrong-type-argument
エラーになります。この関数は、文字列の挿入で必要な場合は、ユニバイト文字列をマルチバイト文字列に変換します。
この関数は配列arrayをobjectで充填するので、arrayのすべての要素はobjectになります。この関数はarrayをreturnします。
(setq a [a b c d e f g]) ⇒ [a b c d e f g] (fillarray a 0) ⇒ [0 0 0 0 0 0 0] a ⇒ [0 0 0 0 0 0 0]
(setq s "When in the course") ⇒ "When in the course" (fillarray s ?-) ⇒ "------------------"
arrayが文字列でobjectが文字でない場合、結果はwrong-type-argument
エラーになります。
配列と判っているオブジェクトにたいしては、一般的なシーケンス関数copy-sequence
およびlength
が有用なときが多くあります。Sequencesを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ベクター(vector)とは、任意のLispオブジェクトを要素にもつことができる、一般用途のための配列です(対照的に、文字列の要素は文字だけですStrings and Charactersを参照してください)。Emacsではベクターは、キーシーケンス(Key Sequencesを参照してください)、シンボル検索用のテーブル(Creating and Interning Symbolsを参照してください)、バイトコンパイルされた関数表現の一部(Byte Compilationを参照してください)など、多くの目的で使用されます。
他の配列と同様、ベクターは0基準のインデックスづけを使用し、1番目の要素はインデックス0になります。
ベクターは、角カッコ(square
brackets)で囲まれた要素としてプリントされます。したがって、シンボルa
、b
、a
を要素にもつベクターは、[a
b a]
とプリントされます。Lisp入力として、同じ方法でベクターを記述できます。
文字列や数値と同様に、ベクターは定数として評価され、評価された結果は同じベクターになります。ベクターの要素は評価も確認もされません。Self-Evaluating Formsを参照してください。
以下はこれらの原理を表す例です:
(setq avector [1 two '(three) "four" [five]]) ⇒ [1 two (quote (three)) "four" [five]] (eval avector) ⇒ [1 two (quote (three)) "four" [five]] (eq avector (eval avector)) ⇒ t
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ベクターに関連した関数をいくつか示します:
この関数は、objectがベクターの場合は、t
をreturnします。
(vectorp [a]) ⇒ t (vectorp "asdf") ⇒ nil
この関数は、引数objectsを要素にもつベクターを作成してreturnします。
(vector 'foo 23 [bar baz] "rats") ⇒ [foo 23 [bar baz] "rats"] (vector) ⇒ []
この関数は、objectに初期化されたlength個の要素からなる、新しいベクターをreturnします。
(setq sleepy (make-vector 9 'Z)) ⇒ [Z Z Z Z Z Z Z Z Z]
この関数は、sequencesのすべての要素を含む、新しいベクターをreturnします。引数sequencesは真リスト、ベクター、文字列、ブールベクターです。sequencesが与えられない場合、空のベクターがreturnされます。
値は空のベクター、または任意の既存のベクターとeq
ではない、新しい空ではないベクターのどちらかです。
(setq a (vconcat '(A B C) '(D E F))) ⇒ [A B C D E F] (eq a (vconcat a)) ⇒ nil
(vconcat) ⇒ [] (vconcat [A B C] "aa" '(foo (6 7))) ⇒ [A B C 97 97 foo (6 7)]
vconcat
関数は、引数としてバイトコード関数オブジェクトもとることができます。これは、バイトコード関数オブジェクトの内容全体にアクセスするのを容易にするための、特別な機能です。Byte-Code Function Objectsを参照してください。
結合を行なう他の関数については、Mapping Functionsのmapconcat
、Creating Stringsのconcat
、Building Cons Cells and Listsのappend
を参照してください。
append
関数は、ベクターを同じ要素をもつリストに変換する方法も提供します:
(setq avector [1 two (quote (three)) "four" [five]]) ⇒ [1 two (quote (three)) "four" [five]] (append avector nil) ⇒ (1 two (quote (three)) "four" [five])
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字テーブル(char-table)はベクターとよく似ていますが、文字テーブルは文字コードによりインデックスづけされます。文字テーブルのインデックスには、修飾キーをともなわない任意の有効な文字コードを使用できます。他の配列と同様に、aref
とaset
で、文字テーブルの要素にアクセスできます。加えて、文字テーブルは、追加のデータを保持するために、特定の文字コードに関連づけられていない、エキストラスロット(extra
slots)をもつことができます。ベクターと同様、文字テーブルは、定数として評価され、任意の型の要素を保持できます。
文字テーブルはそれぞれサブタイプ(subtype)をもち、これは2つの目的を担うシンボルです:
display-table
の文字テーブルであり、構文テーブル(syntax
tables)は、サブタイプがsyntax-table
の文字テーブルです。以下で説明するように、関数char-table-subtype
を使用して、サブタイプを問い合わせることができます。
char-table-extra-slots
シンボルプロパティー(Symbol Propertiesを参照してください)により指定され、値は0から10の整数です。サブタイプにそのようなシンボルプロパティーがない場合、その文字テーブルはエキストラスロットをもちません。
文字テーブルは親(parent)をもつことができ、これは他の文字テーブルです。文字テーブルが親をもつ場合、その文字テーブルで特定の文字cにたいしてnil
が指定されているときは、親として指定された文字テーブルで指定された値を継承します。言い方を変えると、文字テーブルchar-tableでcにnil
が指定されている場合、(aref
char-table c)
はchar-tableの親の値をreturnします。
文字テーブルはデフォルト値(default
value)をもつこともできます。デフォルト値をもつとき、文字テーブルchar-tableがcにたいしてnil
値を指定すると、(aref
char-table c)
はデフォルト値をreturnします。
サブタイプsubtype(シンボル)をもつ、新たに作成された文字テーブルをreturnします。各要素はinitに初期化され、デフォルトはnil
です。文字テーブルが作成された後で、文字テーブルのサブタイプを変更することはできません。
すべての文字テーブルは、インデックスとなる任意の有効な文字テーブルのための空間をもつので、文字テーブルの長さを指定する引数はありません。
subtypeがchar-table-extra-slots
シンボルプロパティーをもつ場合、それはその文字列テーブル内のエキストラスロットの数を指定します。値には0から10の整数を指定し、これ以外の場合make-char-table
はエラーとなります。subtypeがchar-table-extra-slots
シンボルプロパティー(Property Listsを参照してください)をもたない場合、その文字テーブルはエキストラスロットをもちません。
この関数は、objectが文字テーブルの場合はt
、それ以外はnil
をreturnします。
この関数は、char-tableのサブタイプのシンボルをreturnします。
文字テーブルのデフォルト値にアクセスするための、特別な関数は存在しません。これを行なうには、char-table-range
を使用します(以下参照)。
この関数は、char-tableの親をreturnします。親は常に、nil
、または他の文字テーブルです。
この関数は、char-tableの親を、new-parentにセットします。
このガン数は、char-tableのエキストラスロットnの内容をreturnします。文字テーブルのエキストラスロットの数は、文字テーブルのサブタイプにより決定されます。
この関数は、char-tableのエキストラスロットnに、valueを格納します。
文字テーブルは、1つの文字コードにたいして、1つの要素値(element value)を指定できます。文字テーブルは文字セット全体にたいして値を指定することもできます。
この関数は、文字範囲rangeにたいして、char-tableで指定された値をreturnします。可能なrangeは以下のとおりです:
nil
デフォルト値への参照。
文字charにたいする要素への参照(charは有効な文字コードであると仮定)。
(from . to)
包括的な範囲‘[from..to]’内のすべての文字を参照するコンスセル。
この関数は、char-table内の文字範囲rangeにたいして値をセットします。可能なrangeは、以下のとおりです:
nil
デフォルト値への参照。
t
文字コード範囲の全体を参照。
文字charにたいする要素への参照(charは有効な文字コードであると仮定)。
(from . to)
包括的な範囲‘[from..to]’内のすべての文字を参照するコンスセル。
この関数は、char-tableの非nil
値ではない各要素にたいして、引数functionを呼び出します。functionの呼び出しでは、2つの引数(keyとvalue)が指定されます。keyはchar-table-range
にたいする可能なrange
— 有効な文字か、同じ値を共有する文字範囲を指定するコンスセル(from
. to)
です。valueは、(char-table-range char-table
key)
がreturnする値です。
全体的に見て、functionに渡されるkey-valueのペアは、char-tableに格納されたすべての値を表します。
return値はm常にnil
です。map-char-table
呼び出しを有用にするために、functionは副作用をもつべきです。たとえば、以下は構文テーブルを調べる方法です:
(let (accumulator) (map-char-table #'(lambda (key value) (setq accumulator (cons (list (if (consp key) (list (car key) (cdr key)) key) value) accumulator))) (syntax-table)) accumulator) ⇒ (((2597602 4194303) (2)) ((2597523 2597601) (3)) ... (65379 (5 . 65378)) (65378 (4 . 65379)) (65377 (1)) ... (12 (0)) (11 (3)) (10 (12)) (9 (0)) ((0 8) (3)))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ブールベクター(bool-vector)はベクターとよく似ていますが、値にt
とnil
しか格納できません。ブールベクターの要素に非nil
値の格納を試みた場合、そこにt
が格納されます。すべての配列と同様、ブールベクターのインデックスは0から開始され、1度ブールベクターが作成されたら、長さを変更することはできません。ブールベクターは定数として評価されます。
ブールベクターを処理する、特別な関数が2つあります。その関数意外にも、他の種類の配列に使用されるのと同じ関数で、ブールベクターを操作できます。
initialに初期化された、length要素の新しいブールベクターをreturnします。
この関数は、objectがブールベクターであればt
、それ以外はnil
をreturnします。
以下で説明するように、ブールベクターのセット処理を行なう関数がいくつかあります:
ブールベクターaとbの、ビットごとの排他的論理和(bitwise exclusive or)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
ブールベクターaとbの、ビットごとの論理和(bitwise or)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
ブールベクターaとbの、ビットごとの論理積(bitwise and)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
ブールベクターaとbの、差集合(set difference)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
ブールベクターaの、補集合(set complement)をreturnします。オプション引数bが与えられた場合、この処理の結果はbに格納されます。引数はすべて、同じ長さのブールベクターを指定します。
a内のすべてのt
値が、bでもt
値の場合はt
、それ以外はnil
をreturnします。引数はすべて、同じ長さのブールベクターを指定します。
iから始まるaの、bと等しい連続する要素の数をreturnします。a
はブールベクターで、bはt
かnil
、iはa
のインデックスです。
ブールベクターaの、t
の要素の数をreturnします。
以下はブールベクターを作成、確認、更新する例です。長さ8以下のブール値のプリント表記は、1つの文字で表されることに注意してください。
(setq bv (make-bool-vector 5 t)) ⇒ #&5"^_" (aref bv 1) ⇒ t (aset bv 3 nil) ⇒ nil bv ⇒ #&5"^W"
control-_の2進コードは11111、control-Wは10111なので、この結果は理解できるでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リング(ring)は、挿入、削除、ローテーション、剰余(modulo)でインデックスづけされた参照と走査(traversal)をサポートする、固定長のデータ構造です。ring
パッケージにより、効率的なリングデータ構造が実装されています。このパッケージは、このセクションにリストされた関数を提供します。
killリングやマークリングのような、Emacsにあるいくつかの“リング”は、実際には単なるリストとして実装されていることに注意してください。したがって、これらのリングにたいしては、以下の関数は機能しないでしょう。
この関数は、sizeオブジェクトを保持できる、新しいリングをreturnします。sizeは整数です。
この関数は、objectがリングの場合はt
、それ以外はnil
をreturnします。
この関数は、ringの最大の要素数をreturnします。
この関数は、ringに現在含まれている、オブジェクトの数をreturnします。値は、ring-size
でreturnされる値を超えることはありません。
この関数は、ring内のオブジェクトのリストをreturnします。リストの順序は、新しいオブジェクトが先頭になります。
個の関数は、ringのコピーを新しいリングとしてreturnします。新しいリングは、ringと同じ(eq
な)オブジェクトを含みます。
この関数は、ringが空の場合はt
、それ以外はnil
をreturnします。
リング内の1番新しい要素は、常にインデックス0をもちます。より大きいインデックスは、より古い要素に対応します。インデックスは、リング長のmoduloにより計算されます。インデックス-1は1番古い要素、-2は次に古い要素、...となります。
この関数はインデックスindexにあるring内のオブジェクトをreturnします。indexには負、またはリング長より大きい数を指定できます。ringがからの場合、ring-ref
はエラーをシグナルします。
この関数は、1番新しい要素としてobjectをringに挿入し、objectをreturnします。
リングが一杯の場合、新しい要素のための空きを作るため、挿入により1番古い要素が削除されます。
ringからオブジェクトを削除して、そのオブジェクトをreturnします。引数indexは、どのアイテムを削除するかを指定します。これがnil
の場合、それは1番古いアイテムを削除することを意味します。ringが空の場合、ring-remove
はエラーをシグナルします。
この関数は、1番古い要素として、objectをringに挿入します。return値は、意味をもちません。
リングが一杯の場合、この関数は挿入される要素のための空きを作るために、1番新しい要素を削除します。
リングサイズを超えることを気にしない場合、そのリングをFIFO(first-in-first-out: 先入れ先出し)のキューとして使用することができます。たとえば:
(let ((fifo (make-ring 5))) (mapc (lambda (obj) (ring-insert fifo obj)) '(0 one "two")) (list (ring-remove fifo) t (ring-remove fifo) t (ring-remove fifo))) ⇒ (0 t one t "two")
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ハッシュテーブル(hash table)は、非常に高速なルックアップテーブルの一種で、キーを対応する値にマップするという点では、alist(Association Listsを参照してください)に似ています。ハッシュテーブルは、以下の点でalistと異なります:
Emacs Lispは、それらを処理する一連の関数とともに、一般的な用途のハッシュテーブルデータ型を提供します。ハッシュテーブルは特別なプリント表現をもち、それは‘#s’と、その後にハッシュテーブルのプロパティーと内容お指定するリストが続きます。Creating Hash Tablesを参照してください。(用語“ハッシュ表記(hash notation)”は、プリント表現の最初に‘#’を使用する、入力構文をもたないオブジェクトのことを指し、これは用語“ハッシュテーブル(hash table)”にたいしては使用されません。Printed Representation and Read Syntaxを参照してください。)
obarray(オブジェクト配列)もハッシュテーブルの一種ですが、これらは異なる型のオブジェクトで、intern(インターン)されたシンボルを記録するためだけに使用されます(Creating and Interning Symbolsを参照してください)。
7.1 Creating Hash Tables | ハッシュテーブルを作成する関数。 | |
7.2 Hash Table Access | ハッシュテーブルの内容の読み書き。 | |
7.3 Defining Hash Comparisons | 新たな比較方法の定義。 | |
7.4 Other Hash Table Functions | その他。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ハッシュテーブルを作成する基本的な関数は、make-hash-table
です。
この関数は、指定された引数に対応する、新しいハッシュテーブルを作成します。引数は、キーワード(特別に認識される独自のシンボル)と、それに対応する値を交互に指定することにより構成されます。
make-hash-table
では、いくつかのキーワードが意味をもちますが、実際に知る必要があるのは、:test
と:weakness
の2つだけです。
:test test
これは、このハッシュテーブルにたいしてキーを照合する方法を指定します。デフォルトはeql
であり、他の代替としてはeq
やequal
があります:
eql
キーが数字の場合、それらがequal
であれば、つまり、それらの値が等しく、どちらも整数、あるいはどちらも浮動少数の場合は“同一”です。それ以外では、2つの別々のオブジェクトは、決して“同一”になりません。
eq
2つの個別のLispオブジェクトはすべて、“別”のキーです。
equal
2つの個別のLispオブジェクトにたいして、それらがequal
の場合、“同一”のキーです。
testにたいして追加の選択肢を定義するために、define-hash-table-test
(Defining Hash Comparisonsを参照してください)を使用することができます。
:weakness weak
ハッシュテーブルのweakness(強度)は、ハッシュテーブル内に存在するキーと値を、ガーベージコレクションから保護するかどうかを指定します。
値weakは、nil
、key
、value
、key-or-value
、key-and-value
、またはt
(key-and-value
のエイリアス)のうちの1つを指定しなければなりません。weakがkey
の場合、そのハッシュテーブルは、(キーが他の場所で参照されていなければ)ハッシュテーブルのキーがガーベージコレクトされるのを妨げません。ある特定のキーがガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。
weakがvalue
の場合、そのハッシュテーブルは、(値が他の場所で参照されていなければ)ハッシュテーブルの値がガベージコレクトされるのを妨げません。あるP特定の値がガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。
weakがkey-and-value
(またはt
)の場合、その連想を保護するために、キーと値の両方が生きていなければなりません。したがって、そのハッシュテーブルは、キーと値のどちらかをガーベージコレクトから守ることはしません。キーか値のどちらか一方がガーベージコレクトされたら、その連想は削除されます。
weakがkey-or-value
の場合、キーか値のどちらか一方で、その連想を保護することができます。したがって、キーと値の両方がガベージコレクトされたときだけ(それがハッシュテーブル自体にたいする参照でなければ)、ハッシュテーブルからその連想が削除されます。
weakにたいするデフォルトはnil
なので、ハッシュテーブルから参照されているキーと値のすべては、ガーベージコレクションから保護されます。
:size size
これは、そのハッシュテーブルに連想を保管しようと計画している、連想の数にたいするヒントを指定します。数が概算で判っている場合、この方法でそれを指定することにより、処理を少し効率的にすることができます。小さすぎるサイズを指定した場合、そのハッシュテーブルは必要に応じて自動的に拡張子マスが、これを行なうには時間が余計にかかります。
デフォルトのサイズは65です。
:rehash-size rehash-size
ハッシュテーブルに連想を追加するとき、そのテーブルが“一杯(full)”の場合、テーブルは自動的に拡張します。この値は、そのときどれだけハッシュテーブルを拡張するかを指定します。
rehash-sizeが整数の場合(それは正であるべきです)、通常のサイズにrehash-sizeを加えることにより、ハッシュテーブルが拡張されます。rehash-sizeが浮動小数の場合(1より大きい方がよい)は、古いサイズにその数を乗じることにより、ガッシュテーブルが拡張されます。
デフォルト値は1.5です。
:rehash-threshold threshold
これは、ハッシュテーブルが“一杯(full)”(なのでもっと大きく拡張する必要がある)だと判断される基準を指定します。thresholdの値は、1以下の、正の浮動小数点数であるべきです。実際のエントリー数が、通常のサイズにたいする指定した割合を超えた場合、そのハッシュテーブルは“一杯”になります。thresholdのデフォルトは、0.8です。
この関数はmake-hash-table
と同じですが、異なるスタイルの引数リストを指定します。引数testは、キーを照合する方法を指定します。
この関数は時代遅れです。かわりにmake-hash-table
を使用してください。
ハッシュテーブルのプリント表現を使用して、新しいハッシュテーブルを作成することもできます。指定されたハッシュテーブル内の各要素が、有効な入力構文(Printed Representation and Read Syntaxを参照してください)をもっていれば、Lispリーダーをこのプリント表現を読み取ることができます。たとえば以下は、値val1
(シンボル)と300
(数字)に関連づけられた、キーkey1
とkey2
(両方ともシンボル)を、新しいハッシュテーブルを指定します。
#s(hash-table size 30 data (key1 val1 key2 300))
ハッシュテーブルのプリント表現は、‘#s’と、その後の‘hash-table’で始まるリストにより構成されます。このリストの残りの部分は、そのハッシュテーブルのプロパティーと初期内容を指定する、0個以上のプロパティーと値のペアで構成されるべきです。プロパティーと値は、そのまま読み取られます。有効なプロパティー名は、size
、test
、weakness
、rehash-size
、rehash-threshold
、およびdata
です。data
プロパティーは、初期ないようにたいするキーと値のペアのリストであるべきです。他のプロパティーは、上記で説明したmake-hash-table
のキーワード(:size
、:test
など)と同じ意味をもちます。
バッファーやフレームのような、入力構文をもたないオブジェクトを含む初期内容をもつハッシュテーブルを指定できないことに注意してください。そのようなオブジェクトは、ハッシュテーブルが作成された後に追加します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ハッシュテーブルにアクセスしたり、連想を保管する関数を説明します。一般的に、比較方法による制限がない限り、任意のLispオブジェクトをハッシュキーとして使用できます。
この関数はtableのkeyを照合して、それに関連づけられたvalue — table内にkeyをもつ連想が存在しない場合はdefault — をreturnします。
この関数は、table内に、値valueをもつkeyの連想を挿入します。tableがすでにkeyの連想をもつ場合、valueにより古い連想値が置き換えられます。
この関数は、tableにkeyの連想がある場合は、それを削除します。keyが連想をもたない場合、remhash
は何も行ないません。
Common Lispに関する注意: Common
Lispでは、remhash
が実際に連想を削除したときは非nil
、それ以外はnil
をreturnします。Emacs
Lispでは、remhash
は常にnil
をreturnします。
この関数は、ハッシュテーブルtableからすべての連想を削除するので、そのハッシュテーブルは空になります。これはハッシュテーブルのクリーニング(clearing)とも呼ばれます。
Common Lispに関する注意: Common
Lispでは、clrhash
は空のtableをreturnします。Emacs
Lispではnil
をreturnします。
この関数は、table内の各連想にたいして、1度ずつfunctionを呼び出します。関数functionは2つの引数
— tableにリストされたkeyと、それに関連づけられたvalue —
をとるべきです。maphash
はnil
をreturnします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
define-hash-table-test
により、キーを照合する新しい方法を定義できます。この機能を使用するには、ハッシュテーブルの動作方法と、ハッシュコード(hash
code)の意味を理解する必要があります。
概念的にはハッシュテーブルを、1つの連想を保持できるスロットがたくさんある巨大な配列として考えることができます。キーを照合するには、まずgethash
が、キーから整数のハッシュコード(hash
code)を計算します。配列内のインデックスを生成するために、gethash
は、配列の長さにより、この整数のmoduloを得ます。それからキーが見つかったかどうか確認するために、そのスロット、もし必要なら近くのスロットを探します。
したがってキー照合の新しい方法を定義するためには、キーからハッシュコードを計算する関数と、2つのキーを直接比較する関数の両方が必要です。
この関数は、nameという名前の、新たなハッシュテーブルテストを定義します。
この方法でnameを定義した後では、make-hash-table
の引数testにこれを使用することができます。それを行なう場合、そのハッシュテーブルはキー値の比較にtest-fn、キー値から“ハッシュコード”を計算するためにhash-fnを使用することになります。
関数test-fnは2つの引数(2つのキー)をとり、それらが“同一”と判断されたときは非nil
をreturnします。
関数hash-fnは1つの引数(キー)をとり、そのキーの“ハッシュコード”(整数)をreturnします。よい結果を得るために、この関数は負の整数を含む整数の全範囲を、ハッシュコードに使用するべきです。
指定された関数は、プロパティーhash-table-test
の配下の、nameというプロパティーリストに格納されます。そのプロパティーの値形式は、(test-fn
hash-fn)
です。
この関数は、Lispオブジェクトobjにたいするハッシュコードをreturnします。return値は、objと、それが指す別のLispオブジェクトの内容を表す整数です。
2つのオブジェクトobj1とobj2がequalの場合、(sxhash
obj1)
と(sxhash obj2)
は同じ整数になります。
2つのオブジェクトがequalでない場合、通常はsxhash
がreturnする値は異なりますが、常に異なるとは限りません。稀にですが(運次第)、sxhash
が同じ結果を与える、2つの異なって見えるオブジェクトに遭遇するかもしれません。
以下は、大の字小文字を区別しない、文字列のキーをもつハッシュテーブルを作成する例です。
(defun case-fold-string= (a b) (eq t (compare-strings a nil nil b nil nil t))) (defun case-fold-string-hash (a) (sxhash (upcase a))) (define-hash-table-test 'case-fold 'case-fold-string= 'case-fold-string-hash) (make-hash-table :test 'case-fold)
以下は、事前に定義されたテスト値equal
と等価なテストを行なうハッシュテーブルを定義できるという例です。キーは任意のLispオブジェクトで、equalに見えるオブジェクトは、同じキーと判断されます。
(define-hash-table-test 'contents-hash 'equal 'sxhash) (make-hash-table :test 'contents-hash)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、ハッシュテーブルに機能する他の関数です。
この関数は、tableがハッシュテーブルオブジェクトの場合は、非nil
をreturnします。
この関数は、tableのコピーを作成してreturnします。そのテーブル自体がコピーされたものである場合だけ、キーと値が共有されます。
この関数はtable内の実際のエントリー数をreturnします。
この関数は、ハッシュを行なう方法と、キーを比較する方法を指定するために、tableが作成されたときに与えられたtestの値をreturnします。Creating Hash Tablesのmake-hash-table
を参照してください。
この関数は、ハッシュテーブルtableに指定されたweakの値をreturnします。
この関数は、tableのrehash-sizeをreturnします。
この関数は、tableのrehash-thresholdをreturnします。
この関数は、tableの現在の定義されたサイズをreturnします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボル(symbol)は、一意な名前をもつオブジェクトです。このチャプターでは、シンボル、シンボルの構成要素やプロパティーリスト、およびシンボルを作成、インターンする方法を説明します。別のチャプターでは、シンボルを変数として使用したり、関数名として使用する方法が説明されています。VariablesとFunctionsを参照してください。シンボルの正確な入力構文については、Symbol Typeを参照してください。
任意のLispオブジェクトがシンボルかどうかを、symbolp
でテストできます:
この関数は、objectがシンボルの場合はt
、それ以外はnil
をreturnします。
8.1 Symbol Components | シンボルは名前、値、関数定義、プロパティーリストをもつ。 | |
8.2 Defining Symbols | 定義は、シンボルが使用される方法を示す。 | |
8.3 Creating and Interning Symbols | シンボルが一意に保たれる方法。 | |
8.4 Symbol Properties | さまざまな情報を記録するために、各シンボルはプロパティーリストをもつ。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
各シンボルは4つの構成要素(もしくは“セル”)をもち、各構成要素はそれぞれ別のオブジェクトを参照します:
そのシンボルの名前。
そのシンボルの、変数としての現在の値。
そのシンボルの関数定義。これはシンボル、キーマップ、キーボードマクロも保持できる。
そのシンボルのプロパティーリスト。
プリント名のセルは常に文字列を保持し、それを変更することはできません。他の3つのセルには、任意のLispオブジェクトをセットすることができます。
プリントメイのセルは、シンボルの名前となる文字列を保持します。シンボルは、シンボル名によりテキストとして表されるので、2つのシンボルが同じな前をもたないことが重要です。Lispリーダーは、シンボルを読み取るごとに、新たにそれを作成する前に、指定されたシンボルがすでに存在するか調べます。シンボルの名前を得るには、関数symbol-name
(Creating and Interning Symbolsを参照してください)を使用します。
値のセルは、シンボルの変数としての値(そのシンボル自身がLisp式として評価されたときに得る値)を保持します。ローカルバインディング(local
binding)やスコーピングルール(scoping
rules)などのような複雑なものを含め、変数がセットされたり、取得される方法については、See section Variablesを参照してください。ほとんどのシンボルは、値として任意のLispオブジェクトをもつことができますが、一部の特別なシンボルは変更できない値をもちます。これらには、nil
、t
、および名前が‘:’で始まる任意のシンボル(キーワード(keyword)と呼ばれます)が含まれます。Variables that Never Changeを参照してください。
関数のセルは、シンボルの関数定義を保持します。実際は、foo
の関数セルの中に保管されている関数を意味するとき、“関数foo
”といってそれを参照することがよくあります。わたしたちは、必要な土岐だけ、これを明確に区別することにします。関数セルは通常、関数(Functionsを参照してください)か、マクロ(Macrosを参照してください)を保持するために使用されます。しかし、関数セルはシンボル(Symbol Function Indirectionを参照してください)、キーボードマクロ(see section Keyboard Macros)、キーマップ(see section Keymaps)、またはオートロードオブジェクト(Autoloadingを参照してください)を保持するためにも使用できます。シンボルの関数セルの内容を得るには、関数symbol-function
(Accessing Function Cell Contentsを参照してください)を使用します。
プロパティーリストのセルは通常、正しくフォーマットされたプロパティーリストを保持するべきです。シンボルのプロパティーリストを得るには、関数symbol-plist
を使用します。Symbol Propertiesを参照してください。
巻子失せると値セルが、void(空)のときもあります。voidとは、そのセルがどのオブジェクトも参照していないことを意味します(これは、シンボルvoid
を保持することとは異なり、シンボルnil
を保持することとも異なります)。voidの関数セルまたは値セルを調べようとすると、結果は‘Symbol's
value as variable is void’のようなエラーとなります。
それぞれのシンボルは値セルと関数セルを別個にもつので、変数名と関数名が衝突することはありません。たとえば、シンボルbuffer-file-name
が、値(カレントバッファーでvisitされているファイルの名前)をもち、同様に関数定義(ファイルの名前をreturnする基本関数)をもつことができます:
buffer-file-name ⇒ "/gnu/elisp/symbols.texi" (symbol-function 'buffer-file-name) ⇒ #<subr buffer-file-name>
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
定義(definition)とは、特別な方法で使用を意図することを宣言する、特別な種類のLisp式です。定義とは通常、シンボルにたいする値を指定するか、シンボルにたいする1つの種類の使用についての意味と、この方法で使用するときのシンボルの意味にたいするドキュメントを指定します。したがって、シンボルを変数として定義した場合、その変数の初期値と、加えてその変数のドキュメントを提供できます。
defvar
およびdefconst
は、グローバル変数(global variable) —
Lispプログラムの任意の箇所からアクセスできる変数 —
として定義するスペシャルフォームです。変数についての詳細は、Variablesを参照してください。カスタマイズ可能な変数を定義するには、defcustom
(これはサブルーチンとしてdefvar
も呼び出します)を使用します(Customization Settingsを参照してください)。
原則として、最初にシンボルが変数として定義されていなくても、setq
で任意のシンボルに値を割り当てることができます。しかし、使用したいそれぞれのグローバル変数にたいして、変数定義を記述するべきです。さもないと、レキシカルスコープ(Scoping Rules for Variable Bindingsを参照してください)が有効なときに変数が評価された場合、あなたのLispプログラムは正しく動作しないでしょう。
defun
は、ラムダ式(lambda
expression)を生成して、そのシンボルの関数セルにそれを格納することにより、シンボルを関数として定義します。したがって、このシンボルの関数定義は、このラムダ式になります(関数セルの内容を意味する用語“関数定義(function
definition)”は、defun
がシンボルに関数としての定義を与えるというアイデアに由来します)。Functionsを参照してください。
defmacro
は、シンボルをマクロとして定義します。これはマクロオブジェクトを作成して、そのシンボルの関数セルにそれを格納します。シンボルにはマクロと関数を与えることができますが、マクロと関数定義はどちらも関数セルに保持されるのにたいし、関数セルに保持できるのは常にただ1つのLispオブジェクトなので、両方1度にそれを行なうことはできないことに注意してください。Macrosを参照してください。
前に注記したように、Emacs
Lispではシンボルを(たとえばdefvar
で)変数として定義して、同じシンボルを(たとえばdefun
で)関数やマクロとして、両方定義することができます。このような定義は衝突しません。
これらの定義は、プログラミングツールのガイドを果たすこともできます。たとえば、C-h fおよびC-h vコマンドは、関係ある変数、関数、マクロ定義へのリンクを含むヘルプバッファーを作成します。Name Help in The GNU Emacs Manualを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacs Lispでシンボルが作成される方法を理解するには、Lispがシンボルを読み取る方法を理解しなければなりません。Lispは、同じ文字綴りを読み取ったら、毎回同じシンボルを見つけることを保証しなければなりません。これに失敗すると、完全な混乱を招くでしょう。
Lispリーダーがシンボルに出会うと、Lispリーダーは名前のすべての文字を読み取ります。その後Lispリーダーは、obarray(オブジェクト配列)と呼ばれるテーブル内のインデックスを決めるために、これらの文字を“ハッシュ(hash)”します。ハッシュ化(hashing)は何かを照合するのに効果的な方法です。たとえば、Jan Jonesを見つけるときは、電話帳を表紙から1頁ずつ探すのではなく、Jから探し始めます。これは簡単なバージョンのハッシュ化です。obarrayの各要素は、与えられたハッシュコードとともにすべてのシンボルを保持する、バケット(bucket)です。与えられた名前を探すためには、バケットの中からその名前のハッシュコードのすべてのシンボルを探すのが効果的です(同じアイデアは一般的なEmacsのハッシュテーブルでも使用されていますが、これらは異なるデータ型です。Hash Tablesを参照してください)。
探している名前のシンボルが見つかったら、リーダーはそのシンボルを使用します。obarrayにその名前のシンボルが含まれない場合、リーダーは新しいシンボルを作成して、それをobarrayに追加します。特定の名前のシンボルを探して追加することを、インターン(intern)すると言い、これが行なわれた後、そのシンボルはインターンされたシンボル(interned symbol)と呼ばれます。
インターンすることにより、ある特定の名前のシンボルは、それぞれのobarrayに1つだけであることが保証されます。同じ名前のシンボルは他に存在するかもしれませんが、同じobarrayではありません。したがってリーダーは、(同じobarrayを読みつづける限り)同じ名前にたいして、同じシンボルを取得します。
インターンは通常、リーダー内で自動的に発生しますが、他のプログラムがこれを行なう必要がある場合もあります。たとえば、M-xコマンドは、その後ミニバッファーを使用してコマンド名を文字列として取得し、その文字列をインターンして、インターンされたその名前のシンボルを得ます。
すべてのシンボルを含むobarrayはありません。実際、どのobarrayにも含まれないシンボルがいくつかあります。これらは、インターンされていないシンボル(uninterned symbols)と呼ばれます。インターンされていないシンボルも、他のシンボルと同じく4つのセルをもちます。しかし、インターンされていないシンボルへのアクセスを得る唯一の方法は、他の何らかのオブジェクトとして探すか、変数の値として探す方法だけです。
インターンされていないシンボルの作成は、Lispコードを生成するとき有用です。なぜなら、作成されたコード内で変数として使用されているインターンされていないシンボルは、他のLispプログラムで使用されている任意の変数と競合することはありえないからです。
Emacs
Lispでは、obarrayはベクターです。ベクター内の各要素がバケットになります。要素の値は、名前がそのバケットにハッシュされるインターンされたシンボル、またはバケットが空のときは0です。インターンされたシンボルは、そのバケット内の次のシンボルへの、内部リンク(ユーザーからは見えない)をもちます。これらのリンクは不可視なので、mapatoms
を使用する方法をのぞき(以下参照)、obarray内のすべてのシンボルを探す方法はありません。バケット内のシンボルの順番に、意味はありません。
空のobarrayでは、すべての要素が0なので、(make-vector length
0)
でobarrayを作成することができます。obarrayを作成する有効な方法は、これだけです。長さに素数を指定すると、よいハッシュ化がされる傾向があります。2の累乗から1減じた長さも、よい結果を生む傾向があります。
自分でobarrayにシンボルを置かないでください。これはうまくいきません —
obarrayに正しくシンボルを入力できるのは、intern
だけです。
Common Lispに関する注意: Common Lispとは異なり、Emacs Lispは1つのシンボルを複数のobarrayにインターンする方法を提供しません。
以下の関数のほとんどは、引数に名前とobarrayをとります。名前が文字列ではない、またはobarrayがベクターでない場合は、wrong-type-argument
エラーがシグナルされます。
この関数は、symbolの名前を文字列としてreturnします。たとえば:
(symbol-name 'foo) ⇒ "foo"
警告: 文字の置き換えにより文字列を変更すると、それはシンボルの名前を変更しますが、obarrayの更新には失敗するので、行なわないでください!
この関数は、新たに割り当てられた、名前がname(文字列でなかればならない)のインターンされていないシンボルをreturnします。このシンボルの値と関数はvoidで、プロパティーリストはnil
です。以下の例では、sym
の値はfoo
とeq
ではありません。なぜなら、これは名前が‘foo’のインターンされていないシンボルだからです。
(setq sym (make-symbol "foo")) ⇒ foo (eq sym 'foo) ⇒ nil
この関数は、名前がnameの、インターンされたシンボルをreturnします。オブジェクト配列obarrayの中にそのようなシンボルが存在しない場合、intern
はあたらしいシンボルを作成してobarrayに追加し、それをreturnします。obarrayが省略された場合、グローバル変数obarray
の値が使用されます。
(setq sym (intern "foo")) ⇒ foo (eq sym 'foo) ⇒ t (setq sym1 (intern "foo" other-obarray)) ⇒ foo (eq sym1 'foo) ⇒ nil
Common Lispに関する注意: Common Lispでは、既存のシンボルをobarrayにインターンできます。Emacs Lispでは、
intern
の引数はシンボルではなく文字列なので、これを行なうことはできません。
この関数は、obarray内の名前がnameのシンボル、obarrayにその名前のシンボルが存在しない場合はnil
をreturnします。したがって、与えられた名前のシンボルがすでにインターンされているかテストするために、intern-soft
を使用することができます。obarrayが省略された場合は、グローバル変数obarray
の値が使用されます。
引数nameにはシンボルも使用できます。この場合、指定されたobarrayにnameがインターンされていればname、それ以外はnil
をreturnします。
(intern-soft "frazzle") ; そのようなシンボルは存在しない。 ⇒ nil (make-symbol "frazzle") ; インターンされていないシンボルを作成する。 ⇒ frazzle
(intern-soft "frazzle") ; そのようなシンボルは見つからない。
⇒ nil
(setq sym (intern "frazzle")) ; インターンされたシンボルを作成する。
⇒ frazzle
(intern-soft "frazzle") ; シンボルが見つかった!
⇒ frazzle
(eq sym 'frazzle) ; そして、それは同じシンボル。
⇒ t
この変数は、intern
およびread
で使用される、標準のobarrayです。
この関数は、オブジェクト配列obarrayの中のシンボルに1つにたいして、1度ずつfunctionを呼び出し、その後nil
をreturnします。obarrayが省略された場合は、通常のシンボルにたいする標準のオブジェクト配列obarray
の値がデフォルトになります。
(setq count 0) ⇒ 0 (defun count-syms (s) (setq count (1+ count))) ⇒ count-syms (mapatoms 'count-syms) ⇒ nil count ⇒ 1871
mapatoms
を使用する他の例については、Access to Documentation Stringsのdocumentation
を参照してください。
この関数は、オブジェクト配列obarrayから、symbolを削除します。obarrayの中にsymbol
が存在しない場合、unintern
は何も行ないません。obarrayがnil
の場合は、現在のobarrayが使用されます。
symbolにシンボルではなく文字列を与えた場合、それはシンボルの名前を意味します。この場合、unintern
は、(もしあれば)obarrayからその名前のシンボルを削除します。そのようなシンボルが存在する場合、unintern
は何も行ないません。
unintern
がシンボルを削除した場合はt
、それ以外はnil
をreturnします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボルは、そのシンボルについての様々な情報を記録するために使用される、任意の数のシンボルプロパティー(symbol
properties)をもつことができます。たとえば、シンボルのrisky-local-variable
プロパティーがnil
の場合は、その変数の名前が、危険なファイルローカル変数(File Local Variablesを参照してください)であることを意味します。
シンボルのプロパティーとプロパティー値はそれぞれ、、シンボルのプロパティーリストセル(Symbol Componentsを参照してください)に、プロパティーリスト形式(Property Listsを参照してください)で格納されます。
8.4.1 Accessing Symbol Properties | シンボルプロパティーへのアクセス。 | |
8.4.2 Standard Symbol Properties | シンボルプロパティーの標準的な意味。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数は、シンボルプロパティーへのアクセスに使用できます。
この関数は、symbolのプロパティーリスト内の、propertyという名前のプロパティーの値をreturnします。そのようなプロパティーが存在しない場合は、nil
をreturnします。したがって、値がnil
のときと、プロパティーが存在しない場合の違いはありません。
名前propertyは、eq
を使用して既存のプロパティーと比較されるので、任意のオブジェクトはプロパティーとして適正です。
例はput
を参照してください。
この関数は、symbolのプロパティーリストの、プロパティー名propertyにvalueを配して、以前のプロパティー値を置き換えます。put
関数は、valueをreturnします。
(put 'fly 'verb 'transitive) ⇒'transitive (put 'fly 'noun '(a buzzing little bug)) ⇒ (a buzzing little bug) (get 'fly 'verb) ⇒ transitive (symbol-plist 'fly) ⇒ (verb transitive noun (a buzzing little bug))
この関数は、symbolののののプロパティーリストをreturnします。
この関数は、symbolのプロパティーリストを、plistにセットします。plistは通常、適正なプロパティーリストであるべきですが、これは強制ではありません。return値はplistです。
(setplist 'foo '(a 1 b (2 3) c nil)) ⇒ (a 1 b (2 3) c nil) (symbol-plist 'foo) ⇒ (a 1 b (2 3) c nil)
通常の用途には使用されない、特別なobarray内のシンボルでは、非標準的で方法でプロパティーリストセルを使用することに意味があるかもしれません。実際に、abbrev(Abbrevs and Abbrev Expansionを参照してください)のメカニズムは、これを行なっています。
以下のように、setplist
とplist-put
により、put
を定義できます:
(defun put (symbol prop value) (setplist symbol (plist-put (symbol-plist symbol) prop value)))
この関数は、get
と同じですが、symbolが関数エイリアス(function
alias)の場合は、実際の関数の名づけるシンボルのプロパティーリストを参照します。Defining Functionsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下に、Emacsで特別な目的のために使用されるシンボルプロパティーをリストします。以下の表で、“名づけられた関数(the named function)”と言うときは、関数名がそのシンボルである関数を意味します。“名づけられた変数(the named variable)”などの場合も、同様です。
:advertised-binding
このプロパティーリストは、名づけられた関数のドキュメントを表示するときの、優先されるキーバインディングを指定します。Substituting Key Bindings in Documentationを参照してください。
char-table-extra-slots
値が非nil
の場合は、名づけられた文字テーブル型の追加スロットの数を指定します。Char-Tablesを参照してください。
customized-face
face-defface-spec
saved-face
theme-face
これらのプロパティーは、フェイスの標準のフェイススペック(face
specs)、およびフォントスペックsaved-fase、customized-face、themed-faceを記録するために使用されます。これらのプロパティーを直接セットしないでください。これらのプロパティーはdefface
、および関連する関数により管理されます。Defining Facesを参照してください。
customized-value
saved-value
standard-value
theme-value
これらのプロパティーは、カスタマイズ可能な変数のstandard-value、saved-value、customized-value(しかし保存はされない)、themed-valueを記録するために使用されます。これらのプロパティーを直接セットしないでください。これらはdefcustom
、および関連する関数により管理されます。Defining Customization Variablesを参照してください。
disabled
値が非nil
の場合、名づけられた関数はコマンドとして無効になります。Disabling Commandsを参照してください。
face-documentation
値には、名づけられたフェイスのドキュメント文字列が格納されます。これは、defface
により自動的にセットされます。Defining Facesを参照してください。
history-length
値が非nil
の場合、名づけられたヒストリーリスト変数の、ミニバッファーヒストリーの最大長を指定します。Minibuffer Historyを参照してください。
interactive-form
この値は、名づけられた関数の、インタラクティブ形式です。通常、これを直接セットするべきではありません。かわりに、スペシャルフォームinteractive
を使用してください。Interactive Callを参照してください。
menu-enable
この値は、名づけられたメニューアイテムが、メニュー内で有効であるべきかを決定するための式です。Simple Menu Itemsを参照してください。
mode-class
値がspecial
の場合、名づけられたメジャーモードは“special(特別)”です。Major Mode Conventionsを参照してください。
permanent-local
値が非nil
の場合、名づけられた変数はバッファーローカル変数となり、変数の値はメジャーモードの変更によりリセットされません。Creating and Deleting Buffer-Local Bindingsを参照してください。
permanent-local-hook
値が非nil
の場合、名づけられた変数はメジャーモードを変更したとき、フック変数のローカル値から削除されません。Setting Hooksを参照してください。
pure
値が非nil
の場合、名づけられた関数は、副作用の影響を受けないとみなされます。定数の引数で呼び出された場合、コンパイル時に評価することができます。これは、実行時のエラーをコンパイル時へとシフトします。
risky-local-variable
値が非nil
の場合、名づけられた変数は、ファイルローカル変数としては危険だとみなされます。File Local Variablesを参照してください。
safe-function
値が非nil
の場合、名づけられた関数は、評価において一般的に安全だとみなされます。Determining whether a Function is Safe to Callを参照してください。
safe-local-eval-function
値が非nil
の場合、名づけられた関数は、ファイルローカルの評価フォーム内で、安全に呼び出すことができます。File Local Variablesを参照してください。
safe-local-variable
値は、名付けられた変数の、安全なファイルローカル値を決定する関数を指定します。File Local Variablesを参照してください。
side-effect-free
非nil
値は、関数の安全性(Determining whether a Function is Safe to Callを参照してください)、およびバイトコンパイラーの最適化を決定するために、名づけられた関数が副作用から自由であることを示します。これをセットしないでください。
variable-documentation
非nil
の場合、それは名づけられた変数のドキュメント文字列を指定します。ドキュメント文字列は、defvar
および関連する関数により、自動的にセットされます。Defining Facesを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispでの式の評価(evaluation)は、Lispインタープリター —
入力としてLispオブジェクトを受け取り、それの式としての値(value as an expression)を計算します —
により処理されます。評価を行なう方法は、そのオブジェクトのデータ型に依存し、それはこのチャプターで説明するルールにより行なわれます。インタープリターは、プログラムの一部を評価するために自動的に実行されますが、Lisp基本関数のeval
を通じて、明示的に呼び出すこともできます。
9.1 Introduction to Evaluation | 事の在り方における評価。 | |
9.2 Kinds of Forms | さまざまなオブジェクト類が評価される方法。 | |
9.3 Quoting | (プログラム内に定数を配すための)評価の回避。 | |
9.4 Backquote | リスト構造の、より簡単な構築。 | |
9.5 Eval | Lispインタープリターを明示的に呼び出す方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispインタープリター(またはLispエバリュエーター)は、Emacsの一部で、与えられた式の値を計算します。Lispで記述された関数が呼び出されるとき、エバリュエーターはその関数のbody(本文)の中の式を評価することにより、その関数の値を計算します。したがって、Lispプログラムを実行するとは、実際にはLispインタープリターを実行することを意味します。
評価されることを意図したLispオブジェクトは、フォーム(form)、または式(expression)と呼ばれます4。フォームはデータオブジェクトであり、単なるテキストではないというのは、Lisp風の言語と、通常のプログラミング言語との間にある、基本的な相違の1つです。任意のオブジェクトを評価できますが、実際に評価される事が非常に多いのは数字、シンボル、リスト、文字列です。
以降のセクションでは、各種フォームにたいして、それを評価することが何を意味するかの詳細を説明します。
Lispフォームを読み取り、それからそのフォームを評価するのは、非常に一般的なアクティビティーですが、読み取りと評価は別のアクティビティーであり、どちらか一方を単独で処理することができます。読み取りだけでは、何も評価されません。読み取りはLispオブジェクトのプリント表現を、そのオブジェクト自体に変換します。このオブジェクトは評価されるべきフォームなのか、そのれともまったく違う目的をもつかを指定するのは、read
の呼び出し元の役目ですInput Functionsを参照してください。
評価とは再帰的な処理であり、あるフォームを評価することにより、そのフォームの一部が評価されるといったことがよくあります。たとえば、(car
x)
のような関数呼び出し(function
call)のフォームを評価する場合、Emacsは最初にその引数(サブフォームx
)を評価します。引数を評価した後、Emacsはその関数(car
)を実行(executes)します。その関数がLispで記述されている場合は、関数のbody(本文)を評価することにより、実行が行なわれます(しかし、この例で使用しているcar
はLisp関数ではなく、Cで実装された基本関数です)。関数と関数呼び出しについての情報は、Functionsを参照してください。
評価は、環境(environment)と呼ばれるコンテキストの内部で行なわれます。環境は、すべてのLisp変数(Variablesを参照してください)のカレント値とバインディングにより構成されます。5フォームが新たなバインディングを作成することなく、変数を参照するとき、その変数はカレントの環境により与えられる値に評価されます。フォームの評価は、変数のバインディングにより、一時的にその環境を変更することもあります(Local Variablesを参照してください)。
フォームの評価が、永続する変更を行なうこともあります。これらの変更は、副作用(side
effects)と呼ばれます。副作用を生成するフォームの例は、(setq foo 1)
です。
コマンドキー解釈にたいする評価と混同しないでください。エディターのコマンドループは、アクティブなキーマップを使用して、キーボード入力をコマンド(インタラクティブに呼び出すことができる関数)に変換してから、そのコマンドを実行するためにcall-interactively
を使用します。そのコマンドはLispで記述されている場合、コマンドの実行は通常、評価を伴います。しかし、このステップはコマンドキー解釈の一部とは考えません。Command Loopを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
評価される事を意図したLispオブジェクトは、フォーム(form)または式(expression))と呼ばれます。Emacsがフォームを評価する方法は、フォームのデータ型に依存します。Emacsは、3種の異なるフォーム — シンボル、リスト、および“その他すべての型” — を持ち、それらは評価される方法は異なります。このセクションでは、まず最初は自己評価フォームの“その他すべての型”から開始して、3つの種類をすべて1つずつ説明します。
9.2.1 Self-Evaluating Forms | 自分自身を評価するフォーム。 | |
9.2.2 Symbol Forms | 変数として評価されるシンボル。 | |
9.2.3 Classification of List Forms | さまざまな種類のリストフォームを区別する方法。 | |
9.2.4 Symbol Function Indirection | シンボルがリストのcarにある場合、そのシンボルを通じて実際の関数を見つけます。 | |
9.2.5 Evaluation of Function Forms | 関数を呼び出すフォーム。 | |
9.2.6 Lisp Macro Evaluation | マクロを呼び出すフォーム。 | |
9.2.7 Special Forms | "スペシャルフォーム"は特有な基本のフォームで、それらのほとんどがとても重要です。 | |
9.2.8 Autoloading | 実際の定義を含むファイルのロードをセットアップする関数。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
自己評価フォーム(self-evaluating
form)は、リストやシンボルではない、任意のフォームです。自己評価フォームは、フォーム自身を評価します。評価の結果は、評価されたのと同じオブジェクトです。したがって、数字の25は25に評価され、文字列"foo"
は文字列"foo"
に評価されます。同様に、ベクターの評価では、ベクターの要素の評価は起こりません
— 内容が変更されずに同じベクターがreturnされます。
'123 ; 評価されずに表示される数字。
⇒ 123
123 ; 通常どおり評価され、同じものがreturnされる。
⇒ 123
(eval '123) ; “手動”による評価 — 同じものがreturnされる。
⇒ 123
(eval (eval '123)) ; 2度評価しても何も変わらない。
⇒ 123
事項評価されるという事実による利点から、数字、文字、文字列、そしてベクターでさえ、Lispコード内で記述されるのは一般的です。しかし、入力構文がない型にたいしてこれを行なうのは極めて異例です。なぜなら、これらをテキスト的に記述する方法がないからです。Lispプログラムを使用して、これらの型を含むLisp式を構築するのは、可能です。以下は例です:
;; バッファーオブジェクトを含む式を構築する。
(setq print-exp (list 'print (current-buffer)))
⇒ (print #<buffer eval.texi>)
;; それを評価する。
(eval print-exp)
-| #<buffer eval.texi>
⇒ #<buffer eval.texi>
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボルが評価されるときは、変数として扱われます。それが値をもつ場合、結果はその変数の値になります。そのシンボルが変数としての値をもたない場合、Lispインタープリターはエラーをシグナルします。変数の使用法についての情報は、Variablesを参照してください。
以降の例では、setq
でシンボルに値をセットしています。その後シンボルを評価してから、その値をsetq
に戻します。
(setq a 123) ⇒ 123
(eval 'a) ⇒ 123
a ⇒ 123
シンボルnil
とt
は特別に扱われるので、nil
の値は常にnil
になり、t
の値は常にt
になります。これらに他の値をセットしたり、他の値にバインドすることはできません。したがって、この2つのシンボルは、(たとえeval
がそれらを他の任意のシンボルと同じように扱うとはいえ)自己評価フォームと同じように振る舞います。名前が‘:’で始まるシンボルも、同じ方法で自己評価されます。そして、(通常は)値を変更できない点も同じです。Variables that Never Changeを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
空ではないリストフォームは、関数呼び出し、マクロ呼び出し、スペシャルフォームのいずれかで、それは1番目の引数にしたがいます。これら3種のフォームは、以下で説明するように、異なる方法で評価されます。残りの要素は関数、マクロ、またはスペシャルフォームにたいする引数(arguments)を構成します。
空ではないリストを評価する最初のステップは、1番目の要素の確認です。この要素は単独で、そのリストがどの種類のフォームか、そして残りの引数をどのように処理するがを決定します。SchemeのようなLisp方言とは異なり、1番目の要素は評価されません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストの最初の要素がシンボルの場合、評価はそのシンボルの関数セルを調べて、元のシンボルの代わりに、関数セルの内容を使用します。その内容が他のシンボルの場合、シンボルではないものが得られるまで、このプロセスが繰り返されます。このプロセスをシンボル関数インダイレクション(symbol function indirection: indirectionは間接の意)と呼びます。シンボル関数インダイレクションについての情報は、Naming a Functionを参照してください。
このプロセスの結果、シンボルの関数競るが同じシンボルを参照する場合、無限ループを起こす可能性があります。それ以外は、最終的には非シンボルにたどりつき、これは関数か、他の適切なオブジェクトであるはずです。
より正確に言うと、それはLisp関数(ラムダ式)、バイトコード関数、基本関数、Lispマクロ、スペシャルフォーム、またはオートロードオブジェクトであるべきです。これらの型のそれぞれについては、以降のセクションで説明します。これらの型以外のオブジェクトの場合、emacsはinvalid-function
エラーをシグナルします。
以下の例は、シンボルインダイレクションのプロセスを説明するものです。わたしたちは、シンボルの関数セルに関数をセットするのにfset
、関数セルの内容(Accessing Function Cell Contentsを参照してください)を得るためにsymbol-function
を使用します。具体的に言うと、first
の関数セルにシンボルcar
を格納し、シンボルfirst
をerste
の関数セルに格納します。
;; この関数セルのリンクを構築する:
;; ------------- ----- ------- -------
;; | #<subr car> | <-- | car | <-- | first | <-- | erste |
;; ------------- ----- ------- -------
(symbol-function 'car) ⇒ #<subr car>
(fset 'first 'car) ⇒ car
(fset 'erste 'first) ⇒ first
(erste '(1 2 3)) ; erste
により参照される関数を呼び出す。
⇒ 1
対照的に、以下の例はシンボル関数インダイレクションを使用せずに関数を呼び出します。なぜなら、1番目の要素はシンボルではなく、無名Lisp関数(anonymous Lisp function)だからです。
((lambda (arg) (erste arg)) '(1 2 3)) ⇒ 1
関数自身を実行すると、その関数のbodyを評価します。これは、erste
を呼び出すとき、シンボル関数インダイレクションが行なわれます。
このフォームが使用されるのは稀で、今では推奨されません。かわりに以下のように記述するべきです:
(funcall (lambda (arg) (erste arg)) '(1 2 3))
または単に
(let ((arg '(1 2 3))) (erste arg))
ビルトイン関数のindirect-function
は、明示的にシンボル関数インダイレクションを処理するための、簡単な方法を提供します。
この関数は、functionが意味するものを、関数としてreturnします。functionがシンボルの場合は、functionの関数定義を探して、その値で最初からやり直します。functionがシンボルでない場合は、function自身をreturnします。
この関数は、最後のシンボルがバインドされておらず、オプション引数noerrorが省略されているかnil
の場合は、void-function
エラーをシグナルします。それ以外は、noerrorが非nil
の場合は、最後のシンボルがバインドされていなければnil
をreturnします。
特定のシンボル内にループがある場合、この関数はcyclic-function-indirection
エラーをシグナルします。
以下は、Lispでindirect-function
を定義できるという例です:
(defun indirect-function (function) (if (symbolp function) (indirect-function (symbol-function function)) function))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストの1番目の要素がLispの関数オブジェクト。バイトコードオブジェクト、基本関数オブジェクトと評価された場合、そのリストは関数呼び出し(function
call)になります。たとえば、以下は関数+
を呼び出します:
(+ 1 x)
関数呼び出しを評価する最初のステップは、そのリストの残りの要素を左から右に評価します。結果は引数の実際の値で、リストの各要素にたいして1つの値となります。次のステップは、関数apply
(Calling Functionsを参照してください)を使用して、引数のリストでその関数を呼び出します。関数がLispで記述されている場合、引数はその関数の引数変数にバインドするために使用されます。その後、関数body内のフォームが順番に評価され、listのbodyフォームの値は、関数呼び出しの値になります。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
リストの最初の要素がマクロオブジェクトと評価された場合、そのリストはマクロ呼び出し(macro call)になります。マクロ呼び出しが評価されるとき、リストの残りの要素は、最初は評価されません。そのかわり、これらの要素自体が、マクロの引数に使用されます。そのマクロ定義は、これは元のフォームの場所で評価される、置き換えのフォームを計算します。これは、マクロの展開(expansion)と呼ばれます。展開した結果は、任意の種類のフォーム — 自己評価定数、シンボル、リストになります。展開した結果自体がマクロ呼び出しの場合、結果が他の種類のフォームになるまで、繰り返し展開処理が行なわれます。
通常のマクロ展開は、その展開形を評価することにより終了します。しかし、他のプログラムもマクロ呼び出しを展開し、それらが展開形を評価するかもしれないし、評価しないかもしれないので、そのマクロ展開がすぐに、または最終的に評価される必要がない場合があります。
引き数式は通常、マクロ展開の計算の一部としては評価されませんが、展開の部分として現れるので、展開形が評価されるとき計算されます。
たとえば、以下のようなマクロ定義が与えられたとします:
(defmacro cadr (x) (list 'car (list 'cdr x)))
(cadr (assq 'handler list))
のような式はマクロ呼び出しであり、展開形は以下のようになります:
(car (cdr (assq 'handler list)))
引数(assq 'handler list)
が、展開形に含まれることに注意してください。
Emacs Lispマクロの完全な説明は、Macrosを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
スペシャルフォーム(special form)は特別だとマークされた基本関数で、その引数のすべては評価されません。もっともスペシャルなフォームは、制御構造の定義や、変数バインディングの処理など、関数ではできないことを行ないます。
スペシャルフォームはそれぞれ、どの引数が評価されて、どの引数が評価されないかについて、独自のルールをもちます。特定の引数が評価されるかどうかは、他の引数を評価した結果に依存します。
式の最初のシンボルがスペシャルフォームの場合、その式はそのスペシャルフォームのルールにしたがう必要があります。それ以外では、Emacsの挙動は(たとえクラッシュしなくても)定義されていません。たとえば((lambda
(x) x . 3)
4)
は、lambda
で始まるサブ式を含みますが、これは適正なlambda
式ではないので、Emacsはエラーをシグナルするか、3、または4、またはnil
、もしかしたら他の挙動を示すかもしれません。
この述語は、引数がスペシャルフォームかをテストし、スペシャルフォームならt
、それ以外はnil
をreturnします。
以下に、Emacs Lispのスペシャルフォームすべてと、それらがどこで説明されているかのリファレンスとともに、アルファベット順でリストします。
and
see section Constructs for Combining Conditions
catch
see section Explicit Nonlocal Exits: catch
and throw
cond
see section Conditionals
condition-case
see section Writing Code to Handle Errors
defconst
see section Defining Global Variables
defvar
see section Defining Global Variables
function
see section Anonymous Functions
if
see section Conditionals
interactive
see section Interactive Call
lambda
see section Lambda Expressions
let
let*
see section Local Variables
or
see section Constructs for Combining Conditions
prog1
prog2
progn
see section Sequencing
quote
see section Quoting
save-current-buffer
see section The Current Buffer
save-excursion
see section Excursions
save-restriction
see section Narrowing
setq
see section Setting Variable Values
setq-default
see section Creating and Deleting Buffer-Local Bindings
track-mouse
see section Mouse Tracking
unwind-protect
see section Nonlocal Exits
while
see section Iteration
Common Lispに関する注意: ここで、GNU Emacsのスペシャルフォームと、Common Lispのスペシャルフォームを比較してみます。
setq
、if
、catch
は、Emacs LispとCommon Lispの両方でスペシャルフォームです。save-excursion
はEmacs Lispではスペシャルフォームですが、Common Lispには存在しません。throw
はCommon Lispではスペシャルフォーム(なぜなら複数の値をthrowできなければならない)ですが、Emacs Lispでは(複数の値をもたない)関数です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オートロード(autoload)機能により、関数定義がだEmacsにロードされていない関数(またはマクロ)を呼び出すことができます。オートロードは、定義がどのファイルに含まれるかを指定します。オートロードオブジェクトがシンボルの関数定義にある場合、関数としてそのシンボルを呼び出すことにより、自動的に指定されたファイルがロードされます。その後、ファイルからロードされた実際の定義を呼び出します。シンボル内の関数定義としてオートロードオブジェクトをアレンジする方法は、Autoloadで説明します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
スペシャルフォームquote
は、単一の引数を、記述されたとおり、評価せずにreturnします。これはプログラムに、自己評価オブジェクトではない、定数シンボルや定数リストを含める方法を提供します(数字、文字列、ベクターのような自己評価オブジェクトをクォートする必要はありません)。
このスペシャルフォームは、評価せずにobjectをreturnします。
プログラム中でquote
はよく使用されるので、Lispはそれにたいする便利な入力構文を提供します。アポストロフィー文字(‘'’)に続けてLispオブジェクト(の入力構文)を記述すると、それは1番目の要素がquote
で、2番目の要素がそのオブジェクトであるリストに展開されます。したがって、入力構文'x
は、(quote
x)
の略記になります。
以下に、quote
を使用した式の例をいくつか示します:
(quote (+ 1 2)) ⇒ (+ 1 2)
(quote foo) ⇒ foo
'foo ⇒ foo
''foo ⇒ (quote foo)
'(quote foo) ⇒ (quote foo)
['foo] ⇒ [(quote foo)]
他のクォート構成には、コンパイル用にLispで記述された無名のラムダ式の元になるfunction
(Anonymous Functionsを参照してください)、および、リストを計算して置き換える際に、リストの一部だけをクォートするのに使用される‘`’(Backquoteを参照してください)があります。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッククォート構成(backquote
constructs)を使用することにより、リストをクォートして、そのリストのある要素を選択的に評価することができます。もっとも簡単な使い方では、スペシャルフォームquote
と同じです
(前のセクションで説明しています。Quotingを参照してください)。
たとえば、以下の2つのフォームは同じ結果を生みます:
`(a list of (+ 2 3) elements) ⇒ (a list of (+ 2 3) elements)
'(a list of (+ 2 3) elements) ⇒ (a list of (+ 2 3) elements)
バッククォートする引数の内側でスペシャルマーカー‘,’を使用すると、それは値が定数でないことを示します。Emacs Lispエバリュエーターは‘,’がついた引数を放火して、リスト構造内にその値を配します:
`(a list of ,(+ 2 3) elements) ⇒ (a list of 5 elements)
‘,’による置き換え、リスト構造のより深いレベルでも使用できます。たとえば:
`(1 2 (3 ,(+ 4 5))) ⇒ (1 2 (3 9))
スペシャルマーカー‘,@’を使用すれば、評価された値を結果リストに継ぎ足す(splice)こともできます。継ぎ足されたリストの要素は、結果リスト内の他の要素を同じレベルになります。‘`’を使用しない等価なコードは、しばしば読むのが困難です。以下にいくつかの例を示します:
(setq some-list '(2 3)) ⇒ (2 3)
(cons 1 (append some-list '(4) some-list)) ⇒ (1 2 3 4 2 3)
`(1 ,@some-list 4 ,@some-list) ⇒ (1 2 3 4 2 3)
(setq list '(hack foo bar)) ⇒ (hack foo bar)
(cons 'use (cons 'the (cons 'words (append (cdr list) '(as elements))))) ⇒ (use the words foo bar as elements)
`(use the words ,@(cdr list) as elements) ⇒ (use the words foo bar as elements)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ほとんどの場合、実行されるプログラム内に出現することにより、フォームは自動的に評価されます。稀に、実行時 —
たとえば編集されているテキストや、プロパティーリストから取得したフォームを読み取った後 —
に計算されるように、フォームを評価するコードを記述する必要があるかもしれません。このようなときは、eval
関数を使用します。eval
が不必要だったり、かわりに他の何かを使用すべきときが、しばしばあります。たとえば、変数から値を取得するには、eval
も機能しますが、symbol-value
のほうが適しています。eval
で評価するためにプロパティーリストに式を格納するより、かわりにfuncall
に渡すように関数を格納した方がよいでしょう。
このセクションで説明する関数と変数は、フォームの評価、評価処理の制限の指定、最後にreturnされた値の記録を行なうものです。ファイルのロードでも評価が行なわれます(Loadingを参照してください)。
データ構造に式を格納してそれを評価するより、データ構造に関数を格納して、それをfuncall
やapply
で呼び出すほうが、より明解かつ柔軟です。関数を使用することにより、引数に情報を渡す能力が提供されます。
これは、式を評価する、基本的な関数です。この関数は、カレント環境内でformを評価して、その結果をreturnします。formオブジェクトの型は、それが評価される方法を決定します。Kinds of Formsを参照してください。
引数lexicalは、ローカル変数にたいするスコープ規則(Scoping Rules for Variable Bindingsを参照してください)を指定します。これが省略されるかnil
の場合、デフォルトのダイナミックスコープ規則を使用してformを評価することを意味します。t
の場合は、レキシカルスコープ規則が使用されることを意味します。lexicalの値には、レキシカルバインディングにたいする特定のレキシカル環境(lexical
environment)を指定する、空ではないalistも指定できます。しかし、この機能はEmacs
Lispデバッガーのような、特別な目的にたいしてのみ有用です。Lexical Bindingを参照してください。
eval
は関数なので、eval
呼び出しに現れる引数式は2回 —
1度はeval
が呼び出される前の準備、そしてeval
関数自身によりもう1度 — 評価されます。以下は例です:
(setq foo 'bar) ⇒ bar
(setq bar 'baz) ⇒ baz ;;eval
が引数foo
を受け取る。 (eval 'foo) ⇒ bar ;;eval
が、foo
の値である、引数bar
を受け取る。 (eval foo) ⇒ baz
eval
により現在アクティブな呼び出しの数は、max-lisp-eval-depth
に制限されます(以下参照)。
この関数は、カレントバッファー内の、位置startとendで定義されるリージョン内のフォームを評価します。この関数はそのリージョンからフォームを読み取り、それらにたいしeval
を呼び出します。これは、リージョンの最後に達するまで、または処理されないエラーがシグナルされるまで行なわれます。
デフォルトでは、eval-region
は何の出力も生成しません。しかし、streamが非nil
の場合、出力関数(Output Functionsを参照してください)で生成された任意の出力、同様にリージョン内の式を評価した結果の値は、streamを使用してプリントされます。Output Streamsを参照してください。
read-functionが非nil
の場合、read
のかわりに1つずつ式を読み取るために使用する関数を指定します。これは、入力を読み取るストリームを指定する、1つの引数で呼び出される関数です。この関数を指定するために変数load-read-function
(How Programs Do
Loadingを参照してください)も使用できますが、引数read-functionを使用するほうが確実です。
eval-region
はポイントを移動しません。つねにnil
をreturnします。
この関数はeval-region
と似ていますが、引数は異なるオプション機能を提供します。eval-buffer
は、バッファーbuffer-or-nameのアクセス可能な部分全体を処理します。buffer-or-nameにはバッファー名(文字列)を指定でき、nil
(または省略)のときはカレントバッファーを意味します。streamがnil
かつprintが非nil
でない場合、eval-region
のようにstreamが使用されます。この場合、式の評価による結果の値は依然として破棄されますが、出力関数による出力はエコーエリアにプリントされます。filenameは、load-history
(Unloadingを参照してください)に使用されるファイル名で、デフォルトはbuffer-file-name
(Buffer File Nameを参照してください)です。unibyteが非nil
の場合、可能な限りread
は文字列をユニコードに変換します。
eval-current-buffer
は、このコマンドのエイリアスです。
この変数は、エラー(エラーメッセージは"Lisp nesting exceeds
max-lisp-eval-depth"
)がシグナルされる前に、eval
、apply
、funcall
の呼び出しで許される最大の深さを定義します。
制限を超えたときのエラーをもつこの制限は、Emacs
Lispで誤って定義された関数による無限再帰を避ける方法の1つです。max-lisp-eval-depth
の値を過大に増加させた場合、そのようなコードはかわりにスタックオーバーフローを起こすでしょう。
たとえば、Lisp式に記述された関数の呼び出し、関数呼び出しの引数と、関数bodyフォームにたいする再帰評価、Lispコード内での明示的な呼び出しなどにたいして、深さ制限を数えるために、内部的にeval
、apply
、funcall
を使用します。
この変数のデフォルト値は400です。この値を100未満にセットした場合、値が与えられた値に達すると、Lispはそれを100にリセットします。空きが少ない場合、デバッガー自身を実行するために空きが必要になるので、Lispデバッガーに入ったときは、この値が増加されます。
max-specpdl-size
はネストの他の制限を提供します。Local Variablesを参照してください。
この変数の値は、読み取り、評価、プリントを行なった標準的なEmacsコマンドにより、バッファー(ミニバッファーを含む)からreturnされる値のリストです(これには*ielm*バッファーでの評価や、lisp-interaction-mode
でのC-jを使用した評価は含まれないことに注意してください)。要素の順番は、もっとも最近のものが最初になります。
(setq x 1) ⇒ 1
(list 'A (1+ 2) auto-save-default) ⇒ (A 3 t)
values ⇒ ((A 3 t) 1 …)
この変数は、最近評価されたフォームの値を後で参照するのに便利です。values
自体の値をプリントするのは、それがおそらく非常に長くなるので、通常は悪いアイデアです。かわりに、以下のように特定の要素を調べます:
;; もっとも最近評価された結果を参照する。
(nth 0 values)
⇒ (A 3 t)
;; これは新たな要素をputするので、 ;; すべての要素が1つ後に移動する。 (nth 1 values) ⇒ (A 3 t)
;; これは次に新しい、この例の前の次に新しい要素を取得する。
(nth 3 values)
⇒ 1
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispプログラムは、一連の式(expressions)、あるいはフォーム(forms)(Kinds of Formsを参照してください)により形成されます。これらのフォームの実行順は、それらを制御構造(control structures)で囲むことにより制御します。制御構造とは、その制御構造が含むフォームをいつ、どのような条件で、何回実行するかを制御する、スペシャルフォームです。
もっとも単純な実行順は、1番目はa、2番目はb、...という、シーケンシャル実行(sequential execution: 順番に実行)です。これは、関数のbody内の連続する複数のフォームや、Lispコードのファイル内のトップレベルを記述したときに発生します — つまり、フォームは記述した順に実行されます。わたしたちはこれをテキスト順(textual order)と呼びます。たとえば、関数のbodyが2つのフォームaとbから構成される場合、関数の評価は、最初にaを評価し、次にbを評価します。bを評価した結果が、その関数の値となります。
明示的に制御構造を使用することにより、シーケンシャルではない順番での実行が可能になります。
Emacs Lispは、他の様々な順序づけ、条件、繰り返し、(制御された)ジャンプを含む、複数の種類の制御構造を提供し、以下ではそれらすべてを記述します。ビルトインの制御構造は、制御構造のサブフォームが評価される必要がなかったり、順番に評価される必要がないので、スペシャルフォームです。独自の制御構造を構築するためにマクロを使用することができます(Macrosを参照してください)。
10.1 Sequencing | テキスト順の評価。 | |
10.2 Conditionals | if 、cond 、when 、unless 。
| |
10.3 Constructs for Combining Conditions | and 、or 、not 。
| |
10.4 Iteration | while ループ。
| |
10.5 Nonlocal Exits | シーケンスの外へジャンプ。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フォームが出現する順番に評価するのは、あるフォームから別のフォームに制御を渡す、もっとも一般的な制御です。関数のbodyのような、あるコンテキストにおいては、自動的にこれが行なわれます。他の場所では、これを行なうために制御構造を使用しなければなりません。Lispで一単純な制御構造は、progn
です。
スペシャルフォームprogn
は、以下のようなものです:
(progn a b c …)
これは、順番にa、b、c、...を実行するよう指定します。これらはprogn
フォームのbodyと呼ばれます。body内の最後のフォームの値が、progn
全体の値になります。(progn)
はnil
をreturnします。
初期のLispでは、progn
は、連続で複数のフォームを実行して最後のフォームの値を使用する、唯一の方法でした。しかしプログラマーは、関数のbodyの、(その時点では)1つのフォームだけが許される場所で、progn
を使用する必要が多いことに気づきました。そのため、関数のbodyを“暗黙のprogn
”にして、progn
のbodyのように複数のフォームを記述出きるようにしました。他の多くの制御構造も、同様に暗黙のprogn
を含みます。結果として、昔ほどprogn
は多用されなくなりました。現在では、progn
が必要になるのは、unwind-protect
、and
、or
、if
のthenパートの中がほとんどです。
このスペシャルフォームは、formsのすべてをテキスト順に評価して、のフォームの結果をreturnします。
(progn (print "The first form") (print "The second form") (print "The third form")) -| "The first form" -| "The second form" -| "The third form" ⇒ "The third form"
他の2つの構成は、一連のフォームを同様に評価しますが、異なる値をreturnします:
このスペシャルフォームは、form1とformsのすべてをテキスト順に評価して、form1の結果をreturnします。
(prog1 (print "The first form") (print "The second form") (print "The third form")) -| "The first form" -| "The second form" -| "The third form" ⇒ "The first form"
以下の例は、変数x
のリストから1番目の要素を削除して、削除した1番目の要素の値をreturnします:
(prog1 (car x) (setq x (cdr x)))
このスペシャルフォームは、form1、form2、その後のformsのすべてをテキスト順で評価して、form2の結果をreturnします。
(prog2 (print "The first form") (print "The second form") (print "The third form")) -| "The first form" -| "The second form" -| "The third form" ⇒ "The second form"
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
条件による制御構造は、候補の中から選択を行ないます。Emacs
Lispは4つの条件フォームをもちます。if
は他の言語のものとほとんど同じです。when
とunless
は、if
の変種です。cond
は一般化されたcase命令です。
if
は、conditionの値にもとづいて、then-formとelse-formsを選択します。評価されたconditionが非nil
の場合は、then-formが評価されて、その結果がreturnされます。それ以外は、else-formsがテキスト順に評価されて、最後のフォームの値がreturnされます(if
のelseパートは、暗黙のprogn
の例です。Sequencingを参照してください)。
conditionの値がnil
で、else-formsが与えられない場合、if
はnil
をreturnします。
選択されなかったブランチは決して評価されない — 無視される —
ので、if
はスペシャルフォームです。したがって、以下の例ではprint
は呼び出されることはないので、true
はプリントされません。
(if nil (print 'true) 'very-false) ⇒ very-false
これは、else-formsがなく、複数のthen-formsがあるかもしれない、if
の変種です。特に、
(when condition a b c)
は以下と完全に等価です
(if condition (progn a b c) nil)
これはthen-formがない、if
の変種です:
(unless condition a b c)
は以下と完全に等価です
(if condition nil a b c)
cond
は、任意の数の候補から選択を行ないます。cond
内の各clauseは、リストでなければなりません。このリストのCARはconditionで、(もしあれば)残りの要素はbody-formsです。したがって、条項は以下のようになります:
(condition body-forms…)
cond
は、各条項のconditionを評価することにより、テキスト順で条項を試験します。conditionの値が非nil
の場合、その条項は“成り立ち”ます。その後、cond
は、その条項のbody-formsを評価して、body-formsの最後の値をreturnします。残りの条項は無視されます。
conditionの値がnil
の場合、その条項は“成り立たず”、cond
は次の条項に移動して、その条項のconditionを試験します。
以下のようなものも、条項になります:
(condition)
conditionがテストされたときに非nil
なら、cond
フォームはconditionの値をreturnします。
すべてのconditionがnil
に評価された場合 —
つまりすべての条項が不成立の場合、cond
はnil
をreturnします。
以下の例は4つの条項をもち、x
の値が数字か、文字列化、バッファーか、シンボルかをテストします:
(cond ((numberp x) x) ((stringp x) x) ((bufferp x) (setq temporary-hack x) ; 1つの条項に (buffer-name x)) ; 複数bodyフォーム。 ((symbolp x) (symbol-value x)))
前の条項が不成立のとき、最後の条項を実行したいときがよくあります。これを行なうには、(t
body-forms)
のように、conditionの最後の条項にt
を使用します。フォームt
はt
に評価され、決してnil
にならないので、この条項が不成立になることはなく、最終的にcond
はこの条項に到達します。たとえば:
(setq a 5) (cond ((eq a 'hack) 'foo) (t "default")) ⇒ "default"
このcond
式は、a
の値がhack
の場合はfoo
、それ以外は文字列"default"
をreturnします。
任意の条件構成は、cond
かif
で表すことができます。したがって、どちらを選択するかは、スタイルの問題です、たとえば:
(if a b c) ≡ (cond (a b) (t c))
10.2.1 Pattern matching case statement |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
特定の値を、可能なさまざまの場合にたいして比較するには、マクロpcase
が便利です。これは以下のフォームをとります:
(pcase exp branch1 branch2 branch3 …)
各branchは、(upattern body-forms…)
というフォームです。
これは最初にexpを評価してから、どのbranchを使用するか、その値を各upatternと比較して、その後で対応するbody-forms実行します。一般的なのは、少数の異なる定数値を区別するために使用される場合です:
(pcase (get-return-code x) (`success (message "Done!")) (`would-block (message "Sorry, can't do it now")) (`read-only (message "The shmliblick is read-only")) (`access-denied (message "You do not have the needed rights")) (code (message "Unknown return code %S" code)))
最後の条項のcode
は、(get-return-code x)
からreturnされた値にバインドされる変数です。
もっと複雑な例として、以下のような小さな式言語のための単純なインタープリターを示します(この例ではレキシカルバインディングが必要なことに注意してください):
(defun evaluate (exp env) (pcase exp (`(add ,x ,y) (+ (evaluate x env) (evaluate y env))) (`(call ,fun ,arg) (funcall (evaluate fun env) (evaluate arg env))) (`(fn ,arg ,body) (lambda (val) (evaluate body (cons (cons arg val) env)))) ((pred numberp) exp) ((pred symbolp) (cdr (assq exp env))) (_ (error "Unknown expression %S" exp))))
`(add ,x
,y)
は、exp
がシンボルadd
で始まる3要素のリストかチェックして、その後2番目と3番目の要素を抽出し、それらを変数x
とy
にバインドするパターンです。(pred
numberp)
はexp
が数字かを単にチェックし、_
はすべてのものにマッチするcatch-allパターンです。
以下に、いくつかの例を評価した結果とともに示します:
(evaluate '(add 1 2) nil) ;=> 3 (evaluate '(add x y) '((x . 1) (y . 2))) ;=> 3 (evaluate '(call (fn x (add 1 x)) 2) nil) ;=> 3 (evaluate '(sub 1 2) nil) ;=> error
pcase
に関係する2種類のパターンがあり、それらはU-patterns、Q-patternsと呼ばれます。上述のupatternはU-patternsで、以下の形式をもつことができます:
`qpattern
これは、もっとも一般的なパターンの1つです。このパターンの意図は、バッククォートマクロの模倣です。このパターンは、バッククォート式により構築されるような値にマッチします。わたしたちが行なうのは値の構築ではなくパターンマッチングなので、非クォートは式をどこに挿入するか示すのではなく、かわりにその位置で値にマッチすべき1つのU-patternを指定します。
より具体的には、Q-patternは以下のフォームをもつことができます:
(qpattern1 . qpattern2)
このパターンは、car
がqpattern1、cdr
がpattern2にマッチする、任意のコンスセルにマッチします。
atom
このパターンは、atomにequal
な任意のアトムにマッチします。
,upattern
このパターンは、upatternにマッチする任意のオブジェクトにマッチします。
symbol
U-pattern内の単なるシンボルはすべてにマッチし、さらにマッチした値にそのシンボルをバインドするので、body-formsや皇族のパターンから、それを参照することができます。
_
このパターン — いわゆるdon’t careパターン — はシンボルパターンと同様、すべてのものにマッチしますが、シンボルパターンとは異なり、変数へのバインドを行ないません。
(pred pred)
このパターンは、マッチされるオブジェクトで関数predが呼び出したとき、非nil
をreturnするものにマッチします。
(or upattern1 upattern2…)
このパターンは、引数のパターンから最初に成立したパターンにマッチします。すべての引数パターンは、同じ変数にバインドされるべきです。
(and upattern1 upattern2…)
このパターンは、すべての引数パターンが成立したときだけマッチします。
(guard exp)
このパターンは調べられるオブジェクトを無視して、expが非nil
に評価されたときは成立、それ以外は不成立となります。これは通常、and
パターンの内部で使用されます。たとえば、(and
x (guard (< x 10)))
は10より小さい任意の数字にマッチして、それを変数x
にバインドします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションは、複雑な条件を表現するために、if
やcond
とともによく使用される3つの構成を記述します。and
とor
の構成は、ある種の複数条件の構成として、個別に使用することもできます。
この関数は、conditionが偽であることをテストします。この関数はconditionがnil
の場合はt
、それ以外はnil
をreturnします。関数not
はnull
と等価で、わたしたちは空のリストをテストする場合は、null
の使用を推奨します。
スペシャルフォームand
は、すべてのconditionsが真かどうかをテストします。この関数は、conditionsを記述された順に1つずつ評価することにより機能します。
あるconditionsがnil
に評価された場合、残りのconditionsに関係なく、and
はnil
をreturnしなければなりません。この場合、and
は即座にnil
をreturnし、残りのconditionsは無視されます。
すべてのconditionsが非nil
の場合、それらの最後の値がand
フォームの値になります。conditionsのない単独の(and)
は、t
をreturnします。なぜなら、すべてのconditionsが非nil
となるので(考えてみてください。そうでないのはどれですか?)、これは適切です。
以下に例を示します。1番目の条件は整数1をretuenし、これはnil
ではありません。同様に2番目の条件は整数2をreturnし、これもnil
ではありません。3番目の条件はnil
なので、のこりの条件が評価されることは決してありません。
(and (print 1) (print 2) nil (print 3)) -| 1 -| 2 ⇒ nil
以下は、and
を使用した、より現実的な例です:
(if (and (consp foo) (eq (car foo) 'x)) (message "foo is a list starting with x"))
(consp foo)
がnil
をreturnした場合、(car
foo)
は実行されないので、エラーにならないことに注意してください。
if
かcond
のどちらかを使用して、and
式を記述することもできます。以下はその方法です:
(and arg1 arg2 arg3) ≡ (if arg1 (if arg2 arg3)) ≡ (cond (arg1 (cond (arg2 arg3))))
スペシャルフォームor
は、少なくとも1つのconditionsが真かどうかをテストします。この関数は、すべてのconditionsを1つずつ、記述された順に評価することにより機能します。
あるconditionsが非nil
値に評価された場合、or
の結果は非nil
でなければなりません。この場合、or
は即座にreturnし、残りのconditionsは無視されます。この関数がreturnする値は、非nil
値に評価された条件の値そのものです。
すべてのconditionsがnil
になった場合、or
式はnil
をreturnします。conditionsのない単独の(or)
は、nil
をreturnします。なぜなら、すべてのconditionsがnil
になるので(考えてみてください。そうでないのはどれですか?)、これは適切です。
たとえば、この式はx
がnil
または整数0かどうかをテストします:
(or (eq x nil) (eq x 0))
and
構成と同様に、or
をcond
に置き換えて記述することができます。たとえば:
(or arg1 arg2 arg3) ≡ (cond (arg1) (arg2) (arg3))
ほとんどの場合、or
をif
に置き換えて記述できますが、完全ではありません:
(if arg1 arg1 (if arg2 arg2 arg3))
これは完全に同一ではありません。なぜならarg1またはarg2を2回評価するかもしれないからです。対照的に、(or
arg1 arg2 arg3)
は2回以上引数を評価することは、決してありません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
繰り返し(iteration)とは、プログラムの一部を繰り返し実行することを意味します。たとえば、リストの各要素、または0からnの整数にたいして、1度ずつ繰り返し何らかの計算をおこないたいとしましょうEmacs
Lispでは、スペシャルフォームwhile
でこれを行なうことができます:
while
は、最初にconditionを評価します。結果が非nil
の場合は、formsをテキスト順に評価します。その後conditionを再評価して、結果が非nil
の場合、再度formsを評価します。この処理は、conditionがnil
に評価されるまで繰り返されます。
繰り返し回数に制限はありません。このループは、conditionがnil
に評価されるか、エラーとなるか、throw
で抜け出す(Nonlocal Exitsを参照してください)まで計測されるでしょう
while
フォームの値は、常にnil
です。
(setq num 0) ⇒ 0
(while (< num 4) (princ (format "Iteration %d." num)) (setq num (1+ num))) -| Iteration 0. -| Iteration 1. -| Iteration 2. -| Iteration 3. ⇒ nil
各繰り返しごとに何かを実行して、その後も終了テストを行なう“repeat...until”ループを記述するには、以下のようにwhile
の1番目の引数として、bodyの後に終了テストを記述して、それをprogn
の中に配します:
(while (progn (forward-line 1) (not (looking-at "^$"))))
これは1行前方に移動して、空行に達するまで行単位の移動を継続します。独特なのは、while
がbodyをもたず、終了テスト(これはポイント移動の実処理も行ないます)だけという点です。
マクロdolist
およびdotimes
は、2つの一般的な種類のループを記述する、便利な方法を提供します。
この構成は、listの各要素にたいして1度bodyを実行し、カレント要素をローカルに保持するように、変数varにバインドします。その後、resultを評価した値、またはresultが省略された場合はnil
をreturnします。たとえば、以下はreverse
関数を定義するために、dolist
を使用する方法の例です:
(defun reverse (list) (let (value) (dolist (elt list value) (setq value (cons elt value)))))
この構成は、0以上count未満の各整数にたいして1度bodyを実行し、その繰り返しでの整数を、変数varにバインドします。その後、resultの値、またはresultが省略された場合はnil
をreturnします。以下は、dotimes
を使用して、何らかの処理を100回行なう例です:
(dotimes (i 100) (insert "I will not obey absurd orders\n"))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
非ローカル脱出(nonlocal exit)とは、プログラム内のある位置から、別の離れた位置へ、制御を移します。Emacs Lispでは、エラーの結果として非ローカル脱出が発生することがあります。明示的な制御の下で非ローカル脱出を使用することもできます。非ローカル脱出は、脱出しようとしている構成により作成された、すべての変数バインディングのバインドを外します。
10.5.1 Explicit Nonlocal Exits: catch and throw | プログラム自身の目的による非ローカル脱出。 | |
10.5.2 Examples of catch and throw | このような非ローカル脱出が記述される方法を示します。 | |
10.5.3 Errors | エラーがシグナル・処理される方法。 | |
10.5.4 Cleaning Up from Nonlocal Exits | エラーが発生した場合のクリーンアップフォーム実行のアレンジ。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
catch
and throw
ほとんどの制御構造は、そのコンストラクト自身内部の制御フローだけに影響します。関数throw
は、通常のプログラム実行でのこのルールの例外です。これは、リクエストにより非ローカル脱出を行ないます(他にも例外はありますが、それらはエラー処理だけのものです)。throw
はcatch
の内部で試用され、catch
に制御を戻します。たとえば:
(defun foo-outer () (catch 'foo (foo-inner))) (defun foo-inner () … (if x (throw 'foo t)) …)
throw
フォームが実行された場合は、対応するcatch
に制御を移し、catch
は即座にreturnします。throw
の後のコードは実行されません。throw
の2番目の引数は、catch
のreturn値として使用されます。
関数throw
は、1番目の引数にもとづいて、それにマッチするcatch
を探します。throw
は、1番目の引数が、throw
で指定されたものとeq
なcatch
を検索します。複数の該当するcatch
がある場合、最内のものが優先されます。したがって、上記の例ではthrow
がfoo
を指定し、foo-outer
内のcatch
が同じシンボルを指定しているので、(この間に他のマッチするcatch
は存在しないと仮定すると)catch
が該当します。
throw
の実行により、マッチするcatch
までのすべてのリスプ構成(関数呼び出しを含む)を脱出します。この方法によりlet
や関数呼び出しのようなバインディング構成を脱出する場合、これらの構成を正常にexitしたときのように、そのバインディングは解かれます(Local Variablesを参照してください)。同様にthrow
は、save-excursion
(Excursionsを参照してください)により保存されたバッファーと位置を復元します。throw
が、スペシャルフォームunwind-protect
を脱出した場合、unwind-protect
により設定されたいくつかのクリーンアップも実行します。
ジャンプ先となるcatch
内にレキシカル(局所的)である必要はありません。throw
は、catch
内で呼び出された別の関数から、同じようにに呼び出すことができます。throw
が行なわれたのが、順序的に、catch
に入った後でexitする前である限り、そのthrow
はcatch
にアクセスできます。エディターのコマンドループから戻るexit-recursive-edit
のようなコマンドで、throw
が使用されるのは、これが理由です。
Common Lispに関する注意: Common Lispを含む、他のほとんどのバージョンのLispは、非シーケンシャルに制御を移す、いくつかの方法 — たとえば
return
、return-from
、go
— をもちます。Emacs Lispの場合は、throw
だけです。cl-libライブラリーは、これらのうちいくつかを提供します。Blocks and Exits in Common Lisp Extensionsを参照してください。
catch
は、throw
関数にたいするreturn位置を確立します。return位置はtagにより、そのような他のreturn位置と区別されます。tagは、nil
以外の任意のLispオブジェクトです。引数tagはreturn位置が確立される前に、通常どおり評価されます。
return位置が効果をもつことにより、catch
はbodyのフォームをテキスト順に評価します。フォームが(エラーは非ローカル脱出なしで)通常に実行された場合、bodyの最後のフォームの値が、catch
からreturnされます。
bodyの実効の間にthrow
が実行された場合、tagと同じ値を指定すると、catch
フォームは即座にexitします。returnされる値は、それが何であれ、throw
の2番目の引数に指定された値です。
throw
の目的は、以前にcatch
により確立されたreturn位置に戻ることです。引数tagは、既存のさまざまなreturn位置からrturn位置を選択するために使用されます。複数のreturn位置がtagにマッチする場合、最内のものが使用されます。
引数valueは、catch
からreturnされる値として使用されます。
タグtagのreturn位置が存在しない場合、データ(tag
value)
とともに、no-catch
エラーがシグナルされます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
catch
and throw
2重にネストされたループから脱出する1つの方法は、catch
とthrow
を使うことです(ほとんどの言語では、これは“goto”により行なわれるでしょう)。ここでは、iとjを、0から9に変化させて(foo
i j)
を計算します:
(defun search-foo () (catch 'loop (let ((i 0)) (while (< i 10) (let ((j 0)) (while (< j 10) (if (foo i j) (throw 'loop (list i j))) (setq j (1+ j)))) (setq i (1+ i))))))
foo
が非nil
をreturnした場合、即座に処理を止めて、iとjのリストをreturnしています。foo
が常にnil
をreturnする場合、catch
は通常どおりreturnし、その値はwhile
の結果であるnil
となります。
以下では、2つのreturn位置を1度に表す、微妙に異なるトリッキーな例を2つ示します。最初に、同じタグhack
にたいする2つのreturn位置があります:
(defun catch2 (tag) (catch tag (throw 'hack 'yes))) ⇒ catch2
(catch 'hack (print (catch2 'hack)) 'no) -| yes ⇒ no
どちらのreturn位置もthrow
にマッチするタグをもつので、内側のもの、つまりcatch2
で確立されたものにgotoします。したがってcatch2
は通常どおり値yes
をreturnするので、その値がプリントされます。最後に外側のcatch
の2番目のbody、つまり'no
が評価されて、外側のcatch
からそれがreturnされます。
ここで、catch2
に与える引数を変更してみます:
(catch 'hack (print (catch2 'quux)) 'no) ⇒ yes
この場合も2つのreturn位置がありますが、今回は外側だけがタグhack
をもち、内側のものは、かわりにタグquux
をもちます。したがって、throw
により、外側のcatch
が値yes
をreturnします。関数print
が呼び出されることはなく、bodyのフォーム'no
も決して評価されません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispが、何らかの理由により評価できないようなフォームの評価を試みた場合には、エラー(error)がシグナル(signal)されます。
エラーがシグナルされた場合、エラーメッセージの表示とカレントこまんどの実行の終了が、Emacsデフォルトの反応です。たとえばバッファーの最後でC-fとタイプしたときのように、ほとんどの場合、これは正しい反応です。
複雑なプログラムでは、単なる終了が望ましくない場合もあるでしょう。たとえば、そのプログラムはデータ構造に一時的に変更を行なっていたり、プログラム終了前に削除すべき一時バッファーを作成しているかもしれません。このような場合、エラー時に評価されるクリーンアップ式(cleanup
expressions)を設定するために、unwind-protect
を使用するでしょう(Cleaning Up from Nonlocal Exitsを参照してください)。サブルーチン内のエラーにもかかわらずに、プログラムの実行を継続したいときがあるかもしれません。この場合、エラー時のリカバリーを制御するためのエラーハンドラー(error
handlers)を設定するために、condition-case
を使用するでしょう。
エラーハンドリングを使用せずに、プログラムの一部から別の部分へ制御を移すためには、catch
とthrow
を使用します。Explicit Nonlocal Exits: catch
and throw
を参照してください。
10.5.3.1 How to Signal an Error | エラーを報告する方法。 | |
10.5.3.2 How Emacs Processes Errors | エラーを報告するときEmacsが何を行なうか。 | |
10.5.3.3 Writing Code to Handle Errors | エラーをトラップして実行を継続する方法。 | |
10.5.3.4 Error Symbols and Condition Names | エラートラッピングのために、エラーをクラス分けする方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーのシグナリング(signaling)とは、エラーの処理を開始することを意味します。エラー処理は通常、実行中のプログラムのすべて、または一部をアボート(abort)して、エラーをハンドルするためにセットアップされた位置にreturnします。ここでは、エラーをシグナルする方法を記述します。
ほとんどのエラーは、たとえば、整数にたいしてCARを求めたり、バッファーの最後で1文字前方に移動したときなどのように、他の目的のために呼び出したLisp基本関数の中で、“自動的”にシグナルされます。関数error
とsignal
で、明示的にエラーをシグナルすることもできます。
ユーザーがC-gをタイプしたときに発生するquitは、エラーとは判断されませんが、ほとんどはエラーと同様に扱われます。Quittingを参照してください。
すべてのエラーメッセージはそれぞれ、何らかのエラーメッセージを指定します。そのメッセージは、何が悪いのか(“File does not exist”)、物事がどうしてそうあるべきではない(“File must exist”)かを示すべきです。Emacs Lispの監修では、エラーメッセージは大文字で開始され、句読点で終わるべきではありません。
この関数は、format-stringとargsにたいして、format
(Formatting Stringsを参照してください)を適用することにより構築されたエラーメッセージとともに、エラーをシグナルします。
以下は、error
を使用する典型的な例です:
(error "That is an error -- try something else") error→ That is an error -- try something else
(error "You have committed %d errors" 10) error→ You have committed 10 errors
2つの引数 — エラーシンボルerror
と、format
によりreturnされる文字列を含むリスト —
でsignal
を呼び出すことにより、error
は機能します。
警告: エラーメッセージとして固定の文字列を使用したい場合、単に(error
string)
とは記述しないでください。もしstringが‘%’を含む場合、それはフォーマット指定子(format
specifier)として解釈されてしまうので、望む結果は得られません。かわりに、(error "%s"
string)
を使用してください。
この関数は、error-symbolにより命名されるエラーをシグナルします。引数dataは、エラーの状況に関連する追加のLispオブジェクトのリストです。
引数error-symbolは、エラーシンボル(error symbol) —
define-error
により定義されYたシンボル — でなければなりません。これはEmacs
Lispが異なる種類のエラーをクラス分けする方法です。エラーシンボル(error symbol)、エラーコンディション(error
condition)、コンディション名(condition name)の説明については、Error Symbols and Condition Namesを参照してください。
エラーが処理されない場合、エラーメッセージをプリントするために2つの引数が使用されます。このエラーメッセージは通常、error-symbolのerror-message
プロパティーにより提供されます。dataが非nil
の場合、その後にコロンと、dataの評価されていない要素を、カンマで区切ったリストが続きます。error
が発生した場合、エラーメッセージは、dataのCAR(文字列でなければなりません)です。file-error
のサブカテゴリーは、特別に処理されます。
data内のオブジェクトの数と重要性は、error-symbolに依存します。たとえば、wrong-type-argument
エラーでは、リスト内には2つのオブジェクト
— 期待する型を記述する述語と、その型への適合に失敗したオブジェクト — であるべきです。
エラーを処理する任意のエラーハンドラーにたいして、error-symbolとdataの両方を利用できます。condition-case
は、ローカル変数を(error-symbol
. data)
というフォームでバインドします(Writing Code to Handle Errorsを参照してください)。
関数signal
は、決してreturnしません。
(signal 'wrong-number-of-arguments '(x y)) error→ Wrong number of arguments: x, y
(signal 'no-such-error '("My unknown error condition")) error→ peculiar error: "My unknown error condition"
この関数は、error
とまったく同じように振る舞いますが、error
ではなく、user-error
というエラーシンボルを使用します。名前が示唆するように、このエラーはコード自身のエラーではなく、ユーザーパートのエラーの報告を意図しています。たとえば、Infoの閲覧履歴の開始を超えて履歴を遡るためにコマンドInfo-history-back
(l)を使用した場合、Emacsはuser-error
をシグナルします。このようなエラーでは、たとえdebug-on-error
が非nil
であっても、デバッガーへのエントリーは発生しません。Entering the Debugger on an Errorを参照してください。
Common Lispに関する注意: Emacs Lispには、Common Lispのような継続可能なエラーのような概念は存在しません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーがシグナルされたとき、signal
は、そのエラーにたいするアクティブなハンドラー(handler)を検索します。ハンドラーとは、Lispプログラムの一部でエラーが発生したときに実行するよう意図された、Lisp式のシーケンスです。そのエラーが適切なハンドラーをもつ場合、そのハンドラーが実行され、そのハンドラーの後から実行が再開されます。ハンドラーは、そのハンドラーが設定されたcondition-case
の環境内で実行されます。condition-case
内のすべての関数呼び出しはすでに終了しているので、ハンドラーがそれらにreturnすることはありません。
そのエラーにたいする適切なハンドラーが存在しない場合は、カレントコマンドを終了して、エディターのコマンドループに制御をreturnします(コマンドループは、すべての種類のエラーにたいする暗黙のハンドラーをもちます)。コマンドループのハンドラーは、エラーメッセージをプリントするために、エラーシンボルと、関連付けられたデータを使用します。変数command-error-function
を使用して、これが行なわれる方法を制御できます:
この変数は、もし非nil
の場合はEmacsのコマンドループに制御をreturnしたエラーの処理に使用する関数を指定します。この関数は3つの引数をとります。1つ目はdataで、condition-case
が自身の変数にバインドするのと同じフォームです。2つ目はcontextで、これはエラーが発生した状況を記述する文字列、またはnil
(よくある)です。3つ目はcallerで、これはエラーをシグナルした基本関数を呼び出したLisp関数です。
明示的なハンドラーのないエラーは、Lispデバッガーを呼び出すかもしれません。変数debug-on-error
(Entering the Debugger on an Errorを参照してください)が非nil
の場合、デバッガーが有効です。エラーハンドラーとは異なり、デバッガーはそのエラーの環境内で実行されるので、エラー時の変数の値を正確に調べることができます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーをシグナルすることによる通常の効果は、実行されていたコマンドを終了して、Emacsエディターのコマンドループに即座にreturnすることです。スペシャルフォームcondition-case
を使用して、エラーハンドラーを設定することにより、プログラム内の一部で発生するエラーのをトラップを調整することができます。以下は単純な例です:
(condition-case nil (delete-file filename) (error nil))
これは、filenameという名前のファイルを削除して、任意のエラーをcatchして、エラーが発生した場合はnil
を参照してください(このような単純なケースでは、マクロignore-errors
を使用することもできます。以下を参照してください)。
condition-case
構成は、insert-file-contents
呼び出しでのファイルオープンの失敗のような、予想できるエラーをトラップするために多用されます。condition-case
構成は、ユーザーからの読み取った式を評価するプログラムのような、完全に予測できないエラーのトラップにも使用されます。
condition-case
の2番目の引数は、保護されたフォーム(protected
form)と呼ばれます(上記の例では、保護されたフォームは、delete-file
の呼び出しです)。このフォームの実行が開始されると、エラーハンドラーは効果をもち、このフォームがreturnすると不活性になります。その間のすべてにおいて、エラーハンドラーは効果をもちます。特に、このフォームで呼び出された関数、およびそのサブルーチンなどを実行する間、エラーハンドラーは効果をもちます。厳密にいうと、保護されたフォーム自身ではなく、保護されたフォームにより呼び出されたLisp基本関数(signal
とerror
を含む)だけがシグナルされるというのは、よいことです。
保護されたフォームの後の引数はハンドラーです。各ハンドラーは、どのエラーを処理するかを指定する、1つ以上のコンディション名(condition
names)(シンボル)をリストします。エラーがシグナルされたとき、エラーシンボルはコンディション名のリストも定義します。エラーが共通の条件名をもつ場合、そのハンドラーはそのエラーに適用されます。上記の例では、1つのハンドラーがあり、それはすべてのエラーをカバーする条件名error
を指定しています。
適切なハンドラーの検索は、もっとも最近に設定されたハンドラーから開始して、設定されたすべてのハンドラーをチェックします。したがって、ネストされたcondition-case
フォームに同じエラー処理がある場合、内側のハンドラーがそれを処理します。
何らかのcondition-case
によりエラーが処理された場合、debug-on-error
でエラーによりデバッガーが呼び出されるようにしていても、通常はデバッガーの実行が抑制されます。
condition-case
により補足されるようなエラーをデバッグできるようにしたい場合は、変数debug-on-signal
に非nil
値をセットします。以下のようにコンディションの中にdebug
を記述することにより、最初にデバッガーを実行するような、特定のハンドラーを指定することもできます:
(condition-case nil (delete-file filename) ((debug error) nil))
ここでのdebug
の効果は、デバッガー呼び出しを抑制するcondition-case
を防ぐことだけです。debug-on-error
およびその他のフィルタリングメカニズムがデバッガーを呼び出すように指定されているときだけ、エラーによりデバッガーが呼び出されます。Entering the Debugger on an Errorを参照してください。
マクロcondition-case-unless-debug
は、そのようなフォームのデバッギングを処理する、別の方法を提供します。このマクロは、変数debug-on-error
がnil
の場合、つまり任意のエラーを処理しないようなケース以外は、condition-case
とまったく同様に振る舞います。
特定のハンドラーがそのエラーを処理するとEmacsが判断すると、Emacsは制御をそのハンドラーにreturnします。これを行うために、Emacsはそのとき脱出しつつあるバインディング構成により作成されたすべての変数のバインドを解き、そのとき脱出しつつあるすべてのunwind-protect
フォームを実行します。制御がそのハンドラーに達すると、そのハンドラーのbodyが通常どおり実行されます。
そのハンドラーのbodyを実行した後、condition-case
フォームから実行がreturnされます。保護されたフォームは、そのハンドラーの実行の前に完全にexitしているので、そのハンドラーはそのエラーの位置から実行を再開することはできず、その保護されたフォーム内で作られた変数のバインディングを調べることもできません。ハンドラーが行なえることは、クリーンアップと、処理を進行させることだけです。
エラーのシグナルとハンドルには、throw
とcatch
(Explicit Nonlocal Exits: catch
and throw
)に類似する点がいくつかありますが、これらは完全に別の機能です。エラーはcatch
でキャッチできず、throw
をエラーハンドラーで処理することはできません(しかし対応するcatch
が存在しないときにthrow
を仕様することによりシグナルされるエラーは、処理できます)。
このスペシャルフォームは、protected-formの実行を囲い込むエラーハンドラーhandlersを確立します。エラーなしでprotected-formが実行された場合、returnされる値はcondition-case
フォームの値になります。この場合、condition-case
は効果をもちません。protected-formの間にエラーが発生した場合、condition-case
は違いをもちます。
それぞれのhandlersは、(conditions
body…)
というフォームのリストです。ここでconditionsは、ハンドルされるエラーコンディション名、またはそのハンドラーの前にデバッガーを実行するためのコンディション名(debug
を含みます)です。bodyは、このハンドラーがエラーを処理するときに実行される、1つ以上のLisp式です。
(error nil) (arith-error (message "Division by zero")) ((arith-error file-error) (message "Either division by zero or failure to open a file"))
発生するエラーはそれぞれ、それが何の種類のエラーかを記述するエラーシンボル(error
symbol)をもち、これはコンディション名のリストも記述します(Error Symbols and Condition Namesを参照してください)。Emacsは、1つ以上のコンディション名を指定するハンドラーにたいして、すべてのアクティブなcondition-case
フォームを検索します。condition-case
の最内のマッチは、そのエラーを処理します。このcondition-case
では、最初に適合したハンドラーが、そのエラーを処理します。
ハンドラーのbodyを実行した後、condition-case
は通常どおりreturnし、ハンドラーのbodyの最後の値を、ハンドラー全体の値として使用します。
引数varは変数です。protected-formを実行するとき、condition-case
はこの変数をバインドせず、エラーを処理するときだけバインドします。その場合は、varをエラー記述(error
description)にバインドします。これはエラーの詳細を与えるリストです。このエラー記述は、(error-symbol
.
data)
というフォームをもちます。ハンドラーは、何を行なうか決定するために、このリストを参照することができます。たとえば、ファイルオープンの失敗にたいするエラーの場合、ファイル名がdata(エラー記述の3番目の要素)の2番目の要素になります。
varがnil
の場合、それはバインドされた変数がないことを意味します。この場合、エラーシンボルおよび関連するデータは、そのハンドラーでは利用できません。
より外側のレベルのハンドラーにcatchさせるために、condition-case
によりcatchされたシグナルを再度throwする必要がある場合もあります。以下はこれを行なう方法です:
(signal (car err) (cdr err))
ここでerr
はエラー記述変数(error description
variable)で、condition-case
の1番目の引数は、再throwしたいエラーコンディションです。Definition of signalを参照してください。
この関数は、与えられたエラー記述子(error descriptor)にたいするエラーメッセージ文字列をreturnします。これは、そのエラーにたいする通常のエラーメッセージをプリントすることにより、エラーを処理したい場合に有用です。Definition of signalを参照してください。
以下は、0除算の結果によるエラーを処理するために、condition-case
を使用する例です。このハンドラーは、(beepなしで)エラーメッセージを表示して、非常に大きい数をreturnします。
(defun safe-divide (dividend divisor)
(condition-case err
;; 保護されたフォーム。
(/ dividend divisor)
;; ハンドラー。 (arith-error ; Condition. ;; このエラーにたいする、通常のメッセージを表示する。 (message "%s" (error-message-string err)) 1000000))) ⇒ safe-divide
(safe-divide 5 0) -| Arithmetic error: (arith-error) ⇒ 1000000
このハンドラーはコンディション名arith-error
を指定するので、division-by-zero(0除算)エラーだけを処理します。他の種類のエラーは(このcondition-case
によっては)、処理されません。したがって:
(safe-divide nil 3) error→ Wrong type argument: number-or-marker-p, nil
以下は、error
によるエラーを含む、すべての種類のエラーをcatchするcondition-case
です:
(setq baz 34) ⇒ 34
(condition-case err
(if (eq baz 35)
t
;; 関数error
の呼び出し
(error "Rats! The variable %s was %s, not 35" 'baz baz))
;; フォームではないハンドラー。
(error (princ (format "The error was: %s" err))
2))
-| The error was: (error "Rats! The variable baz was 34, not 35")
⇒ 2
これは、その実行中に発生する任意のエラーを無視して、bodyの実行を構築します。その実行にエラーがなかった場合、ignore-errors
はbody内の最後のフォームの値をreturnし、それ以外はnil
をreturnします。
以下は、このセクションの最初の例を、ignore-errors
を使用して記述する例です:
(ignore-errors (delete-file filename))
このマクロは、いわばignore-errors
の穏やかなバージョンです。これはエラーを完全に抑止するのではなく、エラーをメッセージに変換します。これはメッセージのフォーマットに、文字列formatを使用します。formatは、"Error:
%S"
のように、単一の‘%’シーケンスを含むべきです。エラーをシグナルすると予測されないが、もし発生した場合は堅牢であるべきようなコードの周囲に、with-demoted-errors
を使用します。このマクロは、condition-case
ではなく、condition-case-unless-debug
を使用することに注意してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーをシグナルするとき、想定するエラーの種類を指定するために、エラーシンボル(error symbol)を指定します。エラーはそれぞれ、それをカテゴリー分けするために、ただ1つのエラーシンボルをもちます。これはEmacs Lisp言語で定義されるエラーの、もっとも良い分類方法です。
これら狭義の分類は、エラー条件(error
conditions)と呼ばれる、より広義のクラス階層にグループ化され、それらはコンディション名(condition
names)により識別されます。そのようなもっとも狭義なクラスは、エラーシンボル自体に属します。つまり各エラーシンボルは、コンディション名でもあるのです。すべての種類のエラー(quit
を除く)を引き受けるコンディション名error
に至る、より広義のクラスにたいするコンディション名も存在します。したがって、各エラーは1つ以上のコンディション名をもちます。つまり、error
、error
とは区別されるエラーシンボル、もしかしたらその中間に分類されるものかもしれません。
シンボルをエラーシンボルとするために、シンボルは親コンディションをとるdefine-error
で定義されなければなりません。この親は、この種のエラーが属するコンディションを定義します。親の推移的な集合は、常にそのエラーシンボルと、シンボルerror
を含みます。quitはエラーと判断されないので、quit
の親の集合は、単なる(quit)
です。
親のコンディションに加えて、エラーシンボルはメッセージ(message)をもち、これは処理されないエラーがシグナルされたときプリントされる文字列です。そのメッセージが有効でない場合、エラーメッセージ‘peculiar error’が使用されます。Definition of signalを参照してください。
内部的には、親の集合はエラーシンボルのerror-conditions
プロパティーに格納され、メッセージはエラーシンボルのerror-message
プロパティーに格納されます。
以下は、新しいエラーシンボルnew-error
を定義する例です:
(define-error 'new-error "A new error" 'my-own-errors)
このエラーは複数のコンディション名 —
もっとも狭義の分類new-error
、より広義の分類を想定するmy-own-errors
、およびmy-own-errors
のコンディションすべてを含むerror
で、これはすべての中でもっとも広義なものです。
エラー文字列は大文字で開始されるべきですが、ピリオドで終了すべきではありません。これはEmacsの他の部分との整合性のためです。
もちろんEmacs自身がnew-error
をシグナルすることはありません。あなたのコード内で明示的にsignal
(Definition of signalを参照してください)を呼び出すことにより、これを行なうことができるのです。
(signal 'new-error '(x y)) error→ A new error: x, y
このエラーは、エラーの任意のコンディション名により処理することができます。以下の例は、new-error
とクラスmy-own-errors
内の他の任意のエラーを処理します:
(condition-case foo (bar nil t) (my-own-errors nil))
エラーが分類される有効な方法は、コンディション名による方法で、その名前はハンドラーのエラーのマッチに使用されます。エラーシンボルは、意図されたエラーメッセージと、コンディション名のリストを指定する便利な方法であるという役割だけです。1つのエラーシンボルではなく、コンディション名のリストをsignal
に与えるのは、面倒でしょう。
対照的に、コンディション名を伴わずにエラーシンボルだけを使用した場合、それはcondition-case
の効果を著しく減少させるでしょう。コンディション名は、エラーハンドラーを記述するとき、一般性のさまざまなレベルにおいて、エラーをカテゴリー分けすることを可能にします。エラーシンボルを単独で使用することは、もっとも狭義なレベルの分類を除くすべてを捨てることです。
主要なエラーシンボルと、それらのコンディションについては、Standard Errorsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
unwind-protect
構成は、データ構造を一時的に不整合な状態に置くときは、重要です。これはエラーやthrouのイベントにより、再びデータを整合された状態にすることができます(バッファー内容の変更だけに使用される、他のクリーンアップ構成は、アトミックな変更グループです。Atomic Change Groupsを参照してください)。
unwind-protect
は、制御がbody-formを離れる場合に、cleanup-formsが評価されるという保証の下、なにが起こった可に関わらず、body-formを実行します。body-formは通常どおり完了するかもしれず、unwind-protect
の外でthrow
が実行されたり、エラーが発生するかもしれませんが、cleanup-formsは評価されます。
body-formが正常に終了した場合、unwind-protect
はcleanup-formsを評価した後で、body-formの値をreturnします。body-formが終了しなかった場合、unwind-protect
は通常の意味における値は、returnしません。
unwind-protect
により保護されるのは、body-formだけです。cleanup-forms自体の任意のフォームが、(throw
またはエラーにより)非ローカルにexitした場合、unwind-protect
は残りのフォームが評価されることを保証しません。cleanup-formsの中の1つが失敗することが問題となる場合は、そのフォームの周囲に他のunwind-protect
を配して保護します。
現在アクティブなunwind-protect
フォーム数と、ローカルの変数バインディング数の和は、max-specpdl-size
(Local Variablesを参照してください)により制限されます。
たとえば、以下は一時的な使用のために不可視のバッファーを作成して、終了する前に確実にそのバッファーをkillする例です:
(let ((buffer (get-buffer-create " *temp*"))) (with-current-buffer buffer (unwind-protect body-form (kill-buffer buffer))))
(kill-buffer
(current-buffer))
のように記述して、変数buffer
を使用せずに、同様のことを行えると思うかもしれません。しかし上の例は、別のバッファーにスイッチしたときにbody-formでエラーが発生した場合、より安全なのです(一時的なバッファーをkillするとき、そのバッファーがカレントとなることを確実にするために、かわりにbody-formの周囲にsave-current-buffer
を記述することもできます)。
Emacsには、上のコードとおおよそ等しいコードに展開される、with-temp-buffer
という標準マクロが含まれます(Current
Bufferを参照してください)。このマニュアル中で定義されるいくつかのマクロは、この方法でunwind-protect
を使用します。
以下は、FTPパッケージ由来の、実際の例です。これは、リモートマシンへの接続の確立を試みるために、プロセス(Processesを参照してください)を作成します。関数ftp-login
は、関数のライター(writer)が予想できないことによる多くの問題から非常に影響を受けるので、失敗イベントでプロセスの削除を保証するフォームで保護されています。そうしないと、Emacsは無用なサブプロセスで一杯になってしまうでしょう。
(let ((win nil)) (unwind-protect (progn (setq process (ftp-setup-buffer host file)) (if (setq win (ftp-login process host user password)) (message "Logged in") (error "Ftp login failed"))) (or win (and process (delete-process process)))))
この例には小さなバグがあります。ユーザーがquitするためにC-gとタイプした場合、関数ftp-setup-buffer
がreturnした後、即座にquitが発生しますが、それは変数process
がセットされる前なので、そのプロセスはkillされないでしょう。このバグを簡単に訂正する方法はありませんが、少なくともこれは非常に稀なことだと言えます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数(variable)とは、プログラム内で値を表すために使用される名前です。Lispでは、変数はそれぞれLispシンボルとして表されます(Symbolsを参照してください)。変数名は単にそのシンボルの名前であり、変数の値はそのシンボルの値セル(value cell)に格納されます6。Symbol Componentsを参照してください。Emacs Lispでは、シンボルを変数として使用することは、同じシンボルを関数名として使用することと関係ありません。
このマニュアル中で前に記したとおり、Lispプログラムはまず第1にLispオブジェクトとして表され、副次的にテキストとして表現されます。Lispプログラムのテキスト的な形式は、そのプログラムを構成するLispオブジェクトの入力構文により与えられます。したがって、Lispプログラム内の変数のテキスト的な形式は、その変数を表すシンボルの入力構文を使用して記述されます。
11.1 Global Variables | どの場所でも永続的に存在する変数の値。 | |
11.2 Variables that Never Change | 変更されることのない値を持つ、ある種の"変数"。 | |
11.3 Local Variables | 一時的にのみ存在する存在する変数の値。 | |
11.4 When a Variable is “Void” | 値を持たないシンボル。 | |
11.5 Defining Global Variables | シンボルが変数として使用されていることを宣言する定義。 | |
11.6 Tips for Defining Variables Robustly | 変数を定義するときに考慮すべき事項。 | |
11.7 Accessing Variable Values | 実行時に判明する名前をもつ変数の値を確認する。 | |
11.8 Setting Variable Values | 変数に新しい値を格納する。 | |
11.9 Scoping Rules for Variable Bindings | Lispがローカル値とグローバル値を選択する方法。 | |
11.10 Buffer-Local Variables | 1つのバッファーないだけで効果をもつ変数の値。 | |
11.11 File Local Variables | ファイル内にリストされたローカル変数の処理。 | |
11.12 Directory Local Variables | ディレクトリー内のすべてのファイルで共通のローカル変数。 | |
11.13 Variable Aliases | 他の変数のエイリアスとなる変数。 | |
11.14 Variables with Restricted Values | 任意のLispオブジェクトを値とすることができない、定数ではない変数。 | |
11.15 Generalized Variables | 変数の概念の拡張。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数を使用するための一番シンプルな方法は、グローバル(globally)に使用する方法です。これは、ある時点でその変数はただ1つの値をもち、その値が(少なくともその時点では)Lispシステム全体で効果をもつことを意味します。あらたな値を指定するまで、その値が効果をもちます。新しい値で古い値を置き換えるとき、古い値を追跡する情報は変数内に残りません。
シンボルの値はsetq
で指定します。たとえば、
(setq x '(a b))
これは、変数x
に値(a
b)
を与えます。setq
はスペシャルフォームであることに注意してください。これは1番目の引数(変数の名前)は評価しませんが、2番目の引数(新しい値)は評価します。
変数が1度値をもつと、そのシンボル自身を式として使用することにより、参照することができます。したがって、
x ⇒ (a b)
これは上記のsetq
フォームが実行された場合です。
同じ変数を再びセットした場合、新しい値は古い値を置き換えます:
x ⇒ (a b)
(setq x 4) ⇒ 4
x ⇒ 4
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispでは、特定のシンボルは、通常は自分自身に評価されます。これらのシンボルにはnil
とt
、同様に名前が‘:’で始まる任意のシンボル(これらはキーワードと呼ばれます)が含まれます。これらのシンボルは、リバインドや、値の変更はできません。nil
やt
へのセットやリバインドは、setting-constant
エラーをシグナルします。これはキーワード(名前が‘:’で始まるシンボル)についても当てはまります。ただしキーワードが標準のobarrayにinternされている場合、そのようなシンボルを自分自身にセットしてもエラーになりません。
nil ≡ 'nil ⇒ nil
(setq nil 500) error→ Attempt to set constant symbol: nil
この関数は、objectが‘:’で始まる名前のシンボルで、標準のobarrayにinternされているの場合はt
、それ以外はnil
をreturnします。
これらの定数はスペシャルフォームdefconst
(Defining Global Variablesを参照してください)を使用して定義された“定数(constant)”とは、根本的に異なります。defconst
フォームは、人間の読み手に値の変更を意図しない変数であることを知らせる役目は果たしますが、実際にそれを変更しても、Emacsはエラーを起こしません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
グローバル変数は、新しい値で明示的に置き換えるまで値が持続します。変数にローカル値(local value) — Lispプログラム内の特定の部分で効果をもつを与えると便利なときがあります。変数がローカル値をもつとき、わたしたちは変数がその値にローカルにバインド(locally bound)と言い、その変数をローカル変数(local variable)と呼びます。
たとえば、関数が呼び出されるとき、関数の引数となる変数はローカル値(その関数の呼び出しにおいて実際の引数に与えられた値)を受け取ります。これらのローカルバインディングは、その関数のbody内で効果をもちます。他にも、たとえばスペシャルフォームlet
は特定の変数にたいして明示的にローカルなバインディングを確立し、これはlet
フォームのbody内で効果を持ちます。
これにたいしてグローバルなバインディング(global binding)とは、(概念的には)グローバルな値が保持される場所です。
ローカルバインディングを確立すると、その変数の以前の値は他の場所に保存されます(または失われます)。わたしたちはこれを、以前の値がシャドーされた(shadowed)と言います。シャドーはグローバル変数とローカル変数の両方で発生し得ます。ローカルバインディングが効果を持つとき、ローカル変数にsetq
を使用することにより、ローカルバインディングに指定された値を格納します。ローカルバインディングが効果を持たなくなったとき、以前にシャドーされた値が復元されます(または失われます)。
変数は同時に複数のローカルバインディングを持つことができます(たとえばその変数をバインドするネストされたlet
)。カレントバインディング(current
binding)とは、実際に効果を持つローカルバインディングのことです。カレントバインディングは、その変数の評価によりreturnされる値を決定し、setq
により影響を受けるバインディングです。
ほとんどの用途において、“最内(innermost)”のローカルバインディング、ローカルバインディングがないときはグローバルバインディングを、カレントバインディングと考えることができます。より正確に言うと、スコープルール(scoping rule)と呼ばれるルールは、プログラム内でローカルバインディングが効果を持つ任意の与えられた場所を決定します。Emacs Lispのスコープルールはダイナミックスコープ(dynamic scoping)と呼ばれ、これは単に実行中のプログラム内の与えられた位置でのカレントバインディングを示し、その変数がまだ存在する場合は、その変数にたいしてもっとも最近作成されたバインディングです。ダイナミックスコープについての詳細と、その代替であるレキシカルスコープ(lexical scoping)と呼ばれるスコープルールについては、Scoping Rules for Variable Bindingsを参照してください。
スペシャルフォームlet
およびlet*
は、ローカルバインディングを作成するために存在します:
このスペシャルフォームは、bindingsにより指定される特定の変数セットにたいするローカルバインディングをセットアップしてから、formsのすべてをテキスト順に評価します。これはforms内の最後のフォームの値をreturnします。
bindingsの各バインディングは2つの形式のどちらかです。(i)
シンボルの場合。この場合、そのシンボルはnil
にローカルにバインドされます。(ii)
フォーム(symbol
value-form)
のリストの場合。この場合symbolはvalue-formを評価した結果にローカルにバインドされます。value-formが省略された場合は、nil
が使用されます。
bindings内のすべてのvalue-formは、シンボルがそれらにバインドされる前に、記述された順番に評価されます。以下は例では、z
はy
の新しい場合(つまり1)にではなく、古い値(つまり2)にバインドされます。
(setq y 2) ⇒ 2
(let ((y 1) (z y)) (list y z)) ⇒ (1 2)
このスペシャルフォームはlet
と似ていますが、次の変数値にたいするローカル値を計算する前に、ローカル値を計算してそれを変数にバインドします。したがて、bindings内の式は、このlet*
フォーム内の前のシンボルのバインドを参照できます。以下の例を、上記let
の例と比較してください。
(setq y 2) ⇒ 2
(let* ((y 1)
(z y)) ; y
の値に今計算されたばかりの値を使用する。
(list y z))
⇒ (1 1)
以下は、ローカルバインディングを作成する、他の機能のリストです:
変数はバッファーローカルなバインディングを持つこともできます(Buffer-Local Variablesを参照してください)。数は多くありませんが、端末ローカル(terminal-local)なバインディングをもつ変数もあります(Multiple Terminalsを参照してください)これらの種類のバインディングは、通常のローカルバインディングのように機能することもありますが、これらはEmacs内の“どこ”であるかに依存してローカライズされます。
この変数は、ローカルな変数バインディングと、unwind-protect
にゆるクリーンアップ(Cleaning Up from Nonlocal
Exitsの総数にたいする制限を定義し、この変数を越えるとEmacsはエラー(データに関するエラー"Variable binding
depth exceeds max-specpdl-size"
)をシグナルします。
このリミットは、もし超過したときにエラーが関連付けられている場合には、誤って定義された関数による無限再起を避けるための1つの方法になります。ネストの深さにたいする他の制限としては、max-lisp-eval-depth
があります。Evalを参照してください。
デフォルト値は1300です。Lispデバッガーのエントリーしたとき、もし残りが少ないときは、デバッガーを実行するための空きを作るために、値は増加されます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボルの値セル(Symbol Componentsを参照してください)に値が割り当てられていない場合、その変数はvoid(空)であると言います。
Emacs Lispのデフォルトであるダイナミックスコープルール(see section Scoping Rules for Variable Bindings)の下では、値セルはその変数のカレント値(ローカルまたはグローバル)を保持します。値が割り当てられていない値セルは、値セルにnil
をもつのとは異なることに注意してください。シンボルnil
はLispオブジェクトであり、他のオブジェクトと同様に変数の値となることができます。nil
は値なのです。変数がvoidの場合、その変数の評価を試みると、値をreturnするかわりに、void-variable
エラーがシグナルされます。
オプションであるレキシカルスコープルール(lexical scoping rule)の下では、値セル保持できるのは、その変数のグローバル値 — 任意のレキシカルバインディング構造の外側の値だけです。変数がレキシカルにバインドされている場合、ローカル値はそのレキシカル環境により決定されます。したがって、これらのシンボルの値セルに値が割り当てられていなくても、変数はローカル値を持つことができます。
この関数は、symbolの値セルを空にして、その変数をvoidにします。この関数はsymbolをreturnします。
symbolがダイナミックなローカルバインディングを持つ場合、makunbound
はカレントのバインディングをvoidにし、そのローカルバインディングが効果を持つ限りvoidにします。その後、前にシャドーされたローカル値(またはグローバル値)が再び有効になり、再び有効になった値がvoidでなければ、その変数はvoidでなくなります。
いくつか例を示します(ダイナミックバインディングが有効だとします):
(setq x 1) ; グローバルバインディングに値をセットする。 ⇒ 1 (let ((x 2)) ; それをローカルにバインドする。 (makunbound 'x) ; ローカルバインディングをvoidにする。 x) error→ Symbol's value as variable is void: x
x ; グローバルバインディングは変更されない。 ⇒ 1 (let ((x 2)) ; ローカルにバインドする。 (let ((x 3)) ; もう1度。 (makunbound 'x) ; 最内のローカルバインディングをvoidにする。 x)) ; それを参照すると、void。 error→ Symbol's value as variable is void: x
(let ((x 2))
(let ((x 3))
(makunbound 'x)) ; 内側のバインディングをvoidにしてから取り除く。
x) ; 外側のlet
バインディングが有効になる。
⇒ 2
この関数はvariable(シンボル)がvoidでなければt
をreturnし、voidのときはnil
をreturnします。
いくつか例を示します(ダイナミックバインディングが有効だとします):
(boundp 'abracadabra) ; 最初はvoid。
⇒ nil
(let ((abracadabra 5)) ; ローカルにバインドする。
(boundp 'abracadabra))
⇒ t
(boundp 'abracadabra) ; グローバルではまだvoid。
⇒ nil
(setq abracadabra 5) ; グローバルで非voidにする。
⇒ 5
(boundp 'abracadabra) ⇒ t
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数定義(variable
definition)とは、そのシンボルをグローバル変数として使用する意図を表明する構成です。これには以下で説明するスペシャルフォームdefvar
やdefconst
が使用されます。
変数宣言は3つの目的をもちます。1番目は、コードを読む人にたいして、そのシンボルが特定の方法(変数として)使用されることを意図したものだと知らせることです。2番目は、Lispシステムにたいして、オプションで初期値とドキュメント文字列を与えて、これを知らせることです。3番目は、etags
のようなプログラミングツールにたいして、その変数が定義されている場所を見つけられるように、情報を提供することです。
defconst
とdefvar
の違いは主に、人間の読み手に、値が変更されるかどうかを知らせることにあります。Emacs
Lispは実際、defconst
で定義された変数の値の変更を妨げません。この2つのフォームの特筆すべき違いは、defconst
は無条件で変数を初期化し、defvar
は変数が元々voidのときだけ初期化することです。
マスタマイズ可能な変数を定義する場合は、defcustom
を使用するべきです(これはサブルーチンとしてdefvar
を呼び出します)。Defining Customization Variablesを参照してください。
このスペシャルフォームは、変数としてsymbolを定義します。symbolは評価されないことに注意してください。シンボルはdefvar
フォーム内に明示的に表記して定義される必要があります。この変数は特別だとマークされ、これは常にそれがダイナミックにバインドされることを意味します(Scoping Rules for Variable Bindingsを参照してください)。
valueが指定されていてsymbolがvoid(たとえばこのシンボルがダイナミックにバインドされた値を持たないとき。When a Variable is “Void”を参照してください)、valueが評価されて、その結果がsymbolにセットされます。しかしsymbolがvoidでな場合、valueは評価されず、symbolの値は変更されません。valueが省略された場合、いかなる場合もsymbolの値は変更されません。
symbolがカレントバッファー内でバッファーローカルなバインディングをもつ場合、defvar
はデフォルト値に作用します。デフォルト値はバッファーローカルなバインディングではなく、バッファーにたいして独立しています。デフォルト値がvoidのときはデフォルト値をセットします。Buffer-Local Variablesを参照してください。
すでにsymbolがレキシカルにバインドされている場合(たとえばレキシカルバインドが有効な状態でlet
フォーム内にdefvar
があるような場合)、defvar
はダイナミックな値をセットします。バインディング構造を抜けるまで、レキシカルバインディングは効果をもちます。Scoping Rules for Variable Bindingsを参照してください。
Emacs
Lispモード(eval-defun
)でトップレベルのdefvar
を評価するとき、eval-defun
の特別な機能は、その値がvoidであるかテストすることなく、その変数を無条件にセットします。
引数doc-stringが与えられた場合、それは変数にたいするドキュメント文字列を指定します(そのシンボルのvariable-documentation
プロパティーに格納されます)。Documentationを参照してください。
以下にいくつか例を示します。これはfoo
を定義しますが、初期化は行いません:
(defvar foo) ⇒ foo
この例はbar
の値を23
に初期化して、ドキュメント文字列を与えます:
(defvar bar 23 "The normal weight of a bar.") ⇒ bar
defvar
フォームはsymbolをreturnしますが、通常これは値が問題にならないファイル内のトップレベルで使用されます。
このスペシャルフォームは、ある値としてsymbolを定義して、それを初期化します。これはコードを読む人に、symbolがここで設定される標準的なグローバル値をもち、ユーザーや他のプログラムがそれを変更すべきではないことを知らせます。symbolは評価されないことに注意してください。このシンボルは、defconst
内に明示的に記されなければなりません。
defvar
と同様、defconst
は、変数を特別 —
この変数が常にダイナミックにバインドされているという意味 — だとマークします(Scoping Rules for Variable Bindingsを参照してください)。加えて、これはその変数を危険であるとマークします(File Local Variablesを参照してください)。
defconst
は常にvalueを評価して、その結果をsymbolの値にセットします。カレントバッファー内でsymbolがバッファーローカルなバインディングをもつ場合、defconst
はデフォルト値ではなく、バッファーローカルな値をセットします(しかし、defconst
で定義されたシンボルにたいしてバッファーローカルなバインディングを作るべきではありません)。
defconst
の使い方の例は、Emacsのfloat-pi
— (たとえIndiana State
Legislatureが何を試みようと)何者かにより変更されるべきではない、数学定数piにたいする定義です。しかし2番目のdefconst
の例のように、これは単にアドバイス的なものです。
(defconst float-pi 3.141592653589793 "The value of Pi.") ⇒ float-pi
(setq float-pi 3) ⇒ float-pi
float-pi ⇒ 3
警告:
変数がローカルバインディングをもつとき(let
により作成された、または関数の引数の場合)に、スペシャルフォームdefconst
またはdefvar
を使用すると、これらのフォームはグローバルバインディングではなく、ローカルバインディングをセットします。これは通常、あなたが望むことではないはずです。これを防ぐには、これらのスペシャルフォームをファイル内のトップレベルで使用します。この場所は通常、何のローカルバインディングも効果をもたないので、その変数にたいするローカルバインディングが作成される前にファイルがロードされることが確実だからです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
値が関数(または関数のリスト)であるような変数を定義するとき、変数の名前の最後に‘-function’(または‘-functions’)を使います。
他にも、変数名に関する慣習があります。以下はその完全なリストです:
変数はノーマルフックです(Hooksを参照してください)。
値は関数です。
値は関数のリストです。
値はフォーム(式)です。
値はフォーム(式)のリストです。
値は述語(predicate) — 1つの引数をとる関数 —
で、引数が“正しい(good)”"場合は非nil
、“正しくない(bad)”場合はnil
をreturnします。
nil
か、そうでないかだけが意味をもつような値です。そのような変数は結局、やがては多くの値をもつことが多いので、この慣習を強く推奨はしません。
値はプログラム名です。
値は完全なシェルコマンドです。
値はコマンドにたいして指定するオプションです。
変数を定義するときは、その変数を“安全(safe)”とマークすべきか、それとも“危険(risky)”とマークすべきかを常に考慮してください。File Local Variablesを参照してください。
複雑な値を保持する変数(バインディングをもつkeymapなど)を定義、または初期化するとき、以下のように値の計算をすべてdefvar
の中に配置するのが最良です:
(defvar my-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-c\C-a" 'my-command) … map) docstring)
この方法にはいくつかの利点があります。1つ目は、ファールをロード中にユーザーが中断した場合、変数はまだ初期化されていないか、初期化されているかのどちらかで、その中間ということはありません。まだ初期化されていない場合、ファイルをリロードすれば正しく初期化されます。2つ目は、1度初期化された変数は、ファイルをリロードしても変更されないことです。コンテンツの一部を変更(たとえばキーのリバインド)するフックをユーザーが実行した場合などに、これは重要です。3つ目は、C-M-xでdefvar
を評価すると、そのマップは完全に再初期化されることです。
defvar
フォーム内に多すぎるコードを配置することには不利な点が1つあります。ドキュメント文字列が変数の名前から離れた場所に配置されることです。これを避ける安全な方法は以下の方法です:
(defvar my-mode-map nil docstring) (unless my-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-c\C-a" 'my-command) … (setq my-mode-map map)))
これは初期化をdefvar
の内側に配置した場合とまったく同じ利点をもちますが、変数を再度初期化したい場合は、各フォームにたいして1回ずつ、2度C-M-xをタイプしなければならない点が異なります。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数を参照する通常の方法は、それに名前をつけるシンボルを記述する方法です。The usual way to reference a variable is to write the symbol which names it. Symbol Formsを参照してください。
時には、実行時にのみ決定される変数を参照したいときがあるかもしれません。そのような場合、プログラム中のテキストで、変数名を指定することはできません。その値を抽出するために、symbol-value
を使うことができます。
この関数は、symbolの値セルに格納された値をreturnします。これには、その変数の(ダイナミックな)カレント値が格納された場所です。その変数がローカルバインディングをもたない場合は、単にその変数のグローバル値になります。変数がvoidの場合、void-variable
はエラーをシグナルします。
その変数がレキシカルにバインドされている場合、symbol-value
により報告される値は、その変数のレキシカル値と同じである必要はありません。レキシカル値はそのシンボルの値セルではなく、レキシカル環境により決定されます。Scoping Rules for Variable Bindingsを参照してください。
(setq abracadabra 5) ⇒ 5
(setq foo 9) ⇒ 9
;; ここでシンボルabracadabra
は
;; 値がテストされるシンボル。
(let ((abracadabra 'foo))
(symbol-value 'abracadabra))
⇒ foo
;; ここでは、abracadabra
の値、 ;; つまりfoo
が、 ;; 値をテストされるシンボル。 (let ((abracadabra 'foo)) (symbol-value abracadabra)) ⇒ 9
(symbol-value 'abracadabra) ⇒ 5
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ある変数の値を変更する通常の方法は、スペシャルフォームsetq
を使用する方法です。実行時に変数選択を計算する必要がある場合は、関数set
を使用します。
このスペシャルフォームは、変数の値を変更するための、もっとも一般的な方法です。symbolにはそれぞれ、新しい値(対応するformが評価された結果)を与えられます。そのシンボルのカレントバインディングは変更されます。
setq
はsymbolを評価せず、記述されたシンボルをセットします。この引数のことを、自動的にクォートされた(automatically
quoted)と呼びます。setq
の‘q’は、“quoted(クォートされた)”が由来です。
setq
フォームの値は、最後のformの値となります。
(setq x (1+ 2)) ⇒ 3
x ; ここでx
はグローバル値をもつ。
⇒ 3
(let ((x 5))
(setq x 6) ; x
のローカルバインディングをセット。
x)
⇒ 6
x ; グローバル値は変更されない。
⇒ 3
1番目のformが評価されてから1番目のsymbolがセットされ、次に2番目のformが評価されてからsymbolが評価されて、...となることに注意してください:
(setq x 10 ; ここで、x
がセットされるのは y (1+ x)) ;y
の計算前であることに注目。 ⇒ 11
この関数は、symbolの値セルにvalueを配置します。これはスペシャルフォームではなく関数なので、シンボルにセットするために、symbolに記述された式は評価されます。return値はvalueです。
ダイナミックな変数バインドが有効な場合(デフォルト)、set
は自身の引数symbolを評価しますが、setq
は評価しないという点を除き、set
はsetq
と同じ効果をもちます。しかし、変数がレキシカルバインドの場合、set
は変数のダイナミックな値に影響し、setq
は変数のカレント値(レキシカル値)に影響します。Scoping Rules for Variable Bindingsを参照してください。
(set one 1) error→ Symbol's value as variable is void: one
(set 'one 1) ⇒ 1
(set 'two 'one) ⇒ one
(set two 2) ; two
は、シンボルone
に評価される。
⇒ 2
one ; したがってone
がセットされる。 ⇒ 2 (let ((one 1)) ;one
のこのバインディングがセットされるのであって (set 'one 3) ; グローバル値はセットされない。 one) ⇒ 3
one ⇒ 2
symbolが実際のシンボルでない場合、wrong-type-argument
エラーがシグナルされます。
(set '(x y) 'z) error→ Wrong type argument: symbolp, (x y)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ある変数にたいするローカルバインディングを作成するとき、そのバインディングはプログラムの限られた一部だけに効果をもちます(see section Local Variables)。このセクションでは、これが正確には何を意味するかについて説明します。
ローカルバインディングはそれぞれ、個別にスコープ(scope: 範囲という意味)とエクステント(extent: これも範囲を意味する)をもちます。スコープは、そのバインディングにアクセスできるのが、テキストのソースコードのどこ(where)であるかを示します。エクステントは、プログラムの実行中に、そのバインディングが存在するのがいつ(when)であるかを示します。
デフォルトでは、Emacsが作成したローカルバインディングは、ダイナミックバインディング(dynamic
binding)です。このようなバインディングは、ダイナミックスコープ(dynamic
scope)をもち、それはプログラムの任意の範囲が、その変数バインディングにアクセスするかもしれないことを意味します。これはダイナミックエクステント(dynamic
extent)ももちます。これはそのバインディング構造(let
フォームのbodyなど)が実行される間だけ、そのバインディングが存続することを意味します。
Emacsはオプションでレキシカルバインディング(lexical binding)を作成することができます。レキシカルバインディングはレキシカルスコープ(lexical scope)をもち、これはその変数にたいする任意の参照が、バインディング構造内にテキスト的に配置されなければならないことを意味します7。レキシカルバインディングは不定エクステント(indefinite extent)ももちます。これは、ある状況下において、クロージャー(closures)と呼ばれるスペシャルオブジェクトにより、バインディング構造が実行を終えた後でさえも、存続を続けることを意味します。
以降のサブセクションでは、ダイナミックバインディングとレキシカルバインディング、およびEmacs Lispプログラムでレキシカルバインディングを有効にする方法について、より詳細に説明します。
11.9.1 Dynamic Binding | Emacs内でのローカル変数にたいするデフォルトのバインディング。 | |
11.9.2 Proper Use of Dynamic Binding | ダイナミックバインディングによる問題を回避する。 | |
11.9.3 Lexical Binding | ローカル変数にたいする他の種類のバインディング。 | |
11.9.4 Using Lexical Binding | レキシカルバインディングを有効にする方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
デフォルトでは、Emacsにより作成されるローカル変数のバインディングは、ダイナミックバインディングです。ある変数がダイナミックにバインドされていると、Lispプログラムの実行における任意のポイントでのカレントバインディングは、単にそのシンボルにたいしてもっとも最近作成されたダイナミックなローカルバインディングか、そのようなローカルバインディングが存在しない場合はグローバルバインディングになります。
以下の例のように、ダイナミックバインディングはダイナミックスコープとダイナミック<エクステントをもちます:
(defvar x -99) ;x
は初期値として-99を受け取る。 (defun getx () x) ; この関数内では、x
は“自由”に使用される。 (let ((x 1)) ;x
はダイナミックにバインドされている。 (getx)) ⇒ 1 ;;let
フォームが終了した後、 ;;x
は前の値-99にリバートされる。 (getx) ⇒ -99
関数getx
はx
を参照します。defun
構造自体の中にx
にたいするバインディングが存在しないと意味において、これは“自由”な参照です。x
が(ダイナミックに)バインドされているlet
フォーム内からgetx
を呼び出すと、ローカル値(つまり1)が取得されます。しかし、その後let
フォームの外側からgetx
を呼び出すと、グローバル値(つまり-99)が取得されます。
以下は、setq
を使用してダイナミックに変数をバインドする、例をです:
(defvar x -99) ;x
は初期値として-99を受け取る。 (defun addx () (setq x (1+ x))) ;x
に1追加して、新しい値をreturnする。 (let ((x 1)) (addx) (addx)) ⇒ 3 ;addx
を2回呼び出すと、x
に2回追加される。 ;;let
フォームが終了した後、 ;;x
は前の値-99にリバートされる。 (addx) ⇒ -98
Emacs Lispでは、ダイナミックバインディングは、シンプルな方法で実装されています。それぞれのシンボルは、シンボルのカレントのダイナミック値(または値の不在)を指定する値セルをもちます。Symbol Componentsを参照してください。あるシンボルがダイナミックなローカル値を与えられたとき、Emacsは値セルの内容(または値の不在)をスタックに記録し、新しいローカル値を値セルに格納します。バインディング構造が実行を終えたとき、Emacsはスタックから古い値をpopして、値セルにそれを置きます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ダイナミックバインディングは、プログラムにたいしてテキスト的なローカルスコープ内で定義されていない変数を参照することを許す、強力な機能です。しかし、無制限に使用した場合は、プログラムの理解しにくくしてしまうこともあります。このテクニックを使用するために、2つの明解な方法があります:
let
フォームのbodyなどの場所)でそれを使用します。プログラムでこの慣習に一貫してしたがえば、プログラム内の他の場所の同じ変数シンボルの任意の使用が、その変数の値に影響を与えたり、影響を受けることがなくなります。
defvar
、defconst
、defcustom
で変数を定義します。Defining Global Variablesを参照してください。この定義は通常、Emacs
Lispファイル内のトップレベルにあるべきです。この定義には可能な限り、変数の意味と目的を説明するドキュメント文字列を含めるべきです。名前の衝突を避けるように、変数を命名することも行うべきです(Emacs Lisp Coding Conventionsを参照してください)。
その後は、プログラム内のどこか別の場所で、それが何に影響するか確信をもって、変数をバインドすることができます。その変数にどこで出会っても、(たとえば、変数の定義がEmacsにロードされていれば、C-h vコマンドを通じて)定義を参照するのが簡単になります。Name Help in The GNU Emacs Manualを参照してください。
たとえば、case-fold-search
のようなカスタマイズ可能な変数にたいしてローカルバインディングを使用するのは一般的です:
(defun search-for-abc () "Search for the string \"abc\", ignoring case differences." (let ((case-fold-search nil)) (re-search-forward "abc")))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsのバージョン24.1から、オプションの機能としてレキシカルバインディングが導入されました。わたしたちは、この機能の重要さが、将来において重要になることを期待します。レキシカルバインディングは最適化の機会をより広げるので、この機能を使用するプログラムはおそらく、将来のEmacsバージョンで高速に実行されるようになるでしょう。レキシカルバインディングは、わたしたちがEmacsに将来追加したいと考える並列性(concurrency)とも互換をもっています。
レキシカルにバインドされた変数はレキシカルスコープ(lexical scope)をもいます。 これは、その変数にたいする参照は、そのバインディング構造内にテキスト的に配置されなければならないことを意味します。以下は例です (実際にレキシカルバインディングを有功にする方法は、Using Lexical Bindingを参照してください):
(let ((x 1)) ;x
はレキシカルにバインドされる。 (+ x 3)) ⇒ 4 (defun getx () x) ; この関数内では、x
は“自由”に使用される。 (let ((x 1)) ;x
はレキシカルにバインドされる。 (getx)) error→ Symbol's value as variable is void: x
ここでは、x
はグローバル値をもちません。let
フォーム内でレキシカルにバインドされたとき、この変数はlet
のテキスト境界内で使用できます。しかし、このlet
内から呼び出されるgetx
関数からは、getx
の関数定義がlet
フォームの外側にあるので、使用することができません。
レキシカルバインディングが機能する方法を説明します。各バインディング構造は、その構造および構造のローカル値でバインドされるシンボルを指定することにより、レキシカル環境(lexical environment)を定義します。Lispの評価機能(Lisp evaluator)がある変数のカレント値を得たいときは、最初にレキシカル環境内を探します。そこで変数が指定されていなければ、ダイナミック値が格納されるシンボルの値セルを探します。
(内部的には、レキシカル環境はシンボルと値がペアになったalistで、alistの最後の要素はコンスセルではなく、シンボルt
です。そのようなalistは、フォームを評価するためのレキシカル環境を指定するために、eval
関数の2番目の引数として渡すことができます。Evalを参照してください。しかし、ほとんどのEmacs
Lispプログラムは、この方法で直接レキシカル環境を使用するべきではありません。デバッガーのような特化されたプログラムだけが使用すべきです。)
レキシカルバインディングは、不定エクステント(indefinite extent)をもちます。バインディング構造が終了した後でも、そのレキシカル環境はクロージャー(closures)と呼ばれるLispオブジェクト内に“保持”されます。クロージャーは、レキシカルバインディングが有効な、名前つきまたは無名(anonymous)の関数が作成されたときに作成されます。詳細は、Closuresを参照してください。
クロージャーが関数として呼び出されたとき、その関数の定義内のレキシカル変数にたいする任意の参照は、レキシカル環境を維持するために使用されます。以下は例です:
(defvar my-ticker nil) ; クロージャーを格納するために ; この変数を使用する。 (let ((x 0)) ;x
はレキシカルにバインドされる。 (setq my-ticker (lambda () (setq x (1+ x))))) ⇒ (closure ((x . 0) t) () (setq x (1+ x))) (funcall my-ticker) ⇒ 1 (funcall my-ticker) ⇒ 2 (funcall my-ticker) ⇒ 3 x ;x
はグローバル値をもたないことに注意。 error→ Symbol's value as variable is void: x
let
バインディングは、内部に変数x
をもつレキシカル環境を定義し、これは0にローカルにバインドされます。このバインディング構造内で、x
を1層化し、増加された値をreturnするクロージャーを定義しています。このラムダ式は自動的にクロージャーになり、たとえlet
構造を抜けた後でも、その内部ではレキシカル環境が存続します。クロージャーを評価するときは毎回、レキシカル環境内のx
のバインディングが使用され、x
が増加されます。
symbol-value
、boundp
、set
のような関数は、変数のダイナミックバインディング(つまりそのシンボルの値セル)だけを取得(または変更)することに注意してください。defun
(またはdefmacro
)のbody内のコードも、周囲のレキシカル変数は参照できません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispファイルをロードしたり、Lispバッファーを評価するとき、バッファーローカルな変数lexical-binding
が非nil
の場合は、レキシカルバインディングが有効になります:
このバッファーローカルな変数が非nil
の場合、Emacs
Lispファイルおよびバッファーは、ダイナミックバインディングではなくレキシカルバインディングを使用して評価されます(しかし、特別な変数はダイナミックにバインドされたままです。以下を参照してください)。nil
の場合、すべてのローカル変数にたいしてダイナミックバインディングが使用されます。この変数は通常、ファイルローカル変数として、Emacs
Lispファイル全体にたいしてセットされます(File Local Variablesを参照してください)。他のファイルローカル変数などとは異なり、ファイルの最初の行でセットされなければならないことに注意してください。
eval
呼び出しを使用して、Emacs
Lispコードを直接評価するとき、eval
のlexical引数が非nil
の場合は、レキシカルバインディングが有効になります。Evalを参照してください。
レキシカルバインディングが有効な場合でも、特定の変数はダイナミックにバインドされたままです。これらはスペシャル変数(special
variable)と呼ばれます。defvar
、defcustom
、defconst
で定義されたすべての変数は、スペシャル変数です(Defining Global Variablesを参照してください)。その他のすべての変数はレキシカルバインディングの対象になります。
この関数は、symbolがスペシャル変数(つまり変数がdefvar
、defcustom
、defconst
による定義をもつ)の場合は非nil
をreturnします。それ以外では、return値はnil
になります。
関数内での通常の引数としてスペシャル変数を使用することは、推奨されません。レキシカルバインディングモードが有効なときにこれを行うと、不定な動作が起こります(あるときはレキシカルバインディング、またあるときはダイナミックバインディングのように)。
Emacs Lispプログラムをレキシカルバインディングに変換するのは簡単です。最初にEmacs
Lispソースファイルのヘッダー行でlexical-binding
をt
して、ファイルローカル変数を追加します(File Local Variablesを参照してください)。次に、意図せずレキシカルにバインドしてしまわないように、ダイナミックなバインドをもつ必要がある変数が変数定義をもつことを、各変数ごとにチェックします。
どの変数が変数定義をもつ必要があるか見つけるシンプルな方法は、ソースファイルをバイトコンパイルすることです。Byte Compilationを参照してください。let
フォームの外で非スペシャル変数が使用されている場合、バイトコンパイラーは“free
variable”にたいする参照または割り当てについて警告するでしょう。非スペシャル変数がバインドされているが、let
フォーム内で使用されていない場合、バイトコンパイラーは“unused
lexical
variable”に関して警告するでしょう。バイトコンパイラーは、スペシャル変数を関数の引数として使用している場合も、問題を警告します。
(使用されていない変数についての警告を抑制するためには、単に変数名をアンダースコアーで開始します。そうすれば、バイトコンパイラーはこれを、変数が使用されないことを示すと解釈します。)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
グローバルおよびボーカルな変数バインディングは、1つの形式、または別の形式で、ほとんどのプログラミング言語で見つけることができます。しかしEmacsは、1つのバッファーだけに適用されるバッファーローカル(buffer-local)なバインディングの用に、普通にはない種類の変数バインディングもサポートします。ある変数にたいして異なるバッファーごとに別の亜Q体をもつのは、重要なカスタマイズ方法です(変数は端末ごとにローカルなバインディングをもつこともできます。Multiple Terminalsを参照してください)。
11.10.1 Introduction to Buffer-Local Variables | イントロダクションと概念。 | |
11.10.2 Creating and Deleting Buffer-Local Bindings | バッファーローカルなバインディングの作成と削除。 | |
11.10.3 The Default Value of a Buffer-Local Variable | 自身ではバッファーローカルな値をもたないバッファーで参照されるデフォルト値。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーローカル変数は、特定のバッファーに関連づけられた、バッファーローカルなバインディングをもちます。このバインディングは、そのバッファーがカレントのときに効果をもち、カレントでないときは効果がありません。バッファーローカルなバインディングが効力をもつときにその変数をセットした場合、そのバインディングは新しい値をもちますが、他のバインディングは変更されません。これは、バッファーローカルなバインディングを作成したバッファーだけで変更が見えることを意味します。
その変数にたいする特定のバッファーに関連づけられていない通常のバインディングは、デフォルトバインディング(default binding)と呼ばれます。ほとんどの場合、これはグローバルバインディングです。
変数は、あるバッファーではバッファーローカルなバインディングをもつことができ、他のバッファーではもたないことができます。デフォルトバインディングは、その変数にたいして自身のバインディングをもたない、すべてのバッファーで共有されます(これには、新たに作成されたバッファーが含まれます)。ある変数にたいしてバッファーローカルなバインディングをもたないバッファーでその変数をセットすると、デフォルトバインディングがセットされるので、それはデフォルトバインディングを参照するすべてのバッファーで新しい値を見ることができます。
バッファーローカルなバインディングのもっとも一般的な使用は、目はーモードがコマンドの動作を制御するために変数を変更する場合です。たとえばCモードやLispモードは、空行だけがパラグラフの区切りになるように、変数paragraph-start
をセットします。これらのモードは、CモードやLispモードになるようなバッファー内でこの変数をバッファーローカルにすることによりこれを行い、その後そのモードにたいして新しい値をセットします。Major Modesを参照してください。
バッファーローカルなバインディングを作成する通常の方法は、make-local-variable
による方法で、これは通常メジャーモードが使用します。これはカレントバッファーだけに効果があります。その他すべてのバッファー(まだ作成されていないバッファーを含む)は、それらのバッファー自身が明示的にバッファーローカルなバインディングを与えられるまで、デフォルト値の共有を続けます。
変数を自動的にバッファーローカルになるようにマークする、より強力な操作は、make-variable-buffer-local
を呼び出すことにより行われます。これは、たとえその変数がまだ作成されていなくても、変数をすべてのバッファーにたいしてローカルにすると考えることができます。より正確には、変数を自動的にセットすることにより、その変数がカレントバッファーにたいしてローカルでなくても、変数をローカルにする効果があります。すべてのバッファーは最初は通常のようにデフォルト値を共有しますが、この変数をセットすることによりカレントバッファーにたいしてバッファーローカルなバインディングを作成します。新たな値はバッファーローカルなバインディングに格納され、デフォルトバインディングは変更されずに残ります。これは、任意のバッファーでsetq
によりデフォルト値を変更できないことを意味します。変更する唯一の方法は、setq-default
だけです。
警告:
ある変数が1つ以上のバッファーでバッファーローカルなバインディングをもつとき、let
はそのとき効果をもつ変数のバインディングをリバインドします。たとえばq、カレントバッファーがバッファーローカルな値をもつ場合、let
は一時的にそれをリバインドします。効果をもつバッファーローカルなバインディングが存在しない場合、let
はデフォルト値をリバインドします。let
の内部で、別のバインディングが効力をもつ別のバッファーをカレントバッファーにすると、それ以上let
バインディングを参照できなくなります。他のバッファーにいる間にlet
を抜けると、(たとえそれが正しくても)バインディングの解消を見ることはできません。以下にこれを示します:
(setq foo 'g) (set-buffer "a") (make-local-variable 'foo)
(setq foo 'a) (let ((foo 'temp)) ;; foo ⇒ 'temp ; バッファー‘a’内でのletバインディング (set-buffer "b") ;; foo ⇒ 'g ; fooは‘b’にたいしてローカルではないためグローバル値 body…)
foo ⇒ 'g ; exitによりバッファー‘a’のローカル値が復元されるが、 ; バッファー‘b’では見ることができない
(set-buffer "a") ; ローカル値が復元されたことを確認
foo ⇒ 'a
body内のfoo
にたいする参照は、バッファー‘b’のバッファーローカルなバインディングにアクセスすることに注意してください。
あるファイルがローカル変数の値をセットする場合、これらの変数はファイルをvisitするときバッファーローカルな値になります。File Variables in The GNU Emacs Manualを参照してください。
バッファーローカル変数を、端末ローカル(terminal-local)にすることはできません(Multiple Terminalsを参照してください)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数はカレントバッファー内で、variable(シンボル)にたいして、バッファーローカルなバインディングを作成します。他のバッファーは影響を受けません。returnされる値は、variableです。
variableのバッファーローカルな値は最初、以前にvariableがもっていた値と同じ値をもちます。variableがvoidのときは、voidのままです。
;; バッファー‘b1’で行う: (setq foo 5) ; すべてのバッファーに影響する。 ⇒ 5
(make-local-variable 'foo) ; ‘b1’内でローカルになった。
⇒ foo
foo ; 値は変更されない。
⇒ 5
(setq foo 6) ; ‘b1’内で値を変更。
⇒ 6
foo ⇒ 6
;; バッファー‘b2’では、値は変更されていない。
(with-current-buffer "b2"
foo)
⇒ 5
変数をlet
バインディングでバッファーローカルにしても、let
への出入り時の両方で、これを行うバッファーがカレントでない場合は、信頼性がありません。これはlet
がバインディングの種類を区別しないからです。let
はバインディングを作成される変数だけを知るからです。
変数が端末ローカル(Multiple Terminalsを参照してください)の場合、この関数はエラーをシグナルします。そのような変数は、バッファーローカルなバインディングをもつことができません。
警告:
フック変数にたいしてmake-local-variable
を使用しないでください。フック変数は、add-hook
またはremove-hook
のlocal引数を使用した場合、必要に応じて自動的にバッファーローカルになります。
このマクロはカレントバッファー内でvariableにたいしてバッファーローカルなバインディングを作成して、それにバッファーローカルな値valueを与えます。このマクロはmake-local-variable
に続けてsetq
を呼び出すのと同じです。variableはクォートされていないシンボルです。
このコマンドは、variable(シンボル)が自動的にバッファーローカルになるようにマークするので、それ以降にその変数へのセットを試みると、その時点でカレントのバッファーにローカルになります。しばしば混乱を招くmake-local-variable
とは異なり、これが取り消されることはなく、すべてのバッファー内での変数の挙動に影響します。
この機能に特有の欠点は、(let
またはその他のバインディング構造による)変数のバインディングが、その変数にたいするバッファーローカルなバインディングを作成しないことです。(set
またはsetq
による)変数のセットだけは、その変数がカレントバッファーで作成されたlet
スタイルのバインディングをもたないので、ローカルなバインディングを作成します。
variableがデフォルト値をもたない場合、このコマンドの呼び出しはnil
のデフォルト値を与えます。variableがすでにデフォルト値をもつ場合、その値は変更されずに残ります。それ以降にvariableにたいしてmakunbound
を呼び出すと、バッファーローカル値をvoidにして、デフォルト値は影響を受けずに残ります。
return値はvariableです。
警告:
ユーザーオプション変数にたいしては、ユーザーは異なるバッファーにたいして異なるカスタマイズを望むかもしれないので、make-variable-buffer-local
を使うべきだと決め込むべきではありません。ユーザーは、望むなら任意の変数をローカルにできます。それらの選択の余地を残すほうがよいでしょう。
make-variable-buffer-local
を使用すべきときは、複数のバッファーが同じバインディングを共有しないことが自明な場合です。たとえば、バッファーごとに個別な値をもつことに依存するLispプログラム内の内部プロセスにたいして変数が使用されるときは、make-variable-buffer-local
の使用が最善の解決策になるかもしれません。
このマクロはvariableを、初期値valueおよびdocstringの変数として定義して、それを自動的にバッファーローカルとマークします。これはdefvar
の後につづけてmake-variable-buffer-local
を呼び出すのと同じです。variableはクォートされていないシンボルです。
これはvariableがバッファーbuffer(デフォルトはカレントバッファー)内でバッファーローカルのときはt
、それ以外はnil
をreturnします。
これはvariableがバッファーbuffer内でバッファーローカル値をもつか、自動的にバッファーローカルになる場合は、t
をreturnします。それ以外はnil
をreturnします。bufferが省略またはnil
の場合のデフォルトは、カレントバッファーです。
この関数は、バッファーbuffer内の、variable(シンボル)のバッファーローカルなバインディングをreturnします。variableがバッファーbuffer内でバッファーローカルなバインディングをもたない場合は、かわりにvariableのデフォルト値(The Default Value of a Buffer-Local Variable)をreturnします。
この関数はバッファーbuffer内のバッファーローカル変数を表すリストをreturnします(bufferが省略された場合はカレントバッファーが使用されます)。リストの各要素は通常、(sym . val)
という形式をもちます。ここでsymはバッファーローカル変数(シンボル)、valはバッファーローカル値です。しかしbuffer内の、ある変数のバッファーローカルなバインディングがvoidのtきは、その変数に対応するリスト要素は単にsymになります。
(make-local-variable 'foobar) (makunbound 'foobar) (make-local-variable 'bind-me) (setq bind-me 69)
(setq lcl (buffer-local-variables))
;; 最初はすべてのバッファー内でローカルなビルトイン変数:
⇒ ((mark-active . nil)
(buffer-undo-list . nil)
(mode-name . "Fundamental")
…
;; 次にビルトインでないバッファーローカル変数。 ;; This one is buffer-local and void: foobar ;; これはバッファーローカルでvoidではない: (bind-me . 69))
このリスト内のコンスセルのCDRに新たな値を格納しても、その変数のバッファーローカル値は変化しないことに注意してください。
この関数はカレントバッファー内のvariable(シンボル)にたいするバッファーローカルなバインディング(もしあれば)を削除します。その結果として、このバッファー内でvariableのデフォルトバインディングが可視になります。これは通常、variableの値を変更します。デフォルト値は削除されたバッファーローカル値とは異なるのが普通だからです。
セットしたとき自動的にバッファーローカルになる変数のバッファーローカルなバインディングをkillした場合は、これによりカレントバッファーな意でデフォルト値が可視になります。しかし、変数を再度セットすると、その変数にたいするバッファーローカルなバインディングが再作成されます。
kill-local-variable
はvariableをreturnします。
この関数はコマンドです。なぜなら、バッファーローカル変数のインタラクティブな作成が有用な場合があるように、あるバッファーローカル変数のインタラクティブなkillが有用な場合があるからです。
この関数は、“permanent(永続的)”とマークされた変数、およびpermanent-local-hook
プロパティーに非nil
をもつローカルフック関数(Setting Hooks)を除き、カレントバッファーのすべてのバッファーローカルなバインディングを解消します。結果として、そのバッファーはほとんどの変数のデフォルト値を参照するようになります。
この関数は、そのバッファーに関係のあるその他の特定の情報もリセットします。これはローカルキーマップ(local
keymap)をnil
、構文テーブル(syntax
table)を(standard-syntax-table)
の値、大文字小文字テーブル(case
table)を(standard-case-table)
、abbrevテーブル(abbrev
table)をfundamental-mode-abbrev-table
の値にセットします。
この関数が1番最初に行うのは、ノーマルフックchange-major-mode-hook
(以下参照)の実行です。
各メジャーモードコマンドは、Fundamentalモードにスイッチする効果をもち、以前のメジャーモードのほとんどの効果を消去する、この関数を呼び出すことにより開始されます。この関数が処理を行うのを確実にするために、メジャーモードがセットする変数はpermanentとマークすべきではありません。
kill-all-local-variables
returns nil
.
関数kill-all-local-variables
は、何か他のことを行う前に、まずこのノーマルフックを実行します。この関数はメジャーモードにたいして、ユーザーが他のメジャーモードにスイッチした場合に行われる、何か特別なことを準備する方法を与えます。この関数は、ユーザーがメジャーモードを変更した場合に忘れられるべき、バッファー固有のマイナーモードにたいしても有用です。
最善の結果を得るために、この変数をバッファーローカルにすれば、処理が終了したときに消えるので、以降のメジャーモードに干渉しなくなります。Hooksを参照してください。
変数名(シンボル)が非nil
のpermanent-local
プロパティーをもつ場合、バッファーローカル変数はpermanent(永続的)です。そのような変数はkill-all-local-variables
の影響を受けず、したがってメジャーモードの変更によりそれらのローカルバインディングは作成されません。permanentなローカル変数は、ファイルの内容を編集する方法などより、どこから読み込んだファイルか、あるいはどのように保存するかといったことに関連するデータに適しています。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーローカルなバインディングをもつ変数のグローバル値も、デフォルト値(default)値と呼ばれます。なぜなら、その変数にたいしてカレントバッファーも選択されたフレームもバインディングをもたない場合には、その値が常に効果をもつからです。
関数default-value
およびsetq-default
は、カレントバッファーがバッファーローカルなバインディングをもつかどうかに関わらず、その変数のデフォルト値にアクセスまたは変更します。たとえば、ほとんどのバッファーにたいして、paragraph-start
のデフォルトのセッティングを変更するために、setq-default
を使用できます。そして、この変数にたいするバッファーローカルな値をもつCモードやLispモードにいるときでさえ、これは機能します。
スペシャルフォームdefvar
およびdefconst
も、バッファーローカルな値ではなく、(もし変数にセットする場合は)デフォルト値をセットします。
この関数は、symbolのデフォルト値をreturnします。これは、この変数にたいして独自の値をもたないバッファーやフレームから参照される値です。symbolがバッファーローカルでない場合、これはsymbol-value
(Accessing Variable Valuesを参照してください)と同じです。
関数default-boundp
は、symbolのデフォルト値がvoidでないか報告します。(default-boundp
'foo)
がnil
をreturnした場合、(default-value 'foo)
はエラーになります。
default-boundp
はdefault-value
んびたいして、boundp
はsymbol-value
にたいする述語です。
このスペシャルフォームは、各symbolに、対応するformを評価した結果を新たなデフォルト値として与えます。これはsymbolを評価しませんが、formは評価します。setq-default
フォームの値は、最後のformの値です。
カレントバッファーにたいしてsymbolがバッファーローカルでなく、自動的にバッファーローカルにマークされない場合、setq-default
はsetq
と同じ効果をもちます。カレントバッファーにたいしてsymbolがバッファーローカルな場合、これは他のバッファーから参照できる値を変更します(それらのバッファーがバッファーローカルな値をもたない限り)が、それはカレントバッファーから参照される値ではありません。
;; バッファー‘foo’で行う:
(make-local-variable 'buffer-local)
⇒ buffer-local
(setq buffer-local 'value-in-foo) ⇒ value-in-foo
(setq-default buffer-local 'new-default) ⇒ new-default
buffer-local ⇒ value-in-foo
(default-value 'buffer-local) ⇒ new-default
;; (新しい)バッファー‘bar’で行う:
buffer-local
⇒ new-default
(default-value 'buffer-local) ⇒ new-default
(setq buffer-local 'another-default) ⇒ another-default
(default-value 'buffer-local) ⇒ another-default
;; バッファー‘foo’に戻って行う:
buffer-local
⇒ value-in-foo
(default-value 'buffer-local)
⇒ another-default
この関数はsetq-default
と似ていますが、symbolは通常の引数として評価されます。
(set-default (car '(a b c)) 23) ⇒ 23
(default-value 'a) ⇒ 23
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルにローカル変数の値を指定できます。そのファイルをvisitしているバッファー内で、これらの変数にたいしてバッファーローカルなバインディングを作成するために、Emacsはこれらを使用します。ファイルローカル変数の基本的な情報については、Local Variables in Files in The GNU Emacs Manualを参照してください。このセクションはファイルローカル変数が処理される方法に影響する関数と変数を説明します。
ファイルローカル変数が勝手に関数や、後で呼び出されるLisp式を指定できる場合、ファイルのvisitによりEmacsが乗っ取られてしまうかもしれません。Emacsは、指定された値が安全だと既知のファイルローカル変数だけを自動的にセットすることにより、この危険から保護します。これ以外のファイルローカル変数は、ユーザーが同意した場合のみセットされます。
追加の安全策として、Emacsがファイルローカル変数を読み込むとき、一時的にread-circle
がnil
にバインドされます(Input Functionsを参照してください)。これはLispリーダー循環および共有されたLisp構造(Read Syntax for Circular Objectsを参照してください)を認識することを防ぎます。
この変数はファイルローカル変数を処理するかどうかを制御します。以下の値が利用できます:
t
(デフォルト)安全な変数をセットして、安全でない変数については問い合わせます(1回)。
:safe
安全な変数だけをセットして、問い合わせはしません。
:all
問い合わせをせずに、すべての変数をセットします。
nil
変数をセットしません。
すべての変数にたいして問い合わせます(1回)。
これは正規表現のリストです。ファイルがこのリストの要素にマッチする名前をもつ場合、任意のファイルローカル変数のフォームはスキャンされません。どんなときにこれを使いたいかの例は、See section How Emacs Chooses a Major Modeを参照してください。
この関数は、カレントバッファーの内容により指定された任意のローカル変数として、必要に応じてバインドと評価を行います。変数enable-local-variables
は、ここでも効果をもちます。しかし、この関数は‘-*-’行の、‘mode:’ローカル変数を探しません。set-auto-mode
はこれを行い、enable-local-variables
も考慮されます(How Emacs Chooses a Major Modeを参照してください)。
この関数は、file-local-variables-alist
内に格納されたalistを調べて、各ローカル変数を順に適用することにより機能します。この関数は、変数に適用する前(または後)に、before-hack-local-variables-hook
(またはhack-local-variables-hook
)を呼び出します。alistが非nil
の場合のみ、事前のフック(before-hook)を呼び出し、その他のフックは常に呼び出します。この関数は、そのバッファーがすでにもつメジャーモードと同じメジャーモードが指定された場合には、‘mode’要素を無視します。
オプションの引数mode-onlyが非nil
の場合、この関数が行うのはメジャーモードを指定するシンボルをreturnするのがすべてで、‘-*-’行またはローカル変数リストがメジャーモードを指定していればそのモード、それ以外はnil
をreturnします。この関数はモードや他のファイルローカル変数をセットしません。
このバッファーローカルな変数は、ファイルローカル変数のセッティングのalistを保持します。alistの各要素は(var . value)
という形式で、varはローカル変数のシンボル、valueはその値です。Emacsがファイルをvisitするとき、最初にすべてのファイルローカル変数をこのalistに収集して、その後に変数1つずつに関数hack-local-variables
を適用します。
Emacsは、file-local-variables-alist
に格納されたファイルローカル変数を適用する直前に、このフックを呼び出します。
Emacsは、file-local-variables-alist
に格納されたファイルローカル変数を適用し終えた直後に、このフックを呼び出します。
ある変数にたいしてsafe-local-variable
プロパティーにより、安全な値を指定できます。このプロパティーは引数を1つとる関数です。与えられた値にたいして、その関数が非nil
をreturnした場合、その値は安全です。一般的に目にするファイル変数の多くは、safe-local-variable
プロパティーをもちます。これらのファイル変数には、fill-column
、fill-prefix
、indent-tabs-mode
が含まれます。ブーリーン値の変数にたいしては、プロパティーの値にbooleanp
を使用します。
defcustom
を使用してユーザーオプションを定義するとき、defcustom
に引数:safe
function
を追加することにより、safe-local-variable
プロパティーをセットできます(Defining Customization Variablesを参照してください)。
この変数は、ある変数の値が安全であることをマークする、別の方法を提供します。これはコンスセル(var
. val)
のリストで、varは変数名、valはその変数にたいして安全な値です。
Emacsが一連のファイルローカル変数にしたがうかどうかユーザーに尋ねるとき、ユーザーはそれらの変数が安全だとマークすることができます。安全だとマークするとsafe-local-variable-values
にこれらのvariable/valueペアーが追加され、ユーザーのカスタムファイルに保存します。
この関数は、上記の条件に基づき、symに値valを与えても安全な場合は、非nil
をreturnします。
いくつかの変数は危険(risky)だと判断されます。ある変数が危険な場合、その変数が自動的にsafe-local-variable-values
に追加されることはありません。ユーザーがsafe-local-variable-values
を直接カスタマイズすることにより、明示的に値を許さない限り、危険な変数をセットする前にEmacsは常に確認を求めます。
名前が非nil
のrisky-local-variable
プロパティーをもつ任意の変数は、危険だと判断されます。defcustom
を使用してユーザーオプションを定義するとき、defcustom
に引数:risky
value
を追加することにより、ユーザーオプションにrisky-local-variable
プロパティーをセットできます。それに加えて名前が‘-command’、‘-frame-alist’、‘-function’、‘-functions’、‘-hook’、‘-hooks’、‘-form’、‘-forms’、‘-map’、‘-map-alist’、‘-mode-alist’、‘-program’、‘-predicate’で終わる任意の変数は、自動的に危険だと判断されます。後に数字をともなう変数‘font-lock-keywords’および‘font-lock-keywords’、さらに‘font-lock-syntactic-keywords’も危険だと判断されます。
この関数は、symが上記の条件にもとづき危険な変数の場合は、非非nil
をreturnします。
この変数はファイルによりローカル値を与えられるべきではない変数のリストを保持します。これらの変数に指定された任意の値は、完全に無視されます。
‘Eval:’“変数”も抜け道になる可能性があるので、Emacsは通常、それを処理する前に確認を求めます。
この変数は‘-*-’行中、またはvisitされるファイル内のローカル変数リストの、‘Eval:’にたいする処理を制御します。値t
は、無条件に実行することを意味します。nil
は、それらを無視することを意味します。それ以外は、各ファイルにたいして何を行うか、ユーザーに確認を求めることを意味します。デフォルト値は、maybe
です。
この変数は、ファイルローカル変数リスト内の‘Eval:’“変数”の中、評価しても安全な式のリストを保持します。
その式が関数呼び出しで、その関数がsafe-local-eval-function
プロパティーをもつ場合、そのプロパティー値はその式の評価が安全かどうかを決定します。プロパティー値は、その式をテストするための述語(predicate)、そのような述語のリスト(成功した述語があれば安全)、またはt
(引数が定数である限り常に安全)を指定できます。
テキストプロパティーは、それらの値に関数呼び出しを含めることができるので、抜け道になる可能性があります。したがって、Emacsはファイルローカル変数にたいして指定された文字列値から、テキストプロパティーを取り除きます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ディレクトリーは、そのディレクトリー内のすべてのファイルに共通なローカル変数値を指定することができます。Emacsは、そのディレクトリー内の任意のファイルをvisitしているバッファー内で、それらの変数にたいするバッファーローカルなバインディングを作成するために、これを使用します。これは、そのディレクトリー内のファイルが何らかのプロジェクトに属していて、同じローカル変数を共有するときなどに有用です。
ディレクトリーローカル変数を指定するために、2つの異なる方法があります: 1つは特別なファイルにそれを記述する方法、もう1つはそのディレクトリーにプロジェクトクラス(project class)を定義する方法です。
この定数は、Emacsがディレクトリーローカル変数が見つけることができる期待する、ファイルの名前です。ファイル名は、.dir-locals.el8です。ディレクトリー内でその名前をもつファイルにより、Emacsはディレクトリー内の任意のファイル、または任意のサブディレクトリー(オプションでサブディレクトリーを除外できます。以下を参照してください)にセッティングを適用します。独自に.dir-locals.elをもつサブディレクトリーがある場合、Emacsはサブディレクトリーで見つかった1番深いファイルのディレクトリーからディレクトリーツリーを上方に移動しながら、1番深いファイルのセッティングを使用します。このファイルは、ローカル変数をフォーマットされたリストとして指定します。詳細は、Per-directory Local Variables in The GNU Emacs Manualを参照してください。
この関数は.dir-locals.el
ファイルを読み込み、そのディレクトリー内の任意のファイルをvisitしているバッファーにたいしてローカルなfile-local-variables-alist
内に、それらを適用することなくディレクトリーローカル変数を格納します。この関数はディレクトリーローカルなセッティングもdir-locals-class-alist
(.dir-locals.elファイルが見つかったディレクトリーにたいする特別なクラスを定義する)内に格納します。この関数は、以下で説明するように、dir-locals-set-class-variables
およびdir-locals-set-directory-class
を呼び出すことにより機能します。
この関数はディレクトリーローカル変数を探して、即座にそれらをカレントバッファーに適用します。これはDiredバッファーのような、非ファイルバッファーをディレクトリーローカル変数のセッティングにしたがわせるために、モードコマンド呼び出しの中から呼び出されることを意図したものです。非ファイルバッファーにたいしては、Emacsはdefault-directory
と、その親ディレクトリーの中から、ディレクトリーローカル変数を探します。
この関数は、classという名前がつけられたシンボルにたいして、一連の変数セッティングを定義します。その後このクラスを1つ以上のディレクトリーに割り当てることができ、するとEmacsはこれらの変数セッティングを、それらのディレクトリー内のすべてのファイルに適用します。variables内のリストは、2つの形式
— (major-mode . alist)
または(directory
. list)
—
のうち1つをもつことができます。1番目の形式では、そのファイルのバッファーがmajor-modeを継承するモードに切り替わるときに、連想リストalist内のすべての変数が適用されます。alistは、(name
.
value)
という形式です。major-modeにたいする特別な値nil
は、そのセッティングが任意のモードに適用できることを意味します。alist内では、特別なnameとして、subdirs
を使用することができます。連想値がnil
の場合、alistは関連するディレクトリー内のファイルだけに適用され、それらのサブディレクトリーには適用されません。
variablesの2番目の形式では、directoryがそのファイルのディレクトリーの最初のサブディレクトリーの場合、上記のルールにしたがって、listが再帰的に適用されます。listは、この関数のvariablesで指定できる2つの形式のうち、1つを指定します。
この関数はdirectory
およびサブディレクトリー内のすべてのファイルにclassを割り当てます。その後、classにたいして指定されたすべての変数セッティングは、directoryおよびその子ディレクトリー内でvisitされた任意のファイルに適用されます。classは事前にdir-locals-set-class-variables
で定義されていなければなりません。
Emacsは、.dir-locals.el
ファイルからディレクトリー変数をロードするとき、内部的にこの関数を使用します。その場合、オプションの引数mtimeは、ファイルの修正日時(modification
time。file-attributes
によりreturnされる)を保持します。Emacsは、記憶されたローカル変数がまだ有効化チェックするために、この日時を使用します。ファイルを通じ手ではなく直接クラスを割り当てる場合、この引数はnil
になります。
このalistはクラスシンボル(class symbol)と連想変数セッティング(associated variable
settings)を保持します。これはdir-locals-set-class-variables
により更新されます。
このalistはディレクトリー名、それらに割り当てられたクラス名、およびこのエントリーに関連するディレクトリーローカル変数ファイルの修正日時を保持します。関数dir-locals-set-directory-class
は、このlistを更新します。
nil
の場合、ディレクトリーローカル変数は無視されます。この変数は、ファイルローカル変数(File Local Variablesを参照してください)にしたがい、ディレクトリーローカル変数は無視したいモードにたいして有用かもしれません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シノニムとして2つの変数を作成するのが有用なときがあります。2つの変数は常に同じ値をもち、、どちらか一方を変更すると、もう一方も変更されます。変数の名前を変更
— 古い名前はよく考慮して選択されたものではなかった、あるいは変数の意味が部分的に変更された等の理由で —
するとき、互換性のために新しい名前のエイリアス(alias)として古い名前を維持するのが有用なときがあるかもしれません。defvaralias
により、これを行うことができます。
この関数はシンボルbase-variableのエイリアスとして、シンボルnew-aliasを定義します。これはnew-aliasから値を取得すると、base-variableの値がreturnされ、new-aliasの値を変更すると、base-variableの値が変更されることを意味します。エイリアスされた2つの変数名は、常に同じ値と同じバインディングを共有します。
docstring引数が非nil
の場合、それはnew-aliasのドキュメント文字列を指定します。それ以外では、エイリアスは(もしあれば)base-variableと同じドキュメント文字列となります。ただし、それはbase-variable自体がエイリアスではない場合で、エイリアスの場合、new-aliasはエイリアスチェーンの最後の変数のドキュメント文字列になります。
この関数はbase-variableをreturnします。
変数のエイリアスは、変数にたいする古い名前を新しい名前に置き換える、便利な方法です。make-obsolete-variable
は古い名前を陳腐化(obsolete)していると宣言し。それが将来のある時点で削除されるかもしれないことを宣言します。
この関数は、倍とコンパイラーに変数obsolete-nameが陳腐化していると警告させます。current-nameがシンボルの場合、それはこの変数の新たな名前です。その後、obsolete-nameのかわりにcurrent-nameを使用するよう、警告メッセージを伝えます。current-nameが文字列の場合、これはメッセージで、置き換えられる変数はありません。whenは、その変数が最初に陳腐化するのがいつかを示す文字列です(通常はバージョン番号文字列)。
オプションの引数access-typeは、非nil
の場合は陳腐化の警告を引き起こすアクセスの種類を指定します。get
またはset
を指定できます。
2つの変数シノニムを作成して、マクロdefine-obsolete-variable-alias
を使用することにより同時に1つが陳腐化していると宣言できます。
このマクロは変数obsolete-nameが陳腐化しているとマークして、それを変数current-nameにたいするエイリアスにします。これは以下と等価です:
(defvaralias obsolete-name current-name docstring) (make-obsolete-variable obsolete-name current-name when)
この関数は、variableのエイリアスチェーンの最後の変数をreturnします。variableがシンボルでない場合、またはvariableがエイリアスとして定義されていない場合、この関数はvariableをreturnします。
この関数は、シンボルのチェーンがループしているときは、cyclic-variable-indirection
エラーをシグナルします。
(defvaralias 'foo 'bar) (indirect-variable 'foo) ⇒ bar (indirect-variable 'bar) ⇒ bar (setq bar 2) bar ⇒ 2
foo ⇒ 2
(setq foo 0) bar ⇒ 0 foo ⇒ 0
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
通常のLisp変数には、有効なLispオブジェクトである任意の値を割り当てることができます。しかし、LispではなくCで定義されたLisp変数もあります。これらの変数のほとんどは、DEFVAR_LISP
を使用してCコードで定義されています。Lispで定義された変数と同様、これらは任意の値をとることができます。しかし、いくつかの変数はDEFVAR_INT
やDEFVAR_BOOL
を使用して定義されています。C実装の概要的な議論は、Writing Emacs
Primitives、特にタイプsyms_of_filename
の関数の説明を参照してください。
タイプがDEFVAR_BOOL
の変数は、値にnil
かt
しかとることができません。他の値の割り当てを試みると、t
はセットされます:
(let ((display-hourglass 5)) display-hourglass) ⇒ t
この変数は、タイプDEFVAR_BOOL
のすべての変数のリストを保持します。
タイプがDEFVAR_INT
の変数は、整数値だけをとることができます。他の値の割り当てを試みると、結果はエラーになります:
(setq undo-limit 1000.0) error→ Wrong type argument: integerp, 1000.0
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ジェネリック変数(generalized variable: 汎変数)またはplace formは、値が格納されるLispメモリー内の多くの場所のうちの1つです。1番シンプルなplace formは、通常のLisp変数です。しかし、リストのCARとCDR、配列の要素、シンボルのプロパティー、その他多くのロケーション(location)も、Lisp値が格納される場所です。
ジェネリック変数は、C言語の“lvalues(左辺値)”と類似しています。C言語のlvalueでは、‘x =
a[i]’で配列から要素を取得し、同じ表記を使用して、‘a[i] =
x’で要素を格納します。a[i]
のような特定のフォームが、Cではlvalueになれるように、Lispでジェネリック変数になることができる一連のフォームが存在します。
11.15.1 The setf Macro | setf マクロ。
| |
11.15.2 Defining new setf forms | 新たなsetf フォームの定義。
|
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
setf
Macrosetf
マクロは、ジェネリック変数を操作する、もっとも基本的な方法です。setf
フォームはsetq
と似ていますが、シンボルだけでなく、左辺の任意のplace
formを受け入れます。たとえば(setf (car a)
b)
はa
のcarをb
にセットして、(setcar a
b)
と同じ操作を行いますが、すべてのplaceのタイプにセットおよびアクセスするために2つの別個の関数を覚える必要はありません。
このマクロはformを評価して、それをplaceに格納します。placeは有効なジェネリック変数フォームでなければなりません。複数のplace/formペアーがある場合、割り当てはsetq
のときと同様です。setf
は最後のformの値をreturnします。
以下のLispフォームはジェネリック変数として機能するので、setf
のplace引数にすることができます:
(setf x y)
は完全に(setq x
y)
と等しく、厳密に言うとsetq
自体はsetf
が存在するので冗長です。これは純粋にスタイルと歴史的な理由によりますが、多くのプログラマーは依然として単純な変数へのセットにはsetq
の方を好みます。マクロ(setf
x y)
は、実際には(setq x
y)
に展開されるので、コンパイルされたコードでこれを使用することにパフォーマンス的な不利はありません。
aref cddr symbol-function car elt symbol-plist caar get symbol-value cadr gethash cdr nth cdar nthcdr
default-value process-get frame-parameter process-sentinel terminal-parameter window-buffer keymap-parent window-display-table match-data window-dedicated-p overlay-get window-hscroll overlay-start window-parameter overlay-end window-point process-buffer window-start process-filter
どのように処理すれば良いか知られていないplaceフォームを渡した場合、setf
はエラーをシグナルします。
nthcdr
の場合、関数のリスト引数は、それ自体が有効なplaceフォームでなければならないことに注意してください。たとえば、(setf
(nthcdr 0 foo) 7)
は、foo
自体に7をセットするでしょう。
マクロpush
(Modifying List Variablesを参照してください)、およびpop
(Accessing Elements of Listsを参照してください)は、リストだけでなくジェネリック変数を操作できます。(pop
place)
は、place内に格納されたリストの最初の要素を削除してreturnします。これは(prog1
(car place) (setf place (cdr
place)))
と類似していますが、すべてのサブフォームを1度だけ評価します。(push x
place)
は、place内に格納されたリストの1番前に、xを挿入します。これは(setf
place (cons x
place))
と類似していますが、サブフォームの評価を除きます。nthcdr
placeへのpush
およびpop
は、リスト内の任意の位置での挿入および削除に使用できることに注意してください。
cl-libライブラリーは、追加のsetf
placeを含む、ジェネリック変数ニタイスルサマザマナ拡張を定義します。Generalized Variables in Common
Lisp Extensionsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
setf
formsこのセクションでは、setf
が操作できる新たなフォームを定義する方法を説明します。
このマクロは、単純なケースにたいしてsetf
メソッドを簡単に定義することを可能にします。nameは、関数、マクロ、スペシャルフォームの名前です。nameが、それを更新するための対応するsetter関数をもつときは、このマクロを使用できます(たとえば(gv-define-simple-setter
car setcar)
)。
このマクロをフォーム以下の呼び出しを
(setf (name args…) value)
以下のように変換します。
(setter args… value)
setf
のような呼び出しは、valueをreturnするようにドキュメントされます。これに問題はありません。たとえばcar
とsetcar
では、setcar
はそれがセットする値をreturnするからです。setter関数がvalueをreturnしない場合は、gv-define-simple-setter
のfix-return引数に、非nil
値を使用してください。これは以下のようなものに展開されます
(let ((temp value)) (setter args… temp) temp)
これで正しい結果がreturnされることが保証されます。
このマクロは、上述のフォームより複雑なsetf
展開を可能にします。たとえば、呼び出すべきシンプルなsetter関数が存在しないときや、もしそれが存在してもplace
formとは異なる引数を要求する場合には、このフォームを使う必要があるかもしれません。
このマクロは最初にsetf
引数フォーム(value
args…)
をarglistにバインドして、その後bodyを実行することにより、フォーム(setf
(name args…)
value)
を展開します。bodyは割り当てを行うLispフォームをreturnし、最後にセットされた値をreturnするべきです。以下はこのマクロの使用例です:
(gv-define-setter caar (val x) `(setcar (car ,x) ,val))
展開をさらに制御するには、マクロgv-define-expander
を参照してください。マクロgv-letplace
は、setf
のように処理を行うマクロを定義するのに有用です。詳細は、gv.elのソースファイルを参照してください。
Common Lispに関する注意: Common Lispは関数の
setf
、すなわち“setf
関数”の挙動を指定するための別の方法を定義します。setf
関数の名前はシンボルではなく。リスト(setf name)
です。たとえば(defun (setf foo) …)
は、setf
がfoo
に適用されるときに使用される関数を定義します。Emacsはこれをサポートしません。適切な展開が定義されていないフォームにsetf
を使用すると、コンパイル時にエラーとなります。Common Lispでは、関数(setf func)
が後で定義されるので、エラーにはなりません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispプログラムは主にLisp関数で構成されます。このチャプターは、関数とは何か、引数を受け取る方法、関数を定義する方法を説明します。
12.1 What Is a Function? | Lisp関数 vs. プリミティブ; 専門用語。 | |
12.2 Lambda Expressions | 関数がLispオブジェクトとして表現される方法。 | |
12.3 Naming a Function | シンボルは関数を名づける役割を果たすことができる。 | |
12.4 Defining Functions | 関数定義のためのLisp式。 | |
12.5 Calling Functions | 既存の関数を使う方法。 | |
12.6 Mapping Functions | リストの各要素などに関数を適用する。 | |
12.7 Anonymous Functions | ラムダ式、それは無名の関数。 | |
12.8 Accessing Function Cell Contents | シンボルの関数定義へのアクセスとセット。 | |
12.9 Closures | レキシカル環境に囲まれた関数。 | |
12.10 Advising Emacs Lisp Functions | 関数の定義への追加。 | |
12.11 Declaring Functions Obsolete | 関数を陳腐と宣言する。 | |
12.12 Inline Functions | コンパイラーによりインライン展開される関数。 | |
12.13 The declare Form | 関数についての補足的な情報の追加。 | |
12.14 Telling the Compiler that a Function is Defined | 関数が定義されていることをコンパイラーに知らせる。 | |
12.15 Determining whether a Function is Safe to Call | 呼び出しても安全な関数なのか判断する。 | |
12.16 Other Topics Related to Functions | 関数が動作する方法において特別な意味をもつ、特定のLispプリミティブのクロスリファレンス。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
一般的な意味では、関数とは引数(arguments)と呼ばれる与えられた入力値の計算を担うルールです。計算の結果は、その関数の値(value)、またはreturn値(return value)と呼ばれます。計算は、変数の値やデータ構造の内容を変更する等の副作用をもつこともできます。
ほとんどのコンピューター言語では、関数はそれぞれ名前をもちます。しかしLispでは、厳密な意味において、関数は名前をもちません。関数はオブジェクトであり、関数の名前の役割を果たすシンボルに関連づけることができますが(たとえばcar
)、それはオプションです。Naming a Functionを参照してください。関数が名前を与えられたとき、通常はそのシンボルを“関数”として参照します(たとえば、関数car
のように参照します)。このマニュアルでは、関数名と関数オブジェクト自身との間の区別は、通常は重要ではありませんが、それが意味をもつような場合は注記します。
スペシャルフォーム(special form)、マクロ(macro)と呼ばれる、関数likeなオブジェクトがいくつかあり、それらも引数を受け受け、計算を担います。しかし以下で説明するように、Emacs Lispではこれらは関数とは考えられません。
以下は関数および関数likeなオブジェクトにたいする、重要な条件です:
Lispで記述された関数(厳密には関数オブジェクト)です。これらについては、以降のセクションで説明します。 Lambda Expressionsを参照してください。
Lispから呼び出すことができますが、実際にはCで記述されています。プリミティブは、ビルトイン関数(built-in
functions)や、サブルーチン(subr)といった呼ばれかたもします。それらの例には関数likeなcar
やappend
が含まれます。加えて、すべてのスペシャルフォーム(以下参照)もプリミティブと考えられます。
関数はLispの基礎となる部分(たとえばcar
)であり、オペレーティングシステムのサービスにたいして値レベルのインターフェースを与え、高速に実行される必要があるため、通常はプリミティブとして実装されています。Lispで定義された関数とは異なり、プリミティブの修正や追加には、Cソースの変更とEmacsのリコンパイルが必要です。Writing Emacs Primitivesを参照してください。
プリミティブは関数と似ていますが、すべての引数が通常の方法で評価はされません。いくつかの引数だけが評価されるかもしれず、通常ではない順序で、複数回評価されるかもしれません。プリミティブの例には、if
、and
、while
が含まれます。Special Formsを参照してください。
あるLisp式を、オリジナルの式のかわりに評価される別の式に変換する、関数とは別のLispで定義された構造です。マクロは、スペシャルフォームが行う一連のことを、Lispプログラマーが行うのを可能にします。Macrosを参照してください。
command-execute
プリミティブを通じて呼び出すことができるオブジェクトで、通常はそのコマンドにバインドされたキーシーケンスを、ユーザーがタイプすることにより呼び出されます。Interactive Callを参照してください。コマンドは通常、関数です。その関数がLispで記述されている場合は、関数の定義内のinteractive
フォームによりコマンドとなります(Defining Commandsを参照してください)。関数であるコマンドは、他の関数と同様、Lisp式から呼び出すこともできます。
キーボードマクロ(文字列およびベクター)は関数ではありませんが、これらもコマンドです。Keyboard Macrosを参照してください。シンボルの関数セルにコマンドが含まれている場合、わたしたちはそのシンボルをコマンドと言います(Symbol Componentsを参照してください)。そのような名前つきコマンド(named command)は、M-xで呼び出すことができます。
ラムダ式とよく似た関数オブジェクトですが、クロージャーはレキシカル変数バインディングの“環境”にも囲まれています。Closuresを参照してください。
バイトコンパイラーによりコンパイルされた関数です。Byte-Code Function Typeを参照してください。
実際の関数のプレースホルダーです。autoloadオブジェクトが呼び出された場合、Emacsは実際の関数の定義を含むファイルをロードした後、実際の関数を呼び出します。Autoloadを参照してください。
関数functionp
を使用して、あるオブジェクトが関数かどうかテストできます:
この関数はobjectが任意の種類の関数(たとえばfuncall
に渡すことができる)の場合は、t
をreturnします。functionp
は関数を名づけるシンボルにたいしてはt
、スペシャルフォームにたいしてはnil
をreturnすることに注意してください。
functionp
とは異なり、以下の3つの関数は、シンボルをそれの関数定義としては扱いません。
この関数は、objectがビルトイン関数(たとえばLispプリミティブ)の場合は、t
をreturnします。
(subrp 'message) ; message
はシンボルであり、
⇒ nil ; subrオブジェクトではない。
(subrp (symbol-function 'message)) ⇒ t
この関数は、objectがバイトコード関数の場合は、t
をreturnします。たとえば:
(byte-code-function-p (symbol-function 'next-line)) ⇒ t
この関数はプリミティブsubrの引数リストについての情報を提供します。retrun値は、(min
.
max)
というペアーです。minは引数の最小数です。maxは最大数、または引数&rest
を伴う関数にたいしてはシンボルmany
、subrがスペシャルフォームの場合はシンボルunevalled
です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ラムダ式(lambda expression)は、Lispで記述された関数オブジェクトです。以下は例です:
(lambda (x) "Xの双曲線コサインをreturnする。" (* 0.5 (+ (exp x) (exp (- x)))))
Emacs Lispでは、このようなリストは、関数オブジェクトに評価される、有効な式です。
ラムダ式自身は名前をもたない、無名関数(anonymous function)です。ラムダ式をこの方法で使用できますが(Anonymous Functionsを参照してください)、名前付き関数(named functions)を作成するためにシンボルに関連付けられる方が一般的です(see section Naming a Function)。これらの詳細に触れる前に、以下のサブセクションではラムダ式の構成要素と、それらが行うことについて説明します。
12.2.1 Components of a Lambda Expression | ラムダ式のパーツ。 | |
12.2.2 A Simple Lambda Expression Example | シンプルな例。 | |
12.2.3 Other Features of Argument Lists | 引数リストの詳細と特別な機能。 | |
12.2.4 Documentation Strings of Functions | 関数内にドキュメントを記述する方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ラムダ式は、以下のようなリストです:
(lambda (arg-variables…) [documentation-string] [interactive-declaration] body-forms…)
ラムダ式の1番目の要素は常にシンボルlambda
です。これは、そのリストが関数を表すことを示します。lambda
で関数定義を開始する理由は、他の目的のたまえの使用が意図された他のリストが、意図せず関数として評価されないようにするためです。
2番目の要素は、シンボル — 引数変数名のリストです。これはラムダリスト(lambda list)と呼ばれます。Lisp関数が呼び出されたとき、引数値はラムダリスト内の変数と対応付けされます。ラムダリストは、与えられた値にたいするローカルバインディングが付与されます。Local Variablesを参照してください。
ドキュメント文字列(documentation string)はEmacs Lispのヘルプ機能にたいしてその、関数を説明する、関数定義に配されたLisp文字列オブジェクトです。Documentation Strings of Functionsを参照してください。
インタラクティブ宣言(interactive declaration)は、(interactive
code-string)
という形式のリストです。これは、この関数が対話的に使用された場合に引数を提供する方法を宣言します。この宣言をもつ関数は、コマンド(command)と呼ばれます。コマンドはM-xを使用したり、キーにバインドして呼び出すことができます。この方法で呼び出されることを意図しない関数は、インタラクティブ宣言を持つべきではありません。インタラクティブ定義を記述する方法は、See section Defining Commandsを参照してください。
残りの要素は、その関数のbody(本体) — その関数が処理を行うためのLispコード(Lispプログラマーは“評価されるLispフォームのリスト”と言うでしょう)です。この関数からreturnされる値は、bodyの最後の要素によりreturnされる値です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の例を考えてみてください:
(lambda (a b c) (+ a b c))
以下のように、funcall
に渡すことにより、この関数を呼び出すことができます:
(funcall (lambda (a b c) (+ a b c)) 1 2 3)
この呼び出しは、変数a
に1、b
に2、c
に3をバインドして、ラムダ式のbodyを評価します。bodyの評価により、これら3つの数が加算されて、6が結果として生成されます。したがってこの関数呼び出しにより、6がreturnされます。
以下のように、引数は他の関数の結果であってもよいことに注意してください:
(funcall (lambda (a b c) (+ a b c)) 1 (* 2 3) (- 5 4))
これは引数1
、(* 2 3)
、(- 5
4)
を左から右に評価します。その後、ラムダ式に引数1、6、1を適用して、値8が生成されます。
これらの例が示すように、ローカル変数を作成して、それらに値を与えるフォームとして、CARがラムダ式であるようなフォームを使用することができます。古い時代のLispでは、この方法がローカル変数をバインドして初期化する唯一の方法でした。しかし現在では、この目的にはフォームlet
を使用するほうが明解です(Local Variablesを参照してください)。ラムダ式は主に、他の関数の引数として渡される無名関数(Anonymous Functionsを参照してください)として、あるいは名前つき関数(Naming a Functionを参照してください)を生成するためにシンボルの関数定義に格納するために使用されます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンプルなサンプル関数(lambda (a b c) (+ a b
c))
は、3つの引数変数を指定しているので、3つの引数で呼び出されなければなりません。引数を2つしか指定しなかったり4つ指定した場合は、wrong-number-of-arguments
エラーとなります。
特定の引数を省略できる関数を記述できると便利なこともあります。たとえば関数substring
は3つの引数 —
文字列、開始インデックス、終了インデックス —
を受け取りますが、3つ目の引数を省略した場合、デフォルトでその文字列のlengthとなります。関数list
や+
が行うように、特定の関数にたいして不定個の引数を指定できると便利なときもあります。
関数が呼び出されるとき省略されるかもしれないオプションの引数を指定するには、オプションの引数の前にキーワード&optional
を含めるだけです。0個以上の追加引数のリストを指定するには、最後の引数の前にキーワード&rest
を含めます。
したがって、引数リストの完全な構文は以下のようになります:
(required-vars… [&optional optional-vars…] [&rest rest-var])
角カッコ(square
bracket)は、&optional
と&rest
、およびそれらに続く変数が省略できることを示します。
この関数の呼び出しには、required-varsのそれぞれにたいして、実際の引数が要求されます。0個以上のoptional-varsにたいして実際の引数があるかもしれませんが、ラムダ式が&rest
を使用していなければ、その個数を超えて実際の引数を記述することはできません。&rest
が記述されている場合、追加で任意個の実際の引数があるかもしれません。
optionaやrest変数にたいして実際の引数が省略された場合、それらのデフォルトは常にnil
になります。関数にたいして引数に明示的にnil
が使用されたのか、引数が省略されたのかを区別することはできません。しかし関数のbodyが、nil
を他の有意な値が省略されたと判断することは自由です。これはsubstring
が行っていることです。substring
の3つ目の引数がnil
の場合、それは文字列の長さを使用することを意味します。
Common Lispに関する注意: Common Lispでは、オプションの引数が省略されたときに使用するデフォルト値を指定できます。Emacs Lispは、引数が明示的に渡されたかを調べる、“supplied-p”変数はサポートしません。
例えば、引数リストは以下のようになります:
(a b &optional c d &rest e)
これはa
とb
は最初の2つの実引数となり、これらは必須です。さらに1つまたは2つの引数が指定された場合、それらは順番にc
とd
にバインドされます。1つ目から4つ目の引数の後の引数は、リストにまとめられて、e
にそのリストがバインドされます。2つしか引数が指定されなかった場合、c
はnil
になります。2つまたは3つの引数の場合、d
はnil
です。引数が4つ以下の場合、e
はnil
になります。
オプションの引数の後ろに必須の引数を指定する方法はありません —
これは意味を成さないからです。なぜそうなるかは、この例でc
がオプションでd
が必須な場合を考えてみてください。実際に3つの引数が与えられたとします。3番めの引数は何を指定したのでしょうか?
この引数はcなのでしょうか、それともdに使用されるのでしょうか?
両方の場合が考えられます。同様に、&rest
引数の後に、さらに引数(必須またはオプション)をもつことも意味を成しません。
以下に引数リストと、それを正しく呼び出す例をいくつか示します:
(funcall (lambda (n) (1+ n)) ; 1つの必須: 1) ; これは正確に1つの引数を要求する。 ⇒ 2 (funcall (lambda (n &optional n1) ; 1つは必須で、1つはオプション: (if n1 (+ n n1) (1+ n))) ; 1つまたは2つの引数。 1 2) ⇒ 3 (funcall (lambda (n &rest ns) ; 1つは必須で、後は残り: (+ n (apply '+ ns))) ; 1つ以上の引数。 1 2 3 4 5) ⇒ 15
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ラムダ式は、ラムダリストの食後に、オプションでドキュメント文字列(documentation string)をもつことができます。この文字列は、その関数の実行に影響を与えません。これはコメントの一種ですが、Lisp機構に内在するシステム化されたコメントであり。Emacsのヘルプ機能で使用できます。ドキュメント文字列にアクセスする方法は、Documentationを参照してください。
たとえその関数があなたのプログラム内だけで呼び出される関数だとしても、すべての関数にドキュメント文字列を与えるのはよいアイデアです。ドキュメント文字列はコメントと似ていますが、コメントより簡単にアクセスできます。
ドキュメント文字列の1行目は、関数自体にもとづくものであるべきです。なぜならapropos
は、最初の1行目だけを表示するからです。ドキュメント文字列の1行目は、その関数の目的を要約する、1つまたは2つの完全なセンテンスで構成されるべきです。
ドキュメント文字列の開始は通常、ソースファイル内ではインデントされていますが、ドキュメント文字列の開始のダブルクォート文字の前にインデントのスペースがあるので、インデントはドキュメント文字列の一部にはなりません。ドキュメント文字列の残りの行がプログラムソース内で揃うようにインデントする人がいます。これは、間違いです。後続の行のインデントは文字列の内部にあります。これはソースコード内での見栄えはよくなりますが、ヘルプコマンドで表示したとき見栄えが悪くなります。
ドキュメント文字列がなぜオプションになるのか不思議に思うかもしれません。なぜなら、ドキュメント文字列の後には必須となる関数の構成要素であるbodyが続くからです。文字列を評価するとその文字列自身がれつrnされるので、それがbody内の最後のフォームでない限りなんの効果もありません。したがって、実際はbodyの1行目とドキュメント文字列で混乱が生じることはありません。bodyの唯一のフォームが文字列の場合、それはreturn値とドキュメントの両方の役目を果たします。
ドキュメント文字列の最後の行には、実際の関数引数とは異なる呼び出し規約を指定できます。これは以下のようなテキストを記述します
\(fn arglist)
ただし、このテキストの前に空行があり、テキスト自身が行頭から記述されていて、ドキュメント文字列内でこのテキストの後に改行が続かない場合です(‘\’はEmacsの移動コマンドが混乱するのを避けるために使用されます)。この方法で指定された呼び出し規約は、ヘルプメッセージ内で関数の実引数から生成される呼び出し例と同じ場所に表示されます。
マクロ定義内に記述された引数は、ユーザーがマクロ呼び出しの一部だと考える方法と合致しない場合がしばしばあるので、この機能はマクロ定義で特に有用です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シンボルは関数の名前となることができます。これは、そのシンボルの関数セル(function cell: Symbol Componentsを参照してください)が、関数オブジェクト(たとえばラムダ式)を含むときに起こります。するとそのシンボル自身が呼び出し可能な有効な関数、つまりそのシンボルの関数セルの関数と等価になります。
関数セルの内容は、そのシンボルの関数定義(function definition)と呼ぶこともできます。そのシンボルのかわりに、シンボルの関数定義を使う手続きのことをシンボル関数インダイレクション(symbol function indirection)と呼びます。Symbol Function Indirectionを参照してください。与えられたシンボルに関数定義がない場合、シンボルの関数セルはvoidと呼ばれ、それを関数として使用することはできません。
実際のところ、ほとんどすべての関数は名前をもち、その名前により参照されます。ラムダ式を定義することにより名前つきのLisp関数を作成、それを関数セル(Accessing Function Cell Contentsを参照してください)に置くことができます。しかし、さらに一般的なのはdefun
スペシャルフォーム(次のセクションで説明します)を使う方法です。
Defining Functionsを参照してください。
わたしたちは関数名を与えるのは、Lisp式内で関数を名前で参照するのが便利だからです。また、名前つきの関数は簡単に自分自身を —再帰的(recursive)に参照することができます。さらに、プリミティブはテキスト的な名前だけで参照することができます。なぜならプリミティブ関数は入力構文(read syntax)をもたないオブジェクトだからです(Primitive Function Typeを参照してください)。
関数は一意な名前をもつ必要はありません。与えられた関数オブジェクトは、通常は1つのシンボルの関数セルだけに存在しますが、これは単に慣習的なものです。fset
を使用して、関数を複数のシンボルに格納するのは簡単です。それらのシンボルはそれぞれ、同じ関数にたいする有効な名前となります。
関数として使用されているシンボルを、変数としても利用できることに注意してください。シンボルのこれら2つの利用法は独立しており、競合はしません(これはSchemaのような他のいくつかのLisp方言には当てはまりません)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
わたしたちは通常、関数を最初に作成したときに名前を与えます。これは関数の定義(defining a
function)と呼ばれ、defun
マクロにより行われます。
defun
は新たなLisp関数を定義する通常の方法です。これは、引数リストargs、およびbodyにより与えられるbodyフォームとともに、シンボルnameを関数として定義します。nameとargsを、クォートする必要はありません。
docが与えられた場合、それはその関数のドキュメント文字列を指定する文字列であるべきです(Documentation Strings of Functionsを参照してください)。declareが与えられた場合、それは関数のメタデータを指定する、declare
フォームであるべきです(The declare
Formを参照してください)。interactiveが与えられた場合、それは関数が対話的に呼び出される方法を指定するinteractive
フォームであるべきです(Interactive Callを参照してください)。
defun
のreturn値は定義されていません。
以下にいくつか例を示します:
(defun foo () 5) (foo) ⇒ 5
(defun bar (a &optional b &rest c) (list a b c)) (bar 1 2 3 4 5) ⇒ (1 2 (3 4 5))
(bar 1) ⇒ (1 nil nil)
(bar) error→ Wrong number of arguments.
(defun capitalize-backwards () "Upcase the last letter of the word at point." (interactive) (backward-word 1) (forward-word 1) (backward-char 1) (capitalize-word 1))
意図せず既存の関数を再定義しないように、注意してください。defun
はcar
のようなプリミティブ関数でさえ、躊躇なく問い合わせもなしに再定義します。Emacsががががこれを妨げることはありません。なぜなら関数の再定義は故意に行われることがあり、そのような意図した再定義を、意図しない再定義と見分ける方法はないからです。
この関数は、定義definition(任意の有効なLisp関数)とともに、シンボルnameを関数として定義します。この関数のreturn値は未定義です。
docが非nil
の場合、それは関数nameのドキュメントになります。それ以外は、definitionにより提供されるドキュメントが使用されます。
内部的には、defalias
は通常、定義のセットにfset
を使用します。しかしnameがdefalias-fset-function
プロパティーをもつ場合、fset
を呼び出すかわりに、それに割り当てられた値が使用されます。
defalias
を使う正しい場所は、特定の関数名がまさに定義される場所 —
特にソースファイルがロードされるとき明示的にその名前が出現する場所です。これはdefalias
が、defun
と同じように、どれが関数を定義するファイルなのか記録するからです(Unloadingを参照してください)。
それとは対象的に、他の目的のために関数を操作するプログラムでは、そのような記録を保持しないfset
を使用するほうがよいでしょう。Accessing Function Cell Contentsを参照してください。
defun
やdefalias
で新たなプリミティブ関数を作成することはできませんが、任意の関数定義を変更するのに使用することができ、通常の定義がプリミティブであるcar
やx-popup-menu
のような関数でさえ変更することができます。しかし、これは危険なことです。たとえば、Lispの完全性を損なうことなく、car
を再定義するのはほとんど不可能だからです。それほど有名ではないx-popup-menu
のような関数の再定義では、危険は減るものの、それでも期待したとおりに機能しないかもしれません。Cコードにこのプリミティブの呼び出しがある場合、それは直接そのプリミティブのC定義を呼び出すので、シンボル定義を変更しても、それらに影響はありません。
defsubst
も参照してください。これはdefun
のように関数を定義して、それのインライン展開を処理するようLispコンパイラーに指示します。Inline Functionsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数を定義しただけでは、半分しか終わっていません。関数はそれを呼び出す(call) — たとえば実行(run)するまでは、何も行いません。関数のcallは、invocationとしても知られています。
関数を呼び出すもっとも一般的な方法は、リストの評価による方法です。たとえば、リスト(concat "a"
"b")
を評価することにより、関数concat
が引数"a"
と"b"
で呼び出されます。評価については、Evaluationを参照してください。
プログラム内で式としてリストを記述するときは、プログラム内にテキストで、どの関数を呼び出すか、いくつの引数を与えるかを指定します。通常は、これが行いたいことです。どの関数を呼び出すかを、実行時に計算する必要がある場合もあります。これを行うには、関数funcall
を使用します。実行時にいくつの引数を渡すか決定する必要があるときは、apply
を使用します。
funcall
は、関数functionを引数argumentsで呼び出し、functionがreturnした値をreturnします。
funcall
は関数なので、functionを含むすべての引数は、funcall
の呼び出し前に評価されます。これは、呼び出される関数を得るための任意の式を使用できることを意味します。これはまた、funcall
がargumentsに記述した式ではなく、その値だけを見ることを意味します。これらの値はfunction呼び出し中では、2回目は評価されません。funcall
の処理は、関数の通常の呼び出し手続きと似ており、すでに評価された引数は評価されません。
引数functionは、Lisp関数、またはプリミティブ関数でなければなりません。つまりスペシャルフォームやマクロは、“評価されていない”引数式を与えられたときだけ意味があるので、指定することはできません。上述したように、funcall
は最初に指定された評価前の引数を提供することはできません。
(setq f 'list) ⇒ list
(funcall f 'x 'y 'z) ⇒ (x y z)
(funcall f 'x 'y '(z)) ⇒ (x y (z))
(funcall 'and t nil) error→ Invalid function: #<subr and>
これらの例を、apply
の例と比較してみてください。
apply
は、関数functionを引数argumentsで呼び出します。これはfuncall
と同様ですが、1つ違いがあります。argumentsの最後はオブジェクトのリストです。これは1つのリストではなく、個別の引数としてfunctionに渡されます。わたしたちはこれを、apply
がこのリストを展開(spread)(個々の要素が引数となるので)する、と言います。
apply
は、functionを呼び出した結果をreturnします。funcall
と同様、functionはLisp関数かプリミティブ関数でなければなりません。つまりスペシャルフォームやマクロは、apply
では意味をもちません。
(setq f 'list) ⇒ list
(apply f 'x 'y 'z) error→ Wrong type argument: listp, z
(apply '+ 1 2 '(3 4)) ⇒ 10
(apply '+ '(1 2 3 4)) ⇒ 10
(apply 'append '((a b c) nil (x y z) nil)) ⇒ (a b c x y z)
apply
を使用した興味深い例は、Definition of mapcarを参照してください。
ある関数にたいして、その関数のある引数を特定の値に固定し、他の引数は実際に呼びだされたときの値にできれば便利なことがあります。関数のいくつかの引数を固定することは、その関数の部分適用(partial application)と呼ばれます9。結果は、残りの引数をとる新たな関数で、すべての引数を合わせて元の関数を呼び出します。
Emacs Lispで部分適用を行う方法を示します:
この関数は、新たな関数をreturnします。この新しい関数は、呼びだされたときにargsと、呼び出し時に指定された追加の引数から成る引数リストでfuncを呼び出す関数です。funcにn個の引数を指定できる場合、m < n
個の引数でapply-partially
を呼び出すと、n - m
個の新たな関数を生成します。
以下は、apply-partially
と他のビルトイン関数+
,を使用して、(もし存在しないなら)ビルトイン関数1+
を定義する例です:
(defalias '1+ (apply-partially '+ 1) "Increment argument by one.")
(1+ 10) ⇒ 11
引数として関数をとったり、データ構造(特にフック変数やプロパティーリスト)から関数を探す関数はLispでは一般的で、それらはfuncall
やapply
を使用してそれらの関数を呼び出します。引数として関数をとる関数は、ファンクショナル(functional)と呼ばれるときもあります。
ファンクショナルを呼び出すとき、引数としてno-op関数(何も行わない関数)を指定できると便利なときがあります。以下に2つの異なるno-op関数を示します:
この関数はargをreturnします。副作用はありません。
この関数は任意の引数を無視して、nil
をreturnします。
いくつかの関数はユーザーに可視なコマンドで、これらは(通常はキーシーケンスを介して)対話的に呼び出すことができます。そのようなコマンドは、call-interactively
関数を使用することにより、対話的に呼びだされたときと同様に呼び出すことができます。Interactive Callを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マップ関数(mapping
function)は与えられた関数(スペシャルフォームやマクロではない)を、リストや他のコレクションの各要素に適用します。Emacs
Lispにはそのような関数がいくつかあります。このセクションでは、リストにたいしてマッピングを行うmapcar
、mapc
、mapconcat
を説明します。obarray内のシンボルにたいしてマッピングを行う関数mapatoms
は、Definition of mapatomsを参照してください。ハッシュテーブル内のkey/value関係にたいしてマッピングを行う関数maphash
は、Definition of maphashを参照してください。
これらのマップ関数は、文字テーブル(char-table)には適用されません。なぜなら文字テーブルは非常に広い範囲の疎な配列だからです。疎な配列であるという性質に適う方法で文字いテーブルにマッピングするには、関数map-char-table
を使用します(Char-Tablesを参照してください)。
mapcar
は、関数functionをsequenceの各要素にたいして順番に適用し、その結果をリストでreturnします。
引数sequenceには、文字テーブルを除く任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できます。結果は常にリストになります。結果の長さは、sequenceの長さと同じです。たとえば:
(mapcar 'car '((a b) (c d) (e f))) ⇒ (a c e) (mapcar '1+ [1 2 3]) ⇒ (2 3 4) (mapcar 'string "abc") ⇒ ("a" "b" "c")
;; my-hooks
内の各関数を呼び出す。
(mapcar 'funcall my-hooks)
(defun mapcar* (function &rest args) "Apply FUNCTION to successive cars of all ARGS. Return the list of results." ;; リストが消費されていなければ、 (if (not (memq nil args)) ;; CARに関数を適用する。 (cons (apply function (mapcar 'car args)) (apply 'mapcar* function ;; 残りの要素のための再帰。 (mapcar 'cdr args)))))
(mapcar* 'cons '(a b c) '(1 2 3 4)) ⇒ ((a . 1) (b . 2) (c . 3))
mapc
はmapcar
と似ていますが、functionは副作用のためだけに使用されます —
つまりfunctionがreturnする値は無視され、リストに収集されません。mapc
は常にsequenceをreturnします。
mapconcat
は関数functionをsequenceの各要素に適用します。結果は結合された文字列になります。結果文字列の間に、mapconcat
は文字列separatorを挿入します。separatorには通常、スペースやカンマ、あるいはその他の適切な区切り文字が含まれます。
引数functionはははは、1つの引数を取り文字列をreturnする関数でなければなりません。引数sequenceには、文字テーブルを除く、任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できます。
(mapconcat 'symbol-name '(The cat in the hat) " ") ⇒ "The cat in the hat"
(mapconcat (function (lambda (x) (format "%c" (1+ x)))) "HAL-8000" "") ⇒ "IBM.9111"
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数は通常、defun
により定義され、同時に名前が与えられますが、明示的にラムダ式を使う — 無名関数(anonymous
function)のほうが便利なときもあります。無名関数は、名前つき関数が有効な場所なら、どこでも有効です。無名関数は変数や関数の引数に割り当てられることがよくあります。たとえば、ある関数をリストの各要素に適用するmapcar
のfunction引数に渡すかもしれません(Mapping Functionsを参照してください)。現実的な例は、describe-symbols exampleを参照してください。
無名関数として使用するためのラムダ式を定義するとき、原則的にはリストを構築する任意の手法を使用できます。しかし通常は、マクロlambda
、スペシャルフォームfunction
、または入力構文#'
を使用するべきです。
このマクロは引数リストargs、(もしあれば)ドキュメント文字列doc、(もしあれば)インタラクティブ指定interactive、およびbodyで与えられるbodyフォームをもつ無名関数をreturnします。
実際にはこのマクロはlambda
フォームを“自己クォート(self-quoting)”します。つまりCARがlambda
であるようなフォームは、そのフォーム自身を得ます。
(lambda (x) (* x x)) ⇒ (lambda (x) (* x x))
lambda
フォームは別に、1つの効果をもちます。このマクロは、function
(以下参照)をサブルーチンとして使用することにより、Emacs評価機能(Emacs
evaluator)とバイトコンパイラーに、その引数が関数であることを告げます。
このスペシャルフォームは、評価を行わずに、function-objectをreturnします。この点では、quote
(Quotingを参照してください)と似ています。しかしquote
とは異なり、Emacs評価機能とバイトコンパイラーに、これを関数として使用する意図を告げる役割をもちます。function-objectが有効なラムダ式と仮定すると、これは2つの効果をもちます:
入力構文#'
は、function
の使用の略記です。以下のフォームは等価です:
(lambda (x) (* x x)) (function (lambda (x) (* x x))) #'(lambda (x) (* x x))
以下の例では、3つ目の引数に関数をとる、change-property
関数を定義し、その後のchange-property
で、無名関数を渡してこれを使用しています:
(defun change-property (symbol prop function) (let ((value (get symbol prop))) (put symbol prop (funcall function value))))
(defun double-property (symbol prop) (change-property symbol prop (lambda (x) (* 2 x))))
lambda
フォームをクォートしていないことに注意してください。
上記のコードをコンパイルした場合は、無名関数もコンパイルされます。リストをクォートすることにより無名関数を構築した場合、コンパイルはされません。
(defun double-property (symbol prop) (change-property symbol prop '(lambda (x) (* 2 x))))
この場合、無名関数はコンパイルされたコード内のラムダ式に保持されます。バイトコンパイラーは、change-property
が関数としての使用を意図していることを知ることができないので、たとえこの関数が関数のように見えるとしても、このリストが関数であると決め込むことはできません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるシンボルの関数定義(function definition)とは、そのシンボルの関数セルに格納されたオブジェクトのことです。ここでは、シンボルの関数セルにアクセス、テスト、セットする関数を説明します。
Definition of indirect-functionの、関数indirect-function
も参照してください。
これはsymbolの関数セル内のオブジェクトをreturnします。これは、returnされたオブジェクトが本物のの関数であるかチェックしません。
関数セルがvoidの場合、return値はnil
です。関数セルがvoidのときと、nil
がセットされているときを区別するには、fboundp
(以下参照)を使用します。
(defun bar (n) (+ n 2)) (symbol-function 'bar) ⇒ (lambda (n) (+ n 2))
(fset 'baz 'bar) ⇒ bar
(symbol-function 'baz) ⇒ bar
シンボルに何の関数定義も与えていない場合、そのシンボルの関数セルはvoidだと言います。別の言い方をすると、その関数セルは、どんなLispオブジェクトも保持しません。そのシンボルを関数として呼びだそうとすると、Emacsはvoid-function
エラーをシグナルします。
voidは、nil
やシンボルvoid
とは異なることに注意してください。シンボルnil
およびvoid
はLispオブジェクトであり、他のオブジェクトと同様、関数セルに格納することができます(これらのシンボルはdefun
を使用して有効な関数に成ることができます)。voidである関数セルは、どのようなオブジェクトも含みません。
fboundp
を使用して、任意のシンボルの関数定義がvoidかどうかテストすることができます。シンボルに関数定義を与えた後は、fmakunbound
をつかえば、再びvoidにすることができます。
この関数は、そのシンボルが関数セルにオブジェクトをもっていればt
、それ以外はnil
をreturnします。これは、そのオブジェクトが本物の関数であるかチェックしません。
この関数はsymbolの関数セルをvoidにします。そのため、これ以降に関数セルにアクセスしようと試みると、void-function
エラーが発生します。これはsymbolをreturnします(When a Variable is “Void”のmakunbound
も参照してください)。
(defun foo (x) x) (foo 1) ⇒1
(fmakunbound 'foo) ⇒ foo
(foo 1) error→ Symbol's function definition is void: foo
この関数はsymbolの関数セルに、definitionを格納します。結果はdefinitionです。definitionは通常、関数または関数の名前であるべきですが、これはチェックされません。引数symbolは、通常のどおり評価される引数です。
この関数は主に、関数を定義したり変更すして構成を行う、defun
やadvice-add
のようなものからサブルーチンとして使用されます。シンボルにたいして、たとえばキーボードマクロ(Keyboard Macrosを参照してください)のような、関数ではない関数定義与えるためにも使用することができます:
;; 名前つきのキーボードマクロを定義する。
(fset 'kill-two-lines "\^u2\^k")
⇒ "\^u2\^k"
関数にたいして別の名前を作成するためにfset
を使いたい場合は、かわりにdefalias
の使用を考慮してください。Definition of defaliasを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Scoping Rules for Variable Bindingsで説明したように、Emacsはオプションで変数のレキシカルバインディングを有効にできます。レキシカルバインディングが有効な場合、あなたが(たとえばdefun
などで)作成した任意の名前つき関数、同様にlambda
マクロ、function
スペシャルフォーム、#'
構文を使用して作成した任意の無名関数(Anonymous Functionsを参照してください)は、自動的にクロージャー(closure)に変換されます。
クロージャーとは、その関数が定ぎされたどときに存在したレキシカル環境の記録もあわせもつ関数です。クロージャーが呼び出されたとき、定義内のレキシカル変数の参照には、その保持されたレキシカル環境を使用されます。他のすべての点では、クロージャーは通常の関数と同様に振る舞います。特に、クロージャーは通常の関数と同じ方法で呼び出すことができます。
クロージャー使用する例は、Lexical Bindingを参照してください。
現在のところ、Emacs
Lispのクロージャーオブジェクトは、1つ目の要素にシンボルclosure
をもつリストとして表現されます。そのリストは2つ目の要素としてレキシカル環境を表し、残りの要素で引数リストとbodyフォームを表します:
;; レキシカルバインディングが有効。
(lambda (x) (* x x))
⇒ (closure (t) (x) (* x x))
しかし実際には、クロージャーの内部構造は、内部的な実装の詳細と判断される残りのLisp界を“晒け出す”ものだと言えます。この理由により、クロージャーオブジェクトの構造を直接調べたり変更することは推奨しません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他のライブラリーの関数定義を変更する必要があるとき、またはfoo-function
oのようなフックやプロセスフィルター(process
filter)、または関数を値としてもつ任意の変数またはオブジェクトを変更する必要があるときには、名前つきの関数にはfset
かdefun
、フック変数にはsetq
、プロセスフィルターにはset-process-filter
のように、適切なセッター関数(setter
function)を使用することができます。しかし、これらが以前の値を完全に破棄してしまうのが好ましくない場合もあります。
アドバイス(advice)機能により、関数にアドバイスすることにより、既存の関数定義に機能を追加できます。これは関数全体を再定義するより明解な手法です。
Emacsのアドバイスシステムは2つのプリミティブセットを提供します。コアとなるセットは、変数やオブジェクトのフィールドに保持された関数値にたいするものです(対応するプリミティブはadd-function
とremove-function
です)。もう1つのセットは、名前つき関数の最上位のレイヤーとなるものです(主要なプリミティブはadvice-add
とadvice-remove
です)。
たとえば、プロセスprocのプロセスフィルターの呼び出しをトレースするためには、以下を使用できます:
(defun my-tracing-function (proc string) (message "Proc %S received %S" proc string)) (add-function :before (process-filter proc) #'my-tracing-function)
これにより、そのプロセスの出力は、元のプロセスフィルターに渡される前に、my-tracing-function
に渡されるようになります。my-tracing-function
は元の関数と同じ引数を受け取ります。これを行った場合、以下のようにしてトレースを行わない振る舞いにリバートすることができます。
(remove-function (process-filter proc) #'my-tracing-function)
同様に、display-buffer
という名前つきの関数の実行をトレースしたい場合は、以下を使用できます:
(defun his-tracing-function (orig-fun &rest args) (message "display-buffer called with args %S" args) (let ((res (apply orig-fun args))) (message "display-buffer returned %S" res) res)) (advice-add 'display-buffer :around #'his-tracing-function)
ここで、his-tracing-function
は元の関数のかわりに呼び出され、元の関数(加えてその関数の引数)を引数として受け取るので、必要な場合はそれを呼び出すことができます。出力を確認し終えたら、以下のようにしてトレースしない振る舞いにリバートできます:
(advice-remove 'display-buffer #'his-tracing-function)
上記の例で使用されている引数:before
と:around
は、2つの関数が構成される方法を指定します(これを行うには多くの方法があるからです)。追加された関数も、アドバイス(advice)と呼ばれます。
12.10.1 Primitives to manipulate advices | アドバイスを扱うプリミティブ。 | |
12.10.2 Advising Named Functions | 名前つき関数のアドバイス。 | |
12.10.3 Ways to compose advices | アドバイスを構成する方法。 | |
12.10.4 Adapting code using the old defadvice | 古いdefadviceを使用したコードの改良。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このマクロはplace(Generalized Variablesを参照してください)に格納された関数に、アドバイスfunctionを追加する手軽な方法です。
whereは、既存の関数のどこに — たとえば元の関数の前、または後に — functionが構成されるかを決定します。2つの関数を構成するために利用可能な方法のリストは、Ways to compose advicesを参照してください。
(通常は名前が-function
で終わる)変数を変更するときには、functionがグローバルに使用されるか、あるいはカレントバッファーだけに使用されるか選ぶことができます。placeが単にシンボルの場合、functionはplaceのグローバル値に追加されます。placeが(local
symbol)
というフォームの場合、symbolはその変数の名前をreturnする式なので、functionはカレントバッファーだけに追加されます。最後に、レキシカル変数を変更したい場合には、(var
variable)
を使用する必要があるでしょう。
add-function
で追加されたすべての関数は、自動的にプロパティーpropsの関連リストに加えることができます。現在のところ、特別な意味をもつのは2つのプロパティーだけです:
name
これはアドバイスの名前を与えます。この名前は、remove-function
が取り除く関数を識別するのに使用できます。これは通常、functionが無名関数のときに使用されます。
depth
これは複数のアドバイスが与えられたときに、どのようにアドバイスを順番づけるかを指定します。depthのデフォルト0です。depthが100のとき、このアドバイスは可能な限りの深さを保持すべきことを意味し、-100のときは最外のアドバイスに留めることを意味します。同じdepthで2つのアドバイスが指定された場合、もっとも最近に追加されたアドバイスが最外になります。
:before
アドバイスにたいしては、最外(outermost)になるということは、このアドバイスが他のアドバイスの前、つまり1番目に実行されることを意味し、最内(innermost)とは元の関数が実行される直前、すなわちこのアドバイスと元の関数の間に実行されるアドバイスは存在しないことを意味します。同様に:after
アドバイスにたいしては、最内とは元の関数の直後、つまりこの元の関数とアドバイスの間に実行される他のアドバイスは存在せず、最外とは他のすべてのアドバイスが実行された後にこのアドバイスが実行されることを意味します。:override
の最内アドバイスは、元の関数だけをオーバーライドし、他のアドバイスは適用されませんが、:override
の最外アドバイスは元の関数だけではなく。その他すべての適用済みのアドバイスををオーバーライドします。
functionがインタラクティブでない場合、欠オグされた関数は、(もしあれば)元の関数のインタラクティブ指定(interactive
spec)を継承します。それ以外は、結合された関数はインタラクティブになり、functionのインタラクティブ指定を使用します。1つ例外があります。functionのインタラクティブ指定が、(式や文字列ではない)関数の場合、元の関数のインタラクティブ指定を唯一の引数として、その関数を呼び出して、それが結合された関数のインタラクティブ指定になります。引数として受け取ったインタラクティブ指定を解釈するためには、advice-eval-interactive-spec
を使用します。
注意:
functionのインタラクティブ指定は結合された関数に適用され、functionではなく、結合された関数の呼び出し規約に従うべきです。多くの場合、これらは等しいので差異は生じませんが、functionの:around
、:filter-args
、filter-return
では、重要になります。
このマクロはplaceに格納された関数から、functionを取り除きます。これは、add-function
を使用して、functionがplaceに追加されたときだけ機能します。
functionは、placeに追加された関数にたいして、ラムダ式にたいしても機能するように、equal
を使用して比較を試みます。これは追加でplaceに追加された関数のname
プロパティーも比較します。これはequal
を使用してラムダ式を比較するより信頼性があります。
adviceがすでにfunction-def内にある場合は、非nil
をreturnします。上記のremove-function
と同様、実際の関数adviceのかわりに、アドバイス断片(piece
of advice)のname
も使用できます。
function-defに追加されたすべてのアドバイスに対して、関数fを呼び出します。fは2つの引数 — アドバイス関数と、それのプロパティーで呼びだされます。
そのような指定で関数がインタラクティブに呼び出されたように、インタラクティブ指定specを評価して、構築された引数のリストに対応するリストをreturnします。たとえば、(advice-eval-interactive-spec
"r\nP")
は、リージョンの境界、カレントプレフィクス引数を含む、3つの要素からなるリストをreturnします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
アドバイスの一般的な使い方は、名前つき関数やマクロにたいして使用する方法です。これは単にadd-function
を使用して以下のように行うことができます:
(add-function :around (symbol-function 'fun) #'his-tracing-function)
しかし、かわりにadvice-add
とadvice-remove
を使うべきです。この別の関数セットは名前つき関数に適用されるアドバイス断片を操作するためのもので、add-function
と比較して以下の追加機能があります。まず、これらはマクロおよびオートロードされた関数を扱う方法を知っています。次に、describe-function
にたいして、追加されたアドバイスと同様に、元のドキュメント文字列を維持します。さらに、関数が定義される前でも、アドバイスの追加と削除ができます。
既存の関数を関数全体を再定義せずに、既存の呼び出しを変更するために、advice-add
は有用になります。しかし、その関数の既存の呼び出し元は、古い振る舞いを前提としているかもしれず、アドバイスによりその振る舞いが変更されたときに正しく機能しないかもしれないので、これはソースのバグにもなり得ます。アドバイスはデバッグを難しくする可能性もあります。デバッグを行う人は、その関数がアドバイスにより変更されたことに気づかなかったり、失念しているかもしれません。
これらの理由により、他の方法で関数の振る舞いを変更できない場合のために、アドバイスの使用は控えるべきです。フックを通じて同じことが行えるなら、フック(Hooksを参照してください)の使用が望ましい方法です。特定のキーが行う何かを変更したいだけなら、新しいコマンドを記述して、古いコマンドのキーバインドを新しいコマンドにリマップ(Remapping Commandsを参照してください)するのが、おそらくより良い方法です。特に、Emacs自身のソースファイルは、Emacs内の関数をアドバイスするべきではありません(現在のところこの慣習には数少ない例外がありますが、わたしたちはこれを改善しようと思っています)。
スペシャルフォーム(Special Formsを参照してください)はアドバイスできませんが、マクロは関数と同じ方法でアドバイスできます。もちろん、これはすでにマクロ展開されたコードには影響しないため、マクロ展開前にアドバイスが確実にインストールされる必要があります。
プリミティブ(What Is a Function?を参照してください)にアドバイスするのは可能ですが、2つの理由により通常は行うべきではありません。1つ目の理由は、いくつかのプリミティブはアドバイスのメカニズム内で使用されているため、それらにたいしてアドバイスを行うと無限再帰が発生するからです。2つ目の理由は、多くのプリミティブがCから直接呼び出されていて、そのような呼び出しはアドバイスを無視するからです。したがって、プリミティブにたいしてアドバイスの使用を控えることは、ある呼び出しはアドバイスにしたがい(Lispコードから呼びだされたため)、他の呼び出しではアドバイスにしたがわない(Cコードから呼び出されたため)という混乱した状況を解決します。
名前つき関数symbolに、アドバイスfunctionを追加します。whereとpropsは、add-function
(Primitives to manipulate advicesを参照してください)のときと同じ意味をもちます。
名前つき関数symbolからアドバイスfunctionを取り除きます。functionにアドバイスのname
を指定することもできます。
名前つき関数symbol内にすでにアドバイスfunctionがある場合は、非nil
をreturnします。functionにアドバイスのname
を指定することもできます。
名前つき関数symbolにすでに追加されたすべての関数にたいして、functionを呼び出します。functionは2つの引数、アドバイス関数と、そのプロパティーで呼び出されます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下はadd-function
およびadvice-add
のwhere引数に可能な値で、そのアドバイスfunctionと元の関数が構成されるべき方法を指定します。
:before
古い関数の前にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (apply function r) (apply oldfun r))
(add-function :before funvar
function)
は、ノーマルフックにたいする(add-hook 'hookvar
function)
のような、1関数のフックと同等です。
:after
古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (prog1 (apply oldfun r) (apply function r)))
(add-function :after funvar
function)
は、ノーマルフックにたいする(add-hook 'hookvar function
'append)
のような、1関数のフックと同等です。
:override
これは古い関数を新しい関数に完全に置き換えます。もちろん、remove-function
を呼び出した後に、古い関数は復元されます。
:around
古い関数のかわりにfunctionを呼び出しますが、古い関数はfunctionの追加の引数になります。これはもっとも柔軟な結合です。たとえば、古い関数を異なる引数で呼び出したり、複数回呼び出したり、letバインディングで呼び出したり、あるときは古い関数に処理を委譲し、またあるときは完全にオーバーライドすることが可能になります。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (apply function oldfun r))
:before-while
古い関数の前にfunctionを呼び出し、functionがnil
をreturnした場合は古い関数を呼び出しません。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (and (apply function r) (apply oldfun r)))
(add-function :before-while funvar
function)
は、run-hook-with-args-until-failure
を通じてhookvarが実行されたときの(add-hook
'hookvar function)
のような、1関数のフックと同等です。
:before-until
古い関数の前にfunctionを呼び出し、functionがnil
をreturnした場合だけ古い関数を呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (or (apply function r) (apply oldfun r)))
(add-function :before-until funvar function)
は、run-hook-with-args-until-success
を通じてhookvarが実行されたときの(add-hook
'hookvar function)
のような、1関数のフックと同等です。
:after-while
古い関数が非nil
をreturnした場合だけ、古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、functionのreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (and (apply oldfun r) (apply function r)))
(add-function :after-while funvar
function)
は、run-hook-with-args-until-failure
を通じてhookvarが実行されたときの(add-hook
'hookvar function 'append)
のような、1関数のフックと同等です。
:after-until
古い関数がnil
をreturnした場合だけ、古い関数の後にfunctionを呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (or (apply oldfun r) (apply function r)))
(add-function :after-until funvar
function)
は、run-hook-with-args-until-success
を通じてhookvarが実行されたときの(add-hook
'hookvar function 'append)
のような、1関数のフックと同等です。
:filter-args
最初にfunctionを呼び出し、その結果(リスト)を新たな引数として古い関数に渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (apply oldfun (funcall function r)))
:filter-return
最初に古い関数を呼び出し、その結果をfunctionに渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:
(lambda (&rest r) (funcall function (apply oldfun r)))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
多くのコードは古いdefadvice
メカニズムを使用しており、これらの大半はadvice-add
により陳腐化しました。advice-add
の実装と意味は、とてもシンプルです。
古いアドバイスは以下のようなものです:
(defadvice previous-line (before next-line-at-end (&optional arg try-vscroll)) "Insert an empty line when moving up from the top line." (if (and next-line-add-newlines (= arg 1) (save-excursion (beginning-of-line) (bobp))) (progn (beginning-of-line) (newline))))
新しいアドバイスメカニズムを使用すれば、これを通常の関数に変換できます:
(defun previous-line--next-line-at-end (&optional arg try-vscroll) "Insert an empty line when moving up from the top line." (if (and next-line-add-newlines (= arg 1) (save-excursion (beginning-of-line) (bobp))) (progn (beginning-of-line) (newline))))
これが実際のprevious-line
を変更しないことは明確です。古いアドバイスには、以下が必要です:
(ad-activate 'previous-line)
一方、新しいアドバイスメカニズムでは、以下が必要です:
(advice-add 'previous-line :before #'previous-line--next-line-at-end)
ad-activate
はグローバルな効果をもつことに注意してください。これは、指定された関数にたいして、アドバイスのすべての断片を有効にします。特定のアドバイスだけをアクティブ、または非アクティブにしたい場合、ad-enable-advice
、またはad-disable-advice
により、有効または無効にする必要があります。新しいメカニズムではこの区別はなくなりました。
以下のようなaroundのアドバイスがあるとします:
(defadvice foo (around foo-around) "Ignore case in `foo'." (let ((case-fold-search t)) ad-do-it)) (ad-activate 'foo)
これは以下のように変換できます:
(defun foo--foo-around (orig-fun &rest args) "Ignore case in `foo'." (let ((case-fold-search t)) (apply orig-fun args))) (advice-add 'foo :around #'foo--foo-around)
アドバイスのクラスについて、新たな:before
は、古いbefore
は完全に等価ではないことに注意してください。なぜなら古いアドバイス内では、(たとえばad-set-arg
を使って)その関数の引数を変更できそれは元の関数が参照する引数値に影響します。しかし新しい:before
は、setq
を通じてアドバイス内の引数をし、その変更は元の関数からの参照に影響しません。この振る舞いにもとづいてbefore
アドバイスを移行するときは、代わりにそれを新たなアドバイス:around
または:filter-args
に変更する必要があるでしょう。
同様に、古いafter
アドバイスは、ad-return-value
を変更することによりreturn値を変更できますが、新しい:after
は変更できないので、そのようなafter
を移行するときは、かわりにそれらを新しいアドバイス:around
または:filter-return
に変更する必要があるでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
名前つき関数を陳腐化している(obsolete)とマークすることができます。これは、その関数が将来のある時点で削除されるかもしれないことを意味します。陳腐化しているとマークされた関数を含むコードをバイトコンパイルしたとき、Emacsは警告を発します。また、その関数のヘルプドキュメントは表示されなくなります。他の点においては、陳腐化した関数は他の任意の関数と同様に振る舞います。
関数を陳腐化しているとマークするもっとも簡単な方法は、その関数のdefun
定義に(declare (obsolete
…))
を配置することです。The declare
Formを参照してください。かわりに、以下で説明しているmake-obsolete
関数を使うこともできます。
make-obsolete
を使用して、マクロ(Macrosを参照してください)を陳腐化しているとマークすることもできます。これは関数のときと同じ効果をもちます。関数またはマクロにたいするエイリアスも、陳腐化しているとマークできます。これはエイリアス自身をマークし、名前解決される関数またはマクロにたいしてではありません。
この関数は、obsolete-nameを陳腐化しているとマークします。obsolete-nameには関数またはマクロを名前づけるシンボル、、または関数やマクロにたいするエイリアスを指定します。
current-nameがシンボルの場合は、obsolete-nameのかわりにcurrent-nameの使用を促す警告メッセージになります。current-nameは、obsolete-nameにたいするエイリアスである必要はありません。似たような機能をもつ、別の関数かもしれません。current-nameには、警告メッセージとなる文字列も指定できます。メッセージは小文字で始まりピリオドで終えるべきです。nil
も指定でき、この場合には警告メッセージに追加の詳細は提供されません。
whenが与えられた場合、それは最初にその関数が陳腐化する時期を示す文字列 — たとえば火付けやリリース番号を指定します。
この便利なマクロは関数obsolete-nameを陳腐化しているとマークするとともに、それを関数current-nameのエイリアスにします。これは以下と等価です:
(defalias obsolete-name current-name doc) (make-obsolete obsolete-name current-name when)
加えて、陳腐化した関数にたいする特定の呼び出し規約をマークできます。
この関数は、functionを呼び出す正しい方法として、引数リストsignatureを指定します。これにより、Emacs Lispプログラムが他の方法でfunctionを呼び出している場合には、Emacsのバイトコンパイラーが警告を発します(それでもコードはバイトコンパイルされます)。whenには、その変数が最初に陳腐化するときを示す文字列(通常はバージョン番号)を指定します。
たとえば、古いバージョンのEmacsでは、sit-for
には以下のように3つの引数を指定していました
(sit-for seconds milliseconds nodisp)
しかしこの方法によるsit-for
の呼び出しは陳腐化していると判断されます(Waiting for Elapsed Time or Inputを参照してください)。以下のように、古い呼び出し規約は推奨されません:
(set-advertised-calling-convention 'sit-for '(seconds &optional nodisp) "22.1")
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
インライン関数(inline
function)は関数と同様に機能しますが、1つ例外があります。その関数の呼び出しがバイトコンパイルされると(Byte Compilationを参照してください)、その関数の定義が呼び出し元に展開されます。インライン関数を定義するには、defun
のかわりにdefsubst
を使用します。
このマクロはインライン関数を定義します。マクロの構文はdefun
とまったく同じです(Defining Functionsを参照してください)。
関数をインラインにすることにより、その関数の呼び出しが高速になる場合があります。しかし欠点もあります。1つは柔軟性の減少です。その関数の定義を変更した場合、すでにインライン化された呼び出しは、リコンパイルを行うまで古い定義を使用します。
もう1つの欠点は、大きな関数をインライン化することにより、コンパイルされたコードのファイル上およびメモリー上のサイズが増大することです。スピード面でのインライン化の有利性は小さい関数にたいして顕著なので、一般的に大きな関数をインライン化するべきではありません。
インライン関数は、デバッグ、トレース、アドバイス(Advising Emacs Lisp Functionsを参照してください)に際してうまく機能しません。デバッグの容易さと関数の再定義の柔軟さはEmacsの重要な機能なので、スピードがとても重要であり、defun
の使用が実際に性能の面で問題となるのか検証するためにすでにコードをチューニングしたのでなければ、たとえその関数が小さくてもインライン化するべきでは
ありません。
インライン関数が実行するのと同じコードに展開されるマクロ(Macrosを参照してください)を定義することは可能です。しかし式内でのマクロの直接の使用には制限があります
—
apply
、mapcar
などでマクロを呼び出すことはできません。通常の関数からマクロへの変換には、そのための余分な作業が必要になります。通常の関数をインライン関数に変換するのは簡単です。defun
をdefsubst
に置き換えるだけです。インライン関数の引数はそれぞれ正確に1回評価されるので、マクロのときのように、bodyで引数を何回使用するか心配する必要はありません。
インライン関数を定義した後、そのインライン展開はマクロ同様、同じファイル内の後の部分で処理されます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
declare
Formdeclare
(宣言)は特別なマクロで、関数やマクロに“メタ”プロパティーを追加するために使用できます。たとえば陳腐化しているとマークしたり、Emacs
Lispモード内の特別なTABインデント規則を与えることができます。
このマクロは引数を無視して、nil
として評価され、実行時の効果はありません。しかしdefun
またはdefsubst
(Defining Functionsを参照してください)、またはdefmacro
マクロ(Defining Macrosを参照してください)の定義のdeclare引数にdeclare
フォームがある場合は、specsで指定されたプロパティーを関数またはマクロに追加します。これはdefun
、defsubst
、defmacro
により特別に処理されます。
specs内の各要素は(property
args…)
というフォームをもつべきです。また、クォートするべきではありません。これらは、以下の効果をもちます:
(advertised-calling-convention signature when)
これはset-advertised-calling-convention
(Declaring Functions Obsoleteを参照してください)の呼び出しと同じように振る舞います。signatureはその関数(またはマクロにたいする正しい引数リスト)で、whenは古い引数リストが最初に陳腐化する時期を示す文字列を指定します。
(debug edebug-form-spec)
これはマクロだけに有効です。Edebugでそのマクロ入ったときに、edebug-form-specを使用します。Instrumenting Macro Callsを参照してください。
(doc-string n)
それ自身が関数、マクロ、または変数のようなエンティティーを定義するために使用される関数やマクロを定義するときに使用されます。これはn番目の引数を示し、もしあれば、それはドキュメント文字列です。
(indent indent-spec)
この関数(またはマクロ)にたいするインデント呼び出しは、indent-specにしたがいます。これは関数でも機能しますが、通常はマクロで使用されます。Indenting Macrosを参照してください。
(obsolete current-name when)
make-obsolete
(Declaring Functions Obsoleteを参照してください)と同様に、関数(またはマクロ)を陳腐化しているとマークします。current-nameにはシンボル(かわりにこのシンボルを使うことをすすめる警告メッセージになります)、文字列(警告メッセージを指定します)、またはnil
(警告メッセージには追加の詳細が含まれません)を指定します。whenには、その関数(またはマクロ)が最初に陳腐化する時期を示す文字列を指定します。
(compiler-macro expander)
これは関数だけに使用でき、最適化関数(optimization
function)としてexpanderを使用するようコンパイラーに告げます。(function
args…)
のようなその関数への呼び出しフォームに出会うと、マクロ展開機能(macro
expander)はargs…と同様のフォームでexpanderを呼び出します。expanderはその関数呼び出しのかわりに使用するための新しい式、または変更されていないフォーム(その関数呼び出しを変更しないことを示す)のどちらかをreturnすることができます。expanderにはシンボル、またはフォーム(lambda
(arg)
body)
を指定できます。フォームの場合、argは元の関数呼び出し式を保持して、その関数の形式に適う引数を使用することにより、その関数にたいする(評価されていない)引数にアクセスできます。
(gv-expander expander)
expanderがgv-define-expander
と同様、汎変数としてマクロ(または関数)にたいする呼び出しを処理する関数であることを宣言します。expanderはシンボル、またはフォーム(lambda
(arg) body)
を指定できます。フォームの場合、その関数は追加でそのマクロ(または関数)にアクセスできます。
(gv-setter setter)
setterが、汎変数としてマクロ(または関数)にたいする呼び出しを処理する関数であることを宣言します。setterはシンボル、またはフォームを指定できます。シンボルの場合、そのシンボルはgv-define-simple-setter
に渡されます。フォームの場合は(lambda
(arg)
body)
という形式で、その関数は追加でマクロ(または関数)にアクセスでき、gv-define-setter
に渡されます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるファイルをバイトコンパイルするとき、コンパイラーが知らない関数について警告が生成されるときがあります(Compiler Errorsを参照してください)。実際に問題がある場合もありますが、問題となっている関数がそのコードの実行時にロードされる他のファイルで定義されている場合が通常です。たとえば以前は、fortran.elをバイトコンパイルすると、以下のような警告が出ていました:
In end of data: fortran.el:2152:1:Warning: the function `gud-find-c-expr' is not known to be defined.
実際のところ、gud-find-c-expr
は、Fortranモードが使用するgud-find-expr-function
のローカル値(GUDからのコールバック)の中だけで使用されていて、呼びだされた場合はGUD関数がロードされます。そのような警告が実際には問題を示さないことを知っているときには、警告を抑制したほうがよいでしょう。そうすれば、実際に問題があることを示す新しい警告の識別性が良くなります。declare-function
を使用して、これを行うことができます。
必要なのは、問題となっている関数を最初に使用する前にdeclare-function
命令を追加するだけです:
(declare-function gud-find-c-expr "gud.el" nil)
これはgud-find-c-expr
がgud.el(‘.el’は省略可)の中で定義していることを告げます。コンパイラーは関数がそのファイルで実際に定義されているとみなし、チェックを行いません。
3つ目の引数はオプションで、gud-find-c-expr
の引数リストを指定します。この例では、引数はありません(nil
と値を指定しないのは、異なります)。それ以外の場合は、(file
&optional
overwrite)
のようになります。引数リストを指定する必要はありませんが、指定すればコンパイラーはその呼び出しが宣言と合致するかチェックできます。
バイトコンパイラーにたいして、引数arglistをとるfunctionが定義されていて、その定義はfileにあるとみなすように告げます。fileonlyが非nil
の場合は、fileが存在することだけをチェックして、実際のfunctionの定義はチェックしないことを意味します。
これらの関数がdeclare-function
が告げる場所で実際に宣言されているか検証するには、check-declare-file
を使用して、1つのソースファイル中のすべてのdeclare-function
呼び出しをチェックするか、check-declare-directory
を使用して、特定のディレクトリー配下のすべてのファイルをチェックします。
これらのコマンドは、locate-library
で使用する関数の定義を含むべきファイルを探します。ファイルが見つからない場合、これらのコマンドはdeclare-function
の呼び出しを含むファイルをがあるディレクトリーからの相対ファイル名に、定義ファイル名を展開します。
‘.c’や‘.m’で終わるファイル名を指定することにより、プリミティブ関数を指定することもできます。これが有用なのは、特定のシステムだけで定義されるプリミティブを呼び出す場合だけです。ほとんどのプリミティブは常に定義されているので、それらについて警告を受け取ることはありえないはずです。
あるファイルがオプションとして外部のパッケージの関数を使う場合があります。declare-function
命令内のファイル名のプレフィクスを‘ext:’にすると、そのファイルが見つかった場合はチェックして、見つからない場合はエラーとせずにスキップします。
‘check-declare’が理解しない関数定義もいくつか存在します(たとえばdefstruct
や、その他いくつかのマクロ)。そのような場合、declare-function
のfileonly引数に、非nil
を渡すことができます。これはファイルの存在だけをチェックして、その関数の実際の定義はチェックしないことを意味します。これを行う場合、引数リストを指定する必要はないのですが、arglist引数にはt
をセットするべきだということに注意してください(なぜならnil
は、引数リストが指定されなかったという意味ではなく、空の引数リストを意味するからです)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SESのようないくつかのメジャーモードは、ユーザーファイル内に格納された関数を呼び出します(See (ses)Top, for more information on SESを参照してください)。 ユーザーファイルには素性があやふやな場合があります — 初対面の人から受け取ったスプレッドシートかもしれず、会ったことのない誰かから受け取ったeメールかもしれません。そのため、ユーザーファイルに格納されたソースコードの関数を呼び出すのは、それが安全だと決定されるすまでは危険です。
formが安全(safe)なLisp式の場合はnil
、危険な場合はなぜその式が危険かもしれないのか説明するリストをreturnします。引数unsafep-varsは、この時点で一時的なバインドだと判っているシンボルのリストです。これは主に内部的な再帰呼び出しで使用されます。カレントバッファーは暗黙の引数になり、これはバッファーローカルなバインディングのリストを提供します。
高速かつシンプルにするために、unsafep
は、とても軽量な分析を行うので、実際には安全な多くのLisp式を拒絶します。安全ではない式にたいして、unsafep
がnil
をreturnするケースは確認されていません。しかし“安全”なLisp式はdisplay
プロパティーと一緒に文字列をreturnでき、これはその文字列がバッファーに挿入された後に実行される、割り当てられたLisp式を含みます。割り当てられた式は、ウィルスかもしれません。安全であるためには、バッファーへ挿入する前に、ユーザーコードにより計算されたすべての文字列からプロパティーを削除しなければなりません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のテーブルは、関数呼び出しと関数定義に関連したことを行ういくつかの関数です。これらは別の場所で説明されているので、ここではクロスリファレンスを提供します。
apply
Calling Functionsを参照してください。
autoload
Autoloadを参照してください。
call-interactively
Interactive Callを参照してください。
called-interactively-p
Distinguish Interactive Callsを参照してください。
commandp
Interactive Callを参照してください。
documentation
Access to Documentation Stringsを参照してください。
eval
Evalを参照してください。
funcall
Calling Functionsを参照してください。
function
Anonymous Functionsを参照してください。
ignore
Calling Functionsを参照してください。
indirect-function
Symbol Function Indirectionを参照してください。
interactive
Using interactive
を参照してください。
interactive-p
Distinguish Interactive Callsを参照してください。
mapatoms
Creating and Interning Symbolsを参照してください。
mapcar
Mapping Functionsを参照してください。
map-char-table
Char-Tablesを参照してください。
mapconcat
Mapping Functionsを参照してください。
undefined
Functions for Key Lookupを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ(macros)は、新たな制御構造や、他の言語機能の定義を可能にします。マクロは関数のように定義されますが、値の計算方法を指定するかわりに、値を計算する別のLisp式を計算する方法を指示します。わたしたちはこの式のことをマクロの展開形(expansion)と呼んでいます。
マクロは、関数が行うように引数の値を処理するのではなく、引数のために未評価の式を処理することにより、これを行うことができます。したがってマクロは、これらの引数式またはその一部をを含む式を構築することができます。
マクロを使用して通常の関数が行えることを行う場合、単にそれが速度面の理由ならば、かわりにインライン関数の使用を考慮してください。Inline Functionsを参照してください。
13.1 A Simple Example of a Macro | 基本的な例。 | |
13.2 Expansion of a Macro Call | いつ、なぜ、どのようにしてマクロが展開されるか。 | |
13.3 Macros and Byte Compilation | コンパイラーによりマクロが展開される方法。 | |
13.4 Defining Macros | マクロ定義を記述する方法。 | |
13.5 Common Problems Using Macros | マクロ引数を何回も評価しないこと。ユーザーの変数を隠さないこと。 | |
13.6 Indenting Macros | マクロ呼び出しのインデント方法の指定。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Cの++
演算子のように、変数の値をインクリメントするためのLisp構造を定義したいとします。(inc
x)
のように記述すると、(setq x (1+ x))
という効果を得たいとします。以下はこれを行うマクロ定義です:
(defmacro inc (var) (list 'setq var (list '1+ var)))
これを(inc x)
のように呼び出すと、引数varはシンボルx
になります —
関数のときのようにx
の値ではありません。このマクロのbodyはこれを展開の構築に使用して、展開形は(setq
x (1+ x))
になります。マクロが1度この展開形をreturnすると。Lispはそれを評価するので、x
はインクリメントされます。
この術後は、その引数がマクロかどうかテストして、もしマクロならt
、それ以外はnil
をreturnします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ呼び出しは、関数の呼び出しと同じ外観をもち、マクロの名前で始まるリストで表されます。そのリストの残りの要素は、マクロの引数になります。
マクロ呼び出しの評価は、1つの重大な違いを除き、関数の評価と同じように開始されます。重要な違いとは、そのマクロの引数はマクロ呼び出し内で実際の式として現れます。これらの引数はマクロ定義に与えられる前には評価されません。対象的に、関数の引数は、その関数の呼び出しリストの要素を評価した結果です。
こうして得た引数を使用して、Lispは関数呼び出しのように、マクロ定義を呼び出します。マクロの引数変数はマクロ呼び出しの引数値にバインドされるか、a
&rest
引数の場合は引数地のリストになります。そして、そのマクロのbodyが実行されて、関数bodyが行うように、マクロbodyの値をreturnsします。
マクロと関数の2つ目の重要な違いは、マクロのbodyからreturnされる値が、代替となるLisp式であることで、これはマクロの展開(expansion)としても知られます。Lispインタープリターは、マクロから展開形が戻されると、すぐにその展開形の評価を行います。
展開形は通常の方法で評価されるので、もしかしたらその展開形は他のマクロの呼び出しを含むかもしれません。一般的ではありませんが、もしかすると同じマクロを呼び出すかもしれません。
EmacsはコンパイルされていないLispファイルをロードするときに、マクロの展開を試みることに注意してください。これは常に利用可能ではありませんが、もし可能なら、それ以降の実行の速度を改善します。How Programs Do Loadingを参照してください。
macroexpand
を呼び出すことにより、与えられたマクロ呼び出しにたいする展開形を確認することができます。
この関数は、それがマクロ呼び出しの場合は、formを展開します。結果が他のマクロ呼び出しの場合は、結果がマクロ呼び出しでなくなるまで、順番に展開を行います。これはmacroexpand
からreturnされる値になります。formがマクロ呼び出しで開始されない場合、与えられたformをそのままreturnします。
macroexpand
は、(たとえいくつかのiマクロ定義がそれを行っているとしても)formの部分式(subexpression)を調べないことに注意してください。たとえ部分式自身がマクロ呼び出しの場合でも、macroexpand
はそれらを展開しません。
関数macroexpand
は、インライン関数の呼び出しを展開しません。なぜならインライン関数の呼び出しは、通常の関数呼び出しと比較して理解が難しい訳ではないので、通常はそれを行う必要がないからです。
environmentが与えられた場合、それはそのとき定義されているマクロをシャドーするマクロのalistを指定します。バイトコンパイルはこの機能を使用します。
(defmacro inc (var) (list 'setq var (list '1+ var)))
(macroexpand '(inc r)) ⇒ (setq r (1+ r))
(defmacro inc2 (var1 var2) (list 'progn (list 'inc var1) (list 'inc var2)))
(macroexpand '(inc2 r s))
⇒ (progn (inc r) (inc s)) ; ここではinc
は展開されない。
macroexpand-all
はmacroexpand
と同様、マクロを展開しますが、ドップレベルだけではなく、form内のすべてのマクロを探して展開します。展開されたマクロがない場合、return値は、formとeq
になります。
上記macroexpand
で使用した例をmacroexpand-all
に用いると、macroexpand-all
がinc
に埋め込まれた呼び出しの展開を行うことを確認できます:
(macroexpand-all '(inc2 r s)) ⇒ (progn (setq r (1+ r)) (setq s (1+ s)))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
なぜわざわざマクロにたいする展開形を計算して、その後に展開形を評価する手間をかけるのか、不思議に思うかもしれません。なぜマクロbodyは直接望ましい結果を生成しないのでしょうか? それはコンパイルする必要があるからです。
コンパイルされるLispプログラム内にマクロ呼び出しがあるとき、Lispコンパイラーはインタープリターが行うようにマクロ定義を呼び出して、展開形を受け取ります。しかし展開形を評価するかわりに、コンパイラーは展開形が直接プログラム内にあるかのようにコンパイルを行います。結果として、コンパイルされたコードはそのマクロにたいする値と副作用を生成しますが、実行速度は完全にコンパイルされた行されたときと同じになります。もしマクロbody自身が値と副作用を計算したら。このようには機能しません — コンパイル時に計算されることになり、それは有用ではありません。
マクロ呼び出しのコンパイルが機能するためには、マクロを呼び出すコードがコンパイルされるとき、そのマクロがLisp内ですでに定義されていなければなりません。コンパイラーには、これを行うのを助ける特別な機能があります。コンパイルされるファイルがdefmacro
フォームを含む場合、そのファイルの残りの部分をコンパイルするために、そのマクロが一時的に定義されます。
ファイルをバイトコンパイルすると、ファイル内のトップレベルにある任意のrequire
呼び出しも実行されるので、それらを定義しているファイルをrequireすることにより、コンパイルの間、必要なマクロ定義が利用できることが確実になります(Featuresを参照してください)。誰かがコンパイルされたプログラムを実行するときに、マクロ定義ファイルのロードをしないようにするには、require
呼び出しの周囲にeval-when-compile
を記述します(Evaluation During Compilationを参照してください)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispのマクロオブジェクトは、CARがmacro
で、CDRが関数のリストです。マクロの展開形は、マクロ呼び出しから、評価されていない引数のリストに、(apply
を使って)関数を適用することにより機能します。
無名関数のように無名Lispマクロを使用することも可能ですが、無名マクロをmapcar
のようなファンクショナルに渡すことに意味がないので、これが行われることはありません。実際のところ、すべてのLispマクロは名前をもち、ほとんど常にdefmacro
マクロで定義されます。
defmacro
はシンボルname(クォートはしない)を、以下のようなマクロ押して定義します:
(macro lambda args . body)
(このリストのCDRはラムダ式であることに注意してください。)
このマクロオブジェクトは、nameの関数セルに格納されます。argsの意味は関数の場合と同じで、キーワード&rest
および&optional
が使用されることもあります(Other Features of Argument Listsを参照してください)。nameとargsはどちらも、クォートされるべきではありません。defmacro
のreturn値は未定義です。
docが与えられた場合、それはマクロのドキュメント文字列を指定する文字列です。declareが与えられた場合、それはマクロのメタデータを指定するdeclare
フォームです(The declare
Formを参照してください)。マクロを対話的に呼び出すことはできないので、インタラクティブ宣言をもつことはできないことに注意してください。
マクロが、定数部と非定数部の混合体から構築される巨大なリスト構造を必要とする場合があります。これを簡単に行うためには、‘`’構文(Backquoteを参照してください)を使用します。たとえば:
(defmacro t-becomes-nil (variable) `(if (eq ,variable t) (setq ,variable nil)))
(t-becomes-nil foo) ≡ (if (eq foo t) (setq foo nil))
マクロ定義のbodyには、そのマクロに関する追加のプロパティーを指定する、declare
フォームを含めることができます。The declare
Formを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ展開が、直感に反する結果となることがあり得ます。このセクションでは、問題になりかねない重要な結果と、問題を避けるためにしたがうべきルールをいくつか説明します。
13.5.1 Wrong Time | マクロ内ではなく展開形で作業を行う。 | |
13.5.2 Evaluating Macro Arguments Repeatedly | 展開形は各マクロ引数を1度評価するべきです。 | |
13.5.3 Local Variables in Macro Expansions | 展開形でのローカル変数バインディングには特別な注意が必要です。 | |
13.5.4 Evaluating Macro Arguments in Expansion | 評価せずに展開形の中に配置してください。 | |
13.5.5 How Many Times is the Macro Expanded? | 展開が行われる回数への依存を避ける。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロを記述する際のもっとも一般的な問題は、展開形の中ではなく、マクロ展開中に、早まって実際に何らかの作業を行ってしまうことがあります。たとえば、実際のパッケージが以下のマクロ定義をもつとします:
(defmacro my-set-buffer-multibyte (arg) (if (fboundp 'set-buffer-multibyte) (set-buffer-multibyte arg)))
この誤ったマクロ定義は、解釈(interpret)されるときは正常に機能しますが、コンパイル時に失敗します。このマクロ定義はコンパイル時にset-buffer-multibyte
を呼び出してしまいますが、それは間違っています。その後でコンパイルされたパッケージを実行しても何も行いません。プログラマーが実際に望むのは、以下の定義です:
(defmacro my-set-buffer-multibyte (arg) (if (fboundp 'set-buffer-multibyte) `(set-buffer-multibyte ,arg)))
このマクロは、もし適切ならset-buffer-multibyte
の呼び出しに展開され、それはコンパイルされたプログラム実行時に実行されるでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロを定義する場合、展開形が実行されるときに引数が何回評価されるか注意を払わなければなりません。以下の(繰り返し処理を用意にする)マクロで、この問題を示してみましょう。このマクロで“for”によるループ構造を記述できます。
(defmacro for (var from init to final do &rest body) "Execute a simple \"for\" loop. For example, (for i from 1 to 10 do (print i))." (list 'let (list (list var init)) (cons 'while (cons (list '<= var final) (append body (list (list 'inc var)))))))
(for i from 1 to 3 do (setq square (* i i)) (princ (format "\n%d %d" i square))) →
(let ((i 1)) (while (<= i 3) (setq square (* i i)) (princ (format "\n%d %d" i square)) (inc i)))
-|1 1 -|2 4 -|3 9 ⇒ nil
マクロ内の引数from
、to
、do
は、“構文糖(syntactic
sugar)”であり、完全に無視されます。このアイデアは、マクロ呼び出し中で(from
, to
, and
do
のような)余計な単語を、これらの位置に記述できるようにするというものです。
以下は、バッククォートの使用により、より単純化された等価の定義です:
(defmacro for (var from init to final do &rest body) "Execute a simple \"for\" loop. For example, (for i from 1 to 10 do (print i))." `(let ((,var ,init)) (while (<= ,var ,final) ,@body (inc ,var))))
この定義のフォームは両方(バッククォートのあるものと、ないもの)とも、各繰り返しにおいて毎回finalが評価されるという欠点をもちます。finalが定数のときには、問題はありません。しかし、これがより複雑な、たとえば(long-complex-calculation
x)
のようなフォームの場合、実効速度は顕著に低下し得ます。finalが副作用をもつ場合には、複数回実行すると、おそらく正しくなくなります。
うまく設計されたマクロ定義は、繰り返し評価することがそのマクロの意図された目的でない限り、引数を正確に1回評価を行う展開形を生成することにより、この問題を避けるためにステップを費やします。以下はfor
マクロの正しい展開形です:
(let ((i 1) (max 3)) (while (<= i max) (setq square (* i i)) (princ (format "%d %d" i square)) (inc i)))
以下はこの展開形を生成するためのマクロ定義です:
(defmacro for (var from init to final do &rest body) "Execute a simple for loop: (for i from 1 to 10 do (print i))." `(let ((,var ,init) (max ,final)) (while (<= ,var max) ,@body (inc ,var))))
残念なことに、この訂正により、以下のセクションで説明する、別の問題が発生します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
前のセクションでは、for
の定義を、展開形がマクロ引数を正しい回数評価するように訂正しました:
(defmacro for (var from init to final do &rest body) "Execute a simple for loop: (for i from 1 to 10 do (print i))."
`(let ((,var ,init) (max ,final)) (while (<= ,var max) ,@body (inc ,var))))
for
の新しい定義には、新たな問題があります。この定義は、ユーザーが意識していない、max
という名前のローカル変数を導入しています。これは、以下の例で示すようなトラブルを招きます:
(let ((max 0)) (for x from 0 to 10 do (let ((this (frob x))) (if (< max this) (setq max this)))))
for
のbodyの内部のmax
への参照は、max
のユーサーバインディングの参照を意図したものですが、実際にはfor
により作られたバインディングにアクセスします。
これを修正する方法は、max
のかわりにinternされていない(uninterned)シンボルを使用することです(Creating and Interning Symbolsを参照してください)。internされていないシンボルは他のシンボルと同じようにバインドして参照することができますが、for
により作成されるので、わたしたちはすでにユーザーのプログラムに存在するはずがないことを知ることができます。これはinternされていないので、プログラムの後続の部分でそれを配置する方法はありません。これはfor
により配置された場所をのぞき、他の場所で配置されることはありません。以下はこの方法で機能するfor
の定義です:
(defmacro for (var from init to final do &rest body) "Execute a simple for loop: (for i from 1 to 10 do (print i))." (let ((tempvar (make-symbol "max"))) `(let ((,var ,init) (,tempvar ,final)) (while (<= ,var ,tempvar) ,@body (inc ,var)))))
作成されたinternされていないシンボルの名前はmax
で、これを通常のinternされたシンボルmax
のかわりに、式内のその位置に記述します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ定義自体が、eval
(Evalを参照してください)の呼び出しなどによりマクロ引数式を評価した場合には、別の問題が発生します。その引数がユーザーの変数を参照する場合、ユーザーがマクロ引数と同じな前で変数をしようとした場合に問題となるでしょう。マクロのbodyないでは、マクロ引数のバインディングは、その変数のもっともローカルなバインディングなので、そのフォーム内部の任意の参照は、それを参照するように評価されます。以下は例です:
(defmacro foo (a) (list 'setq (eval a) t))
(setq x 'b) (foo x) → (setq b t) ⇒ t ;b
がセットされる。 ;; but (setq a 'c) (foo a) → (setq a t) ⇒ t ; しかし、これはc
ではなくa
がセットされる。
ユーザーの変数の名前がa
かx
かということで、違いが生じています。これはa
が、マクロの引数変数a
と競合しているからです。
マクロ定義内でのeval
の呼び出しにまつわる別の問題は、それがおそらくコンパイル時にあなたが意図したことを行わないだろうということです。バイトコンパイラーは、そのプログラム自身の(あなたがeval
でアクセスしたいと望む)計算は発生せず、ローカル変数バインディングも存在しないプログラムのコンパイル時にマクロ定義を実行します。
この問題を避けるためには、マクロ展開形の計算では引数式を評価しないでください。かわりにその式をマクロ展開形の中に置き換えれば、その値は展開形の実行の一部として計算されます。これは、このチャプターの他の例が機能する方法です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ呼び出しは逐次解釈される関数で毎回マクロ呼び出しが展開されるが、コンパイルされた関数では(コンパイル時に)1回だけしか展開されないという事実にもとづく問題が、時折発生します。そのマクロ定義が副作用をもつ場合、それらのマクロは、そのマクロが難解展開されたかにより、異なる動作をとるでしょう。
したがって、あなたが何をしているか本当に判っていないのであれば、マクロ展開形の計算での副作用は避けるべきです。
避けることのできない特殊な副作用が1つあります。それはLispオブジェクトの構築です。ほとんどすべてのマクロ展開形には、リストの構築が含まれます。リスト構築はほとんどのマクロの核心部分です。これは通常は安全です。用心しなければならないケースが1つだけあります。それは構築するオブジェクトが、マクロ展開形の中でクォートされた定数の一部となるときです。
そのマクロが1回だけ — コンパイル時 — しか展開されない場合、そのオブジェクトの構築もコンパイル時の1回です。しかし逐次実行では、そのマクロはマクロ呼び出しが実行されるたびに展開され、これは毎回新たなオブジェクトが構築されることを意味します。
クリーンなLispコードのほとんどでは、この違いは問題になりません。しかし、マクロ定義によるオブジェクト構築の副作用を処理する場合には、問題になるかもしれません。したがって問題を避けるために、マクロ定義によるオブジェクト構築の副作用を避けてください。以下は副作用により問題が起こる例です:
(defmacro empty-object () (list 'quote (cons nil nil)))
(defun initialize (condition) (let ((object (empty-object))) (if condition (setcar object condition)) object))
initialize
が解釈された場合、initialize
が呼び出されるたびに、新しいリスト(nil)
が構築されます。したがって、各呼び出しの間において、副作用は存続しません。しかしinitialize
がコンパイルされた場合、マクロempty-object
はコンパイル時に展開され、これは1つの“定数”(nil)
を生成し、この定数はinitialize
の毎回の呼び出しで、再利用・変更されます。
このような異常な状態を避ける1つの方法は、empty-object
を、メモリー割り当て構造ではなく、一種の奇妙な変数と考えることです。'(nil)
のような定数にたいしてsetcar
を使うことはないでしょうから、当然(empty-object)
にも使うことはないでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロ定義では、マクロ呼び出しをTABがどのようにインデントすべきか指定するために、declare
フォーム(Defining Macrosを参照してください)を使うことができます。インデント指定は以下のように記述します:
(declare (indent indent-spec))
以下は利用できるindent-specです:
nil
これはプロパティーを指定しない場合と同じ — 標準的なインデントパターンを使用します。
defun
この関数を‘def’構造 — 2番目の行がbodyの開始 — と同様に扱います。
関数の最初のnumber個の引数は区別され、残りは式のbodyと判断されます。その式の中の行は、最初の引数が区別されているかどうかにしたがってインデントされます。引数がbodyの一部である場合、その行はこの式の先頭の
開きカッコ(open-parenthesis)よりもlisp-body-indent
だけ多い列にインデントされます。引数が
区別されていて、1つ目または2つ目の引数である場合は、2倍余分にインデントされます。引数が区別されていて1つ目あるいは2つ目の引数でない場合、その行は標準パターンによってインデントされます。
symbolは関数名です。その関数はこの式のインデントを計算するために呼び出される関数です。この関数は2つの引数をとります:
その行のインデントが開始される位置です。
その行の開始まで解析されたとき、parse-partial-sexp
(インデントとネスト深さの計算のためのLispプリミティブ)によりreturnされる値です。
これは、数(その行のインデントの列数)、またはそのような数がcarであるようなリストをreturnすべきです。数とリストの違いは、数の場合、同じネスト深さの後続のすべての行はこの数と同じインデントとなります。リストの場合、後続の行は異なるインデントを呼び出すかもしれません。これは、C-M-qによりインデントが計算されるときに違いがでます。値が数の場合、C-M-qはリストの終わりまでの後続の行のインデントを、再計算する必要はありません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsのユーザーは、カスタマイズインターフェースにより、Lispコードを記述することなく。変数とフェースをカスタマイズできます。Easy Customization in The GNU Emacs Manualを参照してください。このチャプターでは、カスタマイズインターフェースを通じて、ユーザーとやりとりするための、カスタマイズアイテム(customization items)を定義する方法を説明します。
カスタマイズアイテムには、カスタマイズ可能変数(customizable variable:
defcustom
マクロで定義される。
カスタマイズ可能フェース(customizable face: defface
で定義される。Defining Facesを参照してください)、および関連するカスタマイズアイテムのグループのためのコンテナーとして働くカスタマイズグループ(customization
group:
defgroup
で定義される)
が含まれます。
14.1 Common Item Keywords | すべての種類のカスタマイズ宣言に共通なキーワード。 | |
14.2 Defining Customization Groups | カスタマイズグループ定義の記述。 | |
14.3 Defining Customization Variables | ユーザーオプションの宣言。 | |
14.4 Customization Types | ユーザーオプションの型指定。 | |
14.5 Applying Customizations | カスタマイズセッティングを適用する関数。 | |
14.6 Custom Themes | カスタムテーマの記述。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以降のセクションで説明するカスタマイズ宣言(customization declaration) —
defcustom
、defgroup
などはすべて、さまざまな情報を指定するためのキーワード引数(Variables that Never Changeを参照してください)を受け取ります。このセクションでは、カスタマイズ宣言のすべての種類に適用されるキーワードを説明します。
:tag
以外のすべてのキーワードは、与えられたアイテムにたいして複数回使用できます。キーワードの使用はそれぞれ独立した効果をもちます。:tag
は例外で、これはすべての与えられたアイテムは1つの名前だけを表示できるからです。
:tag label
labelを使用すると、カスタマイズメニュー(customization menu)およびカスタマイズバッファー(customization buffer)のアイテムのラベルづけに、そのアイテムの名前のかわりに指定された文字列を使用します。混乱を招くので、そのアイテムの実際の名前と、大きく異なる名前は使用しないでください。
:group group
このカスタマイズアイテムを、グループgroupに配します。defgroup
内で:group
を使用した場合、そのアイテムは新しいグループ(:group
のサブグループ)になります。
このキーワードを複数回使用した場合、1つのアイテムを複数のグループに配すことができます。これらのグループのどれかを表示すると、このアイテムが表示されます。煩わしくなるので、多用しないでください。
:link link-data
このアイテムのドキュメント文字列の後に外部リンクを含めます。これは他のドキュメントを参照する、センテンスを含むボタンです。
link-dataに使用できる複数の候補があります:
(custom-manual info-node)
infoノードへのリンクです。info-nodeは、"(emacs)Top"
のような、ノード名を示す文字列です。このリンクはカスタマイズバッファーの‘[Manual]’に表示され、info-nodeにたいしてビルトインのinfoリーダーを起動します。
(info-link info-node)
custom-manual
と同様ですが、カスタマイズバッファーには、そのinfoノード名が表示されます。
(url-link url)
ウェブページヘのリンクです。urlはURLを指定する文字列です。カスタマイズバッファーに表示されるリンクは、browse-url-browser-function
で指定されたWWWブラウザーを呼び出します。
(emacs-commentary-link library)
ライブラリーのコメントセクション(commentary section)へのリンクです。libraryはライブラリー名を指定する文字列です。Conventional Headers for Emacs Librariesを参照してください。
(emacs-library-link library)
Emacs Lispライブラリーファイルへのリンクです。libraryはライブラリー名を指定する文字列です。
(file-link file)
ファイルへのリンクです。fileは、ユーザーがこのリンクを呼び出したときにfind-file
でvisitするファイルの名前を指定する文字列です。
(function-link function)
関数のドキュメントへのリンクです。functionは、ユーザーがこのリンクを呼び出したときにdescribe-function
で説明を表示する関数の名前を指定する文字列です。
(variable-link variable)
変数のドキュメントへのリンクです。variableは、ユーザーがこのリンクを呼び出したときにdescribe-variable
で説明を表示する変数の名前を指定する文字列です。
(custom-group-link group)
他のカスタマイズグループへのリンクです。このリンクを呼び出すことにより、groupにたいする新たなカスタマイズバッファーが作成されます。
link-dataの1つ目の要素の後に:tag
name
を追加することにより、カスタマイズバッファーで使用するテキストを指定できます。たとえば(info-link :tag
"foo" "(emacs)Top")
は、そのバッファーで‘foo’と表示されるEmacs manualへのリンクを作成します。
複数のリンクを追加するために、このキーワードを複数回使用することができます。
:load file
このカスタマイズアイテムを表示する前に、ファイルfileをロードします(Loadingを参照してください)。ロードはload
により行われ、そのファイルがまだロードされていないときだけロードします。
:require feature
保存したカスタマイズが、このアイテム値をセットするとき、(require
'feature)
が実行されます。featureはシンボルです。
:require
を使用するもっとも一般的な理由は、ある変数がマイナーモードのような機能を有効にするとき、そのモードを実装するコードがロードされていない場合には、変数をセットするだけでは効果がないからです。
:version version
このキーワードは、そのアイテムが最初に導入されたEmacsバージョンversion、またはそのアイテムのデフォルト値がそのバージョンで変更されたことを指定します。値versionは文字列でなければなりません。
:package-version '(package . version)
このキーワードは、そのアイテムが最初に導入されたpackageのバージョンversionまたはアイテムの意味(またはデフォルト値)が変更されたバージョンを指定します。このキーワードは:version
より優先されます。
packageにはそのパッケージの公式名をシンボルとして指定します(たとえばMH-E
)。versionには文字列を指定します。パッケージpackageがEmacsの一部としてリリースされた場合、packageとversionの値は、customize-package-emacs-version-alist
の値に表示されるべきです。
Emacsの一部として配布された:package-version
キーワードを使用するパッケージは、customize-package-emacs-version-alist
変数も更新しなければなりません。
このalistは、Emacsのバージョンにたいして、:package-version
キーワード内でリストされたパッケージのバージョンへのマッピングを提供します:
(package (pversion . eversion)…)
package(シンボル)それぞれにたいして、パッケージバージョンpversionを含む1つ以上の要素と、それに関連づけられるEmacsバージョンeversionが存在します。これらのバージョンは文字列です。たとえばMH-Eパッケージは、以下でalistを更新します:
(add-to-list 'customize-package-emacs-version-alist '(MH-E ("6.0" . "22.1") ("6.1" . "22.1") ("7.0" . "22.1") ("7.1" . "22.1") ("7.2" . "22.1") ("7.3" . "22.1") ("7.4" . "22.1") ("8.0" . "22.1")))
packageの値は一意である必要があり、また:package-version
キーワード内に現れるpackageの値とマッチする必要があります。おそらくユーザーはエラーメッセージからこの値を見るので、MH-EやGnusのようなパッケージの公式名を選択するのがよいでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispパッケージはそれぞれ、1つのメインカスタマイズグループ(main customization group)をもち、それにはすべてのオプション、フェイス、そのパッケージ内の他のグループが含まれるべきです。そのパッケージには少数のオプションとフェイスしかない場合は、1つのグループだけを使用して、その中にすべてを置きます。20以上のオプションやフェイスがある場合には、それらをサブグループ内に構造化して、そのサブグループをメインカスタマイズグループの下に配します。そのパッケージ内の任意のオプションまたはフェイスを、サブグループと並行してメイングループに配しても構いません。
そのパッケージのメイングループ(または唯一のグループ)は、1つ以上の標準カスタムグループ(standard customization
group)のメンバーであるべきです(これらの完全なリストを表示するには、M-x
customizeを使用します)。それらの内から1つ以上(多すぎないこと)を選択して、:group
を使用してあなたのグループをそれらに追加します。
新しいカスタマイズグループは、defgroup
で宣言します。
membersを含む、カスタマイズグループとして、groupを宣言します。シンボルgroupはクォートしません。引数docは、そのグループにたいするドキュメント文字列を指定します。
引数membersは、そのグループのメンバーとなるカスタマイズアイテムの初期セットを指定するリストです。しかしほとんどの場合はmembersをnil
にして、メンバーを定義するときに:group
キーワードを使用することにより、そのグループのメンバーを指定します。
membersを通じてグループのメンバーを指定したい場合、各要素は(name
widget)
という形式で指定するべきです。ここでnameはシンボル、widgetはそのシンボルを編集するウィジェット型(widget
type)です。有用なウィジェットには、変数にたいするcustom-variable
、フェイスにたいするcustom-face
、グループにたいするcustom-group
があります。
Emacsに新しいグループを導入するときは、defgroup
内で:version
キーワードを使用します。そうすればグループの個別のメンバーに対してそれを使用する必要がなくなります。
一般的なキーワード(Common Item Keywordsを参照してください)に加えて、defgroup
ないでは以下のキーワードも使用できます:
:prefix prefix
グループ内のアイテムの名前がprefixで始まり、カスタマイズ変数custom-unlispify-remove-prefixes
が非nil
の場合、そのアイテムのタグからprefixが省略されます。グループは任意の数のプレフィクスをもつことができます。
この変数が非nil
の場合、グループの:prefix
キーワードで指定されたプレフィクスは、ユーザーがグループをカスタマイズするときは常に、タグ名から省略されます。
デフォルト値はnil
、つまりプレフィクス省略(prefix-discarding)の機能は無効です。これは、オプションやフェイスの名前にたいしてプレフィクスを省略するのは、混乱を招くことがあるからです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
カスタマイズ可能変数(customizable variable)はユーザーオプション(user
option)とも呼ばれ、これはCustomizeインターフェースを通じてセットできるグローなるなLisp変数です。defvar
(Defining Global Variablesを参照してください)により定義される他のグローバル変数とは異なり、カスタマイズ可能変数はdefcustom
マクロを使用して定義されます。サブルーチンとしてdefvar
を呼び出すことに加え、defcustom
はCustomizeインターフェースでその変数が表示される方法や、その変数がとることができる値などを明示します。
このマクロはユーザーオプション(またはカスタマイズ可能変数)としてoptionを宣言します。optionはクォートするべきではありません。
引数standardは、optionの標準値を指定する式です。defcustom
フォームの評価により、standardが評価されますが、その値にオプションをバインドする必要はありません。optionがすでにデフォルト値をもつ場合、それは変更されずに残ります。ユーザーがすでにoptionにたいするカスタマイズを保存している場合、ユーザーによりカスタマイズされた値がデフォルト値としてインストールされます。それ以外は、standardを評価した結果がデフォルト値としてインストールされます。
defvar
と同様、このマクロはoption
をスペシャル変数 — 常にダイナミックにバインドされるべきことを意味する
—
としてマークします。optionがすでにレキシカルバインドをもつ場合、そのレキシカルバインドはバインディング構造を抜けるまで効果をもちます。Scoping Rules for Variable Bindingsを参照してください。
式standardは別の様々な機会にも — カスタマイズ機能がoptionの標準値を知る必要があるときは常に — 評価される可能性があります。そのため任意回数評価しても安全な式を使用するように気をつけてください。
引数docは、その変数にたいするドキュメント文字列を指定します。
defcustom
が何も:group
を指定しない場合、同じファイル内でdefgroup
により最後に定義されたグループが使用されます。この方法では、ほとんどのdefcustom
は明示的な:group
が必要なくなります。
Emacs
LispモードでC-M-x(eval-defun
)によりdefcustom
フォームを評価するとき、eval-defun
の特別な機能は、変数の値がvoidかどうかテストせず、無条件に変数をセットする段取りをします(同じ機能はdefvar
にも適用されます。Defining Global Variablesを参照してください)。すでに定義されたdefcustomでeval-defun
を使用することにより、(もしあれば):set
関数が呼び出されます(以下参照)。
事前ロード( pre-loaded)されたEmacs Lispファイル(Building Emacsを参照してください)にdefcustom
を配した場合、ダンプ時にインストールされた標準値は正しくない —
たとえば依存している他の変数は、まだ正しい値を割り当てられていない
— かもしれません。この場合、Emacs起動後に標準値を再評価するために、以下で説明するcustom-reevaluate-setting
を使用します。
Common Item Keywordsにリストされたキーワードに加え、このマクロには以下のキーワードを指定できます:
:type type
このオプションのデータ型として、typeを使用します。これはどんな値が適正なのか、その値をどのように表示するかを指定します(Customization Typesを参照してください)。
:options value-list
このオプションに使用する適正な値のリストを指定します。ユーザーが使用できる値はこれらの値に限定されませんが、これらは便利な候補値を提示します。
これは特定の型にたいしてだけ意味をもち、現在のところhook
、plist
、alist
が含まれます。:options
の使用法の説明は、個別の型の定義を参照してください。
:set setfunction
Customizeインターフェースを使用してこのオプションの値を変更する方法として、setfunctionを指定します。関数setfunctionは2つの引数
— シンボル(オプション名)と新しい値 —
をとり、このオプションにたいして正しく値を更新するために必要なことは何であれ行うべきです(これはおそらくLisp変数として単にオプションをセットすることを意味しないでしょう)。望ましくは、この関数は引数の値を破壊的に変更するべきではありません。setfunctionのデフォルトは、set-default
です。
このキーワードを指定した場合、その変数のドキュメント文字列には、手入力のLispコードで同じことを行う方法が記載されるべきです。
:get getfunction
このオプションの値を抽出する方法として、getfunctionを指定します。関数getfunctionは1つの引数(シンボル)をとり、カスタマイズがそのシンボル(シンボルのLisp値である必要はない)にたいする“カレント値”としてそれを使うべきかreturnするべきです。デフォルトはdefault-value
です。
:get
を正しく使用するためには、Customの機能を真に理解する必要があります。これは変数としてCustom内で扱われる値のためのものですが、実際にはLisp変数に格納されません。実際にLisp変数に格納されている値にgetfunctionを指定するのは、ほとんどは誤りです。
:initialize function
functionは、defcustom
が評価されるときに変数を初期化するために使用される関数であるべきです。これは2つの引数
— オプション名(シンボル)と値をとります。この方法での使用のために事前定義された関数がいくつかあります:
custom-initialize-set
変数の初期化に、その変数の:set
関数を使用しますが、値がすでに非voidの場合、再処帰化を行いません。
custom-initialize-default
custom-initialize-set
と同様ですが、その変数の:set
のかわりに、関数set-default
を使用して変数をセットします。これは変数の:set
関数がマイナーモードを有効または無効にする場合の、通常の選択です。この選択により、変数の定義ではマイナーモード関数を呼び出しませんが、変数をカスタマイズしたときはマイナーモード関数を呼び出します。
custom-initialize-reset
変数の初期化に、常に:set
関数を使用します。変数がすでに非voidの場合、(:get
メソッドでreturnされる)カレント値を使用して:set
関数を呼び出して変数をリセットします。これはデフォルトの:initialize
関数です。
custom-initialize-changed
変数がすでにセットされている、またはカスタマイズされている場合は、変数の初期化のために:set
関数を使用し、それ以外は単にset-default
を使用します。
custom-initialize-safe-set
custom-initialize-safe-default
これらのn関数はcustom-initialize-set
、custom-initialize-default
と同様に振る舞いますが、エラーをcatchします。初期化中にエラーが発生した場合は、set-default
を使用して変数をnil
にセットして、エラーをシグナルしません。
これらの関数は事前ロードされたファイルで定義されたオプションのためのものです(requireされた変数または関数がまだ定義されていないため、standard式はエラーをシグナルするかもしれない)。その値は通常、startup.elで更新され、defcustom
により計算された値は無視されます。startup後に、その値をunsetして、defcustom
を再評価すれば、エラーなしでstandardは評価されます。
:risky value
その変数のrisky-local-variable
プロパティーをvalueにセットします(File Local Variablesを参照してください)。
:safe function
その変数のsafe-local-variable
プロパティーを、functionにセットします(File Local Variablesを参照してください)。
:set-after variables
保存されたカスタマイズに合わせて変数をセッティングするときは、その前に変数variables確実にセット —
つまり、これら他のものが処理される後までセッティングを遅延 —
してください。これら他の変数が意図された値をもっていない場合に、この変数のセッティングが正しく機能しないときは、:set-after
を使用してください。
特定の機能を“オンに切り替える”オプションにたいしては、:require
キーワードを指定すると便利です。これは、その機能がまだロードされていないときは、そのオプションがセットされるとEmacsがその機能をロードするようにします。Common Item Keywordsを参照してください。以下はライブラリーsaveplace.elの例です:
(defcustom save-place nil "Non-nil means automatically save place in each file..." :type 'boolean :require 'saveplace :group 'save-place)
あるカスタマイズアイテムが、:options
がサポートするhook
やalist
のような型をもつ場合は、custom-add-frequent-value
を呼び出すことにより、defcustom
宣言の外部から、別途値を追加できます。たとえばemacs-lisp-mode-hook
から呼び出されることを意図した関数my-lisp-mode-initialization
を定義する場合は、emacs-lisp-mode-hook
にたいする正当な値として、その定義を編集することなく、その関数をリストに追加したいと思うかもしれません。これは以下のようにして行うことができます:
(custom-add-frequent-value 'emacs-lisp-mode-hook 'my-lisp-mode-initialization)
カスタマイズオプションsymbolにたいして正当な値のリストにvalueを追加します。
追加による正確な効果は、symbolのカスタマイズ型に依存します。
内部的には、defcustom
は、標準値にたいする式を記録するためにシンボルプロパティーstandard-value
を、カスタマイズバッファーでユーザーによりセットされたが保存されていない値を記録するためにsaved-value
を使用します。Symbol Propertiesを参照してください。これらのプロパティーは、carがその値を評価する式であるようなリストです。
この関数は、defcustom
を通じて宣言されたユーザーオプションsymbolの標準値を再評価します。変数がカスタマイズされた場合、この関数はかわりに保存された値を再評価します。それからこの関数はユーザーオプションをその値に(もし定義されていればそのオプションの:set
プロパティーを使用して)セットします。
これは値が正しく計算される前に定義されたカスタマイズ可能オプションにたいして有用です。たとえばstartupの間、Emacsは事前ロードされたEmacs Lispファイルで定義されたユーザーオプションにたいしてこの関数を呼び出しますが、これらの初期値は実行時だけ利用可能な情報に依存します。
この関数は、argがカスタマイズ可能変数の場合は、非nil
をreturnします。カスタマイズ可能変数とは、standard-value
かcustom-autoload
プロパティーをもつ(通常はdefcustom
で宣言されたことを意味する)変数、または別のカスタマイズ可能変数にたいするエイリアスのことです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
defcustom
でユーザーオプションを定義するときは、ユーザーオプションのカスタマイズ型(customization
type)を指定しなければなりません。これは、(1)値が適正か、(2)編集のためにカスタマイズバッファーで値を表示する方法、を記述するLispオブジェクトです。
カスタマイズ型は、defcustom
内の:type
キーワードで指定します。:type
の引数は評価されますが、defcustom
が実行されるとき1回だけ評価されるので、さまざまな値をとる場合には有用でありません。通常はクォートされた定数を使用します。たとえば:
(defcustom diff-command "diff" "The command to use to run diff." :type '(string) :group 'diff)
一般的に、カスタマイズ型は、最初の要素が以降のセクションで定義されるカスタマイズ型の1つであるような、リストです。このシンボルの後にいくつかの引数があり、それはそのシンボルに依存します。型シンボルと引数の間には、オプションでkeyword-valueペアー(Type Keywordsを参照してください)を記述できます。
いくつかの型シンボルは引数を使用しません。これらはシンプル型(simple
types)と呼ばれます。シンプル型にたいしては、keyword-valueペアーを使用しない場合は、型シンボルの周囲のカッコ(parentheses)を省略できます。たとえばカスタマイズ型として単にstring
と記述すると、それは(string)
と等価です。
すべてのカスタマイズ型はウィジェットとして実装されます。詳細は、Introduction in The Emacs Widget Libraryを参照してください。
14.4.1 Simple Types | シンプルなカスタマイズ型(sexp、integerなど)。 | |
14.4.2 Composite Types | 他の型やデータから新しい型を構築する。 | |
14.4.3 Splicing into Lists | :inline で要素をリストに結合する。
| |
14.4.4 Type Keywords | カスタマイズ型でのキーワード/引数ペアー | |
14.4.5 Defining New Types | 型に名前をつける。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、すべてのシンプルデータ型を説明します。これらのカスタマイズ型のうちのいくつかにたいして、カスタマイズウィジェットはC-M-iまたはM-TABによる、インライン補完を提供します。
sexp
値はプリントおよび読み込むことができる任意のLispオブジェクトです。より特化した型の使用するために時間をとりたくない場合は、任意のオプションへのフォールバックとしてsexp
を使用することができます。
integer
値は整数でなければなりません。
number
値は数(浮動小数点数または整数)でなければなりません。
float
値は浮動小数点数でなければなりません。
string
値は文字列でなければなりません。カスタマイズバッファーはその文字列を区切り文字‘"’文字および‘\’クォートなしで表示します。
regexp
string
文字と同様ですが、その文字列は有効な正規表現でなければなりません。
character
値は文字コードでなければなりません。文字コードは実際には整数ですが、この型は数字を表示せずに、バッファー内にその文字を挿入することにより値を表示します。
file
値はファイル名でなければなりません。ウィジェットは補完を提供します。
(file :must-match t)
値は既存のファイル名でなければなりません。ウィジェットは補完を提供します。
directory
値はディレクトリー名でなければなりません。ウィジェットは補完を提供します。
hook
値は関数のリストでなければなりません。このカスタマイズ型はフック変数にたいして使用されます。フック内での使用を推奨される関数のリストを指定するために、フック変数のdefcustom
内で:options
キーワードを使用できます。Defining Customization Variablesを参照してください。
symbol
値はシンボルでなければなりません。これはカスタマイズバッファー内でシンボル名として表示されます。ウィジェットは補完を提供します。
function
値はラムダ式か関数名でなければなりません。ウィジェットは関数名にたいする補完を提供します。
variable
値は変数名でなければなりません。ウィジェットは補完を提供します。
face
値はフェイス名のシンボルでなければなりません。ウィジェットは補完を提供します。
boolean
値は真偽値 —
nil
かt
です。choice
とconst
を合わせて使用(次のセクションを参照)することにより、値がnil
かt
でなければならず、それぞれの値に固有の意味に適合する説明テキストを指定することもできます。
key-sequence
値はキーシーケンスです。カスタマイズバッファーは、kbd関数と同じ構文うぃ使用して、キーシーケンスを表示します。Key Sequencesを参照してください。
coding-system
値はコーディングシステム名でなければならず、M-TABで保管することができます。
color
値は有効なカラー名でなければなりません。ウィジェットはカラー名にたいする補完と、同様に*Colors*バッファーに表示されるカラーサンプルとカラー名のリストからカラー名を選択するボタンを提供します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
適切なシンプル型がないときは、複合型(composite types)を使うことができます。複合型は特定のデータによる他の型から、新しい型を構築します。指定された型またはデータは、その複合型の引数(argument)と呼ばれます。複合型は通常、以下のようなものです:
(constructor arguments…)
しかし、以下のように引数の前にkeyword-valueペアーを追加することもできます。
(constructor {keyword value}… arguments…)
以下のテーブルに、はコンストラクター(constructor)と、複合型を記述するためにそれらを使用する方法を示します:
(cons car-type cdr-type)
値はコンスセルでなければならず、CARはcar-type、CDRはcdr-typeに適合していなければなりません。たとえば、(cons
string symbol)
は、("foo" . foo)
のような値にマッチするデータ型です。
カスタマイズバッファーでは、CARとCDRは、それぞれ特定のデータ型に応じて、別々に表示・編集されます。
(list element-types…)
値は、element-typesで与えられる要素と数が正確に一致するリストでなければならず、リストの各要素はそれぞれ対応するelement-typeに適合しなければなりません。
たとえば、(list integer string
function)
は、3つの要素のリストを示し、1つ目の要素は整数、2つ目の要素は文字列、3つ目の要素は関数です。
カスタマイズバッファーでは、各要素は、それぞれ特定のデータ型に応じて、別々に表示・編集されます。
(group element-types…)
これはlist
と似ていますが、Customバッファー内でのテキストのフォーマットが異なります。list
は各要素の値を、そのタグでラベルづけしますが、group
はそれを行いません。
(vector element-types…)
これはlist
と似ていますが、リストではなくベクターでなければなりません。各要素はlist
の場合と同様に機能します。
(alist :key-type key-type :value-type value-type)
値はコンスセルのリストでなければならず、各セルのCARはカスタマイズ型key-typeのキーを表し、同じセルのCDRはカスタマイズ型value-typeの値を表します。ユーザーはkey/valueペアーの追加や削除ができ、各ペアのキーと値の両方を編集することができます。
省略された場合、key-typeとvalue-typeのデフォルトは、sexp
です。
ユーザーは指定されたkey-typeにマッチする任意のキーを追加できますが、:options
(Defining Customization Variablesを参照してください)で指定することにより、あるキーを優先的に扱うことができます。指定されたキーは、(適切な値とともに)常にカスタマイズバッファーに表示されます。また、alistにkey/valueを含める、除外する、または無効にするかを指定するチェックボックスも一緒に表示されます。ユーザーは:options
キーワード引数により指定された値は、変更できません。
:options
キーワードにたいする引数は、alist内の適切なキーにたいする仕様のリストであるべきです。これらは通常、単純なアトムであり、それらは自身をを意味します。たとえば:
:options '("foo" "bar" "baz")
これは、名前が"foo"
、"bar"
、"baz"
の、3つの“既知”のキーがあることを指定し、それらは常に最初に表示されます。
たとえば"bar"
キーに対応する値を整数だけにするというように、特定のキーに対して値の型を制限したいときがあるかもしれません。これはリスト内でアトムのかわりにリストを使用することにより、指定することができます。前述のように、1つ目の要素はそのキーを指定し、2つ目の要素は値の型を指定します。たとえば:
:options '("foo" ("bar" integer) "baz")
最後に、キーが表示される方法を変更したいときもあるかもしれません。デフォルトでは、:options
キーワードで指定された特別なキーはユーザーが変更できないので、キーは単にconst
として表示されます。しかし、たとえばそれが関数バインディングをもつシンボルだと知っている場合はfunction-item
といったように、あるキーの表示のために、より特化した型を使用したいと思うかもしれません。これは、キーに対してシンボルを使うかわりに、カスタマイズ型指定を使用することにより、行うことができます。
:options '("foo" ((function-item some-function) integer) "baz")
多くのalistは、コンスセルのかわりに2要素のリストを使用します。たとえば、
(defcustom cons-alist '(("foo" . 1) ("bar" . 2) ("baz" . 3)) "Each element is a cons-cell (KEY . VALUE).")
のかわりに以下を使用します
(defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3)) "Each element is a list of the form (KEY VALUE).")
リストはコンスセルの最上位に実装されているため、上記のlist-alist
を、コンスセルのalist(value-typeが実際の値を含む1要素のリストであるような)として扱うことができます。
(defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3)) "Each element is a list of the form (KEY VALUE)." :type '(alist :value-type (group integer)))
list
のかわりにgroup
を使用するのは、その目的に適したフォーマットのためだけです。
同様に、以下のようなトリックの類を用いることにより、より多くの値が各キー連づけられたalistを得ることができます:
(defcustom person-data '(("brian" 50 t) ("dorith" 55 nil) ("ken" 52 t)) "Alist of basic info about people. Each element has the form (NAME AGE MALE-FLAG)." :type '(alist :value-type (group integer boolean)))
(plist :key-type key-type :value-type value-type)
このカスタマイズ型はalist
(上位参照)と似ていますが、(1)情報がプロパティーリスト(Property Listsを参照してください)に格納され、(2)key-typeが省略された場合、デフォルトはsexp
ではなく、symbol
になります。
(choice alternative-types…)
値はalternative-typesのうちの1つに適合しなければなりません。たとえば、(choice integer
string)
では整数か文字列が許されます。
カスタマイズバッファーでは、ユーザーはメニューを使用して候補を選択して、それらの候補にたいして通常の方法で値を編集できます。
通常この選択からメニューの文字列が自動的に決定されます。しかし候補の中に:tag
キーワードを含めることにより、メニューにたいして異なる文字列を指定できます。たとえば、空白の数を意味する整数と、その通りに使用したいテキストにたいする文字列の場合は、以下のような方法でカスタマイズ型を記述したいかもしれません
(choice (integer :tag "Number of spaces") (string :tag "Literal text"))
この場合メニューは、‘Number of spaces’と‘Literal text’を提示します。
const
以外のnil
が有効な値ではない候補には、:value
キーワードを使用して、有効なデフォルト値を指定するべきです。Type Keywordsを参照してください。
複数の候補によりいくつかの値が提供される場合、カスタマイズは適合する値をもつ最初の候補を選択します。これは常に、もっとも特有な型を最初に、もっとも一般的な型を最後にリストすべきことを意味します。以下は適切な使い方の例です:
(choice (const :tag "Off" nil) symbol (sexp :tag "Other"))
この使い方では、特別な値nil
はその他のシンボルとは別に扱われ、シンボルは他のLisp式とは別に扱われます。
(radio element-types…)
これはchoice
と似ていますが、選択はメニューではなく、‘ラジオボタン’で表示されます。これは該当する選択にたいしてドキュメントが表示できる利点があるので、関数定数(function-item
カスタマイズ型)の選択に適す場合があります。
(const value)
値はvalueでなければならず、他は許されません。
const
は主にchoice
の中で使用されます。たとえば、(choice integer (const
nil))
では、整数かnil
が選択できます。
choice
の中では、:tag
とともにconst
が使用される場合があります。たとえば、
(choice (const :tag "Yes" t) (const :tag "No" nil) (const :tag "Ask" foo))
これはt
がyes、nil
がno、foo
が“ask”を意味することを示します。
(other value)
この候補は任意のLisp値にマッチできますが、ユーザーがこの候補を選択した場合は、値valueが選択されます。
other
は主にchoice
の最後の要素に使用されます。たとえば、
(choice (const :tag "Yes" t) (const :tag "No" nil) (other :tag "Ask" foo))
これはt
がyes、nil
がno、それ以外は“ask”を意味することを示します。ユーザーが候補メニューから‘Ask’を選択した場合は、値foo
が指定されます。しかし、その他の値(t
、nil
、foo
を除く)では、foo
と同様に‘Ask’が表示されます。
(function-item function)
const
と同様ですが、値が関数のときに使用されます。これはドキュメント文字列も関数名と同じように表示します。ドキュメント文字列は、:doc
で指定した文字列か、function自身のドキュメント文字列です。
(variable-item variable)
const
と同様ですが、値が変数名のときに使用されます。これはドキュメント文字列も変数名と同じように表示します。ドキュメント文字列は、:doc
で指定した文字列か、variable自身のドキュメント文字列です。
(set types…)
値はリストでなければならず、指定されたtypesの1つにマッチしなければなりません。
これはカスタマイズバッファーではチェックリストとして表示されるので、typesはそれぞれ対応する要素を1つ、あるいは要素をもちません。同じ1つのtypesにマッチするような、異なる2つの要素を指定することはできません。たとえば、(set
integer
symbol)
は、リスト内で1つの整数、および/または1つのシンボルが許され、複数の整数や複数のシンボルは許されません。結果として、set
内でinteger
のような特定的ではない型を使用するのは稀です。
以下のように、const
型はset
内のtypesでよく使用されます:
(set (const :bold) (const :italic))
alist内で利用できる要素を示すために使用されることもあります:
(set (cons :tag "Height" (const height) integer) (cons :tag "Width" (const width) integer))
これによりユーザーにオプションでheightとwidthの値を指定させることができます。
(repeat element-type)
値はリストでなければならず、リストの各要素は型element-typeに適合しなければなりません。カスタマイズバッファーでは要素のリストとして表示され、‘[INS]’および‘[DEL]’ボタンにより、要素の追加や削除が行われます。
(restricted-sexp :match-alternatives criteria)
これはもっとも汎用的な複合型の構築方法です。値はcriteriaを満足する任意のLispオブジェクトです。criteriaはリストで、リストの各要素は以下のうちの1つを満たす必要があります:
nil
か非nil
のどちらかをリターンする関数。リスト内での述語の使用により、その述語が非nil
をリターンするようなオブジェクトが許されることを意味する。
'object
。リスト内でこの要素は、object自身が容認される値であることを示す。
たとえば、
(restricted-sexp :match-alternatives (integerp 't 'nil))
これは整数、t
、nil
を正当な値として受け入れます。
カスタマイズバッファーは適切な値をそれらの入力構文ですべて表示し、ユーザーはこれらをテキストとして編集できます。
以下は複合型でキーワード/値ペアーとして使用できるキーワードのテーブルです:
:tag tag
tagは、ユーザーとのコミュニケーションのために、その候補の名前として使用される。choice
内に出現する型にたいして有用。
:match-alternatives criteria
criteriaは可能な値とのマッチに使用されます。restricted-sexp
内でのみ有用です。
:args argument-list
型構築の引数としてargument-listの要素を使用します。たとえば、(const :args
(foo))
は(const
foo)
と等価です。明示的に:args
とく記述する必要があるのは稀です。なぜなら、最後のキーワード/値ペアーの後に続くものは何であれ、引数として認識されるからです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
:inline
機能により、可変個の要素を、カスタマイズ型のlist
やvector
の途中にスプライス(splice:
継ぎ足す)することができます。list
やvector
記述を含む型にたいして:inline
t
を追加することによりこれを使用します。
通常list
やvector
型の仕様は、単一の要素型を表します。しかしエントリーが:inline
t
を含む場合、マッチする値は、その含まれたシーケンスに直接マージされます。たとえば、エントリーが3要素のリストにマッチする場合、全体が3要素のシーケンスになります。これはバッククォート構文(Backquoteを参照)の‘,@’に類似しています。
たとえば、最初の要素がbaz
で、残りの引数は0個以上のfoo
かbar
でなければならないリストを指定する場合は、以下のカスタマイズ型を使用します:
(list (const baz) (set :inline t (const foo) (const bar)))
これは (baz)
、(baz foo)
、(baz bar)
、(baz foo
bar)
のような値にマッチします。
要素の型がchoice
の場合は、choice
自身の中で:inline
を使用せずに、choice
の候補(の一部)の中で使用します。たとえば、最初がファイル名で開始され、その後にシンボルt
か2つの文字列を続けなければならないリストにマッチさせるには、以下のカスタマイズ型を使用します:
(list file (choice (const t) (list :inline t string string)))
選択においてユーザーが選択肢の1つ目を選んだ場合、リスト全体が2つの要素をもち、2つ目の要素はt
になります。ユーザーが2つ目の候補を選んだ場合、リスト全体が3つの要素をもち、2つ目と3つ目の要素は文字列でなければなりません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
カスタマイズ型内の型名シンボルの後にキーワード/引数ペアーを指定できます。以下は使用できるキーワードと、それらの意味です:
:value default
デフォルト値を提供する。
その候補にたいしてnil
が有効な値でない場合は、:value
に有効なデフォルトを指定することが必須になります。
choice
の内部の候補として出現する型にたいしてこれを使用する場合、ユーザーがカスタマイズバッファー内のメニューによりこの候補を選択したときに、使用するデフォルト値を最初に指定します。
もちろんオプションの実際の値がこの候補に適合する場合は、defaultではなく実際の値が表示されます。
:format format-string
この文字列は、その型に対応する値を説明するために、バッファーに挿入されます。format-string内では、以下の‘%’エスケープが利用できます:
ボタンとしてマークされたテキストbuttonを表示する。:action
属性は、ユーザーがそれを呼び出したときに、そのボタンが何を行うか指定する。この属性の値は2つの引数
— ボタンが表示されるのでウィジェットとイベント — をとる関数。
異なるアクションを行う2つの異なるボタンを指定する方法はない。
:sample-face
により指定された、スペシャルフェイス内のsampleを表示する。
そのアイテムの値を代替えする。その値がどのように表示されるかはアイテムの種類と、(カスタマイズ型にたいしては)カスタマイズ型にに依存する。
そのアイテムのドキュメント文字列を代替えする。
‘%d’と同様ふぁが、ドキュメント文字列が複数行の場合に、ドキュメント文字列全体か最初の行だけかを制御するボタンを追加する。
その位置でタグに置き換える。:tag
キーワードでタグを指定する。
リテラル‘%’を表示する。
:action action
ユーザーがボタンをクリックした場合はactionを実行します。
:button-face face
‘%[…%]’で表示されたボタンテキストにたいして、フェイスface(フェイス名、またはフェイス名のリスト)を使用します。
:button-prefix prefix
:button-suffix suffix
これらはボタンの前、または後に表示されるテキストを指定します。以下が指定できます:
nil
テキストは挿入されない。
その文字列がリテラルに挿入される。
そのシンボルの値が使用される。
:tag tag
この型に対応する値(または値の一部)にたいするタグとしてtag(文字列)を使用する。
:doc doc
この型に対応する値(または値の一部)にたいするドキュメント文字列としてdocを使用する。これが機能するためには、:format
にたいする値を指定し、その値にたいして‘%d’か‘%h’を使用しなければならない。
ある型にたいしてドキュメント文字列を指定するのは、:choice
内の候補の型や、他の複合型の一部について情報を提供するのが通常の理由である。
:help-echo motion-doc
widget-forward
やwidget-backward
でこのアイテムに移動したときに、エコーエリアに文字列motion-docを表示する。さらに、マウスのhelp-echo
文字列としてmotion-docが使用され、これは実際にはヘルプ文字列を生成するために評価される関数またはフォームかもしれない。もし関数の場合、これは1つの引数(そのウィジェット)で呼び出される。
:match function
値がその型にマッチするか判断する方法を指定する。対応する値functionは、2つの引数(ウィジェットと値)をとる関数で、値が適切なら非nil
をリターンすること。
:validate function
入力にたいして検証を行う関数を指定する。functionは引数としてウィジェットをとり、そのウィジェットのカレント値がウィジェットにたいして有効ならnil
をリターンすること。それ以外は無効なデータを含むウィジェットをリターンして、そのウィジェットの:error
プロパティに、そのエラーを説明する文字列をセットすること。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
前のセクションでは、defcustom
にたいして型の詳細な仕様を作成する方法を説明しました。そのような型仕様に名前を与えたい場合があるかもしれません。理解しやすいケースとしては、多くのユーザーオプションに同じ型を使用する場合などです。各オプションにたいして仕様を繰り返すより、その型に名前を与えて、defcustom
それぞれにその名前を使用することができます。他にもユーザーオプションの値が再帰的なデータ構造のケースがあります。あるデータ型がそれ自身を参照できるようにするためには、それが名前をもつ必要があります。
カスタマイズ型はウィジェットとして実装されているめ、新しいカスタマイズ型を定義するには、新たにウィジェット型を定義します。ここではウィジェットインターフェイスの詳細は説明しません。Introduction in The Emacs Widget Libraryを参照してください。 かわりに、シンプルな例を用いて、カスタマイズ型を新たに定義するのに必要となる、最小限の機能について説明します。
(define-widget 'binary-tree-of-string 'lazy "A binary tree made of cons-cells and strings." :offset 4 :tag "Node" :type '(choice (string :tag "Leaf" :value "") (cons :tag "Interior" :value ("" . "") binary-tree-of-string binary-tree-of-string))) (defcustom foo-bar "" "Sample variable holding a binary tree of strings." :type 'binary-tree-of-string)
新しいウィジェットを定義するための関数は、define-widget
と呼ばれます。1つ目の引数は、新たなウィジェット型にしたいシンボルです。2つ目の引数は既存のウィジェットを表すシンボルで、新しいウィジェットではこの既存のウィジェットと異なる部分を定義することになります。新たなカスタマイズ型を定義する目的にたいしては、lazy
ウィジェットが最適です。なぜならこれは、defcustom
にたいするキーワード引数と同じ構文、同じ名前でキーワード引数:type
を受け取るからです。3つ目の引数は、新しいウィジェットにたいするドキュメント文字列です。この文字列は、M-x
widget-browse RET binary-tree-of-string
RETコマンドで参照することができるようになります。
これらの必須の引数の後にキーワード引数が続きます。もっとも重要なのは:type
で、これはこのウィジェットにマッチさせたいデータ型を表します。上記の例ではbinary-tree-of-string
は文字列、またはcarとcdrがbinary-tree-of-string
であるようなコンスセルです。この定義中でのウィジェット型への参照に注意してください。:tag
属性はユーザーインターフェイスでウィジェット名となる文字列、:offset
引数はカスタマイズバッファーでのツリー構造の外観で,子ノードと関連する親ノードの間に4つのスペースを確保します。
defcustom
は、通常のカスタマイズ型に使用される方法で新しいウィジェットを表示します。
lazy
という名前の由来は、他のウィジェットの場合、それらがバッファーでインスタンス化されるとき、他の合成されたウィジェットが下位のウィジェットを内部形式に変換するからです。この変換は再帰的なので、下位のウィジェットは、それら自身の下位ウィジェットへと変換されます。データ構造自体が再帰的な場合、この変換は無限再帰(infinite
recursion)となります。lazy
ウィジェットは、:type
引数を必要なときだけ変換することにより、この再帰を防ぎます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数には、変数とフェイスにたいして、そのユーザーのカスタマイズ設定をインストールる役目があります。それらの関数は、ユーザーがカスタマイズインターフェイスで‘Save
for future
sessions’を呼び出したときに、次回のEmacs起動時に評価されるようにcustom-set-variables
フォーム、および/またはcustom-set-faces
フォームを
がカスタムファイルに書き込まれることによって効果をもちます。
この関数はargsにより指定された変数のカスタマイズをインストールします。args内の引数はそれぞれ、以下のようなフォームです
(var expression [now [request [comment]]])
varは変数名(シンボル)、expressionはカスタマイズされた値に評価される式です。
このcustom-set-variables
呼び出しより前にvarにたいしてdefcustom
フォームが評価された場合は、即座にexpressionが評価され、その変数の値にその結果がセットされます。それ以外は、その変数のsaved-value
プロパティにexpressionが格納され、これに関係するdefcustom
が呼び出されたとき(通常はその変数を定義するライブラリーがEmacsにロードされたとき)に評価されます。
now、request、commentエントリーは内部的な使用に限られており、省略されるかもしれません。nowは、もし非nil
の場合には、たとえその変数のdefcustom
フォームが評価されていなくても、その変数の値がそのときセットされます。requestは即座にロードされる機能のリストです(Featuresを参照)。commentはそのカスタマイズを説明する文字列です。
この関数はargsにより指定されたフェイスのカスタマイズをインストールします。args内の引数はそれぞれ、以下のようなフォームです
(face spec [now [comment]])
faceはフェイス名(シンボル)、specはそのフェイスにたいするカスタマイズされたフェイス仕様です(Defining Facesを参照)。
now、request、commentエントリーは内部的な使用に限られており、省略されるかもしれません。nowは、もし非nil
の場合には、たとえdefface
フォームが評価されていなくても、そのフェイス仕様がそのときセットされます。commentはそのカスタマイズを説明する文字列です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
カスタムテーマ(Custom themes)とはユニットとして有効または無効にできるセッティングのコレクションです。Custom Themes in The GNU Emacs Manualを参照してくださいカスタムテーマはそれぞれEmacs Lispソースファイルにより定義され、それらはこのセクションで説明する慣習にしたがう必要があります。(カスタムファイルを手で記述するかわりに、カスタマイズ風のインターフェイスを使用して作成することもできます。Creating Custom Themes in The GNU Emacs Manualを参照してください。)
カスタムファイルはfoo-theme.elのように命名すべきです。ここでfooはテーマの名前です。このファイルでの最初のLispフォームはdeftheme
の呼び出しで、最後のフォームはprovide-theme
にすべきです。
このマクロはカスタムテーマの名前としてtheme(シンボル)を宣言します。オプション引数docは、そのテーマを説明する文字列であるべきです。この文字列はユーザーがdescribe-theme
コマンドを呼び出したり、‘*Custom
Themes*’バッファーで?をタイプしたときに表示されます。
2つの特別なテーマ名は禁止されています(それらを使用するとエラーになります)。user
は、そのユーザーの直接的なカスタマイズ設定を格納するための“ダミー”のテーマです。そしchanged
はカスタムシステムの外で行われた変更を格納するための“ダミー”のテーマです。
このマクロは完全に仕様が定められたテーマ名themeを宣言します。
deftheme
とprovide-theme
の違いは、そのテーマセッティングを規定するLispフォーム(通常はcustom-theme-set-variables
の呼び出し、および/またはcustom-theme-set-faces
の呼び出し)です。
この関数は、カスタムテーマthemeの変数のセッティングを規定します。themeはシンボルです。args内の各引数はフォームのリストです。
(var expression [now [request [comment]]])
ここでリストエントリーはcustom-set-variables
のときと同じ意味をもちます。Applying Customizationsを参照してください。
この関数は、カスタムテーマthemeのフェイスのセッティングを規定します。themeはシンボルです。args内の各引数はフォームのリストです。
(face spec [now [comment]])
ここでリストエントリーはcustom-set-faces
のときと同じ意味をもちます。Applying Customizationsを参照してください。
原則的に、テーマファイルは他のLispフォームを含むこともでき、それらはそのテーマがロードされるときに評価されるでしょうが、これは“悪いフォーム”です。悪意のあるコードを含むテーマのロードを防ぐために、最初に非ビルトインテーマをロードする前に、Emacsはソースファイルを表示して、ユーザーにたいして確認を求めます。
以下の関数は、テーマをプログラム的に有効または無効にするのに有用です:
この関数はtheme(シンボル)がカスタムテーマの名前の場合(たとえば、そのテーマが有効かどうかにかかわらず、カスタムテーマがEmacsにロードされていれば)、非nil
をリターンします。それ以外はnil
をリターンします。
この変数の値は、Emacsにロードされたテーマのリストです。テーマはそれぞれ、Lispシンボル(テーマ名)により表されます。この変数のデフォルト値は、2つの“ダミーテーマ”を含みます:
(user
changed)
。changed
テーマには、カスタムテーマが適用される前に行われたセッティング(たとえばカスタムの外部での変数のセット)が格納されています。user
テーマには、そのユーザーがカスタマイズして保存したセッティングが格納されています。deftheme
マクロで宣言された任意の追加テーマは、このリストの先頭に追加されます。
この関数はthemeという名前のカスタムテーマを、変数custom-theme-load-path
で指定されたディレクトリーを探して、ソースファイルからロードします。Custom
Themes in The GNU Emacs
Manualを参照してください。また、そのテーマの変数とフェイスのセッティングが効果を及ぼすようにテーマをenablesにします(オプション引数no-enableが非nil
でない場合)さらに、オプション引数no-confirmが非nil
でない場合は、そのテーマをロードする前にユーザーに確認を求めます。
この関数はthemeという名前のカスタムテーマを有効にします。そのようなテーマがロードされていない場合は、エラーをシグナルします。
この関数はthemeという名前のカスタムテーマを無効にします。テーマはロードされたまま残りので、続けてenable-theme
を呼び出せばテーマは再び有効になります。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispコードのファイルをロードすることは、その内容をLispオブジェクト形式でLisp環境に取り込むことを意味します。Emacsはファイルを探してオープンし、テキストを読み込んで各フォームを評価してから、そのファイルをクローズします。そのようなファイルはLispライブラリー(Lisp library)とも呼ばれます。
eval-buffer
関数がバッファー内のすべての式を評価するのと同様に、load関数はファイル内のすべての式を評価します。異なるのはEmacsバッファー内のテキストではなく、load関数はディスク上で見つかったファイル内のテキストを読み込み、評価することです。
ロードされたファイルは、ソースコードかバイトコンパイルされたコードとしてLisp式を含んでいなければなりません。このファイル内の各フォームは、トップレベルフォーム(top-level form)と呼ばれます。ロード可能なファイル内のフォームにたいする特別なフォーマットはありません。ファイル内のフォームはどれも、同じように直接バッファーにタイプされ、そこで評価されるでしょう(実際、ほとんどのコードはこの方法でテストされます)。多くの場合、そのフォームは関数定義と変数定義です。
外部ライブラリーのオンデマンドローディングについては、Dynamically Loaded Librariesを参照してください。
15.1 How Programs Do Loading | load 関数、その他。
| |
15.2 Load Suffixes | load が試みられるサフィックスについての詳細。
| |
15.3 Library Search | ロードするライブラリーの検索。 | |
15.4 Loading Non-ASCII Characters | Emacs Lispファイル内の非ASCII文字。 | |
15.5 Autoload | オートロードのための関数のセットアップ。 | |
15.6 Repeated Loading | ファイルを2度ロードする場合の配慮。 | |
15.7 Features | まだロードされていないライブラリーのロード。 | |
15.8 Which File Defined a Certain Symbol | 特定のシンボルがどのファイルで定義されているかの検索。 | |
15.9 Unloading | ロードされたライブラリーを"unload"する方法。 | |
15.10 Hooks for Loading | 特定のライブラリーがロードされたとき実行されるコードの提供。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispにはロードのためのインターフェイスがいくつかあります。たとえば、autoload
はファイル内で定義された関数にたいしてプレースホルダーとなるオブジェクトを作成します。この関数はオートロードされる関数を呼び出すために、ファイルからその関数の実際の定義の取得を試みます(Autoloadを参照)。require
は、ファイルがまだロードされていない場合にファイルをロードします(Featuresを参照)。これらすべての関数は、処理を行うために最終的にload
を呼び出します。
この関数はLispコードのファイルを見つけてオープンし、その中のすべてのフォームを評価して、そのファイルをクローズします。
ファイルを見つけるために、まずload
はfilename.elcという名前、つまりfilenameに拡張子‘.elc’を足した名前のファイルを探します。このようなファイルが存在したら、それをロードします。その名前のファイルが存在しない場合、load
はfilename.elという名前のファイルを探します。このファイルが存在したら、それをロードします。最後に、もしこれらの名前がどちらも見つからなかった場合、load
は何も付け足さないfilenameという名前のファイルを探して、それが存在したらロードします。(load
関数にfilenameを認識する賢さはありません。foo.el.elのような正しくない名前のファイルの場合も、(load
"foo.el")
の評価によりそれを見つけてしまいます。)
Auto
Compressionモードが有効(残念ながらデフォルトでは有効ですが)の場合、load
は他のファイル名を試みる前に圧縮されたバージョンのファイル名を探すので、ファイルを見つけることができません。圧縮されたファイルが存在したら、それを解凍してロードします。load
はファイル名にjka-compr-load-suffixes
内の各サフィックスを足して、圧縮されたバージョンを探します。この変数の値は、文字列のリストでなければなりません。標準的な値は(".gz")
です。
オプション引数nosuffixが非nil
の場合load
はサフィックス‘.elc’と‘.el’を試みません。この場合、ロードしたいファイルの正確な名前を指定しなければなりません。ただしAuto
Compressionモードが有効な場合には、load
は圧縮されたバージョンを探すために、jka-compr-load-suffixes
を使用します。正確なファイル名の指定と、、nosuffixにたいしてt
を使用することにより、foo.el.elのような名前のファイルにたいするロードの試みを抑止できます。
オプション引数must-suffixが非nil
の場合、load
はロードに使用されるファイルの名前に明示的にディレクトリー名が含まれていなければ、ファイル名が‘.el’か‘.elc’で終わること(あるいは圧縮による拡張子が付加されているかもしれません)を要求します。
オプションload-prefer-newer
が非nil
の場合、load
はサフィックスを検索するとき、どのファイルであっても(‘.elc’、‘.el’など)、もっとも最近変更されたファイルのバージョンを選択します。
filenameがfooやbaz/foo.barのような相対ファイル名の場合、load
は変数load-path
を使用してそのファイルを探します。これはload-path
内にリストされた各ディレクトリーにfilenameを追加して、最初に見つかったら名前のマッチするファイルをロードします。デフォルトディレクトリーを意味するnil
がload-path
で措定されたときだけ、カレントデフォルトディレクトリーを試みます。load
はload-path
内の最初のディレクトリーで利用可能な3つのサフィックスすべてを試行してから、2つ目のディレクトリーで3つのサフィックスすべてを試行する、というようにファイルを探します。Library Searchを参照してください。
最終的に見つかったファイル、およびEmacsがそのファイルを見つけたディレクトリーが何であれ、Emacsはそのファイル名を変数load-file-name
の値にセットします。
foo.elcがfoo.elより古いと警告された場合、それはfoo.elのリコンパイルを考慮すべきことを意味します。Byte Compilationを参照してください
(コンパイルされていない)ソースファイルをロードしたとき、Emacsがファイルをvisitしたときと同じようにload
は文字セットの変換を行います。Coding Systemsを参照してください。
コンパイルされていないファイルをロードするとき、Emacsはそのファイルに含まれる任意のマクロ(Macrosを参照)を展開します。わたしたちはこれをeagerマクロ展開(eager macro expansion)と呼んでいます。(関連するコードを実行するまで展開を延期するのではなく)これを行うことにより、コンパイルされていないコード実行のスピードが明らかに向上します。このマクロ展開は、循環参照により行うことができないときもあります。これの一番簡単な例は、ロードしようとしているファイルが他のファイルで定義されているマクロを参照しているが、そのファイルはロードしようとしているファイルを必要としている場合です。これは一般的には無害です。Emacsは問題の詳細を与えるために警告(‘Eager macro-expansion skipped due to cycle…’)をプリントしますが、単にその時点ではマクロを展開せずに、そのファイルはロードされます。あなたはこの問題が発生しないように、コードをリストラクチャーしたいと思うかもしれません。コンパイル済みファイルでは、マクロ展開はコンパイル時に行われるので、ロード時のマクロ展開は行われません。Macros and Byte Compilationを参照してください。
nomessageが非nil
でない場合は、ロードの間、エコーエリアに‘Loading
foo...’や‘Loading foo...done’のようなメッセージが表示されます。
ファイルをロードする間のハンドルされないエラーは、ロードを終了させます。autoload
のためのロードの場合、ロードの間に定義された任意の関数定義は元に戻されます。
load
がロードするファイルを見つけられなかった場合、通常は(‘Cannot open load file
filename’のメッセージとともに)エラーfile-error
がシグナルされます。しかしmissing-okが非nil
の場合、load
は単にnil
をリターンします。
式の読み取りにたいしてload
がread
のかわりに使用する関数を指定するために、変数load-read-function
を使用できます。以下を参照してください。
ファイルが正常にロードされた場合、load
はt
をリターンします。
このコマンドは、ファイルfilenameをロードします。filenameが相対ファイル名の場合は、カレントデフォルトディレクトリーとみなされます。このコマンドは、load-path
を使用せず、サフィックスの追加もしません。しかし、(Auto
Compressionモードが有効な場合は)圧縮されたバージョンの検索を行います。ロードするファイル名を正確に指定したい場合は、このコマンドを使用してください。
このコマンドはlibraryという名前のライブラリーをロードします。このコマンドは、引数を読み取る方法がインタラクティブであることを除き、load
と同じです。Lisp
Libraries in The GNU Emacs Manualを参照してください。
この変数は、Emacsがファイルをロード中のときは非nil
、それ以外はnil
です。
このセクションの最初に説明した検索でEmacsがファイルを見つけて、そのファイルをロード中のとき、この変数の値はそのファイルの名前です。
この変数は、load
とeval-region
が式の読み取るために、read
のかわりに使用する関数を指定します。指定する関数はread
と同様、引数が1つの関数です。
通常、この変数の値はnil
で、これはそれらの関数がread
を使用すべきことを意味します。
この変数を使用するかわりに、別の新たな方法を使用するほうが明確です。eval-region
のread-function引数に、その関数を渡す方法です。Evalを参照してください。
Emacsのビルドでload
がどのように使用されているかについての情報は、Building Emacsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ここでは、load
が試行するサフィックスについて、技術的な詳細を説明します。
これは(ソースまたはコンパイル済みの)Emacs
Lispファイルを示すサフィックスのリストです。空の文字列が含まれるべきではありません。load
は、指定されたファイル名にLispファイルのサフィックスを追加するときに、これらのサフィックスを使用します。標準的な値は(".elc"
".el")
で、これは前のセクションで説明した振る舞いとなります。
これは同じファイルにたいする異なる表現を示すサフィックスのリストです。このリストは空の文字列から開始されるべきです。load
はファイルを検索するときは、他のファイルを検索する前にこのリストのサフィックスを順番にファイル名に追加します。
Auto
Compressionモードを有効にすることによりjka-compr-load-suffixes
のサフィックスがこのリストに追加され、無効にすると再びリストから取り除かれます。load-file-rep-suffixes
の標準的な値は、Auto
Compressionモードが無効な場合は("")
です。jka-compr-load-suffixes
の標準的な値が(".gz")
であることを考慮すると、Auto
Compressionモードが有効な場合のload-file-rep-suffixes
の標準的な値は(""
".gz")
です。
この関数は、must-suffix引数が非nil
のときは、load
が試みるべきすべてのサフィックスを順番にしたがったリストでリターンします。この関数はload-suffixes
とload-file-rep-suffixes
の両方を考慮に入れます。load-suffixes
、jka-compr-load-suffixes
、load-file-rep-suffixes
がすべて標準的な値の場合、この関数はAuto
Compressionモードが有効なら(".elc" ".elc.gz" ".el"
".el.gz")
、無効なら(".elc" ".el")
をリターンします。
まとめると、load
は通常まず(get-load-suffixes)
の値のサフィックスを試み、つぎにload-file-rep-suffixes
を試みます。nosuffixが非nil
の場合は前者がスキップされ、must-suffixが非nil
の場合は後者がスキップされます。
このオプションが非nil
の場合は、ファイルが見つかった最初のサフィックスで停止せずに、load
はすべてのサフィックスをテストして、一番新しいファイルを使用します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
EmacsがLispライブラリーをロードするときは、変数load-path
.<により指定されるディレクトリー内のライブラリーを検索します。
この変数の値は、load
でファイルをロードするとき検索するディレクトリーのリストです。リストの各要素は文字列(ディレクトリー名でなければなりません)、またはnil
(カレントワーキングディレクトリーを意味します)です。
Emacsは起動時にいくつかのステップによりload-path
の値をセットアップします。最初に、Emacsがコンパイルされたときのデフォルトロケーションセット(default
locations set)を使用して、load-path
を初期化します。通常これは以下のようなディレクトリーです
"/usr/local/share/emacs/version/lisp"
(以下の例では、あなたがインストールしたEmacsのインストールプレフィクスに合うように/usr/localを置き換えてください。)これらのディレクトリーには、Emacsとともにインストールされた、標準的なLispファイルが含まれます。Emacsがこれらを見つけられない場合は、正常に起動しないでしょう。
Emacsをビルドしたディレクトリーから起動した場合 −−− つまり正式にインストールされた実行形式ではないEmacsを起動した場合
— 、Emacsはビルドされたディレクトリーのソースのlispディレクトリーを使用してload-path
を初期化します。ソースとは別のディレクトリーでEmacsをビルドした場合は、ビルドしたディレクトリーのlispディレクトリーも追加します。(どちらの場合も、要素は絶対ファイル名になります。)
--no-site-lispオプションでEmacsを起動した場合を除き、load-path
の先頭に2つのさらにsite-lispを追加します。これらはローカルにインストールされたLispファイで、通常は:
"/usr/local/share/emacs/version/site-lisp"
と
"/usr/local/share/emacs/site-lisp"
の形式です。1つ目は特定のバージョンのEmacsにたいしてローカルにインストールされたものです。2つ目はインストールされたすべてのバージョンのEmacsが使用することを意図してローカルにインストールされたものです。(インストールされたものでないEmacsが実行された場合は、もし存在すればソースディレクトリーとビルドディレクトリーのsite-lispディレクトリーも追加します。これらのディレクトリーは通常、site-lispディレクトリーを含みません。)
環境変数EMACSLOADPATH
がセットされている場合は、上述の初期化プロセスが変更されます。Emacsは、この環境変数の値にもとづいてload-path
を初期化します。
EMACSLOADPATH
の構文は、PATH
で使用される構文と同様です。ディレクトリー名は‘:’(オペレーティングシステムによっては‘;’)で区切られます。
以下は、(sh
スタイルのシェルから)EMACSLOADPATH
変数をセットする例です:
export EMACSLOADPATH=/home/foo/.emacs.d/lisp:
環境変数の値内の空の要素は、(上記例のような)末尾、先頭、中間にあるかに関わらず、標準の初期化処理により決定されるload-path
のデフォルト値に置き換えられます。そのような空要素が存在しない場合には、EMACSLOADPATH
によりload-path
全体が指定されます。空要素、または標準のLispファイルを含むディレクトリーへの明示的なパスのどちらかを含めなければなりません。さもないとEmacsが関数を見つけられなくなります。(load-path
を変更する他の方法は、Emacs起動時にコマンドラインオプション-Lを使用する方法です。以下参照。)
load-path
内の各ディレクトリーにたいし、Emacsはそのディレクトリーがファイルsubdirs.elを含むか確認し、もしあればそれをロードします。subdirs.elファイルは、load-path
のディレクトリーみたいして任意のサブディレクトリーを追加するためのコードが含まれており、Emacsがビルド/インストールされたとき作成されます。サブディレクトリーと複数階層下のレベルのサブディレクトリーの両方が、直接追加されます。ただし、名前の最初が英数字でないディレクトリー、名前がRCSまたはCVSのディレクトリー、名前が.nosearchというファイルを含むディレクトリーは除外されます。
Emacsは次に、コマンドラインオプション-L(Action Arguments in The GNU Emacs Manualを参照)で指定したロードディレクトリーを追加します。もしあれば、オプションパッケージ(Packaging Basicsを参照)がインストールされた場所も追加します。
initファイル(The Init Fileを参照)で、load-path
に1つ以上のディレクトリーを追加するコードを記述するのは一般的に行なわれています。たとえば:
(push "~/.emacs.d/lisp" load-path)
Emacsのダンプには、load-path
の特別な値を使用します。ダンプされたEmacsをカスタマイズするためにsite-load.elまたはsite-init.elを使用する場合、これらのファイルが行ったload-path
にたいする変更はすべて、ダンプ後失われます。
このコマンドは、ライブラリーlibraryの正確なファイル名を探します。load
と同じ方法でライブラリーを検索し、引数nosuffixもload
の場合と同じ意味です。libraryに指定する名前には、サフィックス‘.elc’または‘.el’を追加しないでください。
pathが非nil
の場合は、load-path
のかわりにディレクトリーのリストが使用されます。
locate-library
がプログラムから呼び出されたときは、ファイル名を文字列としてリターンします。ユーザーがインタラクティブにlocate-library
を実行したときは、引数interactive-callがt
となり、これはlocate-library
にたいしてファイル名をエコーエリアに表示するよう指示します。
このコマンドは、シャドー(shadowed)されたEmacs
Lispファイルを表示します。シャドーされたファイルとは、load-path
のディレクトリーに存在するにも関わらず、load-path
のディレクトリーリスト内で前の位置にある他のディレクトリーに同じ名前のファイルが存在するため、通常はロードされないファイルのことです。
たとえば、以下のようにload-path
がセットされていたとします
("/opt/emacs/site-lisp" "/usr/share/emacs/23.3/lisp")
そして、両方のディレクトリーにfoo.elという名前のファイルがあるとします。この場合、(require
'foo)
は決して2つ目のディレクトリーのファイルをロードしません。このような状況は、Emacsがインストールされた方法に問題があることを示唆します。
Lispから呼び出された場合、この関数はバッファー内に表示するかわりに、シャドーされたファイルリストのメッセージをプリントします。オプション引数stringp
が非nil
の場合は、かわりにシャドーされたファイルを文字列としてリターンします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispプログラムが非ASCII文字の文字列定数を含むとき、Emacsではそれらをユニバイト文字列またはマルチバイト文字列のどちらかで表現される場合があります。どちらの表現が使用されるかは、そのファイルがどのようにEmacsに読み込まれたかに依存します。マルチバイト表現へのデコーディングとともに読み込まれた場合、Lispプログラム内のテキストはマルチバイトのテキストとなり、ファイル内の文字列定数はマルチバイト文字列になります。(たとえば)Latin-1文字を含むファイルをデコーディングなしで読み込んだ場合、そのプログラムのテキストはユニバイトのテキストとなり、ファイル内の文字列定数はユニバイト文字列になります。Coding Systemsを参照してください。
マルチバイト文字列がユニバイトバッファーに挿入されるときは自動的にユニバイトに変換されるため、大部分のEmacs
Lispプログラムにおいて、マルチバイト文字列が非ASCII文字列であるという事実を意識させないようにすべきです。しかしこれが行われことにより違いが生じる場合には、ローカル変数セクションに‘coding:
raw-text’と記述することにより、特定のLispファイルを強制的にユニバイトとして解釈させることができます。この識別子により、そのファイルは無条件でユニバイトとして解釈されます。これは、?vliteral
で記述された非ASCII文字にキーバインドするとき重要になります。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オートロード(autoload: 自動ロード)の機能により、定義されているファイルをロードすることなく、関数やマクロの存在を登録できます。関数の最初の呼び出しで、実際の定義およびその他の関連するコードをインストールするために適切なライブラリーを自動的にロードし、すべてがすでにロードされていたかのように、実際の定義を実行します。関数やマクロのドキュメントを参照することによっても、オートロードが発生します(Documentation Basicsを参照)。
オートロードされた関数をセットアップするには、2つの方法があります。それはautoload
を呼び出す方法と、ソースの実際の定義の前に、特別な“マジック”コメントを記述する方法です。autoload
はオートロードのための低レベルのプリミティブです。任意のLispプログラムが、任意のときにautoload
を呼び出すことができます。Emacsととみにインストールされるパッケージにとって、マジックコメントは関数をオートロードできるようににするための一番便利な方法です。コメント自身は何も行いませんが、コマンドupdate-file-autoloads
にたいするガイドを努めます。このコマンドはautoload
の呼び出しを構築し、Emacsビルド時に実行されるようアレンジします。
この関数は、filenameから自動的にロードされるように、functionという名前の関数(またはマクロ)を定義します。文字列filenameのは、functionの実際の定義を取得するファイルを指定します。
filenameがディレクトリー名とサフィックス.el
と.elc
のどちらも含まない場合、この関数はこれらの強制的にサフィックスを追加します。つまりサフィックスが追加されないただのfilenameという名前のファイルはロードされません。(変数load-suffixes
により要求される正確なサフィックスが指定されます。)
引数docstringは、その関数のドキュメント文字列です。autoload
の呼び出しでドキュメント文字列を指定することにより、その関数の実際の定義をロードせずにドキュメントを見ることが可能になります。この引数の値は通常、関数定義のドキュメント文字列と等しくあるべきです。もし等しくない場合は、その関数のドキュメント文字列がロード時に有効になります。
interactiveが非nil
の場合、その関数はインタラクティブに呼び出すことが可能になります。これにより、functionの実際の定義をロードせずに、M-xによる補完が機能するようになります。。ここでは、完全なインタラクティブ指定は与えられません。完全な指定はユーザーが実際にfunctionを呼び出すまで必要ありません。実際にユーザーが呼び出したときに、実際の定義がロードされます。
普通の関数と同様、マクロおよびキーマップをオートロードできます。functionが実際にはマクロの場合はtypeにmacro
を指定し、キーマップの場合にはtypeにkeymap
を指定します。Emacsのさまざまな部分は、実際の定義をロードせずに、これらの情報を知る必要があるのです。
オートロードされたキーマップは、あるプレフィクスキーがシンボルfunctionにバインドされているときにキーを探す間に、自動的にロードされます。そのキーマップにたいする他の類のアクセスでは、オートロードは発生しません。特に、Lispプログラムが変数の値からそのキーマップを取得してdefine-key
を呼び出した場合には、たとえその変数の名前がシンボルfunctionと同じであっても、オートロードは起こりません。
functionが非voidのオートロードされたオブジェクトではない関数定義をもつ場合、その関数は何も行わずnil
をリターンします。それ以外は、オートロードされたオブジェクト(Autoload Typeを参照)を作成して、それをfunctionにたいする関数定義として格納します。オートロードされたオブジェクトは、以下の形式をもちます:
(autoload filename docstring interactive type)
たとえば、
(symbol-function 'run-prolog) ⇒ (autoload "prolog" 169681 t nil)
このような場合、"prolog"
はロードするファイルの名前、169681はemacs/etc/DOCファイル(Documentation Basicsを参照)内のドキュメント文字列への参照で、t
はその関数がインタラクティブであり、nil
はそれがマクロやキーマップでないことを意味します。
この関数は、objectがオートロードされたオブジェクトの場合、非nil
をリターンします。たとえば、run-prolog
がオートロードされたオブジェクトかチェックするには、以下を評価します
(autoloadp (symbol-function 'run-prolog))
オートロードされたファイルは、通常は他の定義を含み、1つ以上の機能を必要あるいは提供するかもしれません。(内容の評価でのエラーにより)そのファイルが完全にロードされていない場合、そのロードの間に行われた関数定義やprovide
の呼び出しはアンドゥされます。これは、このファイルからオートロードされる関数にたいして再度呼び出しを試みたときに、そのファイルを確実に再ロードさせるためです。このようにしないと、そのファイル内のいくつかの関数はアボートしたロードにより定義されていて、それらはロードされなかった修正後のファイルで提供される正しいサブルーチンを欠くため、正しく機能しないからです。
オートロードされたファイルが意図したLisp関数、またはマクロの定義に失敗した場合には、データ"Autoloading failed to
define function function-name"
とともにエラーがシグナルされます。
オートロードのマジックコメント(autoload
cookieとも呼ばれる)は、オートロード可能なソースファイル内の実際の定義の直前にある、‘;;;###autoload’だけの行から構成されます。コマンドM-x
update-file-autoloadsは、対応するautoload
呼び出しをloaddefs.el内に書き込みます。(autoload
cookieとなる文字列と、update-file-autoloads
により生成されるファイルの名前は、上述のデフォルトから変更可能です。以下を参照。)
Emacsのビルドではloaddefs.elをロードするためにautoload
を呼び出します。M-x
update-directory-autoloadsは、より強力です。このコマンドはカレントディレクトリー内のすべてのファイルにたいするオートロードを更新します。
このマジックコメントは、任意の種類のフォームを、loaddefs.el内にコピーできます。このマジックコメントに続くフォームは、そのままコピーされます。しかしオートロード機能が特別に処理するフォームの場合は除外されます(たとえばautoload
内への変換)。以下は、そのままコピーされないフォームです:
defun
とdefmacro
。cl-defun
とcl-defmacro
(Argument
Lists in Common Lisp
Extensionsを参照)、およびdefine-overloadable-function
(mode-local.el内のコメントを参照)も該当
define-minor-mode
、define-globalized-minor-mode
、define-generic-mode
、define-derived-mode
、easy-mmode-define-minor-mode
、easy-mmode-define-global-mode
、define-compilation-mode
、define-global-minor-mode
。
defcustom
、defgroup
、defclass
(EIEIO in EIEIOを参照)、およびdefine-skeleton
(skeleton.el内のコメントを参照)。
ビルド時に、そのファイル自身をロードするときにフォームを実行しないように、マジックコメントを使用することもできます。これを行なうには、マジックコメントと同じ行にフォームを記述します。これはコメントなので、ソースファイルをロードするとき何も行いません。ただしM-x update-file-autoloadsは、Emacsビルド時に実行されたものは、M-x update-file-autoloadsにコピーします。
以下は、マジックコメントによるオートロードのためにdoctor
を準備する例です:
;;;###autoload (defun doctor () "Switch to *doctor* buffer and start giving psychotherapy." (interactive) (switch-to-buffer "*doctor*") (doctor-mode))
これにより、以下がloaddefs.el内に書き込まれます:
(autoload (quote doctor) "doctor" "\ Switch to *doctor* buffer and start giving psychotherapy. \(fn)" t nil)
ダブルクォートの直後のバックスラッシュまたは改行は、loaddefs.elのようなプリロードされた未コンパイルだけに使用される慣習です。これは、make-docfile
にたいして、ドキュメント文字列をetc/DOCファイルに配するよう指示します。Building Emacsを参照してください。また、lib-src/make-docfile.c内のコメントも参照してください。ドキュメント文字列の使い方(usage
part)の中の‘(fn)’は、種々のヘルプ関数(Help Functionsを参照)が表示するとき、その関数の名前に置き換えられます。
関数定義手法として既知ではなく、認められてもいないような、通常とは異なるマクロにより関数定義を記述した場合、通常のオートロードのマジックコメントの使用により、定義全体がloaddefs.el
内にコピーされるでしょう。これは期待した動作ではありません。かわりに以下を記述することにより、意図したautoload
呼び出しをloaddefs.el
内に配することができます。
;;;###autoload (autoload 'foo "myfile") (mydefunmacro foo ...)
autoload cookieとして、デフォルト以外の文字列を使用して、デフォルトのloaddefs.elとは異なるファイル内に、対応するオートロード呼び出しを記述できます。これを制御するために、Emacsは2つの変数を提供します:
この変数の値は、Lispコメントの文法に準じた文字列です。M-x
update-file-autoloadsは、そのcookieの後のLispフォームを、cookieが生成したオートロードファイル内にコピーします。この変数のデフォルト値は、";;;###autoload"
です。
この変数の値は、オートロード呼び出しが書き込まれるEmacs Lispファイルを命名します。デフォルト値はloaddefs.elですが、(たとえば.elファイル内のセクション“Local Variables”))をオーバーライドできます。オートロードファイルは、フォームフィード文字で開始される終端を含んでいると仮定されます。
以下の関数は、オートロードオブジェクトにより指定されたライブラリーを明示的にロードするために使用されるかもしれません:
この関数はオートロードオブジェクトautoloadにより指定されたロードを処理します。オプション引数nameに非nil
を指定する場合は、関数値がautoloadとなるシンボルを指定します。この場合、この関数のリターン値は、そのシンボルの新しい関数値になります。オプション引数macro-onlyの値がmacro
の場合、この関数は関数ではなくマクロのロードだけを有効にします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
1つのEmacsセッション内で、ファイルを複数回ロードできます。たとえば、バッファーで関数定義を編集して再インストールした後に、元のバージョンに戻したいときがあるかもしれません。これは、元のファイルをリロードすることにより行なうことができます。
ファイルをロードまたはリロードするとき、load
およびload-library
関数は未コンパイルのファイルではなく、バイトコンパイルされた同名のファイルを自動的にロードすることに留意してください。ファイルを再記述して保存後に再インストールする場合には、新しいバージョンをバイトコンパイルする必要があります。さもないと、Emacsは新しいソースではなく、古いバイトコンパイルされたファイルをロードしてしまうでしょう!
その場合には、ファイルロード時に表示されるメッセージに、そのファイルのリコンパイルを促す‘(compiled; note, source is
newer)’というメッセージが含まれます。
Lispライブラリーファイル内にフォームを記述するときは、そのファイルが複数回ロードされるかもしれないことに留意してください。たとえば、そのライブラリーをリロードするときには、各変数が最初期化されるべきかどうか考慮してください。。変数がすでに初期化されている場合、defvar
はその変数の値を変更しません(Defining Global Variablesを参照)。
alistに要素を追加するもっともシンプルな方法は、以下のようなものでしょう:
(push '(leif-mode " Leif") minor-mode-alist)
しかし、これはそのライブラリーがリロードされた場合は、複数の要素を追加してしまうでしょう。この問題を避けるには、add-to-list
(Modifying List Variablesを参照)を使用します:
(add-to-list 'minor-mode-alist '(leif-mode " Leif"))
時には、ライブラリーが既にロード済みか、明示的にテストしたいときがあるでしょう。そのライブラリーがprovide
を使用して名前付きフィーチャ(named
feature)を提供する場合は、featurep
を使用して前にprovide
が実行されているかテストすることができます。かわりに、以下のようにすることもできます:
(defvar foo-was-loaded nil) (unless foo-was-loaded execute-first-time-only (setq foo-was-loaded t))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
provide
とrequire
は、autoload
にかわるファイルを自動的にロードする関数です。これらは名前付きのフィーチャ(feature:
機能)という面で機能します。オートロードは特定の関数の呼び出しをトリガーにしますが、フィーチャーは最初は他のプログラムが名前により問い合わせたときにロードされます。
フィーチャ名とは、関数、変数などのコレクションを表すシンボルです。これらを定義するファイルは、そのフィーチャをプロバイド(provide: 提供)すべきです。これらのフィーチャを使用する他のプログラムは、その機能をリクワイア(require: 要求)することにより、それらが定義されているか確認できるでしょう。これは、定義がまだロードされていなければ、定義ファイルをロードします。
フィーチャをリクワイアするには、フィーチャ名を引数としてrequire
を呼び出します。require
は、意図する機能がすでにプロバイドされているか確認するために、グローバル変数features
を調べます。もしプロバイドされていなければ、適切なファイルからそのフィーチャをロードします。このファイルは、そのフィーチャをfeatures
に追加するために、トップレベルでprovide
を呼び出すべきです。これに失敗すると、require
はエラーをシグナルします。
たとえば、idlwave.el内のidlwave-complete-filename
にたいする定義には、以下のコードが含まれます:
(defun idlwave-complete-filename () "Use the comint stuff to complete a file name." (require 'comint) (let* ((comint-file-name-chars "~/A-Za-z0-9+@:_.$#%={}\\-") (comint-completion-addsuffix nil) ...) (comint-dynamic-complete-filename)))
式(require
'comint)
は、comint.elがまだロードされていなければ、comint-dynamic-complete-filename
が確実に定義されるように、そのファイルをロードします。フィーチャは通常、それらを提供するファイルにしたがって命名されるため、require
にファイル名を与える必要はありません。(require
命令文がlet
のボディーの外側にあるのが重要なことに注意してください。変数がletバインドされているライブラリーをロードすることにより、意図せぬ結果、つまりletをexitした後にその変数がアンバインドされます。)
comint.elには以下のトップレベル式が含まれます:
(provide 'comint)
これはcomint
はグローバルなリストfeatures
に追加するので、(require
'comint)
は今後何も行う必要がないことを知ることができます。
ファイルのトップレベルrequire
が使用されたときは、それをロードしたときと同様、そのファイルをバイトコンパイル(Byte Compilationを参照)したときにも効果が表れます。これはリクワイアされたパッケージがマクロを含み、バイトコンパイラーがそれを知らなければならない場合です。これはrequire
によりロードされるファイルで定義される関数と変数にたいするバイトコンパイラーの警告も無効にします。
バイトコンパイルの間にトップレベルのrequire
が評価されるとしても、provide
呼び出しは評価されません。したがって、以下の例のようにprovide
の後に同じ機能にたいするrequire
を含めることにより、バイトコンパイル前に定義しているファイルを確実にロードできます。
(provide 'my-feature) ; バイトコンパイラーには無視され、
; load
には評価される。
(require 'my-feature) ; バイトコンパイラーにより評価される。
コンパイラーはprovide
を無視して、その後に対象のファイルをロードすることによりrequire
が処理されます。ファイルのロードはprovide
呼び出しを実行するので、後続のrequire
はファイルがロードされているときは何も行いません。
この関数は、カレントEmacsセッションにfeatureがロードされた、あるいはロードされつつあることをアナウンスします。これは、featureに関連する機能が他のLispプログラムから利用可能できる、あるいは利用可能になることを意味します。
provide
を呼び出すことによる直接的な効果は、まだfeatureがfeatures内に存在しない場合はリストの先頭に追加して、それを必要としているeval-after-load
コードを呼び出します(Hooks for Loadingを参照)。引数featureはシンボルでなければなりません。provide
はfeatureをリターンします。
subfeaturesが与えられた場合、それはfeatureの当該バージョンによりプロバイドされる特定のサブフィーチャのセットを示すシンボルのリストであるべきです。featurep
を使用して、サブフィーチャの存在をテストできます。あるパッケージの、ロードされるか、あるいはそのバージョンに存在するか不明なさまざまな部分や機能に名前を与えて使いやすくするには、そのパッケージが複雑すぎるときにサブフィーチャを使用するというのがサブフィーチャというアイデアです。例としては、Testing Availability of Network Featuresを参照してください。
features ⇒ (bar bish) (provide 'foo) ⇒ foo features ⇒ (foo bar bish)
オートロードによりあるファイルがロードされて、その内容の評価エラーによりストップいたとき、そのロードの間に発生した関数定義やprovide
呼び出しはアンドゥされます。Autoloadを参照してください。
この関数はカレントEmacsセッションにおいて、featureが存在するかどうかを、((featurep
feature)
を使用して。以下を参照)をチェックします。引数featureはシンボルでなければなりません。
そのフィーチャが存在しない場合、require
はload
によりfilenameをロードします。filenameが与えられなかった場合は、シンボルfeatureの名前がロードするファイル名のベースとして使用されます。しかしこの場合、require
はfeatureを探すためにサフィックス‘.el’および‘.elc’の追加を強制します(圧縮ファイルのサフィックスに拡張されるかもしれません)。名前がただのfeatureというファイルは使用されません。(変数load-suffixes
は要求されるLispサフィックスを正確に指定します。)
noerrorが非nil
の場合は、ファイルの実際のロードにおけるエラーを抑止します。この場合、そのファイルのロードが失敗すると、require
はnil
をリターンします。通常では、require
はfeatureをリターンします。
ファイルのロードは成功したがfeatureをプロバイドしていない場合、require
は‘Required
feature feature was not provided’のようにエラーをシグナルします。
この関数は、カレントEmacsセッションfeatureがプロバイドされている場合(たとえばfeaturefeatures
のメンバーの場合)はt
をリターンします。subfeatureが非nil
の場合、この関数はサブフィーチャも同様にプロバイドされているとき(たとえばsubfeatureがシンボルfeatureのプロパティsubfeature
のメンバーのとき)だけt
をリターンします。
この変数の値はシンボルのリストで、このシンボルはカレントEmacsセッションにロードされたフィーチャです。シンボルはそれぞれprovide
を呼び出すことにより、このリストにputされたものです。リストfeatures
内の要素の順番に意味はありません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は、symbolを定義しているファイルの名前をリターンします。typeがnil
の場合は、どのようなタイプの定義も受け入れられます。typeがdefun
の場合は関数定義、defvar
は変数定義、defface
はフェイス定義だけを指定します。
値は通常、絶対ファイル名です。定義がどのファイルにも関係しないときは、nil
になることもあります。symbolがオートロード関数を指定する場合、値が拡張子なしの相対ファイル名になることもあります。
symbol-file
は変数load-history
.<の値にもとづいています。
この変数の値は、ロードされたライブラリーファイルの名前を、それらが定義する関数と変数の名前、およびそれらがプロバイドまたはリクワイアするフィーチャに関連付けるalistです。
このalist内の各要素は、1つのロード済みライブラリー(スタートアップ時にプリロードされたライブラリーを含む)を記述します。要素はCARがライブラリーの絶対ファイル名(文字列)のリストです。残りのリスト要素は、以下の形式です:
var
シンボルvarが変数として定義された。
(defun . fun)
関数funが定義された。
(t . fun)
関数funは、このライブラリーがそれを関数として再定義する前はオートロードとして定義されていた。後続の要素は常に(defun
. fun)
で、これはfunを関数として定義する。
(autoload . fun)
関数funはオートロードとして定義された。
(defface . face)
フェイスfaceが定義された。
(require . feature)
フィーチャfeatureがリクワイアされた。
(provide . feature)
フィーチャfeatureがプロバイドされた。
load-history
の値には、CARがnil
の要素が1つ含まれるかもしれません。この要素は、ファイルをvisitしていないバッファーでのeval-buffer
で作成された定義を記述します。
コマンドeval-region
はload-history
を更新しますが、要素を置き換えずに、visitされているファイルの要素にたいして定義されたシンボルを追加します。Evalを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他のLispオブジェクト用にメモリーを回収するために、ライブラリーによりロードされた関数や変数を破棄することができます。これを行うには、関数unload-feature
を使用します:
このコマンドはフィーチャfeatureをプロバイドしていたライブラリーをアンロードします。そのライブラリー内のdefun
、defalias
、defsubst
、defmacro
、defconst
、defvar
、defcustom
により定義されたすべての関数、マクロ、変数は未定義になります。その後、それらのシンボルにたいして事前に関連付けられていたオートロードをリストアします。(ロードはシンボルのautoload
プロパティにこれらを保存しています。)
以前の定義をリストアする前に、特定のフックからそのライブラリー内の関数を取り除くために、unload-feature
はremove-hook
を実行します。これらのフックには、名前が‘-hook’(または廃止されたサフィックス‘-hooks’)で終わる変数、加えてunload-feature-special-hooks
、同様にauto-mode-alist
にリストされた変数も含まれます。これは、重要なフックがすでに定義されていない関数を参照をすることにより、Emacsの機能が停止することを防ぐためです。
標準的なアンロードアクティビティは、そのライブラリー内の関数のELPプロファイリングを取り消し、そのライブラリーによりプロバイドされたフィーチャを取り消し、そのライブラリーで定義された変数に保持されたタイマーも取り消します。
これらの基準が機能不全を防ぐのに十分でない場合、ライブラリーはfeature-unload-function
という名前の明示的なアンローダーを定義できます。そのシンボルが関数として定義された場合、unload-feature
は何かを行う前にまず引数なしでそれを呼び出します。これはライブラリーをアンロードしるために適切なすべてのことを行うことができます。これがnil
をリターンした場合、unload-feature
は通常のアンロードアクションを処理します。それ以外は、アンロード処理は完了したとみなします。
unload-feature
は通常、他のライブラリーが依存するライブラリーのアンロードを拒絶します。(ライブラリーbにたいするrequire
がライブラリーaに含まれる場合、aはbに依存します。)オプション引数forceが非nil
の場合、依存関係は無視され、どのようなライブラリーもアンロードできます。
unload-feature
関数はLispで記述されており、その動作は変数load-history
にもとづきます。
この変数には、ライブラリー内で定義された関数を取り除くために、ライブラリーをアンロードする前にスキャンされるフックのリストが保持されています。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数after-load-functions
を使用することにより、Emacsがライブラリーをロードするたびにコードを実行させることができます:
このアブノーマルフック(abnormal hook)は、ファイルをロードした後に実行されます。フック内の各関数は1つの引数(ロードされたファイルの絶対ファイル名)で呼び出されます。
特定のライブラリーがロードされた後にコードを実行したい場合は、マクロwith-eval-after-load
を使用します:
このマクロはlibraryがロードされるたびに、ファイルlibraryのロードの最後でbodyが評価されるよう準備します。libraryがすでにロード済みの場合は、即座にbodyを評価します。
ファイル名libraryにディレクトリーや拡張子を与える必要はありません。通常は以下のようにファイル名だけを与えます:
(with-eval-after-load "edebug" (def-edebug-spec c-point t))
どのファイルが評価をトリガーできるか制限するには、ディレクトリーか拡張子、またはしの両方をlibraryに含めます。実際のファイル名(たとえばすべてのシンボリックリンク名は除外される)が、与えられた名前すべてにマッチするファイルだけが、マッチします。以下の例では、どこかのディレクトリー..../foo/bar
にあるmy_inst.elcやmy_inst.elc.gzは評価をトリガーしますが、my_inst.elは異なります。:
(with-eval-after-load "foo/bar/my_inst.elc" …)
libraryはフィーチャ(たとえばシンボル)でもよく、その場合(provide
library)
を呼び出す任意のファイルの最後にbodyが評価されます。
body内のエラーはロードをアンドゥしませんが、bodyの残りの実行を妨げます。
上手く設計されたLispプログラムは通常、eval-after-load
を使用するべきではありません。(外部からの使用を意図した)他のライブラリーで定義された変数を調べたりセットする必要がある場合、それは即座に行うことができます
−−−
そのライブラリーがロードされるのを待つ必要はありません。そのライブラリーで定義された関数を呼び出す必要がある場合は、そのライブラリーをロードすべきで、それにはrequire
(Featuresを参照)が適しています。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispには、Lispで記述された関数を、より効率的に実行できるバイトコード(byte-code)と呼ばれる特別な表現に翻訳するコンパイラー(compiler)があります。コンパイラーはLispの関数定義をバイトコードに置き換えます。バイトコード関数が呼び出されたとき、その定義はバイトコードインタープリター(byte-code interpreter)により評価されます。
バイトコンパイルされたコードは、(本当のコンパイル済みコードのように)そのマシンのハードウェアにより直接実行されるのではなく、バイトコンパイラーにより評価されるため、バイトコードはリコンパイルしなくてもマシン間での完全な可搬性を有します。しかし、本当にコンパイルされたコードほど高速ではありません。
一般的に、任意のバージョンのEmacsはそれ以前のバージョンのEmacsにより生成されたバイトコンパイル済みコードを実行できますが、逆は成り立ちません。
あるLispファイルを常にコンパイルせずに実行したい場合は、以下のようにno-byte-compile
にバインドするファイルローカル変数を配します:
;; -*-no-byte-compile: t; -*-
16.1 Performance of Byte-Compiled Code | バイトコンパイルによるスピードアップ例。 | |
16.2 Byte-Compilation Functions | バイトコンパイル関数。 | |
16.3 Documentation Strings and Compilation | ドキュメント文字列のダイナミックロード。 | |
16.4 Dynamic Loading of Individual Functions | 個々の関数のダイナミックロード。 | |
16.5 Evaluation During Compilation | コンパイル時に評価されるコード。 | |
16.6 Compiler Errors | コンパイラーのエラーメッセージの扱い。 | |
16.7 Byte-Code Function Objects | バイトコンパイル済み関数に使用されるデータ型。 | |
16.8 Disassembled Byte-Code | バイトコードの逆アセンブル; バイトコードの読み方。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バイトコンパイルされた関数はCで記述されたプリミティブ関数ほど効率的ではありませんがLispで記述されたバージョンよりは高速に実行されます。以下は例です:
(defun silly-loop (n) "Return the time, in seconds, to run N iterations of a loop." (let ((t1 (float-time))) (while (> (setq n (1- n)) 0)) (- (float-time) t1))) ⇒ silly-loop
(silly-loop 50000000) ⇒ 10.235304117202759
(byte-compile 'silly-loop)
⇒ [コンパイルされたコードは表示されない]
(silly-loop 50000000) ⇒ 3.705854892730713
この例では、インタープリターによる実行には10秒を要しますが、バイトコンパイルされたコードは4秒未満です。これは典型的な結果例ですが、実際の結果はさまざまでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
byte-compile
により、関数やマクロを個別にバイトコンパイルできます。byte-compile-file
でファイル全体、byte-recompile-directory
またはbatch-byte-compile
で複数ファイルをコンパイルできます。
バイトコンパイラーが警告、および/またはエラーメッセージを生成することもあります(詳細はCompiler Errorsを参照)。これらのメッセージはCompilationモードが使用する*Compile-Log*と呼ばれるバッファーに記録されます。Compilation Mode in The GNU Emacs Manualを参照してください。
バイトコンパイルを意図したファイル内にマクロ呼び出しを記述する際は、注意が必要です。マクロ呼び出しはコンパイル時に展開されるので、そのマクロはEmacsにロードされる必要があります(さもないとバイトコンパイラーは正しく処理しないでしょう)。これを処理する通常の方法は、必要なマクロ定義を含むファイルをrequire
フォームで指定することです。バイトコンパイラーは通常、コンパイルするコードを評価しませんが、require
フォームは指定されたライブラリーをロードすることにより特別に扱われます。誰かがコンパイルされたプログラムを実行する際に、マクロ定義ファイルのロードを回避するには、require
呼び出しの周囲にeval-when-compile
を記述します(Evaluation During Compilationを参照)。詳細はMacros and Byte Compilationを参照してください。
インライン(defsubst
)の関数は、これほど面倒ではありません。定義が判明する前にそのような関数呼び出しをコンパイルした場合でも、その呼び出しは低速になるだけで、正しく機能するでしょう。
この関数はsymbolの関数定義をバイトコンパイルして、以前の定義をコンパイルされた定義に置き換えます。symbolの関数定義は、その関数にたいする実際のコードでなければなりません。byte-compile
はインダイレクト関数を処理しません。リターン値は、symbolのコンパイルされた定義であるバイトコード関数ブジェクトです(Byte-Code Function Objectsを参照)。
(defun factorial (integer) "INTEGERの階乗を計算する。" (if (= 1 integer) 1 (* integer (factorial (1- integer))))) ⇒ factorial
(byte-compile 'factorial) ⇒ #[(integer) "^H\301U\203^H^@\301\207\302^H\303^HS!\"\207" [integer 1 * factorial] 4 "Compute factorial of INTEGER."]
symbolの定義がバイトコード関数オブジェクトの場合、byte-compile
は何も行わずnil
をリターンします。そのシンボルの関数セル内の(コンパイルされていない)オリジナルのコードはすでにバイトコンパイルされたコードに置き換えられているので、“シンボルの定義の再コンパイル”はしません。
byte-compile
の引数としてlambda
式も指定できます。この場合、関数は対応するコンパイル済みコードをリターンしますが、それはどこにも格納されません。
このコマンドはポイントを含むdefunを読み取りそれをコンパイルして、結果を評価します。実際に関数定義であるようなdefunでこれを使用した場合は、その関数のコンパイル済みバージョンをインストールする効果があります。
compile-defun
は通常、評価した結果をエコーエリアに表示しますが、argが非nil
の場合は、そのフォームをコンパイルした後にカレントバッファーに結果を挿入します。
この関数はfilenameという名前のLispコードファイルを、バイトコードのファイルにコンパイルします。出力となるファイルの名前は、サフィックス‘.el’を‘.elc’に変更することにより作成されます。filenameが‘.el’で終了しない場合は、‘.elc’をfilenameの最後に付け足します。
コンパイルは入力ファイルから1つのフォームを逐次読み取ることにより機能します。フォームが関数またはマクロの場合は、コンパイル済みの関数またはマクロが書き込まれます。それ以外のフォームはまとめられて、まとめられたものごとにコンパイルされ、そのファイルが読まれたとき実行されるようにコンパイルされたコードが書き込まれます。入力ファイルを読み取る際、すべてのコメントは無視されます。
このコマンドはエラーのないときはt
、それ以外はnil
をリターンします。インタラクティブに呼び出されたときは、ファイル名の入力をもとめます。
loadが非nil
の場合、このコマンドはコンパイルした後にコンパイルされたファイルをロードします。インタラクティブに呼び出された場合、loadはプレフィクス引数です。
$ ls -l push* -rw-r--r-- 1 lewis lewis 791 Oct 5 20:31 push.el
(byte-compile-file "~/emacs/push.el") ⇒ t
$ ls -l push* -rw-r--r-- 1 lewis lewis 791 Oct 5 20:31 push.el -rw-rw-rw- 1 lewis lewis 638 Oct 8 20:25 push.elc
このコマンドは、directory(またはそのサブディレクトリー)内の、リコンパイルを要するすべての‘.el’ファイルをリコンパイルします。‘.elc’ファイルが存在し、それが‘.el’より古いファイルは、リコンパイルが必要です。
‘.el’ファイルに対応する‘.elc’ファイルが存在しない場合、何を行うかをflagで指定します。nil
の場合、このコマンドはこれらのファイルを無視します。flagが0のときは、それらをコンパイルします。nil
と0以外の場合は、それらのファイルをコンパイルするかユーザーに尋ね、同様にそれぞれのサブディレクトリーについても尋ねます。
インタラクティブに呼び出された場合、byte-recompile-directory
はdirectoryの入力を求め、flagはプレフィクス引数になります。
forceが非nil
の場合、このコマンドは‘.elc’ファイルのあるすべての‘.el’ファイルをリコンパイルします。
リターン値は不定です。
この関数は、コマンドラインで指定されたファイルにたいして、byte-compile-file
を実行します。この関数は処理が完了するとEmacsをkillするので、Emacsのバッチ実行だけで使用しなければなりません。1つのファイルでエラーが発生しても、それにより後続のファイルにたいする処理が妨げられることはありませんが、そのファイルにたいする出力ファイルは生成されず、Emacsプロセスは0以外のステータスコードで終了します。
noforceが非nil
の場合、この関数は最新の‘.elc’ファイルがあるファイルをリコンパイルしません。
$ emacs -batch -f batch-byte-compile *.el
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsがバイトコンパイルされたファイルから関数や変数をロードする際、通常はメモリー内にそれらのドキュメント文字列をロードしません。それぞれのドキュメント文字列は、必要なときだけバイトコンパイルされたファイルから“ダイナミック(dynamic: 動的)”にロードされます。ドキュメント文字列の処理をスキップすることにより、メモリーが節約され、ロードが高速になります。
この機能には欠点があります。コンパイル済みのファイルを削除、移動、または(新しいバージョンのコンパイル等で)変更した場合、Emacsは前にロードされた関数や変数のドキュメント文字列にアクセスできなくなるでしょう。このような問題は通常、あなた自身がEmacsをビルドした場合に、そのLispファイルを編集、および/またはリコンパイルしたときだけ発生します。この問題は、リコンパイル後にそれぞれのファイルをリロードするだけで解決します。
バイトコンパイルされたファイルからのドキュメント文字列のダイナミックロードは、バイトコンパイルされたファイルごとに、コンパイル時に決定されます。これはオプションbyte-compile-dynamic-docstrings
により、無効にできます。
これが非nil
の場合、バイトコンパイラーはドキュメント文字列をダイナミックロードするようセットアップしたコンパイル済みファイルを生成します。
特定のファイルでダイナミックロード機能を無効にするには、以下のようにヘッダー行(Local
Variables in Files in The GNU Emacs
Manualを参照)で、このオプションにnil
をセットします。
-*-byte-compile-dynamic-docstrings: nil;-*-
これは主に、あるファイルを変更しようとしていて、そのファイルをすでにロード済みのEmacsセッションがファイルを変更した際にも正しく機能し続けることを望む場合に有用です。
内部的には、ドキュメント文字列のダイナミックロードは、特殊なLispリーダー構成‘#@count’とともにコンパイル済みファイルに書き込むことにより達成されます。この構成は、次のcount文字をスキップします。さらに‘#$’構成も使用され、これは“このファイルの名前(文字列)”を意味します。これらの構成をLispソースファイル内で使用しないでください。これらは人間がファイルを読む際に明確であるようデザインされていません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルをコンパイルするとき、オプションでダイナミック関数ロード(dynamic function loading)機能(laxyロード(lazy loading)とも呼ばれる)を有効にできます。ダイナミック関数ロードでは、ファイルのロードでファイル内の関数定義は完全には読み込まれません。かわりに、各関数定義にはそのファイルを参照するプレースホルダーが含まれます。それぞれ関数が最初に呼び出されるときに、そのプレースホルダーを置き換えるために、ファイルから完全な定義が読み込まれます。
ダイナミック関数ロードの利点は、ファイルのロードがより高速になることです。ユーザーが呼び出せる関数を多く含むファイルにとって、それらの関数のうち1つを使用したら、おそらく残りの関数も使用するというのでなければ、これは利点です。多くのキーボードコマンドを提供する特化したモードは、このパターンの使い方をする場合があります。ユーザーはそのモードを呼び出すかもしれませんが、使用するのはそのモードが提供するコマンドのわずか一部です。
ダイナミックロード機能には、いくつか不利な点があります:
このような問題は、通常の状況でインストールされたEmacsファイルでは決して発生しません。しかし、あなたが変更したLispファイルでは発生し得ます。それぞれのファイルをリコンパイルしたらすぐに、新たなコンパイル済みファイルをリロードするのが、これらの問題を回避する一番簡単な方法です。
コンパイル時に変数byte-compile-dynamic
が非nil
の場合、バイトコンパイラーはダイナミック関数ロード機能を使用します。ダイナミックロードが望ましいのは特定のファイルにたいしてだけなので、この変数をグローバルにセットしないでください。そのかわりに、特定のソースファイルのファイルローカル変数で、この機能を有効にしてください。たとえば、ソースファイルの最初の行に以下のテキストを記述することにより、これを行うことができます:
-*-byte-compile-dynamic: t;-*-
これが非nil
の場合、バイトコンパイラーはダイナミック関数ロードのためにセットアップされたコンパイル済みファイルを生成します。
functionがバイトコード関数オブジェクトの場合、それがまだ完全にロードされていなければ、バイトコンパイル済みのファイルからのfunctionのバイトコードのロードを完了させます。それ以外は、何も行いません。この関数は、常にfunctionをリターンします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらの機能により、プログラムのコンパイル中に評価されるコードを記述できます。
このフォームは、それを含むコードがコンパイルされるとき、および(コンパイルされているかいないかに関わらず)実行されるときの両方で、bodyが評価されるようにマークします。
bodyを別のファイルに配し、そのファイルをrequire
で参照すれば、同様の結果が得られます。これはbodyが大きいとき望ましい方法です。事実上、require
は自動的にeval-and-compile
され、そのパッケージはコンパイル時と実行時の両方でロードされます。
autoload
も実際はeval-and-compile
されます。これはコンパイル時に認識されるので、そのような関数の使用により警告“not
known to be defined”は生成されません。
ほとんどのeval-and-compile
の使用は、完全に妥当であると言えます。
あるマクロがマクロの結果を構築するためのヘルパー関数をもち、そのマクロがそのパッケージにたいしてローカルと外部の両方で使用される場合には、コンパイル時と後の実行時にそのヘルパー関数を取得するために、eval-and-compile
を使用すべきです。
関数がプログラム的に(fset
で)定義されている場合には、それがコンパイル時、同様に実行時に行われるように使用でき、それらの関数への呼び出しはチェックされます(“not
known to be defined”の警告は抑えられます)。
このフォームは、bodyがコンパイル時に評価され、コンパイルされたプログラムがロードされるときは評価されないようにマークします。コンパイラーによる評価の結果は、コンパイル済みのプログラム内の定数となります。ソースファイルをコンパイルではなくロードした場合、bodyは通常どおり評価されます。
生成するために何らかの計算が必要な定数がある場合、eval-when-compile
はコンパイル時にそれを行なうことができます。たとえば、
(defvar my-regexp (eval-when-compile (regexp-opt '("aaa" "aba" "abb"))))
他のパッケージを使用しているが、そのパッケージのマクロ(バイトコンパイラーはそれらを展開します)だけが必要な場合、それらを実行せずにコンパイル用にロードさせるためにeval-when-compile
を使用できます。たとえば、
(eval-when-compile (require 'my-macro-package))
これらの事項は、マクロおよびdefsubst
関数がローカルに定義され、そのファイル内だけで使用されることを要求します。これらは、そのファイルのコンパイルに必要ですが、コンパイル済みファイルの実行には、ほとんどの場合必要ありません。たとえば、
(eval-when-compile (unless (fboundp 'some-new-thing) (defmacro 'some-new-thing () (compatibility code))))
これは大抵他のバージョンのEmacsとの互換性にたいする保証だけのためのコードにたいして有用です。
Common Lispに関する注意: トップレベルでは、eval-when-compile
はCommon
Lispのイディオム(eval-when (compile eval)
…)
に類似しています。トップレベル以外では、Common
Lispのリーダーマクロ‘#.’(ただし解釈時を除く)が、eval-when-compile
と近いことを行います。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バイトコンパイルのエラーメッセージと警告メッセージは、*Compile-Log*という名前のバッファーにプリントされます。これらのメッセージには、問題となる箇所を示すファイル名と行番号が含まれます。これらのメッセージにたいして、コンパイラー出力を操作する通常のEmacsコマンドが使用できます。
あるエラーがプログラムのシンタックスに由来する場合、バイトコンパイラーはエラーの正確な位置の取得に際し混乱するかもしれません。バッファー *Compiler Input*.にスイッチするのは、これを調べ1つの方法です。(このバッファー名はスペースで始まるので、Buffer Menuに表示されません。)このバッファーにはコンパイルされたプログラムと、バイトコンパイラーが読み取れた箇所からポイントがどれほど離れているかが含まれ、エラーの原因はその近傍にあるかもしれません。シンタックスエラーを見つけるヒントについては、Debugging Invalid Lisp Syntaxを参照してください。
定義されていない関数や変数の使用は、バイトコンパイラーにより報告される警告のタイプとしては一般的です。そのような警告では、定義されていない関数や変数を使用した位置ではなく、そのファイルの最後の行の行番号が報告されるので、それを見つけるには手作業で検索しなければなりません。
定義のない関数や変数の警告が間違いだと確信できる場合には、警告を抑制する方法がいくつかあります:
fboundp
によるテストを行なうことで抑制できます:
(if (fboundp 'func) ...(func ...)...)
funcへの呼び出しはif
文のthen-form内になければならず、funcはfboundp
呼び出し内でクォートされていなければなりません。(この機能はcond
でも同様に機能します。)
boundp
テストで抑制できます:
(if (boundp 'variable) ...variable...)
variableへの参照はif
文のthen-form内になければならず、variableはboundp
呼び出し内でクォートされていなければなりません。
declare-function
を使用して定義されていると告げることができます。Telling the Compiler that a Function is Definedを参照してください。
defvar
を使用して定義されているとコンパイラーに告げることができます。(これはその変数を特別な変数としてマークすることに注意してください。Defining Global Variablesを参照してください。
with-no-warnings
構成を使用して特定の式にたいするコンパイラーのすべての任意の警告を抑制することもできます:
実行時には〜これは(progn
body...)
と等価ですが、コンパイラーはbodyの中で起こるいかなる事項にたいしても警告を発しません。
わたしたちは、あなたが抑制したいと意図する警告以外の警告を失わないようにするために、可能な限り小さいコード断片にたいしてこの構成を使用することを推奨します。
変数byte-compile-warnings
をセットすることにより、コンパイラーの警告をより詳細に制御できます。詳細は、変数のドキュメント文字列を参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バイトコンパイルされた関数は、特別なデータ型、バイトコード関数オブジェクト(byte-code function objects)をもちます。関数呼び出しとしてそのようなオブジェクトが出現したとき、Emacsはそのバイトコードを実行するために、常にバイトコードインタープリターを使用します。
内部的には、バイトコード関数オブジェクトはベクターによく似ています。バイトコード関数オブジェクトの要素には、aref
を通じてアクセスできます。バイトコード関数オブジェクトのプリント表現(printed
representation)はベクターに似ていて、開き‘[’の前に‘#’が追加されます。バイト関数オブジェクトは少なくとも4つの要素をもたねばならず、要素数に上限はありません。しかし通常使用されるのは、最初の6要素です。これらは:
シンボル引数のリスト。
バイトコード命令を含む文字列。
バイトコードにより参照されるLispオブジェクトのベクター。関数名と変数名に使用されるシンボルが含まれる。
この関数が要するスタックの最大サイズ。
(もしあれば)ドキュメント文字列。それ以外はnil
。ドキュメント文字列がファイルに格納されている場合、値は数字かリストかもしれない。本当のドキュメント文字列の取得には、関数documentation
を使用する(Access to Documentation Stringsを参照)。
(もしあれば)インタラクティブ仕様。文字列かLisp式。インタラクティブでない関数ではnil
。
以下は、バイトコード関数オブジェクトのプリント表現の例です。これはコマンドbackward-sexp
の定義です。
#[(&optional arg) "^H\204^F^@\301^P\302^H[!\207" [arg 1 forward-sexp] 2 254435 "^p"]
バイトコードオブジェクトを作成する原始的な方法は、make-byte-code
です:
この関数はelementsを要素とするバイトコードオブジェクトを構築して、リターンします。
あなた自身が要素を収集してバイトコード関数を構築しないでください。それらが矛盾する場合、その関数の呼び出しによりEmacsがクラッシュするかもしれません。これらのオブジェクトの作成は、常にバイトコンパイラーにまかせてください。バイトコンパイラーは、要素を矛盾なく構築します(願わくば)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
人はバイトコードを記述しません。それはバイトコンパイラーの仕事です。しかし、好奇心を満たすために、わたしたちはディスアセンブラを提供しています。ディスアセンブラは、バイトコードを人間が読めるフォームに変換します。
バイトコードインタープリターは、シンプルなスタックマシンとして実装されています。これは値を自身のスタックにpushして、計算で使用するためにそれらをpopして取り出し、おの結果を再びそのスタックにpushして戻します。バイトコード関数がリターンするときは、スタックから値をpopして取り出し、その関数の値としてリターンします。
それに加えてスタックとバイトコード関数は、値を変数とスタックの間で転送することにより、普通のLisp変数を使用したり、バインドおよびセットすることができます。
このコマンドは、objectにたいするディスアセンブルされたコードを表示します。インタラクティブに使用した場合、またはbuffer-or-nameがnil
か省略された場合は、*Disassemble*という名前のバッファーに出力します。buffer-or-nameが非nil
の場合は、バッファーもしくは既存のバッファーの名前でなければなりません。その場合は、そのバッファーのポイント位置に出力され、ポイントは出力の前に残りされます。
引数objectには関数名、ラムダ式(Lambda Expressionsを参照)、またはバイトコードオブジェクト(Byte-Code Function Objectsを参照)を指定できます。ラムダ式の場合、disassemble
はそれをコンパイルしてから、そのコンパイル済みコードをディスアセンブルします。
以下にdisassemble
関数を使用した例を2つ示します。バイトコードとLispソースを関連付ける助けとなるように、説明的なコメントを追加してあります。これらのコメントは、disassemble
の出力にはありません。
(defun factorial (integer) "Compute factorial of an integer." (if (= 1 integer) 1 (* integer (factorial (1- integer))))) ⇒ factorial
(factorial 4) ⇒ 24
(disassemble 'factorial) -| byte-code for factorial: doc: Compute factorial of an integer. args: (integer)
0 varref integer ; integer
の値を取得して
; それをスタック上にpushする。
1 constant 1 ; スタック上に1をpushする。
2 eqlsign ; 2つの値をスタックからpopして取り出し、 ; それらを比較して結果をスタック上にpushする。
3 goto-if-nil 1 ; スタックのトップをpopしてテストする。
; nil
なら1へ、それ以外はcontinue。
6 constant 1 ; スタックのトップに1をpushする。
7 return ; スタックのトップの要素をリターンする。
8:1 varref integer ;integer
の値をスタック上にpushする。 9 constant factorial ;factorial
をスタック上にpushする。 10 varref integer ;integer
の値をスタック上にpushする。 11 sub1 ;integer
をpopして値をデクリメントする。 ; スタック上に新しい値をpushする。 12 call 1 ; スタックの最初(トップ)の要素を引数として ; 関数factorial
を呼び出す。 ; リターン値をスタック上にpushする。
13 mult ; スタックのトップ2要素をpopして取り出し乗じ ; 結果をスタック上にpushする。 14 return ; スタックのトップ要素をリターンする。
silly-loop
は幾分複雑です:
(defun silly-loop (n) "Return time before and after N iterations of a loop." (let ((t1 (current-time-string))) (while (> (setq n (1- n)) 0)) (list t1 (current-time-string)))) ⇒ silly-loop
(disassemble 'silly-loop) -| byte-code for silly-loop: doc: Return time before and after N iterations of a loop. args: (n)
0 constant current-time-string ; current-time-string
を
; スタック上のトップにpushする。
1 call 0 ; 引数なしでcurrent-time-string
を呼び出し
; 結果をスタック上にpushする。
2 varbind t1 ; スタックをpopしてt1
にpopされた値をバインドする。
3:1 varref n ; 環境からn
の値を取得して
; その値をスタック上にpushする。
4 sub1 ; スタックのトップから1を減ずる。
5 dup ; スタックのトップを複製する。 ; たとえばスタックのトップをコピーしてスタック上にpushする。 6 varset n ; スタックのトップをpopして ;n
をその値にバインドする。 ;; (要はシーケンスdup varset
はpopせずに ;; スタックのトップをn
の値にコピーする。)
7 constant 0 ; スタック上に0をpushする。 8 gtr ; スタックのトップ2値をpopして取り出し ; nが0より大かテストし ; 結果をスタック上にpushする。
9 goto-if-not-nil 1 ; n
> 0なら1へ
; (これはwhile-loopを継続する)
; それ以外はcontinue。
12 varref t1 ;t1
の値をスタック上にpushする。 13 constant current-time-string ;current-time-string
を ; スタックのトップにpushする。 14 call 0 ; 再度current-time-string
を呼び出す。
15 unbind 1 ; ローカル環境のt1
をアンバインドする。
16 list2 ; スタックのトップ2要素をpopして取り出し
; それらのリストを作りスタック上にpushする。
17 return ; スタックのトップの値をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lispプログラム内の問題を見つけて詳細に調べる方法が、いくつかあります。
入出力の問題をデバックする便利なその他のツールに、ドリブルファイル(dribble file: Terminal Inputを参照)と、open-termscript
関数(Terminal Output)があります。
17.1 The Lisp Debugger | Emacs Lisp評価機能にたいするデバッガ。 | |
17.2 Edebug | Emacs Lispソースレベルデバッガ。 | |
17.3 Debugging Invalid Lisp Syntax | シンタックスエラーを見つける方法。 | |
17.4 Test Coverage | プログラムのすべての分岐を確実にテストする。 | |
17.5 Profiling | あなたのコードが使用するリソースの計測。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
普通のLispデバッガは、フォーム評価のサスペンド機能を提供します。評価がサスペンド(一般的にはbreakの状態として知られる)されている間、実行時スタックを調べたり、ローカル変数やグローバル変数の値を調べたり変更することができます。breakは再帰編集(recursive edit)なので、Emacsの通常の編集機能が利用可能です。デバッガにエンターするようにプログラムを実行することさえ可能です。Recursive Editingを参照してください。
17.1.1 Entering the Debugger on an Error | エラー発生時にデバッガにエンターする。 | |
17.1.2 Debugging Infinite Loops | exitしないプログラムの停止デバッグ。 | |
17.1.3 Entering the Debugger on a Function Call | 特定の関数が呼び出されたときにデバッガにエンターする。 | |
17.1.4 Explicit Entry to the Debugger | プログラム内の特定箇所でデバッガにエンターする。 | |
17.1.5 Using the Debugger | デバッガが行なうこと: そこで何を目にするか。 | |
17.1.6 Debugger Commands | デバッガで使用するコマンド。 | |
17.1.7 Invoking the Debugger | 関数debug の呼び出し方。
| |
17.1.8 Internals of the Debugger | デバッガのサブルーチン、およびグローバル変数。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
デバッガに入る一番重要なタイミングは、Lispエラーが発生したときです。デバッガでは、エラーの直接原因を調査できます。
しかしデバッガへのエンターは、エラーによる通常の結末ではありません。多くのコマンドは不適切に呼び出されたときにLispエラーをシグナルするので、通常の編集の間にこれが発生するたびデバッガにエンターするのは、とても不便でしょう。したがって、エラーの際にデバッガにエンターしたい場合は、変数debug-on-error
に非nil
をセットします。(コマンドtoggle-debug-on-error
は、これを簡単に行う方法を提供します。)
この変数はエラーがシグナルされ、それがハンドルされていないときに、デバッガが呼び出されるかどうかを決定します。debug-on-error
がt
の場合は、debug-ignored-errors
(以下を参照)にリストされているエラーを除く、すべての種類のエラーがデバッガを呼び出します。nil
の場合は、デバッガを呼び出しません。
値にはエラー条件(How to Signal an Errorを参照)のリストも指定できます。その場合、このリスト内のエラー条件だけにより、デバッガが呼び出されます(debug-ignored-errors
にもリストされているエラー条件は除外されます)。たとえば、debug-on-error
をリスト(void-variable)
にセットした場合には、値をもたない変数に関するエラーにたいしてだけデバッガが呼び出されます。
eval-expression-debug-on-error
がこの変数をオーバーライドする場合がいくつかあることに注意してください(以下を参照)。
この変数が非nil
のとき、Emacsはプロセスフィルター関数と番兵(sentinel)の周囲にエラーハンドラーを作成しません。したがって、これらの関数内でのエラーは、デバッガを呼び出します。Processesを参照してください。
この変数は、debug-on-error
の値に関わらず、デバッガにエンターすべきでないエラーを指定します。変数の値はエラー条件のシンボル、および/または正規表現のリストです。エラーがこれら条件シンボルのいずれか、またはエラーメッセージが正規表現のいずれかにマッチする場合、そのエラーはデバッガにエンターしません。
この変数の通常の値にはuser-error
と、同様に編集中にしばしば発生するがLispプログラムのバグによるものはほとんどない、いくつかのエラーが含まれます。しかし、“ほとんどない”は“絶対ない”ではありません。あなたのプログラムがこのリストにマッチするエラーにより機能しない場合は、そのエラーをデバッグするために、このリストの変更を試みるのもよいでしょう。通常はdebug-ignored-errors
をnil
にセットしておくのが、もっとも簡単な方法です。
この変数が非nil
値(デフォルト)の場合は、コマンドeval-expression
の実行により、一時的にdebug-on-error
がt
がバインドされます。Evaluating Emacs-Lisp Expressions in The GNU Emacs
Manualを参照してください。
eval-expression-debug-on-error
がnil
の場合は、eval-expression
の間もdebug-on-error
の値は変更されません。
condition-case
によりキャッチされたエラーは通常、決してデバッガを呼び出しません。condition-case
は、デバッガがそのエラーをハンドルする前に、エラーをハンドルする機会を得ます。
debug-on-signal
を非nil
値に変更した場合は、condition-case
の存在如何に関わらず、すべてのエラーにおいてデバッガが最初に機会を得ます。(デバッガを呼び出すためには、依然としてそのエラーがdebug-on-error
とdebug-ignored-errors
で指定された条件を満たさなければなりません。)
警告:
この変数を非nil
にセットすると、芳しくない効果があるかもしれません。Emacsのさまざまな部分で処理の通常の過程としてエラーがキャッチされており、そのエラーが発生したことに気づかないことさえあるかもしれません。condition-case
でラップされたコードをデバッグする必要がある場合は、condition-case-unless-debug
(see section Writing Code to Handle Errorsを参照)の使用を考慮してください。
debug-on-event
をスペシャルイベント(Special Eventsを参照)にセットした場合は、Emacsはspecial-event-map
をバイパスして、このイベントを受け取ると即座にデバッガへのエンターを試みます。現在のところサポートされる値は、シグナルSIGUSR1
およびSIGUSR2
に対応する値だけです(これがデフォルトです)。これはinhibit-quit
がセットされていて、それ以外はEmacsが応答しない場合に有用かもしれません。
debug-on-message
に正規表現をセットした場合には、それにマッチするメッセージがエコーエリアに表示されると、Emacsはデバッガにエンターします。たとえば、これは特定のメッセージの原因を探すのに有用かもしれません。
initファイルロード中に発生したエラーをデバッグするには、オプション‘--debug-init’を使用します。これはinitファイルロードの間にdebug-on-error
をt
にバインドして、通常はinitファイル内のエラーをキャッチするcondition-case
をバイパスします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラムが無限にループしてリターンできないとき、最初の問題はそのループをいかに停止するかです。ほとんどのオペレーティングシステムでは、(quitさせる)C-gでこれを行うことができます。Quittingを参照してください。
普通のquitでは、なぜそのプログラムがループしたかについての情報は与えられません。変数debug-on-quit
に非nil
をセットすることにより、より多くの情報を得ることができます。無限ループの途中でデバッガを実行すれば、デバッガからステップコマンドで先へ進むことができます。ループ全体をステップで追えば、問題を解決するために十分な情報が得られるでしょう。
C-gによるquitはエラーとは判断されないので、C-gのハンドルにdebug-on-error
は効果がありません。同じように、debug-on-quit
はエラーにたいして効果がありません。
この変数は、quit
がシグナルされ、それがハンドルされていないときに、デバッガを呼び出すかどうかを決定します。debug-on-quit
が非nil
の場合は、quit(つまりC-gをタイプ)したときは常にデバッガが呼び出されます。debug-on-quit
がnil
(デフォルト)の場合は、quitしてもデバッガは呼び出されません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラムの途中で発生する問題を調べるための有用なテクニックの1つは、特定の関数が呼び出されたときデバッガにエンターする方法です。問題が発生した関数にこれを行い、その関数をステップで追ったり、問題箇所の少し手前の関数呼び出しでこれを行い、その関数をステップオーバーしてその後をステップで追うことができます。
この関数は、function-nameが呼び出されるたびにデバッガの呼び出しを要求します。
Lispコードで定義された任意の関数およびマクロは、インタープリターに解釈されたコードかコンパイル済みのコードかに関わらず、エントリーにbreakをセットできます。その関数がコマンドの場合は、Lispから呼び出されたときと、インタラクティブに呼び出されたとき、デバッガにエンターします。(たとえばCで記述された)プリミティブ関数にも、この方法でdebug-on-entry
をセットできますが、そのプリミティブがLispコードから呼び出されたときだけ効果があります。debug-on-entry
はスペシャルフォームにはセットできません。
debug-on-entry
がインタラクティブに呼び出されたときは、ミニバッファーでfunction-nameの入力を求めます。その関数がすでにエントリーでデバッガを呼び出すようにセットアップされていた場合、debug-on-entry
は何も行いません。debug-on-entry
は常にfunction-nameをリターンします。
以下は、この関数の使い方を説明するための例です:
(defun fact (n) (if (zerop n) 1 (* n (fact (1- n))))) ⇒ fact
(debug-on-entry 'fact) ⇒ fact
(fact 3)
------ Buffer: *Backtrace* ------ Debugger entered--entering a function: * fact(3) eval((fact 3)) eval-last-sexp-1(nil) eval-last-sexp(nil) call-interactively(eval-last-sexp) ------ Buffer: *Backtrace* ------
この関数はfunction-nameにたいするdebug-on-entry
の効果をアンドゥします。インタラクティブに呼び出されたときは、ミニバッファーでfunction-nameの入力を求めます。function-nameが省略された、あるいはnil
の場合は、すべての関数にたいするbreak-on-entryをキャンセルします。エントリー時にbreakするようセットアップされていない関数にcancel-debug-on-entry
を呼び出したときは、何も行いません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラム内の特定箇所に式(debug)
を記述することにより、その箇所でデバッガが呼び出されるようにできます。これを行うにはソースファイルをvisitして、適切な箇所にテキスト‘(debug)’を挿入し、C-M-x(Lispモードでのeval-defun
にたいするキーバインド)をタイプします。警告:
一時的なデバッグ目的のためにこれを行なう場合は、ファイルを保存する前に確実にアンドゥしてください!
‘(debug)’を挿入する箇所は、追加フォームが評価されることができ、その値を無視することができる箇所でなければなりません。(‘(debug)’の値が無視されない場合が、プログラムの実行が変更されてしまうでしょう!)
一般的にもっとも適した箇所は、progn
または暗黙的なprogn
(Sequencingを参照)の内部です。
デバッグ命令を配したいソースコード中の正確な箇所がわからないが、特定のメッセージが表示されたときにバックトレースを表示したい場合は、意図するメッセージにマッチする正規表現をdebug-on-message
にセットできます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
デバッガにエンターすると、その前に選択されていたウィンドウを1つのウィンドウに表示し、他のウィンドウに*Backtrace*という名前のバッファーを表示します。backtraceバッファーには、現在実行されているLisp関数の各レベルが1行ずつ含まれます。このバッファーの先頭は、デバッガが呼び出された理由を説明するメッセージ(デバッガがエラーにより呼び出された場合はエラーメッセージや関連するデータなど)です。
backtraceバッファーは読み取り専用で、文字キーにデバッガコマンドが定義されたDebuggerモードという特別なメジャーモードを使用します。通常のEmacs編集コマンドが利用できます。したがって、エラー時に編集されていたバッファーを調べるためにウィンドウを切り替えたり、バッファーを切り替えやファイルのvisit、その他一連の編集処理を行なうことができます。しかしデバッガは再帰編集レベル(Recursive Editingを参照)にあり、編集が終わったらそれはbacktraceバッファーに戻って、(qコマンドで)デバッガをexitできます。デバッガをexitすることにより、再帰編集を抜け出し、backtraceバッファーはバリー(bury:
覆い隠す)されます。(変数debugger-bury-or-killw
をセットすることにより、backtraceバッファーでqコマンドが何を行うかをカスタマイズできます。たとえば、バッファーをバリーせずにkillしたい場合は、この変数をkill
にセットします。他の値については、変数のドキュメントを調べてください。)
デバッガにエンターしたとき、eval-expression-debug-on-error
に一致するように変数debug-on-error
が一時的にセットされます。変数eval-expression-debug-on-error
が非nil
の場合、debug-on-error
は一時的にt
にセットされます。これは、デバッグセッション行っている間にさらにエラーが発生すると、(デフォルトでは)他のbacktraceがトリガーされることを意味します。これが望ましくない場合は、debugger-mode-hook
内でeval-expression-debug-on-error
をnil
にセットするか、debug-on-error
をnil
にセットすることができます。
backtraceバッファーは、実行されている関数と、その関数の引数の値を示します。しのフレームを示す行にポイントを移動して、スタックフレームを指定することもできます。(スタックフレームとは、Lispインタープリターがある関数への特定の呼び出しを記録する場所のことです。) 行ポイントがオンのフレームが、カレントフレーム(current frame)となります。デバッガコマンドのいくつかは、カレントフレームを処理します。ある行がスター(star)で始まる場合は、そのフレームをexitすることにより再びデバッガが呼び出されることを意味します。これは関数のリターン値を調べるとき有用です。
関数名にアンダーラインが引かれている場合は、デバッガがその関数のソースコードも位置を知っていることを意味します。その名前をマウスでクリックするか、そこに移動してRETをタイプして、ソースコードをvisitできます。
デバッガはデバッガ自身のスタックフレーム数を想定するため、バイトコンパイルされて実行されなければなりません。デバッガがインタープリターに解釈されて実行されているとき、これらの想定は正しくなくなります。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
(Debuggerモードの)debuggerバッファーでは、通常のEmacsコマンドに加えて、特別なコマンドが提供されます。デバッガでもっとも重要な使い方をするのは、制御フローを見ることができるコードをステップ実行するコマンドです。デバッガはインタープリターにより解釈された制御構造のステップ実行はできますが、バイトコンパイル済みの関数ではできません。バイトコンパイル済み関数をステップ実行したい場合は、同じ関数の解釈された定義に置き換えてください。(これを行なうには、その関数のソースをvisitして、関数の定義でC-M-xとタイプしてください。) プリミティブ関数のステップ実行にLispデバッガは使用できません。
以下はDebuggerモードのコマンドのリストです:
デバッガをexitして、実行を継続する。これはあたかもデバッガにエンターしなかったかのように(デバッガ内で行った変数値やデータ構造の変更などの副作用は除外される)、プログラムの実行を再開する。
実行を継続するが、次にLisp関数が何か呼び出されたときはデバッガにエンターする。これにより、ある式の下位の式をステップ実行して、下位の式が計算する値や、行うことを確認できる。
デバッガにエンターした関数呼び出しにたいして、この方法で作成されたスタックフレームには自動的にフラグがつくので、そのフレームをexitすると再びデバッガが呼び出されます。このフラグは、uコマンドを使用してキャンセルできます。
カレントフレームにフラグをつけるので、そのフレームをexitするときデバッガにエンターする。この方法でフラグがつけられたフレームは、backtraceバッファーでスターのマークがつく。
カレントフレームをexitしたとき、デバッガにエンターしてはならない。これは、そのフレームのbコマンドをキャンセルする。目に見える効果としては、backtraceバッファーの行からスターが削除される。
bと同じようにカレントフレームにフラグをつける。その後、cのように実行を継続するが、debug-on-entry
によりセットアップされたすべての関数にたいするbreak-on-entryを一時的に無効にする。
ミニバッファーのLisp式を読み取り、(関連するlexical環境が適切なら)評価して、エコーエリアに値をプリントする。デバッガは特定の重要な変数とバッファーを処理の一部としてを変更する。eは一時的にデバッガの外部からそれらの値をリストアするので、それらを調べて変更できる。これによりデバッガはより透過的になる。対照的に、デバッガ内でM-:は特別なことを行わず、デバッガ内での変数の値を表示する。
eと同様だが、バッファー*Debugger-record*内の評価の結果も保存する。
デバッグされているプログラムを終了し、Emacsコマンド実行のトップレベルにリターンする。
C-gによりデバッガにエンターしたが、実際はデバッグではなくquitしたいときは、qコマンドを使用する。
デバッガから値をリターンする。ミニバッファーで式を読み取り、それを評価することにより、値が計算される。
dコマンドは、(bによるリクエスト、またはdによるそのフレームへのエンターによる)Lisp呼び出しフレームからのexitでデバッガが呼び出されたときに有用です。rコマンドで指定された値は、そのフレームの値として使用されます。これは、debug
を呼び出して、そのリターン値を使用するときも有用です。それ以外は、rはcと同じ効果をもyい、指定されたリターン値は問題になりません。
エラーによりデバッガにエンターしたときは、rコマンドは使用できません。
呼び出されたときにデバッガを呼び出す関数をリストします。これは、debug-on-entry
によりエントリー時にbreakするようセットされた関数のリストです。
カレントスタックフレームのローカル変数の表示を切り替えます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下では、デバッガを呼び出すために使用される関数debug
の完全な詳細を説明します。
この関数は、デバッガにエンターします。この関数は*Backtrace*(デバッガへの2回目以降の再帰エントリーでは*Backtrace*<2>、...)という名前のバッファーにバッファーを切り替えて、Lisp関数呼び出しについての情報を書き込みます。それから再帰編集にエンターして、Debuggerモードでbacktraceバッファーを表示します。
Debuggerモードのコマンドc、d、j、rは再帰編集をexitします。その後、debug
は以前のバッファーに戻って、debug
を呼び出したものが何であれ、そこにリターンします。これは関数debug
が呼び出し元にリターン可能な唯一の方法です。
debugger-argsを使用すると、debug
は*Backtrace*の最上部に残りの引数を表示するもで、ユーザーがそれらを確認できます。以下で説明する場合を除き、これは、これらの引数を使用する唯一の方法です。
しかしdebug
への1つ目の引数にたいする値は、特別な意味をもちます。(これらの値は通常、debug
を呼び出すプログラマーではなく、Emacs内部でのみ使用されます。)
以下はこれら特別な値のテーブルです:
lambda
1つ目の引数galambda
の場合、それはdebug-on-next-call
が非nil
のときに関数にエントリーしたことによりdebug
が呼び出されたことを意味する。デバッガはバッファーのトップのテキスト行に‘Debugger
entered--entering a function:’と表示する。
debug
1つ目の引数がdebug
の場合、それはエントリー時にデバッグされるようにセットされた関数にエントリーしたことによりdebug
が呼び出されたことを意味する。デバッガはlambda
のときと同様、‘Debugger
entered--entering a
function:’を表示します。これはその関数のスタックフレームもマークするので、exit時にデバッガが呼び出される。
t
1つ目の引数がt
の場合、それはdebug-on-next-call
が非nil
のときに関数呼び出しの評価によりdebug
が呼び出されたことを示す。デバッガはバッファーのトップの行に‘Debugger
entered--beginning evaluation of function call form:’と表示する。
exit
1つ目の引数がexit
のときは、exit時にデバッガを呼び出すよう以前にマークされたスタックフレームをexitしたことを示す。この場合は、debug
に与えられた2つ目の引数が、そのフレームからリターンされた値になる。デバッガはバッファーのトップの行に‘Debugger
entered--returning value:’とリターンされた値を表示する。
error
1つ目の引数がerror
のときは、ハンドルされていないエラーまたはquit
がシグナルされてデバッガにエンターした場合で、デバッガは‘Debugger
entered--Lisp error:’とその後にシグナルされたエラーおよびsignal
への引数を表示して、それを示す。たとえば、
(let ((debug-on-error t)) (/ 1 0))
------ Buffer: *Backtrace* ------ Debugger entered--Lisp error: (arith-error) /(1 0) ... ------ Buffer: *Backtrace* ------
エラーがシグナルされた場合はおそらく、変数debug-on-error
は非nil
で、quit
がシグナルされた場合はおそらく、変数debug-on-quit
は非nil
である。
nil
明示的にデバッガにエンターしたいときは、debugger-argsの1つ目の引数にnil
を使用する。残りのdebugger-argsは、バッファーのトップの行にプリントされる。メッセージ
— たとえばdebug
が呼び出された条件を思い出すためのリマインダー — の表示にこの機能を使用できる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、デバッガ内部で使用される関数と変数について説明します。
この関数の値は、デバッガを呼び出す関数呼び出しです。値には任意個の引数をとる関数、より具体的には関数の名前でなければなりません。この関数は何らかのデバッガを呼び出すべきです。この変数のデフォルト値はdebug
です。
関数にたいしてLispが渡す1つ目の引数は、その関数がなぜ呼び出されたかを示します。引数の慣習は、debug
(Invoking the Debugger)に詳解されています。
この関数は現在アクティブなLisp関数呼び出しのトレースをプリントします。この関数はdebug
が*Backtrace*バッファーに書き込む内容を得るために使用されます。どの関数呼び出しがアクティブか判断するためにスタックにアクセスしなければならないので、この関数はCで記述されています。リターン値は、常にnil
です。
以下の例では、Lisp式で明示的にbacktrace
を呼び出しています。これはストリームstandard-output
(この場合はバッファー‘backtrace-output’)にbacktraceをプリントします。
backtraceの各行は、1つの関数呼び出しを表します。関数の引数が既知の場合は行に値が表示され、まだ計算中の場合は行にその旨が示されます。スペシャルフォームの引数は無視されます。
(with-output-to-temp-buffer "backtrace-output" (let ((var 1)) (save-excursion (setq var (eval '(progn (1+ var) (list 'testing (backtrace)))))))) ⇒ (testing nil)
----------- Buffer: backtrace-output ------------ backtrace() (list ...computing arguments...)
(progn ...) eval((progn (1+ var) (list (quote testing) (backtrace)))) (setq ...) (save-excursion ...) (let ...) (with-output-to-temp-buffer ...) eval((with-output-to-temp-buffer ...)) eval-last-sexp-1(nil)
eval-last-sexp(nil) call-interactively(eval-last-sexp) ----------- Buffer: backtrace-output ------------
この変数が非nil
の場合、それは次のeval
、apply
、funcall
の前にデバッガを呼び出すよう指定します。デバッガへのエンターにより、debug-on-next-call
はnil
にセットされます。
デバッガのdコマンドは、この変数をセットすることにより機能します。
この関数は、そのスタックフレームのlevel下位のスタックフレームのdebug-on-exitフラグにflagに応じた値をセットします。flagが非nil
の場合は、後にそのフレームをexitするときデバッガにエンターします。そのフレームを通じた非ローカルexitでも、デバッガにエンターします。
この関数は、デバッガだけに使用されます。
この変数はカレントのインタラクティブコマンドのデバッグ状態を記録します。コマンドがインタラクティブに呼び出されるたびに、この変数はnil
にバインドされます。デバッガは、同じコマンドが呼び出されたときのデバッガ呼び出しに情報を残すために、この変数をセットできます。
普通のグローバル変数ではなくこの変数を使用する利点は、そのデータが後続のコマンド呼び出しに決して引き継がれないことです。
関数backtrace-frame
は、Lispデバッガ内での使用を意図しています。これは、frame-numberレベル下位のスタックフレームで、何の評価が行われているかに関する情報をリターンします。
そのフレームがまだ引数を評価していない場合、またはそのフレームがスペシャルフォームの場合、値は(nil function
arg-forms…)
です。
そのフレームが引数を評価して関数をすでに呼び出した場合、リターン値は(t function
arg-values…)
です。
リターン値のfunctionは何であれ評価されたリストのCARとして提供されます。マクロ呼び出しの場合はlambda
式になります。その関数に&rest
引数がある場合は、リストarg-valuesの末尾に表されます。
frame-numberが範囲外の場合、backtrace-frame
はnil
をリターンします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
EdebugはEmacs Lispプログラムにたいするソースレベルデバッガです。これにより、以下のことができます:
以下の初めの3つのセクションは、使用を開始するためにEdebugについて十分説明します。
17.2.1 Using Edebug | Edebug使用のための手引き。 | |
17.2.2 Instrumenting for Edebug | Edebugでデバッグするために、コードをインストルメント(計装)しなければならないe | |
17.2.3 Edebug Execution Modes | 多かれ少なかれ、ストップする実行モード。 | |
17.2.4 Jumping | 特定の位置にジャンプするコマンド。 | |
17.2.5 Miscellaneous Edebug Commands | さまざまなコマンド。 | |
17.2.6 Breaks | プログラムをストップさせるbreakpointのセット。 | |
17.2.7 Trapping Errors | Edebugでのエラーのトラップ。 | |
17.2.8 Edebug Views | Edebugの内側と外側のビュー。 | |
17.2.9 Evaluation | Edebugでの式の評価。 | |
17.2.10 Evaluation List Buffer | Edebugにエンターするたびに値が表示される式。 | |
17.2.11 Printing in Edebug | プリントのカスタマイズ。 | |
17.2.12 Trace Buffer | バッファー内で採れを生成する方法。 | |
17.2.13 Coverage Testing | 評価をカバレッジテストする方法。 | |
17.2.14 The Outside Context | Edebugが保存およびリストアするデータ。 | |
17.2.15 Edebug and Macros | マクロ呼び出しをハンドルする方法の指定。 | |
17.2.16 Edebug Options | Edebugをカスタマイズするオプション変数。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
EdebugでLispプログラムをデバッグするには、最初にデバッグしたいLispコードをインストルメント(instrument:
計装)しなければなりません。これを行なうもっともシンプルな方法は、関数またはマクロの定義に移動して、C-u
C-M-x(プレフィクス引数を指定したeval-defun
)を行います。コードをインストルメントする他の手段については、Instrumenting for Edebugを参照してください。
一度関数をインストルメントすると、その関数にたいする任意の呼び出しにより、Edebugがアクティブになります。Edebugがアクティブになると、どのEdebug実行モードを選択したかに依存して、その関数をステップ実行できるように実行がストップされるか、ディスプレイを更新してデバッグコマンドにたいするチェックの間、実行が継続されます。デフォルトの実行モードstepで、これは実行をストップします。Edebug Execution Modesを参照してください。
Edebugでは通常、デバッグしているLispコードをEmacsバッファーで閲覧します。これをソースコードバッファー(source code buffer)と呼び、バッファーは一時的に読み取り専用になります。
左フリンジの矢印は、その関数で実行されている行を示します。最初ポイントはその関数の実行されている行にありますが、ポイントを移動するとこれは真ではなくなります。
以下は、fac
の定義(以下を参照)をインストルメントして(fac
3)
を実行した場合に通常目にするものです。ポイントは、if
の前の開きカッコにあります。
(defun fac (n) =>∗(if (< 0 n) (* n (fac (1- n))) 1))
関数内でEdebugが実行をストップできる位置のことを、ストップポイント(stop
points)と呼びます。ストップポイントは、リストであるような部分式の前後、および変数参照の後でも発生します。以下は、関数fac
内のストップポイントをピリオドで示したものです:
(defun fac (n) .(if .(< 0 n.). .(* n. .(fac .(1- n.).).). 1).)
Emacs
Lispモードのコマンドに加えて、ソースコードバッファーでは、Edebugのスペシャルコマンドが利用できます。たとえば、EdebugコマンドSPCで次のストップポイントまで実行することができます。fac
にエントリーした後に一度fac
とタイプした場合は、以下のように表示されるでしょう:
(defun fac (n) =>(if ∗(< 0 n) (* n (fac (1- n))) 1))
式の後でEdebugが実行をストップしたときは、エコーエリアにその式の値が表示されます。
他にも頻繁に使用されるコマンドとして、ストップポイントにbreakpointをセットするb、breakpointに達するまで実行するg、Edebugをexitしてトップレベルのコマンドループにリターンするqがあります。また、?とタイプするとすべてのEdebugコマンドがリストされます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
LispコードのデバッグにEdebugを使用するためには、最初にそのコードをインストルメント(instrument: 計装)しなければなりません。コードをインストルメントすると、適切な位置でEdebugを呼び出すために追加コードが挿入されます。
関数定義でプレフィクス引数とともにコマンドC-M-x
(eval-defun
)を呼び出すと、それを評価する前にその定義をインストルメントします。(ソースコード自体は変更しません。)
変数edebug-all-defs
が非nil
の場合は、プレフィクス引数の意味を反転します。この場合、C-M-xはプレフィクス引数がなければその定義をインストルメントします。edebug-all-defs
のデフォルト値はnil
です。コマンドM-x
edebug-all-defsは、変数edebug-all-defs
の値を切り替えます。
edebug-all-defs
が非nil
の場合はeval-region
、eval-current-buffer
、eval-buffer
も、それらが評価する定義をインストルメントします。同様に、edebug-all-forms
は、eval-region
が(非定義フォームさえ含む)あらゆるフォームをインストルメントすべきかを制御します。これはミニバッファー内でのロードや評価には適用されません。コマンドM-x
edebug-all-formsは、このオプションを切り替えます。
他にもコマンドM-x
edebug-eval-top-level-formが利用可能で、これはedebug-all-defs
やedebug-all-forms
の値に関わらず、トップレベルの任意のフォームをインストルメントします。edebug-defun
はedebug-eval-top-level-form
のエイリアスです。
Edebugがアクティブのの間、コマンドI(edebug-instrument-callee
)は、ポイント後のリストフォームに呼び出される関数およびマクロ定義がまだインストルメントされていなければ、それらをインストルメントします。これは、そのファイルのソースの場所をEdebugが知っている場合だけ可能です。この理由によりEdebugロード後は、たとえ評価する定義をインストルメントしない場合でも、eval-region
は評価するすべての定義の位置を記録します。インストルメント済み関数呼び出しにステップインするiコマンド(Jumpingを参照)も参照してください。
Edebugはすべての標準スペシャルフォーム、式引数をもつinteractive
フォーム、無名ラムダ式、およびその他の定義フォームのインストルメント方法を知っています。しかし、Edebugはユーザー定義マクロが引数にたいして何を行うかを判断できないので、Edebug仕様を使用してその情報を与えなければなりません。詳細はEdebug and Macrosを参照してください。
Edebugがセッション内で最初にコードをインストルメントしようとするときは、フックedebug-setup-hook
を実行してから、それにnil
をセットします。使おうとしているパッケージに結びつけてEdebug仕様をロードするためにこれを使用できますが、それはEdebugを使用するときだけ機能します。
定義からインストルメントを削除するには、単にインストルメントを行わない方法でその定義を再評価するだけです。フォームを絶対にインストルメントせずに評価するには、2つの方法があります。それはファイルからのload
による評価と、ミニバッファーからのeval-expression
(M-:)による評価です。
Edebugがインストルメント中にシンタックスエラー(syntax error:
構文エラー)を検知した場合は、間違ったコードの箇所にポイントを残してinvalid-read-syntax
エラーをシグナルします。
Edebug内で利用可能な他の評価関数については、Evaluationを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugは、デバッグするプログラムの実行にたいして、いくつかの実行モードをサポートします。これらの実行モードを、Edebug実行モード(Edebug execution modes)と呼びます。これらをメジャーモードやマイナーモードと混同しないでください。カレントのEdebug実行モードは、プログラムをストップする前にEdebugがどれだけ実行を継続するか — たとえばストップポイントごとにストップ、あるいは次のbreakpointまで継続など — と、ストップする前にEdebugがどれだけ進捗を表示するかを決定します。
Edebug実行モードは通常、ある特定のモードでプログラムを継続させるコマンドをタイプすることにより指定します。以下は、それらのコマンドのテーブルです。プログラムの実行を再開S以外は、少なくともある長さの間だけ実行を継続します。
Stop(ストップ): これ以上プログラムを実行しないで、Edebugのコマンドを待つ(edebug-stop
)。
Step(ステップ): 次のストップポイントでストップする(edebug-step-mode
)。
Next(次へ):
式の後にある次のストップポイントでストップする(edebug-next-mode
)。Jumpingのedebug-forward-sexp
も参照。
Trace(トレース): Edebugのストップポイントごとにpause(通常は1秒)する(edebug-trace-mode
)。
Rapid
trace(高速でトレース):ストップポイントごとに表示を更新するが、実際にpauseはしない(edebug-Trace-fast-mode
)。
Go(進む): 次のbreakpointまで実行する(edebug-go-mode
)。Edebug Breakpointsを参照。
Continue(継続): breakpointごとにpauseしてから継続する(edebug-continue-mode
)。
Rapid continue(高速で継続):
ポイントを各breakpointへ移動するが、pauseしない(edebug-Continue-fast-mode
)。
Go non-stop(ストップせず進む):
breakpointを無視する(edebug-Go-nonstop-mode
)。まだS、またはその他の編集コマンドでプログラムをストップするのは可能。
一般的に、上記リストの最初のほうにある実行モードは後のほうの実行モードに比べて、プログラムをより低速に実行、またはすぐにストップさせます。
実行中、またはトレース中は、任意のEdebugコマンドをタイプすることにより、実行をインタラプト(interrupt: 中断、割り込み)できます。Edebugは次のストップポイントでプログラムをストップしてから、タイプされたコマンドを実行します。たとえば、実行中にtをタイプすると、次のストップポイントでトレースモードに切り替えます。Sを使用すれば、他に何も行わずに実行をストップできます。
関数でたまたま読み取り入力が発生した場合には、実行のインタラプトを意図してタイプされた文字は、かわりにその関数により読み取られます。そのプログラムが入力を欲するタイミングに注意を払うことで、そのような意図せぬ結果を避けることができます。
このセクションのコマンドを含むキーボードマクロは、完全には機能しません。プログラムを再開するためにEdebugからexitすると、キーボードマクロの追跡記録は失われます。これを処理するのは、簡単ではありません。またEdebug外部でキーボードマクロを定義または実行しても、Edebug内部のコマンドに影響しません。通常これは利点です。Edebug Options内のedebug-continue-kbd-macro
オプションも参照してください。
新たなEdebugレベルにエンターしたとき、初期の実行モードは変数edebug-initial-mode
の値により与えられます(Edebug Optionsを参照)。デフォルトでこれはstepモードを指定します。たとえば1つのコマンドからインストルメント済みの関数が複数回呼び出された場合は、同じEdebugレベルに再エンターするかもしれないことに注意してください。
このオプションは、traceモードおよびcontinueモードで実行ステップの間を何秒待つか指定します。デフォルトは1秒です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションで説明するコマンドは、指定された場所に達するまで実行を続けます。iを除くすべてのコマンドは、ストップ場所を確立するために一時的なbreakpointを作成してから、goモードにスイッチします。意図されたストップポイントの前にある他のストップポイントに達した場合も、実行はストップします。breakpointの詳細は、Edebug Breakpointsを参照してください。
これらのコマンドは、非ローカルexitの場合はプログラムのストップを期待する一時的なbreakpointをバイパスできるので、期待どおり機能しないかもしれません。
ポイントがある場所の近くのストップポイントへ実行を進める(edebug-goto-here
)。
プログラムの式を1つ分実行する(edebug-forward-sexp
)。
sexpを含む終端までプログラムを実行する(edebug-step-out
)。
ポイントの後のフォームから呼び出された関数またはマクロにステップインする(edebug-step-in
)。
hコマンドは一時的なbreakpointを使用して、ポイントのカレント位置、またはその後のストップポイントまで処理を進めます。
fコマンドは式を1つ飛び越してプログラムを実家します。より正確には、forward-sexp
により到達できる位置に一時的なbreakpointをセットしてからgoモードで実行するので、プログラムはそのbreakpointでストップすることになります。
プレフィクス引数nとともに使用した場合は、ポイントからn個のsexp(s-expression: S式)を超えた場所に一時的なbreakpointをセットします。ポイントを含むリストがnより少ない要素で終わるような場合は、ストップ箇所はポイントが含まれる式の後になります。
forward-sexp
が見つける位置と、プログラムを実際にストップさせたい位置なのかチェックしなければなりません。たとえばcond
内では、これは正しくないかもしれません。
fコマンドは柔軟性を与えるために、forward-sexp
をストップポイントではなく、ポイント位置から開始します。カレントのストップポイントから1つの式を実行したい場合は、まずそこにポイントを移動するためにw(edebug-where
)をタイプして、それからfをタイプしてください。
oコマンドは、式の“外側”で実行を継続します。これは、ポイントを含む式の最後に一時的なbreakpointを配します。ポイントを含むsexpが関数定義の場合、oはその定義内の最後のsexpの直前まで実行を継続します。もし定義内の最後のsexpの直前にポイントがある場合は、その関数からリターンしてからストップします。他の言い方をすると、このコマンドは最後のsexpの後にポイントがない場合は、カレントで実行中の関数からexitしません。
iコマンドは、ポイントの後のリストフォームに呼び出された関数、またはマクロにステップインします。そのフォームは、評価されようとしているもの1つである必要はないことに注意してください。しかし、そのフォームが評価されようとしている関数呼び出しの場合は、引数が何も評価されないうちにこのコマンドを使用しないと、遅すぎることを覚えておいてください。
iコマンドは、ステップインしようとしている関数またはマクロがまだインストルメントされていない場合は、それらをインストルメントします。これは便利かもしれませんが、それらを明示的に非インストルメントしない場合、その関数またはマクロはインストルメントされたままになることを覚えておいてください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ここでは、その他のEdebugコマンドを説明します。
Edebugのヘルプメッセージを表示する(edebug-help
)。
1レベルを中断して以前のコマンドレベルへ戻る(abort-recursive-edit
)。
エディターのトップレベルのコマンドループにリターンする(top-level
)。これは、すべてのレベルのEdebugアクティビティを含む、すべての再帰編集レベルをexitする。しかし、フォームunwind-protect
またはcondition-case
で保護されたインストルメント済みのコードはデバッグを再開するかもしれない。
qと同様だが、保護されたコードでもストップしない(edebug-top-level-nonstop
)。
エコーエリアに、もっとも最近の既知のコマンドを再表示する(edebug-previous-result
)。
backtraceを表示するが、明確であるようにEdebug自身の関数は除外される(edebug-backtrace
)。
Edebugのbacktraceバッファーでは、標準デバッガ内のようにバッガコマンドは使用できない。
実行を継続したとき、backtraceバッファーは自動的にkillされる。
Edebugから再帰的にEdebugをアクティブにするコマンドを呼び出すことができます。Edebugがアクティブなときは常に、qによトップレベルの終了、またはC-]による再帰編集1レベルの中断ができます。dにより、すべての未解決な評価のbacktraceを表示できます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugのstepモードは、次のストップポイントに達したときに、実行をストップします。一度開始されたEdebugの実行をストップするには、他に3つの方法があります。それはbreakpoint、グローバルbreak条件、およびソースbreakpointです。
17.2.6.1 Edebug Breakpoints | ストップポイントのbreakpoint。 | |
17.2.6.2 Global Break Condition | イベントによるbreak。 | |
17.2.6.3 Source Breakpoints | ソースコードに埋め込まれたbreakpoint。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugを使用しているときは、テスト中のプログラム内にbreakpointを指定できます。breakpointとは、実行がストップされる場所のことです。Using Edebugで定義されている任意のストップポイントに、breakpointをセットできます。breakpointをセットおよび解除において影響を受けるストップポイントは、ソースコードバッファー内でポイント位置、またはポイント位置の後の最初のストップポイントです。以下はEdebugのbreakpoint用のコマンドです:
ポイント位置、またはポイント位置の後のストップポイントに、breakpointをセットする(edebug-set-breakpoint
)。プレフィクス引数を使用した場合、それは一時的なbreakpointになり、プログラムが最初にそこで停止したとき解除される。
(もしあれば)ポイント位置、またはポイント位置の後のストップポイントにあるbreakpointを解除(unset)する(edebug-unset-breakpoint
)。
conditionを評価して非nil
値になる場合だけプログラムをストップする、条件付きbreakpointをセットする(edebug-set-conditional-breakpoint
)。プレフィクス引数を指定した場合は、一時的なbreakpointになる。
カレント定義内の、次のbreakpointにポイントを移動する(edebug-next-breakpoint
)。
Edebug内では、bでbreakpointをセットして、uでそれを解除できます。最初に望ましいストップポイントにポイントを移動してから、そこにbreakpointをセットまたは解除するためにbまたはuをタイプしますbreakpointがない場所でbreakpointを解除しても、影響はありません。
ある定義を再評価、または再インストルメントすると、以前のbreakpointはすべて削除されます。
条件付きbreakpoint(conditional
breakpoint)は、プログラムがそこに達するたびに条件をテストします。条件を評価した結果エラーが発生した場合、エラーは無視され結果はnil
になります。条件付きbreakpointをセットするにはxを使用して、ミニバッファーで条件式を指定します。以前にセットされた条件付きbreakpointがあるストップポイントに条件付きbreakpointをセットすると、以前の条件式がミニバッファーに配されるので、それを編集できます。
プレフィクス引数を指定してbreakpointをセットするコマンドを使用することにより、一時的な条件付きbreakpoint、および無条件のbreakpointを作成できます。一時的なbreakpointによりプログラムがストップしたとき、そのbreakpointは自動的に解除されます。
Go-nonstopモードを除き、Edebugは常にbreakpointでストップ、またはpauseします。Go-nonstopモードでは、breakpointは完全に無視されます。
breakpointがどこにあるか探すには、Bコマンドを使用します。このコマンドは同じ関数内から、ポイント以降にある次のbreakpoint(ポイント以降にbreakpointが存在しない場合は最初のbreakpoint)にポイントを移動します。このコマンドは実行を継続せず、単にバッファー内のポイントを移動します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
グローバルbreak条件(global break
condition)は指定された条件が満たされたとき、それがどこで発生したかによらず、実行をストップします。Edebugは、すべてのストップポイントでグローバルbreak条件を評価します。これが非nil
値に評価された場合は、あたかもそのストップポイントにbreakpointがあったかのように、実行をストップまたはpauseします(実行モードによる)。条件の評価でエラーを取得した場合は、実行をストップしません。
条件式はedebug-global-break-condition
に格納されます。EdebugがアクティブなときにソースバッファーからXコマンドを使用するか、Edebugがロードされている間は任意のバッファーから任意のタイミングでC-x
X X(edebug-set-global-break-condition
)を使用することにより新たな式を指定できます。
グローバルbreak条件は、コード内のどこでイベントが発生したかを見つけるもっともシンプルな方法ですが、コードの実行は遅くなります。そのため、使用しないときは条件をnil
にリセットするべきです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
定義内のすべてのbreakpointは、それをインストルメントするたびに失われます。breakpointが失われないようにしたい場合は、ソースコード内で単に関数edebug
を呼び出すソースbreakpoint(source
breakpoint)を記述できます。もちろん、そのような呼び出しを条件付きすることにもできます。たとえばfac
関数内に以下のような行を1行目に挿入して、引数が0になったときストップさせることができます:
(defun fac (n) (if (= n 0) (edebug)) (if (< 0 n) (* n (fac (1- n))) 1))
fac
の定義がインストルメントされて呼び出されたとき、edebug
呼び出しはbreakpointとして振る舞います。実行モードに応じて、Edebugはそこでストップまたはpauseします。
edebug
が呼び出されたときにインストルメント済みのコードが実行されていなければ、この関数はdebug
を呼び出します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エラーがシグナルされて、それがcondition-case
でハンドルされていないとき、Emacsは通常エラーメッセージを表示します。Edebugがアクティブでインストルメント済みのコードを実行中は、ハンドルされていないエラーには通常Edebugが対応します。オプションedebug-on-error
およびedebug-on-quit
で、これをカスタマイズできます。Edebug Optionsを参照してください。
Edebugがエラーに対応するときは、エラー発生箇所の前にある最後のストップポイントを表示します。この場所はインストルメントされていない関数の呼び出しで、その関数内で実際にエラーが発生したのかもしれません。バインドされていない変数に関するエラーの場合は、最後の既知のストップポイントは、その不正な変数参照から遠く離れた場所かもしれません。そのような場合は、完全なbacktraceを表示したいと思うでしょう(Miscellaneous Edebug Commandsを参照)。
Edebugがアクティブの間にdebug-on-error
、またはdebug-on-quit
を変更した場合、それらの変更はEdebugが非アクティブになったとき失われます。さらに、Edebugの再帰編集の間、これらの変数はEdebugの外部でもっていた値にバインドされます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらのEdebugコマンドは、Edebugにエントリーする前のバッファーの外観と、ウィンドウの状態を調べるコマンドです。外部のウィンドウ構成は、ウィンドウのコレクションとその内容であり、これらは実際にEdebugの外部にあります。
外部のウィンドウ構成ビューに切り替える(edebug-view-outside
)。Edebugにリターンするには、C-x X
wをタイプする。
一時的に外部のカレントバッファーを表示し、ポイントもその外部の位置になる(edebug-bounce-point
)。Edebugにリターンする前に、1秒pauseする。プレフィクス引数nを指定すると、かわりにn秒pauseする。
ソースコードバッファー内のカレントストップポイントにポイントを戻す(edebug-where
)。
このコマンドを同じバッファーを表示する異なるウィンドウで使用した場合には、そのウィンドウは将来カレント定義を表示するために代用される。
Edebugが外部のウィンドウ構成を保存、およびリストアするかどうかを切り替える(edebug-toggle-save-windows
)。
プレフィクス引数を指定すると、W
は選択されたウィンドウの保存とリストアだけを切り替える。ソースコードバッファーを表示していないウィンドウを指定するには、グローバルキーマップからC-x
X Wを使用しなければならない。
v、または単にpでカレントバッファーにポイントを反跳させれば、たとえ通常は表示されないウィンドウでも、外部のウィンドウ構成を調べることができます。
ポイントを移動した後に、ストップポイントに戻りたいときがあるかもしれません。これは、ソースコードバッファーからwで行うことができます。どのバッファーにいても、C-x X wを使用すれば、ソースコードバッファー内のストップポイントに戻ることができます。
保存をオフにするためにWを使用するたびに、Edebugは外部のウィンドウ構成を忘れます。そのため、たとえ保存をオンに戻しても、(プログラムを実行することにより)次にEdebugをexitしたとき、カレントウィンドウ構成は変更されないまま残ります。しかし、十分な数のウィンドウをオープンしていない場合は、*edebug*と*edebug-trace*の再表示が、あなたが見たいバッファーと競合するかもしれません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebug内では、まるでEdebugが実行されていないかのように、式を評価できます。式の評価とプリントに際して、Edebugが不可視になるよう試みます。。副作用をもつ式の評価は、Edebugが明示的に保存とリストアを行うデータへの変更を除き、期待したとおり機能するでしょう。このプロセスの詳細は、The Outside Contextを参照してください。
Edebugのコンテキスト外で、式expを評価する(edebug-eval-expression
)。つまり、Edebugはその式への干渉を最小限にしようと努める。
Edebug自身のコンテキスト内で、式expを評価する(eval-expression
)。
Edebugのコンテキスト外で、ポイントの前の式を評価する(edebug-eval-last-sexp
)。
Edebugは、cl.el内の構文(lexical-let
、macrolet
、symbol-macrolet
)により作成された、レキシカル(lexical)にバインドされたシンボルへの参照を含む式の評価をサポートします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
式をインタラクティブに評価するために、*edebug*と呼ばれる評価リストバッファー(evaluation list buffer)を使用できます。Edebugがディスプレイを更新するたびに自動的に評価される、式の評価リスト(evaluation list)もセットアップできます。
評価リストバッファー*edebug*に切り替える(edebug-visit-eval-list
)。
*edebug*バッファーでは、以下の特別なコマンドと同様に、Lisp Interactionモード(see Lisp Interaction in The GNU Emacs Manual)のコマンドも使用できます。
ポイントの前の式をコンテキスト外で評価して、その値をバッファーに挿入する(edebug-eval-print-last-sexp
)。
Edebugのコンテキスト外で、ポイントの前の式を評価する(edebug-eval-last-sexp
)。
バッファー内のコンテンツから、新たに評価リストを構築する(edebug-update-eval-list
)。
ポイントのある評価リストグループを削除する(edebug-delete-eval-item
)。
ソースコードバッファーに切り替えてカレントストップポイントに戻る(edebug-where
)。
評価リストウィンドウ内では、*scratch*にいるときと同様に、C-jやC-x C-eで式を評価できますが、それらはEdebugのコンテキスト外で評価されます。
インタラクティブに入力した式(とその結果)は、実行を継続すると失われます。しかし、実行がストップされるたびに評価されるように、式から構成される評価リストをセットアップできます。
これを行なうには、評価リストバッファー内で1つ以上の評価リストグループ(evaluation list group)を記述します。評価リストグループは、1つ以上のLisp式から構成されます。グループはコメント行で区切られます。
コマンドC-c
C-u(edebug-update-eval-list
)は、バッファーをスキャンして各グループの最初の式を使用して、評価リストを再構築します。(これはグループの2つ目の式は以前に計算、表示されている値だという発想からです。)
Edebugにエントリーするたびに、評価リストの各式(および式の後に式のカレント値)をバッファーに挿入して再表示します。これはコメント行も挿入するため、各式はそのグループの一員となります。したがって、バッファーのテキストを変更せずにC-c C-uとタイプした場合、評価リストは実際には変更されません。
評価リストからの評価の間にエラーが発生した場合、それが式の結果であるかのようにエラーメッセージが文字列で表示されます。したがって、カレントで無効な変数を使用する式により、デバッグが中断されることはありません。
以下は、いくつかの式を評価リストウィンドウに追加したとき、どのように見えるかの例です:
(current-buffer) #<buffer *scratch*> ;--------------------------------------------------------------- (selected-window) #<window 16 on *scratch*> ;--------------------------------------------------------------- (point) 196 ;--------------------------------------------------------------- bad-var "Symbol's value as variable is void: bad-var" ;--------------------------------------------------------------- (recursion-depth) 0 ;--------------------------------------------------------------- this-command eval-last-sexp ;---------------------------------------------------------------
グループを削除するには、グループ内にポイントを移動してC-c C-dをタイプするか、単にグループのテキストを削除してC-c C-uで評価リストを更新します。評価リストに新たな式を追加するには、適切な箇所にその式を挿入し、新たなコメント行を挿入してからC-c C-uをタイプします。コメント行にダッシュを挿入する必要はありません — 内容は関係ないのです。
*edebug*を選択した後に、C-c C-wでソースコードバッファーにリターンできます。*edebug*は実行を継続したときkillされ、次回必要なとき再作成されます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラム内の式が循環リスト構造(circular list structure)を含む値を生成する場合は、Edebugがそれをプリントしようとしたときエラーとなるかもしれません。
循環構造への対処の1つに、print-length
およびprint-level
にプリントの切り詰めをセットする方法があります。Edebugは、変数edebug-print-length
およびedebug-print-level
の値(非nil
値をもつ場合)を、これらの変数にバインドします。Variables Affecting Outputを参照してください。
非nil
の場合は、結果をプリントするときEdebugはprint-length
をこの値にバインドする。デフォルト値は50
。
非nil
の場合は、結果をプリントするときEdebugはprint-level
をこの値にバインドする。デフォルト値は50
。
print-circle
を非nil
値にバインドして、循環構造や要素を共有する構造を、より参考になる情報をプリントすることもできます。
以下は循環構造を作成するコードの例です:
(setq a '(x y)) (setcar a a)
カスタムプリントはこれを、‘Result: #1=(#1# y)’のようにプリントします。‘#1=’という表記はその後の構造をラベル‘1’とラベル付けし、‘#1#’表記はその前にラベル付けされた構造を参照しています。この表記は、リストやベクターの任意の共有要素に使用されます。
非nil
の場合は、結果をプリントするときEdebugはprint-circle
をこの値にバインドする。デフォルト値はt
。
他にプログラムもカスタムプリントを使用できます。詳細はcust-print.elを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugは実行トレースを*edebug-trace*という名前のバッファーに格納して記録できます。実行トレースとは関数呼び出しよリターンのログのことで、関数名と引数、および値が確認できます。トレースレコードを有効にするには、edebug-trace
を非nil
値にセットしてください。
トレースバッファーの作成は、実行モードのトレースの使用(Edebug Execution Modesを参照)と同じではありません。
トレースレコードが有効なときは、関数へのエントリーとexitのたびに、トレースバッファーに行が追加されます。関数エントリーレコードは‘::::{’、および関数名と引数の値により構成されます。関数exitレコードは‘::::}’、および関数名と関数の結果により構成されます。
‘:’の数は、関数エントリーの再帰レベルを表します。トレースバッファーでは、関数呼び出しの開始と終了の検索に‘{’と‘}’を使用できます。
関数edebug-print-trace-before
およびedebug-print-trace-after
を再定義することにより、関数エントリーと関数exitのトレースレコードをカスタマイズできます。
このマクロはbodyフォーム実行活動にたいする、追加のトレース情報をリクエストする。引数stringは、トレースバッファーに配す‘{’または‘}’の後のテキストを指定する。すべての引数は評価され、edebug-tracing
はbody内の最後のフォームの値をリターンする。
この関数は、トレースバッファーにテキストを挿入する。テキストは、(apply 'format format-string
format-args)
により計算される。エントリー間の区切りとして改行も付け加える。
edebug-tracing
およびedebug-trace
は、たとえEdebugが非アクティブでも、呼び出されたときは常にトレースバッファーに行を挿入します。トレースバッファーへのテキストの追加により、挿入された最後の行が見えるようにウィンドウもスクロールします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugは基本的なカバレッジテスト(coverage test)と実行頻度(execution frequency)の表示を提供します。
カバレッジテストは、すべての式の結果と以前の結果を比較することにより機能します。プログラム内のフォームがそれぞれ、カレントEmacsセッション内でカバレッジテストを開始して以降に、2つの異なる値をリターンした場合、それらのフォームは“カバー”されたと判断します。したがって、プログラムにカバレッジテストを行なうには、そのプログラムをさまざまなコンディション下で実行して、プログラムが正しく振る舞うかに注目します。異なるコンディション下で十分にテストして、すべてのフォームが異なる2つの値をリターンしたとき、Edebugはそのことを告げるでしょう。
カバレッジテストにより実行速度が低下するので、edebug-test-coverage
が非nil
のときだけカバレッジテストが行なわれます。頻度計数(frequency
count)は、たとえ実行モードがGo-nonstopでも、カバレッジテストが有効か無効かに関わらず、すべての式にたいして処理されます。
定義にたいするカバレッジ情報と頻度数の両方を表示するには、C-x X
=(edebug-display-freq-count
)を使用する。単に=(edebug-temp-display-freq-count
)とすると、他のキーをタイプするまでの間だけ、同様な情報を一時的に表示する。
このコマンドは、カレント定義の各行の頻度数を表示する。
このコマンドは、コードの各行の下にコメント行として頻度数を挿入する。1回のundo
コマンドで、すべての挿入をアンドゥできる。頻度数は式の前の‘(’、または式の後の‘)’、または変数の最後の文字の下に表示される。表示をシンプルにするために、同一行にたいして式の以前頻度数と頻度数が同じ場合は表示しない。
ある式にたいする頻度数の後に文字‘=’がある場合、それはその式が評価されるたびに毎回同じ値をリターンしていることを表す。他の言い方をすると、カバレッジテストの目的からは、その式はまだ“カバー”されていないということである。
ある定義にたいして頻度数とカバレッジデータを明確にするには、単にeval-defun
で再インストルメントすればよい。
たとえば、ソースのbreakpointで(fac
5)
を評価した後、edebug-test-coverage
をt
にセットすると、breakpointに達したときの頻度データは以下のようになります:
(defun fac (n) (if (= n 0) (edebug)) ;#6 1 = =5 (if (< 0 n) ;#5 = (* n (fac (1- n))) ;# 5 0 1)) ;# 0
コメント行は、fac
が6回呼び出されたことを表しています。最初のif
命令は毎回同じ結果を5回リターンしています。同じ結果という意味では、2つ目のif
の条件にも当てはまります。fac
の再帰呼び出しは、結局リターンしません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugはデバッグ中のプログラムにたいして透過的であろうと努めますが、完全には達成されません。Edebugは、eや評価リストバッファーで式を評価するときも、一時的に外部のコンテキストをリストアして、透明化を試みます。このセクションではEdebugがリストアするコンテキストと、Edebugがいかにして完全に透過的になるのに失敗するかを正確に説明します。
17.2.14.1 Checking Whether to Stop | 何を行うかをEdebugが決定するタイミング。 | |
17.2.14.2 Edebug Display Update | Edebugがディスプレイを更新するタイミング。 | |
17.2.14.3 Edebug Recursive Edit | Edebugが実行をストップするタイミング。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugにエンターするときは常に特定のデータの保存とリストアを行なう必要があり、それはトレース情報を作成するか、あるいはプログラムを停止するかを決定する前に行なう必要があります。
max-lisp-eval-depth
およびmax-specpdl-size
は、Edebugがスタック与える影響の低減効果を高める。しかしそれでも、Edebug使用時にスタック空間を使い切ってしまうことはあり得る。
edebug-continue-kbd-macro
がnil
の場合は、executing-kbd-macro
がnil
にバインドされる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
(たとえばtraceモードなどで)Edebugが何かを表示する必要があるときは、Edebugの“外部”からカレントウィンドウ構成(Window Configurationsを参照)を保存します。Edebugをexitするときに、以前のウィンドウ構成がリストアされます。
Emacsは、pause時だけ再表示を行います。通常は実行を継続したときに、そのプログラムはbreakpointまたはステップ実行後にEdebugに再エンターし、その間にpauseや入力の読み取りはありません。そのような場合、Emacsが“外部”の構成を再表示する機会は決してありません。結果として、ユーザーが目にするウィンドウ構成は、前回Edebugが中断なしでアクティブだったときのウィンドウ構成と同じになります。
何かを表示するためにEdebugにエントリーすることにより、(たとえこれらのうちのいくつかは、エラーやquitがシグナルされたときは、故意にリストアしないデータだとしても)以下のデータも保存およびリストアされます。
edebug-save-windows
が非nil
の場合は、外部のウィンドウ構成が保存およびリストアされる(Edebug Optionsを参照)。
エラーやquitではウィンドウ構成はリストアされないが、save-excursion
がアクティブな場合は、たとえエラーやquitのとき外部の選択されたウィンドウが再選択される。edebug-save-windows
の値がリストの場合は、それにリストされたウィンドウだけが保存およびリストアされる。
しかし、ソースコードバッファーのウィンドウの開始位置と水平スクロールはリストアされないので、表示はEdebug内で整合性が保たれたままとなる。
edebug-save-displayed-buffer-points
が非nil
の場合、表示されているそれぞれのバッファー内のポイント値は、保存およびリストアされる。
overlay-arrow-position
とoverlay-arrow-string
は保存およびリストアされるので、同じバッファー内の他の場所の再帰編集から、安全にEdebugを呼び出せる。
cursor-in-echo-area
はnil
にローカルにバインドされるので、カーソルはそのウィンドウ内に現れる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugにエンターしてユーザーのコマンドが実際に読み取られるとき、Edebugは以下の追加データを保存(そして後でリストア)します:
last-command
、this-command
、last-command-event
、last-input-event
、last-event-frame
、last-nonmenu-event
、track-mouse
。Edebug内のコマンドは、Edebug外部のこれらの変数に影響をあたえない。
Edebug内でのコマンド実行は、this-command-keys
によりリターンされるキーシーケンスを変更でき、Lispからそのキーシーケンスをリセットする方法はない。
Edebugはunread-command-events
の値の保存およびリストアができない。この変数が重要な値をもつときにEdebugにエンターすると、デバッグ中のプログラムの実行に干渉する可能性がある。
command-history
に追加される。これが稀に実行に影響を与える。
standard-output
とstandard-input
はrecursive-edit
によりnil
にバインドされるが、Edebugは評価の間それらを一時的にリストアする。
defining-kbd-macro
はedebug-continue-kbd-macro
にバインドされる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Edebugが正しくマクロを呼び出す式をインストルメントするには、いくつかの特定な配慮が必要になります。このサブセクションでは、その詳細を説明します。
17.2.15.1 Instrumenting Macro Calls | 基本的な問題点。 | |
17.2.15.2 Specification List | 式の複雑なパターンを指定する方法。 | |
17.2.15.3 Backtracking in Specifications | マッチに失敗したときEdebugが行なうこと。 | |
17.2.15.4 Specification Examples | Edebug仕様を理解するために。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
EdebugがLispマクロを呼び出す式をインストルメントするときは、正しくインストルメントを行なうために、そのマクロに関して追加の情報が必要になります。これは、マクロ呼び出しのどの部分式(subexpression)が評価されるフォームなのか推測する方法がないからです。(評価はマクロのbodyで明示的に発生するかもしれないし、展開結果が評価されるとき、または任意のタイミングで行われるかもしれません。)
したがって、Edebugが処理するかもしれないすべてのマクロにたいして、そのマクロの呼び出しフォーマットを説明するための、Edebug仕様(Edebug
specification)を定義しなければなりません。これを行なうには、マクロ定義にdebug
宣言を追加します。以下はマクロ例for
(Evaluating Macro Arguments Repeatedlyを参照)にたいする簡単な仕様の例です。
(defmacro for (var from init to final do &rest body) "Execute a simple \"for\" loop. For example, (for i from 1 to 10 do (print i))." (declare (debug (symbolp "from" form "to" form "do" &rest form))) ...)
このEdebug仕様は、マクロ呼び出しのどの部分が評価されるフォームなのかを示しています。単純なマクロにたいするEdebug仕様は、そのマクロ定義の正式な引数リストに非常に類似している場合がありますが、Edebug仕様はマクロ引数に比べより汎的です。declare
フォームの詳細は、Defining Macrosを参照してください。
コードをインストルメントするときEdebugに仕様が確実に解るよう注意してください。マクロ定義を含む他のファイルを要求するためにeval-when-compile
を使用するファイルから関数をインストルメントする場合は、そのファイルを明示的にロードする必要があるかもしれません。
def-edebug-spec
によりマクロ定義から個々のマクロにたいしてEdebug仕様を定義することもできます。Lispで記述されたマクロ定義にたいしてはdebug
宣言を追加するほうが好ましく、その方が便利でもありますが、def-edebug-spec
ではCで実装されたスペシャルフォームにたいしてEdebug仕様を定義することが可能になります。
マクロmacro呼び出しのどの式が評価される式かを指定する。specificationはEdebug仕様である。どちらの引数も評価されない。
引数macroは単なるマクロ名ではない、任意の実シンボルを指定できる。
以下はspecificationに指定できるシンボルと、引数を処理する方法のテーブルです。
t
すべての引数は評価のためにインストルメントされる。
0
引数はインストルメントされない。
そのシンボルは、かわりに使用されるEdebug仕様をもたなければならない。このインダイレクションは、他の種類の仕様が見つかるまで繰り返される。これにより、他のマクロの仕様を継承できる。
リストの要素はフォーム呼び出しの引数の型を記述する。仕様リストに指定できる要素については、以降のセクションを参照。
マクロがEdebug仕様をもたない場合は、debug
宣言およびdef-edebug-spec
呼び出しのどちらを通じても、変数edebug-eval-macro-args
が効果を発揮する。
これは、Edebugが明示的なEdebug仕様をもたないマクロ引数を扱う方法を制御する。nil
(デフォルト)の場合、引数は評価のためにインストルメントされない。それ以外は、すべての引数がインストルメントされる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるマクロ呼び出しにおいて、いくつかの引数は評価されるが、それ以外の引数は評価されないような場合には、Edebug仕様のために仕様リスト(specification
list)が要求されます。仕様リスト内のいくつかの要素は1つ以上の引数にマッチしまづが、それ以外の要素は以降に続くすべての引数の処理を変更します。後者は仕様キーワード(specification
keywords)と呼ばれ、(&optional
のように)‘&’で始まるシンボルです。
仕様リストは、それ自身がリストであるような引数にマッチする部分リスト(sublist)、またはグループ化に使用されるベクターを含むかもしれません。したがって部分式とグループは、仕様リストをレベル階層に細分化します。仕様キーワードは、部分式やグループを含むものの残りに適用されます。
仕様リストに選択肢や繰り返しが含まれる場合は、実際のマクロの呼び出しにたいしてマッチさせるためにバックトラックが要求されるかもしれません。詳細は、Backtracking in Specificationsを参照してください。
Edebug仕様は、バランスのとれたカッコで括られた部分式へのマッチ、フォームの再帰処理、インダイレクト仕様を通じた再帰などの、正規表現によるマッチングと、コンテキストに依存しない文法構成を提供します。
以下は仕様リストに使用できる要素と、その意味についてのテーブルです(使用例はSpecification Examplesを参照):
sexp
評価れない単一のLispオブジェクト。インストルメントされない。
form
評価される単一のLispオブジェクト。インストルメントされる。
place
汎変数(generalized variable)。Generalized Variablesを参照。
body
&rest form
の省略形。以下の&rest
を参照。
function-form
関数フォーム。クォートされた関数シンボル、クォートされたラムダ式、または(関数シンボルかラムダ式に評価される)フォームのうちのどれか。これはラムダ式のbodyをいずれかの方法でインストルメントするため、function
よりもquote
でクォートされたラムダ式の引数にたいし有用。
lambda-expr
クォートされないラムダ式。
&optional
仕様リスト内の後続の要素はオプション。マッチしない要素が出現すると、Edebugはこのレベルのマッチングを停止する。
後続が非オプションの要素であるような数個の要素をオプションにするだけなら、[&optional
specs…]
を使用する。複数の要素すべてのマッチ、または非マッチを指定するには、&optional
[specs…]
を使用する。defun
の例を参照。
&rest
仕様リスト内の後続のすべての要素は、0回以上繰り返される。しかし、最後の繰り返しでは、仕様リスト内のすべての要素にたいするマッチングの前に式が終了しても問題はない。
数個の要素を繰り返すには、[&rest
specs…]
を使用する。各繰り返しにおいいてすべてマッチしなければならない複数要素を指定するには、&rest
[specs…]
を使用する。
&or
仕様リスト内の後続の各要素は選択肢。選択肢の1つがマッチしなければならず、マッチしない場合&or
仕様は失敗する。
&or
に続く各リスト要素は、単一の選択肢。複数のリスト要素を単一の選択肢にグループ化するには、それらを[…]
で括る。
¬
後続の各要素は、&or
が使用されたときのように選択肢にマッチするが、要素がマッチした場合に失敗する。どれもマッチする要素がない場合は何もマッチされないが、¬
仕様は成功する。
&define
フォーム定義にたいする仕様であることを示す。フォーム定義自体はインストルメントされない(つまりEdebugはフォーム定義の前後でストップしない)が、フォーム内部は通常はインストルメントされるであろう。&define
キーワードはリスト仕様の最初の要素であること。
nil
カレント引数レベルでマッチさせる引数が存在しない場合は成功し、それ以外は失敗する。部分リスト仕様とバッククォートの例を参照。
gate
引数はマッチされないがgateを通じたバックトラックは、このレベルの使用の残りをマッチングする間は無効にされる。これは主に、特定の構文エラーメッセージを一般的にするために使用される。詳細はBacktracking in Specifications、およびlet
の例も参照。
other-symbol
仕様リスト内のその他の要素は、述語(predicate)かインダイレクト仕様(indirect specification)である。
シンボルがEdebug仕様をもつ場合、インダイレクト仕様(indirect
specification)はシンボル位置に使用されるリスト仕様か、引数を処理するための関数のどちらかである。この仕様はマクロにたいするdef-edebug-spec
のように定義される。defun
の例を参照。
それ以外の場合、シンボルは述語(predicate)である。述語は引数とともに呼び出され、述語がnil
をリターンした場合、その仕様は失敗して引数はインストルメントされない。
適切な述語としてはsymbolp
、integerp
、stringp
、vectorp
、atom
が含まれる。
[elements…]
要素のベクターは、要素を単一のグループ仕様(group specification)にグループ化する。このグループ仕様は、ベクター自体に何も行わない。
"string"
引数はstringという名前のシンボルである。この仕様は、symbolの名前がstringであるクォートされたシンボル'symbol
と等価だが、文字列形式のほうが好ましい。
(vector elements…)
引数は、要素が仕様内のelementsにマッチするベクターである。バッククォートの例を参照。
(elements…)
他のリストは部分リスト仕様(sublist specification)であり、引数は要素が仕様のelementsにマッチするリストでなければならない。
部分リスト仕様はドットリスト(dotted
list)かもしれず、その場合対応するリスト引数はドットリストである。かわりに、ドットリスト仕様の最後のCDRが、(グループ化やインダイレクト仕様による)他の部分リスト仕様かもしれない(たとえば要素が非ドットリストにマッチする(spec
. [(more
specs…)])
))。これはバッククォートの例のような再帰仕様に有用。このような再帰を終了させるには、上述のnil
仕様も参照。
(specs . nil)
のように記述された部分リスト仕様は(specs)
、(specs .
(sublist-elements…))
は(specs
sublist-elements…)
と等価であることに注意。
以下は&define
の後だけに出現する追加仕様のリストです。defun
の例を参照してください。
name
引数(シンボル)は定義フォームの名前。
定義フォームは名前フィールドをもつ必要はなく、複数の名前フィールドをもつかもしれない。
:name
この構成は引数に実際のマッチは行わない。:name
の後の要素はシンボルであり、その定義の追加の名前要素として使用される。定義名に一意で静的な要素を加えるために、これを使用できる。複数回使用されるかもしれない。
arg
引数(シンボル)は定義フォームの引数の名前である。しかし、lambda-listキーワード(‘&’で始まるシンボル)は許されない。
lambda-list
これはラムダリスト(ラムダ式の引数リスト)にマッチする。
def-body
引数は定義内のコードのbodyである。これは上述のbody
と似ているが、定義のbodyはその定義に関連する情報を照会する別のEdebug呼び出しでインストルメントされていなければならない。定義内のより高位レベルのフォームリストには、def-body
を使用する。
def-form
引数は、定義内のもっとも高位レベルの単一フォームである。これはdef-body
と似ているが、フォームリストではなく単一フォームのマッチに使用される。特別なケースとして、def-form
はフォームが実行されるときトレース情報を出力しないことも意味する。interactive
の例を参照。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるポイント位置で仕様がマッチに失敗しても、構文エラーがシグナルされるとは限りません。そのかわりバックトラック(backtracking)が開始されます。バックトラックは、すべての選択肢をマッチングするまで行なわれます。最終的に引数リストのすべての要素は仕様内の要素のいずれかとマッチしなければならず、仕様内の必須要素は引数のいずれかとマッチしなければなりません。
構文エラーが検出されてもその時点では報告されず、より高位レベルの選択肢のマッチングが終わった後、実際のエラー箇所から離れたポイント位置でエラーが報告されるかもしれません。しかしエラー発生時にバックトラックが無効なら、エラーは即座に報告されるでしょう。ある状況においては、バックトラックも自動的に再有効化されることに注意してください。&optional
、&rest
、&or
により新たな選択肢が設定されたとき、または部分リスト、グループ、インダイレクト仕様が開始されたときは、バックトラックが自動的に有効になります。バックトラックを有効、または無効にした場合の影響は、現在処理中のレベルの残り要素と、低位レベルに限定されます。
何らかのフォーム仕様(すなわちform
、body
、def-form
、def-body
)をマッチングする間、バックトラックは無効になっています。これらの仕様は任意のフォームにマッチするので、何らかのエラーが発生するとしたらそれは高位レベルではなく、そのフォーム自体の内部でなければなりません。
バックトラックはクォートされたシンボルや文字列仕様とのマッチに成功した後にも無効になります。なぜなら通常これは構成が認識されたことを示すからです。しかし、同じシンボルで始まる一連の選択肢構成がある場合は、たとえば["foo"
&or [first case] [second case]
...]
のように、通常は選択肢の外部にそのシンボルをファクタリングすることにより、この制約に対処できます。
ほとんどのニーズは、バックトラックを自動的に無効にする、これら2つの方法で満足させることができますが、gate
仕様を使用して明示的にバックトラックを無効にするほうが便利なときもあります。これは、高位に適用可能な選択肢が存在しないことが分かっている場合に有用です。let
仕様の例を参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下で提供する例から学ぶことにより、Edebug仕様の理解が容易になるかもしれません。
スペシャルフォームlet
は、バインディングとbodyのシーケンスをもちます。各バインディングはそシンボル、またはシンボルとオプションの部分リストです。以下の仕様では、部分リストを見つけたらバックトラックを抑止するために、部分リスト内のgate
があることに注目してください。
(def-edebug-spec let ((&rest &or symbolp (gate symbolp &optional form)) body))
Edebugはdefun
および関連する引数リスト、interactive
仕様にたいして以下の仕様を使用します。式の引数はその関数bodyの外部で実際に評価されるので、interactiveフォームは特別に処理する必要があります。(defmacro
にたいする仕様はdefun
にたいする仕様と非常に似ていますが、declare
命令文が許されます。)
(def-edebug-spec defun
(&define name lambda-list
[&optional stringp] ; ドキュメント文字列が与えられた場合はマッチする。
[&optional ("interactive" interactive)]
def-body))
(def-edebug-spec lambda-list
(([&rest arg]
[&optional ["&optional" arg &rest arg]]
&optional ["&rest" arg]
)))
(def-edebug-spec interactive
(&optional &or stringp def-form)) ; Notice: def-form
以下のバッククォートにたいする仕様は、ドットリストにマッチさせる方法と、nil
を使用して再帰を終了させる方法を説明するための例です。また、ベクターのコンポーネントをマッチさせる方法も示しています。(Edebugにより定義される実際の仕様は少し異なり、ドットリストについては失敗するかもしれない非常に深い再帰を引き起こすためサポートしていません。)
(def-edebug-spec \` (backquote-form)) ; Alias just for clarity.
(def-edebug-spec backquote-form
(&or ([&or "," ",@"] &or ("quote" backquote-form) form)
(backquote-form . [&or nil backquote-form])
(vector &rest backquote-form)
sexp))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のオプションは、Edebugの動作に影響を与えます:
Edebugが使用される前に呼び出される関数。この関数は毎回新たな値をセットする。Edebugこれらの関数を一度呼び出したら、その後edebug-setup-hook
nil
にリセットする。使用するパッケージに関係するEdebug仕様をロードするために使用dきるが、それはEdebugを使用するときだけである。Instrumenting for Edebugを参照。
これが非nil
の場合はdefun
やdefmacro
のような定義フォームの普通に評価すると、Edebug用にインストルメントされる。これはeval-defun
、eval-region
、eval-buffer
、and
eval-current-buffer
に適用される。
このオプションの切り替えには、コマンドM-x edebug-all-defsを使用する。Instrumenting for Edebugを参照。
これが非nil
の場合eval-defun
、eval-region
、eval-buffer
、eval-current-buffer
は、たとえフォームが何も定義していなくても、すべてのフォームをインストルメントする。これはロードとミニバッファー内の評価には適用されない。
このオプションの切り替えには、コマンドM-x edebug-all-formsを使用する。Instrumenting for Edebugを参照。
これが非nil
の場合、Edebugはウィンドウ構成の保存とリストアを行なう。これにはある程度時間がかかるので、ウィンドウ構成に何が起こってもプログラムに関係しない場合は、この変数をnil
にセットしたほうがよい。
値がリストの場合は、リストされたウィンドウだけが保存およびリストアされる。
Edebug内では、この変数をインタラクティブに変更するためにWコマンドを使用できる。Edebug Display Updateを参照。
これが非nil
の場合、Edebugは表示されているすべてのバッファー内のポイントを保存およびリストアする。
選択されていないウィンドウ内に表示されているバッファーのポイントを変更するコードをデバッグしている場合は、他のバッファーのポイントを保存およびリストアする必要がある。その後にEdebugまたはユーザーがそのウィンドウを選択した場合は、そのバッファー内のポイントは、そのウィンドウのポイント値に移動される。
すべてのバッファー内のポイントの保存とリストアは、それぞれのウィンドウを2回選択する必要があり高価な処理のため、必要なときだけ有効にする。Edebug Display Updateを参照。
この変数が非nil
の場合、Edebugが最初にアクティブになったときの、Edebugの最初の実行モードを指定する。指定できる値はstep
、next
、go
、Go-nonstop
、trace
、Trace-fast
、continue
、Continue-fast
。
デフォルト値はstep
。Edebug Execution Modesを参照。
これが非nil
の場合が、各関数のエントリーとexitをトレースする。トレース出力は、関数のエントリーとexitを行ごとに、再帰レベルにしたがって*edebug-trace*という名前のバッファーに表示される。
Trace Bufferのedebug-tracing
も参照のこと。
非nil
の場合、Edebugはデバッグされるすべての式のカバレッジをテストする。Coverage Testingを参照。
非nil
の場合は、Edebug外で実行されている任意のキーボードマクロの定義または実行を継続する。これはデバッグされないので、慎重に使用すること。Edebug Execution Modesを参照。
非nil
の場合、Edebugは式の結果を表示するときに、その式自体のインストルメント結果の削除を試みる。マクロをデバッグするときは、式の結果自体がインストルメントされた式になるということに関連する。実際的な例ではないが、サンプル例の関数fac
がインストルメントされたとき、そのフォームのマクロを考えてみるとよい。
(defmacro test () "Edebug example." (if (symbol-function 'fac) …))
test
マクロをインストルメントしてステップ実行すると、デフォルトではsymbol-function
呼び出しは多数のedebug-after
フォームとedebug-before
フォームをもつことになり、それにより“実際の”結果の確認が難しくなり得る。edebug-unwrap-results
が非nil
の場合、Edebugは結果からこれらのフォームの削除を試みる。
debug-on-error
の以前がnil
の場合、Edebugはdebug-on-error
をこの値にバインドする。Trapping Errorsを参照。
debug-on-quit
の以前の値がnil
の場合、Edebugはdebug-on-quit
にこの値をバインドする。Trapping Errorsを参照。
Edebugがアクティブな間にedebug-on-error
またはedebug-on-quit
の値を変更した場合は、次回に新たなコマンドを通じてEdebugが呼び出されるまで、これらの値は使用されない。
非nil
の場合、値はすべてのステップポイントでテストされる式である。式の結果がnil
の場合は、breakする。エラーは無視される。Global Break Conditionを参照。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispリーダーは無効な構文(invalid syntax)について報告はしますが、実際の問題箇所は報告しません。たとえば、ある式を評価中のエラー“End of file during parsing(パース中にファイル終端に達した)”は、開カッコまたは開角カッコ(open parenthese or open square bracket)が多いことを示しています。Lispリーダーはこの不一致をファイル終端で検出しましたが、本来閉カッコがあるべき箇所を解決することはできません。同様に、“Invalid read syntax: ")"(無効なread構文:)")"”は開カッコの欠落を示していますが、欠落しているカッコが属すべき場所は告げません。ならば、どうやって変更すべき箇所を探せばよいのでしょうか?
問題が単なるカッコの不一致でない場合の便利なテクニックは、各defunの先頭でC-M-eとタイプして、そのdefunの最後と思われる箇所に移動するか確認する方法です。もし移動しなければ、問題はそのdefunの内部にあります。
マッチしないカッコがLispにおいてもっとも一般的な構文エラーなので、これらのケースにたいしてさらにアドバイスすることができます。(Show Parenモードを有効にしてコードにポイントを移動するだけで、カッコの不一致を探しやすくなるでしょう。)
17.3.1 Excess Open Parentheses | 誤った開カッコと閉カッコを探す方法。 | |
17.3.2 Excess Close Parentheses | 誤った閉カッコと開カッコを探す方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
カッコがマッチしないdefunを探すのが、最初のステップです。過剰な開カッコが存在する場合は、ファイルの終端に移動してC-u C-M-uとタイプします。これにより、カッコがマッチしない最初のdefunの先頭に移動するでしょう。
何が間違っているのか正確に判断するのが次のステップです。これを確実に行なうには、そのプログラムを詳しく調べる以外に方法はありませんが、カッコがあるべき箇所を探すのに、既存のインデントが手掛かりになることが多々あります。C-M-qで再インデントして何が移動されるか確認するのが、この手掛かりを使用するもっとも簡単な方法です。しかし、行うのはちょっと待ってください! まず続きを読んでからにしましょう。
これを行なう前に、defunに十分な閉カッコがあるか確認します。十分な閉カッコがない場合、C-M-qがエラーとなるか、そのdefunからファイル終端までの残りすべてが再インデントされます。その場合はdefunの最後に移動して、そこに閉カッコを挿入します。そのdefunのカッコの釣り合いがとれるまでは、defunの最後に移動するのにC-M-eは使用できません(失敗するでしょう)。
これでdefunの先頭に移動してC-M-qとタイプすることができます。通常は、一定のポイントからその関数の最後までのすべての行が、右へとシフトされるでしょう。これはおそらくそのポイント付近で閉カッコが欠落しているか、不要な開カッコがあります。(しかし、これを真実と仮定せず、コードを詳しく調べてください。) 不一致箇所が見つけたら、元のインデントはおそらく意図されたカッコに適しているはずなので、C-_でC-M-qをアンドゥしてください。
問題をfixできたと思った後に、再度C-M-qを使用します。実際に元のインデントが意図したカッコのネストに適合していて、足りないカッコを追加していたら、C-M-qは何も変更しないはずです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
過剰な閉カッコへの対処は、まずファイルの先頭に移動してから、カッコのマッチしないdefunを探すためにC-u -1 C-M-uをタイプします。
それから、そのdefunの先頭でC-M-fをタイプして、実際にマッチする閉カッコを探します。これにより、そのdefunの終端より幾分手前の箇所に移動するでしょう。その付近に間違った閉カッコが見つかるでしょう。
そのポイントに問題が見つからない場合には、そのdefunの先頭でC-M-qをタイプするのが次のステップです。ある行範囲はおそらく左へシフトするでしょう。その場合、欠落している開カッコまたは間違った閉カッコは、おそらくそれらの行の1行目の近くにあるでしょう。 (しかし、これを真実と仮定せず、コードを詳しく調べてください。)不一致箇所が見つけたら、元のインデントはおそらく意図されたカッコに適しているはずなので、C-_でC-M-qをアンドゥしてください。
問題をfixできたと思った後に、再度C-M-qを使用します。実際に元のインデントが意図したカッコのネストに適合していて、足りないカッコを追加していたら、C-M-qは何も変更しないはずです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
testcover
ライブラリーをロードして、コマンドM-x testcover-start RET
file
RETでコードをインストルメントすることにより、Lispコードのファイルにたいしてカバレッジテストを行なうことができます。コードを1回以上呼び出すことにより、テストが行なわれます。コマンドM-x
testcover-mark-allを使用すれば、カバレッジが不十分な箇所が色付きでハイライト表示されます。コマンドM-x
testcover-next-markは、次のハイライトされた箇所へポイントを前方に移動します。
通常、赤くハイライトされた箇所はそのフォームが完全に評価されたことが一度もないことを示し、茶色でハイライトされた箇所は常に同じ値に評価された(その結果にたいして少ししかテストされていない)ことを意味します。しかし、error
のように完全に評価するのが不可能なフォームにたいしては、赤いハイライトはスキップされます。(setq
x 14)
のように、常に同じ値に評価されることが期待されるフォームにたいしては、茶色のハイライトスキップされます。
難しいケースでは、テストカバレッジツールにアドバイスを与えるために、コードにdo-nothingマクロを追加することができます。
formを評価してその値をリターンするが、テストカバレッジにたいしてformが常に同じ値だという情報を与える。
formを評価し、formが決してリターンしないという情報をカバレッジテストに与える。もしリターンした場合は、run-timeエラーとなる。
Edebugにもカバレッジテスト機能があります(Coverage Testingを参照)。これらの機能は部分的に重複しており、組み合わせることで明確になるでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラムは正常に機能しているものの、より高速にまたは効率的に実行させたい場合にまず行うべきは、そのプログラムがリソースをどのように使用するか知るために、コードをプロファイル(profile)することです。ある特定の関数の実行が、実行時間のうち無視できない割り合いを占めるようなら、その部分を最適化する方法を探すことを開始できます。
Emacsには、このためのビルトインサポートがあります。プロファイリングを開始するには、M-x profiler-startをタイプします。プロファイルはプロセッサー使用(processor usage)、メモリー使用(memory usage)、またはその両方を選択できます。何らかの処理を行った後にM-x profiler-reportとタイプすると、プロファイルに選択した各リソースがsummaryバッファーに表示されます。reportバッファーの名前には、そのレポートが生成された時刻が含まれるので、前の結果を消去せずに後で他のレポートを生成できます。プロファイリングが終了したら、M-x profiler-stopとタイプしてください(プロファイリングに関連したオーバーヘッドが少しあるからです)。
profiler reportバッファーでは、各行に呼び出された関数と、その後にプロファイリングが開始されてから使用したリソース(プロセッサーまたはメモリー)の絶対時間とパーセンテージ時間が表示されます。左側にシンボル‘+’のある行ではRETをタイプして行を展開して、高位レベルの関数に呼び出された関数を確認できます。もう一度RETをタイプすると、元の状態へと行が折り畳まれます。
jまたはmouse-2を押下すると、関数の定義にジャンプします。dを押下すると、関数のドキュメントを閲覧できます。C-x C-wを使用して、プロファイルをファイルに保存できます。=を使用すれば、2つのプロファイルを比較することができます。
elpライブラリーは、別のアプローチを提案します。使い方はelp.elを参照してください。
benchmarkライブラリーを使用して、Emacs
Lispフォームのスピードwpy個別にチェックできます。benchmark.el内の関数benchmark-run
、およびbenchmark-run-compiled
を参照してください。
configure
のオプションに--enable-profilingを使用してビルドすることにより、EmacsをCコードのレベルでプロファイルすることができます。こうしてビルドされたEmacsは、Emacsをexitするときにgprof
ユーティリティを使用して検証できるファイルgmon.outを生成します。この機能は主にEmacsのデバッグに有用です。このEmacsは、実行状態から上述のM-x
profiler-…コマンドによりLispレベルで実際にストップします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プリント(print)および読み取り(read)は、Lispオブジェクトからテキスト形式への変換、またはその逆の変換を行なう操作です。これらはLisp Data Typesで説明したプリント表現(printed representation)と入力構文(read syntax)を使用します。
このチャプターでは、読み取りおよびプリントのためのLisp関数について説明します。このチャプターではさらにストリーム(stream)についても説明します。ストリームとは、(読み取りにおいては)テキストがどこから取得されるか、(プリントにおいては)テキストをどこに出力するかを指定します。
18.1 Introduction to Reading and Printing | ストリーム、読み取り、プリントの概観。 | |
18.2 Input Streams | 入力ストリームとして使用できる、さまざまなデータ型。 | |
18.3 Input Functions | テキストからLispオブジェクトを読み取る関数。 | |
18.4 Output Streams | 出力ストリームとして使用できる、さまざまなデータ型。 | |
18.5 Output Functions | テキストとしてLispオブジェクトをプリントする関数。 | |
18.6 Variables Affecting Output | プリント関数が何を行うか制御する変数。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispオブジェクトの読み取りとは、テキスト形式のLisp式をパース(parse:
構文解析)して、対応するLispオブジェクトを生成することを意味します。これは、LLispプログラムがLispコードファイルからLispに取得される方法でもあります。わたしたちは、そのテキストをそのオブジェクトの入力構文(read
syntax)と呼んでいます。たとえばテキスト‘(a .
5)’は、CARがa
でCDRが数字の5であるようなコンスセルにたいする入力構文です。
Lispオブジェクトのプリントとは、あるオブジェクトをそのオブジェクトのプリント表現(printed representation) (Printed Representation and Read Syntaxを参照)に変換することにより、そのオブジェクトを表すテキストを生成することを意味します。上述のコンスセルをプリントすると、テキスト‘(a . 5)’が生成されます。
読み取りとプリントは、概ね逆の処理といえます。あるテキスト断片を読み取った結果生成されたオブジェクトをプリントすると、多くの場合は同じテキストが生成され、あるオブジェクトをプリントした結果のテキストを読み取ると、通常は同じようなオブジェクトが生成されます。たとえばシンボルfoo
をプリントするとテキスト‘foo’が生成され、そのテキストを読み取るとシンボルfoo
がリターンされます。要素がa
とb
のリストをプリントするとテキスト‘(a
b)’が生成され、そのテキストを読み取ると、(同じリストではないが)要素がa
とb
のリストが生成されます。
しかし、これら2つの処理は互いにまったく逆の処理というわけではありません。3つの例外があります:
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
テキストを読み取るLisp関数の大部分は、引数として入力ストリーム(input stream)をとります。入力ストリームは、読み取られるテキストの文字をどこから、どのように取得するかを指定します。以下は可能な入力ストリーム型です:
入力文字はbufferのポイントの後の文字から直接読み取られる。文字の読み取りとともに、ポイントが進む。
入力文字はmarkerのあるバッファーの、マーカーの後の文字から直接読み取られる。文字の読み取りとともに、マーカーが進む。ストリームがマーカーのときは、バッファー内のポイント値に影響はない。
入力文字はstringの最初の文字から必要な文字数分が取得される。
入力文字はfunctionから生成され、その関数は2種類の呼び出しをサポートしなければならない:
t
t
は、その入力がミニバッファーから読み取られるストリームであることを意味する。実際にはミニバッファーが1回呼び出されて、ユーザーから与えられたテキストが、その後に入力ストリームとして使用される文字列となる。Emacsがbatchモードで実行されている場合は、ミニバッファーのかわりに標準入力が使用される。たとえば、
(message "%s" (read t))
このような場合は標準入力からLisp式が読み取られて、結果は標準出力にプリントされるだろう。
nil
入力ストリームとしてnil
が与えられた場合は、かわりにstandard-input
の値が使用されることを意味する。この値はデフォルトの入力ストリーム(default
input stream)であり、非nil
の入力ストリームでなければならない。
入力ストリームとしてのシンボルは、(もしあれば)そのシンボルの関数定義と等価である。
以下の例では、バッファーストリームから読み込み、読み取りの前後におけるポイント位置を示しています:
---------- Buffer: foo ---------- This∗ is the contents of foo. ---------- Buffer: foo ----------
(read (get-buffer "foo")) ⇒ is
(read (get-buffer "foo")) ⇒ the
---------- Buffer: foo ---------- This is the∗ contents of foo. ---------- Buffer: foo ----------
最初の読み取りではスペースがスキップされていることに注意してください。読み取りにおいては、意味のあるテキストに先行する、任意のサイズの空白文字がスキップされます。
以下は、マーカーストリームからの読み取りの例で、最初は表示されているバッファーの先頭にマーカーが配します。読み取られた値はシンボルThis
です。
---------- Buffer: foo ---------- This is the contents of foo. ---------- Buffer: foo ----------
(setq m (set-marker (make-marker) 1 (get-buffer "foo"))) ⇒ #<marker at 1 in foo>
(read m) ⇒ This
m
⇒ #<marker at 5 in foo> ;; 最初のスペースの前。
以下では、文字列のコンテンツから読み取っています:
(read "(When in) the course") ⇒ (When in)
以下はミニバッファーから読み取る例です。プロンプトは、‘Lisp expression: ’です。(このプロンプトはストリームt
から読み取る際は常に使用されます。) ユーザーの入力はプロンプトの後に表示されます。
(read t)
⇒ 23
---------- Buffer: Minibuffer ----------
Lisp expression: 23 RET
---------- Buffer: Minibuffer ----------
最後は、useless-stream
という名前の関数ストリームから読み取る例です。ストリームを使用する前に、変数useless-list
を文字のリストに初期化しています。その後は、リスト内の次の文字を取得するため、または文字をリストの先頭に追加することにより読み戻すために、関数useless-stream
を呼び出します。
(setq useless-list (append "XY()" nil)) ⇒ (88 89 40 41)
(defun useless-stream (&optional unread) (if unread (setq useless-list (cons unread useless-list)) (prog1 (car useless-list) (setq useless-list (cdr useless-list))))) ⇒ useless-stream
このストリームを使って、以下のように読み取ります:
(read 'useless-stream) ⇒ XY
useless-list ⇒ (40 41)
開カッコと閉カッコがリスト内に残ることに注意してください。Lispリーダーは開カッコに出会うと、それを入力の終わりと判断して、読み戻します。次にこのポイント位置からこのストリームを読み取ると、‘()’が読み取られてnil
がリターンされます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、読み取りに関係のあるLisp関数と変数について説明します。
以下の関数で、streamは入力ストリーム(前のセクションを参照)を意味します。streamがnil
、または省略された場合のデフォルト値はstandard-input
です。
読み取りにおいて終端されていないリスト、ベクター、文字列に遭遇した場合は、end-of-file
がシグナルされます。
この関数はstreamからテキスト表現されたLisp式を1つ読み取り、Lispオブジェクトとしてリターンする。これは基本的なLisp入力関数である。
この関数はstring内のテキストから、最初のテキスト表現されたLisp式を読み取る。リターン値はCARがその式で、CDRが次に読み取られるその文字列内の残りの文字(読み取られていない最初の文字)の位置を与える整数であるようなコンスセルである。
startが与えられた場合は、文字列内のインデックスstart(最初の文字はインデックス0)から読み取りが開始される。endを指定した場合は、残りの文字列が存在しないかのごとく、そのインデックスの直前で読み取りがストップされる。
たとえば:
(read-from-string "(setq x 55) (setq y 5)") ⇒ ((setq x 55) . 11)
(read-from-string "\"A short string\"") ⇒ ("A short string" . 16)
;; Read starting at the first character.
(read-from-string "(list 112)" 0)
⇒ ((list 112) . 10)
;; Read starting at the second character.
(read-from-string "(list 112)" 1)
⇒ (list . 5)
;; Read starting at the seventh character, ;; and stopping at the ninth. (read-from-string "(list 112)" 6 8) ⇒ (11 . 8)
この変数はデフォルト入力ストリーム(引数streamがnil
のときread
が使用するストリーム)を保持する。デフォルトはt
で、これはミニバッファーを使用することを意味する。
非nil
の場合、この変数は循環構造(circular structure)および共有構造(shared
structures)の読み取りを有効にする。Read Syntax for Circular Objectsを参照。デフォルト値はt
。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
出力ストリームは、プリントにより生成された文字に何を行うかを指定します。ほとんどのプリント関数は、オプション引数として出力ストリームを受け入れます。以下は利用できる出力ストリーム型です:
出力文字は、bufferのポイント位置に挿入される。文字が挿入された分、ポイントが進む。
出力文字は、markerのあるバッファーのマーカー位置に挿入される。文字が挿入された分、マーカー位置が進む。ストリームがマーカーのときは、そのバッファー内のポイント位置にプリントは影響せず、この種のプリントでポイントは移動しない(マーカー位置がポイント位置、またはポイント位置より前の場合は除外される。通常はテキストの周囲にポイントが進む)。
出力文字は、文字を格納する役目をもつfunctionに渡される。この関数は1つの文字を引数に、出力される文字の回数呼び出され、その文字を格納したい場所に格納する役目をもつ。
t
出力文字はエコーエリアに表示される。
nil
出力ストリームにnil
が指定された場合は、かわりにstandard-output
の値が使用されることを意味する。この値はデフォルトの出力ストリーム(default
output stream)であり、非nil
でなければならない。
出力ストリームとしてのシンボルは、(もしあれば)そのシンボルの関数定義と等価である。
有効な出力ストリームの多くは、入力ストリームとしても有効です。したがって入力ストリームと出力ストリームの違いは、Lispオブジェクトの型ではなく、どのようにLispオブジェクトを使うかという点です。
以下はバッファーを出力ストリームとして使用する例です。ポイントは最初は‘the’の中の‘h’の直前にあります。そして最後も、同じ‘h’の直前に配されます。
---------- Buffer: foo ---------- This is t∗he contents of foo. ---------- Buffer: foo ----------
(print "This is the output" (get-buffer "foo")) ⇒ "This is the output"
---------- Buffer: foo ---------- This is t "This is the output" ∗he contents of foo. ---------- Buffer: foo ----------
次はマーカーを出力ストリームとして使用する例です。マーカーは最初、バッファーfoo
内の単語‘the’の中の‘t’と‘h’の間にあります。最後には、挿入されたテキストによりマーカーが進み、同じ‘h’の前に留まります。通常の方法で見られるようなポイント位置への影響がないことに注意してください。
---------- Buffer: foo ---------- This is the ∗output ---------- Buffer: foo ----------
(setq m (copy-marker 10)) ⇒ #<marker at 10 in foo>
(print "More output for foo." m) ⇒ "More output for foo."
---------- Buffer: foo ---------- This is t "More output for foo." he ∗output ---------- Buffer: foo ----------
m ⇒ #<marker at 34 in foo>
以下はエコーエリアに出力を表示する例です:
(print "Echo Area output" t) ⇒ "Echo Area output" ---------- Echo Area ---------- "Echo Area output" ---------- Echo Area ----------
最後は関数を出力ストリームとして使用する例です。関数eat-output
は与えられたそれぞれの文字をlast-output
の先頭にconsします(Building Cons Cells and Listsを参照)。最後には、リストには出力されたすべての文字が逆順で含まれます。
(setq last-output nil) ⇒ nil
(defun eat-output (c) (setq last-output (cons c last-output))) ⇒ eat-output
(print "This is the output" 'eat-output) ⇒ "This is the output"
last-output ⇒ (10 34 116 117 112 116 117 111 32 101 104 116 32 115 105 32 115 105 104 84 34 10)
このリストを逆転すれば、正しい順序で出力することができます:
(concat (nreverse last-output)) ⇒ " \"This is the output\" "
concat
を呼び出してリストを文字列に変換すれば、内容をより明解に確認できます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、オブジェクトをオブジェクトのプリント表現に変換してLispオブジェクトをプリントするLisp関数を説明します。
Emacsプリント関数には、正しく読み取れるように必要なとき出力にクォート文字を追加するものがあります。使用されるクォート文字は‘"’と‘\’です。これらは文字列をシンボルと区別するとともに、文字列およびシンボル内の区切り文字が読み取り時に区切り文字として扱われることを防ぎます。完全な詳細はPrinted Representation and Read Syntaxを参照してください。クォートするかしないかは、プリント関数の選択により指定できます。
そのテキストがLispに読み戻す場合、同様にLispプログラマーにLispオブジェクトを明解に説明するのが目的の場合は、曖昧さを避けるためにクォート文字をプリントするべきです。しかし、プログラマー以外の人間にたいして出力の見栄えを良くするのが目的なら、通常はクォートなしでプリントしたほうがよいでしょう。
Lispオブジェクトは自己参照ができます。通常の方法で自己参照オブジェクトをプリントするにはテキストが無限に必要で、その試みにより無限再帰が発生する恐れがあります。Emacsはそのような再帰を検知して、すでにプリントされたオブジェクトを再帰的にプリントするかわりに、‘#level’をプリントします。たとえば以下は、カレントのプリント処理において、レベル0のオブジェクトを再帰的に参照することを示しています:
(setq foo (list nil)) ⇒ (nil) (setcar foo foo) ⇒ (#0)
以下の関数では、streamは出力ストリームを意味します。(出力ストリームの説明は、前のセクションを参照してください。)
streamがnil
、または省略された場合のデフォルトは、standard-output
の値になります。
print
関数は、プリントを行うための便利な方法である。この関数はobjectの前後に改行を付与して、objectのプリント表現をstreamにプリントする。クォート文字が使用される。print
はobjectをリターンする。たとえば:
(progn (print 'The\ cat\ in) (print "the hat") (print " came back")) -| -| The\ cat\ in -| -| "the hat" -| -| " came back" ⇒ " came back"
この関数はobjectのプリント表現をstreamに出力する。この関数はprint
のように出力を分割するための改行をプリントしないが、print
のようにクォート文字を使用する。objectをリターンする。
(progn (prin1 'The\ cat\ in) (prin1 "the hat") (prin1 " came back")) -| The\ cat\ in"the hat"" came back" ⇒ " came back"
この関数はobjectのプリント表現をstreamに出力する。objectをリターンする。
この関数はread
ではなく人間が読める出力を生成することを意図しているので、クォート文字を挿入せず、文字列のコンテンツの前後にダブルクォート文字を配さない。呼び出しの間に間隔を何も出力しない。
(progn (princ 'The\ cat) (princ " in the \"hat\"")) -| The cat in the "hat" ⇒ " in the \"hat\""
この関数はstreamに改行を出力する。名前の由来は、“terminate print”である。
この関数はcharacterをstreamに出力する。characterをリターンする。
この関数は、同じ引数でprin1
がプリントするテキストを含む文字列をリターンする。
(prin1-to-string 'foo) ⇒ "foo"
(prin1-to-string (mark-marker)) ⇒ "#<marker at 2773 in strings.texi>"
noescapeが非nil
の場合は、出力中のクォート文字の使用を抑制する。(この引数は、Emacsバージョン19以降でサポートされた。)
(prin1-to-string "foo") ⇒ "\"foo\""
(prin1-to-string "foo" t) ⇒ "foo"
Lispオブジェクトのプリント表現を文字列として取得する別の手段については、Formatting Stringsのformat
を参照のこと。
このマクロは出力を文字列に送るようstandard-output
をセットアップして、フォームbodyを実行する。その文字列がリターンされる。
たとえばカレントバッファー名が‘foo’の場合、
(with-output-to-string (princ "The buffer is ") (princ (buffer-name)))
は"The buffer is foo"
をリターンする。
この関数はprin1
と同じようにobjectをstreamに出力するが、より“優雅(pretty)”な方法でこれを行う。すなわち、この関数は人間がより読みやすいようにオブジェクトのインデントとパディングを行う。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この変数の値はデフォルト出力ストリーム(stream引数がnil
のときプリント関数が使用するストリーム)である。デフォルトはt
で、エコーエリアに表示することを意味する。
これが非nil
の場合は、省略されたリーダー構文(たとえば(quote
foo)
を'foo
、(function
foo)
を#'foo
のように)を使用してクォートされたフォームをプリントすることを意味する。
この変数が非nil
の場合、文字列内の改行は‘\n’、改ページは‘\f’でプリントされる。これらの文字は、通常は実際の改行および改ページとしてプリントされる。
この変数はクォートつきのプリントを行うプリント関数prin1
およびprint
に影響を与える。princ
に影響はない。以下はprin1
を使用した場合の例である:
(prin1 "a\nb") -| "a -| b" ⇒ "a b"
(let ((print-escape-newlines t)) (prin1 "a\nb")) -| "a\nb" ⇒ "a b"
2つ目の式では、prin1
を呼び出す間はprint-escape-newlines
のローカルバインドが効果をもつが、結果をプリントするときには効果がない。
この変数が非nil
の場合、クォートつきでプリントするプリント関数prin1
およびprint
は、文字列内のユニバイトの非ASCII文字を無条件でバックスラッシュシーケンスとしてプリントする。
これらの関数は、出力ストリームがマルチバイトバッファー、あるいはマーカーがマルチバイトバッファーをポイントするときは、この変数の値に関わらずユニバイト非ASCII文字にたいしてバックスラッシュシーケンスを使用する。
この変数が非nil
の場合、クォートつきでプリントするプリント関数prin1
およびprint
は、文字列内のマルチバイトの非ASCII文字を無条件でバックスラッシュシーケンスとしてプリントする。
これらの関数は、出力ストリームがユニバイトバッファー、あるいはマーカーがユニバイトバッファーをポイントするときは、この変数の値に関わらずマルチバイト非ASCII文字にたいしてバックスラッシュシーケンスを使用する。
この変数の値は任意のリスト、ベクター、ブールベクターをプリントする際の最大要素数である。プリントされるオブジェクトがこれより多くの要素をもつ場合は、省略記号(“...”)で省略される。
値がnil
(デフォルト)の場合は、無制限である。
(setq print-length 2) ⇒ 2
(print '(1 2 3 4 5)) -| (1 2 ...) ⇒ (1 2 ...)
この変数の値はプリント時の丸カッコ(parentheses: “()”)と角カッコ(brackets:
“[]"’)のネスト最大深さである。この制限を超える任意のリストまたはベクターは省略記号(“...”)で省略される。値nil
(デフォルト)は無制限を意味する。
これらはeval-expression
により使用されるprint-length
およびprint-level
の値であり、したがって間接的に多くのインタラクティブな評価コマンドにより使用される(Evaluating Emacs-Lisp Expressions in The GNU Emacs Manualを参照)。
以下の変数は循環構造および共有構造の検出と報告に使用されます:
非nil
の場合、この変数はプリント時の循環構造と共有構造の検出を有効にする。Read Syntax for Circular Objectsを参照のこと。
非nil
の場合、この変数はプリント時のインターンされていないシンボル(Creating and Interning Symbolsを参照)の検出を有効にする。これが有効な場合、インターンされていないシンボルはプレフィックス‘#:’とともにプリントされる。このプレフィックスは、Lispリーダーにたいしてインターンされていないシンボルを生成するよう告げる。
非nil
の場合は、複数のプリント呼び出しを通じて通番が振られることを意味する。これは‘#n=’ラベルおよび‘#m#’参照にたいしてプリントされる数字に影響する。この変数をsetq
でセットしてはならない。let
を使用して一時的にt
にバインドするべきである。これを行う場合は、print-number-table
もnil
にバインドするべきである。
この変数はprint-circle
機能を実装するために、プリント処理で内部的に使用されるベクターを保持する。print-continuous-numbering
をバインドするときにこの変数をnil
にバインドする以外は、この変数を使用するべきではない。
この変数は浮動小数点数をプリントする方法を指定する。デフォルトはnil
で、これは情報を失わずにその数値を表せるもっとも短い出力を使用することを意味する。
出力フォーマットをより精密に制御するために、この変数に文字列をセットできる。この文字列にはCのsprintf
関数で使用される‘%’指定子をセットする。この変数で使用することのできる制限についての詳細は、この変数のドキュメント文字列を参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ミニバッファー(minibuffer)とは、単一の数プレフィックス引数より複雑な引数を読み取るためにEmacsコマンドが使用する、特別なバッファーのことです。これらの引数にはファイル名、バッファー名、(M-xでの)コマンド名が含まれます。ミニバッファーはフレームの最下行、エコーエリア(The Echo Areaを参照)と同じ場所に表示されますが、引数を読み取るときだけ使用されます。
19.1 Introduction to Minibuffers | ミニバッファーに関する基本的な情報。 | |
19.2 Reading Text Strings with the Minibuffer | そのままのテキスト文字列を読み取る方法。 | |
19.3 Reading Lisp Objects with the Minibuffer | Lispオブジェクトや式を読み取る方法。 | |
19.4 Minibuffer History | ユーザーが再利用できるように以前のミニバッファー入力は記録される。 | |
19.5 Initial Input | ミニバッファーにたいして初期内容を指定する。 | |
19.6 Completion | 補完の呼び出しとカスタマイズ方法。 | |
19.7 Yes-or-No Queries | 問いにたいし単純な答えを求める。 | |
19.8 Asking Multiple Y-or-N Questions | 一連の似たような問いに答える。 | |
19.9 Reading a Password | 端末からパスワードを読み取る。 | |
19.10 Minibuffer Commands | ミニバッファー内でキーバインドとして使用されるコマンド。 | |
19.11 Minibuffer Windows | 特殊なミニバッファーウィンドウを処理する。 | |
19.12 Minibuffer Contents | どのようなコマンドがミニバッファーのテキストにアクセスするか。 | |
19.13 Recursive Minibuffers | ミニバッファーへの再帰的なエントリーが許容されるかどうか。 | |
19.14 Minibuffer Miscellany | カスタマイズ用のさまざまなフックや変数。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ほとんどの点において、ミニバッファーは普通のEmacsバッファーです。編集コマンドのようなバッファーにたいするほとんどの操作は、ミニバッファーでも機能します。しかし、バッファーを管理する操作の多くは、ミニバッファーに適用できません。ミニバッファーは常に‘ *Minibuf-number*’という形式の名前をもち、変更することはできません。ミニバッファーはミニバッファー用の特殊なウィンドウだけに表示されます。これらのウィンドウは常にフレーム最下に表示されます。(フレームにミニバッファーウィンドウがないときや、ミニバッファーウィンドウだけをもつ特殊なフレームもあります。)Minibuffers and Framesを参照してください。
ミニバッファー内のテキストは常にプロンプト文字列(prompt
string)で始まります。これはミニバッファーを使用しているプログラムが、ユーザーにたいしてどのような種類の入力が求められているか告げるために指定するテキストです。このテキストは意図せずに変更してしまわないように、読み取り専用としてマークされます。このテキストはbeginning-of-line
、forward-word
、forward-sentence
、forward-paragraph
を含む特定の移動用関数が、プロンプトと実際のテキストの境界でストップするように、フィールド(Defining and Using Fieldsを参照)としてもマークされています。
ミニバッファーのウィンドウは、通常は1行です。ミニバッファーのコンテンツがより多くのスペースを要求する場合は、自動的に拡張されます。ミニバッファーのウィンドウがアクティブな間は、ウィンドウのサイズ変更コマンドで一時的にウィンドウのサイズを変更できます。サイズの変更は、ミニバッファーをexitしたとき、通常のサイズにリバートされます。ミニバッファーがアクティブでないときはフレーム内の他のウィンドウでウィンドウのサイズ変更コマンドを使用するか、マウスでモードラインをドラッグして、ミニバッファーのサイズを永続的に変更できます。(現実装では、これが機能するにはresize-mini-windows
がnil
でなければなりません。)
フレームがミニバッファーだけを含む場合は、そのフレームのサイズを変更してミニバッファーのサイズを変更できます。
ミニバッファーの使用により入力イベントが読み取られ、this-command
やlast-command
のような変数の値が変更されます(Information from the Command Loopを参照)。プログラムにそれらを変更させたくない場合は、ミニバッファーを使用するコードの前後でそれらをバインドするべきです。
ある状況下では、アクティブなミニバッファーが存在するときでもコマンドがミニバッファーを使用できます。そのようなミニバッファーは再帰ミニバッファー(recursive
minibuffer)と呼ばれます。この場合、最初のミニバッファーは‘ *Minibuf-1*’という名前になります。再帰ミニバッファーはミニバッファー名の最後の数字を増加させて命名されます。(名前はスペースで始まるので、通常のバッファーリストには表示されません。)
再帰ミニバッファーが複数ある場合は、最内の(もっとも最近にエンターされた)ミニバッファーがアクティブなミニバッファーになります。このバッファーが、通常ではミニバッファーと呼ばれるバッファーです。変数enable-recursive-minibuffers
、またはコマンドシンボルのその名前のプロパティをセットすることにより再帰ミニバッファーを許可、または禁止できます(Recursive Minibuffersを参照)。
他のバッファーと同様、ミニバッファーは特別なキーバインドを指定するためにローカルキーマップ(Keymapsを参照)を使用します。ミニバッファーを呼び出す関数も、処理を行うためにローカルマップをセットアップします。補完なしのミニバッファーローカルマップについては、Reading Text Strings with the Minibufferを参照してください。補完つきのミニバッファーローカルマップについては、Minibuffer Commands that Do Completionを参照してください。
ミニバッファーが非アクティブのときのメジャーモードはminibuffer-inactive-mode
で、キーマップはminibuffer-inactive-mode-map
です。これらは、実際にはミニバッファーが別フレームにある場合だけ、便利です。Minibuffers and Framesを参照してください。
Emacsがバッチモードで実行されている場合、ミニバッファーからの読み取りリクエストは、実装にはEmacs開始時に提供された標準入力記述子から行を読み取ります。これは基本的な入力だけをサポートします。特別なミニバッファーの機能(ヒストリー、補完、パスワードのマスクなど)は、バッチモードでは利用できません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ミニバッファー入力にたいする基本的なプリミティブはread-from-minibuffer
で、これは文字列とLispオブジェクトの両方からテキスト表現されたフォームを読み取ることができます。関数read-regexp
は、特別な種類の文字列である正規表現式(Regular Expressionsを参照)の読み取りに使用されます。コマンドや変数、ファイル名などの読み取りに特化した関数もあります(Completionを参照)。
ほとんどの場合では、Lisp関数の途中でミニバッファー入力関数を呼び出すべきではありません。かわりにinteractive
指定されたコマンドの引数読み取りの一部として、すべてのミニバッファー入力を行います。Defining Commandsを参照してください。
この関数は、ミニバッファーから入力を取得するもっとも一般的な手段である。デフォルトでは、任意のテキストを受け入れて、それを文字列としてリターンする。しかし、readが非nil
の場合は、テキストをLispオブジェクトに変換するためにread
を使用する(Input Functionsを参照)。
この関数が最初に行うのは、ミニバッファーをアクティブにして、プロンプトにprompt(文字列でなければならない)を用いてミニバッファーを表示することである。その後に、ユーザーはミニバッファーでテキストを編集できる。
ミニバッファーをexitするためにユーザーがコマンドをタイプするとき、read-from-minibuffer
はミニバッファー内のテキストからリターン値を構築する。通常はそのテキストを含む文字列がリターンされる。しかし、readが非nil
の場合、read-from-minibuffer
はテキストを読み込んで結果を未評価のLispオブジェクトでリターンする。(読み取りについての詳細は、See section Input Functionsを参照のこと。)
引数defaultは、ヒストリーコマンドを通じて利用できるデフォルト値を指定する。値には文字列、文字列リスト、またはnil
を指定する。文字列または文字列リストは、ユーザーがM-nで利用可能な“未来のヒストリー(future
history)”になります。
readが非nil
の場合は、ユーザーの入力が空のときのread
の入力としても、defaultが使用される。defaultが文字列リストの!は、最初の文字列が入力として使用される。defaultがnil
の場合、空の入力はend-of-file
エラーとなる。しかし通常(readがnil
)の場合には、ユーザーの入力が空のときread-from-minibuffer
はdefaultを無視して、空文字列""
をリターンする。この点において、この関数はこのチャプターの他のどのミニバッファー入力関数とも異なる。
keymapが非nil
の場合、そのキーマップはミニバッファー内で使用されるローカルキーマップとなる。keymapが省略、またはnil
の場合は、minibuffer-local-map
の値がキーマップとして使用される。キーマップの指定は、補完のようなさまざまなアプリケーションにたいしてミニバッファーをカスタマイズする、もっとも重要な方法である。
引数historyは、入力の保存やミニバッファー内で使用されるヒストリーコマンドが使用するヒストリーリスト変数を指定する。デフォルトはminibuffer-history
である。同様に、オプションでヒストリーリスト内の開始位置を指定できる。Minibuffer Historyを参照のこと。
変数minibuffer-allow-text-properties
が非nil
の場合には、リターンされる文字列にはミニバッファーでのすべてのテキストプロパティが含まれる。それ以外では、値がリターンされるときすべてのテキストプロパティが取り除かれる。
引数inherit-input-methodが非nil
の場合には、ミニバッファーにエンターする前にカレントだったバッファーが何であれ、カレントのインプットメソッド(Input Methodsを参照)、およびenable-multibyte-characters
のセッティング(Text Representationsを参照)が継承される。
ほとんどの場合、initialの使用は推奨されない。非nil
値の使用は、historyにたいするコンスセル指定と組み合わせる場合のみ推奨する。Initial Inputを参照のこと。
この関数はミニバッファーから文字列を読み取り、それをリターンする。引数prompt、initial、history、inherit-input-methodはread-from-minibuffer
で使用する場合と同様。使用されるキーマップはminibuffer-local-map
である。
オプション引数defaultはread-from-minibuffer
の場合と同様に使用されるが、ユーザーの入力が空の場合にリターンするデフォルト値も指定する。read-from-minibuffer
の場合と同様、値は文字列、文字列リスト、またはnil
(空文字列と等価)である。defaultが文字列のときは、その文字列がデフォルト値になる。文字列リストのときは、最初の文字列がデフォルト値になる。(これらの文字列はすべて“未来のミニバッファーヒストリー(future
minibuffer history)”としてユーザーが利用可能)。
この関数はread-from-minibuffer
を呼び出すことにより機能する。
(read-string prompt initial history default inherit) ≡ (let ((value (read-from-minibuffer prompt initial nil nil history default inherit))) (if (and (equal value "") default) (if (consp default) (car default) default) value))
この関数はミニバッファーから文字列として正規表現を読み取り、それをリターンする。ミニバッファーのプロンプト文字列promptが‘:’(とその後にオプションの空白文字)で終端されていない場合、この関数はデフォルトのリターン値(空文字列でない場合。以下参照)の前に‘: ’を付加する。
オプション引数defaultsは、入力が空の場合にリターンするデフォルト値を制御する。値は文字列、nil
(空文字列と等価)、文字列リスト、シンボルのうちのどれか。
defaultsがシンボルの場合、read-regexp
は変数read-regexp-defaults-function
(以下参照)の値を調べて非nil
のときは、defaultsよりそちらを優先的に使用する。この場合、値は以下のいずれか:
regexp-history-last
。これは適切なミニバッファーヒストリーリスト(以下参照)の最初の要素を使用することを意味する。
nil
、文字列、文字列リストのいずれか)がdefaultsの値となる。
これで、read-regexp
がdefaultsを処理した結果はリストに確定する(値がnil
または文字列の場合は1要素のリストに変換する)。このリストにたいし、read-regexp
は、以下のような入力として有用な候補をいくつか追加する:
これで関数は、ユーザー入力を取得するためにread-from-minibuffer
に渡す正規表現のリストを得た。リストの最初の要素は入力が空の場合のデフォルト値である。リストのすべての要素は“未来のミニバッファーヒストリーリスト(future
minibuffer history list)” (see future list in The GNU Emacs Manualを参照)としてユーザーが利用可能になる。
オプション引数historyが非nil
の場合、それは使用するミニバッファーヒストリーリストを指定するシンボルである(Minibuffer Historyを参照)。これが省略、またはnil
の場合、ヒストリーリストのデフォルトはregexp-history
となる。
関数read-regexp
は、デフォルトの正規表現リストを決定するために、この変数の値を使用するかもしれない。非nil
の場合、この変数は以下のいずれかである:
regexp-history-last
。
nil
、文字列、文字列リストのいずれかをリターンする引数なしの関数。
これらの変数の使い方についての詳細は、上述のread-regexp
を参照のこと。
この変数がnil
の場合、read-from-minibuffer
およびread-string
はミニバッファー入力をリターンする前に、すべてのテキストプロパティを取り除く。しかしread-no-blanks-input
(以下参照)、同様に補完つきでミニバッファー入力を行うread-minibuffer
およびそれに関連する関数(Reading Lisp Objects With the
Minibufferを参照)は、この変数の値に関わらず、無条件でテキストプロパティを破棄する。
これはミニバッファーからの読み取りにたいするデフォルトローカルキーマップである。デフォルトでは以下のバインディングをもつ:
exit-minibuffer
exit-minibuffer
abort-recursive-edit
next-history-element
previous-history-element
next-matching-history-element
previous-matching-history-element
この関数はミニバッファーから文字列を読み取るが、入力の一部として空白文字を認めず、かわりに空白文字は入力を終端させる。引数prompt、initial、inherit-input-methodはread-from-minibuffer
で使用するときと同様。
これは関数read-from-minibuffer
の簡略化されたインターフェイスであり、キーマップminibuffer-local-ns-map
の値をkeymap引数として、read-from-minibuffer
関数に渡す。キーマップminibuffer-local-ns-map
はC-qをリバインドしないので、クォートすることにより文字列内にスペースを挿入することが可能である。
minibuffer-allow-text-properties
の値に関わらず、この関数はテキストプロパティを破棄する。
(read-no-blanks-input prompt initial) ≡ (let (minibuffer-allow-text-properties) (read-from-minibuffer prompt initial minibuffer-local-ns-map))
このビルトイン変数は関数read-no-blanks-input
内でミニバッファーローカルキーマップとして使用されるキーマップである。デフォルトでは、minibuffer-local-map
のバインディングに加えて、以下のバインディングが有効になる:
exit-minibuffer
exit-minibuffer
self-insert-and-exit
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ミニバッファーでLispオブジェクトを読み取る関数を説明します。
この関数はミニバッファーを使用してLispオブジェクトをよみ、それを評価せずにリターンする。引数promptとinitialは、read-from-minibuffer
のときと同様に使用する。
これはread-from-minibuffer
関数にたいする簡略化されたインターフェイスである。
(read-minibuffer prompt initial) ≡ (let (minibuffer-allow-text-properties) (read-from-minibuffer prompt initial nil t))
以下の例では、初期入力として文字列"(testing)"
を与えている:
(read-minibuffer
"Enter an expression: " (format "%s" '(testing)))
;; 以下はミニバッファーでの表示::
---------- Buffer: Minibuffer ---------- Enter an expression: (testing)∗ ---------- Buffer: Minibuffer ----------
ユーザーはRETをタイプして初期入力をデフォルトとして利用したり、入力を編集することができる。
この関数はミニバッファーを使用してLisp式を読み取り、それを評価して結果をリターンする。引数promptとinitialの使い方は、read-from-minibuffer
と同様。
この関数は、read-minibuffer
の呼び出し結果を単に評価する:
(eval-minibuffer prompt initial) ≡ (eval (read-minibuffer prompt initial))
この関数はミニバッファーでLisp式を読み取り、それを評価して結果をリターンする。このコマンドとeval-minibuffer
の違いは、このコマンドでは初期値としてのformはオプションではなく、テキストの文字列ではないプリント表現に変換されたLispオブジェクトとして扱われることである。これはprin1
でプリントされるので、文字列の場合はテキスト初期値内にダブルクォート文字(‘"’)が含まれる。Output Functionsを参照のこと。
以下の例では、すでに有効なフォームであるようなテキスト初期値として式をユーザーに提案している:
(edit-and-eval-command "Please edit: " '(forward-word 1)) ;; 前の式を評価した後に、 ;; ミニバッファーに以下が表示される。:
---------- Buffer: Minibuffer ---------- Please edit: (forward-word 1)∗ ---------- Buffer: Minibuffer ----------
すぐにRET をタイプするとミニバッファーをexitして式を評価するので、1単語分ポイントは前進する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ミニバッファーヒストリーリスト(minibuffer history list)は以前のミニバッファー入力を記録するので、それらを手軽に再利用できます。ミニバッファーヒストリーリストは、(以前に入力された)文字列のリストで、もっとも最近の文字列が先頭になります。
多数のミニバッファーが個別に存在し、異なる入力の種類に使用されます。それぞれのミニバッファー使用にたいして正しいヒストリーリストを指定するのは、Lispプログラマーの役目です。
ミニバッファーヒストリーリストは、read-from-minibuffer
およびcompleting-read
のオプション引数historyに指定します。以下が利用できる値です:
ヒストリーリストとしてvariable(シンボル)を使用する。
ヒストリーリストとしてvariable(シンボル)を使用し、ヒストリー位置の初期値をstartpos(負の整数)とみなす。
startposに0を指定するのは、単にシンボルvariableだけを指定するのと等価である。previous-history-element
はミニバッファー内のヒストリーリストの最新の要素を表示するだろう。
正のstartposを指定した場合、ミニバッファーヒストリー関数は(elt variable(1-
startpos))
がミニバッファー内でカレントで表示されているヒストリー要素であるかのように振る舞う。
一貫性を保つため、ミニバッファー入力関数のinitial引数(Initial Inputを参照)使用して、ミニバッファーの初期内容となるヒストリー要素も指定すべきである。
historyを指定しない場合は、デフォルトのヒストリーリストminibuffer-history
が使用されます。他の標準的なヒストリーリストについては、以下を参照してください。最初に使用する前にnil
に初期化するだけで、独自のヒストリーリストを作成することもできます。
read-from-minibuffer
とcompleting-read
は、どちらも新たな要素を自動的にヒストリーリストに追加して、ユーザーがそのリストのアイテムを再使用するためのコマンドを提供します。ヒストリーリストを使用するためにプログラムが行う必要があるのは、リストの初期化と、使用するときに入力関数にリストの名前を渡すだけです。しかし、ミニバッファー入力関数がリストを使用していないときに、手動でリストを変更しても問題はありません。
新たな要素をヒストリーリストに追加するEmacs関数は、リストが長くなりすぎたときに古い要素の削除も行うことができます。変数history-length
は、ほとんどのヒストリーリストの最大長を指定する変数です。特定のヒストリーリストにたいして異なる最大長を指定するには、そのヒストリーリストシンボルのhistory-length
プロパティにその最大長をセットします。変数history-delete-duplicates
には、ヒストリー内の重複を削除するかどうかを指定します。
この関数はneweltが空文字列でなければ、それを新たな要素として変数history-varに格納されたヒストリーリストに追加して、更新されたヒストリーリストをリターンする。これはmaxeltまたはhistory-length
がが非nil
の場合は、リストの長さをその変数の値に制限する(以下参照)。maxeltに指定できる値の意味は、history-length
の値と同様。
add-to-history
は通常、history-delete-duplicates
が非nil
ならば、ヒストリーリスト内の重複メンバーを削除する。しかし、keep-allが非nil
の場合、それは重複を削除しないことを意味し、たとえneweltが空でもリストに追加する。
この変数の値がnil
の場合、ミニバッファーから読み取りを行う標準的な関数は、ヒストリーリストに新たな要素を追加しない。これにより、Lispプログラムがadd-to-history
を使用して明示的に入力ヒストリーを管理することになる。デフォルト値はt
。
この変数の値は、最大長を独自に指定しないすべてのヒストリーリストの最大長を指定する。値がt
の場合は、最大長がない(古い要素を削除しない)ことを意味する。ヒストリーリスト変数のシンボルのhistory-length
プロパティが非nil
の場合には、その特定のヒストリーリストにたいする最大長として、そのプロパティ値がこの変数をオーバーライドする。
この変数の値がt
の場合、それは新たなヒストリー要素の追加時に、以前からある等しい要素が削除されることを意味する。
以下は、標準的なミニバッファーヒストリーリスト変数です:
ミニバッファーヒストリー入力にたいするデフォルトのヒストリーリスト。
query-replace
の引数(および他のコマンドの同様の引数)にたいするヒストリーリスト。
ファイル名引数にたいするヒストリーリスト。
バッファー名引数にたいするヒストリーリスト。
正規表現引数にたいするヒストリーリスト。
拡張コマンド名引数にたいするヒストリーリスト。
シェルコマンド引数にたいするヒストリーリスト。
評価されるためのLisp式引数にたいするヒストリーリスト。
フェイス引数にたいするヒストリーリスト。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ミニバッファー入力にたいする関数のいくつかには、initialと呼ばれる引数があります。これは通常のように空の状態で開始されるのではなく、特定のテキストとともにミニバッファーが開始されることを指定しますが、ほとんどの場合において推奨されない機能です。
initialが文字列の場合、ミニバッファーはその文字列のテキストを含む状態で開始され、ユーザーがそのテキストの編集を開始するとき、ポイントはテキストの終端にあります。ユーザーがミニバッファーをexitするために単にRETをタイプした場合には、この入力文字列の初期値をリターン値だと判断します。
initialにたいして非nil
値の使用には反対します。なぜなら初期入力は強要的なインターフェイスだからです。ユーザーにたいして有用なデフォルト入力を提案するためには、ヒストリーリストやデフォルト値の提供のほうが、より便利です。
しかしinitial引数にたいして文字列を指定すべき状況が1つだけあります。それは、history引数にコンスセルを指定したときです。Minibuffer Historyを参照してください。
initialは(string
.
position)
という形式をとることもできます。これはstringをミニバッファーに挿入するが、その文字列のテキスト中のpositionにポイントを配するという意味です。
歴史的な経緯により、positionは異なる関数において実装が統一されていません。completing-read
ではpositionの値は0基準です。つまり、値0は文字列の先頭で、1は最初の文字の次、...を意味します。しかしread-minibuffer
、およびこの引数をサポートする補完を行わない他のミニバッファー入力関数では、1は文字列の先頭、2は最初の文字の次、...を意味します。
initialの値としてのコンスセルの使用は、推奨されません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
補完(complete,
ompletion)は省略された形式から始まる名前の残りを充填する機能です。補完はユーザー入力と有効な名前リストを比較して、ユーザーが何をタイプしたかで名前をどの程度一意に判定できるか判断することにより機能します。たとえばC-x
b(switch-to-buffer
)とタイプしてから、スイッチしたいバッファー名の最初の数文字をタイプして、その後にTAB(minibuffer-complete
)をタイプすると、Emacsはその名前を可能な限り展開します。
標準的なEmacsコマンドはシンボル、ファイル、バッファー、プロセスの名前にたいして補完を提案します。このセクションの関数により、他の種類の名前にたいしても補完を実装できます。
try-completion
関数は補完にたいする基本的なプリミティブです。これは初期文字列にたいして文字列セットをマッチして、最長と判定された補完をリターンします。
関数completing-read
は、補完にたいする高レベルなインターフェイスを提供します。completing-read
の呼び出しにより、有効な名前リストの判定方法が指定されます。その後にこの関数は補完にたいして有用ないくつかのコマンドにキーバインドするローカルキーマップとともに、ミニバッファーをアクティブ化します。その他の関数は、特定の種類の名前を補完つきで読み取る、簡便なインターフェイスを提供します。
19.6.1 Basic Completion Functions | 文字列を補完する低レベル関数。 | |
19.6.2 Completion and the Minibuffer | 補完つきでミニバッファーを呼び出す。 | |
19.6.3 Minibuffer Commands that Do Completion | 補完を行うミニバッファーコマンド。 | |
19.6.4 High-Level Completion Functions | 特別なケースに有用な補完(バッファー名や変数名などの読み取り)。 | |
19.6.5 Reading File Names | ファイル名やシェルコマンドの読み取りに補完を使用する。 | |
19.6.6 Completion Variables | 補完の挙動を制御する変数。 | |
19.6.7 Programmed Completion | 独自の補完関数を記述する。 | |
19.6.8 Completion in Ordinary Buffers | 通常バッファー内でのテキスト補完。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の補完関数は、その関数自身ではミニバッファーでなにも行いません。ここでは、ミニバッファーを使用する高レベルの補完機能と並べて、これらの関数について説明します。
この関数はcollection内のstringに利用可能なすべての補完の、共通する最長部分文字列をリターンする。
collectionは補完テーブル(completion table)と呼ばれる。値は文字列リスト、コンスセル、obarray、ハッシュテーブル、または補完関数でなければならない。
try-completion
は補完テーブルにより指定された許容できる補完それぞれにたいして、stringと比較を行う。許容できる補完マッチが存在しない場合は、nil
をリターンする。マッチする補完が1つだけで、それが完全一致ならばt
をリターンする。それ以外は、すべてのマッチ可能な補完に共通する最長の初期シーケンス(longest
initial sequence)をリターンする。
collectionがリストの場合、許容できる補完(permissible
completions)はそのリストの要素により指定される。リストの要素は文字列、またはCARが文字列または(symbol-name
により文字列に変換される)シンボルであるようなコンスセルである。リストに他の型の要素が含まれる場合は無視される。
collectionがobarray(Creating and Interning Symbolsを参照)の場合、そのobarray内のすべてのシンボル名が許容できる補完セットを形成する。
collectionがハッシュテーブルの場合には、文字列のキーが利用可能な補完(possible completions)になる。他のキーは無視される。
collectionとして関数を使用することもできる。この場合、この関数だけが補完を処理する役目を担う。つまりtry-completion
は、この関数が何をリターンしようとも、それをリターンする。この関数はstring、predicate、nil
の3つの引数で呼び出される(3つ目の引数は同じ関数をall-completions
でも使用して、どちらの場合でも適切なことを行うためである)。Programmed Completionを参照のこと。
引数predicateが非nil
の場合、collectionがハッシュテーブルなら1引数、それ以外は2引数の関数でなければならない。これは利用可能なマッチのテストに使用され、マッチはpredicateが非nil
をリターンしたときだけ受け入れられる。predicateに与えられる引数は文字列、alistのコンスセル(CARが文字列)、またはobarrayのシンボル(シンボル名ではない)のうちのどれか。collectionがハッシュテーブルの場合、predicateは文字列キー(string
key)と関連値(associated value)の2引数で呼び出される。
加えて使いやすいように、補完はcompletion-regexp-list
内のすべての正規表現にもマッチしなければならない。(collectionが関数の場合は、その関数自身がcompletion-regexp-list
を処理する必要がある。)
以下の例の1つ目では、文字列‘foo’がalistのうち3つのCARとマッチされている。すべてのマッチは文字‘fooba’で始まるので、それが結果となる。2つ目の例では、可能なマッチは1つだけで、しかも完全一致なのでリターン値はt
になる。
(try-completion "foo" '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))) ⇒ "fooba"
(try-completion "foo" '(("barfoo" 2) ("foo" 3))) ⇒ t
以下の例では、文字‘forw’で始まるシンボルが多数あり、それらはすべて単語‘forward’で始まる。ほとんどのシンボルはその後に‘-’が続くが、すべてではないので‘forward’までしか補完できない。
(try-completion "forw" obarray) ⇒ "forward"
最後に、以下の例では述語test
に渡される利用可能なマッチは3つのうち2つだけである(文字列‘foobaz’は短すぎる)。これらは両方とも文字列‘foobar’で始まる。
(defun test (s) (> (length (car s)) 6)) ⇒ test
(try-completion "foo" '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) 'test) ⇒ "foobar"
この関数は、stringの利用可能な補完すべてのリストをリターンする。この関数の引数はtry-completion
の引数と同じであり、try-completion
が行うのと同じ方法でcompletion-regexp-list
を使用する。
collectionか関数の場合はstring、predicate、t
の3つの引数で呼び出される。この場合、その関数がリターンするのが何であれ、all-completions
はそれをリターンする。Programmed Completionを参照のこと。
以下の例は、try-completion
の例の関数test
を使用している。
(defun test (s) (> (length (car s)) 6)) ⇒ test
(all-completions "foo" '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) 'test) ⇒ ("foobar1" "foobar2")
この関数は、stringがcollectionおよびpredicateで指定された有効な補完候補の場合は、nil
をリターンする。引数はtry-completion
の引数と同じ。たとえば、collectionが文字列リストの場合は、stringがリスト内に存在し、かつpredicateを満足すればtrueとなる。
この関数はtry-completion
が行うのと同じ方法で、completion-regexp-list
を使用する。
predicateが非nil
で、collectionが同じ文字列を複数含む場合には、completion-ignore-case
にしたがってcompare-strings
で判定して、それらすべてをリターンするか、もしくは何もリターンしない。それ以外では、test-completion
のリターン値は基本的に予測不可能である。
collectionが関数の場合はstring、predicate、lambda
の3つの引数で呼び出される。それが何をリターンするにせよ、test-completion
はそれをリターンする。
この関数はポイントの前のテキストがstring、ポイントの後がsuffixと仮定して、collectionが扱うフィールドの境界(boundary)をリターンする。
補完は通常、文字列(string)全体に作用するので、すべての普通のコレクション(collection)にたいして、この関数は常に(0
. (length
suffix))
をリターンするだろう。しかしファイルにたいする補完などのより複雑な補完は、1回に1フィールド行われる。たとえば、たとえ"/usr/share/doc"
が存在しても、"/usr/sh"
の補完に"/usr/share/"
は含まれるが、"/usr/share/doc"
は含まれないだろう。また、"/usr/sh"
にたいするall-completions
に"/usr/share/"
は含まれず、"share/"
だけが含まれるだろう。stringが"/usr/sh"
、suffixが"e/doc"
の場合、completion-boundaries
は(5
.
1)
をリターンするだろう。これは、collectionが"/usr/"
の後ろにあり"/doc"
の前にある領域に関する補完情報だけをリターンするであろうことを告げている。
補完alistを変数に格納した場合は、変数のrisky-local-variable
プロパティに非nil
をセットして、その変数が“risky(危険)”だとマークすべきである。File Local Variablesを参照のこと。
この変数の値が非nil
の場合、補完での大文字小文字の違いは意味をもたない。read-file-name
では、この変数はread-file-name-completion-ignore-case
(Reading File Namesを参照)にオーバーライドされる。read-buffer
では、この変数はread-buffer-completion-ignore-case
(High-Level Completion Functionsを参照)にオーバーライドされる。
これは正規表現のリストである。補完関数はこのリスト内のすべての正規表現にマッチした場合のみ許容できる補完と判断する。case-fold-search
(Searching and Caseを参照)ではcompletion-ignore-case
の値にバインドされる。
この変数は変数varを補完のためのcollectionとしてlazy(lazy: 力のない、だらけさせる、のろのろした、怠惰な、不精な、眠気を誘う)な方法で初期化する。ここでlazyとは、collection内の実際のコンテンツを必要になるまで計算しないという意味。このマクロはvarに格納する値の生成に使用する。varを使用して最初に補完を行ったとき、真の値が実際に計算される。これは引数なしでfunを呼び出すことにより行われる。funがリターンする値は、varの永続的な値となる。
以下は例である:
(defvar foo (lazy-completion-table foo make-my-alist))
既存の補完テーブルを受け取り変更したバージョンをリターンする関数が、いくつかあります。completion-table-case-fold
は大文字小文字を区別しない、case-insensitiveなテーブルをリターンします。completion-table-in-turn
とcompletion-table-merge
は、複数の入力テーブルを、異なる方法で組み合わせます。completion-table-subvert
はテーブルを異なる初期プレフィックス(initial
prefix)で変更します。completion-table-with-quoting
はクォートされたテキストの処理に適したテーブルをリターンします。completion-table-with-predicate
は述語関数(predicate
function)によりフィルターします。completion-table-with-terminator
は終端文字列(terminating
string)を追加します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、補完つきでミニバッファーから読み取るための、基本的なインターフェイスを説明します。
この関数は、補完の提供によりユーザーを支援して、ミニバッファーから文字列を読み取る。prompt(文字列でなければならない)のプロンプトとともに、ミニバッファーをアクティブ化する。
実際の補完は、補完テーブルcollectionと補完述語predicateを関数try-completion
(Basic Completion Functionsを参照)に渡すことにより行われる。これは補完の使用されるローカルキーマップに特定のコマンドをバインドしたとき発生する。これらのコマンドのいくつかは、test-completion
も呼び出す。したがって、predicateが非nil
の場合は、collectionとcompletion-ignore-case
が矛盾しないようにすべきである。Definition of test-completionを参照のこと。
オプション引数require-matchの値は、ユーザーがミニバッファーをexitする方法を決定する。
nil
の場合、通常のミニバッファーexitコマンドは、ミニバッファーの入力と無関係に機能する。
t
の場合は、入力がcollectionの要素に補完されるまで、通常のミニバッファーexitコマンドは機能しない。
confirm
の場合、どのような入力でもユーザーはexitできるが、入力がconfirm
の要素に補完されていなければ、確認を求められる。
confirm-after-completion
の場合、どのような入力でもユーザーはexitできるが、前のコマンドが補完コマンド(たとえばminibuffer-confirm-exit-commands
の中のコマンドの1つの場合)で、入力の結果がcollectionの要素でない場合は、確認を求められる。Minibuffer Commands that Do Completionを参照のこと。
t
と同じふぁが、exitコマンドは補完処理中はexitしない。
しかし、require-matchの値に関わらず、空の入力は常に許される。この場合、completing-read
はdefaultがリストなら最初の要素、defaultがnil
なら""
、またはdefaultをリターンする。文字列およびdefault内の文字列は、ヒストリーコマンドを通じてユーザーが利用できる。
関数completing-read
はrequire-matchがnil
の場合はキーマップとしてminibuffer-local-completion-map
を、require-matchが非nil
の場合はminibuffer-local-must-match-map
を使用する。Minibuffer Commands that Do Completionを参照のこと。
引数historyは入力の保存とミニバッファーヒストリーコマンドに、どのヒストリーリスト変数を使用するか指定する。デフォルトはminibuffer-history
。Minibuffer Historyを参照のこと。
initialは、ほとんどの場合推奨されない。historyにたいするコンスセル指定と組み合わせた場合のみ、非nil
値の使用を推奨する。Initial Inputを参照のこと。デフォルト入力にたいしては、かわりにdefaultを使用する。
引数inherit-input-methodが非nil
の場合には、ミニバッファーにエンターする前にカレントだったバッファーが何であれ、カレントのインプットメソッド(Input Methodsを参照)、およびenable-multibyte-characters
のセッティング(Text Representationsを参照)が継承される。
変数completion-ignore-case
が非nil
の場合、利用可能なマッチにたいして入力を比較するときの補完は、大文字小文字を区別しない。Basic Completion Functionsを参照のこと。このモードでの操作では、predicateも大文字小文字を区別してはならない(さもないと驚くべき結果となるであろう)。
以下はcompleting-read
を使用した例である:
(completing-read "Complete a foo: " '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) nil t "fo")
;; 前の式を評価後に、 ;; ミニバッファーに以下が表示される。: ---------- Buffer: Minibuffer ---------- Complete a foo: fo∗ ---------- Buffer: Minibuffer ----------
その後ユーザーがDEL DEL b
RETをタイプすると、completing-read
はbarfoo
をリターンする。
completing-read
関数は、実際に補完を行うコマンドの情報を渡すために、変数をバインドする。これらの変数は、以降のセクションで説明する。
この変数の値は関数でなければならず、補完つきの読み取りを実際に行うためにcompleting-read
から呼び出される。この関数はcompleting-read
と同じ引数を受け入れる。他の関数のバインドして、通常のcompleting-read
の振る舞いを完全にオーバーライドすることができる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、補完のためにミニバッファーで使用されるキーマップ、コマンド、ユーザーオプションを説明します。
この変数の値は、ミニバッファー内の補完に使用される補完テーブルである。これはcompleting-read
がtry-completion
に渡す補完テーブルを含むグローバル変数である。minibuffer-complete-word
のような、ミニバッファー補完コマンドにより使用される。
この変数の値はcompleting-read
がtry-completion
に渡す述語(predicate)である。この変数は、他のミニバッファー補完関数でも使用される。
この変数はミニバッファーをexitする前に、Emacsが確認を求めるかどうかを決定する。completing-read
はこの変数をバインドして、exitする前に関数minibuffer-complete-and-exit
がこの値をチェックする。値がnil
の場合は、確認は求められない。値がconfirm
の場合、入力が有効な補完候補でなくてもユーザーはexitするかもしれないが、Emacsは確認を求めない。値がconfirm-after-completion
の場合、入力が有効な補完候補でなくてもユーザーはexitするかもしれないが、ユーザーがminibuffer-confirm-exit-commands
内の任意の補完コマンドの直後に入力を確定した場合、Emacsは確認を求める。
この変数には、completing-read
の引数require-matchがconfirm-after-completion
の場合は、ミニバッファーをexitする前にEmacsが確認を求めるようにさせるコマンドのリストが保持されている。このリストないのコマンドを呼び出した直後にユーザーがミニバッファーのexitを試みると、Emacsは確認を求める。
この関数は、ただ1つの単語からミニバッファーを補完する。たとえミニバッファーのコンテンツが1つの補完しかもたない場合でも、minibuffer-complete-word
はその単語に属さない最初の文字を超えた追加はしない。Syntax Tablesを参照のこと。
この関数は、可能な限りミニバッファーのコンテンツを補完する。
この関数はミニバッファーのコンテンツを補完して、確認が要求されない場合(たとえばminibuffer-completion-confirm
がnil
のとき)はexitする。確認が要求される場合には、このコマンドを即座に繰り返すことにより確認が行われないようにする。このコマンドは2回連続で実行された場合は確認なしで機能するようにプログラムされている。
この関数は、カレントのミニバッファーのコンテンツで利用可能な補完のリストを作成する。これはall-completions
の引数collectionに変数minibuffer-completion-table
の値を、引数predicateにminibuffer-completion-predicate
の値を使用して呼び出すことにより機能する。補完リストは、*Completions*と呼ばれるバッファーのテキストとして表示される。
この関数はstandard-output
内のストリーム(通常はバッファー)にcompletionsを表示する(ストリームについての詳細は、Reading and Printing Lisp Objectsを参照)。引数completionsは通常、all-completions
がリターンする補完リストそのものだが、それである必要はない。要素はシンボルか文字列で、どちらも単にプリントされる。文字列2つのリストでもよく、2つの文字列が結合されたかのようにプリントされる。この場合、1つ目の文字列は実際の補完で、2つ目の文字列は注釈の役目を負う。
この関数はminibuffer-completion-help
により呼び出される。一般的には、以下のようにwith-output-to-temp-buffer
とともに使用される。
(with-output-to-temp-buffer "*Completions*" (display-completion-list (all-completions (buffer-string) my-alist)))
この変数が非nil
の場合には、次の文字が一意でないために決定できず補完が完了しないときは常に、補完コマンドは利用可能な補完リストを自動的に表示する。
completing-read
の値は、補完の1つが完全に一致することを要求されないときにローカルキーマップとして使用される。デフォルトでは、このキーマップは以下のバインディングを作成する:
minibuffer-completion-help
minibuffer-complete-word
minibuffer-complete
親キーマップとしてminibuffer-local-map
を使用する(Definition of
minibuffer-local-mapを参照)。
completing-read
は、補完の1つの完全な一致が要求されないときのローカルキーマップとして、この値を使用する。したがってexit-minibuffer
にキーがバインドされていなければ、無条件にミニバッファーをexitする。デフォルトでは、このキーマップは以下のバインディングを作成する:
minibuffer-complete-and-exit
minibuffer-complete-and-exit
親キーマップはminibuffer-local-completion-map
を使用する。
これは単にSPCを非バインドするsparseキーマップ(sparse:
疎、希薄、まばら)を作成する。これはファイル名にスペースを含めることができるからである。関数read-file-name
は、このキーマップとminibuffer-local-completion-map
かminibuffer-local-must-match-map
のいずれかを組み合わせる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、特定の種類の名前を補完つきで読み取る便利な高レベル関数を説明します。
ほとんどの場合、Lisp関数の中盤でこれらの関数を呼び出すべきではありません。可能なときは、interactive
指定の内部で呼び出し、ミニバッファーのすべての入力をコマンドの引数読み取りの一部にします。Defining Commandsを参照してください。
この関数はバッファーの名前を読み取り、それを文字列でリターンする。引数defaultは、ミニバッファーが空の状態でユーザーがexitした場合にリターンされるデフォルト名として使用される。非nil
の場合は文字列、文字列リスト、またはバッファーを指定する。リストの場合は、リストの先頭の要素がデフォルト値になる。デフォルト値はプロンプトに示されるが、初期入力としてミニバッファーには挿入されない。
引数promptは、コロンかスペースで終わる文字列である。defaultが非nil
の場合、この関数はデフォルト値つきでミニバッファーから読み取る際の慣習にしたがい、コロンの前のpromptの中にこれを挿入する。
オプション引数require-matchは、completing-read
のときと同じ。Completion and the Minibufferを参照のこと。
以下の例で、ユーザーが‘minibuffer.t’とエンターしてから、RETをタイプする。引数require-matchはt
であり、与えられた入力で始まるバッファー名は‘minibuffer.texi’だけなので、その名前が値となる。
(read-buffer "Buffer name: " "foo" t)
;; 前の式を評価した後、 ;; 空のミニバッファーに ;; 以下のプロンプトが表示される:
---------- Buffer: Minibuffer ---------- Buffer name (default foo): ∗ ---------- Buffer: Minibuffer ----------
;; ユーザーがminibuffer.t RETとタイプする。
⇒ "minibuffer.texi"
この変数が非nil
の場合は、バッファー名を読み取る関数である。read-buffer
は通常行うことを行うかわりに、read-buffer
と同じ引数でその関数を呼び出す。
この変数が非non-nil
の場合は、補完の処理においてread-buffer
は大文字小文字を無視する。
この関数はコマンドの名前を読み取り、Lispシンボルとしてそれをリターンする。引数promptは、read-from-minibuffer
で使用される場合と同じ。それが何であれcommandp
がt
をリターンすればコマンドであり、コマンド名とはcommandp
がt
をリターンするシンボルだということを思い出してほしい。Interactive Callを参照のこと。
引数defaultは、ユーザーがnull入力をエンターした場合に何をリターンするか指定する。シンボル、文字列、文字列リストを指定できる。文字列の場合、read-command
はリターンする前にそれをinternする。リストの場合、read-command
はリストの最初の要素をinternする。defaultがnil
の場合は、デフォルトが指定されなかったことを意味する。その場合もしユーザーがnull入力をエンターすると、リターン値は(intern
"")
、つまり名前が空文字列のシンボルとなる。
(read-command "Command name? ")
;; 前の式を評価した後に、 ;; 空のミニバッファーに以下のプロンプトが表示される:
---------- Buffer: Minibuffer ---------- Command name? ---------- Buffer: Minibuffer ----------
ユーザーがforward-c RETとタイプした場合、この関数はforward-char
をリターンする。
read-command
関数は、completing-read
の簡略化されたインターフェイスである。実在するLisp変数のセットを補完するために変数obarray
を、コマンド名だけを受け入れるために述語commandp
を使用する。
(read-command prompt) ≡ (intern (completing-read prompt obarray 'commandp t nil))
この変数はカスタマイズ可能な変数の名前を読み取り、それをシンボルとしてリターンする。引数の形式はread-command
の引数と同じ。この関数は、commandp
のかわりにcustom-variable-p
を述語に使用する点を除き、read-command
と同様に振る舞う。
この関数はカラー指定(カラー名、または#RRRGGGBBB
のような形式のRGB16進値)の文字列を読み取る。これはプロンプトにprompt(デフォルトは"Color
(name or #RGB
triplet):"
)を表示して、カラー名にたいする補完を提供する(16進RGB値は補完しない)。標準的なカラー名に加えて、補完候補にはポイント位置のフォアグラウンドカラーとバックグラウンドカラーが含まれる。
Valid RGB values are described in Color Names.
この関数のリターン値は、ミニバッファー内でユーザーがタイプした文字列である。しかし、インタラクティブに呼び出されたとき、またはオプション引数convertが非nil
の場合は、入力されたカラー名のかわりに、それに対応するRGB値文字列をリターンする。この関数は、入力に有効なカラー指定を求める。allow-emptyが非nil
でユーザーがnull入力をエンターした場合は、空のカラー名が許される。
インタラクティブに呼び出されたとき、またはdisplayが非nil
の場合には、エコーエリアにもリターン値が表示される。
User-Chosen Coding Systemsの関数read-coding-system
とread-non-nil-coding-system
、およびInput Methodsのread-input-method-name
も参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
高レベル補完関数read-file-name
、read-directory-name
、read-shell-command
はそれぞれ、ファイル名、ディレクトリー名、シェルコマンドを読み取るようデザインされています。これらはデフォルトディレクトリーの自動挿入を含む特別な機能を提供します。
この関数はプロンプトpromptとともに補完つきでファイル名を読み取る。
例外として以下のすべてが真ならば、この関数はミニバッファーのかわりにグラフィカルなファイルダイアログを使用してファイル名を読み取る:
use-dialog-box
が非nil
の場合。Dialog Boxes in The GNU Emacs Manualを参照のこと。
グラフィカルなファイルダイアログを使用したときの正確な振る舞いは、プラットホームに依存する。ここでは単にミニバッファーを使用したときの振る舞いを記す。
read-file-name
はリターンするファイル名を自動的に展開しない。絶対ファイル名が必要ならば、自分でexpand-file-name
を呼び出さなければならない。
オプション引数require-matchは、completing-read
のときと同じ。Completion and the Minibufferを参照のこと。
引数directoryは、相対ファイル名の補完に使用するディレクトリーを指定する。値は絶対ディレクトリー名。変数insert-default-directory
が非nil
の場合は、初期入力としてミニバッファーにdirectoryも挿入される。デフォルトはカレントバッファーのdefault-directory
の値。
initialを指定した場合、それはミニバッファーに挿入する初期ファイル名になる(directoryが挿入された場合はその後に挿入される)。この場合、ポイントはinitialの先頭に配される。initialのデフォルト値はnil
(ファイル名を挿入しない)。initialが何を行うか確認するには、ファイルをvisitしているバッファーでC-x
C-vを試すとよい。注意: ほとんどの場合、initialよりもdefaultの使用を推奨する。
defaultが非nil
の場合、ユーザーが最初にread-file-name
が挿入したものと同じ、空以外のコンテンツを残してミニバッファーをexitすると、この関数はdefaultをリターンする。insert-default-directory
が非nil
の場合はそれがデフォルトとなるので、ミニバッファーの初期コンテンツは常に空以外になる。require-matchの値に関わらず、defaultの有効性はチェックされない。とはいえrequire-matchが非nil
の場合、ミニバッファーの初期コンテンツは有効なファイル名(またはディレクトリー名)であるべきだろう。それが有効でない場合、ユーザーがそれを編集せずにexitするとread-file-name
は補完を試み、defaultはリターンされない。defaultはヒストリーコマンドからも利用できる。
defaultがnil
の場合、read-file-name
はその場所に代用するデフォルトを探そうと試みる。この代用デフォルトは、明示的にdefaultにそれが指定されたかのように、defaultとまったく同じ方法で扱われる。defaultがnil
でもinitialが非nil
の場合、デフォルトはdirectoryとinitialから得られる絶対ファイル名になる。defaultとinitialの両方がnil
で、そのバッファーがファイルをvisitしているバッファーの場合、read-file-name
はそのファイルの絶対ファイル名をデフォルトとして使用する。バッファーがファイルをvisitしていなければ、デフォルトは存在しない。この場合、ユーザーが編集せずにRETをタイプすると、read-file-name
は前にミニバッファーに挿入されたコンテンツを単にリターンする。
空のミニバッファー内でユーザーがRETをタイプした場合、この関数はrequire-matchの値に関わらず、空の文字列をリターンする。たとえばユーザーがM-x set-visited-file-nameを使用して、カレントバッファーをファイルをvisitしていないことにするのに、この方法を使用している。
predicateが非nil
の場合、それは補完候補として許容できるファイル名を決定する、1引数の関数である。predicateが関数名にたいして非nil
をリターンすれば、それはファイル名として許容できる値である。
以下はread-file-name
を使用した例である:
(read-file-name "The file is ") ;; 前の式を評価した後に、 ;; ミニバッファーに以下が表示される。:
---------- Buffer: Minibuffer ---------- The file is /gp/gnu/elisp/∗ ---------- Buffer: Minibuffer ----------
manual TABをタイプすると以下がリターンされる:
---------- Buffer: Minibuffer ---------- The file is /gp/gnu/elisp/manual.texi∗ ---------- Buffer: Minibuffer ----------
ここでユーザーがRETをタイプすると、read-file-name
は文字列"/gp/gnu/elisp/manual.texi"
をファイル名としてリターンする。
非nil
の場合は、read-file-name
と同じ引数を受け取る関数である。read-file-name
が呼び出されたとき、read-file-name
は通常の処理を行なうかわりに、与えられた引数でこの関数を呼び出す。
この変数が非nil
の場合、read-file-name
は補完を行なう際に大文字小文字を無視する。
この関数はread-file-name
と似ているが、補完候補としてディレクトリーだけを許す。
defaultがnil
でinitialが非nil
の場合、read-directory-name
はdirectory(directoryがnil
ならカレントバッファーのデフォルトディレクトリー)とinitialを組み合わせて代替えのデフォルトを構築する。defaultとinitialの両方がnil
の場合、この関数はdirectory、directoryもnil
の場合はカレントバッファーのデフォルトディレクトリーを代替えのデフォルトとして使用する。
この変数はread-file-name
により使用されるため、ファイル名を読み取るほとんどのコマンドにより、間接的に使用される。(これらのコマンドにはコマンドのインタラクティブフォームに‘f’や‘F’のコードレター(code
letter))をふくむすべてのコマンドが含まれる。Code Characters for
interactiveを参照のこと。)この変数の値は、(もしあれば)デフォルトディレクトリー名をミニバッファー内に配してread-file-name
を開始するかどうかを制御する。変数の値がnil
の場合、read-file-name
はミニバッファーに初期入力を何も配さない(ただしinitial引数で初期入力を指定しない場合)。この場合、依然としてデフォルトディレクトリーが相対ファイル名の補完に使用されるが、表示はされない。
この変数がnil
でミニバッファーの初期コンテンツが空の場合、ユーザーはデフォルト値にアクセスするために次のヒストリー要素を明示的にフェッチする必要があるだろう。この変数が非nil
ならミニバッファーの初期コンテンツは常に空以外となり、ミニバッファーで編集をおこなわず即座にRETをタイプすることにより、常にデフォルト値を要求できる(上記参照)。
たとえば:
;; デフォルトディレクトリーとともにミニバッファーが開始。
(let ((insert-default-directory t))
(read-file-name "The file is "))
---------- Buffer: Minibuffer ---------- The file is ~lewis/manual/∗ ---------- Buffer: Minibuffer ----------
;; ミニバッファーはプロンプトだけで空。 ;; appears on its line. (let ((insert-default-directory nil)) (read-file-name "The file is "))
---------- Buffer: Minibuffer ---------- The file is ∗ ---------- Buffer: Minibuffer ----------
この関数は、プロンプトpromptと優れた補完を提供して、ミニバッファーからのシェルコマンドを読み取る。これはコマンド名にたいして適切な候補を使用してコマンドの最初の単語を補完する。コマンドの残りの単語はファイル名として補完する。
この関数はミニバッファー入力にたいするキーマップとしてminibuffer-local-shell-command-map
を使用する。history引数は使用するヒストリーリストを指定する。省略、またはnil
の場合のデフォルトはshell-command-history
(shell-command-historyを参照)。オプション引数initialはミニバッファーの初期コンテンツを指定する(Initial Inputを参照)。もしあれば、残りのargsはread-from-minibuffer
内のdefaultおよびinherit-input-methodとして使用される(Reading Text Strings with the Minibufferを参照)。
このキーマップはread-shell-command
により、コマンドおよびシェルコマンドの一部となるファイル名の補完のために使用される。これは親キーマップとしてminibuffer-local-map
を使用し、TABをcompletion-at-point
にバインドする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
補完のデフォルト動作を変更するために使用される変数がいくつかあります。
この変数の値は、補完を行うために使用される補完スタイル(シンボル)である。補完スタイル(completion
style)とは、補完を生成するためのルールセットのこと。このリストにあるシンボルはそれぞれ、completion-styles-alist
内に対応するエントリーをもたなければならない。
この変数には補完スタイルのリストが格納される。リスト内の各要素は以下の形式をもつ
(style try-completion all-completions doc)
ここでstyleは補完スタイルの名前(シンボル)であり、そのスタイルを参照するために変数completion-styles
内で使用されるかもしれない。try-completionは補完を行なう関数で、all-completions補完をリストする関数、doc補完スタイルを説明する文字列である。
関数try-completionおよびall-completionsはstring、collection、predicate、pointの4つの引数をとる。引数string、collection、predicateの意味はtry-completion
(Basic Completion Functionsを参照)のときと同様。引数pointはstring内のポイント位置。各関数は自身の処理を行った場合は非nil
を、行わなかった場合(たとえば補完スタイルに一致するようにstringを行う方法がない場合)はnil
をリターンする。
ユーザーがminibuffer-complete
(Minibuffer Commands that Do Completionを参照)のような補完コマンドを呼び出すと、Emacsはcompletion-styles
に最初にリストされたスタイルを探して、そのスタイルのtry-completion関数を呼び出す。この関数がnil
をリターンした場合、Emacsは次にリストされた補完スタイルに移動してそのスタイルのtry-completion関数を呼び出すといったように、try-completion関数の1つが補完の処理に成功して非nil
値をリターンするまで順次これを行なう。同様の手順はall-completions関数を通じて、補完のリストにも行われる。
利用できる補完スタイルについてはCompletion Styles in The GNU Emacs Manualを参照のこと。
この変数は特別な補完スタイルと、特定の種類のテキスト補完時に使用するその他の補完動作を指定する。この変数の値は(category
.
alist)
という形式の要素をもつalistである。categoryは何が補完されるかを記述するシンボルで、現在のところカテゴリーにbuffer
、file
、unicode-name
が定義されているが、これに特化した補完関数(Programmed Completionを参照)を通じて他のカテゴリーを定義できる。alistは、そのカテゴリーにたいして補完がどのように振る舞うべきかを記述する連想リスト。以下のalistのキーがサポートされる:
styles
値は補完スタイル(シンボル)のリスト。
cycle
値はそのカテゴリーにたいするcompletion-cycle-threshold
(Completion Options in The GNU Emacs Manualを参照)の値。
将来、さらにalistエントリーが定義されるかもしれない。
この変数はカレント補完コマンドの特別なプロパティの指定に使用される。この変数は補完に特化したコマンドによりletバインドされることを意図している。値はプロパティ/値ペアーのリスト。以下のプロパティがサポートされる:
:annotation-function
値は補完バッファー内に注釈(annotation)を加える関数。この関数は引数completionを1つ受け取りnil
、または補完の隣に表示する文字列をリターンしなければならない。
:exit-function
値は補完を行った後に実行する関数。この関数は2つの引数stringとstatusを受け取る。stringは補完されたフィールドのテキストで、statusは行われた操作の種類を示す。操作の種類は、テキストの補完が完了したならfinished
、それ以上補完できないが補完が完了していなければsole
、有効な補完だがさらに補完できるときはexact
となる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
意図した利用可能な補完のすべてを含むalistまたはobarrayを前もって作成するのが不可能または不便なことがあります。このような場合は、与えられた文字列にたいする補完を計算する独自の関数を提供できます。これはプログラム補完(programmed completion)と呼ばれます。Emacsは数あるケースの中でも特に、ファイル名の補完(File Name Completionを参照)でプログラム補完を使用しています。
この機能を使用するためには、関数をcompleting-read
のcollection引数に渡します。関数completing-read
はその補完関数がtry-completion
、all-completions
などの基本的な補完関数に渡されて、その関数がすべてを行えるよう取り計らいます。
補完関数は3つの引数を受け取ります:
nil
。関数は利用可能なマッチにたいしてこの述語(predicate)を呼び出し、述語がnil
をリターンした場合はそのマッチを無視する。
nil
try-completion
を指定する。関数は指定された文字が一意かつ完全一致の場合は、t
をリターンする。マッチが複数の場合、すべてのマッチに共通する部分文字列をリターンする(文字列が補完候補の1つに完全一致するが、より長い他の候補にもマッチする場合、リターン値はその文字列)。マッチがなければnil
をリターンする。
t
all-completions
を指定する。関数は指定された文字列の利用可能なすべての補完のリストをリターンする。
lambda
test-completion
を指定する。関数は指定された文字列がいくつかの補完候補に完全一致する場合はt
、それ以外はnil
をリターンする。
(boundaries . suffix)
completion-boundaries
を指定する。関数は(boundaries start
.
end)
をリターンする。ここでstartは指定された文字列内の境界の開始位置、endはsuffix内の境界の終了位置。
metadata
カレント補完の状態に関する情報の要求を指定する。リターン値は(metadata
. alist)
の形式をもち、alistは以下で説明する要素をもつ連想配列。
フラグに他の値が指定された場合、補完関数はnil
をリターンする。
以下はmetadata
フラグ引数への応答として補完関数がリターンするかもしれない、metadataエントリーのリストです:
category
値は補完関数が補完を試みているテキストの種類を説明するシンボル。シンボルがcompletion-category-overrides
内のキーの1つにマッチする場合、通常の補完動作はオーバーライドされる。Completion Variablesを参照のこと。
annotation-function
値は補完に注釈(annotation)を付ける関数。この関数は1つの引数stringをとり、これは利用可能な補完である。リターン値は文字列で、*Completions*バッファー内の補完stringの後に表示される。
display-sort-function
値は補完をソートする関数。関数は1つの引数をとる。これは補完文字列のリストで、ソートされた補完文字列リストがリターンされる。その入力のリストは破壊的に変更することが許される。
cycle-sort-function
値はcompletion-cycle-threshold
が非nil
で、ユーザーが補完候補を巡回するときに補完をソートする関数。引数のリストとリターン値はdisplay-sort-function
と同様。
この関数はプログラム補完関数として動作する関数を記述する便利な方法である。引数functionは1つの引数(文字列)をとる関数であり、その文字列の利用可能な補完のalistをリターンする。completion-table-dynamic
は、functionとプログラム補完関数のインターフェイス変換器と考えることができる。
これは前回の引数/結果ペアーを保存するcompletion-table-dynamic
にたいするラッパーである。これは同じ引数にたいする複数回の検査に必要なのは、1回のfunction呼び出しだけであることを意味する。これは外部プロセス呼び出しなど、処理が低速のとき有用かもしれない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
補完は通常はミニバッファー内で行われますが、補完機能は通常のEmacsバッファー内のテキストにも使用できます。多くのメジャーモードで、コマンドC-M-iまたはM-TABによりバッファー内補完が行われ、それらはcompletion-at-point
にバインドされています。Symbol
Completion in The GNU Emacs
Manualを参照してください。このコマンドはアブノーマルフック変数completion-at-point-functions
を使用します:
このアブノーマルフックの値は関数のリストである。これらの関数はポイント位置のテキストの補完にたいする補完テーブルの計算に使用される。これはメジャーモードにより、モード特有な補完テーブル(Major Mode Conventionsを参照)の提供に使用できる。
コマンドcompletion-at-point
が実行されると、引数なしでリスト内の関数が1つずつ呼び出される。それぞれの関数は、ポイント位置のテキストにたいして補完テーブルを生成できない場合はnil
をリターンする。生成できた場合は、以下の形式のリストをリターンする
(start end collection . props)
ここでstartとendは補完する(ポイントを取り囲む)テキストの区切りである。collectionはそのテキストを補完する補完テーブルであり、try-completion
(Basic Completion Functionsを参照)の2つ目の引数として渡すのに適した形式である。補完候補はcompletion-styles
(Completion Variablesを参照)で定義された補完スタイルを通じ、この補完テーブルを通常の方法で使用して生成されるだろう。propsは追加の情報のためのプロパティリストである。completion-extra-properties
内のすべてのプロパティ(Completion Variablesを参照)と、以下の追加のプロパティが認識される:
:predicate
値は補完候補が満足する必要がある述語。
:exclusive
値がno
の場合は、もし補完テーブルがポイント位置のテキストのマッチに失敗したなら、補完の失敗を報告するかわりにcompletion-at-point
はcompletion-at-point-functions
内の次の関数へ移動する。
completion-at-point-functions
内の関数も関数をリターンするかもしれない。その場合は引数なしでリターンされた関数が呼び出され、その関数が補完処理の全責任を負う。この方法は推奨されない。これはcompletion-at-point
を使用する古いコードの救済を意図したもののだからである。
非nil
値を最初にリターンしたcompletion-at-point-functions
内の関数が、completion-at-point
により使用される。残りの関数は呼び出されない。これの例外は上述の:exclusive
指定があるときである。
以下の関数は、Emacsバッファー内の任意に拡張されたテキストにたいして便利な補完方法を提供します:
この関数はcollectionを使用して、カレントバッファー内の位置startとendの間のテキストを補完する。引数collectionはtry-completion
(Basic Completion Functionsを参照)のときと同じ意味をもつ。
この関数は補完テキストを直接カレントバッファーに挿入する。completing-read
(Completion and the Minibufferを参照)とは異なり、ミニバッファーをアクティブにしない。
この関数が機能するためには、ポイントがstartとendの間になければならない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ユーザーにyes-or-noの確認を求める関数を説明します。関数y-or-n-p
は1文字での応答に使用できます。この関数は不注意による誤った答えが深刻な結果を招かない場合に有用です。yes-or-no-p
は3文字から4文字の答えを要求するので、より重大な問に適しています。
3つの関数はどれも、マウスを使用して呼び出されたコマンド、より正確にはlast-nonmenu-event
(Information from the Command Loopを参照)がnil
かリストの場合は、問いに答えるためにダイアログボックスまたはポップアップメニューを使用します。それ以外の場合はキーボード入力を使用します。呼び出しの周囲でlast-nonmenu-event
に適切な値をバインドすることにより、マウスまたはキーボードの使用を強制できます。
厳密に言うと、yes-or-no-p
はミニバッファーを使用し、y-or-n-p
は使用しませんが、これらのコマンドは一緒に説明したほうがよいでしょう。
この関数はユーザーに答えを尋ねて、ミニバッファーに入力を求める。ユーザーがyをタイプしたらt
、nをタイプしたらnil
をリターンする。この関数はyesの意味でSPC、noの意味でDELも受け入れる。“quit”の意味としてC-gと同様にC-]も受け入れる。これは問いがミニバッファーのような外見をもち、ミニバッファーを抜けるためにユーザーがC-]の使用を試みるかもしれないという理由による。応答は1文字であり、問いを終了させるためのRETは必要ない。大文字と小文字は等価である。
“答えを尋ねる”とはエコーエリアにpromptと、その後に文字列‘(y or n) ’をプリントすることを意味する。期待される答え(y、n、SPC、DEL、もしくは質問を終了するその他のキー)以外が入力された場合、この関数は‘Please answer y or n.’と応答し、繰り返し答えの入力を要求する。
この関数は答えの編集を許さないため、実際にミニバッファーは使用しない。実際に使用するのはミニバッファーと同じスクリーンスペースを使用するエコーエリア(The Echo Areaを参照)である。問いが答えられるまで、カーソルはエコーエリアに移動する。
答えとその意味は、たとえ‘y’と‘n’であっても固定されたものではなく、キーマップquery-replace-map
により指定される(Search and Replaceを参照)。特にユーザーがrecenter
、scroll-up
、scroll-down
、scroll-other-window
、scroll-other-window-down
(それぞれquery-replace-map
内でC-l、C-v、M-v、C-M-v、C-M-S-vにバインドされている)のような特殊な応答をエンターした場合、この関数はは指定されたウィンドウの再センタリングやスクロール操作を処理してから再度答えを求める。
例ではエコーエリアのメッセージを連続する行で示しているが、スクリーン上に実際に表示されるのは1回に1行だけである。
y-or-n-p
と同様だが、ユーザーがseconds秒以内に答えないと、この関数は待つのをやめてdefaultをリターンする。これはタイマーをセットアップすることにより機能する。引数secondsは数字である。
この関数は質問して、ミニバッファーに答えの入力を求める。これはユーザーが‘yes’をエンターするとt
を、‘no’をエンターするとnil
をリターンする。ユーザーは応答を終えるためにRETをタイプしなければならない。大文字と小文字は等価である。
yes-or-no-p
はエコーエリアにpromptとその後に‘(yes or no) ’を表示することにより開始される。ユーザーは期待される応答の1つをタイプしなければならない。それ以外の答えだと、この関数は‘Please
answer yes or no.’と応答して約2秒待った後に要求を繰り返す。
yes-or-no-p
はy-or-n-p
より多くの作業をユーザーに要求し、より重大な決定に適している。
以下は例である:
(yes-or-no-p "Do you really want to remove everything? ") ;; 前の式を評価した後、 ;; 空のミニバッファーに ;; 以下のプロンプトが表示される:
---------- Buffer: minibuffer ---------- Do you really want to remove everything? (yes or no) ---------- Buffer: minibuffer ----------
ユーザーが最初にy RETとタイプした場合、これは無効である。なぜならこの関数は‘yes’という単語全体を要求しているので、以下のプロンプトを説明のために一時停止して表示する。
---------- Buffer: minibuffer ---------- Please answer yes or no. Do you really want to remove everything? (yes or no) ---------- Buffer: minibuffer ----------
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
同じような連続する質問と答えがある場合、たとえば各バッファーにたいして順に“Do you want to save this
buffer”と確認を求めるような場合は、個別に質問するよりmap-y-or-n-p
を使用して質問のコレクションを尋ねるべきです。これはユーザーにたいして、質問全体にたいして1回で答えられるような便利な機能を提供します。
この関数はユーザーに一連の質問をし、それぞれの質問にたいしてエコーエリア内の1文字の答えを読み取る。
値listは質問をするオブジェクトを指定する。これはリスト、オブジェクト、または生成関数(generator
function)のいずれかである。関数の場合は引数なしで、次に質問するオブジェクト、または質問の中止を意味するnil
のいずれかをリターンする。
引数prompterは各質問について問い合わせ方法を指定する。prompterが文字列の場合、質問テキストは以下のようになる:
(format prompter object)
ここでobjectは、(listから得られる)質問する次のオブジェクトである。
文字列でない場合、prompterは1つの引数(質問する次のオブジェクト)をとる関数で、質問テキストをリターンする。値が文字列の場合は、ユーザー問うための質問。関数はt
(ユーザーに尋ねずこのオブジェクトを処理する)、またはnil
(ユーザーに尋ねずこのオブジェクトを無視する)をリターンすることもできる。
引数actorは、ユーザーが与えた答えにたいし、どのように処理するかを指定する。これは引数が1つの関数で、ユーザーがyesと答えたオブジェクトを引数に呼び出される。引数は常にlistから取得したオブジェクトである。
引数helpが与えられた場合は、以下の形式のリストである:
(singular plural action)
singularはそのオブジェクトが概念的に何に作用するかを説明する単数形の名詞を含む文字列、pluralはそれに対応する複数形の名詞、actionはactorが何を行うかを説明する他動詞である。
helpを指定しない場合のデフォルトは、("object" "objects" "act on")
。
質問のたびに、ユーザーはそのオブジェクトを処理するにはy、YまたはSPCを、そのオブジェクトをスキップするにはn、N、またはDELを、以降のすべてのオブジェクトを処理するには!を、exit(以降のすべてのオブジェクトをスキップ)するにはESCかqを、カレントオブジェクトを処理した後にexitするには.(ピリオド)を、ヘルプを入手するにはC-hをエンターする。これらはquery-replace
が受け入れるのと同じ答えである。キーマップquery-replace-map
はmap-y-or-n-p
にたいするそれらの意味を定義し、query-replace
にたいしても同様に定義する。Search and Replaceを参照のこと。
action-alistを使用して、利用できる追加の答えとそれらが何を意味するかを指定できる。これは要素が(char
function
help)
という形式のalistで、それぞれの要素が追加の答えを1つ定義する。要素の内容はcharが文字(答え)、functionが引数が1つ(listから取得するオブジェクト)の関数、helpが文字列である。
ユーザーの応答がcharの場合、map-y-or-n-p
はfunctionを呼び出す。これが非nil
をリターンした場合には、そのオブジェクトが“処理された”と判断して、map-y-or-n-p
はlist内の次のオブジェクトに進む。nil
をリターンした場合は、同じオブジェクトにたいして質問を繰り返す。
確認を求める間は通常、map-y-or-n-p
はcursor-in-echo-area
をバインドする。しかしno-cursor-in-echo-areaが非nil
の場合はバインドしない。
マウスを使用して呼び出されたコマンドからmap-y-or-n-p
が呼び出された場合(より正確にはlast-nonmenu-event
は非nil
かリストの場合。Information from the Command Loopを参照)は、確認を求めるためにダイアログボックスかポップアップメニューが使用される。この場合、キーボード入力やエコーエリアは使用されない。呼び出しの前後でlast-nonmenu-event
を適切な値にバインドして、入力マウスあるいはキーボードの入力を強制できる。
map-y-or-n-p
のリターン値は、処理したオブジェクトの数である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他のプログラムに渡すためのパスワードを読み取るために、関数read-passwd
を使用できます。
この関数はプロンプトpromptを表示してパスワードを読み取る。これはユーザーがタイプしたパスワードのかわりに、パスワード内の各文字を‘.’にかえてエコーする(バッチモードでは入力は隠されないことに注意)。)
オプション引数confirmが非nil
の場合にはパスワードを2回読み取ることで、それらが同じものであることを強制する。同じでない場合は、2回の入力が同じになるまで、ユーザーはパスワードを繰り返しタイプする必要がある。
オプション引数defaultは、ユーザーが空入力をエンターした場合のデフォルトパスワードである。defaultがnil
の場合、read-passwd
はnull文字列をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションではミニバッファー内で使用するコマンドを説明します。
このコマンドはアクティブなミニバッファーをexitする。これは通常、ミニバッファー内のローカルキーマップのキーにバインドされる。
このコマンドはキーボードでタイプされた最後の文字を挿入した後にアクティブなミニバッファーをexitする。Information from the Command Loop)を参照のこと。
このコマンドは、n個前(古い)のヒストリー要素の値でミニバッファー内のコンテンツを置換する。
このコマンドは、n個先(新しい)のヒストリー要素の値でミニバッファー内のコンテンツを置換する。
このコマンドはpattern(正規表現)にマッチするn個前(古い)のヒストリー要素でミニバッファー内のコンテンツを置換する。
このコマンドはpattern(正規表現)にマッチするn個先(新しい)のヒストリー要素でミニバッファー内のコンテンツを置換する。
このコマンドはミニバッファー内のポイントの前のカレントコンテンツを、n個前(古い)ヒストリー要素の値で置換する。
このコマンドはミニバッファー内のポイントの前のカレントコンテンツを、n個先(新しい)ヒストリー要素の値で置換する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数はミニバッファーウィンドウをアクセスにして選択して、それがアクティブかどうかテストします。
この関数はカレントでアクティブなミニバッファーウィンドウ、アクティブなウィンドウがない場合はnil
をリターンする。
この関数はフレームframeにたいして使用されるミニバッファーウィンドウをリターンする。frameがnil
の場合はカレントフレームを意味する。フレームに使用されるミニバッファーウィンドウは、そのフレームの一部である必要はないことに注意。自身のミニバッファーをもたないフレームは、必然的に他のフレームのミニバッファーウィンドウを使用する。
この関数はミニバッファーウィンドウとしてwindowを使用するよう指定する。 This function specifies as the minibuffer window to use. これは通常のミニバッファーコマンドを呼び出さずにミニバッファーにテキストを入力する場合、そのミニバッファーがどこに表示されるかに影響を及ぼす。通常のミニバッファー入力関数はすべてカレントフレームに対応するミニバッファーを選択して開始されるので、影響はない。
この関数はwindowがミニバッファーウィンドウならnil
をリターンする。windowのデフォルトは選択されたウィンドウである。
(minibuffer-window)
の結果を比較して、与えられたウィンドウがミニバッファーかどうか判断するのは正しくない。なぜなら複数のフレームがある場合、ミニバッファーウィンドウも複数あり得るからである。
この関数はwindowがカレントでアクティブなミニバッファーウィンドウの場合は、非nil
をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数はミニバッファーのプロンプトとコンテンツにアクセスします。
この関数はカレントでアクティブなミニバッファーのプロンプト文字列をリターンする。アクティブなミニバッファーがない場合は、nil
をリターンする。
この関数は、ミニバッファーがカレントの場合はミニバッファープロンプトの終端のカレント位置をリターンする。それ以外はバッファーの有効な最小位置をリターンする。
この関数はミニバッファーがカレントの場合は、ミニバッファープロンプトのカレントの表示幅をリターンする。それ以外は0をリターンする。
この関数はミニバッファーがカレントの場合は、ミニバッファーの編集可能なコンテンツ(つまりプロンプト以外のすべて)を文字列でリターンする。それ以外は、カレントバッファーのコンテンツ全体をリターンする。
これはminibuffer-contents
と同様だが、テキストプロパティをコピーせず文字だけをリターンする。Text Propertiesを参照のこと。
この関数はミニバッファーがカレントの場合は、ミニバッファーの編集可能なコンテンツ(つまりプロンプト以外のすべて)を削除する。それ以外は、カレントバッファー全体を削除する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数および変数は再帰ミニバッファーを処理します(Recursive Editingを参照):
この関数はアクティブなミニバッファーのカレント深さを正の整数でリターンする。アクティブなミニバッファーが存在しない場合は0をリターンする。
この変数が非nil
の場合は、ミニバッファーウィンドウがアクティブでも、(find-file
のような)ミニバッファーを使用するコマンドを呼び出すことができる。このような呼び出しは、新たなミニバッファーにたいして再帰編集レベル(recursive
editing level)を生成する。内側レベルの編集の間、外側レベルのミニバッファーは非表示になる。
この変数がnil
の場合、ミニバッファーウィンドウがアクティブなときは、たとえ他のウィンドウに切り替えても、ミニバッファーコマンドの呼び出しはできない。
コマンド名が非nil
のプロパティenable-recursive-minibuffers
をもつ場合は、たとえミニバッファーから呼び出された場合でも、そのコマンドは引数の読み取りにミニバッファーを使用できる。コマンドのinteractive宣言内でenable-recursive-minibuffers
をt
にしても、これを行うことができる(Using interactive
を参照)。ミニバッファーコマンドnext-matching-history-element
(ミニバッファー内では通常M-s)は後者を行う。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数はbuffer-or-nameがミニバッファーの場合は非nil
をリターンする。buffer-or-nameが省略された場合はカレントバッファーをテストする。
これはミニバッファーがエンターされたときは常に実行されるノーマルフックである。Hooksを参照のこと。
これはミニバッファーがexitされたときは常に実行されるノーマルフックである。
この変数のカレント値はミニバッファー内でhelp-form
をローカルにリバインドするために使用される(Help Functionsを参照)。
この変数の値が非nil
の場合、それはウィンドウオブジェクトである。ミニバッファー内で関数scroll-other-window
が呼び出されたときは、このウィンドウをスクロールする。
この関数はミニバッファーがエンターされたときに選択されていたウィンドウをリターンする。選択されたウィンドウがミニバッファー以外のときは、nil
をリターンする。
この変数はミニバッファーウィンドウのリサイズにたいする最大高さを指定する。浮動小数点数の場合は、フレーム高さにたいする割り合いを指定する。整数の場合は行数を指定する。
この関数は数秒、あるいは次の入力イベントが到着するまで、ミニバッファーテキストの最後に一時的にstringを表示する。変数minibuffer-message-timeout
は入力がない場合に待機する秒数を指定する(デフォルトは2)。argsが非nil
の場合、実際のメッセージはformat
にstringとargsを渡して作成される。See section Formatting Stringsを参照のこと。
これはインタラクティブなミニバッファー内で使用されるメジャーモードである。キーマップminibuffer-inactive-mode-map
を使用する。ミニバッファーが別のフレームにある場合は有用かもしれない。Minibuffers and Framesを参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsを実行すると、ほぼ即座にエディターコマンドループ(editor command loop)にエンターします。このループはキーシーケンスを読み取り、それらの定義を実行して、結果を表示します。このチャプターでは、これらが行われる方法と、Lispプログラムがこれらを行えるようにするサブルーチンを説明します。
20.1 Command Loop Overview | コマンドループがコマンドを読み取る方法。 | |
20.2 Defining Commands | 関数が引数を読み取る方法を指定する。 | |
20.3 Interactive Call | 引数を読み取るようにコマンドを呼び出す。 | |
20.4 Distinguish Interactive Calls | インタラクティブな呼び出しとコマンドを区別する。 | |
20.5 Information from the Command Loop | 検証用にコマンドループによりセットされる変数。 | |
20.6 Adjusting Point After Commands | コマンドの後にポイント位置を調整する。 | |
20.7 Input Events | 入力を読み取るとき、入力がどのように見えるか。 | |
20.8 Reading Input | キーボードやマウスからの入力イベントを読み取る方法。 | |
20.9 Special Events | 即座かつ個別に処理されるイベント。 | |
20.10 Waiting for Elapsed Time or Input | ユーザー入力または経過時間の待機。 | |
20.11 Quitting | C-gが機能する方法。quitをcatchまたは延期する方法。 | |
20.12 Prefix Command Arguments | コマンドがプレフィクス引数が機能するようにセットするための方法。 | |
20.13 Recursive Editing | 再帰編集へのエンター、なぜ通常は再帰編集を行うべきでないのか。 | |
20.14 Disabling Commands | コマンドループが無効なコマンドを扱う方法。 | |
20.15 Command History | コマンドヒストリーがセットアップされる方法と、どのようにアクセスされるか。 | |
20.16 Keyboard Macros | キーボードマクロが実装される方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コマンドループが最初に行わなければならないのはキーシーケンスの読み取りです。キーシーケンスほコマンドに変換される入力イベントのシーケンスです。これは関数read-key-sequence
を呼び出すことにより行われます。Lispプログラムもこの関数を呼び出すことができます(Key Sequence Inputを参照)。これらはより低レベルのread-key
やread-event
(Reading One Event)で入力を読み取ったり、discard-input
(Miscellaneous Event Input Featuresを参照)で保留中の入力を無視することもできます。
キーシーケンスはカレントでアクティブなキーマップを通じてコマンドに変換されます。これが行われる方法については、See section Key Lookupを参照してください。結果はキーボードマクロかインタラクティブに呼び出し可能な関数になります。キーがM-xの場合は、他のコマンドの名前を読み取り、それを呼び出します。これはコマンドexecute-extended-command
(Interactive Callを参照)により行われます。
コマンドの実行に先立ち、Emacsはアンドゥ境界(undo
boundary)を作成するためにundo-boundary
を実行します。Maintaining Undo Listsを参照してください。
コマンドを実行するために、Emacsはまずcommand-execute
を呼び出してコマンドの引数を読み取ります(Interactive Callを参照)。Lispで記述されたコマンドについては、interactive
指定で引数を読み取る方法を指定します。これはプレフィクス引数(Prefix Command Argumentsを参照)を使用したり、ミニバッファー内(Minibuffersを参照)で確認を求めて読み取りを行うかもしれません。たとえば、コマンドfind-file
にはinteractive
指定があり、これはミニバッファーを使用してファイル名を読み取ることを指定します。find-file
の関数bodyはミニバッファーを使用しないので、Lispコードから関数としてfind-file
を呼び出す場合は通常のLisp関数引数としてファイル名を文字列で与えなければなりません。
コマンドがキーボードマクロ(文字列やベクター)の場合、Emacsはexecute-kbd-macro
を使用してそれを実行します(Keyboard Macrosを参照)。
このノーマルフックはコマンドを実行する前に、エディターコマンドループにより実行される。その際、this-command
には実行しようとするコマンドが含まれ、last-command
には前のコマンドが記述される。Information from the Command Loopを参照のこと。
このノーマルフックはコマンドを実行した後(quitやエラーにより早期に終了させられたコマンドを含む)に、エディターコマンドループにより実行される。その際、this-command
は正に実行されたコマンドを参照し、last-command
は前に実行されたコマンドを参照する。
このフックはEmacsが最初にコマンドループにエンターしたときにも実行される(その時点ではthis-command
とlast-command
はどちらもnil
)。
pre-command-hook
およびpost-command-hook
の実行中、quitは抑制されます。これらのフックのどれか1つを実行中にエラーが発生した場合、そのエラーはフックの実行を終了させません。そのかわりにエラーは黙殺され、エラーが発生した関数はそのフックから取り除かれます。
Emacsサーバー(Emacs Server in The GNU Emacs Manualを参照)に届くリクエストは、キーボードコマンドが行うのと同じように、これらの2つのフックを実行します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
スペシャルフォームinteractive
はLisp関数をコマンドに変えます。interactive
フォームは関数ボディーのトップレベルに置かなければならず、通常はボディー内の最初のフォームとして記述されます。これはラムダ式(Lambda Expressionsを参照)とdefun
(Defining Functionsを参照)の両方を受け入れます。このフォームは、その関数が実際に実行される間は何も行いません。このフォームの存在はフラグとしての役割りをもち、Emacsコマンドループにたいしてその関数がインタラクティブに呼び出せることを告げます。interactive
フォームの引数は、インタラクティブな呼び出しが引数を読み取る方法を指定します。
interactive
フォームのかわりに、関数シンボルのinteractive-form
プロパティで指定されることもあります。このプロパティが非nil
値の場合、関数ボディー内のinteractive
フォームより優先されます。この機能はほとんど使用されません。
インタラクティブに呼び出されることだけを意図していて、決してLispから直接呼び出されない関数が時折あります。この場合は、その関数のinteractive-only
プロパティに非nil
を与えます。これにより、そのコマンドがLispから呼び出された場合に、バイトコンパイラーが警告を発します。このプロパティの値には、文字列、t
、または任意のシンボルを指定できます。文字列の場合、それはバイトコンパイラーによる警告内で直接使用されます(最初は大文字でなくピリオドで終端される文字列。たとえば“use
… instead.”)。シンボルの場合、それはLispコード内で使用されるかわりの関数です。
20.2.1 Using interactive | interactive にたいする一般的なルール。
| |
20.2.2 Code Characters for interactive | さまざまな方法で引数を読み取る標準的な文字のコード。 | |
20.2.3 Examples of Using interactive | インタラクティブ引数を読み取る方法の例。 | |
20.2.4 Select among Command Alternatives | コマンド候補からの選択。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
interactive
このセクションでは、Lisp関数をインタラクティブに呼び出し可能なコマンドにするinteractive
フォームの記述方法と、コマンドのinteractive
フォームの検証方法について説明します。
このスペシャルフォームは関数がコマンドであり、したがって(M-xを通じて、またはそのコマンドにバインドされたキーシーケンスのエンターすることにより)インタラクティブに呼び出されるかもしれないことを宣言する。引数arg-descriptorは、そのコマンドがインタラクティブに呼び出されたときに引数を計算する方法を宣言する。
コマンドは他の関数と同じようにLisp関数から呼び出されるかもしれないが、その場合呼び出し側は引数を提供し、arg-descriptorは効果をもたない。
interactive
フォームは関数ボディー内のトップレベルに置くか、関数シンボルのinteractive-form
プロパティ((Symbol Properties)を参照)になければならない。これはコマンドループが関数を呼び出す前にinteractiveフォームを調べることにより効果をもつ(Interactive Callを参照)。一度関数が呼び出されると関数ボディー内のすべてのフォームが実行される。このときボディー内にinteractive
フォームが出現しても、そのフォームは引数の評価さえされず、単にnil
をリターンする。
慣例により、interactive
フォームは関数ボディー内の最初のトップレベルフォームとするべきである。interactive
フォームがシンボルのinteractive-form
プロパティと関数ボディーの両方に存在する場合は、前者が優先される。interactive-form
フォームは既存の関数にinteractiveフォームを追加したり、その関数を再定義することなく引数をインタラクティブに処理する方法を変更するために使用できる。
引数arg-descriptorには3つの可能性があります:
nil
の場合、コマンドは引数なしで呼び出される。コマンドが1つ以上の引数を要求する場合は、すぐにエラーとなる。
interactive
を参照)と、オプションでその後のプロンプト(ある文字はコード文字として使用され、コード文字としては無視されるものもある)により構成される。以下は例である:
(interactive "P\nbFrobnicate buffer: ")
コード文字‘P’はそのコマンドの1つ目の引数をrawコマンドプレフィクス(Prefix Command Argumentsを参照)にセットする。‘bFrobnicate buffer: ’は、ユーザーに‘Frobnicate buffer: ’のプロンプトを示して既存のバッファーの名前の入力を促し、これは2つ目かつ最後の引数になる。
プロンプト文字列には、プロンプト内の前の引数(1つ目の引数から始まる)の値を含めるために‘%’を使用できる。これはformat
(Formatting Stringsを参照)を使用して行われる。たとえば、以下は既存のバッファーの名前を読み取り、その後にそのバッファーに与える新たな名前を読み取る例である:
(interactive "bBuffer to rename: \nsRename buffer %s to: ")
文字列の先頭‘*’がある場合、そのバッファーが読み取り専用の場合にエラーがシグナルされる。
文字列の先頭が‘@’で、そのコマンドの呼び出しに使用されたキーシーケンスに何らかのマウスイベントが含まれる場合は、そのコマンドを実行する前に、それらのうち最初のイベントに結びつくウィンドウが選択される。
文字列の先頭が‘^’で、そのコマンドがシフト転換(shift-translation)を通じて呼び出された場合は、そのコマンドを実行する前に、マークをセットして一時的にリージョンをアクティブにするか、すでにアクティブなリージョンを拡張する。コマンドがシフト転換なしで呼び出されて、リージョンが一時的にアクティブな場合は、コマンドを実行する前に、そのリージョンを非アクティブにする。シフト転換はshift-select-mode
により、ユーザーレベルで制御される。Shift
Selection in The GNU Emacs Manualを参照のこと。
‘*’、‘@’、^
はともに使用でき、その場合は順序に意味はない。実際の引数の読み取りは残りのプロンプト文字列(‘*’、‘@’、^
以外の最初の文字以降)により制御される。
引数値としてポイントやマークを提供するのも一般的だが、何かを行いかつ(ミニバッファー使用の有無に関わらず)入力を読み取る場合は、読み取りの前にポイント値またはマーク値の整数を確実に取得しておくこと。カレントバッファーはサブプロセスの出力を受信するかもしれず、コマンドが入力を待つ間にサブプロセス出力が到着した場合、ポイントおよびマークの再配置が起こり得る。
以下は行ってはいけない例である:
(interactive (list (region-beginning) (region-end) (read-string "Foo: " nil 'my-history)))
これにたいし、以下はキーボード入力を読み取った後にポイントとマークを調べることにより、上記の問題を避ける例である:
(interactive (let ((string (read-string "Foo: " nil 'my-history))) (list (region-beginning) (region-end) string)))
警告:
引数値にはプリントや読み取りが不可能なデータ型を含めるべきではない。いくつかの機能は後続のセッションに読み込ませるためにcommand-history
をファイルに保存する。コマンドの引数に‘#<…>’構文を使用してプリントされるデータ型が含まれる場合、それらの機能は動作しないだろう。
しかしこれには少数の例外がある。(point)
、(mark)
、(region-beginning)
、(region-end)
などの一連の式に限定して使用するのに問題はない。なぜならEmacsはこれらを特別に認識して、コマンドヒストリー内に(値ではなく)その式を配すからである。記述した式がこれらの例外に含まれるかどうか確認するには、コマンドを実行した後に(car
command-history)
を調べればよい。
この関数はfunctionのinteractive
フォームをリターンする。functionがインタラクティブに呼び出し可能な関数(Interactive Callを参照)の場合、値はそのコマンドの引数を計算する方法を指定するinteractive
フォーム((interactive
spec)
)である。それ以外では値はnil
である。functionがシンボルの場合は、そのシンボルの関数定義が使用される。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
interactive
ここで説明されているコード文字には、以下で定義されるいくつかのキーワードが含まれています:
補完を提供する。TAB、SPC、RETはcompleting-read
(Completionを参照)を使用して引数を読み取り、名前の補完を行う。?で利用可能な補完リストを表示する。
既存オブジェクトの名前を要求する。無効な名前は受け付けられない。カレント入力が有効でない場合、ミニバッファーをexitするコマンドはexitしない。
ユーザーがテキストを何もエンターしなかった場合は、ある種のデフォルト値が使用される。デフォルトはコード文字に依存する。
このコード文字は入力を読み取らずに引数を計算する。したがってプロンプト文字列を使用せず、与えられたプロンプト文字列は無視される。
たとえこのコード文字がプロンプト文字列を使用しなくても、これが文字列内で最後のコード文字でない場合は、その後に改行を付けなければならない。
コード文字の直後にプロンプトが続く。プロンプトの終端は文字列の終端、または改行。
このコード文字はインタラクティブ文字列の先頭にあるときのみ意味があり、プロンプトおよび改行を要求しない。単一の独立した文字である。
以下はinteractive
とともに使用されるコード文字です:
カレントバッファーが読み取り専用の場合はエラーをシグナルする。[Special]
このコマンドを呼び出したキーシーケンス内の最初のマウスイベントに関連するウィンドウを選択する。[Special]
シフト転換を通じてコマンドが呼び出された場合はコマンドを実行する前に、マークをセットして一時的にリージョンをアクティブにするか、すでにリージョンがアクティブな場合はリージョンを拡張する。シフト転換を通じずにコマンドが呼び出され、リージョンが一時的にアクティブな場合は、コマンドを実行する前にそのリージョンを非アクティブにする。[Special]
関数名(たとえばfboundp
を満足するシンボル)。[Existing]、[Completion]、[Prompt]
既存バッファーの名前。 The name of an existing buffer. デフォルトではカレントバッファー(Buffersを参照)の名前を使用する。[Existing]、[Completion]、[Default]、[Prompt]
バッファー名。そのバッファーが存在する必要はない。デフォルトではカレントバッファーではなくもっとも最近使用されたバッファーの名前を使用する。[Completion]、[Default]、[Prompt]
文字。カーソルはエコーエリアに移動しない。[Prompt]
コマンド名(たとえばcommandp
を満足するシンボル)。[Existing]、[Completion]、[Prompt]
ポイント位置の整数(Pointを参照)。[No I/O]
ディレクトリー名。デフォルトはカレントバッファーのカレントのデフォルトディレクトリーdefault-directory
(Functions that Expand Filenamesを参照)。[Existing]、[Completion]、[Default]、[Prompt]
そのコマンドを呼び出したキーシーケンス内の1つ目、または2つ目の非キーボードイベント。より正確には、‘e’はリストとしてイベントを取得するので、リスト内のデータを調べることができる。Input Eventsを参照のこと。[No I/O]
‘e’はマウスイベント、および特別なシステムイベント(Miscellaneous System Eventsを参照)にたいして使用する。コマンドが受け取るイベントリストは、そのイベントに依存する。Input Eventsではそれぞれのイベントのリスト形式を、対応するサブセクションでそれぞれ説明しているので、参照のこと。
1つのコマンドのinteractive仕様の中で、‘e’を複数回使用できる。そのコマンドを呼び出したキーシーケンスがイベントn(リスト)をもつ場合は、‘e’のn番目がそのイベントを提供する。関数キーやASCII文字のようなリスト以外のイベントは、‘e’に関連するイベントとしてカウントされない。
既存ファイルのファイル名(File Namesを参照)。デフォルトのディレクトリーはdefault-directory
。[Existing]、[Completion]、[Default]、[Prompt]
ファイル名。ファイルが存在している必要はない。[Completion]、[Default]、[Prompt]
ファイル名。ファイルが存在している必要はない。ユーザーがディレクトリー名だけをエンターした場合、値はそのディレクトリー名となり、そのディレクトリー名にファイル名は追加されない。[Completion]、[Default]、[Prompt]
無関係な引数。このコード文字は引数値として常にnil
を与える。[No I/O]
キーシーケンス(Key Sequencesを参照)。これはカレントキーマップ内でコマンド(または未定義のコマンド)が見つかるまで、イベントを読み取り続ける。キーシーケンス引数は文字列、またはベクターで表される。カーソルはエコーエリアに移動しない。[Prompt]
‘k’が(マウスの)down-eventで終わるキーシーケンスを読み取った場合は、後続の(マウスの)up-eventも読み取り、それを捨てる。コード文字‘U’により、up-eventへのアクセスを得ることができる。
この種の入力は、describe-key
やglobal-set-key
のようなコマンドにより使用される。
キーシーケンス。その定義は変更されることを意図している。これは‘k’と同じように機能するが、キーシーケンス内の最後の入力イベントにたいして、通常(必要なら)使用される未定義キーから定義済みキーへの変換を抑制する。
マーク位置の整数。[No I/O]
任意のテキスト。ミニバッファー内でカレントバッファーの入力メソッド(Input Methods in The GNU Emacs Manualを参照)を使用して読み取りを行い、それを文字列でリターンする。[Prompt]
数字。ミニバッファーで読み取られる。入力が数字でない場合、ユーザーは再試行する必要がある。‘n’は決してプレフィクス引数を使用しない。[Prompt]
数引数(numeric prefix argument)。ただしプレフィクス引数がない場合は、nのように数字を読み取る。値は常に数字。Prefix Command Argumentsを参照のこと。[Prompt]
数引数()これは小文字の‘p’であることに注意)。[No I/O]
rawプレフィクス引数(これは大文字の‘P’であることに注意)。[No I/O]
2つの数引数(ポイントとマーク)。小さいほうが先。これは1つではなく連続する2つの引数を指定する唯一のコード文字である。[No I/O]
任意のテキスト。ミニバッファー内で読み取りを行い文字列としてリターンする(Reading Text Strings with the Minibufferを参照)。C-jかRETで入力を終端する(これらの文字を入力に含めるためにC-qが使用されるかもしれない)。[Prompt]
インターン済みのシンボル。名前はミニバッファー内で読み取られる。C-jかRETで入力を終端する。ここでは、その他の通常はシンボルを終端する文字(たとえば空白文字、丸カッコ、角カッコ)では終端されない。[Prompt]
キーシーケンス、またはnil
。‘k’(または‘K’)が読み取った後に、(もしあれば)捨てられる(マウスの)up-eventを取得するために、引数‘k’(または‘K’)の後で使用され得る。捨てられたup-eventが存在しない場合、‘U’は引数としてnil
を提供する。[No
I/O]
ユーザーオプションとして宣言された変数(たとえば述語custom-variable-p
を満足する)。これはread-variable
を使用して変数を読み取る。Definition of read-variableを参照のこと。[Existing]、[Completion]、[Prompt]
Lispオブジェクト。そのオブジェクトの入力構文により指定され、C-jかRETで終端される。オブジェクトは評価されない。Reading Lisp Objects with the Minibufferを参照のこと。[Prompt]
Lispフォームの値。‘X’は‘x’のように読み取りを行いフォームを評価して、その値がコマンドの引数になる。[Prompt]
コーディングシステム名(シンボル)。ユーザーがnull入力をエンターした場合、引数値はnil
になる。Coding Systemsを参照のこと。[Completion]、[Existing]、[Prompt]
コマンドにプレフィクス引数がある場合はコーディングシステム名。プレフィクス引数がない場合、‘Z’は引数値としてnil
を提供する。[Completion]、[Existing]、[Prompt]
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
interactive
以下にinteractive
の例をいくつか挙げます:
(defun foo1 () ; foo1
は1つの引数をとり
(interactive) ; 単に2単語分前に移動する。
(forward-word 2))
⇒ foo1
(defun foo2 (n) ;foo2
は引数を1つとる (interactive "^p") ; 引数は数引数 ;shift-select-mode
では、 ; リージョンをアクティブにするか、拡張する (forward-word (* 2 n))) ⇒ foo2
(defun foo3 (n) ; foo3
は引数を1つとる
(interactive "nCount:") ; 引数はミニバッファーで読み取られる
(forward-word (* 2 n)))
⇒ foo3
(defun three-b (b1 b2 b3) "Select three existing buffers. Put them into three windows, selecting the last one."
(interactive "bBuffer1:\nbBuffer2:\nbBuffer3:") (delete-other-windows) (split-window (selected-window) 8) (switch-to-buffer b1) (other-window 1) (split-window (selected-window) 8) (switch-to-buffer b2) (other-window 1) (switch-to-buffer b3)) ⇒ three-b
(three-b "*scratch*" "declarations.texi" "*mail*") ⇒ nil
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロdefine-alternatives
はジェネリックコマンド(generic
command)を定義するために使用できます。これらはユーザーの選択により複数の候補から選択可能なinteractive関数の実装です。
新たなコマンドcommand(シンボル)を定義する。
最初にユーザーがM-x command RETを実行したとき、Emacsはコマンドが使用する実際のフォームにたいして確認を求め、その選択をカスタム変数として記録する。プレフィクス引数を使用すると、候補選択のプロセスを繰り返す。
変数command-alternatives
には、commandの実装候補がalistで含まれる。この変数がセットされるまで、define-alternatives
は効果をもたない。
customizationsが非nil
の場合は、defcustom
キーワード(典型的には:group
および:version
)と、command-alternatives
の宣言に追加する値により構成される候補である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コマンドループはキーシーケンスをコマンドに翻訳した後、関数command-execute
を使用してその関数を呼び出します。そのコマンドが関数の場合、command-execute
は引数を読み取りコマンドを呼び出すcall-interactively
を呼び出します。自分でこれらの関数を呼び出すこともできます。
このコンテキストにおいて用語“command”はインタラクティブにコール可能な関数(または関数likeなオブジェクト)やキーボードマクロを指すことに注意してください。つまりコマンドを呼び出すキーシーケンスのことではありません(Keymapsを参照)。
この関数はobjectがコマンドの場合はt
、それ以外はnil
をリターンする。
コマンドには文字列とベクター(キーボードマクロとして扱われる)、トップレベルinteractive
フォーム(Using interactive
を参照)を含むラムダ式、そのようなラムダ式から作成されたバイトコンパイル関数オブジェクト、interactiveとして宣言(autoload
の4つ目の引数が非nil
)されたautoloadオブジェクト、およびいくつかのプリミティブ関数が含まれる。interactive-form
プロパティが非nil
のシンボル、および関数定義がcommandp
を満足するシンボルもコマンドとされる。
for-call-interactivelyが非nil
の場合は、call-interactively
が呼び出すことができるオブジェクトにたいしてのみcommandp
はt
をリターンする。したがってキーボードマクロは該当しなくなる。
commandp
を使用する現実的な例は、Access to Documentation Strings内のdocumentation
を参照のこと。
この関数はinteractive呼び出し仕様にしたがって引数を取得し、インタラクティブに呼び出し可能な関数commandを呼び出す。これはcommandがリターンするものが何であれ、それをリターンする。
たとえば、もし以下の署名をもつ関数がある場合:
(defun foo (begin end) (interactive "r") ...)
以下を行うと
(call-interactively 'foo)
これはリージョン(point
とmark
)を引数としてfoo
を呼び出すだろう。
commandが関数でない、またはインタラクティブに呼び出せない(コマンドでない)場合は、エラーをシグナルする。たとえコマンドだとしても、キーボードマクロ(文字列かベクター)は、関数ではないので、許されないことに注意。commandがシンボルの場合、call-interactively
はそれの関数定義を使用する。
record-flagが非nil
の場合は、このコマンドとコマンドの引数は無条件にリストcommand-history
に追加される。それ以外では、引数の読み取りにミニバッファーを使用した場合のみコマンドが追加される。Command Historyを参照のこと。
引数keysが与えられた場合、それはコマンドを呼び出すためにどのイベントを使用するかコマンドが問い合わせた場合に与えるべき、イベントシーケンスを指定するベクターである。keysがnil
、または省略された場合のデフォルトは、this-command-keys-vector
のリターン値である。Definition of this-command-keys-vectorを参照のこと。
この関数はcommandを実行する。引数commandは述語commandp
を満足しなければならない。つまりインタラクティブに呼び出し可能な関数かキーボードマクロでなければならない。
commandが文字列かベクターの場合は、execute-kbd-macro
により実行される。関数はrecord-flagおよびkeys引数とともにcall-interactively
に渡される(上記参照)。
commandがシンボルの場合、その位置にシンボルの関数定義が使用される。autoload
定義のあるシンボルは、インタラクティブに呼び出し可能な関数お意味するよう宣言されている場合は、コマンドとして判断される。そのような宣言は、指定されたライブラリーのロードと、シンボル定義の再チェックにより処理される。
引数specialが与えられた場合、それはプレフィクス引数を無視して、それをクリアーしないという意味である。これはスペシャルイベント(Special Eventsを参照)を実行する場合に使用される。
この関数はcompleting-read
(Completionを参照)を使用して、ミニバッファーからコマンド名を読み取る。その後、指定されたコマンドを呼び出すためにcommand-execute
を使用する。そのコマンドがリターンするのが何であれ、それがexecute-extended-command
の値となる。
そのコマンドがプレフィクス引数を求める場合は、prefix-argumentのの値を受け取る。execute-extended-command
がインタラクティブに呼び出された場合は、カレントのrawプレフィクス引数がprefix-argumentに使用され、それが何であれ実行するコマンドに渡される。
通常、execute-extended-command
はM-xの定義なので、プロンプトとして文字列‘M-x ’を使用する(execute-extended-command
を呼び出したイベントからプロンプトを受け取るほうが良いのだろうが、実装は骨が折れる)。プレフィクス引数の値の説明が、もしあれば、それもプロンプトの一部となる。
(execute-extended-command 3) ---------- Buffer: Minibuffer ---------- 3 M-x forward-word RET ---------- Buffer: Minibuffer ---------- ⇒ t
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
interactive呼び出しのときは、コマンドが(エコーエリア内の情報メッセージなどのような)視覚的な追加フィードバックを表示すべきときがあります。これを行うためには、3つの方法があります。その関数がcall-interactively
を使用して呼び出されたかどうかテストするには、オプション引数print-message
を与えるとともに、interactive呼び出しで非nil
となるようにinteractive
仕様を使うのが推奨される方法です。以下は例です:
(defun foo (&optional print-message) (interactive "p") (when print-message (message "foo")))
数プレフィクス引数は決してnil
にならないので、わたしたちは"p"
を使用します。この方法で定義された関数は、キーボードマクロから呼び出されたときにメッセージを表示します。
追加引数による上記の手法は、呼び出し側に“この呼び出しをinteractiveとして扱うように”伝えることができるので、通常は最善です。しかし、called-interactively-p
.をテストすることにより、これを行うこともできます。
この関数は、呼び出された関数がcall-interactively
を使用して呼び出された場合はt
をリターンする。
引数kindはシンボルinteractive
かシンボルany
のどちらかである。これがinteractive
の場合、called-interactively-p
はユーザーから直接呼び出しが行われたとき
—
たとえば関数呼び出しにバインドされたキーシーケンスをユーザーがタイプした場合がそれに該当するが、ユーザーがその関数を呼び出すキーボードマクロ(Keyboard Macrosを参照)を実行中した場合は該当しない —
だけt
をリターンするkindがany
の場合、called-interactively-p
はキーボードマクロを含む任意の種類のinteractive呼び出しにたいしてt
をリターンする。
疑わしい場合はany
を使用すること。interactive
の使用が正しいと解っているのは、関数が実行中に役に立つメッセージを表示するかどうか判断が必要な場合だけである。
Lisp評価(またはapply
やfuncall
))を通じて呼び出された、または場合、関数は決してインタラクティブに呼び出されたとは判断されない。
以下はcalled-interactively-p
を使用する例である:
(defun foo () (interactive) (when (called-interactively-p 'any) (message "Interactive!") 'foo-called-interactively))
;; M-x fooとタイプする
-| Interactive!
(foo) ⇒ nil
以下はcalled-interactively-p
の直接呼び出しと間接呼び出しを比較した例である。
(defun bar () (interactive) (message "%s" (list (foo) (called-interactively-p 'any))))
;; M-x barとタイプする
-| (nil t)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エディターコマンドループは、自分自身と実行するコマンドのために、いくつかのLisp変数にステータス記録を保持します。this-command
およびlast-command
以外は、一般的にこれらの変数をLispプログラム内で変更するのは、良いアイデアではありません。
この変数は、コマンドループにより実行された以前のコマンド(前にカレントだったコマンド)の名前を記録する。値は通常、関数定義をもつシンボルだが、その保証はない。
コマンドがコマンドループからリターンするとき、this-command
から値がコピーされる。ただしそのコマンドが、後続のコマンドにたいしてプレフィクス引数を指定されたときを除く。
この変数は常にカレント端末にたいしてローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。
この変数はEmacsによりlast-command
と同様にセットアップされるが、Lispプログラムから決して変更されない。
この変数は、入力イベントと一部としではなく、もっとも最近実行されたコマンドを格納する。これはコマンドrepeat
が再実行を試みるコマンドである。Repeating in The GNU Emacs Manualを参照のこと。
この変数は、コマンドループにより現在実行中のコマンドの名前を記録する。last-command
と同様、通常は関数定義をもつシンボルである。
コマンドループはコマンドを実行する直前にこの変数をセットして、(そのコマンドが後続のコマンドのプレフィクス引数を指定しない場合)そのコマンドが終了したときに、その値をlast-command
内にコピーする。
いくつかのコマンドは、次に実行されるコマンドが何であれ、それにたいするフラグとして、実行中の間この変数をセットする。特にテキストをkillする関数はthis-command
をkill-region
にセットするので、直後に実行された任意のkillコマンドは、killしたテキストを前にkillされたテキストに追加すべきことが解かるだろう。
特定のコマンドにおいて、エラーが発生した場合に前のコマンドとして認識されたくない場合は、これを防ぐようにそのコマンドをコーディングしなければならない。これを行う1つの方法は、以下のようにコマンドの最初でthis-command
にt
をセットして、最後にthis-command
に正しい値をセットする方法である:
(defun foo (args…)
(interactive …)
(let ((old-this-command this-command))
(setq this-command t)
… 処理を行う …
(setq this-command old-this-command)))
エラーの場合、let
は古い値をリストアするので、わたしたちはlet
でthis-command
をバインドしない。この場合におけるlet
の機能は、わたしたちが避けたいと思っていることを正確に行ってしまうだろう。
コマンドのリマップ(Remapping Commandsを参照)が発生したときを除き、これはthis-command
と同じ値をもつ。リマップが発生した場合、this-command
は実際に実行されたコマンド、this-original-command
は実行を指定されたが他のコマンドにリマップされたコマンドを与える。
この関数は、現在のコマンドを呼び出したキーシーケンスと、加えてそのコマンドにたいするプレフィクス引数を生成した前のコマンドを含む文字列またはベクターをリターンする。read-event
を使用するコマンドにより、タイムアウトせずに読み取られた任意のイベントは最後に加えられる。
しかし、そのコマンドがread-key-sequence
を呼び出していた場合は、最後に読み取られたキーシーケンスをリターンする。Key Sequence Inputを参照のこと。シーケンス内のすべてのイベントが文字列として適当な文字の場合は、文字列が値になる。Input Eventsを参照のこと。
(this-command-keys)
;; これを評価するためにC-u C-x C-eを使用すると、
⇒ "^U^X^E"
this-command-keys
と同様だが、常にベクターでイベントをリターンするので、入力イベントを文字列内に格納する複雑さを処理する必要がない(Putting Keyboard Events in Stringsを参照)。
この関数は、this-command-keys
がリターンするイベントテーブルを空にする。keep-recordがnil
の場合は、その後に関数recent-keys
(Recording Input)がリターンするレコードも空にする。これは特定のケースにおいて、パスワードを読み取った後、次のコマンドの一部として不用意にパスワードがエコーされるのを防ぐために有用である。
この変数はキーシーケンス(マウスメニューからのイベントは勘定しない)の一部として読み取られた最後の入力イベントを保持する。
この変数の1つの使い方は、x-popup-menu
にたいしてどこにメニューをポップアップすべきか告げる場合である。これは内部的にy-or-n-p
(Yes-or-No Queriesを参照)にも使用されている。
この変数には、コマンドの一部としてコマンドループに読み取られた、最後の入力イベントがセットされる。この変数は主に、self-insert-command
内でどの文字が挿入されたか判断するために使用されている。
last-command-event
;; これを評価するためにC-u C-x C-eを使用すると、
⇒ 5
C-eのASCIIコードの5が値になる。
この変数は、最後の入力イベントが送られたフレームを記録する。これは通常、そのイベントが生成されたときに選択されていたフレームだが、そのフレームの入力が他のフレームにリダイレクトされていた場合は、そのリダイレクトされていたフレームが値となる。Input Focusを参照のこと。
最後のイベントがキーボードマクロ由来の場合、値はmacro
になる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プロパティdisplay
やcomposition
をmつテキストや、非表示のテキストシーケンスの中間でポイント値を表示するのは、簡単ではありません。したがって、コマンドが終了した後にコマンドループにリターンするとき、そのようなシーケンス中にポイントがある場合、コマンドループは通常ポイントをそのようなシーケンスの端に移動します。
変数disable-point-adjustment
をセットすることにより、コマンドはこの機能を抑制できます:
この変数が非nil
の場合は、コマンドがコマンドループにリターンするとき、コマンドループはこれらのテキストプロパティをチェックせず、これらのプロパティをもつシーケンスの外にポイントを移動しない。
コマンドループはそれぞれのコマンドを実行する前にこの変数をnil
にセットするので、あるコマンドがこれをセットしても、効果が適用されるのはそのコマンドにたいしてだけである。
この変数を非nil
にセットした場合、これらのシーケンス外にポイントを移動する機能は、完全にオフになる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsコマンドループは入力イベント(input events)のシーケンスを読み取ります。入力イベントとは、キーボードやマウスのアクティビティ、またはEmacsに送られるシステムイベントを表します。キーボードアクティビティにたいするイベントは文字、またはシンボルです。それ以外のイベントは、常にリストになります。このセクションでは、入力イベントの表現と意味について詳細を説明します。
この関数は、objectが入力イベント、またはイベント型の場合は、非nil
をリターンする。
イベント、またはイベント型として任意のシンボルが使用されるかもしれないことに注意。eventp
は、あるシンボルがLispコードによりイベントとして使用されることを意図しているか否か区別できない。そのかわりに、カレントEmacsセッション内で、そのシンボルが入力として読み取られたイベント内で実際に使用されているか否かを区別する。シンボルがまだそのように使用されていない場合、eventp
はnil
をリターンする。
20.7.1 Keyboard Events | 通常の文字 — 自身にシンボルされるキー。 | |
20.7.2 Function Keys | ファンクションキー — 名前をもつがシンボルではない。 | |
20.7.3 Mouse Events | マウスイベントの概観。 | |
20.7.4 Click Events | マウスボタンのプッシュとリリース。 | |
20.7.5 Drag Events | ボタンをリリースする前のマウス移動。 | |
20.7.6 Button-Down Events | ボタンがプッシュされて、まだリリースされていない状態。 | |
20.7.7 Repeat Events | ダブル、トリプルのクリック(またはドラッグ、ダウン) | |
20.7.8 Motion Events | ボタンを押さずに、マウスだけを移動する。 | |
20.7.9 Focus Events | フレーム間のマウス移動。 | |
20.7.10 Miscellaneous System Events | システムが生成可能なその他のイベント。 | |
20.7.11 Event Examples | マウスイベントの例。 | |
20.7.12 Classifying Events | イベントシンボル内の修飾キーを見つける。イベント型。 | |
20.7.13 Accessing Mouse Events | マウスイベントから情報抽出する関数。 | |
20.7.14 Accessing Scroll Bar Events | スクロールバーイベントから情報取得する関数。 | |
20.7.15 Putting Keyboard Events in Strings | 文字列内にキーボード文字イベントを配すための特別な配慮。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーボードから取得できる入力には2つの種類があります。それは通常のキーとファンクションキーです。通常のキーは文字に対応し、それらが生成するイベントはLisp内では文字で表現されます。文字イベントのイベント型は文字自身(整数)です。Classifying Eventsを参照してください。
入力文字イベントは0から524287までの基本コード(basic code)に加えて、以下の修飾ビット(modifier bits)の一部、またはすべてにより構成されます:
文字コードのビット 2**27 はメタキーが押下された状態で文字がタイプされたことを示す。
文字コードのビット 2**26 は非ASCIIコントロール文字を示す。
C-aのような非ASCIIコントロール文字は、自身が特別な基本コードをもつため、それらを示すためにEmacsは特別なビットを必要としない。つまりC-aのコードは単なる1である。
しかし、%のような非ASCIIとコントロールを組み合わせてタイプした場合、取得される数値は%に 2**26 を加えた値となる(端末が非ASCIIコントロール文字をサポートすると仮定する)。
文字コードのビット 2**25 はシフトキーが押下された状態でASCIIコントロール文字がタイプされたことを示す。
アルファベット文字にたいしては、基本コード自身が大文字か小文字かを示す。数字と句読点文字にたいしてシフトキーは、異なる基本コードをもつ完全に違う文字を選択する。可能な限りASCII文字として保つために、Emacsはこれらの文字にたいしてビット 2**25 を使用しない。
しかし、ASCIIはC-AとC-aを区別する方法を提供しないので、EmacsはC-Aにたいしてビット 2**25 を使用し、C-aには使用しない。
文字コードのビット 2**24 はハイパーキーが押下された状態で文字がタイプされたことを示す。
文字コードのビット 2**23 はスーパーキーが押下された状態で文字がタイプされたことを示す。
文字コードのビット 2**22 はアルトキーが押下された状態で文字がタイプされたことを示す(ほとんどのキーボードでAltとラベルされたキーは、実際にはアルトキーではなくメタキーとして扱われる)。
プログラム内での特定のビット数値の記述は避けるのが最善の方法です。文字の修飾ビットをテストするためには、関数event-modifiers
(Classifying Eventsを参照)を使用してください。キーバインディングを作成するときは、修飾ビットつきの文字にたいする読み取り構文を使用できます(‘\C-’、‘\M-’、...など)。define-key
でのキーバインディング作成では、文字を指定するために(control
hyper ?x)
のようなリストを使用できます(Changing Key Bindingsを参照)。関数event-convert-list
は、そのようなリストをイベント型に変換します(Classifying Eventsを参照)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ほとんどのキーボードにはファンクションキー(function
keys)があります。これは名前、または文字以外のシンボルをもつキーです。Emacs
Lispではファンクションキーはシンボルとして表現されます。そのシンボル名はファンクションキーのラベルの小文字です。たとえばF1とラベルされたキーを押下すると、シンボルf1
で表される入力イベントが生成されます。
ファンクションキーのイベント型は、イベントシンボルそれ自身です。Classifying Eventsを参照してください。
ファンクションキーにたいするシンボルネーミングの慣習には、以下のような特別なケースがいくつかあります:
backspace
、tab
、newline
、return
、delete
これらのキーは、ほとんどのキーボードにおいて特別にキーをもつ、一般的なASCIIコントロール文字に対応する。
ASCIIではC-iとTABは同じ文字である。端末がこれらを区別できる場合、Emacsは前者を整数の9、後者をシンボルtab
で表現することにより、Lispプログラムにこれらの違いを伝える。
ほとんどの場合、これら2つを区別するのは役に立たない。そのためlocal-function-key-map
(Keymaps for Translating Sequences of Eventsを参照)はtab
を9にマップするようセットアップされている。したがって文字コード9(文字C-i)へのキーバインディングはtab
にも適用される。このグループ内の他のシンボルも同様である。関数read-char
が、これらのイベントを文字に変換する場合も同様である。
ASCIIでは、BSは実際はC-hである。しかしbackspace
は文字コード8(BS)ではなく、文字コード127(DEL)に変換される。ほとんどのユーザーにとって、これは好ましいだろう。
left
、up
、right
、down
矢印カーソルキー
kp-add
、kp-decimal
、kp-divide
、…キーパッドキー(標準的なキーボードにおいては右側にある)。
kp-0
、kp-1
、…キーパッド数字キー。
kp-f1
、kp-f2
、kp-f3
、kp-f4
キーパッドPFキー。
kp-home
、kp-left
、kp-up
、kp-right
、kp-down
キーパッド矢印キー。Emacsは通常これらを非キーパッドのキーhome
、left
、…に変換する。
kp-prior
、kp-next
、kp-end
、kp-begin
、kp-insert
、kp-delete
通常は他の箇所にあるキーと重複するキーパッド追加キー。Emacsは通常これらを同じような名前の非キーパッドキーに変換する。
ファンクションキーにたいしても修飾キーALT、CTRL、HYPER、META、SHIFT、SUPERを使用できます。シンボル名のプレフィクスとしてこれらを表します:
アルト修飾。
コントロール修飾。
ハイパー修飾。
メタ修飾。
シフト修飾。
スーパー修飾。
したがって、METAを押下した場合のF3キーにたいするシンボルはM-f3
になります。複雑のプレフィクスを使用する場合は、アルファベット順に記述することを推奨します。とはいえ、キーバインディングが修飾されたファンクションキーを探す際、引数の順序は関係ありません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsは4つの種類のマウスイベントをサポートします。それはクリックイベント、ドラッグイベント、ボタンダウンイベント、モーションイベントです。すべてのマウスイベントはリストで表現されます。このリストのCARはイベント型です。イベント型はどのマウスボタンが関与するのか、それにたいしてどの修飾キーが使用されたかを示します。イベント型によりダブル、あるいはトリプルでボタンが押されたかを区別することもできます(Repeat Eventsを参照)。残りのリスト要素は、位置と時間の情報を提供します。
キーの照合においては、イベント型だけが問題になります。2つのイベントが同じコマンドを実行するためには、同じイベント型が必要です。実行されるコマンドはinteractiveのコード‘e’を使用して、これらのイベントの完全な値にアクセスできます。Code Characters for interactive
を参照してください。
マウスイベントで開始されたキーシーケンスはカレントバッファーではなく、マウスのあったウィンドウ内のバッファーのキーマップを使用して読み取られます。これはウィンドウ内でクリックすることによりそのウィンドウやそのウィンドウのバッファーが選択されることを意味しません。つまり、それは完全にそのキーシーケンスのコマンドバインディングの制御下にあるのです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ユーザーが同じ場所でマウスボタンを押してからリリース(release: 離す)すると、clickイベントが生成されます。すべてのマウスクリックイベントは同じフォーマットを共有します:
(event-type position click-count)
これはマウスボタンが使用されたことを示す。これはシンボルmouse-1
、mouse-2
、…のうちのどれかで、マウスボタンは左から右に番号が付される。
ファンクションキーにたいして行うのと同様にアルト、コントロール、ハイパー、メタ、シフト、スーパーの修飾にたいしてプレフィクス‘A-’、‘C-’、‘H-’、‘M-’、‘S-’、‘s-’も使用できる。
このシンボルは、イベントのイベント型の役割りももつ。イベントのキーバインディングはこれらの型により示される。したがって、mouse-1
にたいするキーバインディングが存在する場合、そのバインディングはevent-typeがmouse-1
であるようなすべてのイベントに適用されるだろう。
これはマウスクリックがどこで発生したかを表すマウス位置リスト(mouse position list)である。詳細は以下を参照のこと。
これは同じマウスボタンを素早く繰り返し押下したときの回数である。Repeat Eventsを参照のこと。
クリックイベントのpositionスロット内にあるマウス位置リストの内容にアクセスするためには、一般的にはAccessing Mouse Eventsにドキュメントされている関数を使用するべきです。このリストの明示的なフォーマットは、どこでクリックが発生したかに依存します。テキストエリア、モードライン、ヘッダーライン、フリンジ、マージンエリアでのクリックにたいして、マウス位置リストは以下のフォーマットをもちます
(window pos-or-area (x . y) timestamp object text-pos (col . row) image (dx . dy) (width . height))
以下はこれらのリスト要素がもつ意味です:
クリックが発生したウィンドウ。
テキストエリア内でクリックされた文字のバッファー位置。またはテキストエリア外がクリックされた場合は、クリックが発生したウィンドウエリア。これはシンボルmode-line
、header-line
、vertical-line
、left-margin
、right-margin
、left-fringe
、right-fringe
のどれか。
特別な場合の1つとして、pos-or-areaが単なるシンボルではなく、(上記シンボルのいずれか1つの)シンボルを含むリストの場合がある。これはEmacsにより登録されたイベントにたいする、イマジナリープレフィクスキー(imaginary prefix key)の後に発生する。Key Sequence Inputを参照のこと。
クリックの相対ピクセル座標(relative pixel
coordinates)。あるウィンドウのテキストエリア内でのクリックにたいする座標原点(0
. 0)
は、テキストエリアの左上隅となる。Window Sizesを参照のこと。モードラインまたはヘッダーライン内でのクリックにたいする座標原点は、そのウィンドウ自身の左上隅となる。フリンジ、マージン、垂直ボーダー(vertical
border)では、xな有意なデータをもたない。フリンジ、マージンでは、yはヘッダーラインの最下端からの相対位置である。すべてのケースにおいてxおよびy座標は右方向および下方向で増加する。
そのイベントが発生した時刻を、システム依存の初期時刻(initial time)からの経過ミリ秒で表す整数。
クリック位置に文字列タイプのテキストプロパティが存在しない場合はnil
、存在する場合は(string
. string-pos)形式のコンスセル:
クリックされた文字列。すべてのテキストプロパティを含む。
クリックが発生した文字列内の位置。
マージンエリアまたはフリンジにたいするクリックでは、そのウィンドウ内の対応する行内の最初の可視な文字のバッファー位置となる。他のイベントにたいしては、そのウィンドウ内のカレントバッファーの位置となる。
これらはx、yの位置にあるグリフ(gliph)の、実際の行と列の座標数値である。行xがその行の実際のテキストの最後の列を超える場合、colはデフォルトの文字幅をもつ仮想的な追加列数を加えた値が報告される。そのウィンドウがヘッダーラインをもつ場合、行0はヘッダーラインとなり、ヘッダーラインをもたない場合はテキストエリアの上端ラインが行0となる。ウィンドウのテキストエリアのクリックにたいしては、テキストエリアの左端列が列0となり、モードラインまたはヘッダーラインのクリックにたいしてはそのラインの左端が列0となる。フリンジまたは垂直ボーダーのクリックにたいしては、これらは有意なデータをもたない。マージンのクリックにたいしては、colはマージンエリアの左端、rowはマージンエリアの上端から測られる。
これはクリックが発生した場所のイメージオブジェクトである。クリックされた場所にイメージが存在しない場合はnil
、イメージがクリックされた場合はfind-image
によりリターンされるイメージオブジェクトである。
これらはobjectの左上隅(0
. 0)
からの相対的ピクセル座標である。objectがnil
の場合は、クリックされた文字グリフの左上隅からの相対座標である。
これらはobjectのピクセル幅とピクセル高さであり、objectがnil
の場合はクリックされた文字グリフのピクセル幅とピクセル高さである。
スクロールバーへのクリックにたいして、positionは以下の形式をもちます:
(window area (portion . whole) timestamp part)
スクロールバーがクリックされたウィンドウ。
これはシンボルvertical-scroll-bar
である。
スクロールバーの上端からクリック位置までのピクセル数。GTK+を含むいくつかのツールキットでは、Emacsがこれらのデータを抽出できないので、値は常に0
となる。
スクロールバーの全長のピクセル数。GTK+を含むいくつかのツールキットでは、Emacsがこれらのデータを抽出できないので、値は常に0
となる。
イベントが発生したミリ秒時刻。GTK+を含むいくつかのツールキットでは、Emacsがこれらのデータを抽出できないので、値は常に0
となる。
クリックが発生したスクロールバー部分。これはシンボルhandle
(スクロールバーのハンドル)、above-handle
(ハンドルの上側エリア)、below-handle
(ハンドルの下側エリア)、up
(スクロールバー端の上矢印)、down
(スクロールバー端の下矢印)のいずれかである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsでは、特別なことをしなくてもドラッグイベントを取得できます。ドラッグイベント(drag event)は、ユーザーがマウスボタンを押下して、ボタンをリリースする前に、マウスを異なる文字位置に移動すると毎回発生します。すべてのマウスイベントと同じように、ドラッグイベントはLispではリストで表現されます。このリストは以下のように、開始マウス位置と最終位置ぼ両方を記録します:
(event-type (window1 START-POSITION) (window2 END-POSITION))
ドラッグイベントにたいしては、シンボルevent-typeの名前に、プレフィクス‘drag-’が含まれます。たとえば、ボタン2を押下したままマウスをドラッグすると、drag-mouse-2
イベントが生成されます。このイベントの2つ目と3つ目の要素は、マウス位置リスト(Click Eventsを参照)としてドラッグの開始と終了の位置を与えます。任意のマウスイベントの2つ目の要素には、同じ方法でアクセスできます。しかし、ドラッグイベントは最初に選択されていたフレームの境界外で終了するかもしれません。この場合、3つ目の要素の位置リストに、ウィンドウのかわりにそのフレームが含まれます。
‘drag-’プレフィクスは、その後に‘C-’や‘M-’のような修飾キープレフィクスが続きます。
read-key-sequence
がキーバインディングをもたず、対応するクリックイベントにキーバインディングがあるようなドラッグイベントを受け取った場合、この関数はそのドラッグイベントをドラッグ開始位置でのクリックイベントに変更します。これは、もし望まなければクリックイベントとドラッグイベントを区別する必要がないことを意味します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
クリックイベントとドラッグイベントは、ユーザーがマウスボタンをリリースしたときに発生します。ボタンがリリースされるまでクリックとドラッグを区別することはできないので、リリース前にイベントが発生することはありません。
ボタンが押下されたらすぐに何か処理したい場合は、ボタンダウン(button-down)イベントを処理する必要があります11。これらはevent-typeのシンボル名に‘down-’が含まれることを除き、クリックイベントとまったく同じようなリストにより表現されます。‘down-’プレフィクスの後には、‘C-’や‘M-’のような修飾キープレフィクスが続きます。
関数read-key-sequence
は、コマンドバインディングをもたないボタンダウンイベントを無視します。したがって、Emacsコマンドループもこれらを無視します。これは、ボタンダウンイベントで何かしたい場合以外は、ボタンダウンイベントの定義について心配する必要がないことを意味します。ボタンダウンイベントを定義する通常の理由は、ボタンがリリースされるまで(モーションイベントを読み取ることにより)マウスモーションを追跡できるからです。Motion Eventsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マウスを移動せずに同じマウスボタンを素早く2回以上連続して押下すると、Emacsは2回目とそれ以降の押下にたいして、特別なリピート(repeat)マウスイベントを生成します。
もっとも一般的なリピートイベントは、ダブルクリック(double-click)イベントです。Emacsはボタンを2回クリックしたときに、ダブルクリックイベントを生成します。このイベントは、(すべてのクリックイベントが通常そうであるように)ボタンをリリースしたときに発生します。
ダブルクリックイベントのイベント型には、プレフィクス‘double-’が含まれます。したがって、metaを押しながら2つ目のマウスボタンをダブルクリックすると、LispプログラムにはM-double-mouse-2
が渡されます。ダブルクリックイベントがバインディングをもたない場合、対応する通常のクリックイベントのバインディングが実行に使用されます。したがって、実際に望んでいなければダブルクリック機能に注意を払う必要はありません。
ユーザーがダブルクリックを行うとき、Emacsはまず通常のクリックイベントを生成し、その後ダブルクリックイベントを生成します。したがって、ダブルクリックイベントのコマンドバインディングは、すでにシングルクリックイベントが実行された想定でデザインしなければなりません。つまりシングルクリックの結果から開始して、ダブルクリックの望むべき結果を生成しなければならないのです。
これはダブルクリックの意味合いが、シングルクリックの意味合いの何らかにもとづいて“構築”される場合は便利です。これはダブルクリックにたいするユーザーインターフェイスにおける推奨されるデザインプラクティスです。
ボタンをクリックした後もう一度ボタンを押下して、そのままマウス一般的を開始した場合、最終的にボタンをリリースしたときダブルドラッグ(double-drag)イベントが取得されます。このイベント型には単なる‘drag’のかわりに‘double-drag’が含まれます。ダブルドラッグイベントがバインディングをもたない場合、それがあたかも通常のドラッグイベントだったかのようにEmacsはかわりのバインディングを探します。
ダブルクリックまたはダブルドラッグイベントの前に、Emacsはユーザーが2回目にボタンを押したタイミングでダブルダウン(double-down)イベントを生成します。このイベント型には、単なる‘down’のかわりに‘double-down’が含まれます。ダブルダウンイベントがバインディングをもたない場合、それがあたかも通常のボタンダウンイベントだったかのようにEmacsはかわりのバインディングを探します。どちらの方法でもバインディングが見つからなかった場合、ダブルダウンイベントは無視されます。
要約すると、ボタンをクリックしてすぐにまた押したとき、Emacsは1回目のクリックにたいしてダウンイベントとクリックイベントを生成し、2回目に再度ボタンを押したときにダブルダウンイベント、そして最後にダブルクリックまたはダブルドラッグイベントを生成します。
ボタンを2回クリックした後もう一度押したとき、それらすべてが素早く連続で行われた場合、Emacsはトリプルダウン(triple-down)イベントと、その後続のトリプルクリック(triple-click)またはトリプルドラッグ(triple-drag)イベントを生成します。これらイベントのイベント型には、‘double’のかわりに‘triple’が含まれます。トリプルイベントがバインディングをもたない場合、Emacsは対応するダブルイベントに使用されるであろうバインディングを使用します。
ボタンを3回以上クリックした後、再度ボタンを押した場合、3回を超える押下にたいするイベントはすべてトリプルイベントになります。Emacsはクワドループル(quadruple: 4連)、クインティプル(quintuple: 5連)、...等のイベントにたいして個別のイベント型をもちません。しかし、ボタンが何回押下されたかを正確に見つけるために、イベントリストを調べることができます。
この関数はeventを誘因した連続したボタン押下の回数をリターンする。eventがダブルダウン、ダブルクリック、ダブルドラッグの場合、値は2である。eventがトリプルイベントの場合、値は3以上になる。eventが(リピートイベントではない)通常のマウスイベントの場合、値は1である。
リピートイベントを生成するためには、ほぼ同じスクリーン位置で連続でマウスボタンを押下しなければならない。double-click-fuzz
の値は、ダブルクリックを生成するために連続する2回のクリック間で、マウスが移動(水平および垂直)するかもしれない最大ピクセル数を指定する。
この変数はドラッグとみなされるマウスモーションの閾値でもある。
リピートイベントを生成するためには、連続するボタン押下のミリ秒間隔が、double-click-time
の値より小さくなければならない。double-click-time
をnil
にセットすると、複数回クリック検知が完全に無効になる。t
にセットすると、時間制限が取り除かれる。その場合、Emacsは位置だけで複数回クリックを検知する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsは、ボタンアクティビティが何もないマウスのモーション(motion: 動き)を記述するマウスモーション(mouse motion)イベントを生成するときがあります。マウスモーションイベントは、以下のようなリストにより表現されます:
(mouse-movement POSITION)
positionは、マウスカーソルのカレント位置を指定するマウス位置リスト(see section Click Events)です。ドラッグイベントの終了位置のように、この位置リストは最初に選択されていた境界外の位置を表すかもしれず、その場合はそのフレーム内のその位置のウィンドウが含まれる。
スペシャルフォームtrack-mouse
は、ボタン内でのモーションイベントの生成を有効にします。track-mouse
フォームの外側では、Emacsはマウスの単なるモーションにたいするイベントは生成せず、これらのイベントは発生しません。Mouse Trackingを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウシステムは、ユーザーにたいしてどのウィンドウがキーボード入力を受け取るか制御するための、一般的な方法を提供します。このウィンドウ選択はフォーカス(focus)と呼ばれます。Emacsのフレームを切り替えるためにユーザーが何かを行うと、それはフォーカスイベント(focus event)を生成します。フォーカスイベントの通常の定義はグローバルキーマップ内にあり、ユーザーが期待するようにEmacsで新たなフレームを選択するためのものです。See section Input Focusを参照してください。
フォーカスイベントは、以下のようにLispのリストで表現されます:
(switch-frame new-frame)
ここでnew-frameは切り替え先のフレームです。
Xウィンドウマネージャーには、あるウィンドウにマウスを移動するだけで、そこにフォーカスされるようにセットアップするものがいくつかあります。通常は、他の種類の入力が到着するまで、Lispプログラムがフォーカスの変更を知る必要はありません。Emacsはユーザーが新たなフレーム内で実際にキーボードのキーをタイプするかマウスボタンを押下したときしか、フォーカスイベントを生成しません。つまりフレーム間でマウスを移動させても、フォーカスイベントは生成されません。
キーシーケンスの途中におけるフォーカスイベントは、そのシーケンスを誤ったものにするかもしれません。そのため、Emacsは決してキーシーケンスの途中でフォーカスイベントを生成しません。ユーザーがキーシーケンスの途中(つまりプレフィクス引数の後)でフォーカスを変更した場合、複数イベントキーシーケンスの前か後にフォーカスイベントが到着するように、Emacsはフォーカスイベントを記録しておきます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他にもシステム内での出来事を表現するイベント型が少数あります。
(delete-frame (frame))
このイベントの種類は、ユーザーがウィンドウマネージャーに特定のウィンドウを削除するコマンドを与えたことを示し、Emacsのフレームにたいして発生する。
フレーム削除(delete-frame)
イベントの標準的な定義は、frameを削除する。
(iconify-frame (frame))
このイベントの種類は、ウィンドウマネージャーを使用してユーザーがframeをアイコン化したことを示す。標準的な定義はignore
である。これは、そのフレームがすでにアイコン化されているので、Emacsが行う必要のことは何もないからである。このイベント型の目的は、望むならこのようなイベントの追跡を可能にしておくためである。
(make-frame-visible (frame))
このイベントの種類は、ウィンドウマネージャーを使用してユーザーがframeを非アイコン化したことを示す。標準的な定義はignore
である。これは、そのフレームがすでに可視化されているので、Emacsが行う必要のことは何もないからである。
(wheel-up position)
(wheel-down position)
この種類のイベントは、マウスホイールを移動したことにより発生する。position要素は、そのイベント発生時のマウスカーソル位置を指定するマウス位置リスト(Click Eventsを参照)である。
この種類のイベントは、ある種のシステムでのみ発生する。いくつかのシステムでは、かわりにmouse-4
とmouse-5
が使用される。可搬性のあるコードとするためには、マウスホイールにたいしてどのイベント型が期待されるかを決定するためにmwheel.el内で定義されている変数mouse-wheel-up-event
およびmouse-wheel-down-event
を使用する。
(drag-n-drop position files)
この種類のイベントは、Emacs外部アプリケーション内でファイルグループが選択され、それがEmacsフレーム内にドラッグアンドドロップされたときに発生する。
要素positionは、そのイベント位置を記述しマウスクリックイベントで使用されるフォーマット(Click Eventsを参照)と同じである。要素filesはドラッグアンドドロップされたファイル名のリストである。通常は、それらのファイルをvisitすることにより、このイベントは処理される。
この種類のイベントは、現在のところある種のシステムでのみ生成される。
help-echo
この種類のイベントは、テキストプロパティhelp-echo
をもつバッファーテキスト部分上にマウスポインターが移動したときに生成される。生成されるイベントは以下の形式をもつ:
(help-echo frame help window object pos)
イベントパラメーターの正確な意味と、ヘルプテキストを表示するためにこれらのパラメーターを使用する方法は、Text help-echoで説明されているか
sigusr1
sigusr2
これらのイベントは、EmacsプロセスがシグナルSIGUSR1
およびSIGUSR2
を受け取ったときに生成される。シグナルは追加情報を運搬しないので、追加データは含まれない。これらのシグナルはデバッグに有用である(Entering the Debugger on an Errorを参照)。
ユーザーシグナルをcatchするためには、special-event-map
(Active Keymapsを参照)内で対応するイベントにバインドする。そのコマンドは引数なしで呼び出され、last-input-event
内の特定のシグナルイベントが利用できる。たとえば:
(defun sigusr-handler () (interactive) (message "Caught signal %S" last-input-event)) (define-key special-event-map [sigusr1] 'sigusr-handler)
シグナルハンドラーをテストするために、自身でEmacsにシグナルを送信できる:
(signal-process (emacs-pid) 'sigusr1)
language-change
この種類のイベントは、MS-Windows上で入力言語が変更されたときに生成される。これは通常、キーボードキーが異なる言語の文字でEmacsに送られることを意味する。生成されるイベントは、以下の形式をもつ:
(language-change frame codepage language-id)
ここでframeは言語が変更されたときカレントだったフレームであり、codepageは新たなコードページ番号(codepage
number)、language-idは新たな入力言語の数値IDである。codepageに対応するコーディングシステム(Coding Systemsを参照)は、cpcodepage
またはwindows-codepage
である。language-idを文字列に変更する(たとえばset-language-environment
のようなさまざまな言語依存機能にたいしこれを使用する)には、以下のようにw32-get-locale-info
関数を使用する:
;; 英語にたいする"ENU"のような言語の省略形を取得する (w32-get-locale-info language-id) ;; "English (United States)"のような ;; その言語の完全な英語名を取得する (w32-get-locale-info language-id 4097) ;; その言語の完全なローカライズ名を取得する (w32-get-locale-info language-id t)
キーシーケンスの途中、つまりプレフィクスキーの後にこれらのイベントの1つが到着した場合、複数イベントキー内ではなくその前または後にそのイベントが到着するように、Emacsはそのイベントを記録する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ユーザーが同じ場所でマウス左ボタンを押して離した場合、それは以下のようなイベントシーケンスを生成します:
(down-mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864320)) (mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864180))
コントロールキーを押したままユーザーがマウス第2ボタンを押してマウスをある行から次の行へドラッグした場合、以下のような2つのイベントが生成されます:
(C-down-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219)) (C-drag-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219) (#<window 18 on NEWS> 3510 (0 . 28) -729648))
メタキーとシフトキーを押したままユーザーがそのウィンドウのモードライン上でマウス第2ボタンを押して他ウィンドウへマウスをドラッグした場合、以下のようなイベントのペアーが生成されます:
(M-S-down-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844)) (M-S-drag-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844) (#<window 20 on carlton-sanskrit.tex> 161 (33 . 3) -453816))
全画面表示されていないフレームに入力フォーカスがあり、ユーザーがマウスをそのフレームのスコープ外へマウスを移動した場合、スペシャルフォームtrack-mouse
内では以下のようなイベントが生成されます:
(mouse-movement (#<frame *ielm* 0x102849a30> nil (563 . 205) 532301936))
SIGUSR1シグナルを処理するためにはインタラクティブ関数を定義して、それをsignal usr1
イベントシーケンスにバインドします:
(defun usr1-handler () (interactive) (message "Got USR1 signal")) (global-set-key [signal usr1] 'usr1-handler)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
すべてのイベントはイベント型(event type)をもちます。イベント型はキーバインディング目的でイベントをクラス分けします。キーボードイベントにたいするイベント型はイベント値と等しく、したがって文字のイベント型は文字、ファンクションキーシンボルのイベント型はそのシンボル自身です。リストであるようなイベントのイベント型は、そのリストのCAR内のシンボルです。したがって、イベント型は常にシンボルか文字です。
同じ型の2つのイベントはキーバインディングに関する限り同じです。したがって、それらは常に同じコマンドを実行します。これらが同じことを行う必要があるという意味ではありませんが、イベント全体を調べてから何を行うか決定するコマンドもいくつかあります。、たとえば、バッファー内でどこに作用するか決定するためにマウスイベントの場所を使用するコマンドもいくつかあります。
広範なイベントのクラス分けが役に立つときもあります。たとえば、他の修飾キーやマウスボタンが使用されたかとは無関係に、METAキーとともに呼び出されたイベントを尋ねたいと思うかもしれません。
関数event-modifiers
はevent-basic-type
は、そのような情報を手軽に取得するために提供されています。
この関数は、eventがもつ修飾子のリストをリターンする。この修飾子はシンボルでありshift
、control
、meta
、alt
、hyper
、super
が含まれる。さらにマウスイベントシンボルの修飾子リストには常にclick
、drag
、down
のいずれか1つが含まれる。ダブルイベントまたはトリプルイベントにはdouble
またはtriple
も含まれる。
引数eventはイベントオブジェクト全体、または単なるイベント型かもしれない。eventがカレントEmacsセッション内で入力として読み取られたイベント内で決して使用されないシンボルの場合は、実際にeventが変更されたときでも、event-modifiers
はnil
をリターンできる。
いくつか例を挙げる:
(event-modifiers ?a) ⇒ nil (event-modifiers ?A) ⇒ (shift) (event-modifiers ?\C-a) ⇒ (control) (event-modifiers ?\C-%) ⇒ (control) (event-modifiers ?\C-\S-a) ⇒ (control shift) (event-modifiers 'f5) ⇒ nil (event-modifiers 's-f5) ⇒ (super) (event-modifiers 'M-S-f5) ⇒ (meta shift) (event-modifiers 'mouse-1) ⇒ (click) (event-modifiers 'down-mouse-1) ⇒ (down)
クリックイベントにたいする修飾リストは明示的にclick
を含むが、イベントシンボル名自身は‘click’を含まない。
この関数はeventを記述するキー、またはマウスボタンをリターンする。event引数はevent-modifiers
の場合と同様。たとえば:
(event-basic-type ?a) ⇒ 97 (event-basic-type ?A) ⇒ 97 (event-basic-type ?\C-a) ⇒ 97 (event-basic-type ?\C-\S-a) ⇒ 97 (event-basic-type 'f5) ⇒ f5 (event-basic-type 's-f5) ⇒ f5 (event-basic-type 'M-S-f5) ⇒ f5 (event-basic-type 'down-mouse-1) ⇒ mouse-1
objectがマウス移動イベントの場合、この関数は非nil
をリターンする。
この関数は修飾子名リストと基本イベント型(basic event type)を、それらすべてを指定するイベント型に変換する。基本イベント型はそのリストの最後の要素でなければならない。たとえば、
(event-convert-list '(control ?a)) ⇒ 1 (event-convert-list '(control meta ?a)) ⇒ -134217727 (event-convert-list '(control super f1)) ⇒ C-s-f1
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションではマウスボタンやモーションイベント内のデータアクセスに役に立つ関数を説明します。同じ関数を使用してキーボードイベントデータにもアクセスできますが、キーボードイベントに不適切なデータ要素は0またはnil
になります。
以下の2つの関数は、マウスイベントの位置を指定するマウス位置リスト(see section Click Events)をリターンします。
これはeventの開始位置をリターンする。
eventがクリックイベントまたはボタンダウンイベントの場合、この関数はそのイベントの位置をリターンする。eventがドラッグイベントの場合は、そのドラッグの開始位置をリターンする。
これはeventの終了位置をリターンする。
eventがドラッグイベントの場合、この関数はユーザーがマウスボタンをリリースした位置をリターンする。eventがクリックイベントまたはボタンダウンイベントの場合、値はそのイベント固有の開始位置となる。
この関数はobjectが(Click Eventsに記述されたいずれかのフォーマットの)マウス位置リストの場合は非nil
、それ以外ではnil
をリターンする。
以下の関数は、引数にマウス位置リストをとり、そのリストのさまざまな部分をリターンします:
positionがあったウィンドウをリターンする。positionが最初イベントがあったフレーム外の位置を表す場合は、かわりにそのフレームをリターンする。
position内に記録されたウィンドウエリアをリターンする。そのウィンドウのテキストエリアでイベントが発生したときはnil
、それ以外ではイベントがどこで発生したかを識別するシンボルをリターンする。
position内のバッファー位置をリターンする。ウィンドウのテキストエリア、マージンエリア、フリンジでイベントが発生したときは、バッファー位置を識別する整数値、それ以外では値は未定義である。
position内のピクセル単位のxy座標を、コンスセル(x
. y)
でリターンする。これらはposn-window
により与えられるウィンドウにたいする相対座標である。
以下は、あるウィンドウのテキストエリア内のウィンドウ相対座標をフレーム相対座標に変換する方法を示す例である:
(defun frame-relative-coordinates (position) "POSITIONのフレーム相対座標をリターンする。 POSITIONはウィンドウのテキストエリアにあるものとする。" (let* ((x-y (posn-x-y position)) (window (posn-window position)) (edges (window-inside-pixel-edges window))) (cons (+ (car x-y) (car edges)) (+ (cdr x-y) (cadr edges)))))
この関数は、position内のバッファー位置にたいして推定される列と行を含むコンスセル(col
.
row)
をリターンする。リターン値は、positionにたいするxとyの値より計算され、そのフレームのデフォルト文字幅とデフォルト行高(行間スペースを含む)の単位で与えられる(そのため、実際の文字サイズが非デフォルト値の場合には、実際の行と列は、これらの計算された値とは異なるかもしれない)。
rowは、そのテキストエリアの上端から数えられることに注意すること。positionにより与えられるウィンドウがヘッダーライン(see section Window Header Lines)をもつ場合、そのヘッダーラインはrowの数に含まない。
position内の実際の行と列を、コンスセル(col
. row)
でリターンする。値はposition与えられるウィンドウの実際の行と列である。Click Eventsを参照のこと。positionが実際のポジション値を含まない場合、この関数はnil
をリターンする。この場合、おおよその値を取得するためにposn-col-row
を使用できる。
この関数は、タブ文字やイメージによるビジュアル列数のように、ディスプレイ上の文字のビジュアル幅を意味しない。標準的な文字単位の座標が必要n場合は、かわりにposn-col-row
を使用すること。
position内の文字列オブジェクトををnil
、またはコンスセル(string
. string-pos)
でリターンする。
position内のイメージオブジェクトをnil
、または(image ...)
でリターンする。
position内のイメージオブジェクト、または文字列オブジェクトをnil
、イメージ(image
...)
、またはコンスセル(string . string-pos)
でリターンする。
position内のオブジェクトの左上隅からのピクセル単位のxy座標を、コンスセル(dx
.
dy)
でリターンする。positionがバッファーテキストの場合は、その位置にもっとも近いバッファーテキストの相対位置をリターンする。
position内のオブジェクトのピクセル幅とピクセル高さを、コンスセル(width
. height)
でリターンする。positionがバッファー位置の場合は、その位置の文字のサイズをリターンする。
position内のタイムスタンプをリターンする。これはミリ秒で表されたイベント発生時刻である。
以下の関数は与えられた特定のバッファー、またはスクリーン位置により与えられる位置リストを計算します。上述の関数で、この位置リスト内のデータにアクセスできます。
この関数は位置pos in windowにたいする位置リストをリターンする。posのデフォルトはwindow内のポイントであり、windowのデフォルトは選択されたウィンドウである。
window内でposが不可視の場合、posn-at-point
はnil
をリターンする。
この関数は、指定されたフレームまたはウィンドウframe-or-window(デフォルトは選択されたウィンドウ)内のピクセル座標xとyに対応する位置情報をリターンする。xとyは、使用されたフレームまたはウィンドウにたいする相対座標である。wholeがnil
の場合、座標はウィンドウのテキストエリアにたいする相対座標であり、それ以外ではスクロールバー、マージン、フリンジを含むウィンドウエリア全体にたいする相対座標である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数は、スクロールバーイベントの解析に役立ちます。
この関数はスクロールバーで発生したスクロールバーイベントの位置の垂直位置割り合いをリターンする。値は位置の割り合いを表す2つの整数を含むコンスセル(portion
. whole)
である。
この関数は、(実質的には)ratioにtotalを乗じて、結果を整数に丸める。引数ratioは数字ではなく、scroll-bar-event-ratio
によりリターンされる典型的な値ペアー(num
. denom)
である。
この関数はスクロールバー位置をバッファー位置にスケーリングするのに便利である。以下のようにこれを行う:
(+ (point-min) (scroll-bar-scale (posn-x-y (event-start event)) (- (point-max) (point-min))))
スクロールバーイベントは、xy座標ペアーのかわりに割り合いを構成する2つの整数をもつことを思い出してほしい。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
文字列が使用される場所のほとんどにおいて、わたしたちはテキスト文字を含むもの、つまりバッファーやファイル内で見出すのと同種のものとして、文字列を概念化します。Lispプログラムはときおり、キーボード文字、たとえばキーシーケンスやキーボードマクロ定義かもしれないキーボード文字を概念的に含む文字列を使用します。しかし文字列内へのキーボード文字の格納は、歴史的な互換性の理由により複雑な問題であり、常に可能なわけではありません。
新たに記述するプログラムでは文字列内にキーボードイベントを格納しないことにより、これらの複雑さを扱うことを避けるよう推奨します。以下はこれを行う方法です:
lookup-key
およびdefine-key
の引数として使用するのでなければ、キーシーケンスにたいして文字列のかわりにベクターを使用する。たとえば、read-key-sequence
のかわりにread-key-sequence-vector
、this-command-keys
のかわりにthis-command-keys-vector
を使用できる。
define-key
に渡す場合でもベクターを使用する。
listify-key-sequence
(Miscellaneous Event Input Featuresを参照)を使用する。
複雑さはキーボード入力に含まれるかもしれない修飾ビットに起因します。メタ修飾以外の修飾ビットは文字列に含めることができず、メタ文字も特別な場合だけ許されます。
GNU
Emacsの初期のバージョンでは、メタ文字を128から255のコードで表していました。その頃は基本文字コードの範囲は0から127だったので、すべてのキーボード文字を文字列内に適合させることができました。Lispプログラムの多くは、特にdefine-key
やその種の関数の引数として文字列定数内にメタ文字を意味する‘\M-’を使用し、キーシーケンスとイベントシーケンスは常に文字列として表現されていました。
127を超えるより大きい基本文字コードと追加の修飾ビットにたいするサポートを加えたとき、わたしたちはメタ文字の表現を変更する必要がありました。現在では文字のメタ修飾を表すフラグは 2**27 であり、そのような値は文字列内に含めることができません。
プログラムで文字列定数内の‘\M-’をサポートするために、文字列内に特定のメタ文字を含めるための特別なルールがあります。以下は入力文字シーケンスとして文字列を解釈するためのルールです:
キーボード入力文字の文字列定数を構築するread-key-sequence
のような関数は、イベントが文字列内に適合しないときは文字列のかわりにベクターを構築するというルールにしたがいます。
文字列内で入力構文‘\M-’を使用すると、それは128から255の範囲のコード、つまり対応するキーボードイベントを文字列内に配すために変更するとき取得されるのと同じコードが生成されます。したがって文字列内のメタイベントは、それが文字列内にどのように配置されたかと無関係に一貫して機能します。
しかし、ほとんどのプログラムはこのセクションの冒頭の推奨にしたがって、これらの問題を避けるほうがよいでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
エディターコマンドループはキーシーケンスの読み取りに関数read-key-sequence
を使用し、この関数はread-event
を使用します。イベント入力にたいしてこれらの関数、およびその他の関数がLisp関数から利用できます。Temporary Displaysのmomentary-string-display
、およびWaiting for Elapsed Time or Inputのsit-for
も参照してください。端末の入力モードの制御、および端末入力のデバッグに関する関数と変数については、Terminal Inputを参照してください。
高レベル入力機能についてはMinibuffersを参照してください。
20.8.1 Key Sequence Input | キーシーケンスを読み取る方法。 | |
20.8.2 Reading One Event | イベントを1つだけ読み取る方法。 | |
20.8.3 Modifying and Translating Input Events | Emacsが読み取られたイベントを変更する方法。 | |
20.8.4 Invoking the Input Method | 入力メソッドを使用するイベントを読み取る方法。 | |
20.8.5 Quoted Character Input | 文字の指定をユーザーに問い合わせる。 | |
20.8.6 Miscellaneous Event Input Features | 入力イベントの最読み取りや破棄の方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コマンドループはread-key-sequence
を呼び出すことにより、キーシーケンスの入力を一度に読み取ります。Lisp関数もこの関数を呼び出すことができます。たとえばdescribe-key
はキーを説明するためにこの関数を使用します。
この関数はキーシーケンスを読み取り、それを文字列またはベクターでリターンする。この関数は完全なキーシーケンスに蓄積されるまで、つまりカレントでアクティブなキーマップを使用してプレフィクスなしでコマンドを指定するのに十分なキーシーケンスとなるまでイベントの読み取りを継続する(マウスイベントで始まるキーシーケンスは、カレントバッファーではなくマウスのあったウィンドウ内のバッファーのキーマップを使用して読み取られることを思い出してほしい)。
イベントがすべて文字で、それらがすべて文字列に適合する場合、read-key-sequence
は文字列をリターンする(Putting Keyboard Events in Stringsを参照)。それ以外の場合は文字、シンボル、リストなどすべての種類のイベントを保持できるベクターをリターンする。文字列またはベクターの要素は、キーシーケンス内のイベントである。
キーシーケンスのo読み取りには、そのイベントを変換するさまざまな方法が含まれる。Keymaps for Translating Sequences of Eventsを参照のこと。
引数promptはプロンプトとしてエコーエリアに表示される文字列か、プロンプトを表示しないnil
である。引数continue-echoが非nil
の場合、それは前のキーの継続としてそのキーをエコーすることを意味する。
通常、元となる大文字のイベントが未定義で、それと等価な小文字イベントが定義されている場合、大文字のイベントは小文字のイベントに変換される。引数dont-downcase-lastが非nil
の場合、それは最後のイベントを小文字に変換しないことを意味する。これはキーシーケンスを定義するときに適している。
引数switch-frame-okが非nil
の場合は、たとえ何かをタイプする前にユーザーがフレームを切り替えたとしても、この関数がswitch-frame
を処理すべきでないことを意味する。キーシーケンスの途中でユーザーがフレームを切り替えた場合、またはシーケンスの最初だがswitch-frame-okがnil
のときにフレームを切り替えた場合、そのイベントはカレントキーシーケンスの後に延期される。
引数command-loopが非nil
の場合は、そのキーシーケンスがコマンドを逐次読み取る何かによりa読み取られることを意味する。呼び出し側が1つのキーシーケンスだけを読み取る場合は、nil
を指定すべきである。
以下の例では、Emacsはエコーエリアにプロンプト‘?’を表示して、その後ユーザーがC-x C-fをタイプしている。
(read-key-sequence "?")
---------- Echo Area ---------- ?C-x C-f ---------- Echo Area ---------- ⇒ "^X^F"
関数read-key-sequence
はquitを抑制する。この関数による読み取りの間にタイプされたC-gは他の文字と同じように機能し、quit-flag
をaセットしない。Quittingを参照のこと。
これはread-key-sequence
と同様だが、キーシーケンスを常にベクターでリターンし、文字列では決してリターンしない点が異なる。Putting Keyboard Events in Stringsを参照のこと。
入力文字が大文字(またはシフト修飾をもつ)で、キーバインディングをもたないが、等価な小文字はキーバインディングをもつ場合、read-key-sequence
はその文字を小文字に変換します。lookup-key
はこの方法による大文字小文字変換を行わないことに注意してください。
入力を読み取った結果がシフト変換(shift-translation)されていたような場合、Emacsは変数this-command-keys-shift-translated
に非nil
値をセットします。シフト変換されたキーにより呼びだされたときは挙動を変更する必要があるLispプログラムは、この変数を調べることができます。たとえば、関数handle-shift-selection
はリージョンをアクティブ、または非アクティブにするか判断するためにこの変数の値を調べます(handle-shift-selectionを参照)。
この関数read-key-sequence
も、マウスイベントのいくつかを変換します。これはバインドされていないドラッグイベントをクリックイベントに変換し、バインドされていないボタンダウンイベントを完全に破棄します。さらにフォーカスイベントとさまざまなウィンドウイベントの再配置も行うため、これらのイベントはキーシーケンス中に他のイベントとともに決して出現しません。
モードラインやスクロールバーのようなウィンドウの特別な箇所でマウスイベントが発生したとき、そのイベント型は特別なことは何も示さず、マウスボタンと修飾キーの組み合わせを通常表すのと同じシンボルになります。ウィンドウの箇所についての情報はイベント内の別のどこか、すなわち座標に保持されています。しかしread-key-sequence
はこの情報を仮想的な“プレフィクスキー”に変換します。これらはすべてシンボルでありheader-line
、horizontal-scroll-bar
、menu-bar
、mode-line
、vertical-line
、vertical-scroll-bar
です。これらの仮想的なプレフィクスキーを使用してキーシーケンスを定義することにより、ウィンドウの特別な部分でのカウスクリックにたいして意味を定義できます。
たとえば、read-key-sequence
を呼び出した後にそのウィンドウのモードラインをマウスでクリックすると、以下のように2つのマウスイベントが取得されます:
(read-key-sequence "Click on the mode line: ") ⇒ [mode-line (mouse-1 (#<window 6 on NEWS> mode-line (40 . 63) 5959987))]
この変数の値は、そのEmacsセッション内で処理されたキーシーケンスの数である。これには端末からのキーシーケンスと、実行されるキーボードマクロにより読み取られたキーシーケンスが含まれる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
read-event
,read-char
、read-char-exclusive
は、コマンド入力にたいするもっとも低レベルの関数です。
この関数はコマンド入力の次のイベントを読み取り、リターンする。必要ならイベントが利用可能になるまで待機する。
リターンされるイベントはユーザーから直接のイベントかもしれないし、またはキーボードマクロからのイベントかもしれない。イベントはキーボードの入力コーディングシステム(Terminal I/O Encodingを参照)により復号されない。
オプション引数promptが非nil
の場合、それはエコーエリアにプロンプトとして表示される文字列である。nil
の場合、read-event
は入力待ちを示すメッセージを何も表示せず、エコーを行うことによりプロンプトの代用とする。エコーで表示されるのはカレントコマンドに至ったイベントや読み取られたイベントの説明である。The Echo Areaを参照のこと。
inherit-input-methodが非nil
の場合、(もしあれば)非ASCII文字の入力を可能にするためにカレントの入力メソッドが採用される。それ以外では、このイベントの読み取りにたいして入力メソッドの処理が無効になる。
cursor-in-echo-area
が非nil
の場合、read-event
はカーソルを一時的にエコーエリアの、そこに表示されているメッセージの終端に移動する。それ以外では、read-event
はカーソルを移動しない。
secondsが非nil
の場合、それは入力を待つ最大秒数を指定する数値である。その時間内に入力が何も到着しない場合、read-event
は待機を終えてnil
をリターンする。浮動小数点数secondsは待機する秒の分数を意味する。いくつかのシステムではサポートされるのは整数の秒数だけであり、そのようなシステムではsecondsは切り捨てられる。secondsがnil
の場合、read-event
は入力が到着するのに必要なだけ待機する。
secondsがnil
の場合、ユーザー入力が到着するのを待つ間、Emacsはアイドル状態にあるとみなされる。この期間中にアイドルタイマー
— run-with-idle-timer
(Idle Timersを参照) —
を実行できる。しかしsecondsが非nil
の場合には、非アイドル状態は変更されずに残る。read-event
が呼び出されたときEmacsが非アイドルだった場合、read-event
の処理を通じて非アイドルのままとなる。Emacsがアイドルだった場合(これはアイドルタイマー内部からその呼び出しが行われた場合に起こり得る)は、アイドルのままとまる。
read-event
がヘルプ文字として定義されたイベントを取得した場合、ある状況においてはread-event
がリターンせずに直接イベントを処理することがある。Help Functionsを参照のこと。その他のスペシャルイベント(special events)(Special Eventsを参照)と呼ばれる特定のイベントもread-event
で直接処理される。
以下はread-event
を呼び出してから右矢印キーを押下したとき何が起こるかの例である:
(read-event) ⇒ right
この関数はコマンド入力の文字を読み取り、それをリターンする。ユーザーが文字以外(たとえばマウスクリックやファンクションキー)のイベントを生成した場合、read-char
はエラーをシグナルする。引数はread-event
と同じように機能する。
1つ目の例では、ユーザーは文字1(ASCIIコード49)をタイプしている。2つ目の例では、eval-expression
を使用してミニバッファーからread-char
を呼び出すキーボード定義を示している。read-char
は、キーボードマクロの直後の文字1を読み取る。その後、eval-expression
はリターン値をエコーエリアに表示する。
(read-char) ⇒ 49
;; M-:を使用して以下を評価するものとする
(symbol-function 'foo)
⇒ "^[:(read-char)^M1"
(execute-kbd-macro 'foo) -| 49 ⇒ nil
この関数はコマンド入力の文字を読み取り、それをリターンする。ユーザーが文字以外のイベントを生成した場合、read-char-exclusive
はそれを無視して文字を取得するまで他のイベントを読み取る。引数はread-event
と同じように機能する。
上記でquitを抑制する関数はありません。
この変数は端末から受信した入力イベント(キーボードマクロにより生成されたイベントは勘定されない)の総数を保持する。
read-key-sequence
と異なり、関数read-event
、read-char
、read-char-exclusive
はKeymaps for Translating Sequences of Eventsで説明した変換を行わないことを強調しておきます。単一キー読み取りでこれらの変換を行いたい場合は、関数read-key
を使用してください。
この関数は1つのキーを読み取る。これはread-key-sequence
とread-event
の間の“中間的”な関数である。read-key-sequence
と異なるのは、キーシーケンスではなく単一キーを読み取ることである。read-event
と異なるのは、rawイベントをリターンせずにinput-decode-map
、local-function-key-map
、key-translation-map
(Keymaps for Translating Sequences of Eventsを参照)に合わせて復号と変換を行うことである。
引数promptはプロンプトとしてエコーエリアに表示する文字列で、nil
はプロンプトを表示しないことを意味する。
この関数は1つの文字を読み取りリターンするためにread-key
を使用する。これはchars(許容される文字のリスト)のメンバー以外の入力を無視する。オプションで、有効な入力を待つ間のquitイベントも無視する。read-char-choice
呼び出しの間にhelp-form
(Help Functionsを参照)を非nil
値にバインドした場合、help-char
の押下によりhelp-form
が評価され結果が表示される。その後、有効な入力文字、またはキーボードquitの待機を継続する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsはextra-keyboard-modifiers
に合わせて読み取ったすべてのイベントを変更して、read-event
からリターンする前に、(もし適切なら)keyboard-translate-table
を通じてそれを変換します。
この変数は、Lispプログラムにキーボード上の修飾キーを“押下”させる。値は文字である。文字の修飾子だけが対象となる。ユーザーがキーボードのキーを押下するたびに、その修飾キーがすでに押下されたかのように処理される。たとえば、extra-keyboard-modifiers
を?\C-\M-a
にバインドした場合、このバインディングのスコープ内にある間、すべてのキーボード入力文字はコントロール修飾とメタ修飾を適用されるだろう。文字?\C-@
は0と等価なので、この目的にたいしてはコントロール文字として勘定されないが、修飾無しの文字として扱われる。したがってextra-keyboard-modifiers
を0にセットすることにより、すべての修飾をキャンセルできる。
ウィンドウシステムを利用する場合は、この方法によりプログラムが任意の修飾キーを“押下”できる。それ以外はCTLとMETAのキーだけを仮想的に押下できる。
この変数は実際にキーボード由来のイベントだけに適用され、マウスイベントやその他のイベントには効果がないことに注意されたい。
この端末ローカルな変数はキーボード文字にたいする変換テーブルである。これによりコマンドバインディングを変更することなく、キーボード上のキーを再配置できる。値は通常、文字テーブル、またはnil
ある(文字列かベクターも指定できるが、時代遅れとされている)
keyboard-translate-table
が文字テーブル(Char-Tablesを参照)の場合、キーボードから読み取られたそれぞれの文字はその文字テーブルを調べる。非nil
の値が見つかった場合は、実際の入力文字のかわりにそれを使用する。
この変換は文字が端末から読み取られた後、最初に発生することに注意されたい。recent-keys
のような記録保持機能や文字を記録するdribbleファイルは、この変換の後に処理される。
さらに、この変換は入力メソッド(Input Methodsを参照)に文字を提供する前に行われることにも注意されたい。入力メソッド処理の後に文字を変換したい場合は、translation-table-for-input
(Translation of Charactersを参照)を使用すること。
この関数は文字コードfromを文字コードtoに変換するために、keyboard-translate-table
を変更する。
必要な場合は、キーボード変換テーブルを作成する。
以下はC-xでカット、C-でコピー、C-vでペーストを処理するようにkeyboard-translate-table
を使用する例です:
(keyboard-translate ?\C-x 'control-x) (keyboard-translate ?\C-c 'control-c) (keyboard-translate ?\C-v 'control-v) (global-set-key [control-x] 'kill-region) (global-set-key [control-c] 'kill-ring-save) (global-set-key [control-v] 'yank)
拡張ASCII入力をサポートするグラフィカルな端末上では、シフトキーとともにタイプすることにより、標準的なEmacsにおける意味をこれらの文字から依然として取得することが可能です。これはキーボード変換が関与する文字とは異なりますが、それらは通常と同じ意味をもちます。
read-key-sequence
のレベルでイベントシーケンスを変換するメカニズムについては、Keymaps for Translating Sequences of Eventsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
イベント読み取り関数は、もしあればカレント入力メソッドを呼び出します(Input Methodsを参照)。input-method-function
の値が非nil
の場合、関数を指定します。read-event
が修飾ビットのないプリント文字(SPCを含む)を読み取ったときは、その文字を引数としてその関数を呼び出します。
これが非nil
の場合、その値はカレントの入力メソッド関数を指定する。
警告:
この変数はlet
でバインドしてはならない。この変数はしばしばバッファーローカルであり、入力の前後(これは正にあなたがバインドするであろうタイミングである)でバインドした場合、Emacsが待機中に非同期にバッファーを切り替えると誤ったバッファーに値がリストアされるだろう。
入力メソッド関数は、入力として使用されるイベントのリストをリターンするべきです(このリストがnil
の場合、それは入力がないことを意味するので、read-event
他のイベントを待機する)。これらのイベントはunread-command-events
(Miscellaneous Event Input Featuresを参照)内のイベントの前に処理されます。入力メソッドによりリターンされるイベントは、たとえそれらが修飾ビットのないプリント文字であっても、再度入力メソッドに渡されることはありません。
入力メソッド関数がread-event
またはread-key-sequence
を呼び出した場合は、再帰を防ぐために最初にinput-method-function
をnil
にバインドするべきです。
キーシーケンスの2つ目および後続のイベントを読み取るときは、入力メソッド関数は呼び出されません。したがって、それらの文字は入力メソッドの処理対象ではありません。入力メソッド関数はoverriding-local-map
とoverriding-terminal-local-map
の値をテストするべきです。これらの変数のいずれかが非nil
の場合、入力メソッドは引数をリストにputして、それ以上の処理を行わずにそのリストをリターンするべきです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ユーザーが手軽にコントロール文字やメタ文字。リテラルや8進文字コードを指定できるように、文字の指定をもとめることができます。コマンドquoted-insert
この関数を使用します。
この関数はread-char
同様だが、最初に読み取った文字が8進数
(0–7)の場合は任意の個数の8進数(8進数以外の文字を見つけた時点でストップする)を読み取り、その文字コードにより表される文字をリターンする。8進シーケンスを終端させた文字がRETの場合、それは無視される。他の終端文字は、この関数がリターンした後に入力として使用される。
最初の文字の読み取り時はquitは抑制されるので、ユーザーははC-gを入力できる。Quittingを参照のこと。
promptが与えられた場合、それはユーザーへのプロンプトに使用する文字列を指定する。プロンプト文字列は、その後の1つの‘-’とともに常にエコーエリアに表示される。
以下の例では、ユーザーは8進数の177(10進数の127)をタイプしている。
(read-quoted-char "What character")
---------- Echo Area ---------- What character 1 7 7- ---------- Echo Area ---------- ⇒ 127
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、イベントを使い切ることなく“先読み”する方法、および入力の保留や保留の破棄の方法について説明します。Reading a Passwordの関数read-passwd
も参照してください。
この変数はコマンド入力として読み取り待機中のイベントのリストを保持する。イベントはこのリスト内の出現順に使用され、使用されるごとにリストから取り除かれる。
ある関数がイベントを読み取ってそれを使用するかどうか決定する場合がいくつかあるので、この変数が必要になる。この変数にイベントを格納すると、コマンドループおよにコマンド入力を読み取る関数により、イベントは通常のように処理される。
たとえば、数引数を実装する関数は、任意の個数の数字を読み取る。数字イベントが見つからないとき、関数はそのイベントを読み戻す(unread)ので、そのイベントはコマンドループにより通常通り読み取られることができる。同様に、インクリメンタル検索は、検索において特別な意味をもたないイベントを読み戻すために、この機能を使用する。なぜなら、それらのイベントは検索をexitして、通常どおり実行されるべきだからである。
unread-command-events
にイベントを置くためにキーシーケンスからイベントを抽出するには、listify-key-sequence
(以下参照)を使用するのが簡単で信頼のおける方法である。
もっとも最近読み戻したイベントが最初に再読み取りされるように、このリストの先頭にイベントを追加するのが通常である。
通常このリストから読み取ったイベントは、そのイベントが最初に読み取られたときにすでに一度追加されたときのように、カレントコマンドのキーシーケンスに(たとえばthis-command-keys
にリターンされたとみのように)追加される。フォーム(t . event)
の要素は、カレントコマンドのキーシーケンスにeventを強制的に追加する。
この関数は文字列またはベクターのkeyを、unread-command-events
置くことができる個別のイベントのリストに変換する。
この関数は、コマンド入力がカレントで読み取り可能かどうか判断する。入力が利用可能なら即座にt
を、それ以外はnil
をリターンする。非常に稀だが、入力が利用できないときにt
オプション引数check-timersが非nil
の場合、Emacsは順部位ができたら任意のタイマーを実行する。Timers for Delayed Executionを参照のこと。
この変数は最後に読み取られた端末入力イベントがコマンドの一部なのか、それともLispプログラムによる明示的なものなのかを記録する。
以下の例では、文字1(ASCIIコード49)をLispプログラムが読み取っている。C-e(C-x
C-eは式を評価するコマンドとする)がlast-command-event
に値として残っている間は、それがlast-input-event
の値となる。
(progn (print (read-char)) (print last-command-event) last-input-event) -| 49 -| 5 ⇒ 49
この構成はbodyフォームを実行して、入力が何も到着しない場合だけ最後のフォームの値をリターンする。bodyフォームを実行する間に何らかの入力が到着した場合は、それらの入力をする(quitのように機能する)。while-no-input
フォームは実際のquitによりabortした場合はnil
、入力の到着によりabortした場合はt
をリターンする。
bodyの一部でinhibit-quit
を非nil
にバインドした場合、その部分の間に到着した入力は、その部分が終わるまでabortしない。
両方のabort条件をbodyにより計算されたすべての可能な値で区別できるようにしたい場合は、以下のようにコードを記述する:
(while-no-input (list (progn . body)))
この関数は端末入力バッファーの内容を破棄して定義処理中かもしれないキーボードマクロをキャンセルする。この関数はnil
をリターンする。
以下の例では、フォームの評価開始直後にユーザーが数字か文字をタイプするかもしれない。sleep-for
がスリープを終えた後、discard-input
はスリープ中にタイプされた文字を破棄する。
(progn (sleep-for 2) (discard-input)) ⇒ nil
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
特定のスペシャルイベント(special
event)は、読み取られると即座に非常に低レベルで処理されます。read-event
関数はそれらのイベントを自身で処理して、それらを決してリターンしません。かわりに、スペシャルイベント以外の最初のイベントを待ち、それをリターンします。
スペシャルイベントはエコーされず、決してキーシーケンスにグループ化されず、last-command-event
や(this-command-keys)
の値として出現することもありません。スペシャルイベントは数引数を破棄し、unread-command-events
による読み戻しができず、キーボードマクロ内に出現することもないでしょうし、キーボードマクロ定義中にキーボードマクロに記録されることもありません。
しかし、スペシャルイベントは読み取られた直後にlast-input-event
内に出現するので、これがイベント定義にたいして実際のイベントを探す方法になります。
イベント型iconify-frame
、make-frame-visible
、delete-frame
、drag-n-drop
、language-change
、およびsigusr1
ようなユーザーシグナルは通常この方法により処理されます。何がスペシャルイベントで、スペシャルイベントをどのように処理するかを定義するキーマップは、変数special-event-map
(Active Keymapsを参照)の中にあります。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
待機関数(wait
function)は特定の時間が経過するか、入力があるまで待機するようにデザインされています。たとえば、計算の途中でユーザーがディスプレイを閲覧できるように一時停止したいときがあるかもしれません。sit-for
は一時停止して画面を更新、sleep-for
は画面を更新せずに一時停止して、入力が到着したら即座にリターンします。
この関数は、(ユーザーからの保留中入力がない場合は)再描画を行ってから、seconds秒、または入力が利用可能になるまで待機する。sit-for
の通常の目的は、ディスプレイしたテキストをユーザーが読み取る時間を与えるためである。入力が何も到着せず(Miscellaneous Event Input Featuresを参照)、時間をフルに待機した場合はt
、それ以外はnil
が値となる。
引数secondsは整数である必要はない。浮動小数点数の場合、sit-for
は秒の少数点数を待機する。整数の秒だけをサポートするいくつかのシステムでは、secondsは切り捨てられる。
保留中の入力が存在しない場合、式(sit-for
0)
は遅延なしに再描画をリクエストする(redisplay)
と等価である。Forcing Redisplayを参照のこと。
nodispが非nil
の場合sit-for
は再描画を行わないが、それでも入力が利用可能になると(またはタイムアウト時間が経過すると)即座にリターンする。
バッチモード(Batch Modeを参照)では、たとえ標準入力ディスクリプタからの入力でも割り込みできまい。これは以下で説明するsleep-for
でも同じである。
(sit-for seconds millisec
nodisp)
のように、3つの引数でsit-for
を呼び出すことも可能だが時代遅れだと考えられている。
この関数は表示を更新せず、単にseconds秒間一時停止する。これは利用可能な入力に注意を払わない。この関数はnil
をリターンする。
引数secondsは整数である必要はない。浮動小数点数の場合、sleep-for
は秒の少数点数を待機する。整数の秒だけをサポートするいくつかのシステムでは、secondsは切り捨てられる。
オプション引数millisecはミリ秒単位で追加の待機期間を指定する。これはsecondsで指定された期間に追加される。システムが小数点の秒数をサポートしない場合、非0のmillisecを指定するとエラーとなる。
遅延を保証したい場合はsleep-for
を使用する。
現在時刻を取得する関数については、Time of Dayを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lisp関数を実行中にC-gをタイプすると、Emacsが何を行っていてもEmacsをquit(中止、終了)させます。これはアクティブなコマンドループの再内に制御がリターンすることを意味します。
コマンドループがキーボード入力待機中にC-gをタイプしてもquitはしません。これは通常の入力文字として機能します。もっともシンプルなケースでは、通常C-gはquitの効果をもつkeyboard-quit
を実行するので、区別できませんしかしプレフィクスキーの後のC-gは、未定義のキー組み合わせになります。これはプレフィクスキーやプレフィクスキーも同様にキャンセルする効果をもちます。
ミニバッファー内では、C-gは異なる定義をもち、それはミニバッファーをabort(失敗、中止、中断)します。これは実際にはミニバッファーをexitしてquitします(単にquitするのはミニバッファー内のコマンドループにリターンするだろう)。C-gがなぜコマンドリーダーが入力読み取り時に直接quitしないかという理由は、ミニバッファー内でC-gの意味をこの方法により再定義可能にするためです。プレフィクスキーの後のC-gはミニバッファー内で再定義されておらず、プレフィクスキーおよびプレフィクス引数のキャンセルという通常の効果をもちます。もしC-ggヴぁ常に直接quitするなら、これは不可能でしょう。
C-gが直接quitを行うときは、変数quit-flag
をt
にセットすることによりそれを行います。Emacsは適切なときにこの変数をチェックして、nil
でない場合はquitします。どのような方法でも、quit-flag
を非nil
にセットするとquitが発生します。
Cコードのレベルでは、どこでもquitを発生させることはできず、quit-flag
をチェックする特別な場所でのみquitが発生します。この理由は、他の場所でquitすると、Emacsの内部状態が矛盾が生じるかもしれないからです。安全な場所までquitが遅延されるので、quitがEmacsをクラッシュさせることがなくなります。
read-key-sequence
やread-quoted-char
のような特定の関数は、たとえ入力を待機中でもquitを抑制します。quitするかわりに、C-gは要求された入力として処理されます。read-key-sequence
の場合、これはコマンドループ内でのC-gの特別な振る舞いを引き起こすのに役立ちます。read-quoted-char
の場合、これはC-gをクォートするのにC-qを使用できるようにします。
変数inhibit-quit
を非nil
値にバインドすることにより、Lisp関数の一部でquitを抑止できます。その場合は、quit-flag
をt
にセットされていても、C-gの通常の結果であるquitは抑止されます。let
フォームの最後でこのバインディングがunwindされるなどして、結果としてinhibit-quit
は再びnil
になります。このときquit-flag
がnil
の場合には、即座に要求されたquitが発生します。この挙動は、プログラム中の“クリティカルセクション”内でquitが発生しないことを確実にしたいときに理想的です。
(read-quoted-char
のような)いくつかの関数では、quitを起こさない特別な方法でC-gが処理されます。これはinhibit-quit
をt
にバインドして入力を読み取り、再びinhibit-quit
がnil
になる前にquit-flag
をnil
にセットすることにより行われます。以下は、これを行う方法を示すためのread-quoted-char
の抜粋です。この例は入力の最初の文字の後で通常のquitを許す方法も示しています。
(defun read-quoted-char (&optional prompt)
"…documentation…"
(let ((message-log-max nil) done (first t) (code 0) char)
(while (not done)
(let ((inhibit-quit first)
…)
(and prompt (message "%s-" prompt))
(setq char (read-event))
(if inhibit-quit (setq quit-flag nil)))
… 変数code
をセット …)
code))
この変数が非nil
でinhibit-quit
がnil
の場合、macsは即座にquitする。C-gをタイプすると、通常はinhibit-quit
とは無関係にquit-flag
を非nil
にセットする。
この変数は、quit-flag
が非nil
にセットされているときEmacsがquitするかどうかを決定する。inhibit-quit
が非nil
の場合、quit-flag
は特に効果がない。
このマクロはbodyを順番に実行するが、たとえこの構成の外部でinhibit-quit
が非nil
でも、少なくともローカルにbody内でのquitを許す。このマクロはquitによりexitした場合はnil
、それ以外はbody内の最後のフォームの値をリターンする。
inhibit-quit
がnil
の場合with-local-quit
へのエントリーでbodyだけが実行され、quit-flag
をセットすることにより通常のquitが発生する。しかし通常のquitが遅延されるようにinhibit-quit
が非nil
にセットされている場合、非nil
のquit-flag
は特別な種類のローカルquitを引き起こす。これはbodyの実行を終了して、quit-flag
を非nil
のままでwith-local-quit
ボディーをexitするので、許され次第(通常の)他のquitが発生する。bodyの先頭ですでにquit-flag
が非nil
の場合、即座にローカルquitが発生して結局ボディーは実行されない。
このマクロは主にタイマー、プロセスフィルター、プロセスセンチネル、pre-command-hook
、post-command-hook
、およびinhibit-quit
が通常はt
にバイドされている場所で役に立つ。
この関数は(signal 'quit
nil)
によりquit
条件をシグナルする。これはquitが行うことと同じである(Errorsのsignal
を参照)。
quitに使用するC-g以外の文字を指定できます。Input Modes内の関数set-input-mode
を参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ほとんどのEmacsコマンドはプレフィクス引数(prefix
argument)を使用できます。プレフィクス引数はコマンド自身の前に数字を指定するものです(プレフィクス引数とプレフィクスキーを混同しないように)。プレフィクス引数は常に値により表され、nil
のときはカレントでプレフィクス引数が存在しないことを意味します。すべてのコマンドはプレフィクス引数を使用するか、あるいは無視します。
プレフィクス引数には2つの表現があります。それはraw(生の、加工していない、原料のままの、未加工の)と数字(numeric)です。エディターコマンドループは内部的にraw表現を使用し、Lisp変数もその情報を格納するのにこれを使用しますが、コマンドはどちらかの表現を要求できます。
以下は利用できるrawプレフィクス引数の値です:
nil
はプレフィクス引数がないことを意味する。これの数値的な値は1だが、多くのコマンドはnil
と整数1を区別する。
-
。これは後に数字をともなわないM--かC-u
-がタイプされたことを示す。数値的に等価な値は-1だが、整数の-1をシンボルの-
を区別するコマンドがいくつかある。
以下の関数をさまざまなプレフィクスで呼び出して、これらの可能なプレフィクスを説明しましょう:
(defun display-prefix (arg) "rawプレフィクス引数の値を表示する。" (interactive "P") (message "%s" arg))
以下はさまざまなrawプレフィクス引数でdisplay-prefix
を呼び出した結果です:
M-x display-prefix -| nil C-u M-x display-prefix -| (4) C-u C-u M-x display-prefix -| (16) C-u 3 M-x display-prefix -| 3 M-3 M-x display-prefix -| 3 ; (C-u 3
と同じ) C-u - M-x display-prefix -| - M-- M-x display-prefix -| - ; (C-u -
と同じ) C-u - 7 M-x display-prefix -| -7 M-- 7 M-x display-prefix -| -7 ; (C-u -7
と同じ)
Emacsにはプレフィクス引数を格納するための2つの変数prefix-arg
とcurrent-prefix-arg
があります。他のコマンドにたいしてプレフィクス引数をセットアップするuniversal-argument
のようなコマンドは、プレフィクス引数をprefix-arg
内に格納します。対照的にcurrent-prefix-arg
はカレントコマンドにプレフィクス引数を引き渡すので、これらの変数をセットしても将来のコマンドにたいするプレフィクス引数に効果はありません。
コマンドは通常はinteractive
内で、プレフィクス引数にたいしてrawと数値のどちらの表現を使用するかを指定します(Using interactive
を参照)。そのかわりに関数は変数current-prefix-arg
内のプレフィクス引数の値を直接調べるかもしれませんが、これは明確さで劣ります。
この関数はargの有効なrawプレフィクス引数の数値的な意味をリターンする。引数はシンボル、数字、またはリストかもしれない。これがnil
の場合は、値1がリターンsare,-
の場合は-1がリターンされる。これが数字の場合は、その数字がリターンされる。リスト(数字であるべき)の場合は、そのリストのCARがリターンされる。
この変数はカレントのコマンドにたいするrawプレフィクス引数を保持する。コマンドはこの変数を直接調べるかもしれないが、この変数にたいするアクセスには通常は(interactive
"P")
を使用する。
この変数の値は次の編集コマンドにたいするrawプレフィクス引数である。後続のコマンドにたいしてプレフィクス引数を指定するuniversal-argument
のようなコマンドは、この変数をセットすることにより機能する。
rawプレフィクス引数の値は、前のコマンドにより使用された値である。
以下のコマンドは、後続のコマンドにたいしてプレフィクス引数をセットアップするために存在します。これらを他の用途で呼び出さないでください。
このコマンドは入力を読み取り。後続のコマンドにたいするプレフィクス引数を指定する。何をしているかわかっているのでなければ、このコマンドを自分で呼び出してはならない。
このコマンドは、後続のコマンドにたいしてプレフィクス引数を追加する。引数argはこのコマンドの前のrawプレフィクス引数であり、これはプレフィクス引数を更新するために使用される。何をしているかわかっているのでなければ、このコマンドを自分で呼び出してはならない。
このコマンドは、次のコマンドにたいして数引数を追加する。引数argはこのコマンドの前のrawプレフィクス引数であり、この値に負の符号が付されて新しいプレフィクス引数を構築する。何をしているかわかっているのでなければ、このコマンドを自分で呼び出してはならない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsスタートアップ時に、自動的にEmacsコマンドループにエンターします。このトップレベルのコマンドループ呼び出しは決してexitせず、Emacs実行中は実行を続けます。Lispプログラムもコマンドループを呼び出せます。これは複数のコマンドループを活性化するため、これを再帰編集(recursive editing)と呼んでいます。再帰編集レベルは、呼び出したコマンドが何であれそれをサスペンドして、そのコマンドを再開する前にユーザーが任意の編集を行うことを可能にする効果をもちます。
再帰編集の間に利用可能なコマンドは、トップレベルの編集ループ内で利用できるコマンドと同じであり、キーマップ内で定義されます。数少ない特別なコマンドだけが再帰編集レベルをexitし、他のコマンドは再帰編集レベルが終了したときに再帰編集レベルからリターンします(exitするための特別なコマンドは常に利用できますが、再帰編集が行われていないときは何も行いません)。
再帰コマンドループを含むすべてのコマンドループは、コマンドループから実行されたコマンド内のエラーによりそのループをexitしないように、汎用エラーハンドラーをセットアップします。
ミニバッファー入力は、特殊な再帰編集です。これは、ミニバッファーとミニバッファーウィンドウの表示を有効にするなどの欠点をもちますが、それはあなたが思うより少ないでしょう。ミニバッファー内では特定のキーの振る舞いが異なりますが、これははミニバッファーのローカルマップによるものです。ウィンドウを切り替えれば、通常のEmacsコマンドを使用できます。
再帰編集レベルを呼び出すには、関数をrecursive-edit
を呼び出します。この関数はコマンドループを含んでいます。さらにexit
をthrowすることにより再帰編集レベルのexitを可能にする、タグexit
をともなうcatch
呼び出しも含んでいます(Explicit Nonlocal Exits: catch
and throw
を参照)。t
以外の値をthrowした場合、recursive-edit
は通常それを呼び出した関数にリターンします。コマンドC-M-c(exit-recursive-edit
)がこれを行います。値t
をthrowすることによりrecursive-edit
がquitされるので、1レベル上位のコマンドループに制御がリターンされます。これはabortと呼ばれ、C-](abort-recursive-edit
)がこれを行います。
ほとんどのアプリケーションはミニバッファー使用の一部として使用する場合を除き、再帰編集を使用するべきではありません。カレントバッファーのメジャーモードから、特殊なメジャーモードに一時的に変更する場合に、そのモードに戻るコマンドをもつ必要があるときは、通常は再帰編集のほうが便利です(Rmailのeコマンドはこのテクニックを使用している)。またはユーザーが新たなバッファーの特殊なモードで、異なるテキストを“再帰的”に編集・作成・選択できるようにしたい場合が該当します。このモードでは処理を完了させるコマンドを定義して、前のバッファーに戻ります(Rmailのmコマンドはこれを使用している)。
再帰編集はデバッグに便利です。一種のブレークポイントとして関数定義内にdebug
を挿入して、関数がそこに達したときにその箇所を調べることができます。debug
は再帰編集を呼び出しますが、デバッガのその他の機能も提供します。
query-replace
内でC-rをタイプしたときやC-x
q(kbd-macro-query
)を使用したときも、再帰編集レベルが使用されます。
この関数はエディターコマンドループを呼び出す。これはユーザーに編集を開始させるために、Emacsの初期化により自動的に呼び出されるLispプログラムから呼び出されたときは、再帰編集レベルにエンターする。
カレントバッファーが選択されたウィンドウのバッファーと異なる場合、recursive-edit
はカレントバッファーの保存とリストアを行う。それ以外では、バッファーを切り替えた場合には、recursive-edit
がリターンした後その切り替えたバッファーがカレントになる。
以下の例では、関数simple-rec
が最初にポイントを1単語分進めてからメッセージをエコーエリアにプリントして再帰編集にエンターする。その後ユーザーは望む編集を行い、C-M-cをタイプすれば再帰編集をexitして、simple-rec
の実行を継続できる。
(defun simple-rec () (forward-word 1) (message "Recursive edit in progress") (recursive-edit) (forward-word 1)) ⇒ simple-rec (simple-rec) ⇒ nil
この関数は最内の再帰編集(ミニバッファー入力を含む)からexitする。関数の実質的な定義は(throw 'exit nil)
である。
この関数は、再帰編集をexitした後にquit
をシグナルすることにより、最内の再帰編集(ミニバッファー入力を含む)を要求したコマンドをabortする。関数の実質的な定義は(throw
'exit t)
である。Quittingを参照のこと。
この関数はすべての再帰編集レベルをexitする。これはすべての計算を直接抜け出してメインのコマンドループに戻り、値をリターンしない。
この関数は再帰編集のカレントの深さをリターンする。アクティブな再帰編集が存在しない場合は、0をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コマンドを無効化(disabling a command)とは、それを実行可能にする前にユーザーによる確認を要求するようにコマンドをマークすることです。無効化は初めてのユーザーを混乱させるかもしれないコマンドにたいして、アクシデントによりそのコマンドが使用されるのを防ぐために使用されます。
コマンド無効化の低レベルにおけるメカニズムは、そのコマンドにたいするLispシンボルのdisabled
プロパティに非nil
をputすることです。これらのプロパティは、通常はユーザーのinitファイル(The Init Fileを参照)で以下のようなLisp式によりセットアップされます:
(put 'upcase-region 'disabled t)
いくつかのコマンドにたいしては、これらのプロパティがデフォルトで与えられています(これらを削除したい場合はinitファイルで削除できる)。
disabled
プロパティの値が文字列の場合、そのコマンドが無効化されていることを告げるメッセージにその文字列が含まれます。たとえば:
(put 'delete-region 'disabled "この方法で削除されたテキストはyankで戻せない!\n")
無効化されたコマンドをインタラクティブに呼び出したときに何が起こるかの詳細は、See Disabling in The GNU Emacs Manualを参照してください。コマンドの無効化は、それをLispプログラムから関数として呼び出したときは効果がありません。
その時点より、特別な確認なしでcommand(シンボル)が実行されることを許す。さらにユーザーのinitファイル(The Init Fileを参照)も修正するので、将来のセッションにもこれが適用される。
その時点より、command(シンボル)の実行に特別な確認を要求する。さらにユーザーのinitファイル(The Init Fileを参照)も修正するので、将来のセッションにもこれが適用される。
この変数の値は関数であること。ユーザーが無効化されたコマンドを呼び出したときは、無効化されたコマンドのかわりにその関数が呼び出される。そのコマンドを実行するためにユーザーが何のキーをタイプしたかを判断するためにthis-command-keys
を使用して、そのコマンド自体を探すことができる。
値がnil
の場合もあり得る。その場合は、たとえ無効化されたコマンドでも、すべてのコマンドが通常に機能する。
デフォルトでは、値はユーザーに処理を行うか尋ねる関数である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コマンドループは複雑なコマンドを手軽に繰り返せるように、実行された複雑なコマンドのヒストリー(history:
履歴)を保持します。複雑なコマンド(complex
command)とは、ミニバッファーを使用してinteractive引数を読み取るコマンドです。これにはM-xコマンド、M-:コマンド、およびinteractive
指定によりミニバッファーから引数を読み取る任意のコマンドが含まれます。コマンド自身の実行の間に明示的にミニバッファーを使用するものは、複雑なコマンドとは判断されません。
この変数の値は最近実行された複雑なコマンドのリストであり、それぞれが評価されるべきフォームとして表現される。このリストは編集セッションの間、すべての複雑なコマンドを蓄積するが、最大サイズ(Minibuffer Historyを参照)に達したときは、もっとも古い要素が削除されて、新たな要素が追加される。
command-history ⇒ ((switch-to-buffer "chistory.texi") (describe-key "^X^[") (visit-tags-table "~/emacs/src/") (find-tag "repeat-complex-command"))
実際には、このヒストリーリストはミニバッファーヒストリーの特殊ケースであり、それは要素が文字列ではなく式であることです。
以前のコマンドを編集したり再呼び出しするためのコマンドがいくつかあります。コマンドrepeat-complex-command
およびlist-command-history
は、ユーザーマニュアルで説明されています(Repetition in The GNU Emacs Manualを参照)。ミニバッファー内では、通常のミニバッファーヒストリーコマンドが理由できます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーボードマクロ(keyboard macro)は、コマンドとして考えることが可能な、入力イベントの記録されたシーケンスであり、キー定義により作成されます。キーボードマクロのLisp表現は、イベントを含む文字列またはベクターです。キーボードマクロとLispマクロ(Macrosを参照)を混同しないでください。
この関数は、イベントシーケンスとしてkbdmacroを実行する。kbdmacroが文字列かベクターの場合、たとえそれがユーザーによる入力であっても、その中のイベントは忠実に実行される。シーケンスは、単一のキーシーケンスであることを要求されない。キーボードマクロ定義は、通常は複数のキーシーケンスを結合して構成される。
kbdmacroがシンボルの場合、そのシンボルの関数定義はkbdmacroの箇所に使用される。それが別のシンボルの場合は、このプロセスを繰り返す。最終的に結果は文字列かベクターになる。結果がシンボル、文字列、ベクターでない場合は、エラーがシグナルされる。
引数countは繰り返すカウントであり、kbdmacroがその回数実行される。countが省略、またはnil
の場合は1回実行される。0の場合、kbdmacroはエラーに出会うか検索が失敗するまで、何度も実行される。
loopfuncが非nil
の場合、それはマクロの繰り返しごとに呼び出される、引数なしの関数である。loopfuncがnil
をリターンすると、マクロの実行が停止する。
execute-kbd-macro
の使用例は、Reading One Eventを参照のこと。
この変数は、カレントで実行中のキーボードマクロを定義する文字列かベクターである。nil
の場合、カレントで実行中のマクロは存在しない。マクロの実行により実行されたときに異なる振る舞いをするように、コマンドはこの変数をテストできる。この変数を自分でセットしてはならない。
この変数は、キーボードマクロの定義中のときだけ非nil
である。マクロ定義中の間は異なる振る舞いをするように、コマンドはこの変数をテストできる。既存のマクロ定義に追加する間、値はappend
になる。コマンドstart-kbd-macro
、kmacro-start-macro
、end-kbd-macro
は、この変数をセットする。この変数を自分でセットしてはならない。
この変数は常にカレント端末にたいしてローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。
この変数は、もっとも最近定義されたキーボードマクロの定義である。値は文字列、ベクター、またはnil
である。
この変数は常にカレント端末にたいしてローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。
これはキーボードマクロが終了したときに実行されるノーマルフックであり、何がキーボードマクロを終了させたか(マクロの最後に達したのか、あるいはエラーにより最後に達する前に終了したのか)は問わない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
入力イベントのコマンドバインディングは、キーマップ(keymap)と呼ばれるデータ構造に記録されます。キーマップ内の各エントリーは個別のイベント型(他のキーマップ、またはコマンド)に関連づけ(またはバインド)されます。イベント型がキーマップにバインドされる場合、そのキーマップは次の入力イベントを調べるために使用されます。これはコマンドが見つかるまで継続されます。このプロセス全体をキールックアップ(key lookup: キー照合)と呼びます。
21.1 Key Sequences | Lispオブジェクトとしてのキーシーケンス。 | |
21.2 Keymap Basics | キーマップの基本概念。 | |
21.3 Format of Keymaps | キーマップはLispオブジェクトとしてどのように見えるか。 | |
21.4 Creating Keymaps | キーマップを作成、コピーする関数。 | |
21.5 Inheritance and Keymaps | キーマップが他のキーマップのバインディングを継承する方法。 | |
21.6 Prefix Keys | キーマップの定義としてキーを定義する。 | |
21.7 Active Keymaps | Emacsがアクティブなキーマップでキーバインディングを探す方法。 | |
21.8 Searching the Active Keymaps | アクティブなマップ検索のLisp処理概要。 | |
21.9 Controlling the Active Keymaps | 各バッファーは標準(グローバル)のバインディングをオーバーライドするためのキーマップをもつ。マイナーモードもそれらをオーバーライドできる。 | |
21.10 Key Lookup | 1つのキーマップから、あるキーのバインディングを探す。 | |
21.11 Functions for Key Lookup | キールックアップを要求する方法。 | |
21.12 Changing Key Bindings | キーマップ内でのキーの再定義。 | |
21.13 Remapping Commands | キーマップはあるコマンドを他のコマンドに変換できる。 | |
21.14 Keymaps for Translating Sequences of Events | イベントシーケンスを変換するキーマップ。 | |
21.15 Commands for Binding Keys | キーの再定義にたいするインタラクティブなインターフェイス。 | |
21.16 Scanning Keymaps | ヘルプをプリントするためにすべてのキーマップを走査する。 | |
21.17 Menu Keymaps | キーマップとしてキーマップを定義する。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーシーケンス(key
sequence)、短くはキー(key)とは、1つの単位を形成する1つ以上の入力イベントのシーケンスです。入力イベントには文字、ファンクションキー、マウスアクション、またはiconify-frame
のようなEmacs外部のシステムイベントが含まれます(Input Eventsを参照)。キーシーケンスにたいするEmacs
Lispの表現は文字列かベクターです。特に明記しない限り、引数としてキーシーケンスを受け取るEmacs
Lisp関数は両方の表現を処理することができます。
文字列表現では、たとえば、"a"
はa、"2"
は2を表すといったように、英数字はその文字自身を意味します。コントロール文字イベントは部分文字列"\C-"
、メタ文字は"\M-"
によりプレフィクスされます。たとえば"\C-x"
はキーC-xを表します。それらに加えて、TAB、RET、ESC、DELなどのイベントはそれぞれ"\t"
、"\r"
、"\e"
、"\d"
で表されます。複雑なキーシーケンスの文字列表現は、イベント成分の文字列表現を結合したものです。したがって"\C-xl"
はキーシーケンスC-x
lを表します。
キーシーケンスにはファンクションキー、マウスボタンイベント、システムイベント、またはC-=やH-aのような文字列で表現できない非ASCII文字が含まれます。これらはベクターとして表現される必要があります。
ベクター表現ではベクターの各要素は1つの入力イベントをイベントのLisp形式で表します。Input Eventsを参照してください。たとえば、ベクター[?\C-x ?l]
はキーシーケンスC-x lを表します。
キーシーケンスを文字列やベクターによる表現で記述する例は、Init Rebinding in The GNU Emacs Manualを参照してください。
この関数はテキストkeyseq-text(文字列定数)をキーシーケンス(文字列かベクターの定数)に変換する。keyseq-textの内容はC-x
C-k RET(kmacro-edit-macro
)
コマンドにより呼び出されたバッファー内と同じ構文を使用するべきであ特にファンクションキーの名前は‘<…>’で囲まなければならない。Edit
Keyboard Macro in The GNU Emacs Manualを参照のこと。
(kbd "C-x") ⇒ "\C-x" (kbd "C-x C-f") ⇒ "\C-x\C-f" (kbd "C-x 4 C-f") ⇒ "\C-x4\C-f" (kbd "X") ⇒ "X" (kbd "RET") ⇒ "\^M" (kbd "C-c SPC") ⇒ "\C-c " (kbd "<f1> SPC") ⇒ [f1 32] (kbd "C-M-<down>") ⇒ [C-M-down]
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーマップは、さまざまなキーシーケンスにたいしてキーバインディング(key binding)を指定するLispデータ構造です。
1つのキーマップが、個々のイベントにたいする定義を直接指定します。 A single keymap directly specifies definitions for individual events. 単一のイベントでキーシーケンスが構成されるとき、そのキーシーケンスのキーマップ内でのバインディングは、そのイベントにたいするそのキーマップの定義です。それより長いキーシーケンスのバインディングは対話的プロセスにより見つけ出されます。まず、最初のイベント(これ自身がキーマップでなければならない)の定義を探します。次にそのキーマップ内で2つ目のイベントを探すといったように、そのキーシーケンス内のすべてのイベントが処理されるまで、これを続けます。
あるキーシーケンスのバインディングがキーマップであるような場合、わたしたちはそのキーシーケンスをプレフィクスキー(prefix
key)と呼び、それ以外の場合は(それ以上イベントを追加できないので)コンプリートキー(complete
keylと呼んでいます。バインディングがnil
の場合、わたしたちはそのキーを未定義(undefined)と呼びます。C-c、C-x、C-x
4などはプレフィクスキーの例です。X、RET、C-x 4
C-fなどは定義されたコンプリートキーの例です。C-x C-gやC-c
3などは未定義なコンプリートキーの例です。詳細はPrefix Keysを参照してください。
キーシーケンスのバインディングを見つけ出すルールは、(最後のイベントの前までに見つかる)中間的なバインディングがすべてキーマップであると仮定します。もしそうでなければ、そのイベントシーケンスは単位を形成せず、実際の単一キーシーケンスではありません。他の言い方をすると、任意の有効なキーシーケンスから1つ以上のイベントを取り除くと、常にプレフィクスキーにならなければなりません。たとえばC-f C-nはキーシーケンスではありません。C-fはプレフィクスキーではないので、C-fで始まるこれより長いシーケンスは、キーシーケンスであり得ないのです。
利用可能な複数イベントキーシーケンスのセットは、プレフィクスキーにたいするバインディングに依存します。したがって、これはキーマップが異なれば異なるかもしれず、バインディングが変更されたとき変更されるかもしれません。しかし、単一イベントキーシーケンスは適格性において任意のプレフィクスキーに依存しないので、常に単一のキーシーケンスです。
常に複数のプライマリーキーマップ(primary keymap: 主キーマップ)がアクティブであり、これらはキーバインディングを見つけるために使用されます。すべてのバッファーで共有されるグローバルキーマップ(global map)というキーマップが存在します。ローカルキーマップ(local keymap)は通常、特定のメジャーモードに関連します。そして0個以上のマイナーモードキーマップ(minor mode keymap)はカレントで有効なマイナーモードに属します(すべてのマイナーモードがキーマップをもつわけでなない)。ローカルキーマップは、対応するグローバルバインディングをshadow(優先される)します。マイナーモードキーマップは、ローカルキーマップとグローバルキーマップの両方をshadowします。詳細は、Active Keymapsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーマップはそれぞれ、CARがシンボルkeymap
であるようなリストです。このリストの残りの要素は、そのキーマップのキーバインディングを定義します。関数定義がキーマップであるようなシンボルもキーマップです。あるオブジェクトがキーマップかどうかテストするには、関数keymapp
(以下参照)を使用してください。
キーマップを開始するシンボルkeymap
の後には、いくつかの種類の要素が出現します:
(type . binding)
これは型typeのイベントにたいする1つのバインディングを指定する。通常のバインディングはそれぞれ、常に文字かシンボルであるような特定のイベント型(event type)のイベントに適用される。Classifying Eventsを参照のこと。この種のバインディングでは、bindingはコマンドである。
(type item-name . binding)
これは、メニュー内でitem-nameとして表示されるシンプルなメニューアイテムでもあるようなバインディングを指定する。Simple Menu Itemsを参照のこと。
(type item-name help-string . binding)
これは、ヘルプ文字列help-stringのシンプルなメニューアイテムである。
(type menu-item . details)
これは、拡張されたメニューアイテムでもあるようなバインディングを指定する。これは他の機能も使用できる。Extended Menu Itemsを参照のこと。
(t . binding)
これはデフォルトキーバインディング(default key
binding)を指定する。キーマップの他の要素でバインドされないイベントは、バインディングとしてbindingが与えられる。デフォルトバインディングにより、利用可能なすべてのイベント型を列挙することなくバインドできる。デフォルトバインディングをもつキーマップは、明示的にnil
にバインドされるイベント(以下参照)を除き、より低い優先度にあるすべてのキーマップをマスクする。
char-table
キーマップのある要素が文字テーブル(char-table)の場合、それは修飾ビットなしのすべての文字イベントにたいするバインディングを保持するとみなされる。 If an element of a keymap is a it counts as holding bindings for all character events with no modifier bits (see modifier bits): 要素nは、コードnの文字にたいするバインディングである。これは多量のバインディングを記録するための、コンパクトな方法である。そのような文字テーブルのキーマップは、fullキーマップ(full keymap: 完全なキーマップ)と呼ばれる。それにたいし他のキーマップはsparseキーマップ(sparse keymaps: 疎なキーマップ)と呼ばれる。
string
キーにたいするバインディングを指定する要素は別として、キーマップは要素として文字列ももつことができる。これはoverallプロンプト文字列(overall prompt string: 全般的なプロンプト文字列)と呼ばれ、メニューとしてキーマップを使用することを可能にする。Defining Menusを参照のこと。
(keymap …)
キーマップのある要素それ自身がキーマップの場合、それは外側のキーマップ内でこれが内側のキーマップとしてinline指定されているかのようにみなされる。これはmake-composed-keymap
内で行なわれるような多重継承にたいして使用される。
バインディングがnil
の場合、それは定義の構成要素ではありませんが、デフォルトバインディングや親キーマップ内のバインディングに優先されます。一方、nil
のバインディングは、より低い優先度のキーマップをオーバーライドしませんしたがって、ローカルマップでnil
のバインディングが与えられた場合、Emacsはグローバルマップのバインディングを使用します。
キーマップはメタ文字にたいするバインディングを直接記録しません。かわりに、メタ文字は1文字目がESC(または何であれmeta-prefix-char
のカレント値)の、2文字のキーシーケンスをルックアップするものとみなされます。したがって、キーM-aは内部的にESC
aで表され、そのグローバルバインディングは、esc-map
内のaにたいするスロットで見つけることができます(Prefix Keysを参照)。
この変換は文字にたいしてのみ適用され、ファンクションキーや他の入力イベントには適用されないので、M-endはESC endと何も関係ありません。
以下に例としてLispモードにたいするローカルキーマップ(sparseキーマップ)を挙げます。以下ではDEL、C-c C-z、C-M-q、C-M-xにたいするバインディングを定義しています(実際の値はメニューバインディングも含みますが、簡潔にするためここでは省略しています)。
lisp-mode-map ⇒
(keymap (3 keymap ;; C-c C-z (26 . run-lisp))
(27 keymap
;; C-M-xはESC C-xとして扱われる
(24 . lisp-send-defun))
;; この部分はlisp-mode-shared-map
から継承
keymap
;; DEL
(127 . backward-delete-char-untabify)
(27 keymap
;; C-M-qはESC C-qとして扱われる
(17 . indent-sexp)))
この関数は、objectがキーマップならt
、それ以外はnil
をリターンする。より正確には、この関数はリストにたいしてそのCARがkeymap
か、あるいはシンボルにたいしてその関数定義がkeymapp
かをテストする。
(keymapp '(keymap)) ⇒ t
(fset 'foo '(keymap)) (keymapp 'foo) ⇒ t
(keymapp (current-global-map)) ⇒ t
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下はキーマップを作成する関数です。
この関数はエントリーをもたない新たなsparseキーマップを作成して、それをリターンする(sparseキーマップは、あなたが通常望む類のキーマップのこと)。make-keymap
とは異なり、新たなキーマップは文字テーブルを含まず、何のイベントもバインドしない。
(make-sparse-keymap) ⇒ (keymap)
promptを指定した場合、それはキーマップにたいするoverallプロンプト文字列になる。これはメニューキーマップ(Defining Menusを参照)にたいしてのみ指定すべきである。overallプロンプト文字列をともなうキーマップがアクティブな場合は、次の入力イベントのルックアップにたいしてマウスメニューとキーボードメニューを常に提示する。これはコマンドループにたいして毎回キーボードメニューを提示するので、overallプロンプト文字列をメインマップ、メジャーモードマップ、マイナーモードマップに指定しないこと。
この関数は、新たなfullキーマップを作成して、それをリターンする。このキーマップは修飾されないすべての文字にたいするスロットをもつ文字テーブル(Char-Tablesを参照)を含む。この新たなキーマップは、初期状態ではすべての文字、およびその他の種類のイベントがnil
にバインドされている。引数promptは、make-sparse-keymap
のようにプロンプト文字列を指定する。
(make-keymap) ⇒ (keymap #^[nil nil keymap nil nil nil …])
fullキーマップは、多くのスロットを保持するときはsparseキーマップより効果的であり、少ししかスロットを保持しないときはsparseキーマップのほうが適している。
この関数は、keymapのコピーをリターンする。keymap内でバインディングとして直接出現するすべてのキーマップも、すべてのレベルまで再帰的にコピーされる。しかし、ある文字の定義が関数定義にキーマップをもつ関数のときは、再帰的なコピーは行われず、新たにコピーされたキーマップには同じシンボルがコピーされる。
(setq map (copy-keymap (current-local-map))) ⇒ (keymap
;; (これはメタ文字を実装する)
(27 keymap
(83 . center-paragraph)
(115 . center-line))
(9 . tab-to-tab-stop))
(eq map (current-local-map)) ⇒ nil
(equal map (current-local-map)) ⇒ t
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーマップは、他のキーマップを継承することができ、この継承元のキーマップを親キーマップ(parent keymap)と呼びます。そのようなキーマップは、以下のようなキーマップです:
(keymap elements… . parent-keymap)
これの効果は、このキーマップがキールックアップ時にparent-keymapのすべてのバインディングを継承するが、それらにバインディングを追加したり、elementsでオーバーライドできるということです。
define-key
や他のキーバインディング関数を使用してparent-keymap内のバインディングを変更した場合、変更されたバインディングはelementsで作られたバインディングにshadowされない限り、継承されたキーマップ内で可視になります。逆は真ではありません。define-key
を使用して継承されたキーマップ内のバインディングを変更した場合、これらの変更はelements内に記録されますが、parent-keymapに影響はありません。
親キーマップからキーマップを構築するには、set-keymap-parent
を使用するのが正しい方法です。親キーマップから直接キーマップを構築するコードがある場合は、かわりにset-keymap-parent
を使用するようにプログラムを変更してください。
これは、keymapの親キーマップをリターンする。keymapに親キーマップがない場合、keymap-parent
はnil
をリターンする。
これはkeymapの親キーマップをparentにセットして、parentをリターンする。parentがnil
の場合、この関数はkeymapに親キーマップを与えない。
keymapがサブマップ(プレフィクスキーにたいするバインディング)をもつ場合は、それらも新たな親キーマップを受け取り、それらのプレフィクスキーにたいしてparentが何を指定するかが反映される。
以下はtext-mode-map
から継承してキーマップを作成する方法を示す例です:
(let ((map (make-sparse-keymap))) (set-keymap-parent map text-mode-map) map)
非sparseキーマップも親キーマップをもつことができますが、便利とは言えません。非sparseキーマップは、修飾ビットをもたないすべての数値文字コードにたいするバインディングとして、たとえそれがnil
であっても常に何かを指定するので、これらの文字のバインディングが親キーマップから継承されることは決してないのです。
複数のマップからキーマップを継承したいときがあるかもしれません。これにたいしては、関数make-composed-keymap
が使用できます。
この関数は、既存のキーマップから構成される新たなキーマップをリターンする。また、オプションで親キーマップparentから継承する。mapsには単一のキーマップ、または複数のキーマップのリストを指定できる。リターンされた新たなマップ内でキーをルックアップするとき、Emacsはmaps内のキーマップを順に検索してからparent内を検索する。この検索は最初のマッチで停止される。mapsのどれか1つのキーマップ内のnil
バインディングは、parent内の任意のバインディングをオーバーライドするが、mapsにないキーマップの非nil
バインディングはオーバーライドしない。
For example, here is how Emacs sets the parent of
【FIXME】たとえば、以下はbutton-buffer-map
とspecial-mode-map
の両方を継承するhelp-mode-map
のようなキーマップの親キーマップをEmacsがセットする方法です:
(defvar help-mode-map (let ((map (make-sparse-keymap))) (set-keymap-parent map (make-composed-keymap button-buffer-map special-mode-map)) ... map) ... )
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プレフィクスキー(prefix
key)とは、バインディングがキーマップであるようなキーシーケンスです。このキーマップは、プレフィクスキーを拡張するキーシーケンスが何を行うか定義します。たとえば、C-xはプレフィクスキーであり、これはキーマップを使用し、そのキーマップは変数ctl-x-map
にも格納されています。このキーマップはC-xで始まるキーシーケンスにたいするバインディングを定義します。
標準的なEmacsのプレフィクスキーのいくつかは、Lisp変数でも見い出すことができるキーマップを使用していますl:
esc-map
は、プレフィクスキーESCにたいするグローバルキーマップである。したがって、すべてのメタ文字にたいする定義は、このキーマップで見つけることができる。このマップは、ESC-prefix
の関数定義でもある。
help-map
は、プレフィクスキーC-hにたいするグローバルキーマップである。
mode-specific-map
は、プレフィクスキーC-cにたいするグローバルキーマップである。このマップは実際にはモード特有(mode-specific)ではなくグローバルであるが、このプレフィクスキーは主にモード特有なバインディングに使用されるので、C-h
b(display-bindings
)の出力内のC-cに関する情報で、この名前は有意義な情報を提供する。
ctl-x-map
は、プレフィクスキーC-xにたいして使用されるグローバルキーマップである。このマップは、シンボルControl-X-prefix
の関数セルを通して見つけることができる。
mule-keymap
は、プレフィクスキーC-x RET にたいして使用されるグローバルキーマップである。
ctl-x-4-map
は、プレフィクスキーC-x 4にたいして使用されるグローバルキーマップである。
ctl-x-5-map
は、プレフィクスキーC-x 5にたいして使用されるグローバルキーマップである。
2C-mode-map
は、プレフィクスキーC-x 6にたいして使用されるグローバルキーマップである。
vc-prefix-map
は、プレフィクスキーC-x vにたいして使用されるグローバルキーマップである。
goto-map
は、プレフィクスキーM-gにたいして使用されるグローバルキーマップである。
search-map
は、プレフィクスキーM-sにたいして使用されるグローバルキーマップである。
facemenu-keymap
は、プレフィクスキーM-oにたいして使用されるグローバルキーマップである。
プレフィクスキーのキーマップバインディングは、プレフィクスキーに続くイベントをルックアップするために使用されます。(これは、関数定義がキーマップであるようなシンボルかもしれません。効果は同じですが、シンボルはプレフィクスキーにたいする名前の役割を果たします。)
したがって、C-xのバインディングはシンボルControl-X-prefix
であり、このシンボルの関数セルがC-xコマンドにたいするキーマップを保持します(ctl-x-map
の値も同じキーマップです)。
プレフィクスキー定義は、任意のアクティブなキーマップ内に置くことができます。プレフィクスキーとしてのC-c、C-x、C-h、ESCの定義はグローバルマップ内にもあるので、これらのプレフィクスキーは常に使用できます。メジャーモードとマイナーモードは、ローカルマップやマイナーモードのマップ内にプレフィクスキー定義を置くことにより、キーをプレフィクスキーとして再定義できます。 Active Keymapsを参照してください。
あるキーが複数のアクティブなマップ内でプレフィクスキーとして定義されている場合、それぞれの定義がマージされて効果をもちます。まずマイナーモードキーマップ内で定義されたコマンド、次にローカルマップのプレフィクス定義されたコマンド、そしてグローバルマップのコマンドが続きます。
以下の例では、ローカルキーマップ内でC-pをC-xと等価なプレフィクスキーにしています。すると、C-p
C-fにたいするバインディングは、C-x C-fと同様に関数find-file
になります。キーシーケンスC-p
6は、すべてのアクティブなキーマップで見つけることができません。
(use-local-map (make-sparse-keymap)) ⇒ nil
(local-set-key "\C-p" ctl-x-map) ⇒ nil
(key-binding "\C-p\C-f") ⇒ find-file
(key-binding "\C-p6") ⇒ nil
この関数は、プレフィクスキーのバインディングとして使用するために、symbolを用意する。これはsparseキーマップを作成して、それをsymbolの関数定義として格納する。その後はsymbolにキーシーケンスをバインディングすると、そのキーシーケンスはプレフィクスキーになるだろう。リターン値はsymbol
である。
この関数は、値がそのキーマップであるような変数としてもsymbolをセットする。しかしmapvarが非nil
の場合は、かわりにmapvarを変数としてセットする。
promptが非nil
の場合、これはそのキーマップにたいするoverallプロンプト文字列になる。プロンプト文字列はメニューキーマップにたいして与えられるべきである(Defining Menusを参照)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsは多くのキーマップを含んでいますが、常にいくつかのキーマップだけがアクティブです。Emacsがユーザー入力を受け取ったとき、それは入力イベントに変換されて(Keymaps for Translating Sequences of Eventsを参照)、アクティブなキーマップ内でキーバインディングが照合されます。
アクティブなキーマップは通常、(1) keymap
プロパティにより指定されるキーマップ、(2) 有効なマイナーモードのキーマップ、(3)
カレントバッファーのローカルキーマップ、(4)
グローバルキーマップの順です。Emacsは入力キーシーケンスそれぞれにたいして、これらすべてのキーマップ内を検索します。
これらの“通常”のキーマップのうち最優先されるのは、もしあればポイント位置のkeymap
テキストにより指定されるキーマップ、またはoverallプロパティです。(マウス入力イベントにたいしては、Emacsはポイント位置のかわりにイベント位置を使用する。
Searching the Active Keymapsを参照のこと。)
次に優先されるのは、有効なマイナーモードにより指定されるキーマップです。もしあれば、これらのキーマップは変数emulation-mode-map-alists
、minor-mode-overriding-map-alist
、minor-mode-map-alist
により指定されます。Controlling the Active Keymapsを参照してください。
次に優先されるのは、バッファーのローカルキーマップ(local
keymap)で、これにはそのバッファー特有なキーバインディングが含まれます。ミニバッファーもローカルキーマップをもちます(Introduction to Minibuffersを参照)。ポイント位置にlocal-map
テキスト、またはoverlayプロパティがある場合、それはバッファーのデフォルトローカルキーマップのかわりに使用するローカルキーマップを指定します。
ローカルキーマップは通常はそのバッファーのメジャーモードによりセットされます。同じメジャーモードをもつすべてのバッファーは、同じローカルキーマップを共有します。したがって、あるバッファーでローカルキーマップを変更するためにlocal-set-key
(Commands for Binding Keysを参照)を呼び出した場合、それは同じメジャーモードをもつ他のバッファーのローカルキーマップにも影響を与えます。
最後は、C-fのようなカレントバッファーとは関係なく定義されるキーバインディングを含む、グローバルキーマップ(global
keymap)です。kこのキーマップは常にアクティブであり、変数global-map
にバインドされています。
これら“通常”のキーマップとは別に、Emacsはプログラムが他のキーマップをアクティブにするための特別な手段を提供します。1つ目は、グローバルキーマップ以外の通常アクティブなキーマップを置き換えるキーマップを指定する変数overriding-local-map
です。2つ目は、他のすべてのキーマップより優先されるキーマップを指定する、端末ローカル変数overriding-terminal-local-map
です。この端末ローカル変数は通常、modal(訳注:
他のキーマップを選択できない状態)かつ一時的なキーバインディングに使用されます(ここの変数にたいして関数set-transient-map
は便利なインターフェイスを提供する)。詳細は、Controlling the Active Keymapsを参照のこと。
これらを使用するのがキーマップをアクティブにする唯一の方法ではありません。キーマップは、read-key-sequence
によるイベントの変換のような、他の用途にも使用されます。Keymaps for Translating Sequences of Eventsを参照してください。
いくつかの標準的なキーマップのリストは、Standard Keymapsを参照してください。
これは、カレントの状況下でコマンドループによりキーシーケンスをルックアップするために使用される、アクティブなキーマップのリストをリターンする。これは通常、overriding-local-map
とoverriding-terminal-local-map
を無視するが、olpが非nil
の場合には、それらのキーマップにも注意を払う。オプションでpositionにevent-start
によりリターンされるイベント位置、またはバッファー位置を指定でき、key-binding
で説明されているようにキーマップを変更するかもしれない。
この関数は、カレントのアクティブキーマップでkeyにたいするバインディングをリターンする。そのキーマップ内でkeyが未定義の場合、結果はnil
になる。
引数accept-defaultsは、lookup-key
(Functions for Key Lookupを参照)のようにデフォルトバインディングをチェックするかを制御する。
コマンドがリマップ(remap: 再マップ。Remapping Commandsを参照)されたとき、key-binding
は通常、実際に実行されるであろうリマップされたコマンドをリターンするように、コマンドのリマップを行う。しかし、no-remapが非nil
の場合、key-binding
はリマップを無視して、keyにたいして直接指定されたバインディングをリターンする。
keyがマウスイベント(もしかしたらプレフィクスイベントが先行するかもしれない)で始まる場合、照合されるマップはそのイベントの位置を元に決定される。それ以外では、それらのマップはポイント値に基づき決定される。しかし、positionを指定することにより、これらをオーバーライドできる。positionが非nil
の場合、それはバッファー位置かevent-start
の値のようなイベント位置のいずれかである。その場合、照合されるマップはpositionに基づき決定される。
keyが文字列とベクターのいずれでもない場合、Emacsはエラーをシグナルする。
(key-binding "\C-x\C-f") ⇒ find-file
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、macsがアクティブなキーマップを検索する方法を示す、Lisp処理概要です:
(or (if overriding-terminal-local-map (find-in overriding-terminal-local-map)) (if overriding-local-map (find-in overriding-local-map) (or (find-in (get-char-property (point) 'keymap)) (find-in-any emulation-mode-map-alists) (find-in-any minor-mode-overriding-map-alist) (find-in-any minor-mode-map-alist) (if (get-text-property (point) 'local-map) (find-in (get-char-property (point) 'local-map)) (find-in (current-local-map))))) (find-in (current-global-map)))
ここで、find-inとfind-in-anyはそれぞれ、1つのキーマップとキーマップのalistを検索する仮の関数です。関数set-transient-map
がoverriding-terminal-local-map
(Controlling the Active Keymapsを参照)をセットすることにより機能する点に注意してください。
上記の処理概要では、キーシーケンスがマウスイベント(Mouse Eventsを参照)で始まる場合、ポイント位置のかわりにそのイベント位置、カレントバッファーのかわりにそのイベントのバッファーが使用されます。これは特に、プロパティkeymap
およびlocal-map
をルックアップする方法に影響を与えます。display
、before-string
、after-string
プロパティ(Properties with Special Meaningsを参照)が埋め込まれていて、keymap
またはlocal-map
プロパティが非nil
の文字列上でマウスイベントが発生した場合、それは基調となるバッファーテキストの対応するプロパティをオーバーライドします(バッファーテキストにより指定されたプロパティは無視される)。
アクティブなキーマップの1つでキーバインディングが見つかり、そのバインディングがコマンドの場合、検索は終了し、そのコマンドが実行されます。しかし、そのバインディングが値をもつ変数、または文字列の場合、Emacsは入力キーシーケンスをその変数の値、または文字列で置き換えて、アクティブなキーマップの検索を再開します。 Key Lookupを参照してください。
最終的に見つかったコマンドもリマップされるかもしれません。Remapping Commandsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この変数は、Emacsキーボード入力をコマンドにマップするデフォルトのグローバルキーマップを含む。通常は、このキーマップがグローバルキーマップである。デフォルトグローバルキーマップは、self-insert-command
をすべてのプリント文字にバインドするfullキーマップである。
これはグローバルキーマップ内のバインディングを変更する通常の手段だが、この変数に開始時のキーマップ以外の値を割り当てるべきではない。
この関数は、カレントのグローバルキーマップをリターンする。デフォルトグローバルキーマップとカレントグローバルキーマップのいずれも変更していない場合は、global-map
と同じ値になる。リターン値はコピーではなく参照である。これにdefine-key
などの関数を使用すると、グローバルバインディングが変更されるだろう。
(current-global-map) ⇒ (keymap [set-mark-command beginning-of-line … delete-backward-char])
この関数はカレントバッファーのローカルキーマップをリターンする。ローカルキーマップがない場合はnil
をリターンする。以下の例では、(Lisp
Interactionモードを使用する)*scratch*バッファーにたいするキーマップは、ESC(ASCIIコード27)にたいするエントリーが別のsparseキーマップであるようなsparseキーマップである。
(current-local-map) ⇒ (keymap (10 . eval-print-last-sexp) (9 . lisp-indent-line) (127 . backward-delete-char-untabify)
(27 keymap (24 . eval-defun) (17 . indent-sexp)))
current-local-map
はローカルキーマップのコピーではなく参照をリターンする。これにdefine-key
などの関数を使用すると、ローカルバインディングが変更されるだろう。
この関数は、カレントで有効なメジャーモードのキーマップリストをリターンする。
この関数は、keymapを新たなカレントグローバルキーマップにする。これはnil
をリターンする。
グローバルキーマップの変更は、異例である。
この関数は、keymapをカレントバッファーの新たなローカルキーマップにする。keymapがnil
の場合、そのバッファーはローカルキーマップをもたない。use-local-map
はnil
をリターンする。ほとんどのメジャーモードコマンドは、この関数を使用する。
この変数は、アクティブかどうかに関わらず、特定の変数の値にたいするキーマップを示すalistである。要素は、以下のようになる:
(variable . keymap)
キーマップkeymapは、
variableが非nil
値をもつときはアクティブである。通常、variableはメジャーモードを有効、または無効にする変数である。Keymaps and Minor Modesを参照のこと。
minor-mode-map-alist
の要素が、minor-mode-alist
の要素と異なる構造をもつことに注意されたい。マップは要素のCDRでなければならず、そうでなければ2つ目の要素にマップリストは用いられないだろう。CDRはキーマップ(リスト)、または関数定義がキーマップであるようなシンボルである。
1つ以上のマイナーモードキーマップがアクティブなとき、minor-mode-map-alist
内で前のキーマップが優先される。しかし、互いが干渉しないようにマイナーモードをデザインすべきである。これを正しく行えば、順序は問題にならない。
マイナーモードについての詳細な情報は、Keymaps and Minor Modesを参照のこと。minor-mode-key-binding
(see section Functions for Key Lookupを参照)も確認されたい。
この変数は、メジャーモードによる特定のマイナーモードにたいするキーバインディングのオーバーライドを可能にする。このalistの要素は、minor-mode-map-alist
の要素のように、(variable
. keymap)
のような形式である。
ある変数がminor-mode-overriding-map-alist
の要素として出現する場合、その要素により指定されるマップは、minor-mode-map-alist
内の同じ変数にたいして指定される任意のマップを完全に置き換える。
すべてのバッファーにおいて、minor-mode-overriding-map-alist
は自動的にバッファーローカルである。
この変数が非nil
の場合は、バッファーのローカルキーマップ、テキストプロパティまたはoverlayによるキーマップ、マイナーモードキーマップのかわりに使用されるするキーマップを保持する。このキーマップが指定された場合、カレントグローバルキーマップ以外のアクティブだった他のすべてのマップがオーバーライドされる。
この変数が非nil
の場合は、overriding-local-map
、バッファーのローカルキーマップ、テキストプロパティまたはoverlayによるキーマップ、およびすべてのマイナーモードキーマップのかわりに使用されるキーマップを保持する。
この変数は、カレント端末にたいして常にローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。これはインクリメンタル検索モードの実装に使用される。
この変数が非nil
の場合は、overriding-local-map
またはoverriding-terminal-local-map
の値がメニューバーの表示に影響し得る。デフォルト値はnil
なので、これらのマップ変数なメニューバーに影響をもたない。
これら2つのマップ変数は、たとえこれらの変数がメニューバー表示に影響し得るを与えない場合でも、メニューバーを使用してエンターされたキーシーケンスの実行には影響を与えることに注意されたい。したがって、もしメニューバーキーシーケンスが到着したら、そのキーシーケンスをルックアップ・実行する前に変数をクリアーすべきである。この変数を使用するモードは通常、何らかの方法でこれを行っている。これらのモードは通常“読み戻し(unread)”とexitにより処理されないイベントに応答する。
この変数は、スペシャルイベントにたいするキーマップを保持する。あるイベント型がこのキーマップ内でバインディングをもつ場合、それはスペシャルであり、そのイベントにたいするバインディングはread-event
により直接実行される。Special Eventsを参照のこと。
この変数は、エミュレーションモードにたいして使用するキーマップalistのリストを保持する。この変数は、複数マイナーモードキーマップを使用するモードとパッケージを意図している。リストの各要素はminor-mode-map-alist
と同じフォーマットと意味をもつキーマップalistか、そのようなalist形式の変数バインディングをもつシンボルである。それぞれのalist内の“アクティブ”なキーマップは、minor-mode-map-alist
とminor-mode-overriding-map-alist
の前に使用される。
この関数は一時的(transient)なキーマップとしてkeymapを追加する。一時的なキーマップは1つ以上の後続するキーにたいして、他のキーマップより優先される。
通常、keymapは直後のキーをルックアップするために、1回だけ使用される。しかし、オプション引数predがt
の場合、そのマップはユーザーがkeymap内で定義されたキーをタイプするまでアクのままとなる。keymap内にないキーをユーザーがタイプしたとき、一時的キーマップは非アクティブとなり、そのキーにたいして通常のキールックアップが継続される。
predには関数も指定できる。。この場合、keymapがアクティブの間は、各コマンドの実行に優先して、その関数が引数なしで呼び出される。keymapがアクティブの間、関数は非nil
をリターンすべきである。
この関数は、他のすべてのアクティブなキーマップに優先される変数overriding-terminal-local-map
にたいして、keymap
を追加、または削除することにより機能する(Searching the Active Keymapsを参照)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キールックアップ(key lookup: キー照合)とは、与えられたキーマップからキーシーケンスのバインディングを見つけ出すことです。そのバインディングの使用や実行は、キールックアップの一部ではありません。
キールックアップは、キーシーケンス内の各イベントのイベント型だけを使用し、そのイベントの残りは無視します。実際のところ、キールックアップに使用されるキーシーケンスは、マウスイベントをイベント全体(リスト)のかわりにイベント型のみ(シンボル)を用いるでしょう。Input Eventsを参照してください。そのような“キーシーケンス”は、command-execute
による実行には不十分ですが、キーのルックアップやリバインドには十分です。
キーシーケンスが複数イベントから構成されるとき、キールックアップはイベントを順に処理します。最初のイベントのバインディングが見つかったとき、それはキーマップでなければなりません。そのキーマップ内で2つ目のイベントを見つけ出し、そのキーシーケンス内のすべてのイベントが消費されるまで、このプロセスを続けます(故に、最後のイベントにたいして見つかったイベントはキーマップかどうかわからない)。したがって、キールックアッププロセスは、キーマップ内で単一イベントを見つけ出す、よりシンプルなプロセスで定義されます。これが行なわれる方法は、キーマップ内でそのイベントに関連するオブジェクトの型に依存します。
キーマップ内のイベント型ルックアップによる値発見を説明するために、キーマップエントリー(keymap
entry)という用語を導入しましょう。(これにはメニューアイテムにたいするキーマップ内のアイテム文字列や、他の余計な要素は含まれません。なぜなら、lookup-key
や他のキーマップルックアップ関数が、リターン値にそれらを含まないからです。)
任意のLispオブジェクトがキーマップエントリーとしてキーマップに格納されるかもしれませんが、すべてがキールックアップに意味をもつわけではありません。以下のテーブルは、キーマップエントリーで重要な型です:
nil
nil
は、それまでにルックアップに使用されたイベントが、未定義キーを形成することを意味する。最終的にキーマップがイベント型を調べるのに失敗して、デフォルトバインディングも存在しないときは、そのイベント型のバインディングがnil
であるのと同じである。
それまでにルックアップに使用されたイベントがコンプリートキーを形成し、そのバインディングはcommandである。What Is a Function?を参照のこと。
array(文字列かベクター)は、キーボードマクロである。それまでにルックアップに使用されたイベントはコンプリートキーを形成し、そのバインディングはarrayである。詳細はKeyboard Macrosを参照のこと。
それまでにルックアップに使用されたイベントはプレフィクスキーを形成する。そのキーシーケンスの次のイベントは、keymap内でルックアップされる。
listの意味は、そのリストが何を含んでいるかに依存する:
keymap
の場合、そのリストはキーマップであり、キーマップとして扱われる(上記参照)。
lambda
の場合、そのリストはラムダ式である。これは関数とみなされ、そのように扱われる(上記参照)。キーバインディングとして正しく実行されるために、この関数はコマンドでなければならず、interactive
指定をもたなければならない。Defining Commandsを参照のこと。
(othermap . othertype)
キールックアップはインダイレクトエントリーに遭遇したときは、かわりにothermap内でothertypeのバインディングをルックアップして、それを使用する。
この機能により、あるキーを他のキーにたいするalistとして定義することが可能になる。たとえば、CARがesc-map
と呼ばれるキーマップで、CDRが32(SPCのコード)の場合は、“それが何であろうとMeta-SPCのグローバルバインディングを使用する”ことを意味する。
symbolの関数定義がsymbolのかわりに使用される。もし関数定義もシンボルの場合は、任意の回数このプロセスが繰り返される。これは最終的にキーマップであるようなオブジェクト、コマンド、またはキーボードマクロに行き着くはずである。それがキーマップかコマンドの場合はリストも許されるが、シンボルを通じて見つけ出された場合、インダイレクトエントリーは理解されない。
キーマップおよびキーボードマクロ(文字列かベクター)は有効な関数ではないので、関数定義にキーマップ、文字列、ベクターをもつシンボルは、関数としては無効であることに注意されたい。しかし、キーバインディングとしては有効である。その定義がキーボードマクロの場合、そのシンボルはcommand-execute
(Interactive Callを参照)の引数としても有効である。
シンボルundefined
は特記するに値する。これはそのキーを未定義として扱うことを意味する。厳密に言うと、そのキーは定義されているが、そのバインディングがコマンドundefined
なのである。しかし、このコマンドは未定義キーにたいして自動的に行われるのと同じことを行う。これは(ding
を呼び出して)bellを鳴らすが、エラーはシグナルしない。
undefined
は、グローバルキーバインディングをオーバーライドして、そのキーをローカルに“未定義”にするために使用される。nil
にローカルにバインドしても、グローバルバインディングをオーバーライドしないであろうから、これを行うのに失敗するだろう。
オブジェクトの他の型が見つかった場合、それまでにルックアップで使用されたイベントはコンプリートキーを形成し、そのオブジェクトがバインディングになるが、そのバインディングはコマンドとして実行不可能である。
要約すると、キーマップエントリーはキーマップ、コマンド、キーボードマクロ、あるいはそれらに導出されるシンボル、インダイレクトエントリー、あるいはnil
のいずれかです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、キールックアップに関連する関数および変数です。
この関数は、keymap内のkeyの定義をリターンする。このチャプターで説明されている、キーをルックアップする他のすべての関数がlookup-key
を使用する。以下は例である:
(lookup-key (current-global-map) "\C-x\C-f") ⇒ find-file
(lookup-key (current-global-map) (kbd "C-x C-f")) ⇒ find-file
(lookup-key (current-global-map) "\C-x\C-f12345") ⇒ 2
文字列、またはベクターのkeyが、keymap内で指定されるプレフィクスキーとして有効なキーシーケンスでない場合、それは最後に余計なイベントをもつ、単一のキーシーケンスに適合しない、“長過ぎる”キーのはずである。その場合のリターン値は数となり、この数はコンプリートキーを構成するkeyの前にあるイベントの数である。
accept-defaultsが非nil
の場合、lookup-key
はkey内の特定のイベントにたいするバインディングと同様に、デフォルトバインディングも考慮する。それ以外では、lookup-key
は特定のkeyのシーケンスにたいするバインディングだけを報告し、明示的に指定したとき以外はデフォルトバインディングを無視する。(これを行うには、keyの要素としてt
を与える。Format of Keymapsを参照のこと。)
keyがメタ文字(ファンクションキーではない)を含む場合その文字は暗黙にmeta-prefix-char
の値と対応する非メタ文字からなる、2文字シーケンスに置き換えられる。したがって、以下に1つ目の例は、2つ目の例に変換されて処理される。
(lookup-key (current-global-map) "\M-f") ⇒ forward-word
(lookup-key (current-global-map) "\ef") ⇒ forward-word
read-key-sequence
とは異なり、この関数は指定されたイベントの情報を破棄する変更(Key Sequence Inputを参照)を行わない。特に、この関数はアルファベット文字を小文字に変更せず、ドラッグイベントをクリックイベントに変更しない。
キーを未定義にするために、キーマップ内で使用される。これはding
を呼び出すが、エラーを起こさない。
この関数は、カレントのローカルキーマップ内の、keyにたいするバインディングをリターンする。カレントのローカルキーマップ内で未定義の場合は、nil
をリターンする。
引数accept-defaultsは、lookup-key
(上記)と同じように、デフォルトバインディングのチェックを制御する。
この関数は、カレントのグローバルキーマップ内で、コマンドkeyにたいするバインディングをリターンする。カレントのグローバルキーマップ内で未定義の場合は、nil
をリターンする。
引数accept-defaultsは、lookup-key
(上記)と同じように、デフォルトバインディングのチェックを制御する。
この関数は、アクティブなマイナーモードのkeyのバインディングを、リストでリターンする。より正確には、この関数は(modename
.
binding)
のとうなペアーのalistをリターンする。ここでmodenameなそのマイナーモードを有効にする変数、bindingはそのモードでのkeyのバインディングである。keyがマイナーモードバインディングをみたない場合、値はnil
である。
最初に見つかったバインディングがプレフィクス定義(キーマップ、またはキーマップとして定義されたシンボル)でない場合は、他のマイナーモード由来のすべての後続するバインディングは、完全にshadowされるため省略される。同様に、このリストはプレフィクスバインディングに後続する非プレフィクスバインディングは省略される。
引数accept-defaultsは、lookup-key
(上記)と同じように、デフォルトバインディングのチェックを制御する。
この変数はメタ/プレフィクス文字コードである。これはメタ文字をキーマップ内でルックアップできるように、2文字シーケンスに変換する。有用な結果を得るために、値はプレフィクスイベント(Prefix Keysを参照)であること。デフォルト値は27で、これはESCにたいするASCIIコードである。
meta-prefix-char
の値が27であるような限り、キールックアップは通常backward-word
コマンドとして定義されるM-bを、ESC
bに変換する。しかし、meta-prefix-char
を24(C-xのコード)にセットした場合、EmacsはM-bをC-x
bに変換するだろうが、これの標準のバインディングはswitch-to-buffer
コマンドである。以下に何が起こるかを示す(実際にこれを行ってはならない!):
meta-prefix-char ; デフォルト値
⇒ 27
(key-binding "\M-b") ⇒ backward-word
?\C-x ; 文字.の ⇒ 24 ; プリント表現
(setq meta-prefix-char 24) ⇒ 24
(key-binding "\M-b") ⇒ switch-to-buffer ; 今やM-bをタイプすると ; C-x bをタイプしたようになる (setq meta-prefix-char 27) ; 混乱を避ける! ⇒ 27 ; デフォルト値をリストア!
この単一イベントから2イベントへの変換は文字にたいしてのみ発生し、他の種類の入力イベントには発生しない。したがって、ファンクションキーM-F1はESC F1に変換されない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーのリバインド(rebind:
再バインド、再束縛)は、キーマップ内でそのキーのバインディングエントリーを変更することにより行います。グローバルキーマップ内のバインディングを変更した場合、その変更は(たとえローカルバインディングによりグローバルバインディングをshadowしているバッファーでは直接影響しないとしても)すべてのバッファーに影響します。カレントバッファーのローカルマップを変更した場合は、通常は同じメジャーモードを使用するすべてのバッファーに影響します。関数global-set-key
およびlocal-set-key
は、これらの操作のための使いやすいインターフェイスです(Commands for Binding Keysを参照)。より汎用的な関数define-key
を使用することもできます。その場合は、変更するマップを明示的に指定しなければなりません。
Lispプログラムでリバインドするキーシーケンスを選択するときは、さまざまなキーの使用についてのEmacsの慣習にしたがうようお願いします(Key Binding Conventionsを参照)。
リバインドするキーシーケンスの記述では、コントロール文字とメタ文字にたいして、特別なエスケープシーケンスを使用すると良いでしょう(String Typeを参照)。構文‘\C-’は後続する文字がコントロール文字でることを意味し、‘\M-’は後続する文字がメタ文字であることを意味します。したがって、文字列"\M-x"
は1つのM-x、"\C-f"
は1つのC-f、"\M-\C-x"
および"\C-\M-x"
は1つのC-M-xとして読み取られます。ベクター内でも、このエスケープシーケンス、および文字列では使用できない他のエスケープシーケンスを使用できます。1例は‘[?\C-\H-x
home]’です。Character Typeを参照してください。
キー定義、およびルックアップ関数は、ベクターであるようなキーシーケンス内のイベント型にたいして、別の構文を受け入れます。修飾名に基本イベント(文字かファンクションキー名)を付加したものを含むリストを使用できます。たとえば、(control
?a)
は?\C-a
、(hyper control
left)
はC-H-left
と等価です。このようなリストの利点の1つは、コンパイル済みファイル内に修飾ビットの正確な数値コードが出現しないことです。
以下の関数は、keymapがキーマップでない場合、およびkeyがキーシーケンスを表す文字列やベクターでない場合はエラーをシグナルします。リストであるようなイベントにたいする略記として、イベント型(シンボル)を使用できます。kbd
関数(Key Sequencesを参照)は、キーシーケンスを指定するための便利な方法です。
この関数は、keymap内でkeyにたいするバインディングをセットする(keyが長さ2以上のイベントの場合、その変更は実際はkeymapから辿られる他のキーマップで行なわれる)。引数bindingには任意のLispオブジェクトを指定できるが、意味があるのは特定のオブジェクトだけである(意味のある型のリストは、Key Lookupを参照のこと)。define-key
のリターン値はbindingである。
keyが[t]
の場合、これはkeymap内でデフォルトバインディングをセットする。イベントが自身のバインディングをもたないとき、そのキーマップ内にデフォルトバインディングが存在するなら、Emacsコマンドループはそれを使用する。
keyのすべてのプレフィクスは、プレフィクスキー(キーマップにバインドされる)、または未定義でなけらばならず、それ以外はエラーがシグナルされる。keyのいくつかのプレフィクスが未定義の場合は、define-key
はそれをプレフィクスキーとして定義するので、残りのkeyは指定されたように定義できる。
前にkeymap内でkeyにたいするバインディングが存在しなかった場合は、新たなバインディングがkeymapの先頭に追加される。キーマップ内のバインディングの順序はキーボード入力にたいし影響を与えないが、メニューキーマップにたいしては問題となる(Menu Keymapsを参照)。
以下は、sparseキーマップを作成して、その中にバインディングをいくつか作成する例である:
(setq map (make-sparse-keymap)) ⇒ (keymap)
(define-key map "\C-f" 'forward-char) ⇒ forward-char
map ⇒ (keymap (6 . forward-char))
;; C-xにたいしsparseサブマップを作成し、
;; その中でfをバインドする
(define-key map (kbd "C-x f") 'forward-word)
⇒ forward-word
map ⇒ (keymap (24 keymap ; C-x (102 . forward-word)) ; f (6 . forward-char)) ; C-f
;; C-pをctl-x-map
にバインド (define-key map (kbd "C-p") ctl-x-map) ;;ctl-x-map
⇒ [nil … find-file … backward-kill-sentence]
;; ctl-x-map
内でC-fをfoo
にバインド
(define-key map (kbd "C-p C-f") 'foo)
⇒ 'foo
map
⇒ (keymap ; ctl-x-map
内のfoo
に注目
(16 keymap [nil … foo … backward-kill-sentence])
(24 keymap
(102 . forward-word))
(6 . forward-char))
C-p
C-fにたいする新たなバインディングの格納は、実際にはctl-x-map
内のエントリーを変更することにより機能し、これはデフォルトグローバルマップ内のC-p
C-fとC-x C-fの両方のバインディングを変更する効果をもつことに注意されたい。
関数substitute-key-definition
は、キーマップから特定のバインディングをもつキーをスキャンして、それらを異なるバインディングにリバインドする。より明快で、多くの場合は同じ結果を生成できる他の機能として、あるコマンドから別のコマンドへのリマップがあります(Remapping Commandsを参照)。
この関数は、keymap内でolddefにバインドされるすべてのキーについて、olddefをnewdefに置き換える。別の言い方をすると、olddefが出現する箇所すべてをnewdefに置き換える。この関数はnil
をリターンする。
たとえば、以下をEmacsの標準バインディングで行うと、C-x C-fを再定義する:
(substitute-key-definition 'find-file 'find-file-read-only (current-global-map))
oldmapが非nil
の場合は、どのキーをリバインドするかをoldmap内のバインディングが決定するよう、substitute-key-definition
の動作を変更する。リバインディングは依然としてoldmapではなく、keymapで発生する。したがって、他のマップ内のバインディングの制御下で、マップを変更することができる。たとえば、
(substitute-key-definition 'delete-backward-char 'my-funny-delete my-map global-map)
これは、標準的な削除コマンドにグローバルにバインドされたキーにたいして、my-map
内の特別な削除コマンドを設定する。
以下は、キーマップの置き換え(substitution)の前後を示す例である:
(setq map '(keymap (?1 . olddef-1) (?2 . olddef-2) (?3 . olddef-1))) ⇒ (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1))
(substitute-key-definition 'olddef-1 'newdef map) ⇒ nil
map ⇒ (keymap (49 . newdef) (50 . olddef-2) (51 . newdef))
この関数は、self-insert-command
をコマンドundefined
にリマップ(Remapping Commandsを参照)することにより、fullキーマップのコンテンツを変更する。これは、すべてのプリント文字を未定義にする効果をもすので、通常のテキスト挿入は不可能になる。suppress-keymap
はnil
をリターンする。
nodigitsがnil
の場合、suppress-keymap
は数字がdigit-argument
、-がnegative-argument
を実行するように定義する。それ以外は、残りのプリント文字と同じように、それらの文字も未定義にする。
suppress-keymap
関数は、yank
やquoted-insert
のようなコマンドを抑制(suppress)しないので、バッファーの変更は可能である。バッファーの変更を防ぐには、バッファーを読み取り専用(read-only)にする(Read-Only Buffersを参照)。
この関数はkeymapを変更するので、通常は新たに作成したキーマップにたいして使用するだろう。するだろう。他の目的のために使用されている既存のキーマップに操作を行うと、恐らくトラブルの原因となる。たとえば、global-map
の抑制は、Emacsの使用をほとんど不可能に
この関数は、テキストの挿入が望ましくないメジャーモードの、ローカルキーマップ初期科に使用され得る。しかし、そのようなモードは通常はspecial-mode
(Basic Major Modesを参照)から継承される。この場合、そのモードのキーマップは既に抑制済みのspecial-mode-map
から自動的に受け継がれる。以下にspecial-mode-map
が定義される方法を示す:
(defvar special-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) (define-key map "q" 'quit-window) … map))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるコマンドから他のコマンドへのリマップ(remap)には、特別な種類のキーバインディングが使用できます。この機能を使用するためには、ダミーイベントremap
で始まり、その後にリマップしたいコマンド名が続くようなキーシーケンスにたいするキーバインディングを作成します。そして、そのバインディングにたいしては、新たな定義(通常はコマンド名だが、キーバインディングにたいして有効な他の任意の定義を指定可能)を指定します。
たとえば、Myモードというモードが、kill-line
のかわりに呼び出されるmy-kill-line
という特別なコマンドを提供するとします。これを設定するには、このモードのキーマップに以下のようなリマッピングが含まれるはずです:
(define-key my-mode-map [remap kill-line] 'my-kill-line)
その後は、my-mode-map
がアクティブなときは常に、ユーザーがC-k(kill-line
についてデフォルトのグローバルキーシーケンス)をタイプすると、Emacsはかわりにmy-kill-line
を実行するでしょう。
リマップはアクティブなキーマップでのみ行なわれることに注意してください。たとえば、ctl-x-map
のようなプレフィクスキーマップ内にリマッピングを置いても、そのようなキーマップはそれ自体がアクティブでないので、通常は効果がありません。それに加えて、リマップは1レベルを通じてのみ機能します。以下の例では、
(define-key my-mode-map [remap kill-line] 'my-kill-line) (define-key my-mode-map [remap my-kill-line] 'my-other-kill-line)
これはkill-line
をmy-other-kill-line
にリマップしません。かわりに、通常のキーバインディングがkill-line
を指定する場合は、それがmy-kill-line
にリマップされます。通常のバインディングがmy-kill-line
を指定した場合は、my-other-kill-line
にリマップされます。
コマンドのリマップをアンドゥするには、以下のようにそれをnil
にリマップします:
(define-key my-mode-map [remap kill-line] nil)
この関数は、カレントアクティブキーマップにより与えられる、command(シンボル)にたいするリマッピングをリターンする。commandがリマップされていない(これは普通の状況である)、またはシンボル以外の場合、この関数はnil
をリターンする。position
は、key-binding
の場合と同様、使用するキーマップを決定するために、オプションバッファー位置、またはイベント位置をオプションで指定できる。
オプション引数keymaps
が非nil
の場合、それは検索するキーマップのリストを指定する。この引数は、position
が非nil
の場合は無視される。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
read-key-sequence
関数がキーシーケンス(Key Sequence Inputを参照)を読み取るときは、特定のイベントシーケンスを他のものに変換(translate)するために、変換キーマップ(translation
keymaps)を使用します。input-decode-map
、local-function-key-map
、key-translation-map
(優先順)は変換キーマップです。
変換キーマップは、他のキーマップと同じ構造をもちますが、使われ方は異なります。変換キーマップは、キーシーケンスを読み取るときに、コンプリートキーシーケンスにたいするバインディングではなく、キーシーケンスに行う変換を指定します。キーシーケンスが読み取られると、それらのキーシーケンスは変換キーマップにたいしてチェックされます。ある変換キーマップがkをベクターvに“バインド”する場合、キーシーケンス内のどこかにサブシーケンスとしてkが出現すると、それはvないのでイベントに置き換えられます。
たとえば、キーパッドキーPF1が押下されたとき、VT100端末はESC O
Pを送信します。そのような端末では、Emacsはそのイベントシーケンスを単一イベントpf1
に変換しなければなりません。これは、input-decode-map
内でESC
O Pを[pf1]
に“バインド”することにより行われます。したがって、その端末上でC-c
PF1をタイプしたとき、端末は文字シーケンスC-c ESC O
Pを発行し、read-key-sequence
がそれをC-c PF1に変換してベクター[?\C-c
pf1]
としてリターンします。
変換キーマップは、(keyboard-coding-system
で指定された入力コーディングシステムを通じて)Emacsがキーボード入力をデコードした直後だけ効果をもちます。Terminal I/O Encodingを参照してください。
この変数は、通常の文字端末上のファンクションキーから送信された文字シーケンスを記述するキーマップを保持する。
input-decode-map
の値は、通常はその端末のTerminfoかTermcapのエントリーに応じて、自動的にセットアップされるが、Lispの端末仕様ファイルの助けが必要なときもある。Emacsには、多くの一般的な端末の端末仕様ファイルが同梱されている。これらのファイルの主な目的は、TermcapやTerminfoから推定できないエントリーをinput-decode-map
内に作成することである。Terminal-Specific Initializationを参照のこと。
この変数は、input-decode-map
と同じようにキーマップを保持するが、通常優先される解釈候補(alternative
interpretation)に変換されるべきキーシーケンスを記述するキーマップを保持する。このキーマップはinput-decode-map
の後、key-translation-map
の前に適用される。
local-function-key-map
内のエントリーは、マイナーモード、ローカルキーマップ、グローバルキーマップによるバインディングと衝突する場合は無視される。つまり、元のキーシーケンスが他にバインディングをもたない場合だけ、リマッピングが適用される。
local-function-key-map
がfunction-key-map
を継承するが、function-key-map
を直接使用すべきではない。
この変数は、入力イベントを他のイベントに変換するために、input-decode-map
と同じように使用される、別のキーマップを保持する。input-decode-map
との違いは、local-function-key-map
の前ではなく、後に機能する点である。このキーマップは、local-function-key-map
による変換結果を受け取る。
input-decode-map
と同様、ただしlocal-function-key-map
とは異なり、このキーマップは入力キーシーケンスが通常のバインディングをもつかどうかかに関わらず適用される。しかし、このキーマップによりキーバインディングがオーバーライドされても、key-translation-map
では実際のキーバインディングが効果をもち得ることに注意されたい。確かに、実際のキーバインディングはlocal-function-key-map
をオーバーライドし、したがってkey-translation-map
が受け取るキーシーケンスは変更されるだろう。明確にするためには、このような類の状況は避けたほうがよい。
key-translation-map
は、通常はself-insert-command
にバインディングされるような通常文字を含めて、ユーザーがある文字を他の文字にマップすることを意図している。
キーシーケンスのかわりにキーの“変換”として関数を使用することにより、シンプルなエイリアスより多くのことにinput-decode-map
、local-function-key-map
、key-translation-map
を使用できます。その場合、この関数はそのキーの変換を計算するために呼び出されます。
キー変換関数は、引数を1つ受け取ります。この引数はread-key-sequence
内で指定されるプロンプトです。キーシーケンスがエディターコマンドループに読み取られる場合は、nil
です。ほとんどの場合、プロンプト値は無視できます。
関数が自身で入力を読み取る場合、その関数は後続のイベントを変更する効果をもつことができます。たとえば、以下はC-c hをハイパー文字に後続する文字とするために定義する方法の例です:
(defun hyperify (prompt) (let ((e (read-event))) (vector (if (numberp e) (logior (lsh 1 24) e) (if (memq 'hyper (event-modifiers e)) e (add-event-modifier "H-" e)))))) (defun add-event-modifier (string e) (let ((symbol (if (symbolp e) e (car e)))) (setq symbol (intern (concat string (symbol-name symbol)))) (if (symbolp e) symbol (cons symbol (cdr e))))) (define-key local-function-key-map "\C-ch" 'hyperify)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
そのキーシーケンスがコマンドにバインドされたとき、またはさらにイベントを追加してもコマンドにバインドされるシーケンスにすることができないとEmacsが判断したときに、キーシーケンスの終わりが検出されます。
これは、元のキーシーケンスがバインディングをもつかどうかに関わらず、input-decode-map
およびkey-translation-map
を適用するとき、そのようなバインディングが変換の開始を妨げることを意味します。たとえば、前述のVT100の例に戻って、グローバルマップにC-c
ESCを追加してみましょう。すると、ユーザーがC-c PF1をタイプしたとき、EmacsはC-c
ESC O PをC-c PF1に変換するのに失敗するでしょう。これは、EmacsがC-x
ESCの直後に読み取りを停止して、O Pは読み取られずに残るからです。この場合、ユーザーが実際にC-c
ESCをタイプした場合、ユーザーが実際にESCを押下したのか、あるいはPF1を押下したのか判断するために、Emacsが待つべきではないのです。
この理由により、キーシーケンスの終わりがキー変換のプレフィクスであるようなキーシーケンスをコマンドにバインドするのは、避けたほうがよいでしょう。そのような問題を起こす主なサフィックス、およびプレフィクスはESC、M-O(実際はESC O)、M-[(実際はESC [)です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、キーバインディングを変更するための便利な対話的インターフェイスを説明します。これらはdefine-key
を呼び出すことにより機能します。
ユーザーはinitファイルにたいしてシンプルなカスタマイズを行うとき、しばしばglobal-set-key
を使用します。たとえば、
(global-set-key (kbd "C-x C-\\") 'next-line)
または
(global-set-key [?\C-x ?\C-\\] 'next-line)
または
(global-set-key [(control ?x) (control ?\\)] 'next-line)
は、次の行に移動するようにC-x C-\を再定義します。
(global-set-key [M-mouse-1] 'mouse-set-point)
は、メタキーを押してマウスの第一ボタン(左ボタン)をクリックすると、クリックした箇所にポイントをセットするように再定義します。
バインドするキーのLisp指定に非ASCII文字のテキストを使用するときは、注意してください。マルチバイトとして読み取られたテキストがある場合には、Lispファイル内でマルチバイトテキストが読み取られるときのように(see section Loading Non-ASCII Characters)、マルチバイトとしてキーをタイプしなければなりません。たとえば、
(global-set-key "ö" 'my-function) ; bind o-umlaut
または
(global-set-key ?ö 'my-function) ; bind o-umlaut
をLatin-1のマルチバイト環境で使用した場合、これらのコマンドはLatin-1端末より送信されたバイトコード246(M-v)ではなく、コード246のマルチバイト文字に実際にバインドされます。このバインディングを使用するためには、適切な入力メソッド(Input Methods in The GNU Emacs Manualを参照)を使用して、キーボードをデコードする方法をEmacsに教える必要があります。
この関数は、カレントグローバルマップ内で、keyのバインディングをbindingにセットする。
(global-set-key key binding) ≡ (define-key (current-global-map) key binding)
この関数は、カレントグローバルマップから、keyのバインディングを削除する。
プレフィクスとしてkeyを使用する、長いキーの定義の準備に使用するのも、この関数の1つの使い方である。keyが非プレフィクスのようなバインディングをもつ場合、この使い方は許されないだろう。たとえば、
(global-unset-key "\C-l") ⇒ nil
(global-set-key "\C-l\C-l" 'redraw-display) ⇒ nil
この関数は、以下のようにdefine-key
を使用するのと等しい:
(global-unset-key key) ≡ (define-key (current-global-map) key nil)
この関数は、カレントローカルキーマップ内のkeyのバインディングを、bindingにセットする。
(local-set-key key binding) ≡ (define-key (current-local-map) key binding)
この関数は、カレントローカルキーマップから、keyのバインディングを削除する。
(local-unset-key key) ≡ (define-key (current-local-map) key nil)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、すべてのカレントキーマップをスキャンして、ヘルプ情報をプリントするために使用される関数を説明します。
この関数は、(0個以上のプレフィクスキーを通じて)keymapから到達可能な、すべてのキーマップのリストをリターンする。リターン値は(key
.
map)
のような形式の要素をもつ連想配列(alist)である。ここで、keyはkeymap内での定義がmapであるようなプレフィクスキーである。
alistの要素は、keyの長さにたいして昇順にソートされている。1つ目の要素は、常に([] .
keymap)
である。これは、指定されたキーマップがイベントなしのプレフィクスにより、自分自身からアクセス可能だからである。
prefixが与えられた場合、それはプレフィクスキーシーケンスである。その場合には、prefixで始まるプレフィクスキーをもつサブマップだけがaccessible-keymaps
に含まれる。これらの要素の意味は、(accessible-keymaps)
の値の場合と同様であり、いくつかの要素が省略されている点だけが異なる。
以下の例では、リターンされるalistにより、‘^[’と表示されるキーESCがプレフィクスキーであり、その定義がsparseキーマップ(keymap
(83 . center-paragraph) (115 . foo))
であること示される。
(accessible-keymaps (current-local-map))
⇒(([] keymap
(27 keymap ; 以降ESCにたいするこのキーマップが繰り返されることに注意
(83 . center-paragraph)
(115 . center-line))
(9 . tab-to-tab-stop))
("^[" keymap (83 . center-paragraph) (115 . foo)))
また以下の例では、C-hは(keymap (118
.
describe-variable)…)
で始まるsparseキーマップを使用するプレフィクスキーである。他のプレフィクスC-x
4は、変数ctl-x-4-map
の値でもあるキーマップを使用する。イベントmode-line
は、ウィンドウの特別な箇所でのマウスイベントにたいするプレフィクスとして使用される、いくつかのダミーイベントのうちの1つである。
(accessible-keymaps (current-global-map)) ⇒ (([] keymap [set-mark-command beginning-of-line … delete-backward-char])
("^H" keymap (118 . describe-variable) … (8 . help-for-help))
("^X" keymap [x-flush-mouse-queue … backward-kill-sentence])
("^[" keymap [mark-sexp backward-sexp … backward-kill-word])
("^X4" keymap (15 . display-buffer) …)
([mode-line] keymap (S-mouse-2 . mouse-split-window-horizontally) …))
これらは実際に目にするであろうキーマップのすべてではない。
関数map-keymap
は、keymap内のバインディングそれぞれにたいして1回functionを呼び出す。呼び出す際の引数はイベント型と、そのバインディングの値の2つである。keymapに親キーマップがある場合は、その親キーマップのバインディングも含まれる。これは再帰的に機能する。つまり、その親キーマップ自身が親キーマップをもつ場合は、それのバインディングも含まれる、といった具合である。
これは、キーマップ内のすべてのバインディングを検証する、もっとも明快な方法である。
この関数は、where-is
コマンド(Help in The GNU Emacs
Manualを参照)により使用されるサブルーチンである。これは、キーマップのセット内でcommandにバインドされる、(任意の長さの)キーシーケンスすべてのリストをリターンする。
引数commandには、任意のオブジェクトを指定できる。このオブジェクトは、すべてのキーマップエントリーにたいし、eq
を使用して比較される。
keymapがnil
の場合、overriding-local-map
の値とは無関係に(overriding-local-map
の値がnil
であると装い)、カレントアクティブキーマップをマップとして使用する。keymapがキーマップの場合は、keymapとグローバルキーマップが検索されるマップとなる。keymapがキーマップのリストの場合は、それらのキーマップだけが検索される。
keymapにたいする式としては、通常はoverriding-local-map
を使用するのが最善である。その場合、where-is-internal
は正にアクティブなキーマップを検索する。グローバルマップだけを検索するには、keymapの値に(keymap)
(空のキーマップ)を渡せばよい。
firstonlyがnon-ascii
の場合、値はすべての可能なキーシーケンスのリストではなく、最初に見つかったキーシーケンスを表す単一のベクターとなる。firstonlyがt
の場合、値は最初のキーシーケンスだが、全体がASCII文字(またはメタ修飾されたASCII文字)で構成されるキーシーケンスが、他のすべてのキーシーケンスに優先され、リターン値がメニューバインディングになることは決してない。
noindirectが非nil
の場合、where-is-internal
はインダイレクトキーマップ(indirect
keymap: 間接キーマップ)のバインディングを追跡しない。これにより、インダイレクト定義自体にたいして検索が可能になる。
5つ目の引数no-remapは、この関数がコマンドリマッピング(Remapping Commandsを参照)を扱う方法を決定する。興味深いケースが2つある:
no-remapがnil
の場合は、other-commandにたいするバインディングを探して、commandにたいするバインディングであるかのようにそれらを扱う。no-remapが非nil
の場合は、それらのバインディングを探すかわりに、利用可能なキーシーケンスリストに、ベクター[remap
other-command]
を含める。
no-remapがnil
の場合は、commandではなくother-commandにたいするバインディングをリターンする。no-remapが非nil
の場合は、リマップされていることを無視して、commandにたいするバインディングをリターンする。
この関数は、すべてのカレントキーバインディングのリストを作成して、*Help*という名前のバッファーにそれを表示する。テキストはモードごとにグループ化され、順番はマイナーモード、メジャーモード、グローバルバインディングの順である。
prefixが非nil
の場合、それはプレフィクスキーである。その場合、リストに含まれるのはprefixで始まるキーだけになる。
複数の連続するASCIIコードが同じ定義をもつとき、それらは‘firstchar..lastchar’のようにまとめて表示される。この場合、それがどの文字に該当するかを理解するためには、そのASCIIコードを知っている必要がある。たとえば、デフォルトグローバルマップでは、文字‘SPC
..
~’は1行で記述される。SPCはASCIIの32,~はASCIIの126で、その間のすべての文字には、通常のプリント文字(アルファベット文字、数字、句読点など)が含まれる。これらの文字はすべて、self-insert-command
にバインドされる。
buffer-or-nameが非nil
の場合、それはバッファー、またはバッファー名である。その場合、describe-bindings
はカレントバッファーのかわりに、そのバッファーのバインディングをリストする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーマップは、キーボードキーやマウスボタンにたいするバインディング定義と同様に、メニューとして操作することができます。メニューは、通常はマウスにより操作されますが、キーボードでも機能させことができます。次の入力イベントにたいしてメニューキーマップがアクティブな場合は、キーボードメニュー機能がアクティブになります。
21.17.1 Defining Menus | メニューを定義するキーマップを作成する方法。 | |
21.17.2 Menus and the Mouse | ユーザーがマウスでメニューを操作する方法。 | |
21.17.3 Menus and the Keyboard | ユーザーがキーボードでメニューを操作する方法。 | |
21.17.4 Menu Example | シンプルなメニューの作成。 | |
21.17.5 The Menu Bar | メニューバーのカスタマイズ方法。 | |
21.17.6 Tool bars | イメージ行のツールバー。 | |
21.17.7 Modifying Menus | メニューへ新たなアイテムを追加する方法。 | |
21.17.8 Easy Menu | メニュー作成のための便利なマクロ。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーマップがoverallプロンプト文字列(overall prompt string)をもつ場合、そのキーマップはメニューとして動作します。overallプロンプト文字列とは、キーマップの要素として表される文字列です(Format of Keymapsを参照)。この文字列には、メニューコマンドの目的を記述します。Emacsは、(もしあれば)メニュー表示に使用されるツールキットに応じ、メニュータイトルとしてoverallメニュー文字列を表示します12。キーボードメニューもoverallプロンプト文字列を表示します。
プロンプト文字列をもつキーマップを構築するもっとも簡単な方法は、make-keymap
、make-sparse-keymap
(Creating Keymapsを参照)、define-prefix-command
(Definition of define-prefix-commandを参照)を呼び出すときに引数で文字列を指定する方法です。キーマップをメニューとして操作したくない場合は、これらの関数にたいしてプロンプト文字列を指定しないでください。
この関数は、keymapのoverallプロンプト文字列を、もしなければnil
をリターンする。
メニューのアイテムは、そのキーマップ内のバインディングです。各バインディングはイベント型と定義を関連付けますが、イベント型はメニューの外見に何の意味ももちません(通常は、イベント型としてキーボードが生成できない擬似イベントのシンボルをメニューアイテムのバインディングに使用する)。メニュー全体は、これらのイベントにたいするキーマップ内のバインディングから生成されます。
メニュー内のアイテムの順序は、キーマップ内のバインディングの順序と同じです。define-key
は新たなバインディングを先頭に置くので、メニューアイテムの順序が重要な場合は、メニューの最後から先頭へメニューアイテムを定義する必要があります。既存のメニューにアイテムを追加するときは、define-key-after
を使用してメニュー内の位置を指定できます(Modifying Menusを参照)。
21.17.1.1 Simple Menu Items | 単純なメニューのキーバインディング。 | |
21.17.1.2 Extended Menu Items | 複雑なメニューアイテムの定義。 | |
21.17.1.3 Menu Separators | メニューに水平ラインを描画する。 | |
21.17.1.4 Alias Menu Items | メニューアイテムにコマンドエイリアスを使用する。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メニューアイテムを定義する単純(かつ初歩的)な方法は、何らかのイベント型(何のイベント型かは問題にならない)を以下のようにバインドすることです:
(item-string . real-binding)
CARのitem-stringは、メニュー内で表示される文字列です。これは短いほうがよく、1から3の単語が望ましいでしょう。この文字列は、対応するコマンドの動作を説明します。すべてのグラフィカルツールキットが非ASCIIテキストを表示できる訳ではないことに注意してください(キーボードメニューとGTK+ツールキットの大部分では機能するだろう)。
以下のように、ヘルプ文字列と呼ばれる2つ目の文字列を与えることもできます:
(item-string help . real-binding)
helpは、マウスがそのアイテム上にあるときに、help-echo
テキストプロパティ(Help displayを参照)と同じ方法で表示される“help-echo”文字列を指定します。
define-key
に関する限り、item-stringとhelp-stringは、そのイベントのバインディングの一部です。しかし、lookup-key
は単にreal-bindingだけをリターンし、そのキーの実行にはreal-bindingだけが使用されます。
real-bindingがnil
の場合、メニューにitem-stringは表示されまづが、選択できなくなります。
real-bindingがシンボルで、menu-enable
プロパティが非nil
の場合、そのプロパティはメニューアイテムが有効か無効かを制御する式です。メニュー表示にキーマップが使用されるたびに、Emacsはその式を評価して、式の値が非nil
の場合だけ、そのメニューのメニューアイテムを有効にします。メニューアイテム無効なとき、そのアイテムは“fuzzy”形式で表示され、選択できなくなります。
メニューバーはメニューを調べる際に、どのアイテムが有効なのか再計算しません。これは、Xツールキットが事前にメニュー全体を要求するからです。メニューバーの再計算を強制するには、force-mode-line-update
を呼び出してください(Mode Line Formatを参照)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メニューアイテムの拡張フォーマットは、単純なフォーマットに比べて、より柔軟かつ明快です。拡張フォーマットでは、メニューアイテムにバインドのイベント型に、シンボルmenu-item
で始まるシンボルのリストを指定します。選択できない文字列にたいしては、以下のようなバインディングになります:
(menu-item item-name)
2つ以上のダッシュで始まる文字列は、リストのセパレーターを指定します。Menu Separatorsを参照してください。
選択可能な実際のメニューアイテムを定義するには、以下のような拡張フォーマットでバインドします:
(menu-item item-name real-binding . item-property-list)
ここで、item-nameはメニューアイテム文字列を評価する式です。つまり、文字列は底数である必要はありません。3つ目の引数real-bindingは、実行するコマンドです。リストの最後の要素item-property-listは、プロパティリストの形式をもつ、その他の情報を含みます。
以下は、サポートされるプロパティのテーブルです:
:enable form
formの評価結果は、そのアイテムを有効にするかどうかを決定する(非nil
の場合は有効)。アイテムが無効な場合は、実際にクリックできない。
:visible form
formの評価結果は、そのアイテムを実際にメニューに表示するかどうかを決定する(非nil
の場合は表示)。アイテムが非表示の場合は、そのアイテムが定義されていないかのようにメニューが表示される。
:help help
このプロパティhelpの値は、そのアイテム上にマウスがある間表示する“help-echo”文字列を指定する。この文字列は、help-echo
テキストプロパティ(Help displayを参照)と同じ方法で表示される。これは、テキストやoverlayにたいするhelp-echo
プロパティと異なり、文字列定数でなければならないことに注意されたい。
:button (type . selected)
このプロパティは、ラジオボタンおよびトグルボタンを定義する手段を提供する。CARのtypeは、:toggle
か:radio
のいずれかを指定する。CDRのselectedはフォームで、評価結果によりそのボタンがカレントで選択されているかどうかを指定する。
トグル(toggle)は、selectedの値に応じて“on”か“off”のいずれかがラベルされるメニューアイテムである。コマンド自身は、selectedがnil
ならt
に、t
ならnil
にselectedを切り替える(toggle)こと。以下は、debug-on-error
フラグが定義されているときに、メニューアイテムをトグルする方法の例である:
(menu-item "Debug on Error" toggle-debug-on-error :button (:toggle . (and (boundp 'debug-on-error) debug-on-error)))
これは、toggle-debug-on-error
が変数debug-on-error
をトグルするコマンドとして定義されていることにより機能する。
ラジオボタンとは、メニューアイテムのグループであり、常にただ1つのメニューアイテムだけが“選択される(selected)”。そのためには、どのメニューアイテムが選択されているかを示す変数が存在する必要がある。グループ内の各ラジオボタンにたいするselectedフォームは、そのボタンを選択するために、その変数が正しい値をもつかどうかをチェックする。そして、ボタンのクリックにより変数をセットして、クリックされたボタンが選択される。
:key-sequence key-sequence
このプロパティは、そのメニューアイテムにより呼び出されるのと同じコマンドにバインドされるかもしれないキーシーケンスを指定する。正しいキーシーケンスを指定した場合は、メニュー表示の準備がより高速になる。
間違ったキーシーケンスを指定した場合は、何の効果もない。Emacsは、メニュー内のkey-sequenceを表示する前に、実際にそのkey-sequenceがそのメニューアイテムと等価なのか検証する。
:key-sequence nil
このプロパティは、そのメニューアイテムには等価なキーバインディングが通常は存在しないことを示す。このプロパティを使用することにより、Emacsはそのメニューアイテムにたいして等価なキーボード入力をキーマップから検索する必要がなくなるので、メニュー表示の準備時間が短縮される。
しかし、ユーザーがそのアイテムの定義をキーシーケンスにリバインドした場合、Emacsは:keys
プロパティを無視して、結局は等価なキーボード入力を見つけ出す。
:keys string
このプロパティは、そのメニューにたいする等価なキーボード入力として表示される文字列stringを指定する。string内では、ドキュメント構成‘\\[...]’を使用できる。
:filter filter-fn
このプロパティは、メニューアイテムを直接計算する手段を提供する。このプロパティの値filter-fnは、引数が1つの関数で、呼び出し時の引数はreal-bindingである。この関数は、かわりに使用するバインディングをリターンするべきである。
Emacsは、メニューデータ構造を再表示、または操作する任意のタイミングでこの関数を呼び出し得るので、いつ呼び出されても安全なように関数を記述すべきである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メニューセパレーターは、テキストを表示するかわりに、水平ラインでメニューをサブパーツに分割する、メニューアイテムの一種です。メニューキーマップ内で、セパレーターは以下のように見えます:
(menu-item separator-type)
ここで、separator-typeは2つ以上のダッシュで始まる文字列です。
もっとも単純なケースでは、ダッシュだけでseparator-typeが構成されます。これはデフォルトのセパレーターを指定します(互換性のため、""
と-
もセパレーターとみなされる)。
separator-typeにたいする他の特定の値は、異なるスタイルのセパレーターを指定します。以下はそれらのテーブルです:
"--no-line"
"--space"
実際のラインではない、余分な垂直スペース。
"--single-line"
メニューのforegroundカラーの一重ライン。
"--double-line"
メニューのforegroundカラーの二重ライン。
"--single-dashed-line"
メニューのforegroundカラーの一重ダッシュライン。
"--double-dashed-line"
メニューのforegroundカラーの二重ダッシュライン。
"--shadow-etched-in"
3Dの窪んだ外観(3D sunken appearance)をもつ一重ライン。これはダッシュだけで構成されるセパレーターに使用されるデフォルトである。
"--shadow-etched-out"
3Dの浮き上がった外観(3D raised appearance)をもつ一重ライン。
"--shadow-etched-in-dash"
3Dの窪んだ外観(3D sunken appearance)をもつ一重ダッシュライン。
"--shadow-etched-out-dash"
3Dの浮き上がった外観(3D raised appearance)をもつ一重ダッシュライン。
"--shadow-double-etched-in"
3Dの窪んだ外観をもつ二重ライン。
"--shadow-double-etched-out"
3Dの浮き上がった外観をもつ二重ライン。
"--shadow-double-etched-in-dash"
3Dの窪んだ外観をもつ二重ダッシュライン。
"--shadow-double-etched-out-dash"
3Dの浮き上がった外観をもつ二重ダッシュライン。
2連ダッシュの後にコロンを追加して、1連ダッシュの後の単語の先頭の文字を大文字にすることにより、別のスタイルで名前を与えることもできます。つまり、"--:singleLine"
は"--single-line"
と等価です。
メニューセパレーターにたいして:enable
や:visible
のようなキーワードを指定するために、長い形式を使用できます。
(menu-item separator-type nil . item-property-list)
たとえば:
(menu-item "--" nil :visible (boundp 'foo))
いくつかのシステムおよびディスプレイツールキットは、これらすべてのセパレータータイプを実際に処理しません。サポートされないタイプのセパレーターを使用した場合、メニューはサポートされている似た種別のセパレーターを表示します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
“同じ”コマンドを使用するが、有効条件が異なるメニューアイテムを作成すると便利な場合が時折あります。Emacsでこれを行う最善の方法は、拡張メニューアイテム(extended
menu
item)です。この機能が存在する以前は、エイリアスコマンドを定義して、それらをメニューアイテムで使用することによりこれを行っていました。以下は、read-only-mode
にたいする2つのエイリアスを作成して、それらに異なる有効条件を与える例です:
(defalias 'make-read-only 'read-only-mode) (put 'make-read-only 'menu-enable '(not buffer-read-only)) (defalias 'make-writable 'read-only-mode) (put 'make-writable 'menu-enable 'buffer-read-only)
メニュー内でエイリアスを使用するときは、エイリアスではなく“実際”のコマンド名にたいする等価なキーバインディングを表示するのが便利な場合が多々あります(エイリアスはメニュー自身を除きキーバインディングを通常はもたない)。これを要求するには、エイリアスシンボルにmenu-alias
プロパティに非nil
を与えます。したがって、
(put 'make-read-only 'menu-alias t) (put 'make-writable 'menu-alias t)
は、make-read-only
とmake-writable
にたいするメニューアイテムに、read-only-mode
のキーバインディングを表示します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メニューキーマップがメニューを生成する通常の方法は、それをプレフィクスキーの定義とすることです。(Lispプログラムは明示的にメニューをポップアップして、ユーザーの選択を受け取ることができる。Pop-Up Menusを参照のこと。)
プレフィクスキーがマウスイベントで終わる場合、ユーザーがマウスで選択できるように、Emacsは可視なメニューをポップアップすることによりメニューキーマップを処理します。ユーザーがメニューアイテムをクリックしたときは、そのメニューアイテムによりもたらされるバインディングの文字、またはシンボルが何であれ、イベントが生成されます(メニューが複数レベルをもつ場合やメニューバー由来の場合、メニューアイテムは1連のイベントを生成するかもしれない)。
メニューのトリガーにbutton-downイベントを使用するのが最善な場合もしばしばあります。その場合、ユーザーはマウスボタンをリリースすることにより、メニューアイテムを選択できます。
メニューキーマップがネストされたキーマップにたいするバインディングを含む場合、そのネストされたキーマップはサブメニュー(submenu)を指定します。それにはネストされたキーマップのアイテム文字列によりラベル付けされたメニューアイテムがあり、そのアイテムをクリックすることにより、指定されたサブメニューが自動的にポップアップされます。特別な例外として、メニューキーマップが単一のネストされたキーマップを含み、それ以外のメニューアイテムを含まない場合、そのメニューはネストされたキーマップの内容を、サブメニューとしてではなく、直接メニューに表示します。
しかし、XツールキットのサポートなしでEmacsをコンパイルした場合、またはテキスト端末の場合、サブメニューはサポートされません。ネストされたキーマップはメニューアイテムとして表示されますが、それをクリックしても、サブメニューは自動的にポップアップされません。サブメニューの効果を模倣したい場合は、ネストされたキーマップに‘@’で始まるアイテム文字列を与えることにより、これを行うことができます。これにより、Emacsは別個のメニューペイン(menu pane)を使用してネストされたキーマップを表示します。‘@’の後の残りのアイテム文字列は、そのペインのラベルです。XツールキットのサポートなしでEmacsをコンパイルした場合、またはメニューがテキスト端末で表示されている場合、メニューペインは使用されません。この場合、アイテム文字列の先頭の‘@’は、メニューラベル表示時には省略され、他に効果はありません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
キーボードイベント(文字かファンクションキー)で終わるプレフィクスキーがメニューキーマップであるような定義をもつとき、そのキーマップはキーボードメニューのように動作します。ユーザーは、キーボードでメニューアイテムを選択して、次のイベントを指定します。
Emacsは、エコーエリアにキーボードメニュー、そのマップのoverallプロンプト文字列、その後に候補(そのマップのバインディングのアイテム文字列)を表示します。そのバインディングを一度に全部表示できない場合、ユーザーはSPCをタイプして、候補の次の行を確認できます。連続してSPCを使用するとメニューの最後に達し、その後は先頭へ巡回します。(変数menu-prompt-more-char
はこのために使用する文字を指定する。デフォルトはSPC。)
ユーザーがメニューから望ましい候補を見つけたら、バインディングがその候補であるような、対応する文字をタイプする必要があります。
この変数は、メニューの次の行を確認するために使用する文字を指定する。初期値は32で、これはSPCのコードである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、メニューキーマップを定義する、完全な例です。これは、メニューバー内の‘Edit’メニューにサブメニュー‘Replace’を定義して、その定義内で拡張メニューフォーマット(Extended Menu Itemsを参照)を使用します。例ではまずキーマップを作成して、それに名前をつけます:
(defvar menu-bar-replace-menu (make-sparse-keymap "Replace"))
次にメニューアイテムを定義します:
(define-key menu-bar-replace-menu [tags-repl-continue]
'(menu-item "Continue Replace" tags-loop-continue
:help "Continue last tags replace operation"))
(define-key menu-bar-replace-menu [tags-repl]
'(menu-item "Replace in tagged files" tags-query-replace
:help "Interactively replace a regexp in all tagged files"))
(define-key menu-bar-replace-menu [separator-replace-tags]
'(menu-item "--"))
;; …
バインディングがそのシンボルのために“作成された”ことに注意してください。これらのシンボルは、定義されるキーシーケンス内の角カッコ内に記述されます。このシンボルはコマンド名と同じときもあれば、異なることもあります。これらのシンボルは“ファンクションキー”として扱われますが、これらはキーボード上の実際のファンクションキーではありません。これらはメニュー自体の機能に影響しませんが、ユーザーがメニューから選択したときにエコーエリアに“エコー”され、where-is
とapropos
の出力に現れます。
この例のメニューは、マウスによる使用を意図しています。もしキーボードの使用を意図したメニュー、つまりキーボードイベントで終了するキーシーケンスにバインドされたメニューの場合、メニューアイテムはキーボードでタイプできる文字、または“実際”のファンクションキーにバインドされるべきです。
定義が("--")
のバインディングは、セパレーターラインです。実際のメニューアイテムと同様、セパレーターはキーシンボルをもち、この例ではseparator-replace-tags
です。1つのメニューが2つのセパレーターをもつ場合、それらは2つの異なるキーシンボルをもたなければなりません。
以下では、親メニュー内のアイテムとしてこのメニューがどのように表示されるかを記述しています:
(define-key menu-bar-edit-menu [replace] (list 'menu-item "Replace" menu-bar-replace-menu))
これは、シンボルmenu-bar-replace-menu
自体ではなく、変数menu-bar-replace-menu
の値であるサブメニューキーマップを組み込むことに注意してください。menu-bar-replace-menu
はコマンドではないので、親メニューアイテムにそのシンボルを使用するのは無意味です。
同じreplaceメニューをマウスクリックに割り当てたい場合は、以下のようにこれを行うことができます:
(define-key global-map [C-S-down-mouse-1] menu-bar-replace-menu)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsは通常、各フレームの最上部にメニューバー(menu bar)を表示します。Menu Bars in The
GNU Emacs
Manualを参照してください。メニューバーのアイテムは、アクティブキーマップ内で定義される偽りの“ファンクションキー”menu-bar
のサブコマンドです。
メニューバーにアイテムを追加するには、自分で偽りの“ファンクションキー”(これをkeyと呼ぶことにしましょう)を創作して、キーシーケンス[menu-bar
key]
にたいするキーバインディングを作成します。ほとんどの場合において、そのバインディングはメニューキーマップなので、メニューバーアイテム上でボタンを押下すると、他のメニューに導かれます。
メニューバーにたいして同じ“ファンクションキー”を定義するアクティブなキーマップが1つ以上存在するとき、そのアイテムは1回だけ出現します。ユーザーがメニューバーのそのアイテムをクリックした場合、そのアイテムのすべてのサブコマンド— グローバルサブコマンド、ローカルサブコマンド、マイナーモードサブコマンドが組み合わされた単一のメニューを表示します。
変数overriding-local-map
は通常、メニューバーのコンテンツを決定する際は無視されます。つまり、メニューバーはoverriding-local-map
がnil
の場合にアクティブになるであろうキーマップから計算されます。Active Keymapsを参照してください。
以下は、メニューバーのアイテムをセットアップする例です:
;; (プロンプト文字列とともに)メニューキーマップを作成して ;; それをメニューバーアイテムの定義にする (define-key global-map [menu-bar words] (cons "Words" (make-sparse-keymap "Words")))
;; メニュー内に具体的なサブコマンドを定義する
(define-key global-map
[menu-bar words forward]
'("Forward word" . forward-word))
(define-key global-map [menu-bar words backward] '("Backward word" . backward-word))
ローカルキーマップは、グローバルキーマップにより作成されたメニューバーアイテムにたいして、同じ偽ファンクションキーをundefined
にリバインドしてキャンセルすることができます。たとえば、以下はDiredが‘Edit’メニューバーアイテムを抑制する方法です:
(define-key dired-mode-map [menu-bar edit] 'undefined)
ここで、edit
は‘Edit’メニューバーアイテムにたいしてグローバルキーマップにより使用される偽ファンクションキーです。グローバルメニューバーアイテムを抑制する主な理由は、モード特有のアイテムのためのスペースを確保するためです。
通常メニューバーナーグローバルアイテムの後にローカルマップにより定義されるアイテムを表示する。
この変数は、通常の順番による位置ではなく、メニューの最後に表示するアイテムのための偽ファンクションキーのリストを保持する。デフォルト値は(help-menu)
である。したがって、‘Help’メニューアイテムはメニューバーの最後、ローカルメニューアイテムの後に表示される。
このノーマルフックは、メニューバーの再表示の前に、メニューバーのコンテンツを更新するための再表示により実行される。コンテンツを変化させる必要があるメニューの更新に使用できる。このフックは頻繁に実行されるので、フックが呼び出す関数は、通常の場合は長い時間を要さないことを確実にするよう助言する。
Emacsは、すべてのメニューバーアイテムの隣に、(もしそのようなキーバインディングが存在するなら)同じコマンドを実行するキーバインディングを表示します。これは、キーバインディングを知らないユーザーにたいして便利なヒントを与える役目をもちます。コマンドが複数のバインディングをもつ場合、通常Emacsは最初に見つけたバインディングを表示します。コマンドのシンボルプロパティ:advertised-binding
に割り当てることにより、特定のキーバインディングを指定できます。Substituting Key Bindings in Documentationを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ツールバー(tool bar)とは、フレームの最上部、メニューバー直下にある、クリック可能なアイコンの行のことです。Tool Bars in The GNU Emacs Manualを参照してください。Emacsは通常、グラフィカルなディスプレイ上でツールバーを表示します。
各フレームでは、ツールバーに何行分の高さを割り当てるかを、フレームパラメーターtool-bar-lines
が制御します。値0は、ツールバーを抑制します。値が非0で、auto-resize-tool-bars
が非nil
の場合、指定されたコンテンツを維持するのに必要な分、ツールバーは拡大縮小されます。値がgrow-only
の場合、ツールバーは自動的に拡大されますが、自動的に縮小はされません。
ツールバーのコンテンツは、(メニューバーが制御されるのと似た方法により)tool-bar
と呼ばれる偽りの“ファンクションキー”に割り当てられたメニューキーマップにより制御されます。したがって、以下のようにdefine-key
を使用して、ツールバーアイテムを定義します。
(define-key global-map [tool-bar key] item)
ここでkeyは、そのアイテムを他のアイテムと区別する偽“ファンクションキー”で、itemはそのアイテムを表示する方法とアイテムの振る舞いを示すメニューアイテムキーバインディングです(Extended Menu Itemsを参照)。
メニューキーマップの通常のプロパティ:visible
、:enable
、:button
、:filter
はツールバーバインディングでも役に立ち、いずれのプロパティも通常通りの意味をもちます。アイテム内のreal-bindingは、キーマップではなくコマンドでなければなりません。別の言い方をすると、これはツールバーアイコンをプレフィクスキーとして定義するようには機能しないということです。
:help
プロパティは、そのアイテム上にマウスがある間表示する、“help-echo”文字列を指定します。これは、テキストプロパティhelp-echo
と同じ方法で表示されます(Help displayを参照)。
これらに加えて、:image
プロパティも使用するべきでしょう。これは、ツールバー内にイメージを表示するには、このプロパティを使用します。
:image image
imagesは単一イメージ様式(single image specification)、または4ベクターイメージ様式(vector of four image specifications)で指定する。4ベクターを使用する場合、状況に応じてそれらのうち1つが使用される:
アイテムが有効かつ選択されているとき使用される。
アイテムが有効かつ未選択のとき使用される。
アイテムが無効かつ選択されているとき使用される。
アイテムが無効かつ未選択のとき使用される。
GTK+およびNSバージョンのEmacsは、無効、および/または未選択のイメージをitem0から自動的に計算するので、item1からitem3は無視されます。
imageが単一イメージ様式の場合、Emacsはそのイメージにエッジ検出アルゴリズム(edge-detection algorithm)を適用することにより、ツールバーの無効な状態のボタンを描画します。
:rtl
プロパティには、右から左に記述する言語のためのイメージ候補を指定します。現在のところ、これをサポートするのはGTK+バージョンのEmacsだけです。
メニューバーと同様、ツールバーはセパレーター(Menu Separatorsを参照)を表示できます。ツールバーのセパレーターは水平ラインではなく垂直ラインであり、1つのスタイルだけがサポートされます。これらは、ツールバーキーマップ内では(menu-item
"--")
エントリーで表されます。ツールバーのセパレーターでは、:visible
のようなプロパティはサポートされません。GTK+とNextstepのツールバーでは、セパレーターはネイティブに描画されます。それ以外では、セパレーターは垂直ラインイメージを使用して描画されます。
デフォルトツールバーは、コマンドシンボルのmode-class
プロパティにspecial
をもつメジャーモードにたいしては、編集に特化したアイテムは表示されないよう定義されています(Major Mode Conventionsを参照)。メジャーモードは、ローカルマップ内でバインディング[tool-bar
foo]
によって、グローバルバーにアイテムを追加するかもしれません。デフォルトツールバーの多くを適宜流用するのができないかもしれないため、デフォルトツールバーを完全に置き換えることは、いくつかのメジャーモードにとっては意味があります。デフォルトバインディングでtool-bar-map
を通じてインダイレクトすることにより、これを簡単に行うことができます。
デフォルトでは、グローバルマップは[tool-bar]
を以下のようにバインドする:
(global-set-key [tool-bar] `(menu-item ,(purecopy "tool bar") ignore :filter tool-bar-make-keymap))
関数tool-bar-make-keymap
は、変数tool-bar-map
の値より、順に実際のツールバーマップをダイナミックに継承する。したがって、通常はそのマップを変更することにより、デフォルト(グローバル)ツールバーを調整すべきである。Infoモードのようないくつかのメジャーモードは、tool-bar-map
をバッファーローカルにして、それに異なるキーマップをセットすることにより、グローバルツールバーを完全に置き換える。
以下のような、ツールバーアイテムを定義するのに便利な関数があります。
この関数は、tool-bar-map
を変更することにより、ツールバーにアイテムを追加する。使用するイメージはiconにより定義され、これはfind-image
に配置されたXPM、XBM、PBMのイメージファイルの拡張子を除いたファイル名(basename)である。たとえばカラーディスプレイ上では、値に‘"exit"’を与えるとexit.xpm、exit.pbm、exit.xbmの順に検索されるだろう。モノクロディスプレイでは、検索は‘.pbm’、‘.xbm’、‘.xpm’の順になる。使用するバインディングはコマンドdefで、keyはプレフィクスキーマップ内の偽ファンクションキーである。残りの引数propsは、メニューアイテム仕様に追加する、追加のプロパティリスト要素である。
あるローカルマップ内にアイテムを定義するためには、この関数呼び出しの周囲のlet
でtool-bar-map
をバインドする:
(defvar foo-tool-bar-map (let ((tool-bar-map (make-sparse-keymap))) (tool-bar-add-item …) … tool-bar-map))
この関数は、既存のメニューバインディングと矛盾しないツールバーアイテムの定義に有用である。commandのバインディングはmap(デフォルトはglobal-map
)内よりルックアップ(lookup:
照合)され、iconにたいするイメージ仕様はtool-bar-add-item
と同じ方法で見つけ出される。結果のバインディングはtool-bar-map
に配されるので、この関数の使用はグローバルツールバーアイテムに限定される。
mapには、[menu-bar]
にバインドされた適切なキーマップが含まれていなければならない。残りの引数propsは、メニューアイテム仕様に追加する、追加のプロパティリスト要素である。
この関数は、非グローバルツールバーアイテムの作成に使用される。in-mapに定義を作成するローカルマップを指定する以外は、tool-bar-add-item-from-menu
と同じように使用する。引数from-mapは、tool-bar-add-item-from-menu
のmapと同様である。
この変数が非nil
の場合、定義されたすべてのツールバーアイテムを表示するために、ツールバーは自動的にリサイズ —
ただし、そのフレーム高さの1/4を超えてリサイズされることはない。
値がgrow-only
の場合、ツールバーは自動的に拡張されるが、自動的に縮小はされない。ツールバーを縮小するために、ユーザーはC-lをエンターしてフレームを再描画する必要がある。
GTK、またはNextstepとともにEmacsがビルドされた場合、ツールバーが表示できるのは1行だけであり、この変数は効果がない。
この変数が非nil
の場合、ツールバーアイテムの上をマウスが通過したとき、浮き上がった形式(raised form)で表示される。
この変数は、ツールバーアイテムの周囲に追加する余白(extra margin)を指定する。値はピクセル数を整数で指定し、デフォルトは4である。
この変数は、ツールバーアイテムの影(shadow)を指定する。値はピクセル数を整数で指定し、デフォルトは1である。
この変数は、ツールバーエリアの下に描画するボーダー高さを指定する。値が整数の場合は、高さのピクセル数である。値がinternal-border-width
(デフォルト)かborder-width
のいずれの場合、ツールバーのボーダー高さは、そのフレームの対応するパラメーターとなる。
シフト、メタ等の修飾キーを押下した状態でのツールバーアイテムのクリックにたいして、特別な意味を付与できます。偽りのファンクションキーを通じて、元のアイテムに関連する追加アイテムをセットアップすることにより、これを行うことができます。より具体的には、追加アイテムは、元のアイテムの命名に使用されたのと同じ偽ファンクションキーの修飾されたバージョンを使用するべきです。
つまり、元のアイテムが以下のように定義されている場合、
(define-key global-map [tool-bar shell] '(menu-item "Shell" shell :image (image :type xpm :file "shell.xpm")))
シフト修飾とともに同じツールバーイメージをクリックしたときは、以下のような方法で定義することができます:
(define-key global-map [tool-bar S-shell] 'some-command)
ファンクションキーにたいして修飾を追加する方法についての詳細な情報は、Function Keysを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
既存のメニューに新たなアイテムを挿入するときは、そのメニューの既存のアイテムの中の特定の位置にアイテムを追加したいと思うかもしれません。define-key
を使用してアイテムを追加した場合は通常、そのアイテムはメニューの先頭に追加されます。メニュー内の他の位置にアイテムを追加するには、define-key-after
を使用します:
define-key
と同じように、map内にkeyにたいする値bindingのバインディングを定義するが、map内でそのバインディングの位置は、イベントafterにたいするバインディングの後になる。引数keyは長さ1
— 1要素だけのベクターか文字列にすべきである。しかしafterは単一のイベント型 —
シーケンスではないシンボルか文字にすべきである。新たなバインディングは、afterにたいするバインディングの後に追加される。afterがt
、または省略された場合、新たなバインディングはそのキーマップの最後に追加される。しかし、新たなバインディングは、すべての継承されたキーマップの前に追加される。
以下に例を示す:
(define-key-after my-menu [drink] '("Drink" . drink-command) 'eat)
これは、偽ファンクションキーDRINKにたいするバインディングを作成して、EATにたいするバインディングの直後に追加する。
以下に、Shellモードの‘Signals’メニュー内のアイテムbreak
の後に、‘Work’と呼ばれるアイテムを追加する方法を示す:
(define-key-after (lookup-key shell-mode-map [menu-bar signals]) [work] '("Work" . work-command) 'break)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のマクロは、ポップアップメニュー、および/またはメニューバーメニューを定義する便利な方法を提供します。
このマクロは、menuにより与えるコンテンツのポップアップメニュー、および/またはメニューバーサブメニューを定義する。
symbolが非nil
の場合、それはシンボルである。その場合、このマクロはドキュメント文字列docをもつ、メニューをポップアップ(Pop-Up Menusを参照)する関数としてsymbolをを定義する。symbolはクォートされるべきではない。
symbolの値とは関係なく、mapsがキーマップの場合、メニューはメニューバーのトップレベルのメニュー(The Menu Barを参照)としてmapsに追加される。これにはキーマップのリストも指定でき、その場合メニューはそれらのキーマップに個別に追加される。
menuの最初の要素は文字列でなければならず、それはメニューラベルの役割をもつ。値には、以下のキーワード/引数ペアーが任意の個数続くかもしれない:
:filter function
functionは1つの引数(他のメニューアイテムのリスト)で呼び出される関数でなければならず、メニュー内に表示される実際のアイテムをリターンする。
:visible include
includeには式を指定する。その式がnil
に評価された場合、メニューは不可視になる。:included
は、:visible
にたいするエイリアスである。
:active enable
enableは式を。指定する。その式がnil
に評価された場合、メニューは選択不可になる。:enable
は、:active
にたいするエイリアスである。
menu内の残りの要素は、メニューアイテムである。
メニューアイテムには、3要素のベクター[name callback
enable]
を指定できる。ここでnameはメニューアイテム名(文字列)、callbackはアイテム選択時に実行するコマンド、または評価される式である。enableは式であり、nil
に評価された場合、そのアイテムにたいする選択は無効になる。
かわりに、メニューアイテムは以下の形式をもつかもしれない:
[ name callback [ keyword arg ]... ]
ここでnameとcallbackは上記と同じ意味をもち、オプションのkeywordとargの各ペアーは、以下のいずれかである:
:keys keys
keysは、メニューアイテムにたいする等価なキーボード入力(文字列)である。等価なキーボード入力は自動的に計算されるので、通常は必要ない。keysは、表示される前にsubstitute-command-keys
により展開される(Substituting Key Bindings in Documentationを参照)。
:key-sequence keys
keysは、最初にメニューを表示されるかをする際、Emacsを高速化するヒントになる。等価なキーボード入力のないことが既知の場合は、nil
を指定すべきである。それ以外では、メニューアイテムにたいする等価なキーボード入力を指定する文字列、またはベクターを指定すべきである。
:active enable
enableには式を指定する。その式がnil
に評価された場合、アイテムは選択不可になる。enableは、:active
にたいするエイリアスである。
:visible include
includeには式を指定する。その式がnil
に評価された場合、アイテムは不可視になる。:included
は、:visible
にたいするエイリアスである。
:label form
formは、メニューアイテムのラベル(デフォルトはname)の役目をもつ値を取得するために表示される式である。
:suffix form
formは、動的に評価される式であり、値はメニューエントリーのラベルに結合される。
:style style
styleは、メニューアイテムの型を記述するシンボルであり、toggle
(チェックボックス)、radio
(ラジオボタン)、またはそれ以外(通常のメニューアイテムであることを意味する)のいずれかである。
:selected selected
selectedには式を指定し、その式の値が非nil
のときはチェックボックス、またはラジオボタンが選択状態になる。
:help help
helpは、メニューアイテムを説明する文字列である。
かわりに、メニューアイテムに文字列を指定できる。その場合、文字列は選択不可なテキストとしてメニューに表示される。ダッシュから構成される文字列は、セパレーターとして表示される(Menu Separatorsを参照)
かわりに、メニューアイテムにmenuと同じフォーマットのリストを指定できる。これはサブメニューとなる。
以下は、easy-menu-define
を使用して、The Menu Bar内で定義したメニューと同等なメニューを定義する例である:
(easy-menu-define words-menu global-map "単語単位コマンドにたいするメニュー" '("Words" ["Forward word" forward-word] ["Backward word" backward-word]))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
モード(mode)とは、Emacsをカスタマイズする定義のセットであり、編集時にオン/オフを切り替えることができます。モードには2つの種類があります。メジャーモード(major modes)とは、互いに排他なモードであり、特定の種類のテキストの編集にたいして使用されます。マイナーモード(minor modes)とは、ユーザーが個別に有効にすることができる機能を提供します。
このチャプターでは、メジャーモード、およびマイナーモードを記述する方法、モードラインにそれらを示す方法、そしてそれらのモードがユーザーが提供するフックを実行する方法について説明します。キーマップ(keymaps)や構文テーブル(syntax tables)のような関連するトピックについてはKeymapsおよびSyntax Tablesを参照してください。
22.1 Hooks | フックの使い方と、フックを提供するコードの記述方法。 | |
22.2 Major Modes | メジャーモードの定義。 | |
22.3 Minor Modes | マイナーモードの定義。 | |
22.4 Mode Line Format | モードラインに表示されるテキストのカスタマイズ。 | |
22.5 Imenu | バッファーで作成された定義のメニューを提供する。 | |
22.6 Font Lock Mode | モードが構文に応じてテキストをハイライトする方法。 | |
22.7 Automatic Indentation of code | メジャーモードにたいするインデントをEmacsに伝える方法。 | |
22.8 Desktop Save Mode | Emacsセッション間でモードがバッファー状態を保存する方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フック(hook)とは、既存のプログラムから特定のタイミングで呼び出される関数(複数可)を格納することができる変数のことです。Emacsはカスタマイズ用にフックを提供します。ほとんどの場合は、initファイル内(The Init Fileを参照)でフックをセットアップしますが、Lispプログラムもフックをセットできます。標準的なフック変数のリストは、Standard Hooksを参照してください。
Emacsのほとんどのフックは、ノーマルフック(normal hooks)です。これらの変数は、引数なしで呼び出される、関数のリストを含んでいます。慣習により、フック名が‘-hook’で終わるフックは、そのフックがノーマルフックであることを意味します。わたしたちは、一貫した方法でフックを使用できるよう、すべてのフックが可能な限りノーマルフックとなるよう努力しています。
すべてのメジャーモードコマンドは、初期化の最終ステップの1つとして、モードフック(mode
hook)と呼ばれるノーマルフックを実行するとみなされます。これにより、そのモードによりすでに作成されたバッファーローカル変数割り当てをオーバーライドすることにより、ユーザーがそのモードの動作をカスタマイズするのが簡単になります。ほとんどのマイナーモード関数も、最後にモードフックを実行します。しかし、フックは他のコンテキストでも使用されます。たとえばフックsuspend-hook
は、Emacsが自身をサスペンド(Suspending Emacsを参照)する直前に実行されます。
フックにフック関数を追加するには、add-hook
(Setting Hooksを参照)を呼び出す方法が推奨です。フック関数は、funcall
(What Is a Function?を参照)が受け入れる任意の種類の関数を指定できます。ほとんどのフック変数の初期値はvoidです。add-hook
は、これを扱う方法を知っています。add-hook
により、グローバルフック、またはバッファーローカルフックのどちらを追加することも可能です。
フック変数の名前が‘-hook’で終わらない場合は、それが恐らくアブノーマルフック(abnormal
hook)であることを示しています。こええは、フック関数が引数とともに呼ぶ出されること、または何らかの方法により、そのリターン値が使用されることを意味します。その関数の呼び出し方は、フックのドキュメントに記載されています。アブノーマルフックとして関数を追加するためにadd-hook
を使用できますが、その関数はフック呼び出しの慣習にしたがって記述しななければなりません。慣習により、アブノーマルフックの名前は‘-functions’で終わります。
変数の名前が‘-function’で終わる場合、その値は関数のリストではなく単一の関数です。add-hook
を、単一関数フックのように修正して使用することはできないので、かわりにadd-function
を使用します(Advising Emacs Lisp Functionsを参照)。
22.1.1 Running Hooks | フックの実行方法。 | |
22.1.2 Setting Hooks | 関数をフックに登録、削除する方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ノーマルフックを実行するために使用される、run-hooks
について説明します。また、さまざまな種類のアブノーマルフックを実行する関数についても説明します。
この関数は、引数として1つ以上のノーマルフック変数名をとり、各フックを順に実行する。引数はそれぞれ、ノーマルフック変数であるようなシンボルであること。これらの引数は、指定された順に処理される。
フック変数の値が非nil
の場合、その値は関数のリストであること。run-hooks
は、すべての関数を引数なしで1つずつ呼び出す。
フック変数の値には、単一の関数(ラムダ式、またはシンボルの関数定義)も指定でき、その場合run-hooks
はそれを喚び出す。しかし、この使い方は時代遅れである。
フック変数がバッファーローカルな場合、グローバル変数のかわりにそのバッファーローカル変数が使用される。しかし、そのバッファーローカル変数が要素t
を含む場合は、そのグローバルフック変数も同様に実行されるだろう。
この関数は、hook内のすべての関数に、1つの引数argsを渡して喚び出すことにより、アブノーマルフックを実行する。
この関数は、各フック関数を順に呼び出すことによりアブノーマルフック関数を実行し、それらのうち1つがnil
をリターンして“失敗”したときは停止する。それぞれのフック関数は、引数にargsを渡される。この関数は、フック関数の1つが失敗して停止した場合はnil
、それ以外は非nil
値をリターンする。
この関数は、各フック関数を順に呼び出すことによりアブノーマルフック関数を実行し、それらのうち1つが非nil
値をリターンして“成功”したときは停止する。それぞれのフック関数は、引数にargsを渡される。この関数は、フック関数の1つが失敗して停止した場合はその値を、それ以外はnil
をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、Lisp Interactionモードのときに、モードフックを使用してAuto Fillモードをオンに切り替える例です:
(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)
この関数は、フック変数に関数functionを追加する手軽な方法である。ノーマルフックと同じように、アブノーマルフックにたいしてもこの関数を使用できる。functionには、正しい数の引数を受け付ける任意のLisp関数を指定できる。たとえば、
(add-hook 'text-mode-hook 'my-text-hook-function)
は、text-mode-hook
と呼ばれるフックにmy-text-hook-function
を追加する。
hook内にfunctionがすでに存在する場合(比較にはequal
を使用)、add-hook
は2回目の追加を行わない。
functionのプロパティpermanent-local-hook
が非nil
の場合、kill-all-local-variables
(またはメジャーモードを変更しても)、そのフック変数のローカル値から関数を削除しない。
ノーマルフックにたいして、フック関数は実行される順序に無関係であるようにデザインされるべきである。順序への依存は、トラブルを招く。とはいえ、その順序は予測可能である。通常、functionはフックリストの先頭に追加されるので、(他のadd-hook
呼び出しがなければ)それは最初に実行される。オプション引数appendが非nil
の場合、新たなフック関数はフックリストの最後に追加され、実行されるのも最後になる。
add-hook
は、hookがvoidのとき、または値が単一の関数の場合、値を関数リストにセットまたは変更して、それらを扱うことができる。
localが非nil
の場合、それはグローバルフックリストではなくバッファーローカルフックリストにfunctionを追加する。これはフックをバッファーローカルにして、そのバッファーローカルな値にt
を追加する。バッファーローカルな値へのt
の追加は、ローカル値と同じようにデフォルト値でもフック関数を実行するためのフラグである。
この関数は、フック変数hookからfunctionを削除する。これは、equal
を使用してfunctionとhook要素を比較するので、その比較はシンボルとラムダ式の両方で機能する。
localが非nil
の場合、それはグローバルフックリストではなく、バッファーローカルフックリストからfunctionを削除する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メジャーモードは特定の種類のテキスト編集にEmacsを特化します。すべてのバッファーは1度に1つのメジャーモードをもちます。すべてのメジャーモードは、メジャーモードコマンド(major mode command)に関連付けられ、そのコマンド名は‘-mode’で終わるべきです。このコマンドは、ローカルキーマップのようなさまざまなバッファーローカル変数をセットすることにより、カレントバッファーないでそのモードに切り替える配慮をします。Major Mode Conventionsを参照してください。
Fundamentalモードと呼ばれるはもっとも特化されていないメジャーモードであり、モード特有な定義や変数セッティングをもちません。
これは、Fundamentalモードにたいするメジャーモードコマンドである。他のモードコマンドと異なり、このモードはカスタマイズしてはならないことになっているので、モードフックは何も実行されない(Major Mode Conventionsを参照)。
メジャーモードを記述するもっとも簡単な方法は、マクロdefine-derived-mode
を使用する方法です。これは、既存のメジャーモードを変形して、新たなモードをセットアップします。Defining Derived Modesを参照してください。define-derived-mode
は多くのコーディング規約を自動的に強要するので、たとえ新たなモードが他のモードから明示的に派生されない場合でも、わたしたちはdefine-derived-mode
の使用を推奨します。派生元とするための一般的なモードについては、Basic Major Modesを参照してください。
標準的なGNU EmacsのLispディレクトリーツリーには、いくつかのメジャーモードがtext-mode.el、texinfo.el、lisp-mode.el、rmail.elのようなファイルとして含まれています。モードの記述方法を確認するために、これらのライブラリーを学ぶことができます。
この変数のバッファーローカル値は、カレントのメジャーモードにたいするシンボルを保持する。この変数のデフォルト値は、新たなバッファーにたいするデフォルトのメジャーモードを保持する。標準的なデフォルト値は、fundamental-mode
である。
デフォルト値がnil
の場合、C-x
b(switch-to-buffer
)のようなコマンドを通じてEmacsが新たなバッファーを作成したとき、新たなバッファーは以前カレントだったバッファーのメジャーモードになる。例外として、以前のバッファーのメジャーモードのシンボルプロパティmode-class
が値special
をもつ場合、新たなバッファーはFundamentalモードになる(Major Mode Conventionsを参照)。
22.2.1 Major Mode Conventions | キーマップなどにたいするコーディング規約。 | |
22.2.2 How Emacs Chooses a Major Mode | Emacsが自動的にメジャーモードを選択する方法。 | |
22.2.3 Getting Help about a Major Mode | モードの使用方法の探し方。 | |
22.2.4 Defining Derived Modes | 他のメジャーモードにもとづき新たなメジャーモードを定義する。 | |
22.2.5 Basic Major Modes | 他のモードからよく派生元とさrwるモード。 | |
22.2.6 Mode Hooks | メジャーモード関数の最後に実行されるフック。 | |
22.2.7 Tabulated List mode | 表形式データを含むバッファーにたいする親モード。 | |
22.2.8 Generic Modes | コメント構文とFont Lockモードをサポートするシンプルなメジャーモードの定義。 | |
22.2.9 Major Mode Examples | TextモードとLispモード。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メジャーモードにたいするすべてのコードはさまざまなコーディング規約にしたがうべきであり、それらの規約にはローカルキーマップおよび構文テーブルの初期化、関数名や変数名、フックにたいする規約が含まれます。
define-derived-mode
マクロを使用した場合は、これらの規約を自動的に配慮します。Defining Derived Modesを参照してください。Fundamentalモードは、Emacsのデフォルト状態を表すモードなにで、これらの規約が当てはまらないことに注意してください。
以下の規約リストは、ほんの一部です。一般的に、すべてのメジャーモードは、Emacs全体が首尾一貫するよう、他のEmacsメジャーモードとの一貫性を目指すべきです。ここで、この問題を洗い出すすべての想定される要点をリストするのは不可能です。Emacs開発者が、自身の開発するメジャーモードが通常の規約を逸脱する領域を示す場合は、互換性を保つようにしてください。
そのユーザー自身のキーバインディングに自動的に適合してヘルプが表示されるように、ドキュメント文字列に特別なドキュメントサブストリング‘\[command]’、‘\{keymap}’、‘\<keymap>’を含めるとよいかもしれない。Substituting Key Bindings in Documentationを参照のこと。
kill-all-local-variables
を呼び出すことにより開始するべきである。これは、ノーマルフックchange-major-mode-hook
を実行してから、前のメジャーモードで効力のあったバッファーローカル変数を解放する。Creating and Deleting Buffer-Local Bindingsを参照のこと。
major-mode
にメジャーモードコマンドのシンボルをセットするべきである。これは、describe-mode
がプリントするドキュメントを探す手掛かりとなる。
mode-name
にそのモードの“愛称(pretty
name)”をセットするべきである(これは通常は文字列だが、他の利用可能な形式は、The Data Structure of the Mode Lineを参照のこと)。このモード名は、モードラインに表示される。
indent-line-function
に適切な関数をセットするとともに、インデント用のその他の変数をカスタマイズすべきだろう。
use-local-map
を呼び出すべきである。詳細は、Active Keymapsを参照のこと。
このキーマップは、modename-mode-map
という名前のグローバル変数に永続的に格納されるべきである。通常、そのモードを定義するライブラリーは、この変数をセットする。
モード用のキーマップ変数をセットアップするコードの記述する方法に関するアドバイスは、Tips for Defining Variables Robustlyを参照のこと。
メジャーモードはM-n、M-p、M-sなどのキーもリバインドできる。M-nとM-pにたいするバインディングは、通常は “前方あるいは後方への移動”を意味するような類のものであるべきだが、これは必ずしもカーソル移動を意味する必要はない。
そのモードにより適した方法でテキストに“同じ処理”を行うコマンドを提供する場合に、メジャーモードが標準的なキーシーケンスをリバインドするのは正当性がある。たとえば、プログラム言語を編集するためのメジャーモードは、その言語にとって“関数の先頭に移動する”がより良く機能する方法で、C-M-aを再定義するかもしれない。
ある標準的なキーシーケンスの標準的な意味が、そのモードではほとんど役に立たないような場合にも、メジャーモードが標準的なキーシーケンスをリバインドする正当性がある。たとえば、ミニバッファーモードは、M-rの標準的な意味はミニバッファーではほとんど使用されないので、このキーシーケンスをリバインドする。テキストの自己挿入を許さないDiredやRmailのようなメジャーモードは、アルファベット文字や、その他のプリント文字を特別なコマンドに再定義する正当性がある。
modename-mode-syntax-table
という名前の変数にそれを格納すべきである。Syntax Tablesを参照のこと。
modename-mode-abbrev-table
という名前の変数にそれを格納すべきである。メジャーモードコマンドが自身で何らかのabbrevを定義する場合は、define-abbrev
のsystem-flag引数にt
を渡すべきである。Defining Abbrevsを参照のこと。
font-lock-defaults
にバッファーローカルな値をセットすることにより、Font
Lockモードにたいしてハイライトする方法を指定すべきである(Font Lock Modeを参照)。
imenu-generic-expression
、変数imenu-prev-index-position-function
and
imenu-extract-index-name-function
、または変数imenu-create-index-function
にバッファーローカルな値をセットすることにより、Imenuがバッファー内の定義、またはセクションを探す方法を指定すべきである(Imenuを参照)。
eldoc-documentation-function
にローカル値を指定して、ElDocモードがそのモードを処理する方法を指定できる。
completion-at-point-functions
に1つ以上のバッファーローカルエントリーを追加することにより、さまざまなキーワードの補完方法を指定できる。Completion in Ordinary Buffersを参照のこと。
make-variable-buffer-local
ではなく、メジャーモードコマンド内でmake-local-variable
を使用すること。関数、make-variable-buffer-local
は、それ以降にカスタマイズ変数をセットするすべてのバッファーにたいしてその変数をローカルにし、そのモードを使用しないバッファーにたいしても影響があるだろう。そのようなグローバルな効果は、モードにとって好ましくない。Buffer-Local Variablesを参照のこと。
稀な例外として、Lispパッケージ内でmake-variable-buffer-local
を使用する唯一の正当な方法は、そのパッケージ内でのみ使用される変数にたいして使用をする場合である。他のパッケージにより使用される変数にたいしてこの関数を使用すると、干渉が起こるだろう。
modename-mode-hook
という名前のノーマルなモードフック(mode
hook)をもつべきである。メジャーモードコマンドが一番最後に行うべきことは、run-mode-hooks
の呼び出しである。これは、ノーマルフックchange-major-mode-after-body-hook
、モードフック、その後にafter-change-major-mode-hook
を実行する。Mode Hooksを参照のこと。
define-derived-mode
マクロの使用であるが、これは必須ではない。そのようなモードは、delay-mode-hooks
フォーム内で親のモードコマンドを呼び出すべきである(define-derived-mode
は自動的にこれを行う)。Defining Derived Modes、およびMode Hooksを参照のこと。
change-major-mode-hook
にたいしてバッファーローカル値をセットアップできる(Creating and Deleting Buffer-Local Bindingsを参照)。
mode-class
という名前のプロパティに値special
をputすべきである:
(put 'funny-mode 'mode-class 'special)
これはEmacsにたいして、カレントバッファーがFunnyモードのときに新たなバッファーを作成したとき、たとえmajor-mode
のデフォルト値がnil
であっても、そのバッファーをFunnyモードにしないよう指示する。デフォルトでは、major-mode
にたいする値nil
は、新たなバッファー作成時にカレントバッファーのメジャーモードを使用することを意味するが(How Emacs Chooses a Major Modeを参照)、special
なモードにたいしてはかわりにFundamentalモードが使用される。Dired、Rmail、Buffer
Listのようなモードは、この機能を使用する。
関数view-buffer
は、mode-classがspecialであるようなバッファーではViewモードを有効にしない。そのようなモードは、通常は自身でViewに相当するバインディングを提供するからである。
define-derived-mode
マクロは、親モードがspecialの場合は、自動的に派生モードをspecialにマークする。親モードでspecialモードが有用なら、それを継承したモードでもであろう。Basic Major Modesを参照のこと。
auto-mode-alist
に要素を追加する。autoload用にモードコマンドを定義する場合は、autoload
を呼び出すのと同じファイル内にその要素を追加すべきである。モードコマンドにたいしてautoload
cookieを使用する場合は、その要素を追加するフォームにたいしてもautoload cookieを使用できる(autoload cookieを参照)。モードコマンドをautoloadしない場合は、モード定義を含むファイル内で要素を追加すれば十分である。
defvar
かdefcustom
を使用する(Defining Global Variablesを参照)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルをvisitするとき、ファイル名やファイル自体の内容などの情報を元に、Emacsはそのバッファーにたいするメジャーモードを選択します。また、ファイルのテキスト内で指定されたローカル変数も処理します。
この関数は、カレントバッファーにたいして適切なメジャーモードと、バッファーローカル変数のバインディングを設定する。これはまずset-auto-mode
(以下参照)を呼び出し、その後にhack-local-variables
を実行してパース処理を行って、そのファイルのローカル変数(File Local Variablesを参照)を適切にバインド、または評価する。
normal-mode
のfind-file引数が非nil
の場合、normal-mode
はfind-file
関数が自身を呼び出したとみなす。この場合、normal-mode
はそのファイル内の‘-*-’行の、またはファイルの最後にあるローカル変数を処理するかもしれない。これを行うかどうかは、変数enable-local-variables
が制御する。ファイルのローカル変数セクションの構文は、See Local Variables in Files in The GNU Emacs Manualを参照のこと。
インタラクティブにnormal-mode
を実行した場合、引数find-fileは通常nil
である。この場合、normal-mode
は無条件に任意のファイルローカル変数を処理する。
この関数は、メジャーモードを選択するためにset-auto-mode
を呼び出す。この関数がモードを特定しない場合、そのバッファーのmajor-mode
(以下参照)のデフォルト値により決定されるメジャーモードに留まる。
normal-mode
は、メジャーモードコマンド呼び出しの周囲にcondition-case
を使用するので、エラーはcatchされて、‘File
mode specification error’とともに、元のエラーメッセージがその後に報告される。
この関数は、カレントバッファーにたいして適切なメジャーモードを選択する。この選択は、関数自身の(優先順位による)決定にもとづく。優先順位は、‘-*-’行、ファイル終端近傍の任意の‘mode:’ローカル変数、‘#!’行(interpreter-mode-alist
を使用)、バッファーの先頭のテキスト(magic-mode-alist
を使用)、最後がvisitされるファイル名(auto-mode-alist
を使用)の順である。How Major Modes are Chosen in The GNU Emacs
Manualを参照のこと。enable-local-variables
がnil
の場合、set-auto-mode
は‘-*-’行、およびファイル終端近傍にたいして、modeタグのチェックを何もしない。
モード特定のためにファイル内容をスキャンするのがふさわしくないファイルタイプがいくつかある。たとえば、tarアーカイブファイルの終わり付近に、特定のファイルにたいしてモードを指定するローカル変数セクションをもつアーカイブメンバーファイルが、たまたま含まれているかもしれない。これは、そのファイルを含むtarファイルに適用されるべきではないだろう。同様に、tiffイメージファイルが、‘-*-’パターンにマッチするように見える行を、最初の行に偶然含むかもしれない。これらの理由により、これらのファイル拡張子はどちらもinhibit-local-variables-regexps
リストのメンバーになっている。Emacsが、(モード指定に限らず)ファイルから任意の種類のローカル変数を検索することを防ぐには、このリストにパターンを追加する。
keep-mode-if-sameが非nil
の場合は、すでにそのバッファーが適切なメジャーモードをもつとき、この関数はモードコマンドを呼び出さない。たとえばset-visited-file-name
は、ユーザーがセットしたかもしれないバッファーローカル変数をkillするのを防ぐために、これをt
にセットする。
この関数は、bufferのメジャーモードを、major-mode
のデフォルト値にセットする。major-mode
がnil
の場合は、(それが適切なら)カレントバッファーのメジャーモードを使用する。例外として、bufferの名前が*scratch*の場合は、モードをinitial-major-mode
にセットする。
バッファーを作成する低レベルのプリミティブはこの関数を使用しないが、switch-to-buffer
やfind-file-noselect
のような中位レベルのコマンドは、バッファーを作成するときは、常にこの関数を使用する。
この変数の値は、*scratch*バッファーの初期のメジャーモードを決定する。値は、メジャーモードコマンドであるようなシンボルであること。デフォルト値はlisp-interaction-mode
である。
この変数は、‘#!’行内のコマンドインタープリターを指定するスクリプトにたいして使用するメジャーモードを指定する。変数の値は、(regexp
.
mode)
の形式の要素をもつalistである。これは、そのファイルが\\`regexp\\'
にマッチするインタープリターを指定する場合は、modeを使用することを意味する。たとえば、デフォルト要素の1つは("python[0-9.]*"
. python-mode)
である。
この変数の値は、(regexp
function)
という形式の要素をもつalistである。ここで、regexpは正規表現、functionは関数、またはnil
である。ファイルをvisitした後に、バッファーの先頭のテキストがregexpにマッチした場合、functionが非nil
ならset-auto-mode
はfunctionを呼び出す。functionがnil
の場合は、auto-mode-alist
がモードを決定する。
これはmagic-mode-alist
と同様に機能するが、そのファイルにたいしてauto-mode-alist
がモードを指定しない場合だけ処理される点が異なる。
この変数は、ファイル名パターン(正規表現)と対応するメジャーモードコマンドの連想配列を含む。通常、ファイル名パターンは、‘.el’や‘.c’のようなサフィックスをテストするが、必須ではない。このalistの通常の要素は(regexp
. mode-function)
のようになる。
たとえば、
(("\\`/tmp/fol/" . text-mode) ("\\.texinfo\\'" . texinfo-mode) ("\\.texi\\'" . texinfo-mode)
("\\.el\\'" . emacs-lisp-mode) ("\\.c\\'" . c-mode) ("\\.h\\'" . c-mode) …)
バージョン番号およびバックアップ用サフィックスをもつファイルをvisitしたとき、それらはfile-name-sans-versions
(File Name Componentsを参照)を使用して展開されたファイル名(Functions that Expand Filenamesを参照)から取り除かれてregexpとマッチされて、set-auto-mode
は対応するmode-functionを呼び出す。この機能により、ほとんどのファイルにたいしてEmacsが適切なメジャーモードを選択することが可能になる。
auto-mode-alist
の要素が(regexp function
t)
という形式の場合は、functionを呼び出した後、Emacsは前回マッチしなかったファイル名部分にたいしてマッチするために、再度auto-mode-alist
を検索する。この機能は、圧縮されたパッケージにたいして有用である。("\\.gz\\'"
function
t)
という形式のエントリーは、ファイルを解凍してから、‘.gz’抜きのファイル名にたいして適切なモードに解凍されたファイルを配す。
以下はauto-mode-alist
の先頭に、複数のパターンペアーを追加する方法の例である(あなたは、initファイル内でこの種の式を使ったことがあるかもしれない)。
(setq auto-mode-alist (append ;; ドットで始まる(ディレクトリー名付きの)ファイル名 '(("/\\.[^/]*\\'" . fundamental-mode) ;; ドットのないファイル名 ("/[^\\./]*\\'" . fundamental-mode) ;; ‘.C’で終わるファイル名 ("\\.C\\'" . c++-mode)) auto-mode-alist))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
describe-mode
関数は、メジャーモードに関する情報を提供します。これは通常、C-h
mにバインドされています。この関数は、変数major-mode
(Major Modesを参照)の値を使用します。すべてのメジャーモードがこの変数をセットする必要があるのは、これが理由です。
このコマンドは、カレントバッファーのメジャーモードとマイナーモードのドキュメントを表示する。この関数は、メジャーモードおよびマイナーモードのコマンドのドキュメント文字列を取得するために、documentation
関数を使用する(Access to Documentation Stringsを参照)。
buffer引数に非nil
を指定してLispから呼び出された場合、この関数はカレントバッファーではなく、そのバッファーのメジャーモードとマイナーモードのドキュメントを表示する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
新しいメジャーモードを定義する推奨された方法は、define-derived-mode
を使用して既存のメジャーモードから派生させる方法です。それほど近いモードが存在しない場合はtext-mode
、special-mode
、またはprog-mode
から継承するべきです。Basic Major Modesを参照してください。これらがどれも適切でない場合は、fundamental-mode
から継承することができます(Major Modesを参照)。
このマクロは、variantをメジャーモードコマンドとして定義し、nameをモード名の文字列形式とする。variantとparentは、クォートされていないシンボルであること。
新たなコマンドvariantは、関数parentを呼び出すよう定義され、その後その親モードの特定の性質をオーバーライドする。
variant-map
という名前の、自身のsparseキーマップ(疎キーマップ)をもつ。define-derived-mode
は、variant-map
がすでにセットされていて、かつすでに親をもつ場合を除き、親モードのキーマップを新たなマップの親キーマップにする。
variant-syntax-table
に保持される。ただし、:syntax-table
キーワード(以下参照)を使用して、これをオーバーライドした場合は異なる。define-derived-mode
は、variant-syntax-table
がすでにセットされていて、かつ標準的な構文テーブルよ異なる親をもつ場合を除き、ペアレントモードの構文テーブルをvariant-syntax-table
の親とする。
variant-abbrev-table
に保持される。ただし、:abbrev-table
キーワード(以下参照)を使用して、これをオーバーライドした場合は異なる。
variant-hook
をもつ。これは、このフックを実行した後に、最後にrun-mode-hooks
により、自身の祖先のモードのフックを実行する。
これらに加えて、bodyでparentのその他の性質をオーバーライドする方法を指定できます。コマンドvariantはー、通常のオーバーライドをセットアップした後、そのモードのフックを実行する直前にbody内のフォームを評価します。
parentが非nil
のmode-class
シンボルプロパティをもつ場合、define-derived-mode
はvariantのmode-class
プロパティに、同じ値をセットします。これは、たとえばparentがspecialモードの場合は、variantもspecialモードになることを保証します(Major Mode Conventionsを参照)。
parentにたいしてnil
を指定することもできます。これにより、新たなモードは親をもたなくなります。その後、define-derived-mode
は上述のように振る舞いますが、当然parentにつながるすべてのアクションは省略されます。
引数docstringは、新たなモードにたいするドキュメント文字列を指定します。define-derived-mode
は、このドキュメント文字列の最後にそのモードフックに関する一般的な情報と、その後にそのモードのキーマップを追加します。docstringを省略した場合は、define-derived-mode
がドキュメント文字列を生成します。
keyword-argsは、キーワードと値のペアーです。値は評価されます。現在、以下のキーワードがサポートされています:
:syntax-table
新たなモードにたいする構文テーブルを明示的に指定するために、これを使用できる。nil
値を指定した場合、新たなモードはparentと同じ構文テーブル、parentもnil
の場合は標準的な構文テーブルを使用する(これは、nil
値の非キーワード引数は引数を指定しないのと同じという通常の慣習にはしたがわないことに注意されたい)。
:abbrev-table
新たなモードにたいするabbrevテーブルを明示的に指定するために、これを使用できる。nil
値を指定した場合、新たなモードはparentと同じabbrevテーブル、parentもnil
の場合は、fundamental-mode-abbrev-table
を使用する(繰り返すが、nil
値はこのキーワードを指定しないことではない)。
:group
これが指定された場合、値はそのモードにたいするカスタマイズグループ(customization
group)であること(すべてのメジャーモードがカスタマイズグループをもつ訳ではない)。(まだ実験的かつ未公表だが)現在のところ、これを使用するのはcustomize-mode
コマンドだけである。define-derived-mode
は、指定されたカスタマイズグループを自動的に定義しない。
以下は架空の例である:
(define-derived-mode hypertext-mode text-mode "Hypertext" "ハイパーテキスト用のメジャーモード \\{hypertext-mode-map}" (setq case-fold-search nil)) (define-key hypertext-mode-map [down-mouse-3] 'do-hyper-link)
define-derived-mode
が自動的に行うので、この定義内にinteractive
指定を記述してはならない。
この関数は、シンボルmodesで与えられたメジャーモードのいずれかから、カレントメジャーモードが派生された場合は非nil
をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Fundamentalモードは別として、他のメジャーモードの一般的な派生元となるメジャーモードが3つあります。それはTextモード、Progモード、およびSpecialです。Textモードはその本来もつ機能から有用なモードです(たとえば.txtファイルの編集など)。一方、ProgモードとSpecialモードは主にそのようなモード以外のモードの派生元として存在します。
新たなモードは、直接または間接を問わず、可能な限りれら3つのモードから派生させるべきです。その理由の1つは、関連のあるモードファミリー全体(たとえばすべてのプログラミング言語のモード)にたいして、ユーザーが単一のモードフックをカスタマイズできる空からです。
Textモードは、人間の言語を編集するためのメジャーモードである。このモードは、文字‘"’および‘\’を区切り文字構文(punctuation
syntax: Table of Syntax Classesを参照)としてもち、M-TABをispell-complete-word
にバインドする(Spelling in The GNU Emacs Manualを参照)。
Textモードから派生されたメジャーモードの例として、HTMLモードがある。SGML and HTML Modes in The GNU Emacs Manualを参照のこと。
Progモードは、プログラミング言語のソースコードを含むバッファーにたいする、基本的なメジャーモードである。Emacsビルトインのプログラミング言語用メジャーモードは、このモードから派生されている。
Progモードは、parse-sexp-ignore-comments
をt
(Motion Commands Based on Parsingを参照)にバインドし、bidi-paragraph-direction
をleft-to-right
(Bidirectional Displayを参照)にバインドする。
Specialモードは、ファイルから直接ではなく、Emacsにより特別(specially)に生成されたテキストを含むバッファーにたいする、基本的なメジャーモードである。Specialモードから派生されたメジャーモードは、mode-class
プロパティにspecial
ーが与えられる(Major Mode Conventionsを参照)。
Specialモードは、バッファーを読み取り専用にセットする。このモードのキーマップは、いくつかの一般的なバインディングを定義し、それにはquit-window
にたいするq、revert-buffer
(Revertingを参照)にたいするgが含まれる。
Specialから派生されたメジャーモードの例としてはBuffer Menuモードがあり、これは*Buffer List*バッファーにより使用される。Listing Existing Buffers in The GNU Emacs Manualを参照のこと。
これらに加えて、表形式データのバッファーにたいするモードはTabulated Listモードから継承できます。このモードは、Specialモードから順に派生されているモードです。Tabulated List modeを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
すべてのメジャーモードコマンドは、モード独自のノーマルフックchange-major-mode-after-body-hook
、そのモードのモードフック、ノーマルフックafter-change-major-mode-hook
を実行することにより終了すべきです。これは、run-mode-hooks
を呼び出すことにより行われます。もしそのモードが派生モードなら、自身のbody内で他のメジャーモード(親モード)を呼び出す場合は、親モードが自身でこれらのフックを実行しないように、delay-mode-hooks
の中でこれを行うべきです。そのかわりに、派生モードは親のモードフックも実行する、run-mode-hooks
を呼び出すのです。Major Mode Conventionsを参照してください。
Emacs 22より前のバージョンのEmacsには、delay-mode-hooks
がありません。また、Emacs
24より前のバージョンには、change-major-mode-after-body-hook
がありません。ユーザー実装のメジャーモードがrun-mode-hooks
を使用せず、これらの新しい機能を使用するようにアップデートされていないときは、これらのメジャーモードは以下の慣習に完全にしたがわないでしょう。それらのモードは、親のモードフックをあまりに早く実行したり、after-change-major-mode-hook
の実行に失敗するかもしれません。そのようなメジャーモードに遭遇した場合は、以下の慣習にしたがって修正をお願いします。
define-derived-mode
を使用してメジャーモードを定義したときは、自動的にこれらの慣習にしたがうことが確実になります。define-derived-mode
を使用せずにメジャーモードを“手動”で定義した場合は、これらの慣習を自動的に処理するように、以下の関数を使用してください。
メジャーモード、この関数を使用してそれらのモードフックを実行すべきである。これはrun-hooks
(Hooksを参照)と似ているが、change-major-mode-after-body-hook
とafter-change-major-mode-hook
も実行する。
この関数が、delay-mode-hooks
フォーム実行中に呼び出されたときは、それらのフックを即座には実行しない。かわりに、次のrun-mode-hooks
呼び出しでそれらを実行するようにアレンジする。
あるメジャーモードコマンドが他のメジャーモードコマンドを呼び出すとき、それはdelay-mode-hooks
の内部で行われるべきである。
このマクロはbodyを実行するが、body実行中はすべてのrun-mode-hooks
呼び出しにたいして、それらのフックの実行を遅延するよう指示する。それらのフックは、実際にはdelay-mode-hooks
構造の最後の後、次のrun-mode-hooks
呼び出しの間に実行されるだろう。
これは、run-mode-hooks
により実行されるノーマルフックである。これは、そのモードのフックの前に実行される。
これは、run-mode-hooks
により実行されるノーマルフックである。これは、すべての適切に記述されたメジャーモードコマンドの一番最後に実行される。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Tabulated Listモードとは、表形式データ(エントリーから構成されるデータであり、各エントリーはそれぞれテキストの1行を占め、エントリーの内容は列に分割されるようなデータ)を表示するためのメジャーモードです。Tabulated Listモードは、行列の見栄えよくプリントする機能、および各列の値に応じて行をソートする機能を提供します。これは、Specialモードから派生されたモードです(Basic Major Modesを参照)。
Tabulated Listモードは、より特化したメジャーモードの親モードとして使用されることを意図しています。例としては、Process Menuモード(Process Informationを参照)や、Package Menuモード(Package Menu in The GNU Emacs Manualを参照)が含まれます。
このような派生されたモードは、tabulated-list-mode
を2つ目の引数に指定して、通常の方法でdefine-derived-mode
を使用するべきです(Defining Derived Modesを参照)。define-derived-mode
フォームのbodyは、以下にドキュメントされている変数に値を割り当てることにより、表形式データのフォーマットを指定するべきです。その後、ヘッダー行を初期化するために関数tabulated-list-init-header
を呼び出すべきです。
派生されたモードは、リスティングコマンドも定義するべきです。これはモードコマンドではなく、(M-x
list-processesのように)ユーザーが呼び出すコマンドです。リスティングコマンドは、バッファーを作成または切り替えて、派生モードをオンにして、表形式データを指定し、最後にそのバッファーを事前設定(populate)するためにtabulated-list-print
を呼び出すべきです。
このバッファーローカル変数は、表形式データのフォーマットを指定する。値はベクターで、ベクターの各要素はデータ列を表すリスト(name
width sort)
である。ここで
nil
の場合、その列はソートに使用できない。t
の場合は、列の文字列値を比較することによりソートされる。それ以外の場合は、tabulated-list-entries
の要素と同じ形式の2つの引数をとる、sort
にたいする述語関数(predicate
function)であること。
このバッファーローカル変数は、Tabulated Listバッファー内に表示されるエントリーを指定する。値にはリスト、または関数のいずれかであること。
値がリストの場合、各リスト要素は1つのエントリーに対応し、(id contents)
という形式であること。ここで
nil
、またはエントリーを識別するLispオブジェクト。Lispオブジェクトの場合には、エントリーを再ソートした際、カーソルは“同じ”エントリー上に留まる。比較はequal
で行われる。
tabulated-list-format
と要素数が同じベクター。ベクター要素は文字列、またはリスト。文字列の場合は、バッファーにそのまま挿入される。リスト(label
.
properties)
の場合には、labelとpropertiesを引数としてinsert-text-button
を呼び出すことにより、テキストボタンを挿入することを意味する(Making Buttonsを参照)。
これらの文字列には、改行を含めるべきではない。
それ以外の場合、値は引数なしで呼び出され上記形式のリストをリターンする関数であること。
このノーマルフックはTabulated
Listバッファーのリバートに先立ち実行される。派生モードは、tabulated-list-entries
を再計算するために、このフックに関数を追加できる。
この変数の値は、ポイント位置にエントリー(エントリーを終端する改行を含む)を挿入するために呼び出される関数である。この関数は、tabulated-list-entries
と同じ意味をもつ2つの引数idとcontentsを受け取る。デフォルト値は、エントリーをそのまま挿入する関数である。より複雑な方法によりTabulated
Listモードを使用するモードは、別の関数を指定できる。
この変数の値は、Tabulated
Listバッファーにたいするカレントのソートキーを指定する。nil
の場合、ソートは行われていない。それ以外では、(name
.
flip)
という形式の値をもつ。ここでnameはtabulated-list-format
内の列目の1つとマッチする文字列、flipが非nil
の場合は逆順でのソートを意味する。
この関数は、Tabulated
Listバッファーにたいするheader-line-format
を計算してセットし、列ヘッダー上でのクリックでソートを可能にするキーマップをヘッダー行に割り当てる。
Tabulated
Listから派生したモードは、上記の変数(特にtabulated-list-format
をセットした後のみ)をセットした後にこれを呼び出すべきである。
この関数は、カレントバッファーにエントリーを準備(populate)する。これはリスティングコマンドとして呼び出されるべきである。この関数は、バッファーを消去してtabulated-list-entries
で指定されるエントリーをtabulated-list-sort-key
にしたがってソートした後、各エントリーを挿入するためにtabulated-list-printer
で指定される関数を呼び出す。
オプション引数remember-posが非nil
の場合、この関数はカレント行でid要素を探して、もしあればすべてのエントリーを(再)挿入して、その後へそのエントリーの移動を試みる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
genericモード (generic mode:汎用モード))とは、コメント構文にたいする基本的なサポートとFont
Lockモードをもつ、シンプルなメジャーモードです。genericモードを定義するには、マクロdefine-generic-mode
を使用します。define-generic-mode
の使い方の例は、ファイルgeneric-x.elを参照してください。
このマクロは、mode(クォートされていないシンボル)という名前のgenericモードコマンドを定義する。オプション引数docstringは、そのモードコマンドにたいするドキュメント文字列である。これを与えない場合は、define-generic-mode
がデフォルトのドキュメント文字列を生成する。
引数comment-listは、要素が文字、2文字以下の文字列、またはコンスセルである。文字か文字列の場合には、そのモードの構文テーブル内で“コメント開始識別子”としてセットアップされる。エントリーがコンスセルの場合、CARは“コメント開始識別子”、CDRは“コメント終了識別子”としてセットアップされる(行末によりコメントを終端させたい場合は、後者にnil
を使用する)。構文テーブルのメカニズムには、実際にコメントの開始および終了識別子に関する制限があることに注意されたい。
Syntax Tablesを参照のこと。
引数keyword-listは、font-lock-keyword-face
でハイライトするキーワードのリストである。キーワードは文字列であること。一方、font-lock-listはハイライトするための追加の式リストである。このリストの各要素は、font-lock-keywords
の要素と同じ形式をもつべきである。Search-based Fontificationを参照のこと。
引数auto-mode-listは、変数auto-mode-alist
に追加する正規表現のリストである。これらの式は、マクロ呼び出しの展開時ではなく、define-generic-mode
の実行時に追加される。
最後にfunction-listは、追加セットアップのためにモードコマンドに呼び出される関数のリストである。これらの関数は、モードフック変数mode-hook
の実行の直前に呼び出される。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Textモードは、Fundamentalを除き、おそらくもっともシンプルなモードです。上述した慣習の多くを説明するために、以下にtext-mode.elの抜粋を示します:
;; このモード用に構文テーブルを作成
(defvar text-mode-syntax-table
(let ((st (make-syntax-table)))
(modify-syntax-entry ?\" ". " st)
(modify-syntax-entry ?\\ ". " st)
;; M-cで`hello'が`hello'でなく`Hello'になるよう`p'を追加
(modify-syntax-entry ?' "w p" st)
st)
"`text-mode'で使用される構文テーブル")
;; このモード用にキーマップを作成
(defvar text-mode-map (let ((map (make-sparse-keymap))) (define-key map "\e\t" 'ispell-complete-word) map) "`text-mode'のキーマップ `mail-mode'、`outline-mode'、`indented-text-mode'のような 他の多くのモードはこのマップ内で定義した全コマンドを継承する")
そして、実際にモードコマンドが定義される方法です:
(define-derived-mode text-mode nil "Text" "人間が読むために記述されたテキストを編集するためのメジャーモード このモードではパラグラフを区切るのはブランク行か空白行だけである したがって適応型フィル(adaptive filling)の全恩恵を受けられる (変数`adaptive-fill-mode'を参照のこと) \\{text-mode-map} Textモードのオンによりノーマルフック`text-mode-hook'が実行される"
(set (make-local-variable 'text-mode-variant) t) (set (make-local-variable 'require-final-newline) mode-require-final-newline) (set (make-local-variable 'indent-line-function) 'indent-relative))
(indent-relative
がデフォルト値の現在では、最後の行は冗長なので、将来のバージョンで削除するつもりです。)
3つのLisp用モード(Lispモード、Emacs Lispモード、Lisp Interactionモード)は、Textモードより多くの機能をもち、それにふさわしくコードもより複雑です。そのようなモードの記述方法を説明するために、lisp-mode.elの抜粋を示します。
以下は、Lispモードの構文テーブルとabbrevテーブルを定義する方法です:
;; モード固有のテーブル変数の作成
(defvar lisp-mode-abbrev-table nil)
(define-abbrev-table 'lisp-mode-abbrev-table ())
(defvar lisp-mode-syntax-table
(let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
(modify-syntax-entry ?\[ "_ " table)
(modify-syntax-entry ?\] "_ " table)
(modify-syntax-entry ?# "' 14" table)
(modify-syntax-entry ?| "\" 23bn" table)
table)
"`lisp-mode'で使用される構文テーブル")
Lisp用の3つのモードは、コードの多くを共有します。たとえば、以下の関数呼び出しにより、さまざまな変数がセットされます:
(defun lisp-mode-variables (&optional syntax keywords-case-insensitive) (when syntax (set-syntax-table lisp-mode-syntax-table)) (setq local-abbrev-table lisp-mode-abbrev-table) …
その中でも特に、以下の関数はLispコメントを処理するために、変数comment-start
をセットアップします:
(make-local-variable 'comment-start) (setq comment-start ";") …
これら異なるLisp用モードは、微妙に異なるキーマップをもちます。たとえば、LispモードはC-c
C-zをrun-lisp
にバインドしますが、他のLisp用モードはこれを行いません。とはいえ、すべてのLisp用モードに共通なコマンドがいくつかあります。以下のコードは、それらの共通コマンドをセットアップします:
(defvar lisp-mode-shared-map (let ((map (make-sparse-keymap))) (define-key map "\e\C-q" 'indent-sexp) (define-key map "\177" 'backward-delete-char-untabify) map) "すべてのLisp用モードでコマンドを共有するためのキーマップ")
そして、以下がLispモードのためのキーマップをセットアップするコードです:
(defvar lisp-mode-map (let ((map (make-sparse-keymap)) (menu-map (make-sparse-keymap "Lisp"))) (set-keymap-parent map lisp-mode-shared-map) (define-key map "\e\C-x" 'lisp-eval-defun) (define-key map "\C-c\C-z" 'run-lisp) … map) "Keymap for ordinary Lisp mode. All commands in `lisp-mode-shared-map' are inherited by this map.")
最後は、Lispモードのためのメジャーモードコマンドです:
(define-derived-mode lisp-mode prog-mode "Lisp" "GNU Emacs Lisp以外のLispコードを編集するためのメジャーモード コマンド: 後方に移動させるかのようにタブをスペースに削除変換する。 パラグラフ区切りはブランク行。コメント開始はセミコロン。 \\{lisp-mode-map} `run-lisp'はinferior Lispジョブの開始と既存ジョブ から戻るための両方に使われるかもしれないことに注意
このモードへのエントリーにより、 `lisp-mode-hook'の値が非nilならそれを呼び出す" (lisp-mode-variables nil t) (set (make-local-variable 'find-tag-default-function) 'lisp-find-tag-default) (set (make-local-variable 'comment-start-skip) "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *") (setq imenu-case-fold-search t))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マイナーモード(minor mode)は、メジャーモードの選択とは無関係にユーザーが有効、あるいは無効にする可能性のある、オプション機能を使用を提供します。マイナーモードは個別に、あるいは組み合わせて有効にできます。
ほとんどのマイナーモードは、メジャーモードとは独立した機能を実装し、それゆえにほとんどのメジャーモードとともに使用することができます。たとえば、Auto Fillモードはテキスト挿入を許す任意のメジャーモードとともに機能します。しかし少数ながら、特定のメジャーモードに特化した少数のマイナーモードもあります。たとえば、Diff Auto Refineモードは、Diffモードとともに使用されることだけを意図したマイナーモードです。
理想的には、マイナーモードは他のマイナーモードの効果と無関係に、期待する効果をもつべきです。これは、任意の順序でマイナーモードをアクティブ、あるいは非アクティブにしても可能なはずです。
この変数の値は、すべてのマイナーモードコマンドのリストである。
22.3.1 Conventions for Writing Minor Modes | マイナーモードを記述するためのTips。 | |
22.3.2 Keymaps and Minor Modes | マイナーモードが自身のキーマップをもつための方法。 | |
22.3.3 Defining Minor Modes | マイナーモードを定義するための便利な機能。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メジャーモードにあるように、マイナーモードの記述にも慣習があります。以下で、その慣習について説明します。これらの慣習にしたがうには、マクロdefine-minor-mode
を使用するのがもっとも簡単な方法です。Defining Minor Modesを参照してください。
nil
、有効な場合は非nil
になるだろう。そのマイナーモードがバッファーローカルなら、この変数もバッファーローカルであること。
この変数は、モードラインにマイナーモードの名前を表示するために、minor-mode-alist
と結合して使用される。これは、minor-mode-map-alist
を通じて、そのマイナーモードのキーマップがアクティブかどうかも判定する(Controlling the Active Keymapsを参照)。個々のコマンドやフックも、この変数の値をチェックできる。
モードコマンドは、1つのオプション引数を受け入れるべきである。プレフィクス引数なしでinteractiveに呼び出された場合は、モードをトグルする(toggle: 切り替える。たとえば無効なら有効に、有効なら無効にする)こと。プレフィクス引数とともにinteractiveに呼び出された場合、その引数が正であればモードを有効に、それ以外は無効にすべきである。
モードコマンドが、Lispから(つまりからの非interactiveに)呼び出された場合は、引数が省略、またはnil
の場合はモードを有効にすべきである。引数がシンボルtoggle
の場合はモードをトグルし、それ以外の場合は、上述の数引数とともにinteractiveに呼び出されたときと同じ方法により、その引数を扱うべきである。
以下は、この挙動の実装方法を示す例である(define-minor-mode
マクロが生成するコードも、これに類似する)。
(interactive (list (or current-prefix-arg 'toggle)))
(let ((enable (if (eq arg 'toggle)
(not foo-mode) ; このモードのモード変数
(> (prefix-numeric-value arg) 0))))
(if enable
do-enable
do-disable))
この、やや複雑な挙動の理由は、ユーザーが簡単かつinteractiveにマイナーモードをトグルでき、以下のようにモードフック内で簡単にマイナーモードを有効にできるからである:
(add-hook 'text-mode-hook 'foo-mode)
foo-mode
モードコマンドは、引数なしでLispから呼び出されたときは、無条件にそのマイナーモードを有効にするので、これはfoo-mode
がすでに有効でもそうでなくても正しく振る舞う。モードフック内でマイナーモードを無効にする場合は、少々醜くなる:
(add-hook 'text-mode-hook (lambda () (foo-mode -1)))
しかし、これは頻繁には行われない。
minor-mode-alist
に追加する(Definition of minor-mode-alistを参照)。この要素は以下の形式のリストであること:
(mode-variable string)
ここで、mode-variableはマイナーモードの有効化を制御する変数であり、stringはモードラインに標示するための、スペースで始まる短い文字列である。一度に複数モードの文字列がスペースを占めるので、これらの文字列は短くなければならない。
minor-mode-alist
に要素を追加する際は、重複を避けるために、既存要素のチェックにassq
を使用すること。たとえば:
(unless (assq 'leif-mode minor-mode-alist) (push '(leif-mode " Leif") minor-mode-alist))
または、以下のようにadd-to-list
(Modifying List Variablesを参照)を使用すること:
(add-to-list 'minor-mode-alist '(leif-mode " Leif"))
これらに加えて、メジャーモードにたいする慣習のいくつかは、マイナーモードにたいしても同様に適用されます。それらの慣習はグローバルシンボルの名前、初期化関数の最後でのフックの使用、キーマップおよびその他のテーブルの使用です。
マイナーモードは、可能ならばCustom(Customization Settingsを参照)を通じての有効化および無効化をサポートするべきです。これを行うには、モード変数はは通常は:type
'boolean
とともにdefcustom
で定義されるべきです。その変数をセットするだけではモードの有効化に不足なら、モードコマンドを呼び出すことによりモードを有効にする:set
メソッドも指定するべきです。そして、その変数のドキュメント文字列にCustomを通じて変数をセットしなければ効果がないことを注記してください。さらに、その定義をautoload
cookie(autoload cookieを参照)でマークして、その変数のカスタマイズによりモードを定義するライブラリーがロードされるように:require
を指定します。たとえば:
;;;###autoload (defcustom msb-mode nil "msb-modeをトグルする この変数を直接セットしても効果がない \\[customize]か関数`msb-mode'を使用すること" :set 'custom-set-minor-mode :initialize 'custom-initialize-default :version "20.4" :type 'boolean :group 'msb :require 'msb)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マイナーモードはそれぞれ自身のキーマップをもつことができ、そのモードが有効になるとそのキーマップがアクティブになります。マイナーモード用のキーマップをセットアップするには、minor-mode-map-alist
というalistに要素を追加します。Definition of minor-mode-map-alistを参照してください。
特定の自己挿入文字にたいして、自己挿入と同様に他の何かを行うように振る舞いを変更するのは、マイナーモードキーマップの1つの使い方です。(self-insert-command
をカスタマイズする別の方法は、post-self-insert-hook
を通じて行う方法です。これ以外のself-insert-command
カスタマイズ用機能は特別なケースに限定されていて、abbrevモードとAuto
Fillモードのためにデザインされています。self-insert-command
にたいする標準定義を、あなた独自の定義に置き換えることを試みてはなりません。エディターコマンドループは、この関数を特別に処理します。)
マイナーモードは、コマンドをC-cとその後の区切り文字より構成されるキーシーケンスにバインドするかもしれません。しかし、C-cとその後の{}<>:;のいずれかの文字、またはコントロール文字、数字より構成されるシーケンスは、メジャーモード用に予約されています。また、C-c letterはユーザー用に予約されています。Key Binding Conventionsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マクロdefine-minor-mode
は、1つの自己完結した定義内にモードを実装する便利な方法を提供します。
このマクロは、名前がmode(シンボル)の新たなマイナーモードを定義する。これは、ドキュメント文字列としてdocをもつ、マイナーモードをトグルするための、modeという名前のコマンドを定義する。
トグルコマンドは1つのオプション(プレフィクス)引数をとる。引数なしでinteractiveに呼び出された場合は、そのモードのオンとオフをトグルする。正のプレフィクス引数はモードを有効にし、それ以外のプレフィクス引数はモードを無効にする。Lispから呼び出した場合、引数がtoggle
の場合はモードをトグルし、引数が省略もしくはnil
の場合はモードを有効にする。これはたとえば、メジャーモードフック内でマイナーモードを有効にするのを簡便にする。docがnil
の場合、このマクロは上記を説明するデフォルトのドキュメント文字列を提供する。
デフォルトでは、これはモードを有効にするとt
、無効にするとnil
にセットされる、modeという名前の変数も定義する。この変数は、init-valueに初期化される。通常では(以下参照)、この値はnil
でなければならない。
文字列lighterは、モード有効時にモードライン内に何を表示するか指定する。これがnil
の場合は、このモードはモードライン内に表示されない。
オプション引数keymapは、そのマイナーモードにたいするキーマップを指定する。非nil
の場合、それは(値がキーマップであるような)変数の名前、キーマップ、または以下の形式のalistであること
(key-sequence . definition)
ここで、それぞれのkey-sequenceとdefinitionは、define-key
に渡すのに適した引数である(Changing Key Bindingsを参照)。keymapはキーマップまたはalistであり、これは変数mode-map
も定義する。
上記の3つの引数init-value、lighter、keymapは、keyword-argsが使用されたときは、(部分的に)省略できる。keyword-argsは、キーワードとその後の対応する値により構成され、いくつかのキーワードは特別な意味をもつ:
:group group
生成されるすべてのdefcustom
フォームで使用されるカスタムグループ名。mode(後の‘-mode’がある場合はそれを除く)にたいするデフォルトである。警告:
そのグループを定義するためdefgroup
を正しく記述していない場合は、このデフォルトグループ名を使用してはならない。Defining Customization Groupsを参照のこと。
:global global
非nil
の場合、これはそのマイナーモードがバッファーローカルでなくグローバルであることを指定する。デフォルトはnil
。
マイナーモードをグローバルにしたときの効果の1つは、mode変数がカスタマイズ変数になることである。Customizeインターフェイスを通じてこの変数をトグルするとモードがオン、またはオフになり、変数の値は将来のEmacsセッション用に保存できるようになる(Saving
Customizations in The GNU Emacs
Manualを参照)。保存された変数が機能するためには、Emacsが開始されるたびにdefine-minor-mode
フォームが確実に評価されるようにすべきである。Emacsの一部ではないパッケージにたいしては、:require
キーワードを指定するのが、これを行う一番簡単な方法である。
:init-value init-value
これは、init-value引数を指定するのと等しい。
:lighter lighter
これは、lighter引数を指定するのと等しい。
:keymap keymap
これは、keymap引数を指定するのと等しい。
:variable place
これは、そのモードの状態を格納するために使用される、デフォルトの変数modeを置き換える。これを指定した場合、mode変数は定義されず、すべてのinit-value引数は使用されない。placeは異なる名前の変数(あなた自身が定義しなければならない)、またはsetf
関数とともに使用され得るすべてのもの(Generalized Variablesを参照)。placeにはコンス(get
.
set)
も指定できる。ここで、getはカレント状態をリターンする式であり、setはそれをセットする1つの引数(状態)をとる関数である。
:after-hook after-hook
これは、モードフック実行後に評価される、単一のLispフォームを定義する。これはクォートすべきでない。
その他のすべてのキーワード引数は、変数modeにたいして生成されたdefcustom
に直接渡される。
modeという名前のコマンドは、最初にmodeという名前の変数をセットする等の標準的な動作を処理した後に、もしあればbodyフォームを実行する。それからモードフック変数mode-hook
を実行し、:after-hook
内のフォームを評価して終了する。
init-valueの値はnil
でなければなりません。ただし、(1)Emacsによりそのモードが事前ロードされている、または(2)たとえユーザーが要求しなくともモードを有効にするためにロードするのが容易な場合を除きます。たとえば、他の何かが有効でなければそのモードの効果がなく、常にそのタイミングでロードされるような場合は、デフォルトでそのモードを有効にすることに害はありません。しかし、この状況は通常はあり得ません。通常は、init-valueの値はnil
でなければならないのです。
easy-mmode-define-minor-mode
という名前は、このマクロにたいするエイリアスです。
以下は、define-minor-mode
の使い方の例です:
(define-minor-mode hungry-mode "Hungryモードをトグルする。 引数なしでinteractiveに呼び出すとモードをトグルする。 正のプレフィクス引数でモードを有効に、その他のプレフィクス引数で 無効にする。Lispから呼び出す場合、引数を省略、またはnilなら モードを有効に、`toggle'なら状態をトグルする。 Hungryモードが有効なときは、C-DELキーは、 最後を除く先行するすべての空白を飲み込む。 コマンド \\[hungry-electric-delete] を参照のこと。" ;; 初期値 nil ;; モードラインの標示 " Hungry" ;; マイナーモードのバインディング '(([C-backspace] . hungry-electric-delete)) :group 'hunger)
これは、“Hungry
mode”という名前のマイナーモード、モードをトグルするhungry-mode
という名前のコマンド、モードが有効かどうかを示すhungry-mode
という名前の変数、モードが有効なときそのキーマップを保持するhungry-mode-map
という名前の変数を定義します。これは、C-DELにたいするキーバインディングでキーマップを初期化します。また、変数hungry-mode
をカスタムグループhunger
に置きます。bodyフォームはありません
— 多くのマイナーモードは必要としません。
以下は、これを記述する等価な方法です:
(define-minor-mode hungry-mode "Hungryモードをトグルする。 ...省略..." ;; 初期値 :init-value nil ;; モードラインへのインジケーター :lighter " Hungry" ;; マイナーモードのバインディング :keymap '(([C-backspace] . hungry-electric-delete) ([C-M-backspace] . (lambda () (interactive) (hungry-electric-delete t)))) :group 'hunger)
これは、global-modeという名前をグローバルにトグルする。この意味は、modeという名前のバッファーローカルなマイナーモードを、すべてのバッファーで有効、または無効にするということである。あるバッファー内でそのマイナーモードをオンにするには、関数turn-onを使用する。マイナーモードをオフにするには、-1を引数としてmodeを呼び出す。
モードをグローバルに有効にすると、それ以降ファイルをvisitすることにより作成されるバッファー、Fundamental以外のメジャーモードを使用するバッファーにも影響がある。しかし、Fundamentalで作成される新たなバッファーは検知しない。
これは、Customizeインターフェイス内でそのマイナーモードのオン/オフを切り替える、カスタムオプションglobal-mode(Customization Settings)を定義する。define-minor-mode
と同様に、たとえば:require
を与える等により、毎回のEmacs開始時に確実にdefine-globalized-minor-mode
フォームが評価されるようにすべきである。
グローバルマイナーモードのモード変数にたいしてカスタムグループを指定するには、keyword-args内で:group
group
を使用する。
一般的には、グローバル化されたマイナーモードを定義するときは、ユーザーがバッファーごとにモードを使用(または無効に)できるように、非グローバル版も定義すべきである。ことにより、特定のメジャーモード内でそのモードのフックを使用することにより、グローバル有効化されたマイナーモードを無効にすることができるようになる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsの各ウィンドウ(ミニバッファーウィンドウを除く)には通常、最下部にモードラインがあり、そのウィンドウ内に表示されたバッファーについてステータス情報がモードラインに表示されます。モードラインには、バッファー名、関連するファイル、再帰編集の深さ、およびメジャーモードやマイナーモードなどのような、そのバッファーに関する情報が含まれています。ウィンドウはヘッダーライン(header line)をもつこともでき、これはモードラインによく似ていますが、ウィンドウの最上部に表示されます。
このセクションでは、モードラインおよびヘッダーラインのコンテンツの制御の仕方について説明します。このチャプターにモードラインを含めた理由は、モードラインに表示される情報の多くが、有効化されたメジャーモードとマイナーモードに関係があるからです。
22.4.1 Mode Line Basics | モードライン制御の基本概念。 | |
22.4.2 The Data Structure of the Mode Line | モードラインを制御するデータ構造。 | |
22.4.3 The Top Level of Mode Line Control | トップレベル変数、mode-line-format。 | |
22.4.4 Variables Used in the Mode Line | そのデータ構造で使用される変数。 | |
22.4.5 % -Constructs in the Mode Line | モードラインへの情報の配置。 | |
22.4.6 Properties in the Mode Line | モードライン内でのテキストプロパティの使用。 | |
22.4.7 Window Header Lines | モードラインに類似した最上部のライン。 | |
22.4.8 Emulating Mode Line Formatting | モードラインのようにテキストをフォーマットする。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
それぞれのモードラインのコンテンツは、バッファーローカル変数mode-line-format
により指定されます(The Top Level of Mode Line Controlを参照)。この変数はモードライン構成(mode line
construct)を保持します。これは、そのバッファーのモードラインに何を表示するかを制御するテンプレートです。header-line-format
の値は、同じ方法によりそのバッファーのヘッダーラインを指定します。同一のバッファーにたいするすべてのウィンドウは、同じmode-line-format
とheader-line-format
を使用します。
効率的な理由により、Emacsは各ウィンドウのモードラインとヘッダーラインを、連続して再評価しません。たとえばウィンドウ設定(window
configuration)の変更、バッファーの切り替え、バッファーのナローイング(narrowing)またはワイドニング(widening)、スクロール、バッファーの変更等、それを呼び出す状況が出現したときに、Emacsは再評価を行います。mode-line-format
やheader-line-format
(Variables Used in the Mode Lineを参照)により参照される任意の変数、またはテキストが表示される方法に影響を与えるデータ構造(Emacs Displayを参照)を変更した場合は、表示を更新するために関数force-mode-line-update
を使用するべきです。
この関数は、次の再表示サイクルの間に、すべての関連する変数の最新の値にもとづき、カレントバッファーのモードラインとヘッダーラインの更新をEmacsに強制する。オプション引数allが非nil
の場合は、すべてのモードラインとヘッダーラインの更新を強制する。
この関数は、メニューバーとフレームタイトルの更新も強制する。
選択されたウィンドウのモードラインは、通常はフェイスmode-line
を使用して異なるカラーで表示されます。かわりに、他のウィンドウのモードラインは、フェイスmode-line-inactive
で表示されます。Facesを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
モードラインのコンテンツは、モードライン構成(mode line construct)と呼ばれるデータ構造により制御されます。モードライン構成はリスト、シンボル、数字を保持するバッファーローカル変数により構成されます。それぞれのデータ型は、以下で説明するようにモードラインの外見にたいして特別な意味をもちます。フレームタイトル(Frame Titlesを参照)とヘッダーライン(Window Header Linesを参照)にたいしても、同じデータ構造が使用されます。
固定文字列のようにシンプルなモードライン構成の場合もありますが、通常はモードライン構成のテキストを構築するために、固定文字列と変数の値を組み合わせる方法を指定します。これらの変数の多くは、その変数自体がその値によりモードライン構成を定義する変数です。
以下は、モードライン構成における、さまざまなデータ型の意味です:
string
モードライン構成においての文字列は、文字列内に%
構成(%
-constructs)を含む以外は、そのまま表現される。これらは、他のデータによる置換を意味する。%
-Constructs in the Mode Lineを参照のこと。
文字列の一部がface
プロパティをもつ場合は、バッファー内でそれらが表示されるときと同じように、テキスト表示を制御する。face
プロパティをもたない文字は、デフォルトのフェイスmode-line
、またはmode-line-inactive
で表示される(Standard
Faces in The GNU Emacs
Manualを参照)。string内のhelp-echo
プロパティとkeymap
プロパティは、特別な意味をもつ。Properties in the Mode Lineを参照のこと。
symbol
モードライン構成においてのシンボルは、その値を意味する。モードライン構成としては、symbolの値はsymbolの位置に使用される。しかし、シンボルt
とnil
は、値がvoidであるようなシンボルとして無視される。
例外が1つある。symbolの値が文字列の場合、それはそのまま表示され、%
構成は認識されない。
symbolが“危険”とマークされていない(非nil
のrisky-local-variable
プロパティをもつ)場合は、symbolの値中で指定されたテキストプロパティはすべて無視される。これには、symbolの値中の文字列のテキストプロパティ、同様に文字列内の:eval
フォームと:propertize
フォームがすべて含まれる。(これはセキュリティー上の理由による。危険とマークされていない変数は、ユーザーへの問い合わせなしでファイル変数から自動的にセットされ得る。)
(string rest…)
(list rest…)
最初の要素が文字列またはリストであるようなリストは、すべての要素を再帰的に処理して、その結果を結合することを意味する。これは、モードライン構成において、もっとも一般的なフォームである。
(:eval form)
最初の要素がシンボル:eval
であるようなリストは、formを評価して、その結果を表示する文字列として使用するよう指示する。この評価がファイルをロードできないことを確認すること。ファイルをロードすると、無限再帰が発生するかもしれない。
(:propertize elt props…)
最初の要素がシンボル:propertize
であるようなリストは、モードライン構成eltを再帰的に処理して、propsにより指定されるテキストプロパティに結果を加えるよう指示する。引数propsは、0個以上のtext-propertyとvalueのペアーで構成されるべきである。
(symbol then else)
最初の要素がキーワード以外のシンボルであるようなリストは、条件文を指定する。その意味は、symbolの値に依存する。symbolが非nil
値をもつ場合は、モードライン構成として、2つ目の要素thenが再帰的に処理され、それ以外は3つ目の要素elseが再帰的に処理される。elseは省略でき、その場合symbolの値がnil
かvoidならば、モードライン構成は何も表示しない。
(width rest…)
最初の要素が整数であるようなリストは、restの結果の切り詰め、またはパディングを指定する。残りの要素restは、モードライン構成として再帰的に処理され、互いに結合される。widthが正の場合、結果の幅がwidthより少ないときは、右側にスペースがパディングされる。widthが負の場合、結果の幅が-widthより大きいときは、右側が切り詰められる。
たとえば、ウィンドウ最上部からのバッファー位置をパーセント表示するには、(-3 "%p")
のようなリストを使用すればよい。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数mode-line-format
は、モードラインの全体的な制御を行います。
この変数の値は、モードラインのコンテンツを制御するモードライン構成である。これは、すべてのバッファーにおいて、常にバッファーローカルである。
あるバッファー内でこの変数にnil
をセットした場合、そのバッファーはモードラインをもたない(高さが1行しかないウィンドウも、モードラインを表示しない)。
mode-line-format
のデフォルト値は、mode-line-position
やmode-line-modes
(これはmode-name
とminor-mode-alist
の値を組み込む)のような、他の変数の値を使用するようデザインされています。mode-line-format
自体を変更する必要があるモードは、ほとんどありません。ほとんどの用途にたいしては、mode-line-format
が直接、または間接的に参照する、いくつかの変数を修正すれば十分です。
mode-line-format
l自体の変更を行った場合、新たな値は他の様式でコンテンツを複製したり情報を表示するのではなく、デフォルト値(Variables Used in the Mode Lineを参照)に現れるのと同じ変数を使用するべきです。この方法を使用すれば、ユーザーや(display-time
やメジャーモードのような)Lispプログラムにより行われたカスタマイズは、それらの変数への変更を通じて、効力を保ちます。
以下は、Shellモードにたいして有用かもしれない、架空のmode-line-format
の例です(実際には、Shellモードはmode-line-format
をセットしない):
(setq mode-line-format (list "-" 'mode-line-mule-info 'mode-line-modified 'mode-line-frame-identification "%b--"
;; これはリスト作成中に評価されることに注意。 ;; これは単なる文字列のモードライン構成を作成する。 (getenv "HOST")
":" 'default-directory " " 'global-mode-string " %[(" '(:eval (mode-line-mode-name)) 'mode-line-process 'minor-mode-alist "%n" ")%]--"
'(which-func-mode ("" which-func-format "--")) '(line-number-mode "L%l--") '(column-number-mode "C%c--") '(-3 "%p")))
(変数line-number-mode
、column-number-mode
、which-func-mode
は特定のマイナーモードを有効にする。通例どおり、これらの変数名は、マイナーモードコマンド名でもある。)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、mode-line-format
の標準的な値として、モードラインテキストに組み込まれる変数を説明します。これらの変数は、本質的には特別なものではありません。mode-line-format
が使用する変数を他の変数に変更すれば、それらはモードライン上で同様の効果をもちます。しかし、Emacsのさまざまな部分は、それらの変数がモードラインを制御するという認識の元、それらの変数をセットします。したがって、事実上モードラインがそれらの変数を使用するのは必須なのです。
この変数は、言語環境(language environment)、バッファーコーディングシステム、カレント入力メソッド(current input method)に関する情報のモードライン構成の値を保持する。Non-ASCII Charactersを参照のこと。
この変数は、カレントバッファーが変更されたかどうかを表示する、モードライン構成の値を保持する。デフォルト値ではバッファーが変更されていれば‘**’、バッファーが変更されていなければ‘--’、バッファーが読み取り専用なら‘%%’、読み取り専用だが変更されているときは‘%*’を表示する。
この変数を変更しても、モードラインは強制的に更新されない。
この変数は、カレントフレームを識別する。デフォルト値では、複製フレームを表示可能なウィンドウシステムを使用している場合は"
"
、一度に1つのフレームだけを表示する通常の端末では"-%F "
を表示する。
この変数は、そのウィンドウ内で表示されているバッファーを識別する。デフォルト値では、少なくとも12列になるようスペースパディングされたバッファー名を表示する。
この変数は、バッファー内での位置を標示する。デフォルト値ではバッファーのパーセントを表示し、オプションでバッファーサイズ、行番号、列番号を表示する。
変数vc-mode
は、各バッファーにたいしてバッファーローカルであり、そのバッファーがvisitしているファイルがバージョンコントロールで保守されているかどうかと、保守されている場合はバージョンコントロールシステムの種別を表示する。新しいモードラインに表示される文字列、バージョンコントロールされていない場合はnil
である。
この変数は、そのバッファーのメジャーモードとマイナーモードを表示する。デフォルト値では再帰編集レベル(recursive editing level)、プロセス状態の情報、ナローイング(narrowing)効果の有無を表示する。
この変数は、カレントバッファーにたいするdefault-directory
がリモートかどうかを表示するために使用される。
この変数は、emacsclient
フレームを識別するために使用される。
以下の3つの変数は、mode-line-modes
内で使用されます:
このバッファーローカル変数は、カレントバッファーのメジャーモードの“愛称(pretty
name)”を保持する。モード名がモードラインに表示されるように、それぞれのメジャーモードは、この変数をセットすべきである。値は文字列である必要はなく、モードライン構成内で有効な任意のデータ型(The Data Structure of the Mode Lineを参照)を使用できる。モードライン内でモード名を識別する文字列の計算には、format-mode-line
を使用する(Emulating Mode Line Formattingを参照)。
このバッファーローカル変数には、そのモードにおいて、サブプロセスとの通信にたいするプロセス状態のモードライン情報が含まれる。これはメジャーモード名の直後(間のスペースはない)に表示される。たとえば、*shell*バッファーでの値は(":%s")
であり、これは‘(Shell:run)’のように、メジャーモードとともにその状態を表示する。通常、この変数はnil
である。
この変数は、マイナーモードがアクティブかをモードラインに示す方法を指定する要素をもつ、連想リスト(association
list)を保持する。minor-mode-alist
の各要素は、2要素のリストであること:
(minor-mode-variable mode-line-string)
より一般的には、mode-line-stringは任意のモードライン構成であり得る。minor-mode-variableの値が非nil
の場合はモードラインに表示され、それ以外では表示されない。一緒に実行されないよう、これらの文字列はスペースで始まるべきである。慣例的に、特定のモードにたいするminor-mode-variableは、そのマイナーモードがアクティブになった際には、非nil
値にセットされる。
minor-mode-alist
自体はバッファーローカルではない。このalist内で参照される各変数は、そのマイナーモードをバッファーごとに個別に有効にできる場合は、バッファーローカルであること。
この変数は、モードライン内でマイナーモードwhich-func-mode
がセットされている場合はその直後、セットされていなければmode-line-modes
の後に表示されるモードライン構成を保持する(デフォルト)。コマンドdisplay-time
は、時間とロードの情報を含む文字列を保持する変数display-time-string
を参照する、global-mode-string
をセットする。
‘%M’構成は、global-mode-string
の値を置き換えるが、この変数はmode-line-format
からモードラインにincludeされるので、時代遅れである。
以下は、mode-line-format
のデフォルト値の簡略化バージョンです。実際のデフォルト値には、追加のテキストプロパティ指定も含まれます。
("-" mode-line-mule-info mode-line-modified mode-line-frame-identification mode-line-buffer-identification
" " mode-line-position (vc-mode vc-mode) " "
mode-line-modes (which-func-mode ("" which-func-format "--")) (global-mode-string ("--" global-mode-string)) "-%-")
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
%
-Constructs in the Mode Lineモードライン構成として使用される文字列は、さまざまな種類のデータを置き換えるために、%
構成を使用できます。以下は、定義済みの%
構成と意味のリストです。
‘%%’以外の構成では、フィールドの最小幅を指定するために、‘%’の後に10進整数を追加できます。幅がそれより小さい場合、そのフィールドは最小幅にパディングされます。純粋に数値的な構成(‘c’、‘i’、‘I’、‘l’)は左側、それ以外は右側にスペースを追加してパディングされます。
%b
buffer-name
関数により取得されるカレントバッファー名。Buffer Namesを参照のこと。
%c
ポイント位置のカレント列番号。
%e
EmacsがLispオブジェクトにたいしてメモリー不足になりそうなときは、それを伝える簡略なメッセージを示す。それ以外の場合は空である。
%f
buffer-file-name
関数により取得される、visitしているファイル名。Buffer File Nameを参照のこと。
%F
選択されたフレームのタイトル(ウィンドウシステム上のみ)、または名前。Basic Parametersを参照のこと。
%i
カレントバッファーのアクセス可能な範囲のサイズ。基本的には(- (point-max) (point-min))
。
%I
‘%i’と同様だが、10^3は‘k’、10^6は‘M’、10^9は‘G’を使用して省略することにより、より読みやすい方法でサイズをプリントする。
%l
ポイント位置のカレント行番号。そのバッファーのアクセス可能な範囲内でカウントされる。
%n
ナローイングが有効なときは‘Narrow’、それ以外は何も表示しない(Narrowingのnarrow-to-region
を参照されたい)。
%p
ウィンドウの最上部より上にあるバッファーテキストのパーセント表示、または‘Top’、‘Bottom’、‘All’のいずれか。デフォルトのモードライン構成は、これを3文字に切り詰めることに注意されたい。
%P
ウィンドウの最下部より上にあるバッファーテキスト(ウィンドウ内の可視なテキストと、最上部の上にあるテキスト)のパーセント表示、およびバッファーの最上部がスクリーン上で可視な場合は、それに加えて‘Top’。または‘Bottom’か‘All’。
%s
process-status
により取得される、カレントバッファーに属するサブプロセスの状態。Process Informationを参照のこと。
%z
キーボード、端末、およびバッファーコーディングシステムのニーモニック。
%Z
‘%z’と同様だが、EOL形式(end-of-line format: 改行形式)を含む。
%*
バッファーが読み取り専用(buffer-read-only
を参照)の場合は‘%’、
変更されている場合(buffer-modified-p
を参照)は‘*’、
それ以外は‘-’。Buffer Modificationを参照のこと。
%+
バッファーが変更されている場合(buffer-modified-p
を参照)は‘*’
バッファーが読み取り専用(buffer-read-only
を参照)の場合は‘%’、
それ以外は‘-’。これは、読み取り専用バッファーの変更にたいしてのみ‘%*’と異なる。Buffer Modificationを参照のこと。
%&
バッファーが変更されている場合は‘*’、それ以外は‘-’。
%[
再帰編集レベルの深さを標示する(ミニバッファーレベルは勘定しない)。1つの編集レベルが‘[’。Recursive Editingを参照のこと。
%]
1つの編集レベルが‘]’(ミニバッファーレベルは勘定しない)。
%-
モードラインの残りを充填するのに十分なダッシュ。
%%
文字‘%’。%
構成が許される文字列内に、リテラル‘%’を含めるには、この方法を使用する。
以下の2つの%
構成はまだサポートされていますが、同じ結果を変数mode-name
とglobal-mode-string
で取得できるので、これらは時代遅れです。
%m
mode-name
の値。
%M
global-mode-string
の値。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
モードライン内では、特定のテキストプロパティが意味をもちます。face
プロパティは、テキストの外見に影響します。help-echo
プロパティはそのテキストのヘルプ文字列に関連し、keymap
によりテキストをマウスに感応させることができます。
モードライン内のテキストにたいしてテキストプロパティを指定するには、4つの方法があります:
(:propertize elt
props…)
構成を使用する。
:eval
form
を含むリストを使用する。
キーマップを指定するために、keymap
プロパティを使用できます。このキーマップは、マウスクリックにたいしてのみ、実際の効果をもちます。モードライン内にポイントを移動させるのは不可能なので、文字キーやファンクションキーをこれにバインドしても、効果はありません。
モードラインが、risky-local-variable
が非nil
であるようなプロパティをもつ変数を参照する場合、その変数の値により与える、または指定されるテキストプロパティは、すべて無視されます。これは、そのようなプロパティは呼び出される関数を指定するかもしれず、その関数はファイルローカル変数が由来かもしれないからです。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウは、最下部にモードラインをもつことができるのと同じように、最上部にヘッダーライン(header
line)をもつことができます。ヘッダーライン機能は、それがheader-line-format
により制御されることを除けば、モードラインと同じように機能します。
すべてのバッファーにたいしてローカルなこの変数は、そのバッファーを表示するバッファーにたいして、ヘッダーラインを表示する方法を指定する。この変数の値のフォーマットは、mode-line-format
にたいするフォーマットと同じである(The Data Structure of the Mode Lineを参照)。通常、この変数はnil
なので、通常のバッファーはヘッダーラインをもたない。
この関数は、windowのヘッダーラインの高さを、ピクセルでリターンする。windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。
高さが1行しかないウィンドウは、決してヘッダーラインを表示しません。また、高さが2行しかないウィンドウは、一度にモードラインとヘッダーラインを表示できません。そのようなウィンドウがモードラインをもつ場合、ヘッダーラインは表示されません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数format-mode-line
を使用して、特定のモードライン構成にもとづきモードライン、またはヘッダーラインに表示されるテキストを計算できます。
この関数は、あたかもwindowにたいしてモードラインを生成するかのように、formatに応じてテキスト行をフォーマットするが、さらにそのテキストを文字列としてリターンする。引数windowのデフォルトは、選択されたウィンドウである。bufferが非nil
の場合、使用されるすべての情報はbufferから取得される。デフォルトでは、windowのバッファーから取得される。
文字列の値は通常、モードラインがもつであろうフェイス、キーマップ等に対応するテキストプロパティをもつ。formatにより指定されたface
プロパティのないすべての文字は、faceにより決定されるデフォルト値を取得する。faceがt
の場合は、windowが選択されていればmode-line
、それ以外はmode-line-inactive
であることを意味する。faceがnil
、または省略された場合は、デフォルトのフェイスを意味する。faceが整数の場合、この関数はテキストプロパティをもたない値をリターンするだろう。
faceの値として、他の有効なフェイスを指定することもできる。指定された場合、それはformatでフェイスを指定されていない文字のface
プロパティのフェイスを提供する。
faceとしてmode-line
、mode-line-inactive
、header-line
を使用することにより、フォーマットされた文字列のリターンに加えて、対応するフェイスのカレント定義を使用して、実際にモードラインやヘッダーラインが再描画されるだろうということに注意されたい(他のフェイスでは、再描画は行われない)。
たとえば、(format-mode-line
header-line-format)
は選択されたウィンドウに表示されるテキスト(ヘッダーラインがない場合は""
)をリターンするだろう。(format-mode-line
header-line-format
'header-line)
は、各文字がヘッダーライン内でもつであろうフェイスをもつ、同じテキストをリターンし、加えてヘッダーラインの再描画も行う。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Imenuとは、バッファー内の定義やセクションをすべてリストするメニューをユーザー選択することにより、バッファー内の該当箇所に直接移動する機能です。Imenuは、定義(またはバッファーのその他の名前つき範囲)の名前とその定義のバッファー内での位置をリストする、バッファーインデックスを構築して、ユーザーがそれを選択すればポイントをおこに移動できるようにして機能します。メジャーモードは、imenu-add-to-menubar
を使用して、メニューバーアイテムを追加することができます。
この関数は、nameという名前のImenuを実行するためのローカルメニューバーを定義する。
Imenuを使用ためのユーザーレベルコマンドは、Emacsマニュアル内で説明されています(Imenu in the Emacs Manualを参照)。このセクションでは、特定のメジャーモードにたいして、定義や名前つき範囲を見つける、Imenuメソッドのカスタマイズ方法を説明します。
変数imenu-generic-expression
をセットするのが通常の、そしてもっともシンプルな方法です:
この変数が非nil
の場合、それはImenuにたいして定義を探すための正規表現を指定するリストである。シンプルなimenu-generic-expression
の要素は、以下のようになる:
(menu-title regexp index)
ここで、menu-titleが非nil
の場合、それはこの要素にたいするマッチが、バッファーインデックスのサブメニューとなることを告げる。menu-title自体は、そのサブメニューにたいして名前を指定する。menu-titleがnil
,の場合は、この要素にたいするマッチは、直接トップレベルのバッファーインデックスとなる。
このリストの2つ目の要素regexpは、正規表現である(Regular Expressionsを参照)。これは、バッファー内でこれにマッチするものは定義、あるいはバッファーインデックス内に記載すべき何かであると判断される。3つ目の要素indexは、0以上の整数の場合は、regexp内の部分式(subexpression)が定義名にマッチすることを示します。
以下のような要素もある:
(menu-title regexp index function arguments…)
この要素にたいする各マッチはインデックスアイテムを作成し、ユーザーによりそのインデックスアイテムが選択されたとき、アイテム名、バッファー位置、およびargumentsから構成される引数で、functionを呼び出す。
Emacs Lispモードにたいしては、imenu-generic-expression
は以下のようになるだろう:
((nil "^\\s-*(def\\(un\\|subst\\|macro\\|advice\\)\ \\s-+\\([-A-Za-z0-9+]+\\)" 2)
("*Vars*" "^\\s-*(def\\(var\\|const\\)\ \\s-+\\([-A-Za-z0-9+]+\\)" 2)
("*Types*" "^\\s-*\ (def\\(type\\|struct\\|class\\|ine-condition\\)\ \\s-+\\([-A-Za-z0-9+]+\\)" 2))
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
この変数は、imenu-generic-expression
の値中の正規表現マッチが、大文字小文字を区別するかどうかを制御する。t
,(デフォルト)の場合は、大文字小文字の違いを無視することを意味する。
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
この変数は、imenu-generic-expression
処理中に、カレントバッファーの構文テーブルをオーバーライドして使用する、構文テーブル変更用のalistである。このalistの各要素は、以下の形式をもつべきである:
(characters . syntax-description)
CARのcharactersには、文字または文字列を指定できる。この要素は、その文字、または文字列がsyntax-descriptionにより指定される構文でありことを示し、modify-syntax-entry
に渡される(Syntax Table Functionsを参照)。
典型的には、この機能は通常はシンボル構文(symbol syntax)をもつ文字にたいして単語構文(word
syntax)を与えるために使用され、それによりimenu-generic-expression
が単純になり、マッチングのスピードも向上する。たとえば、Fortranモードは以下のようにこれを使用する:
(setq imenu-syntax-alist '(("_$" . "w")))
imenu-generic-expression
の正規表現は、‘\\(\\sw\\|\\s_\\)+’のかわりに、‘\\sw+’を使用できる。このテクニックは、モードの名前として許されるより短い、頭文字に名前を制限する必要があるときは、不便かもしれないことに注意されたい。
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
あるメジャーモードにたいしてImenuをカスタマイズする別の方法には、imenu-prev-index-position-function
とimenu-extract-index-name-function
があります:
この変数が非nil
の場合、その値はポイント位置からバッファーを後方にスキャンして、バッファーインデックスに配すべき、次の“定義”を探すための関数であること。そして、ポイントより前に他の“定義”が見つからなければ、nil
をリターンすべきである。見つかった場合は、“definition”を見つけた場所にポイントを残し、任意の非nil
値をリターンすべきである。
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
この変数が非nil
の場合、その値はポイントが定義中にある(imenu-prev-index-position-function
関数がポイントを残す場所)という想定の元、その定義の名前をリターンする関数であること。
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
メジャーモードにたいしてImenuをカスタマイズするための最後の方法は、変数imenu-create-index-function
のセットです:
この変数は、バッファーインデックスを作成するために使用する関数を指定する。この関数は、引数がをとらず、カレントバッファーにたいするインデックスalist(index
alist)をリターンすべきである。この関数はsave-excursion
内で呼び出されるので、どこにポイントを残しても違いはない。
このインデックスalistは、3つのタイプの要素をもつことができる。以下は、シンプル要素(simple element)の例である:
(index-name . index-position)
シンプル要素の選択は、そのバッファー内の位置index-positionに移動する効果をもつ。スペシャル要素(special element)は、以下のようなものである:
(index-name index-position function arguments…)
スペシャル要素の選択により、以下が処理される:
(funcall function index-name index-position arguments…)
ネストされたサブalist要素(nested sub-alist element)は、以下のようなものである:
(menu-title . sub-alist)
これは、sub-alistにより指定される、サブメニューmenu-titleを作成する。
imenu-create-index-function
のデフォルト値は、imenu-default-create-index-function
である。この関数は、インデックスalistを生成するために、imenu-prev-index-position-function
の値と、imenu-extract-index-name-function
の値を呼び出す。しかし、これら2つ変数のいずれかがnil
の場合、デフォルト関数はかわりにimenu-generic-expression
を使用する。
この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Font Lockモードとは、バッファーの特定の部分にたいして、それらの構文的役割(syntactic
role)にもとづき、自動的にface
プロパティをアタッチする、バッファーローカルなマイナーモードです。このモードがバッファーをパースする方法は、そのメジャーモードに依存します。ほとんどのメジャーモードは、どのコンテキストでどのフェイスを使用するかにたいして、構文的条件(syntactic
criteria)を定義します。このセクションでは、特定のメジャーモードにたいして、Font Lockをカスタマイズする方法を説明します。
Font Lockモードは、2つの方法によりハイライトするテキストを探します。それは構文テーブル(syntax table)にもとづく構文解析と、(通常は正規表現にたいする)検索です。最初に構文的フォント表示(syntactic fontification)が発生します。これはコメントと文字列定数を見つけて、それらをハイライトします。検索ベースのフォント表示が発生するのは、2番目です。
22.6.1 Font Lock Basics | Font Lockカスタマイズの概要。 | |
22.6.2 Search-based Fontification | 正規表現にもとづくフォント表示。 | |
22.6.3 Customizing Search-Based Fontification | 検索ベースフォント表示のカスタマイズ。 | |
22.6.4 Other Font Lock Variables | 追加のカスタマイズ機能。 | |
22.6.5 Levels of Font Lock | 多なりとも少ユーザーが選択できるように、それぞれのモードは代替レベルを定義できる。 | |
22.6.6 Precalculated Fontification | バッファーコンテンツを生成するLispプログラムが、どのようにしてそれをフォント表示する方法も指定できるか。 | |
22.6.7 Faces for Font Lock | Font Lockにたいする具体的な特殊フェイス。 | |
22.6.8 Syntactic Font Lock | 構文テーブルにもとづくフォント表示。 | |
22.6.9 Multiline Font Lock Constructs | Font Lockに複数行構成の正しいハイライトを強制する方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Font
Lockモードがテキストをハイライトする方法を制御する変数が、いくつかあります。しかし、メジャーモードは、これらの変数を直接セットするべきではありません。かわりに、メジャーモードはバッファーローカル変数として、font-lock-defaults
をセットするべきです。Font
Lockモードが有効なときは、他のすべての変数をセットするために、この変数に割り当てられた値が使用されます。
この変数は、そのモード内のテキストをフォント表示する方法を指定するために、メジャーモードによりセットされる。この変数は、セットした際に自動的にバッファーローカルになる。変数の値がnil
の場合、Font
Lockモードはハイライトを行わず、バッファー内のテキストに明示的にフェイスを割り当てるために、‘Faces’メニュー(メニューバーの‘Edit’の下の‘Text
Properties’)を使用できる。
非nil
の場合、値は以下のようであること:
(keywords [keywords-only [case-fold [syntax-alist [syntax-begin other-vars…]]]])
1つ目の要素keywordsは、検索ベースのフォント表示を制御するfont-lock-keywords
の値を、間接的に指定する。値にはシンボル、変数、またはfont-lock-keywords
にたいして使用するリストが値であるような関数を指定できる。また、それぞれのシンボルがフォント表示の可能なレベルであるような、いくつかのシンボルからなるリストも指定できる。この場合、1つ目のシンボルはフォント表示の‘モードデフォルト(mode
default)’レベル、次のシンボルはフォント表示のレベル1、その次はレベル2、のようになる。通常、‘モードデフォルト’レベルはレベル1と等しい。これは、font-lock-maximum-decoration
がnil
値をもつとき使用される。Levels of Font Lockを参照のこと。
2つ目の要素keywords-onlyは、変数font-lock-keywords-only
の値を指定する。これが省略、またはnil
の場合は、(文字列とコメントの)構文的フォント表示も行われる。非nil
の場合は、構文的フォント表示は行われない。Syntactic Font Lockを参照のこと。
3つ目の要素case-foldは、font-lock-keywords-case-fold-search
の値を指定する。非nil
の場合、検索ベースフォント表示の間、Font
Lockモードは大文字小文字の違いを無視する。
4つ目の要素syntax-alistが非nil
の場合、それは(char-or-string
.
string)
という形式のコンスセルのリストであること。これらは、構文的フォント表示にたいする構文テーブルのセットアップに使用される。結果となる構文テーブルは、font-lock-syntax-table
に格納される。syntax-alistが省略、またはnil
の場合、構文的フォント表示はsyntax-table
関数によりリターンされる構文テーブルを使用する。Syntax Table Functionsを参照のこと。
5つ目の要素syntax-beginは、font-lock-beginning-of-syntax-function
の値を指定する。この変数はnil
にセットして、かわりにsyntax-begin-function
の使用を推奨する。
(もしあれば)残りすべての要素は、まとめてother-varsと呼ばれる。これらの要素はすべて、(variable
.
value)
という形式をもつべきである。これは、variableをバッファーローカルにしてから、それにvalueをセットすることを意味する。これらother-varsを使用して、最初の5つの要素による制御とは別に、フォント表示に影響する他の変数をセットできる。Other Font Lock Variablesを参照のこと。
モードがfont-lock-face
プロパティ追加により明示的にテキストをフォント表示する場合は、自動的なフォント表示すべてをオフにするために、font-lock-defaults
に(nil
t)
を指定できます。しかし、これは必須ではありません。font-lock-face
を使用して何かをフォント表示して、それ以外の部分のテキストを自動的にフォント表示するようにセットアップするのは可能です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
検索ベースフォント表示を直接制御する変数は、font-lock-keywords
です。この変数は通常、font-lock-defaults
内の要素keywordsを通じて指定されます。
この変数の値は、ハイライトするキーワードのリストである。Lispプログラムは、この変数を直接セッすべきでない。通常は、font-lock-defaults
内の要素keywordsを使用して、Font
Lockモードが自動的に値をセットする。この値は、関数font-lock-add-keywords
およびfont-lock-remove-keywords
を使用して、変更されることもあり得る(Customizing Search-Based Fontificationを参照)。
font-lock-keywords
の各要素は、特定のケースに該当するテキストを見つける方法、およびそれらをハイライトする方法を指定します。Font
Lockモードは、font-lock-keywords
の要素をちくじ処理してマッチを探して、すべてのマッチを処理します。通常は、テキストの一部はすでに一度はフォント表示されており、同じテキスト内で連続するマッチによるこれをオーバーライドはできません。しかし、subexp-highlighterの要素overrideを使用して、異なる挙動を指定できます。
font-lock-keywords
の各要素は、以下の形式のいずれかをもつべきです:
regexp
font-lock-keyword-face
を使用して、regexpにたいするすべてのマッチをハイライトする。たとえば、
;; font-lock-keyword-face
を使用して
;; 単語‘foo’をハイライトする
"\\<foo\\>"
これらの正規表現を作成するときは、慎重に行うこと。下手に記述されたパターンにより、スピードが劇的に低下し得る!
関数regexp-opt
(Regular Expression Functionsを参照)は、いくつかのキーワードとマッチするために最適な正規表現の計算に有用である。
function
functionを呼び出すことによりテキストを探し、font-lock-keyword-face
を使用して見つかったマッチをハイライトする。
functionは、呼び出される際に1つの引数(検索のリミット)を受け取る。検索はポイント位置から開始し、そのリミットを超えた検索は行うべきではない。これは、検索が成功した場合は非nil
をリターンして、見つかったマッチを表すマッチデータをセットすべきである。nil
のリターンは、検索の失敗を示す。
フォント表示は、前の呼び出しでポイントが残された位置から、同じリミットを用いてfunctionを呼び出し、functionが失敗するまでfunctionを繰り返し呼び出すだろう。検索が失敗しても、何らかの特別な方法により、functionがポイントをリセットする必要はない。
(matcher . subexp)
この種の要素では、matcherは上述のregexpかfunctionのいずれかである。CDRのsubexpは、(matcherがマッチするテキスト全体のかわりに)matcherのどの部分式(subexpression)がハイライトされるべきかを指定する。
;; font-lock-keyword-face
Hを使用して
;; ‘bar’が‘fubar’の一部のときに
;; ハイライトする
("fu\\(bar\\)" . 1)
正規表現matcherの生成にregexp-opt
を使用する場合は、subexpにたいする値の計算にregexp-opt-depth
(Regular Expression Functionsを参照)を使用できる。
(matcher . facespec)
この種の要素では、facespecの値がハイライトに使用するフェイスを指定する。もっともシンプルな例では、facespecは値がフェイス名であるようなはLisp変数(シンボル)である。
;; fubar-face
の値のフェイスを使用して
;; ‘fubar’をハイライトする
("fubar" . fubar-face)
しかし、facespecは以下のような形式のリストに評価されてもよい:
(face face prop1 val1 prop2 val2…)
これは、マッチしたテキストにフェイスfaceを指定し、さまざまなテキストプロパティをputする。これを行う場合は、この方法によりfont-lock-extra-managed-props
に値をセットする、他のテキストプロパティ名を確実に追加すること。そうすれば、それらのプロパティが妥当性を失ったとき、それらのプロパティもクリアーされるだろう。これらのプロパティをクリアーする関数を、変数font-lock-unfontify-region-function
にセットすることもできる。Other Font Lock Variablesを参照のこと。
(matcher . subexp-highlighter)
この種の要素では、subexp-highlighterはmatcherにより見つかったマッチをハイライトする方法を指定するリストである。これは、以下の形式をもつ。
(subexp facespec [override [laxmatch]])
CARのsubexpは、マッチのどの部分式をフォント表示するかを指定する整数である(0はマッチしたテキスト全体を意味する)。これの2つ目の要素facespecは、上述したような値がフェイスを指定するような式である。
subexp-highlighter内の残りの値overrideとlaxmatchは、オプションのフラグである。overrideがt
の場合、この要素は前のfont-lock-keywords
の要素により作成された既存のフォント表示をオーバーライドできる。値がkeep
の場合は、すでに他の要素によりフォント表示されていない文字がフォント表示される。値がprepend
の場合は、facespecにより指定されたフェイスが、font-lock-face
プロパティの先頭に追加される。値がappend
の場合は、そのフェイスがfont-lock-face
プロパティの最後に追加される。
laxmatchが非nil
の場合、それはmatcher内で番号付けされた部分式subexpが存在しなくても、エラーにならないことを意味する。当然、番号付けされた部分式subexpのフォント表示は発生しない。しかし、他の部分式(と他のregexp)のフォント表示は継続されるだろう。laxmatchがnil
で、指定された部分式が存在しない場合は、エラーがシグナルされて検索ベースのフォント表示は終了する。
以下はこのタイプの要素と、それが何を行うかの例である:
;;foo-bar-face
を使用して、たとえハイライト済みでも ;; ‘foo’と‘bar’をハイライトする ;;foo-bar-face
は値がフェイスであるような変数であること ("foo\\|bar" 0 foo-bar-face t) ;;fubar-face
の値のフェイスを使用して ;; 関数fubar-match
が見つけた各マッチの ;; 最初の部分式をハイライトする (fubar-match 1 fubar-face)
(matcher . anchored-highlighter)
この種の要素では、anchored-highlighterはmatcherが見つけたマッチに後続するテキストをハイライトする方法を指定する。つまり、matcherが見つけたマッチは、anchored-highlighterにより指定されるその先の検索にたいする、アンカー(anchor)として機能する。anchored-highlighterは、以下の形式のリストである:
(anchored-matcher pre-form post-form subexp-highlighters…)
ここで、anchored-matcherはmatcherと同様、正規表現か関数である。matcherにたいするマッチを見つけた後に、ポイントはそのマッチの終端に移動する。そこで、Font Lockはフォームpre-formを評価する。それからanchored-matcherにたいするマッチを検索し、subexp-highlightersを使用して、それらのマッチをハイライトする。subexp-highlighterについては上記を参照のこと。最後にFont Lockはpost-formを評価する。
フォームpre-formおよびpost-formは、anchored-matcher使用時の事前の初期化、事後のクリーンアップに使用され得る。通常、pre-formはanchored-matcherを開始する前に、matcherのマッチに関連する何らかの位置にポイントを移動するために使用される。post-formは、matcherを再開する前に、ポイントを戻すために使用されるかもしれない。
pre-formを評価した後、Font Lockはその行の終端の先にたいして、anchored-matcherの検索を行わない。しかし、pre-formがpre-form評価後のポイント位置より大きいバッファー位置をリターンした場合には、かわりにpre-formによりリターンされた位置が検索リミットとして使用される。一般的に、その行の終端より大きい位置をリターンするのは、よいアイデアではない。別の言い方をすると、anchored-matcher検索は複数行にわたる(span lines)べきではないと言えよう。
たとえば、
;; item-face
の値を使用して
;; 単語‘anchor’に(同一行内で)
;; 後続する単語‘item’をハイライトする
("\\<anchor\\>" "\\<item\\>" nil nil (0 item-face))
ここで、pre-formとpost-formはnil
である。したがって、‘item’にたいする検索は‘anchor’にたいするマッチの終端から開始され、後続する‘anchor’インスタンスにたいする検索は、‘item’にたいする検索が終了した位置から再開される。
(matcher highlighters…)
この種の要素は、単一のmatcherにたいして、複数のhighlighterリストを指定する。highlighterリストには、上述したsubexp-highlighter、またはanchored-highlighterのいずれかを指定できる。
たとえば、
;;anchor-face
の値内に現れる単語‘anchor’、 ;; および、(同じ行の)後続のitem-face
の ;; 値内に現れる単語‘item’をハイライトする ("\\<anchor\\>" (0 anchor-face) ("\\<item\\>" nil nil (0 item-face)))
(eval . form)
ここでformは、バッファー内でこのfont-lock-keywords
の値が最初に使用されるときに評価される式である。この値は、上述のこのテーブルで説明した、いずれかの形式をもつべきである。
警告:
複数行にわたるテキストにたいするマッチさせるために、font-lock-keywords
の要素をデザインしてはならない。これは確実に機能するとは言えない。詳細は、Multiline Font Lock Constructsを参照のこと。
検索ベースのフォント表示が大文字小文字を区別すべきかどうかを告げるfont-lock-keywords-case-fold-search
の値を指定するために、font-lock-defaults
内でcase-foldを使用できる。
非nil
は、font-lock-keywords
のための正規表現マッチングが、大文字小文字を区別すべきではないことを意味する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メジャーモードにたいして検索ベースフォント表示ルールを追加するためにfont-lock-add-keywords
、削除にはfont-lock-remove-keywords
を使用することができます。
この関数は、カレントバッファー、またはメジャーモードmodeにたいして、ハイライトするkeywordsを追加する。引数keywordsは、変数font-lock-keywords
と同じ形式のリストであること。
modeが、c-mode
のような、あるメジャーモードのコマンド名であるようなシンボルの場合には、そのmode内でFont
Lockモードを有効にすることにより、keywordsがfont-lock-keywords
に追加される効果がある。非nil
値のmodeによる呼び出しは、~/.emacsファイル内でのみ正しい。
modeがnil
の場合、この関数はカレントバッファーのfont-lock-keywords
にkeywordsを追加する。この方法でのfont-lock-add-keywords
呼び出しは、通常はモードフック関数内で使用される。
デフォルトでは、keywordsはfont-lock-keywords
の先頭に追加される。オプション引数howがset
の場合、それらはfont-lock-keywords
の値の置換に使用される。howがそれ以外の非nil
値の場合、これらはfont-lock-keywords
の最後に追加される。
追加のハイライトパターンの使用を可能にする、特別なサポートを提供するモードがいくつかある。それらの例については、変数c-font-lock-extra-types
、c++-font-lock-extra-types
、java-font-lock-extra-types
を参照のこと。
警告:
メジャーモードコマンドは、モードフックを除き、いかなる状況においても、直接間接を問わずfont-lock-add-keywords
を呼び出してはならない(これを行うと、いくつかのマイナーモードは不正な振る舞いを起こしかねない)。メジャーモードコマンドは、font-lock-keywords
をセットすることにより、検索ベースフォント表示のルールをセットアップすべきである。
この関数は、カレントバッファー、またはメジャーモードmodeにたいして、font-lock-keywords
からkeywordsを削除する。font-lock-add-keywords
の場合と同様、modeはメジャーモードコマンド名かnil
であること。font-lock-add-keywords
にたいするすべての制約と条件は、この関数にも適用される。
たとえば、以下はCモードに2つのフォント表示パターンを追加するコードの例である。フォント表示の1つは、たとえコメント内であろうとも単語‘FIXME’をフォント表示し、もう1つは‘and’、‘or’、‘not’をキーワードとしてフォント表示する。
(font-lock-add-keywords 'c-mode '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend) ("\\<\\(and\\|or\\|not\\)\\>" . font-lock-keyword-face)))
この例は、正にCモードだけに効果がある。Cモード、およびその派生モードにたいして同じパターンを追加するには、かわりに以下を行う:
(add-hook 'c-mode-hook (lambda () (font-lock-add-keywords nil '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend) ("\\<\\(and\\|or\\|not\\)\\>" . font-lock-keyword-face)))))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、font-lock-defaults
内のother-varsを用いて、メジャーモードがセットできる追加の変数について説明します(Font Lock Basicsを参照)。
この変数が非nil
の場合、それはコマンドM-o
M-o(font-lock-fontify-block
)で再フォント表示するテキスト範囲を選択するために、引数なしで呼び出される関数であること。
この関数は、結果を報告するために、選択されたテキスト範囲にリージョンを配すべきである。正しい結果を与えるのに十分、かつ再フォント表示が低速にならない程度のテキスト範囲を選択するのがよい。プログラミングのモードにたいしてはmark-defun
、テキストを扱うモードにたいしてはmark-paragraph
が典型的な値である。
この変数は、(font-lock-face
以外の)Font
Lockにより管理される追加プロパティを指定する。これらの追加プロパティは、通常はfont-lock-face
プロパティだけを管理する、font-lock-default-unfontify-region
により使用される。他のプロパティも同様にFont
Lockに管理させたい場合は、このリストに追加するのと同じように、font-lock-keywords
内のfacespec内でもこれらを指定しなければならない。Search-based Fontificationを参照のこと。
そのバッファーをフォント表示するために使用する関数。デフォルト値はfont-lock-default-fontify-buffer
。
そのバッファーを非フォント表示するために使用する関数。デフォルト値はfont-lock-default-unfontify-buffer
。
リージョンをフォント表示するための関数。この関数は、リージョンの開始と終了の2つを引数にとり、オプションで3つ目の引数verboseをとるべきである。verboseが非nil
の場合、その関数はステータスメッセージをプリントすべきである。デフォルト値はfont-lock-default-fontify-region
。
リージョンを非フォント表示するための関数。この関数は、リージョンの開始と終了の2つを引数にとるべきである。デフォルト値はfont-lock-default-unfontify-region
。
この関数は、カレントバッファーの一部をフォント表示/非表示する必要がある任意のタイミングで、Font LockモードがLisp関数functionを実行することを宣言する。これは、デフォルトのフォント表示関数が呼び出される前に、フォント表示/非表示するリージョンを指定する2つの引数startとendでfunctionを呼び出す。
オプション引数contextualが非nil
の場合は、行が更新されたときに限らず、そのバッファーの構文的に関連する部分を常にフォント表示するよう、Font
Lockモードに強制する。この引数は、通常は省略できる。
以前にjit-lock-register
を使用して、フォント表示関数としてfunctionを登録した場合は、その関数を未登録にする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フォント表示にたいして3つの異なるレベルを提供するモードが、いくつかあります。font-lock-defaults
内のkeywordsにたいしてシンボルのリストを使用することにより、複数のレベルを定義できます。このリストのシンボルはそれぞれ、フォント表示の1レベルを指定します。これらのレベルの選択は、通常はfont-lock-maximum-decoration
をセットすることにより、ユーザーの責任で行われます(Font
Lock in the GNU Emacs
Manualを参照)。選択されたレベルのシンボルの値は、font-lock-keywords
の初期化に使用されます。
フォント表示レベルの定義方法に関する慣習を以下に挙げます:
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
list-buffers
やoccur
のようないくつかのメジャーモードは、バッファーのテキストをプログラム的に構築します。これらにたいしてFont
Lockモードをサポートするには、そのバッファーにテキストを挿入するタイミングで、テキストのフェイスを指定するのが、もっとも簡単な方法です。
これは、スペシャルテキストプロパティfont-lock-face
(Properties with Special Meaningsを参照)により、テキスト内にフェイスを指定することにより行われます。Font
Lockモードが有効になったとき、このプロパティはface
と同じように、表示を制御します。Font
Lockモードが無効になると、font-lock-face
は表示に効果をもちません。
モードが、通常のFont
Lockメカニズムとともに、あるテキストにたいしてfont-lock-face
を使用しても問題はありません。しかし、そのモードが通常のFont
Lockメカニズムを使用しない場合は、変数font-lock-face
をセットするべきではありません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Font Lockモードは、ハイライトに任意のフェイスを使用できますが、Emacsは、特にFontLockがテキストのハイライトに使用するいくつかのフェイスを定義しています。これらのFont Lockフェイス(Font Lock faces)を、以下にリストします。これらのフェイスは、FontLockモードの外部における構文的なハイライトでメジャーモードが使用することもできます(Major Mode Conventionsを参照)。
以下の各シンボルは、フェイス名であり、かつデフォルト値がシンボル自身であるような変数でもあります。つまり、font-lock-comment-face
のデフォルト値はfont-lock-comment-face
です。
リストは、そのフェイスの典型的な使い方の説明とともに、“重要性”が大きい順にソートされています。あるモードの構文的カテゴリーが、以下の使い方の説明にうまく適合しない場合、この並び順をガイドとして使用することにより、フェイスを割り当てることができるでしょう。
font-lock-warning-face
Emacs Lispの‘;;;###autoload’、Cの‘#error’のような、特有な構文、またはその他のテキスト意味を大きく変更する構文にたいして使用される。
font-lock-function-name-face
定義、または宣言される関数の名前にたいして使用される。
font-lock-variable-name-face
定義、または宣言される変数の名前にたいして使用される。
font-lock-keyword-face
Cの‘for’や‘if’のように、特別な構文的意味をもつキーワードにたいして使用される。
font-lock-comment-face
コメントにたいして使用される。
font-lock-comment-delimiter-face
Cの‘/*’と‘*/’のような、コメント区切りにたいして使用される。ほとんどの端末では、このフェイスはfont-lock-comment-face
を継承する。
font-lock-type-face
ユーザー定義データ型にたいして使用される。
font-lock-constant-face
Cの‘NULL’のような、定数の名前にたいして使用される。
font-lock-builtin-face
ビルトイン関数の名前にたいして使用される。
font-lock-preprocessor-face
プロセッサーコマンドにたいして使用される。デフォルトでは、font-lock-builtin-face
を継承する。
font-lock-string-face
文字列定数にたいして使用される。
font-lock-doc-face
コード内のドキュメント文字列にたいして使用される。デフォルトでは、font-lock-string-face
を継承する。
font-lock-negation-char-face
見逃されやすい否定文字にたいして使用される。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
構文的フォント表示(syntactic
fontification)は、構文的に関連性のあるテキストを探してハイライトするために、構文テーブル(syntax table:
Syntax Tablesを参照)を使用します。有効な場合は、検索ベースフォント表示に先立ち実行されます。以下で説明する変数font-lock-syntactic-face-function
,は、どの構文的構造をハイライトするかを決定します。構文的フォント表示に影響を与える変数が、いくつかあります。font-lock-defaults
のために、それらをセットするべきです(Font Lock Basicsを参照)。
Font
Lockモードが一連のテキストにたいして構文的フォント表示を処理するときは、常にsyntax-propertize-function
で指定される関数を最初に呼び出します。メジャーモードは、特別なケースではsyntax-table
テキストプロパティを適用してバッファーの構文テーブルをオーバーライドするために、これを使用することができます。Syntax Propertiesを参照してください。
この変数の値が非nil
の場合、Font
Lockは構文的フォント表示を行わず、font-lock-keywords
にもとづく検索ベースフォント表示だけを行う。これは通常、font-lock-defaults
内のkeywords-only要素にもとづき、Font
Lockモードによりセットされる。
この変数は、コメントと文字列のフォント表示に使用するための構文テーブルを保持する。これは通常、font-lock-defaults
内のsyntax-alist要素にもとづき、Font
Lockモードによりセットされる。この値がnil
の場合、構文的フォント表示は、バッファーの構文テーブル(関数syntax-table
がリターンする構文テーブル。see section Syntax Table Functionsを参照)を使用する。
この変数が非nil
の場合、それは構文的に“トップレベル”で、かつ文字列やコメントの外部であるような位置に戻すようにポイントを移動する関数であること。この値は通常、font-lock-defaults
内のother-vars要素を通じてセットされる。これがnil
の場合、Font
Lockはコメント、文字列、sexpの外部に戻って移動するためにsyntax-begin-function
を使用する(Finding the Parse State for a Positionを参照)。
この変数は、半ば時代遅れであり、通常はかわりにsyntax-begin-function
をセットすることを推奨する。これの用途の1つは、たとえば異なる種類の文字列やコメントを異なるようにハイライトする等、構文的フォント表示の振る舞いの調整する場合である。
指定された関数は、引数なしで呼び出される。この関数は、周囲の構文的ブロックの先頭にポイントを残すべきである。典型的な値はbeginning-of-line
(行頭が構文的ブロック外部であることが既知の場合に使用)、プログラミングのモードにたいしてはbeginning-of-defun
、テキストを扱うモードにたいしてはbackward-paragraph
が使用される。
この変数が非nil
の場合、それは与えられた構文的要素にどのフェイスを使用するかを決定する関数であること。この値は通常、font-lock-defaults
内のother-vars要素を通じてセットされる。
この関数は1つの引数で呼び出され、parse-partial-sexp
がリターンするポイントの状態をパースして、フェイスをリターンすべきである。コメントにたいしてはfont-lock-comment-face
、文字列にたいしてはfont-lock-string-face
が、リターンされるデフォルト値である(Faces for Font Lockを参照)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
通常は、font-lock-keywords
の要素は複数行にわたるマッチを行うべきではありません。それらの動作に信頼性はありません。なぜなら、Font
Lockは通常はバッファーのごく一部をスキャンするので、そのスキャンが開始される行境界をまたがる複数行構造を見逃しかねないからです(スキャンは通常、行頭から開始される)。
ある要素にたいして、複数行構造にたいするマッチを正しく機能させるには、2つの観点があります。それは識別(identification)の補正と、再ハイライト(rehighlighting)の補正です。1つ目は、Font Lockがすべての複数行構造を探すことを意味します。2つ目は、複数行構造が変更されたとき、たとえば以前は複数行構造の一部だったテキストが、複数行構造から除外されたときに、関連するすべてのテキストをFont Lockに正しく再ハイライトさせることを意味します。これら2つの観点は密接に関連しており、一方を機能させることがもう一方を機能させるようなことが多々あります。しかし、信頼性のある結果を得るためには、これら2つの観点双方にたいして、明示的に注意しなければなりません。
複数行構造の識別を確実に補正するには、3つの方法があります:
font-lock-extend-region-functions
に追加する。
font-lock-fontify-region-function
フックを使用する。
font-lock-multiline
でそれをマークする。
複数行構造の再ハイライトを行うには、3つの方法があります:
font-lock-multiline
を配する。これにより、その構造の一部が変更された場合は、構造全体が再ハイライトされるだろう。あるケースにおいては、それを参照するfont-lock-multiline
変数をセットすることにより、これを自動的に行うことができる。
jit-lock-contextually
を確実にセットして、それが行う処理に委ねる。これにより、実際の変更に続いて構造の一部だけが、若干の遅延の後に再ハイライトされるだろう。これは、複数行構造のさまざまな箇所のハイライトが、後続行のテキストに依存しない場合のみ機能する。jit-lock-contextually
はデフォルトでアクティブなので、これは魅力的な解決策になり得る。
jit-lock-defer-multiline
を配する。これは、jit-lock-contextually
が使用された場合のみ機能し、再ハイライト前に同様の遅延を伴うが、font-lock-multiline
のように後続行に依存する箇所のハイライトも処理する。
22.6.9.1 Font Lock Multiline | テキストプロパティで複数行塊をマークする。 | |
22.6.9.2 Region to Fontify after a Buffer Change | バッファー変更後にどのリージョンを再フォント表示するかを制御する。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
複数行構造のFont
Lockを確実に再ハイライトする方法の1つは、それらをテキストプロパティfont-lock-multiline
にputする方法です。複数行構造の一部であるようなテキストにたいしては、このプロパティが存在し、値が非nil
であるべきです。
Font
Lockがテキスト範囲をハイライトしようとする際は、それらがfont-lock-multiline
プロパティでマークされたテキストにならないように、まず必要に応じて範囲の境界を拡張します。それから、その範囲のすべてのfont-lock-multiline
を削除して、ハイライトします。ハイライト指定(大抵はfont-lock-keywords
)は、適宜このプロパティを毎回再インストールしなければなりません。
警告:
ハイライトが低速になるので、大きなテキスト範囲にたいしてfont-lock-multiline
を使用してはならない。
font-lock-multiline
変数がt
にセットされている場合、Font
Lockは自動的に複数行構造にたいしてfont-lock-multiline
プロパティの追加を試みる。しかし、これによりFont
Lockが幾分遅くなるので、普遍的解ではない。これは、何らかの複数行構造を見逃したり、必要なものより多く、または少なくプロパティをセットするかもしれない。
matcherが関数であるような要素は、たとえ少量のサブパート(subpart)だけがハイライトされるような場合でも、submatch
0(訳注:正規表現の後方参照においてsubmatch
0はマッチした文字列全体を指す)が関連する複数行構造全体を確実に網羅するようにすべきである。単に手動でfont-lock-multiline
を追加するのが容易な場合も多々ある。
font-lock-multiline
プロパティは、正しい再フォント表示を確実に行うことを意図しています。これは、新たな複数行構造を自動的に認識しません。Font
Lockの処理を要するものにたいする認識は、一度に処理を行うのに十分な大きさのchunkにたいして行われます。これは多くの場合にアクシデントにより発生し得るかもしれないので、複数行構造が不可解に機能するような印象を与えるかもしれません。変数font-lock-multiline
を非nil
にセットした場合、発見されたこれらの構造にたいするハイライトは、変数をセットした後は正しく更新されるので、さらにこの印象が強くなるでしょう。しかし、これは信頼性をもって機能しません。
信頼性を保ち複数行構造を見つけるためには、Font
Lockが調べる前にテキストのfont-lock-multiline
プロパティを手動で配すか、font-lock-fontify-region-function
を使用しなければなりません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーが変更されたとき、Font Lockが再フォント表示するリージョンは、デフォルトではその変更に関連する、最小の行全体からなるシーケンスです。これはほとんどの場合は良好に機能しますが、うまく機能しないとき(たとえば、その変更がそれより前の行のテキストの構文的な意味を変更してしまうとき)もあります。
以下の変数をセットすることにより、再フォント表示するリージョンを拡張(または縮小さえ)することができます:
このバッファーローカル変数はnil
、またはFont
Lockモードにたいしてスキャンしてフォント表示すべきリージョンを決定するために呼び出される関数である。
この関数には、標準的なbegとend、およびafter-change-functions
のold-len(Change Hooksを参照)という、3つのパラメーターが渡される。この関数はフォント表示するリージョンのバッファー位置の開始と終了(この順で)からなるコンスセル、またはnil
(標準的な方法でリージョンを選択することを意味する)のいずれかをリターンすべきである。この関数は、ポイント位置、match-data、カレントのナローイングを保つ必要がある。これがリターンするリージョンは、行の途中で開始、または終了するかもしれない。
この関数はバッファーを変更するたびに呼び出されるので、有意に高速であること。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラミング言語のメジャーモードにとって、自動的なインデントの提供は、重要な機能です。これには2つのパートがあります。1つ目は正しい行のインデントが何か、そして2つ目はいつ行を再インデントするかの判断です。デフォルトでは、electric-indent-chars
に含まれる文字(デフォルトでは改行のみ)をタイプしたとき、Emacsは常に行を再インデントします。メジャーモードは、その言語の構文に合わせて、electric-indent-chars
に文字を追加できます。
正しいインデントの決定は、indent-line-function
によりEmacs内で制御されます(Indentation Controlled by Major Modeを参照)。いくつかのモードでは、右へのインデントは信頼性がないことが知られています。これは通常、複数のインデントが有効だが、それぞれが異なる意味をもつので、インデント自体が重要だからです。そのような場合、そのモードは行が常にユーザーの望み通り再インデントされないことを念押しするために、electric-indent-inhibit
をセットするべきです。
よいインデント関数の記述は難しく、その広範な領域において、未だ黒魔術の域を脱していません。メジャーモード作者の多くは、単純なケース(たとえば前のテキスト行のインデントとの比較)にたいして機能する、単純な関数の記述からスタートすることでしょう。実際には行ベースではないほとんどのプログラミング言語にたいして、これは貧弱なスケールになりがちです。そのような関数にたいして、より多様な状況を処理するような改良を行うと、関数はより一層複雑になり、最終的な結果は誰にも触れようとする気を起こさせない、巨大で複雑な保守不可能のインデント関数になる傾向があります。
よいインデント関数は通常、その言語の構文に応じて、実際にテキストをパースする必要があるでしょう。幸運なことに、このテキストパースはコンパイラーが要するほど詳細である必要はないでしょうが、その一方でインデントコードに埋め込まれたパーサーは、構文的に不正なコードにたいして、コンパイラーより幾分寛容な振る舞いを求められるでしょう。
保守可能なよいインデント関数は、通常2つのカテゴリーに落ち着きます。どちらも何らかの“安全”な開始ポイントから、関心のある位置まで前方にパースを行うか、あるいは後方へパースを行います。この2つの方法は、どちらも一方が他方に明快に優る選択ではありません。後方へのパースは、プログラミング言語が前方にパースされるようデザインされているため、前方へのパースに比べて難しいことが多々ありますが、インデントという目的においては“安全”な開始ポイントを推測する必要がないという利点があり、一般的にある行のインデントの判断のために分析を要するのは最小限のテキストだけという特性に恵まれているので、前の無関係なコード片内にある、何らかの構文エラーの影響をインデントが受けにくくなる傾向があります。一方で前方へのパースは、通常はより簡単であり、一度のパースで、リージョン全体を効果的に再インデントすることが可能になるという利点があります。
インデント関数をスクラッチから記述するよりも、既存のインデント関数の試用と再利用、または一般的なインデントエンジンに委ねるほうが優る場合が、しばしばあります。しかし、そのようなエンジンは悲しむべきほど少数しかありません。CCモードのインデントコード(C、C++、Java、Awk、およびその類のモードが使用)は年月を経てより一般化されてきているので、あなたの言語にこれらの言語と何らかの相似点があるなら、このエンジンの使用を試みるかもしれません。もう一方のSMIEはLispのsexp精神によるアプローチを採用して、それを非Lisp言語に適応します。
22.7.1 Simple Minded Indentation Engine | SMIE: Simple Minded Indentation Engine(純真なインデントエンジン) |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIEは、一般的な操作とインデントを提供するエンジンです。これは“演算子順位文法(operator precedence grammar)”を使用する、非常にシンプルなパーサーにもとづいたエンジンであり、メジャーモードがLispのS式ベースの操作を非Lisp言語に拡張するのを助け、同様にシンプルに使用できるにも関わらず、信頼できる自動インデントを提供します。
演算子順位文法は、コンパイラー内で使用されるより一般的なパーサーと比較すると、非常に原始的なパーステクノロジーです。このパーサーには次のような特徴があります。このパーサーのパース能力は非常に限定的で、大概は構文エラーを検出できません。しかし、アルゴリズム的に前方パースと同様に後方パースを効果的に行うことが可能です。実際にそれはSMIEが後方パースにもとづくインデントを使用でき、forward-sexp
とbackward-sexp
の両方の機能を提供できるとともに、特別な努力を要さずに構文的に不正なコードにたいして自然に機能するであろうことを意味します。欠点は、ほとんどのプログラミング言語は、少なくとも何らかの特別なトリック(Living With a Weak Parserを参照)で再分類しなければ、SMIEを使用して正しくパースできないことも意味するからです。
22.7.1.1 SMIE Setup and Features | SMIEのセットアップと機能。 | |
22.7.1.2 Operator Precedence Grammars | 非常にシンプルなパース技術。 | |
22.7.1.3 Defining the Grammar of a Language | 言語の文法を定義する。 | |
22.7.1.4 Defining Tokens | トークンの定義。 | |
22.7.1.5 Living With a Weak Parser | パーサー制限の回避策。 | |
22.7.1.6 Specifying Indentation Rules | インデントルールの指定。 | |
22.7.1.7 Helper Functions for Indentation Rules | インデントルールにたいするヘルパー関数。 | |
22.7.1.8 Sample Indentation Rules | インデントルールの例。 | |
22.7.1.9 Customizing Indentation | インデントのカスタマイズ。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIEは、構造的な操作と、コードの構造的構造にもとづくその他さまざまな機能、特に自動インデントにたいするワンストップショップ(一カ所で必要な全ての買い物ができること、またはそのような場所)であることを意図しています。メインのエントリーポイントはsmie-setup
で、これは通常メジャーモードセットアップの間に呼び出される関数です。
SMIEの操作とインデントをセットアップする。grammarはsmie-prec2->grammar
により生成される文法テーブル(grammar
table)、rules-functionはsmie-rules-function
で使用されるインデントルールのセット、keywordsは追加の引数であり以下のキーワードを含むことができる:
:forward-token
fun: 使用する前方lexer(lexer=lexical analyzer:
字句解析プログラム)を指定する。
:backward-token
fun: 使用する後方lexerを指定する。
この関数を呼び出せば、forward-sexp
、backward-sexp
、transpose-sexps
のようなコマンドが、すでに構文テーブルにより処理されている単なるカッコのペアー以外の、構造的な要素を正しく扱うことができるようになります。たとえば、与えられた文法が十分に明快ならば、transpose-sexps
はその言語の優先順位のルールを考慮して、+
演算子の2つの引数を正しく入れ替えることができます。
‘smie-setup’の呼び出しもまた、TABによるインデントを期待通り機能させ、begin...end
のような要素に適用するためにblink-matching-paren
を拡張し、そのメジャーモードのキーマップ内でバインドできるいくつかのコマンドを提供するのに十分です。
このコマンドは、もっとも最近オープンされた(まだクローズされていない)ブロックをクローズする。
このコマンドはdown-list
と似ているが、begin...end
のようなカッコ以外のネストされたトークンにも注意を払う。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIEの演算子順位文法は、各トークンにたいしてシンプルに左優先(left-precedence)と右優先(right-precedence)という順位ペアーを与えます。トークンT1
の右優先が、トークンT2
の左優先より小さい場合は、T1
< T2
であると言うことにしましょう。これを解読するには、<
をカッコの一種だとみなすのがよい方法です。... T1
something T2 ...
を見つけたら、これは... T1 something) T2 ...
ではなく... T1
(something T2 ...
とパースされるべきです。... T1 something) T2
...
と解釈するのは、T1 > T2
を見つけた場合でしょう。T1 =
T2
を見つけた場合、それはトークンT2とその後のトークンT1が同じ構文構成にあり、通常は"begin" =
"end"
を得ます。このような優先順位のペアーは、2項演算子(infix
operator)、カッコのようなネストされたトークン、およびその他多くのケースにたいして左結合(left-associativity)や右結合(right-associativity)を表現するのに十分です。
この関数は、prec2文法tableを引数にとり、smie-setup
で使用するのに適したalistをリターンする。prec2文法tableは、それ自体が以下の関数のいずれかによりビルドされることを意図している。
この関数は、複数のprec2文法tablesを、新たなprec2テーブルにマージする。
この関数は、順位テーブルprecsからprec2テーブルをビルドする。precsは優先順(たとえば"+"
は"*"
より前にくる)にソートされたリストで、要素は(assoc
op
...)
の形式であること。ここで、opは演算子として振る舞うトークン、assocはそれらの結合法則であり、left
、right
、assoc
、nonassoc
のいずれかである。与えられた要素内のすべての演算子は、同じ優先レベルと結合法則を共有する。
この関数により、BNF記法を使用した文法を指定することができる。これは、その文法のbnf表記と、同様に競合解決ルールresolversを受け取り、prec2テーブルをリターンする。
bnfは(nonterm rhs1 rhs2
...)
という形式の非終端定義で、各rhsは終端記号(トークンとも呼ばれる)、または非終端記号の(空でない)リストである。
すべての文法が許される訳ではない:
さらに、競合が発生し得る:
opener
(開きカッコに似た何か)、closer
(閉じカッコのようなもの)、またはこれら2つのいずれでもないneither
(2項演算子や"else"
のようなinnerトークン)である。
順位の競合は、resolversを通じて解決され得る。これはprecsテーブル(smie-precs->prec2
を参照)のリストである。それぞれの順位競合にたいして、これらのprecs
テーブルが特定の制約を指定している場合は、かわりにこの制約により競合が解決され、それ以外は競合する制約のうち任意の1つが報告され、他は単に無視される。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ある言語にたいしてSMIE文法を定義する通常の方法は、順位のテーブルを保持する新たなグローバル変数を定義して、BNFルールのセットを与える方法です。たとえば、小規模なPascal風言語の文法定義は、以下のようになるでしょう:
(require 'smie) (defvar sample-smie-grammar (smie-prec2->grammar (smie-bnf->prec2
'((id) (inst ("begin" insts "end") ("if" exp "then" inst "else" inst) (id ":=" exp) (exp)) (insts (insts ";" insts) (inst)) (exp (exp "+" exp) (exp "*" exp) ("(" exps ")")) (exps (exps "," exps) (exp)))
'((assoc ";")) '((assoc ",")) '((assoc "+") (assoc "*")))))
注意すべき点がいくつかあります:
begin
... end
ブロックのようなsexpの任意のシーケンスが、どこに、どのように出現しても、自動的にそれを許容するだろう。
id
は、右側に何ももたない。これは、id
が空文字列だけにマッチ可能なことを意味しない。なぜなら上述のように、任意のsexpシーケンスは、どこに、どのような方法でも出現するからである。
";"
を、セパレーター(separator)ステートメントのかわりとして扱っている。
","
や";"
のような)セパレーターは、BNFルールでは(foo (foo
"separator" foo) ...)
のように定義するのが最善である。これは、順位の競合を生成するが、明示的に(assoc
"separator")
を与えることにより解決される、
("(" exps
")")
ルールにカッコをペアーにする必要はなかった。(exps
の定義と併せて)このルールはかわりに、","
がカッコの外に出現すべきではないことを明確にする。
left
またはright
を選択すること優るという明白な理由がない場合は、通常はassoc
を使用して演算子を結合演算子(associative)とマークするほうが優れている。この理由により、上述の"+"
と"*"
は、たとえその言語がそれらを形式上は左結合(left
associative)と定義していても、assoc
として定義されている。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIEには、事前定義された字句解析プログラムが付属しており、それは次の方法で構文テーブルを使用します:
文字の任意のシーケンスは、トークンとみなせる単語構文(word syntax)、またはシンボル構文(symbol
syntax)をもち、句読点構文(punctuation
syntax)をもつ任意の文字シーケンスもトークンとみなされます。このデフォルトのlexerは、開始ポイントとして適している場合が多々ありますが、任意の与えられた言語にたいして、実際に正しいことは稀です。たとえば、これは"2,+3"
が3つのトークン"2"
、",+"
、"3"
から構成されていると判断するでしょう。
あなたの言語のlexerルールをSMIEにたいして説明するためには、次のトークンをfetchする関数と、前のトークンをfetchする関数の、2つの関数が必要になります。これらの関数は通常、最初に空白文字とコメントをスキップして、その後に次のテキストchunk(塊)を調べて、それが特別なトークンか確認します。これは通常、バッファーから単に抽出された文字列ですが、あなたが望む他の何かでも構いません。たとえば:
(defvar sample-keywords-regexp (regexp-opt '("+" "*" "," ";" ">" ">=" "<" "<=" ":=" "=")))
(defun sample-smie-forward-token () (forward-comment (point-max)) (cond ((looking-at sample-keywords-regexp) (goto-char (match-end 0)) (match-string-no-properties 0)) (t (buffer-substring-no-properties (point) (progn (skip-syntax-forward "w_") (point))))))
(defun sample-smie-backward-token () (forward-comment (- (point))) (cond ((looking-back sample-keywords-regexp (- (point) 2) t) (goto-char (match-beginning 0)) (match-string-no-properties 0)) (t (buffer-substring-no-properties (point) (progn (skip-syntax-backward "w_") (point))))))
これらのlexerがカッコの前にあるとき、空文字列をリターンする方法に注目してください。これは、SMIEが構文テーブル内で定義されているカッコにたいして、自動的に配慮するからです。より厳密には、lexerがnil
、または空文字列をリターンした場合、SMIEは構文テーブルにしたがい、対応するテキストをsexpとして処理します。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIEが使用するパーステクニックは、異なるコンテキストでトークンが異なる振る舞いをすることを許しません。ほとんどのプログラミング言語にたいして、これは順位の競合によりBNF文法を変換するとき明らかになります。
その文法を若干異なるように表現することにより、これらの競合を回避できる場合があります。たとえばModula-2にたいしては、以下のようなBNF文法をもつのが自然に思えるかもしれません:
... (inst ("IF" exp "THEN" insts "ELSE" insts "END") ("CASE" exp "OF" cases "END") ...) (cases (cases "|" cases) (caselabel ":" insts) ("ELSE" insts)) ...
しかし、これは"ELSE"
にたいする競合を生み出すでしょう。その一方でIFルールは、(他の多くのものの中でも特に)"ELSE"
=
"END"
を暗示します。しかしその一方では、"ELSE"
はcases
内に出現しますが、cases
は"END"
の左に出現するので、わたしたちは"ELSE"
> "END"
も得ることになります。これは、以下を使用して解決できます:
... (inst ("IF" exp "THEN" insts "ELSE" insts "END") ("CASE" exp "OF" cases "END") ("CASE" exp "OF" cases "ELSE" insts "END") ...) (cases (cases "|" cases) (caselabel ":" insts)) ...
または
... (inst ("IF" exp "THEN" else "END") ("CASE" exp "OF" cases "END") ...) (else (insts "ELSE" insts)) (cases (cases "|" cases) (caselabel ":" insts) (else)) ...
文法を書き換えによる競合の解決には欠点があります。なぜなら、SMIEはその文法がコードの論理的構造を反映すると仮定するからです。そのため、BNFと意図する抽象的構文木の関係を密接に保つことが望まれます。
注意深く考慮した後に、これらの競合は深刻ではなく、smie-bnf->prec2
のresolvers引数を通じて解決する決心する場合もあるでしょう。これは通常、その文法が単に不明瞭だからです。その文法により記述されるプログラムセットは競合の影響を受けませんが、それらのプログラムにたいする唯一の方法はパースだけです。'((assoc
"|"))
のようなリゾルバ(resolver:
解決するもの)を追加したいと望むような場合、通常それはセパレーターと2項結合演算子にたいするケースです。これが発生し得る他のケースは、'((assoc
"else" "then"))
を使用するような場合における、古典的なぶら下がりelse問題dangling else
problemです。これは実際に競合があり解決不能だが、実際のところ問題が発生しそうにないケースにたいしても、発生し得ます。
最後に、多くのケースでは、すべての文法再構築努力にも関わらず、いくつかの競合が残るでしょう。しかし失望しないでください。パーサーをより賢くすることはできませんが、あなたの望むようにlexerをスマートにすることは可能です。その方法は、競合が発生したら競合を引き起こしたトークンを調べて、それらのうちの1つを2つ以上の異なるトークンに分割する方法です。たとえば、トークン"begin"
にたいする互換性のない2つの使用を文法が区別する必要があり、見つかった"begin"
の種類により、lexerに異なるトークン(たとえば"begin-fun"
と"begin-plain"
)をリターンさせる場合です。これはlexerにたいして、異なるケースを区別する処理を強い、そのためにlexerは特別な手がかりを見つけるために、周囲のテキストを調べる必要があるでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
提供された文法にもとづき、他に特別なことを行わなくても、SMIEは自動的なインデントを提供できるでしょう。しかし実際には、このデフォルトのインデントスタイルでは、恐らく十分ではありません。多くの異なる状況において、これを微調整したいと思うかもしれません。
SMIEのインデントは、インデントルールは可能な限りローカルであるべきという考えにもとづきます。バーチャルインデント(virtual
indentation)という考えによって、この目的を達成します。これは、特定のプログラムポイント(program
point)は行頭にバーチャルインデントがある場合は、それをもつだろう、という発想です。もちろん、そのプログラムポイントが正に行頭にある場合は、そのプログラムポイントのバーチャルインデントは、プログラムポイントのカレントのインデントです。しかしそうでない場合は、SMIEがそのポイントのバーチャルインデントを計算するために、インデントアルゴリズムを使用します。ところで実際には、あるプログラムポイントのバーチャルインデントは、その前に改行を挿入した場合にプログラムポイントがもつであろうインデントと等しい必要はありません。これが機能する方法を確認するためには、Cにおける{
の後のSMIEのインデントルールは、{
がインデントする行自体にあるか、あるいは前の行の終端にあるかを配慮しないことが挙げられます。かわりに、これらの異なるケースは、{
の前のインデントを決定するインデントルール内で処理されます。
他の重要な考え方として、parentの概念があります。あるトークンparentは、周囲にある直近の構文構造の代表トークン(head
token)です。たとえば、else
のparentは、それが属するif
であり、if
のparentは周囲を取り囲む構造の先導トークン(lead
token)です。コマンドbackward-sexp
は、あるトークンからトークンのparentにジャンプしますが、注意点がいくつかあります。opener(if
のような、ある構造を開始するトークン)にたいしては、他のトークンではそのトークンの後のポイントから開始する必要があるのにたいして、opnerではそのトークンの前のポイントから開始する必要があります。backward-sexp
はparentトークンがそのトークンのopenerの場合はparentトークンの前のポイントで停止し、それ以外ではparentトークンの後のポイントで停止します。
SMIEのインデントルールは、2つの引数methodとargをとる関数により指定されます。ここでargの値と期待されるリターン値は、methodに依存します。
methodは、以下のいずれかを指定できます:
:after
:
この場合、argはトークンであり、関数はargの後に使用するインデントにたいするoffsetをリターンすべきである。
:before
:
この場合、argはトークンであり、関数はarg自体に使用するインデントのoffsetをリターンすべきである。
:elem
:
この場合、関数は関数の引数に使用するインデントのオフセット(argがarg
の場合)、または基本的のインデントステップ(argがbasic
の場合)、のいずれかをリターンすべきである。
:list-intro
:
この場合、argはトークンであり、関数はそのトークンの後が単一の式ではなく、(任意のトークンにより区切られない)式のリストが続く場合は非nil
をリターンすべきである。
argがトークンのとき、関数はそのトークンの直前のポイントで呼び出されます。リターン値nil
は常にデフォルトの振る舞いへのフォールバックを意味するので、関数は期待した引数でないときはnil
をリターンするべきです。
offsetは、以下のいずれかを指定できます:
nil
: デフォルトのインデントルールを使用する。
(column . column)
: 列columnにインデントする。
:after
にたいするカレントトークンであり、かつ:before
にたいしてparentであるようなトークン)にたいして相対的な、numberによるオフセット。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIEは、インデントを決定する関数内で使用するために特別にデザインされた、さまざまな関数を提供します(これらの関数のうちのいくつかは、異なるコンテキスト内で使用された場合は中断する)。これらの関数はすべて、プレフィックスsmie-rule-
で始まります。
カレントトークンが行の先頭にある場合は、非nil
をリターンする。
カレントトークンがhanging(ぶら下がり)の場合は、非nil
をリターンする。トークンがその行の最後のトークンであり、他のトークンが先行する場合、そのトークンはhangingである。行に単独のトークンはhangingではない。
次のトークンがtokens内にある場合は、非nil
をリターンする。
前のトークンがtokens内にある場合は、非nil
をリターンする。
カレントトークンのparentがparents内にある場合は、非nil
をリターンする。
カレントトークンのparentが実際はsibling(兄弟)の場合は、非nil
をリターンする。たとえば","
のparentが直前の","
のような場合が該当する。
カレントトークンをparentとアライン(align:
桁揃え)するための適切なオフセットをリターンする。offsetが非nil
の場合、それは追加オフセットとして適用される整数であること。
セパレーター(separator)としてカレントトークンをインデントする。
ここでのセパレーターは、周囲を取り囲む何らかの構文構造内でさまざまな要素を区切ることを唯一の目的とするトークンであり、それ自体は何も意味をもたないトークン(通常は抽象構文木内でノードとして存在しない)を意味する。
このようなトークンは結合構文をもち、その構文的parentと密に結び付けられることが期待される。典型的な例としては引数リスト内の","
(カッコで括られた内部)、または命令文シーケンス内の";"
({...}
やbegin...end
で括られたブロックの内部)が挙げられる。
methodは、‘smie-rules-function’に渡されるメソッド名であること。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、インデント関数の例です:
(defun sample-smie-rules (kind token) (pcase (cons kind token) (`(:elem . basic) sample-indent-basic) (`(,_ . ",") (smie-rule-separator kind)) (`(:after . ":=") sample-indent-basic) (`(:before . ,(or `"begin" `"(" `"{"))) (if (smie-rule-hanging-p) (smie-rule-parent))) (`(:before . "if") (and (not (smie-rule-bolp)) (smie-rule-prev-p "else") (smie-rule-parent)))))
注意すべき点がいくつかあります:
sample-indent-basic
がnil
の場合、SMIEはグローバルセッティングsmie-indent-basic
を使用する。メジャーモードがかわりにsmie-indent-basic
をバッファーローカルにセットするかもしれないが、これは勧められない。
","
にたいするルールにより、カンマセパレーターが行頭にある場合に、SMIEをより賢明に振る舞わせようとしている。これはセパレーターのインデントを解除(outdent)、カンマの後のコードにアラインされるよう試みる。たとえば:
x = longfunctionname ( arg1 , arg2 );
":="
の後のインデントのルールは、そうしなければSMIEが":="
を2項演算子として扱い、左の引数に併せて右の引数をアラインするであろうから、このルールが存在する。
"begin"
の前のインデントのルールは、バーチャルインデントの使用例である。このルールは"begin"
がhangingのときだけ使用され、これは"begin"
が行頭にないときのみ発生し得る。そのため、これは"begin"
自体のインデントには使用されないが、この"begin"
に関連する何かをインデントするときだけ使用される。このルールは、具体的には以下のフォームを:
if x > 0 then begin dosomething(x); end
以下に変更する
if x > 0 then begin dosomething(x); end
"if"
の前のインデントのルールは"begin"
のインデントルールと似ているが、ここでの目的は"else
if"
を1単位として扱うことにあり、それにより各テストより右にインデントされずに、一連のテストにアラインされる。この関数はsmie-rule-bolp
をテストして、"if"
が別の行にないときだけこれを行う。
"else"
が、それの属する"if"
にたいして常にアラインされ、かつそれが常に行頭であるることが判っている場合は、より効果的なルールを使用できる:
((equal token "if") (and (not (smie-rule-bolp)) (smie-rule-prev-p "else") (save-excursion (sample-smie-backward-token) (cons 'column (current-column)))))
この式の利点は、これがシーケンスの最初の"if"
まで戻ってすべてをやり直すのではなく、前の"else"
のインデントを再利用することである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SMIEにより提供されるインデントを使用するモードを使っている場合は、好みに合わせてインデントをカスタマイズできます。これはモードごと(オプションsmie-config
を使用)、またはファイルごと(ファイルローカル変数指定内で関数smie-config-local
を使用)に行うことができます。
このオプションにより、モードごとにインデントをカスタマイズできる。これは(mode
.
rules)
という形式の要素をもつalistである。rulesの正確な形式については、変数のドキュメントを参照のこと。しかし、コマンドsmie-config-guess
を使用したほうが、より簡単に見つけられるかもしれない。
このコマンドは、好みのスタイルのインデントを生成する、適切セッティングの解決を試みる。あなたのスタイルでインデントされたファイルをvisitしているときに、単にこのコマンドを呼び出せばよい。
smie-config-guess
を使用した後にこのコマンドを呼び出すと、将来のセッション用にセッティングを保存する。
このコマンドは、カレント行のインデントに使用されているルールを表示する。
このコマンドは、カレント行のインデントに合わせて、ローカルルールを追加する。
この関数は、カレントバッファーにたいするインデントルールとして、rulesを追加する。これらのルールは、smie-config
オプションにより定義された、任意のモード固有ルールに追加される。特定のファイルにたいしてカスタムインデントルールを指定するには、eval:
(smie-config-local '(rules))
の形式のエントリーを、そのファイルのローカル変数に追加する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Desktop Saveモードとは、あるセッションから別のセッションへ、Emacs状態を保存する機能です。Desktop Saveモードの使用に関するユーザーレベルのコマンドについては、GNU Emacsマニュアルに記載されています(Saving Emacs Sessions in the GNU Emacs Manualを参照)。バッファーでファイルをvisitしているモードでは、この機能を使うために何も行う必要はありません。
ファイルをvisitしていないバッファーについて状態を保存するには、そのメジャーモードがバッファーローカル変数desktop-save-buffer
を非nil
値にバインドしなければなりません。
このバッファーローカル変数が非nil
の場合は、デスクトップ保存時にそのバッファー状態がdesktopファイルに保存される。値が関数の場合、その関数はデスクトップ保存時に引数desktop-dirnameで呼び出され、関数が呼び出されたバッファーの状態とともに、関数の値がdesktopファイルに保存される。補助的な情報の一部としてファイル名がリターンされたとき、それらは以下を呼び出してフォーマットされるべきである
(desktop-file-name file-name desktop-dirname)
ファイルをvisitしていないバッファーがリストアされるようにするには、その初を行う関数をメジャーモードが定義しなければならず、その関数はalist
desktop-buffer-mode-handlers
にリストされなければならない。
以下を要素にもつalistである
(major-mode . restore-buffer-function)
関数restore-buffer-functionは、以下の引数リストで呼び出されるだろう
(buffer-file-name buffer-name desktop-buffer-misc)
この関数は、リストアされたバッファーをリターンすべきである。ここで、desktop-buffer-miscは、オプションでdesktop-save-buffer
にバインドされる関数によりリターンされる値である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacsには便利なビルトインのヘルプ機能があり、それらのほとんどは、関数や変数のドキュメント文字列に付属するドキュメント文字列の情報が由来です。このチャプターでは、Lispプログラムからドキュメント文字列にアクセスする方法について説明します。
ドキュメント文字列のコンテンツは、ある種の慣習にしたがうべきです。特に、最初の行は、その関数または変数を簡単に説明する1つ、または2つの完全なセンテンスであるべきです。よいドキュメント文字列を記述する方法については、Tips for Documentation Stringsを参照してください。
Emacs向けのドキュメント文字列は、Emacsマニュアルと同じものではないことに注意してください。マニュアルは、Texinfo言語で記述された独自のソースファイルをもちます。それにたいしドキュメント文字列は、それが適用される関数および変数の定義内で指定されます。ドキュメント文字列をコレクションしても、それはマニュアルとしては不十分です。なぜなら、よいマニュアルとは、そのやり方でまとめられたものではなく、議論のトピックという観点によりまとめられているからです。
ドキュメント文字列を表示するコマンドについては、Help in The GNU Emacs Manualを参照してください。
23.1 Documentation Basics | ドキュメント文字列が定義、格納される場所。 | |
23.2 Access to Documentation Strings | Lispプログラムがドキュメント文字列にアクセスする方法。 | |
23.3 Substituting Key Bindings in Documentation | カレントキーバインディングの置き換え。 | |
23.4 Describing Characters for Help Messages | 非プリント文字やキーシーケンスをプリント可能な記述にする。 | |
23.5 Help Functions | Emacsヘルプ機能により使用されるサブルーチン。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ドキュメント文字列は、テキストをダブルクォート文字で囲んだ、文字列にたいするLisp構文を使用して記述されます。実はこれは実際のLisp文字列です。関数または変数の定義内の適切な箇所に文字列があると、それは関数または変数のドキュメントの役割を果たします。
関数定義(lambda
やdefun
フォーム)の中では、ドキュメント文字列は引数リストの後に指定され、通常は関数オブジェクト内に直接格納されます。Documentation Strings of Functionsを参照してください。関数名のfunction-documentation
プロパティに関数ドキュメントをputすることもできます(Access to Documentation Stringsを参照)。
変数定義(defvar
フォーム)の中では、ドキュメント文字列は初期値の後に指定されます。Defining Global Variablesを参照してください。この文字列は、その変数のvariable-documentation
プロパティに格納されます。
Emacsがメモリー内にドキュメント文字列を保持しないときがあります。それには、2つの状況があります。1つ目はメモリーを節約するためで、事前ロードされた関数および変数(プリミティブを含む)のドキュメントは、doc-directory
で指定されたディレクトリー内の、DOCという名前のファイルに保持されます(Access to Documentation Stringsを参照)。2つ目は関数または変数がバイトコンパイルされたファイルからロードされたときで、Emacsはそれらのドキュメント文字列のロードを無効にします(Documentation Strings and Compilationを参照)。どちらの場合も、ある関数にたいしてユーザーがC-h
f(describe-function
)を呼び出したときなど、Emacsは必要なときだけファイルのドキュメント文字列を照会します。
ドキュメント文字列には、ユーザーがドキュメントを閲覧するときのみ照会されるキーバインディングを参照する、特別なキー置換シーケンス(key substitution sequences)を含めることができます。これにより、たとえユーザーがデフォルトのキーバインディングを変更していても、ヘルプコマンドが正しいキーを表示できるようになります。
オートロードされたコマンド(Autoloadを参照)のドキュメント文字列では、これらのキー置換シーケンスは特別な効果をもち、そのコマンドにたいするC-h fにより、オートロードをトリガーします(これは*Help*バッファー内のハイパーリンクを正しくセットアップするために必要となる)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は、プロパティproperty配下のsymbolのプロパティリスト内に記録されたドキュメント文字列をリターンする。ほとんどの場合、これはpropertyをvariable-documentation
にして、変数のドキュメント文字列の照会に使用される。しかし、カスタマイゼーショングループのような、他の種類のドキュメント照会にも使用できる(が、関数のドキュメントには、以下のdocumentation
関数を使用する)。
そのプロパティの値がDOCファイルやバイトコンパイル済みファイルに格納されたドキュメント文字列を参照する場合、この関数はその文字列を照会して、それをリターンする。
プロパティの値がnil
や文字列以外で、ファイル内のテキストも参照しない場合は、文字列を取得するLisp式として評価される。
最終的に、この関数はキーバインディングを置換するために、文字列をsubstitute-command-keys
に引き渡す(Substituting Key Bindings in Documentationを参照)。verbatimが非nil
の場合、このステップはスキップされる。
(documentation-property 'command-line-processed 'variable-documentation) ⇒ "Non-nil once command line has been processed"
(symbol-plist 'command-line-processed) ⇒ (variable-documentation 188902)
(documentation-property 'emacs 'group-documentation) ⇒ "Customization of the One True Editor."
この関数は、functionのドキュメント文字列をリターンする。この関数はマクロ、名前付きキーボードマクロ、およびスペシャルフォームも通常の関数と同様に処理する。
functionがシンボルの場合は、そのシンボルのfunction-documentation
プロパティを最初に調べる。それが非nil
値をもつなら、その値(プロパティの値が文字列以外の場合は、それを評価した値)がドキュメントとなる。
functionがシンボル以外、あるいはfunction-documentation
プロパティをもたない場合、documentation
は必要ならファイルを読み込んで、実際の関数定義のドキュメント文字列を抽出する。
最後に、verbatimがnil
なら、この関数はsubstitute-command-keys
を呼び出す。結果はリターンするための文字列である。
documentation
関数は、functionが関数定義をもたない場合は、void-function
エラーをシグナルする。しかし、関数定義がドキュメントをもたない場合は問題ない。その場合、documentation
はnil
をリターンする。
この関数は、faceのドキュメント文字列をフェイスとしてリターンする。
以下は、documentation
とdocumentation-property
を使用した例で、いくつかのシンボルのドキュメント文字列を*Help*バッファー内に表示します。
(defun describe-symbols (pattern) "PATTERNにマッチするEmacs Lispシンボルを説明する。 名前にPATTERNをもつすべてのシンボルの説明が `*Help*'バッファーに表示される。" (interactive "sDescribe symbols matching: ") (let ((describe-func (function (lambda (s)
;; シンボルの説明をプリントする (if (fboundp s) ; これは関数 (princ (format "%s\t%s\n%s\n\n" s (if (commandp s) (let ((keys (where-is-internal s))) (if keys (concat "Keys: " (mapconcat 'key-description keys " ")) "Keys: none")) "Function")
(or (documentation s)
"not documented"))))
(if (boundp s) ; これは変数
(princ (format "%s\t%s\n%s\n\n" s (if (custom-variable-p s) "Option " "Variable")
(or (documentation-property s 'variable-documentation) "not documented"))))))) sym-list)
;; PATTERNにマッチするシンボルのリストを構築
(mapatoms (function
(lambda (sym)
(if (string-match pattern (symbol-name sym))
(setq sym-list (cons sym sym-list))))))
;; データを表示
(help-setup-xref (list 'describe-symbols pattern) (interactive-p))
(with-help-window (help-buffer)
(mapcar describe-func (sort sym-list 'string<)))))
describe-symbols
関数はapropos
のように機能しますが、より多くの情報を提供します。
(describe-symbols "goal") ---------- Buffer: *Help* ---------- goal-column Option Semipermanent goal column for vertical motion, as set by …
set-goal-column Keys: C-x C-n Set the current horizontal position as a goal for C-n and C-p.
Those commands will move to this position in the line moved to rather than trying to keep the same horizontal position. With a non-nil argument, clears out the goal column so that C-n and C-p resume vertical motion. The goal column is stored in the variable `goal-column'.
temporary-goal-column Variable Current goal column for vertical motion. It is the column where point was at the start of current run of vertical motion commands. When the `track-eol' feature is doing its job, the value is 9999. ---------- Buffer: *Help* ----------
この関数は、Emacsビルド時の実行可能なEmacsダンプ直前に使用される。これは、ファイルfilename内に格納されたドキュメント文字列の位置を探して、メモリー上の関数定義および変数のプロパティリスト内にそれらの位置を記録する。Building Emacsを参照のこと。
Emacsは、emacs/etcディレクトリーから、ファイルfilenameを読み込む。その後、ダンプされたEmacs実行時に、ディレクトリーdoc-directory
内の同じファイルを照会する。filenameは通常"DOC"
である。
この変数は、ビルトインおよび事前ロードされた関数および変数のドキュメント文字列を含む、ファイル"DOC"
があるべきディレクトリーの名前を保持する。
ほとんどの場合、これはdata-directory
と同一である。実際にインストールしたEmacsではなく、EmacswpeyビルドしたディレクトリーからEmacsを実行したときは、異なるかもしれない。Definition of data-directoryを参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ドキュメント文字列がキーシーケンスを参照する際、それらはカレントである実際のキーバインディングを使用するべきです。これらは、以下で説明する特別なキーシーケンスを使用して行うことができます。通常の方法によるドキュメント文字列へのアクセスは、これらの特別なキーシーケンスをカレントキーバインディングに置き換えます。これは、substitute-command-keys
を呼び出すことにより行われます。あなた自身がこの関数を呼び出すこともできます。
以下は、それら特別なシーケンスと、その意味についてのリストです:
\[command]
これは、commandを呼び出すキーシーケンス、またはcommandがキーバインディングをもたない場合は‘M-x command’である。
\{mapvar}
これは、変数mapvarの値であるようなキーマップの要約を意味する。この要約は、describe-bindings
を用いて作成される。
\<mapvar>
これ自体は、何のテキストも意味せず、副作用のためだけに使用される。これは、このドキュメント文字列内にある、後続のすべての‘\[command]’にたいするキーマップとして、mapvarの値を指定する。
\=
これは、後続の文字をクォートして、無効にする。したがって、‘\=\[’は‘\[’、‘\=\=’は‘\=’を出力に配する。
注意してください: Emacs Lisp内の文字列として記述する際は、‘\’を2つ記述しなければなりません。
この関数は、上述の特別なシーケンスをstringからスキャンして、それらが意味するもので置き換え、その結果を文字列としてリターンする。これにより、そのユーザー自身がカスタマイズした、実際のキーシーケンスを参照するドキュメントが表示できる。
あるコマンドが複数のバインディングをもつ場合、通常この関数は最初に見つかったバインディングを使用する。以下のようにして、コマンドのシンボルプロパティ:advertised-binding
に割り当てることにより、特定のキーバインディングを指定できる:
(put 'undo :advertised-binding [?\C-/])
:advertised-binding
プロパティは、メニューアイテム(The Menu Barを参照)に表示されるバインディングにも影響する。コマンドが実際にもたないキーバインディングを指定した場合、このプロパティは無視される。
以下は、特別なキーシーケンスの例である:
(substitute-command-keys "再帰編集者abortするには、次をタイプする: \\[abort-recursive-edit]") ⇒ "再帰編集者abortするには、次をタイプする: C-]"
(substitute-command-keys "ミニバッファーにたいして定義されたキーは: \\{minibuffer-local-must-match-map}") ⇒ "ミニバッファーにたいして定義されたキーは:
? minibuffer-completion-help SPC minibuffer-complete-word TAB minibuffer-complete C-j minibuffer-complete-and-exit RET minibuffer-complete-and-exit C-g abort-recursive-edit "
(substitute-command-keys "ミニバッファーにたいして再帰編集をabortするには、次をタイプ: \\<minibuffer-local-must-match-map>\\[abort-recursive-edit].") ⇒ "ミニバッファーにたいして再帰編集をabortするには、次をタイプ: C-g."
ドキュメント文字列内のテキストにたいしては、他にも特別な慣習があります。たとえば、このマニュアルの関数、変数、およびセクションで参照できます。詳細はTips for Documentation Stringsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数はイベント、キーシーケンス、文字をテキスト表記(textual descriptions)に変換します。これらの変換された表記は、メッセージ内に任意のテキスト文字やキーシーケンスを含める場合に有用です。なぜなら非プリント文字や空白文字は、プリント文字シーケンスに変換されるからです。空白文字以外のプリント文字は、その文字自身が表記になります。
この関数は、sequence内の入力イベントにたいして、Emacsの標準表記を含む文字列をリターンする。prefixが非nil
の場合、それはsequenceに前置される入力イベントシーケンスであり、リターン値にも含まれる。引数はどちらも文字列、ベクター、またはリストかもしれない。有効なイベントに関する詳細は、Input Eventsを参照のこと。
(key-description [?\M-3 delete]) ⇒ "M-3 <delete>"
(key-description [delete] "\M-3") ⇒ "M-3 <delete>"
以下のsingle-key-description
の例も参照されたい。
この関数は、キーボード入力にたいするEmacsの標準表記として、eventを表記する文字列をリターンする。通常のプリント文字はその文字自身で表れるが、コントロール文字は‘C-’で始まる文字列、メタ文字は‘M-’で始まる文字列、スペース、タブなどは‘SPC’や‘TAB’のように変換される。ファンクションキーのシンボルは、‘<…>’のように角カッコ(angle brackets)の内側に表れる。リストであるようなイベントは、そのリストのCAR内のシンボル名が、角カッコの内側に表れる。
オプション引数no-anglesが非nil
の場合、ファンクションキーおよびイベントシンボルを括る角カッコは省略される。これは、角カッコを使用しない古いバージョンのEmacsとの互換性のためである。
(single-key-description ?\C-x) ⇒ "C-x"
(key-description "\C-x \M-y \n \t \r \f123") ⇒ "C-x SPC M-y SPC C-j SPC TAB SPC RET SPC C-l 1 2 3"
(single-key-description 'delete) ⇒ "<delete>"
(single-key-description 'C-mouse-1) ⇒ "<C-mouse-1>"
(single-key-description 'C-mouse-1 t) ⇒ "C-mouse-1"
この関数は、テキスト内に出現する文字にたいするEmacsの標準表記として、characterを表記する文字列をリターンする。これはsingle-key-description
と似ているが、コントロール文字にカレットが前置されて表される点が異なる(これはEmacsバッファー内でコントロール文字を表示する通常の方法である)。他にも、single-key-description
が2**27ビットをメタ文字とするのにたいし、text-char-description
は2**7ビットをメタ文字とする点が異なる。
(text-char-description ?\C-c) ⇒ "^C"
(text-char-description ?\M-m) ⇒ "\xed"
(text-char-description ?\C-\M-m) ⇒ "\x8d"
(text-char-description (+ 128 ?m)) ⇒ "M-m"
(text-char-description (+ 128 ?\C-m)) ⇒ "M-^M"
この関数は主にキーボードマクロを操作するために使用されるが、key-description
の大雑把な意味で逆の処理にも使用できる。キー表記を含むスペース区切りの文字列でこれを呼び出すと、それに対応するイベントを含む文字列、またはベクターをリターンする。(これは単一の有効なキーシーケンスであるか否かは問わず、何のイベントを使用するかに依存する。Key Sequencesを参照されたい。) need-vectorが非nil
の場合、リターン値は常にベクターになる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsは、さまざまなビルトインのヘルプ関数を提供し、それらはすべてプレフィックスC-hのサブコマンドとして、ユーザーがアクセスできます。それらについての詳細は、Help in The GNU Emacs Manualを参照してください。ここでは、同様な情報についてプログラムレベルのインターフェイスを説明します。
この関数は、名前にaproposパターン(apropos pattern: 適切なパターン) patternを含む、“重要”なすべてのシンボルを探す。マッチに使用されるaproposパターンは単語、最低2つはマッチしなければならないスペース区切りの単語、または(特別な正規表現文字があれば)正規表現のいずれかである。あるシンボルが関数、変数、フェイスとしての定義、あるいはプロパティをもつ場合、そのシンボルは“重要”とされる。
関数は、以下のような要素のリストをリターンする:
(symbol score function-doc variable-doc plist-doc widget-doc face-doc group-doc)
ここで、scoreはマッチの面からそのシンボルがどれだけ重要に見えるかを比較する整数である。残りの各要素は、symbolにたいする関数、変数、...等のドキュメント文字列(またはnil
)である。
これは*Apropos*という名前のバッファーにもシンボルを表示し、その際各行にはドキュメント文字列の先頭から取得した1行説明とともに表示される。
do-allが非nil
、またはユーザーオプションapropos-do-all
が非nil
の場合、apropos
は見つかった関数のキーバインディングも表示する。これは重要なものだけでなく、のinternされたすべてのシンボルも表示する(同様にリターン値としてもそれらをリストする)。
この変数の値は、HelpキーC-hに続く文字にたいするローカルキーマップである。
このシンボルは関数ではなく、関数定義セルにはhelp-map
として知られる、キーマップを保持する。これは、help.el内で以下のように定義されている:
(define-key global-map (string help-char) 'help-command) (fset 'help-command help-map)
この変数の値は、ヘルプ文字(help character:
Helpを意味する文字としてEmacsが認識する文字)である。デフォルトでは、C-hを意味する8が値である。この文字を読み取った際、help-form
が非nil
のLisp式ならば、Emacsはその式を評価して、結果が文字列の場合はウィンドウ内にそれを表示する。
通常、help-form
の値はnil
である。その場合、ヘルプ文字はコマンド入力のレベルにおいて特別な意味を有せず、通常の方法におけるキーシーケンスの一部となる。C-hの標準的なキーバインディングは、複数の汎用目的をもつヘルプ機能のプレフィックスキーである。
ヘルプ文字は、プレフィックスキーの後でも特別な意味をもつ。ヘルプ文字がプレフィックスキーのサブコマンドとしてバインディングをもたない場合は、そのプレフィックスキーのすべてのサブコマンドのリストを表示する、describe-prefix-bindings
を実行する。
この変数の値は、“ヘルプ文字”の代役を果たすイベント型のリストである。これらのイベントは、help-char
で指定されるイベントと同様に処理される。
この変数が非nil
の場合、その値は文字help-char
が読み取られるたびに評価されるフォームである。そのフォームの評価により文字列が生成された場合は、その文字列が表示される。
read-event
、read-char-choice
、read-char
を呼び出すコマンドは、それが入力を行う間は、恐らくhelp-form
を非nil
にバインドすべきであろう(C-hが他の意味をもつ場合は、これを行うべきではない)。この式を評価した結果は、何にたいする入力なのか、そしてそれを正しくエンターする方法を説明する文字列であること。
ミニバッファーへのエントリーにより、この変数はminibuffer-help-form
の値にバインドされる(Definition of minibuffer-help-formを参照)。
この変数は、プレフィックスキーにたいするヘルプをプリントする関数を保持する。その関数は、ユーザーが後にヘルプ文字を伴うプレフィックスキーをタイプし、そのヘルプ文字がプレフィックスの後のバインディングをもたないたときに呼び出される。この変数のデフォルト値はdescribe-prefix-bindings
である。
この関数は、もっとも最近のプレフィックスキーのサブコマンドすべてにたいするリストを表示する。プレフィックスの説明は、そのキーシーケンスの最後のイベントを除くすべてから構成される(最後のイベントは、恐らくヘルプ文字であろう)。
以下の2つの関数は、“electric”モードのように制御を放棄することなくヘルプを提供したいモードを意図しています。これらは、通常のヘルプ関数と区別するため、名前が‘Helper’で始まります。
このコマンドは、ローカルキーマップとグローバルキーマップの両方のキーバインディングすべてのリストを含むヘルプバッファーを表示するウィンドウをポップアップする。これはdescribe-bindings
を呼び出すことにより機能する。
このコマンドは、カレントモードにたいするヘルプを提供する。これはミニバッファー内でメッセージ‘Help (Type ? for further
options)’とともにユーザーに入力を求め、その後キーバインディングが何か、何を意図するモードなのかを探すための助けを提供する。これはnil
をリターンする。
これは、マップHelper-help-map
を変更することによりカスタマイズできる。
この変数は、Emacsに付随する特定のドキュメントおよびテキストファイルを探すディレクトリーの名前を保持する。
この関数は、ヘルプバッファーの名前(通常は*Help*)をリターンする。そのようなバッファーが存在しない場合は、最初にそれを作成する。
このマクロは、with-output-to-temp-buffer
(Temporary Displaysを参照)のようにbodyを評価して、そのフォームが生成したすべての出力を、buffer-nameという名前のバッファーに挿入する(buffer-nameは、通常は関数help-buffer
によりリターンされる値であるべきだろう)。これは、指定されたバッファーをHelpモードに置き、ヘルプウィンドウをquit、およびスクロールする方法を告げるメッセージを表示する。これは、ユーザーオプションhelp-window-select
のカレント値が適切にセットされていれば、ヘルプウィンドウの選択も行う。これはbody内の最後の値をリターンする。
この関数は、*Help*バッファー内のクロスリファレンスデータを更新する。このクロスリファレンスは、ユーザーが‘Back’ボタンまたは‘Forward’ボタン上でクリックした際に、ヘルプ情報の再生成に使用される。*Help*バッファーを使用するほとんどのコマンドは、バッファーをクリアーする前に、この関数を呼び出すべきである。item引数は、(function
.
args)
という形式であること。ここで、functionは引数リストargsで呼び出されるヘルプバッファーを再生成する関数である。コマンド呼び出しがinteractiveに行われた場合、interactive-p引数は非nil
である。この場合、*Help*バッファーの‘Back’ボタンにたいするitemのスタックはクリアーされる。
help-buffer
、with-help-window
、help-setup-xref
の使用例は、describe-symbols exampleを参照してください。
このマクロは、提供するサブコマンドのリストを表示するプレフィックスキーのように振る舞う、fnameという名前のヘルプコマンドを定義する。
呼び出された際、fnameはウィンドウ内にhelp-textを表示してから、help-mapに応じてキーシーケンスの読み取りと実行を行う。文字列help-textは、help-map内で利用可能なバインディングを説明すべきである。
コマンドfnameは、help-textの表示をスクロールすることによる、自身のいくつかのイベントを処理するために定義される。fnameがこれらのスペシャルイベントのいずれかを読み取った際は、スクロールを行った後で他のイベントを読み取る。自身が処理する以外のイベントを読み取り、そのイベントがhelp-map内にバインディングを有す際は、そのキーのバインディングを実行した後リターンする。
引数help-lineは、help-map内の候補の1行要約であること。Emacsのカレントバージョンでは、オプションthree-step-help
をt
にセットした場合のみ、この引数が使用される。
このマクロは、C-h C-hにバインドされるコマンドhelp-for-help
内で使用される。
この変数が非nil
の場合、make-help-screen
で定義されたコマンドは、最初にエコーエリア内に自身のhelp-line文字列を表示し、ユーザーが再度ヘルプ文字をタイプした場合のみ、長いhelp-text文字列を表示する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このチャプターでは検索、作成、閲覧、保存、その他ファイルとディレクトリーにたいして機能する、Emacs Lispの関数および変数について説明します。その他のいくつかのファイルに関する関数についてはBuffers、バックアップとauto-save(自動保存)に関する関数についてはBackups and Auto-Savingで説明されています。
ファイル関数の多くは、ファイル名であるような引数を1つ以上とります。このファイル名は文字列です。これらの関数のほとんどは、関数expand-file-name
を使用してファイル名引数を展開するので、~は相対ファイル名(../を含む)として正しく処理されます。Functions that Expand Filenamesを参照してください。
加えて、特定のmagicファイル名は特別に扱われます。たとえば、リモートファイル名が指定された際、Emacsは適切なプロトコルを通じて、ネットワーク越しにファイルにアクセスします。Remote Files in The GNU Emacs Manualを参照してください。この処理は非常に低いレベルで行われるので、注記されたものを除き、このチャプターで説明するすべての関数が、ファイル名引数としてmagicファイル名を受け入れると想定しても良いでしょう。詳細は、See section Making Certain File Names “Magic”を参照してください。
ファイルI/O関数がLispエラーをシグナルする際、通常はコンディションfile-error
を使用します(Writing Code to Handle Errorsを参照)。ほとんどの場合、オペレーティングシステムからロケールsystem-messages-locale
に応じたエラーメッセージが取得され、コーディングシステムlocale-coding-system
を使用してデコードされます(Localesを参照)。
24.1 Visiting Files | 編集のためにEmacsバッファーにファイルを読み込む。 | |
24.2 Saving Buffers | 変更されたバッファーをファイルに書き戻す。 | |
24.3 Reading from Files | ファイルをvisitせずにバッファーに読み込む。 | |
24.4 Writing to Files | バッファーの一部から新たなファイルに書き込む。 | |
24.5 File Locks | 複数名による同時編集を防ぐためにファイルをlockまたはunlockする。 | |
24.6 Information about Files | ファイルの存在、アクセス権、サイズのテスト。 | |
24.7 Changing File Names and Attributes | ファイル名のリネームやパーミッションの変更など。 | |
24.8 File Names | ファイル名の分解と展開。 | |
24.9 Contents of Directories | ディレクトリーないのファイルリストの取得。 | |
24.10 Creating, Copying and Deleting Directories | ディレクトリーの作成と削除。 | |
24.11 Making Certain File Names “Magic” | 特定のファイル名にたいする特別な処理。 | |
24.12 File Format Conversion | さまざまなファイルフォーマットへ/からの変換。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルのvisitとは、ファイルをバッファーに読み込むことを意味します。一度これを行うと、わたしたちはバッファーがファイルをvisit(訪問)していると言い、ファイルのことをバッファーの“visit”されたファイルと呼んでいます。
ファイルとバッファーは、2つの異なる事柄です。ファイルとは、(削除しない限り)コンピューター内に永続的に記録された情報です。一方バッファーとは、編集セッションの終了(またはバッファーのkill)とともに消滅する、Emacs内部の情報です。あるバッファーがファイルをvistしているとき、バッファーぬはファイルからコピーされた情報が含まれます。編集コマンドにより変更されるのは、バッファー内のコピーです。バッファーへの変更によりファイルは変更されません。その変更を永続化させるには、バッファーを保存(save)しなければなりません。これは変更されたバッファーのコンテンツをファイルにコピーして戻すことを意味します。
ファイルとバッファーは異なるにも関わらず、人はバッファーという意味でファイルを呼んだり、その逆を行うことが多々あります。実際のところ、“わたしは間もなく同じ名前のファイルに保存するバッファーを編集している”ではなく、“わたしはファイルを編集している”と言います。人間がこの違いを明示する必要は、通常はありません。しかし、コンピュータープログラムに対処する際は、この違いを心に留めておくのが良いでしょう。
24.1.1 Functions for Visiting Files | visit用の通常のインターフェイス関数。 | |
24.1.2 Subroutines of Visiting | 通常のvisit関数が使用する低レベルのサブルーチン。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ファイルのvisitに通常使用される関数を説明します。歴史的な理由により、これらの関数は‘visit-’ではなく、‘find-’で始まる名前をもちます。バッファーをvisitしているファイルの名前へのアクセスや、visitされたファイル名から既存のバッファーを見つける関数および変数については、Buffer File Nameを参照してください。
Lispプログラム内では、ファイル内容を見たいものの変更したくない場合はテンポラリーバッファー(temporary buffer:
一時的なバッファー)でinsert-file-contents
を使用例するのが、もっとも高速な方法です。時間を要するファイルのvisitは必要ありません。Reading from Filesを参照してください。
このコマンドは、ファイルfilenameをvisitしているバッファーを選択する。visitしている既存のバッファーがあればそのバッファーを使用し、なければバッファーを新たに作成して、そのバッファーにファイルを読み込む。これはそのバッファーをリターンする。
技術的な詳細を別とすると、find-file
関数のbodyは基本的には以下と等価である:
(switch-to-buffer (find-file-noselect filename nil nil wildcards))
(Switching to a Buffer in a Windowのswitch-to-buffer
を参照されたい。)
wildcardsが非nil
(これはinteractiveに呼び出された場合は常にtrueである)の場合、find-file
はfilename内のワイルドカード文字を展開して、マッチするすべてのファイルをvisitする。
find-file
がinteractiveに呼び出された際は、ミニバッファー内でfilenameの入力を求める。
このコマンドは、find-file
が行うようにfilenameをvisitするが、フォーマット変換(File Format Conversionを参照)、文字コード変換(Coding Systemsを参照)、EOL変換(End of line
conversionを参照)を何も行わない。ファイルをvisitしているバッファーはunibyteになり、ファイル名とは無関係にバッファーのメジャーモードはFundamentalモードになる。ファイル内で指定されたファイルローカル変数(File Local Variablesを参照)は無視され、自動的な解凍とrequire-final-newline
によるファイル終端への改行追加(require-final-newlineを参照)も無効になる。
Emacsがすでにリテラリー(literally:
文字通り、そのまま)でない方法で同じファイルをvisitしているバッファーをもつ場合、Emacsはその同じファイルをリテラリーにvisitせず、単に既存のバッファーに切り替わることに注意されたい。あるファイルのコンテンツにたいして、確実にリテラリーにアクセスしたい場合は、テンポラリーバッファーを作成し、insert-file-contents-literally
を使用してファイルのコンテンツを読み込むべきである(Reading from Filesを参照)。
この関数は、ファイルをvisitするすべての関数の要である。これは、ファイルfilenameをvisitしているバッファーをリターンする。望むならそのバッファーをカレントにしたり、あるウィンドウ内に表示することができるだろうが、この関数はそれを行わない。
関数は、既存のバッファーがあればそれをリターンし、なければ新たにバッファーを作成し、それにファイルを読み込む。find-file-noselect
が既存のバッファーを使用する際は、まずファイルがそのバッファーに最後にvisit、または保存したときから変更されていないことを検証する。ファイルが変更されている場合、この関数は変更されたファイルを再読み込みするかどうかをユーザーに尋ねる。ユーザーが‘yes’と応えた場合、以前に行われたそのバッファー内での編集は失われる。
ファイルの読み込みは、EOL変換、フォーマット変換(File Format Conversionを参照)を含む、ファイルコンテンツのデコードを要する(Coding Systemsを参照)。wildcardsが非nil
の場合、find-file-noselect
はfilename内のワイルドカード文字を展開して、マッチするすべてのファイルをvisitする。
この関数は、オプション引数nowarnがnil
の場合は、さまざまな特殊ケースにおいて、警告メッセージ(warning
message)、および注意メッセージ(advisory
message)を表示する。たとえば、関数がバッファーの作成を必要とし、かつfilenameという名前のファイルが存在しない場合は、エコーエリア内にメッセージ‘(New
file)’を表示して、そのバッファーを空のままに留める。
find-file-noselect
関数は通常、ファイルを読み込んだ後にafter-find-file
を呼び出す(Subroutines of Visitingを参照)。この関数はバッファーのメジャーモードのセット、ローカル変数のパース、正にvisitしたファイルより新しいauto-saveファイルが存在する場合のユーザーへの警告を行い、find-file-hook
内の関数を実行することにより終了する。
オプション引数rawfileが非nil
の場合、after-find-file
は呼び出されず、失敗時にfind-file-not-found-functions
は呼び出されない。さらに、非nil
値のrawfileは、コーディングシステム変換およびフォーマット変換を抑制する。
find-file-noselect
関数は、通常はファイルfilenameをvisitしているバッファーをリターンする。しかし、ワイルドカードが実際に使用、展開された場合は、それらのファイルをvisitしているバッファーのリストをリターンする。
(find-file-noselect "/etc/fstab") ⇒ #<buffer fstab>
このコマンドは、ファイルfilenameをvisitしているバッファーを選択するが、選択されたウィンドウではない他のウィンドウでこれを行う。これは、別の既存ウィンドウを使用したり、ウィンドウを分割するかもしれない。Switching to a Buffer in a Windowlを参照のこと。
このコマンドがinteractiveに呼び出された際は、filenameの入力を求める。
このコマンドは、find-file
のようにファイルfilenameをvisitしているバッファーを選択するが、そのバッファーを読み取り専用(read-only)とマークする。関連する関数および変数については、Read-Only Buffersを参照のこと。
このコマンドがinteractiveに呼び出された際は、filenameの入力を求める。
この変数が非nil
の場合、各種find-file
コマンドはワイルドカード文字をチェックして、それらにマッチするすべてのファイルをvisitする(interactiveに呼び出されたとき、またはwildcards引数が非nil
のとき)。このオプションがnil
の場合、find-file
コマンドはそれらのwildcards引数を無視して、ワイルドカード文字を特別に扱うことは決してない。
この変数の値は、ファイルがvisitされた後に呼び出される、関数のリストである。ファイルのローカル変数指定は、(もしあれば)このフックが実行される前に処理されるだろう。フック関数実行時は、そのファイルをvisitしているバッファーがカレントになる。
この変数はノーマルフックである。Hooksを参照のこと。
この変数の値は、find-file
またはfind-file-noselect
が存在しないファイル名を受け取った際に呼び出される、関数のリストである。存在しないファイルを検知すると、find-file-noselect
は直ちにこれらの関数を呼び出す。これらのうち、いずれかが非nil
をリターンするまで、リストの順に関数を呼び出す。buffer-file-name
はすでにセットアップ済みである。
関数の値が使用され、多くの場合いくつかの関数だけが呼び出されるので、これはノーマルフックではない。
このバッファーローカル変数が非nil
値にセットされた場合、save-buffer
はあたかもそのバッファーがリテラリー、つまり何の変換も行わずにファイルをvisitしていたかのように振る舞う。コマンドfind-file-literally
は、この変数のローカル値をセットするが、その他の等価な関数およびコマンドも、たとえばファイル終端への改行の自動追加を避けるために、同様にこれを行うことができる。この変数は恒久的にローカルなので、メジャーモードの変更により影響を受けない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
find-file-noselect
関数は、2つの重要なサブルーチンcreate-file-buffer
およびafter-find-file
を使用します。これらはユーザーのLispコードでも役に立つことがあります。このセクションでは、それらの使い方について説明します。
この関数は、filenameのvisitにたいして適切な名前のバッファーを作成して、それをリターンする。これはfilename(ディレクトリー含まず)の名前がフリーならバッファー名にそれを使用し、フリーでなければ未使用の名前を取得するために‘<2>’のような文字列を付加する。Creating Buffersも参照のこと。uniquifyライブラリーは、この関数の結果に影響を与えることに注意されたい。Uniquify in The GNU Emacs Manualを参照のこと。
注意してください:
create-file-buffer
はファイルに新たなバッファーを関連付けません。バッファーの選択もせず、さらにデフォルトのメジャーモードも使用しません。
(create-file-buffer "foo") ⇒ #<buffer foo>
(create-file-buffer "foo") ⇒ #<buffer foo<2>>
(create-file-buffer "foo") ⇒ #<buffer foo<3>>
この関数は、find-file-noselect
により使用される。この関数自身はgenerate-new-buffer
を使用する(Creating Buffersを参照)。
この関数は、バッファーのメジャーモードをセットして、ローカル変数をパースする(How Emacs Chooses a Major Modeを参照)。これはfind-file-noselect
、およびデフォルトのリバート関数(Revertingを参照)により呼び出される。
ファイルが存在しない理由によりファイルの読み込みがエラーを受け取るが、ディレクトリーは存在する場合、呼び出し側はerrorにたいして非nil
値を綿すべきである。この場合、after-find-file
は警告‘(New
file)’を発する。より深刻なエラーにたいしては、呼び出し側は通常はafter-find-file
を呼び出すべきでない。
warnが非nil
の場合、もしauto-saveファイルが存在し、かつそれがvisitされているファイルより新しいなら、この関数は警告を発する。
noautoが非nil
の場合、それはAuto-Saveモードを有効、または無効にしないことを告げる。以前にAuto-Saveモードが有効ならば、有効のまま留まる。
after-find-file-from-revert-bufferが非nil
の場合、それはこの関数がrevert-buffer
から呼び出されたことを意味する。これに直接的な効果はないが、モード関数およびフック関数の中には、この変数の値をチェックするものがいくつかある。
nomodesが非nil
の場合、それはバッファーのメジャーモードを変更せず、ファイル内のローカル変数指定を処理せず、find-file-hook
を実行しないことを意味する。この機能は、あるケースにおいてrevert-buffer
により使用される。
after-find-file
が最後に行うのは、リストfind-file-hook
内のすべての関数を呼び出すことである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs内でファイルを編集とき、実際にはそのファイルをvisitしているバッファーにたいして編集を行っています。つまり、ファイルのコンテンツをバッファーにコピーして、編集しているのはそのコピーなのです。そのバッファーにを変更しても、バッファーを保存(save)するまでファイルは変更されません。保存とは、バッファーのコンテンツをファイルにコピーすることを意味します。
この関数は、バッファーが最後にvisitされたとき、または保存されたときから変更されている場合は、カレントバッファーのコンテンツを、バッファーによりvisitされているファイルに保存し、変更されていなければ何も行わない。
save-buffer
は、バックアップファイルの作成に責任を負う。通常、backup-optionはnil
であり、save-buffer
はファイルをvisit以降、それが最初の保存の場合のみバックアップファイルを作成する。backup-optionにたいする他の値は、別の条件によるバックアップファイル作成を要求する:
save-buffer
はバッファーの次回保存時にこのバージョンのファイルがバックアップされるようマークする。
save-buffer
関数はそれを保存する前に、前バージョンのファイルを無条件にバックアップする。
このコマンドは、ファイルをvisitしている変更されたバッファーのいくつかを保存する。これは通常、各バッファーごとにユーザーに確認を求める。しかし、save-silently-pが非nil
の場合は、ユーザーに質問せずにファイルをvisitしているすべてのバッファーを保存する。
オプション引数predは、どのバッファーで確認を求めるか(またはsave-silently-pが非nil
の場合は、どのバッファーで確認せずに保存するか)を制御する。これがnil
の場合、それはファイルをvisitしているバッファーにたいしてのみ確認を求めることを意味する。t
の場合、それは、buffer-offer-save
のバッファーローカル値がnil
であるような、非ファイルバッファー以外の特定のバッファーの保存も提案することを意味する(Killing Buffersを参照)。ユーザーが、非ファイルバッファーの保存にたいして‘yes’と応えると、保存に使用するファイル名の指定を求める。save-buffers-kill-emacs
関数は、predにたいして値t
を渡す。
predがt
とnil
のどちらでもない場合、それは引数なしの関数であること。その関数は、そのバッファーの保存するを提案するか否かを決定するために、バッファーごとに呼び出されるだろう。これが特定のバッファーで非nil
値をリターンした場合は、バッファーの保存を提案することを意味する。
この関数は、カレントバッファーをファイルfilenameに書き込み、バッファーがそのファイルをvisitしていることにして、未変更とマークする。次にfilenameにもとづいてバッファー名をリネームする。バッファー名を一意にするため、必要なら‘<2>’のような文字列を付加する。処理のほとんどは、set-visited-file-name
(Buffer File Nameを参照)、およびsave-buffer
を呼び出すことにより行われる。
confirmが非nil
の場合、それは既存のファイルを上書きする前に確認を求めることを意味する。ユーザーがプレフィックス引数を与えない場合、interactiveに確認が求められる。
filenameが既存のディレクトリーであったり、既存のディレクトリーへのシンボリックリンクの場合、write-file
はディレクトリーfilename内でvisitされているファイルの名前を使用する。そのバッファーがファイルをvisitしていない場合は、かわりにバッファーの名前を使用する。
バッファーの保存により、複数のフックが実行される。これはフォーマット変換も処理する(File Format Conversionを参照)。
この変数の値は、バッファーをvisitされているファイルに書き出す前に呼び出される、関数のリストである。それらのうちのいずれかが非nil
をリターンした場合、そのファイルは書き込み済みだと判断され、残りの関数は呼び出されないし、ファイルを書き込むための通常のコードも実行されない。
write-file-functions
内の関数が非nil
をリターンした場合、(それが適切であれば)その関数はファイルをバックアップする責任を負う。これを行うには、以下のコードを実行する:
(or buffer-backed-up (backup-buffer))
backup-buffer
によりリターンされるファイルモードの値を保存して、(もし非nil
なら)書き込むファイルのモードビットをセットしたいと思うかもしれない。これは正にsave-buffer
が通常行うことである。Making Backup Filesを参照のこと。
write-file-functions
内のフック関数は、データのエンコード(が望ましければ)にも責任を負う。これらは適切なコーディングシステムと改行規則(Coding Systems in Lispを参照)を選択してエンコード(Explicit Encoding and Decodingを参照)を処理し、使用されていたコーディングシステム(Encoding and I/Oを参照)をlast-coding-system-used
にセットしなければならない。
バッファー内でこのフックをローカルにセットした場合、バッファーはそのファイル、またはバッファーのコンテンツを取得したファイルに類するものに関連付けられる。このようにして、変数は恒久的にローカルであるとマークされるので、メジャーモードの変更がバッファーローカルな値を変更することはない。その一方で、set-visited-file-name
を呼び出すことにより、変数はリセットされるだろう。これを望まない場合は、かわりにwrite-contents-functions
を使用したいと思うだろう。
たとえこれがノーマルフックでないとしても、このリストを操作するためにadd-hook
およびremove-hook
を使用することはできる。Hooksを参照のこと。
これは正にwrite-file-functions
と同様に機能するが、こちらはvisitしている特定のファイルやファイルの場所ではなく、バッファーのコンテンツに関連するフックを意図している。そのようなフックは、この変数にたいするバッファーローカルなバインディングとして、通常はメジャーモードにより作成される。この変数は、セットされた際は、常に自動的にバッファーローカルになる。新たなメジャーモードへの切り替えは、常にこの変数をリセットするが、set-visited-file-name
の呼び出しではリセットされない。
このフック内の関数のいずれかが非nil
をリターンした場合、そのファイルはすでに書き込み済みとみなされ、残りの関数は呼び出されず、write-file-functions
内の関数も呼び出されない。
このノーマルフックは、visitしているファイルにバッファーが保存される前に実行される。保存が通常の方法で行われるか、あるいは上述のフックのいずれかで行われたかは問題にしない。たとえば、copyright.elプログラムは、ファイルの保存において、それの著作権表示が今年であることを確認するために、このフックを使用する。
このノーマルフックは、visitしているファイルにバッファーを保存した後に実行される。このフックの使用例の1つは、Fast Lockモードにある。このモードは、キャッシュファイルにハイライト情報を保存するために、このフックを使用している。
この変数が非nil
の場合、save-buffer
は保存ファイルがもつ名前のかわりに、一時的な名前で新たなファイルに書き込み、エラーがないと明確になった後にファイルを意図する名前にリネームすることにより、保存中のI/Oエラーから防御する。この手順は、無効なファイルが原因となるディスク容量逼迫のような問題を防ぐ。
副作用として、バックアップ作成にコピーが必要になる。Backup by Renaming or by Copying?を参照のこと。しかし同時に、この高価なファイル保存により、保存したファイルと他のファイル名との間のすべてのハードリンクは切断される。
いくつかのモードは、特定のバッファーにおいて、この変数に非nil
のバッファーローカル値を与える。
この変数は、ファイルが改行で終わらないように書き込まれるかどうかを決定する。変数の値がt
の場合、save-buffer
はバッファーの終端に改行がなければ暗黙理に改行を追加する。値がvisit
の場合、Emacsはファイルをvisitした直後に不足している改行を追加する。値がvisit-save
の場合、Emacsはvisitと保存の両方のタイミングで、不足している改行を追加する。その他の非nil
値にたいしては、そのようなケースが生じるたびに、改行を追加するかどうか、save-buffer
がユーザーに尋ねる。
変数の値がnil
の場合、save-buffer
は改行を追加しない。デフォルト値はnil
だが、特定のバッファーでこれをt
にセットするメジャーモードも少数存在する。
Buffer File Nameの関数set-visited-file-name
も参照されたい。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルのコンテンツをバッファーにコピーするためには、関数insert-file-contents
を使用しします(マークをセットするので、Lispプログラム内でコマンドinsert-file
は使用してはならない)。
この関数は、ファイルfilenameのコンテンツを、カレントバッファーのポイントの後に挿入する。これは絶対ファイル名と、挿入だれたデータの長さからなるリストをリターンする。filenameが読み取り可能なファイルの名前でない場合は、エラーがシグナルされる。
この関数は、定義されたファイルフォーマットに照らしてファイルのコンテンツをチェックして、適切ならそのコンテンツの変換、およびリストafter-insert-file-functions
内の関数の呼び出しも行う。File Format Conversionを参照のこと。通常は、リストafter-insert-file-functions
内のいずれかの関数が、EOL変換を含むファイルコンテンツのデコードに使用される、コーディングシステム(Coding Systemsを参照)を判断する。しかし、ファイルにnullバイトが含まれる場合、デフォルトではコード変換なしでvisitされる。inhibit-null-byte-detectionを参照のこと。
visitが非nil
の場合、この関数は追加でそのバッファーを未変更とマークして、そのバッファーのさまざまなフィールドをセットアップして、バッファーがファイルfilenameをvisitしているようにする。これらのフィールドにはバッファーがvisitしたファイルの名前、最終保存したファイルのmodtimeが含まれる。これらの機能はfind-file-noselect
により使用され、恐らくあなた自身が使用するべきではない。
begおよびendが非nil
の場合、それらはファイル挿入範囲を指定する、バイトオフセット数値であること。この場合、visitはnil
でなければならない。たとえば、
(insert-file-contents filename nil 0 500)
これはファイルの先頭500文字(バイト)を挿入する。
引数replaceが非nil
の場合、それはバッファーのコンテンツ(実際にはアクセス可能な範囲)を、ファイルのコンテンツで置き換えることを意味する。これは単にバッファーのコンテンツを削除してファイル全体を挿入するより優る。なぜなら、(1)マーカー位置を維持し、(2)undoリストに配すデータも少ないからである。
replaceとvisitがnil
であれば、insert-file-contents
で(FIFOやI/Oデバイスのような)スペシャルファイルの読み取りが可能である。
この関数はinsert-file-contents
のように機能するが、find-file-hook
を実行せず、フォーマットのデコード、文字コード変換、自動解凍、...などを行わない点が異なる。
他のプログラムがファイルを読めるように、他のプロセスにファイル名を渡したい場合は、関数file-local-copy
を使用します。Making Certain File Names “Magic”を参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数append-to-file
およびwrite-region
を使用することにより、ディスク上のファイルに直接、バッファーのコンテンツ、またはバッファーの一部を書き込むことができます。visitされているファイルに書き込むために、これらの関数を使用しないでください。これにより、visitにたいするメカニズムが混乱するかもしれません。
この関数は、カレントバッファー内で、startとendによるリージョンのコンテンツを、ファイルfilenameの終端に追加する。そのファイルが存在しない場合は作成する。この関数はnil
をリターンする。
filenameに書込不可能なファイル、またはファイルを作成不可なディレクトリー内の存在しないファイルを指定した場合は、エラーがシグナルされる。
Lispから呼び出した場合、この関数は以下と完全に等価である:
(write-region start end filename t)
この関数は、カレントバッファー内のstartとendで区切られたリージョンを、filenameで指定されたファイルに書き込む。
startがnil
の場合、このコマンドはバッファーのコンテンツ全体(アクセス可能な範囲だけではない)をファイルに書き込み、endは無視する。
startが文字列の場合、write-region
はバッファーのテキストではなく、その文字列を追加する。その場合、endは無視される。
appendが非nil
の場合は、指定されたテキストが(もしあれば)既存のファイルコンテンツに追加される。appendが数字の場合、write-region
はファイル開始位置からそのバイトオフセットをseekして、データをそこに書き込む。
mustbenewが非nil
の場合、write-region
はもしfilenameが既存ファイルの名前なら確認を求める。mustbenewがシンボルexcl
なら、ファイルがすでに存在する場合はwrite-region
は確認を求めるかわりに、エラーfile-already-exists
をシグナルする。
mustbenewがexcl
のときは、存在するファイルのテストに特別なシステム機能を使用する。少なくともローカルディスク上のファイルにたいしては、Emacsがファイルを作成する前に、Emacsに通知せずに他のプログラムが同じ名前のファイルを作成することはありえない。
visitがt
の場合、Emacsはバッファーとファイルの関連付けを設定し、そのバッファーがそのファイルをvictimする。また、カレントバッファーにたいする最終ファイル変更日時にfilenameをセットして、そのバッファーを未変更としてマークする。この機能はsave-buffer
により使用されるが、おそらくあなた自身が使用するべきではないだろう。
visitが文字列の場合、それはvisitするファイルの名前を指定する。この方法を使えば、そのバッファーが別のファイルをvisitしていると記録しつつ、1つのファイル(filename)にデータを書き込むことができる。引数visitは、エコーエリアに使用される他に、ファイルのロックにも使用され、visitがbuffer-file-name
に格納される。この機能は、file-precious-flag
の実装に使用される。自分が何をしているか本当にわかっているのでなければ、これを使用してはならない。
オプション引数locknameが非nil
の場合、それはロックとアンロックの目的に使用する、filenameおよびvisitをオーバーライドするファイル名を指定する。
関数write-region
は、書き込むデータをbuffer-file-format
により指定される、適切なファイルフォーマットに変換しするとともに、リストwrite-region-annotate-functions
内の関数の呼び出しも行う。File Format Conversionを参照のこと。
通常、write-region
はエコーエリア内にメッセージ‘Wrote
filename’を表示する。visitがt
、nil
、文字列のいずれでもない場合、このメッセージは抑制される。この機能は、内部的な目的のために、ユーザーが知る必要がないファイルを使用する場合に有用である。
with-temp-file
マクロは、一時バッファー(temporary
buffer)をカレントバッファーとしてbodyフォームを評価して、最後にそのバッファーのコンテンツをfileに書き込む。これは終了時に一時バッファーをkillして、with-temp-file
フォームの前にカレントだったバッファーをリストアする。その後、body内の最後のフォームの値をリターンする。
throw
やエラーによる異常なexit(abnormal exit)でも、カレントバッファーはリストアされる(Nonlocal Exitsを参照)。
The Current
Bufferのwith-temp-buffer
も参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2人のユーザーが同時に同じファイルを編集する際、おそらく彼らは互いに干渉しあうでしょう。Emacsは、ファイルが変更される際にファイルロック(file lock)を記録することにより、このような状況の発生を防ぎます。そして、Emacsは他のEmacsジョブにロックされているファイルをvisitしているバッファーへの変更の最初の試みを検知して、ユーザーに何を行うか尋ねます。このファイルロックの実態は、編集中のファイルと同じディレクトリーに格納される、特別な名前をもつシンボリックリンクです(シンボリックリンクをサポートしないファイルシステムでは、通常のファイルが使用される)。
ファイルのアクセスにNFSを使用する際には、可能性は小さいものの、他のユーザーと同じファイルを“同時”にロックするかもしれません。これが発生した場合、2人のユーザーが同時にファイルを変更することが可能になりますが、それでもEmacsは2番目に保存するユーザーにたいして警告を発するでしょう。たファイルをvisitしているバッファーで、ディスク上でファイル変更の検知により、ある種の同時編集を捕捉できます。Buffer Modification Timeを参照してください。
この関数は、ファイルfilenameがロックされていなければnil
をリターンする。このEmacsプロセスによりロックされている場合はt
をリターンし、他のEmacsジョブによりロックされている場合はロックしたユーザーの名前をリターンする。
(file-locked-p "foo") ⇒ nil
この関数は、カレントバッファーが変更されている場合は、ファイルfilenameをロックする。引数filenameのデフォルトは、カレントバッファーがvisitしているファイルである。カレントバッファーがファイルをvisitしていない、またはバッファーが変更されていない、またはシステムがロックをサポートしない場合は、何もしない。
この関数は、カレントバッファーが変更されている場合は、バッファーによりvisitされているファイルをアンロックする。バッファーが変更されていない場合は、そのファイルはロックされてはならないので、この関数は何もしない。カレントバッファーがファイルをvisitしていない、またはシステムがロックをサポートしない場合、この関数は何もしない。
この変数がnil
の場合、Emacsはファイルをロックしない。
この関数は、ユーザーがfileの変更を試みたが、それが名前other-userのユーザーにロックされていたとき呼び出される。この関数のデフォルト定義は、何を行うかユーザーに尋ねる関数である。この関数がリターンする値は、Emacsが次に何を行うかを決定する:
t
は、そのファイルのロックを奪うことを意味する。その場合、other-userはロックを失い、このユーザーがファイルを編集することができる。
nil
は、ロックを無視して、とにかくユーザーがファイルを編集できるようにすることを意味する。
file-locked
をシグナルする。この場合、ユーザーが行おうとしていた変更は行われない。
このエラーにたいするエラーメッセージは、以下のようになる:
error→ File is locked: file other-user
ここで、file
はファイル名、other-userはそのファイルのロックを所有するユーザーの名前である。
望むなら、他の方法で判定を行う独自のバージョンで、ask-user-about-lock
関数を置き換えることができる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ファイル(またはディレクトリーやシンボリックリンク)に関して、ファイルが読み込み可能か、書き込み可能か、あるいはファイルのサイズなmのような、さまざまなタイプの情報を取得する関数を説明します。これらの関数はすべて、引数にファイルの名前を取ります。注記した場合を除き、これらの引数には既存のファイルを指定する必要があり、ファイルが存在しない場合はエラーをシグナルします。
スペースで終わるファイル名には気をつけてください。いくつかのファイルシステム(特にMS-Windows)では、ファイル名の末尾の空白文字は、暗黙かつ自動的に無視されます。
24.6.1 Testing Accessibility | そのファイルは読み取り可能か?書き込み可能か? | |
24.6.2 Distinguishing Kinds of Files | それはディレクトリー?それともシンボリックリンク? | |
24.6.3 Truenames | シンボリックリンクが行き着くファイル名。 | |
24.6.4 File Attributes | ファイルのサイズ?更新日時など。 | |
24.6.5 Extended File Attributes | アクセス制御にたいするファイル属性の拡張。 | |
24.6.6 Locating Files in Standard Places | 標準的な場所でファイルを見つける方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数は、あるファイルを読み取り、書き込み、実行するためのパーミッションをテストします。明示しない限り、これらの関数はファイル名引数にたいするシンボリックリンクを、すべてのレベル(ファイル自身のレベルおよび親ディレクトリーのレベル)において再帰的にフォローします。
いくつかのオペレーティングシステムでは、ACL(Access Control Lists: アクセス制御リスト)のような機構を通じて、より複雑なアクセスパーミッションセットが指定できます。それらのパーミッションにたいする問い合わせやセットの方法については、Extended File Attributesを参照してください。
この関数は、ファイル名filenameが存在しているようならt
をリターンする。これは、そのファイルが読み取り可能である必要はなく、ファイルの属性を調べることが可能なこと意味する(UnixおよびGNU/Linuではなく、そのファイルが存在し、かつそのファイルを含むディレクトリーの実行パーミッションをもつ場合にt
となり、そのファイル自体のパーミッションは無関係である)。
ファイルが存在しない、またはACLポリシーがファイル属性を調べることを禁止する場合、この関数はnil
をリターンする。
ディレクトリーはファイルなので、ディレクトリー名が与えられた場合、file-exists-p
はt
をリターンする。しかし、シンボリックリンクは特別に扱われる。file-exists-p
はターゲットファイルが存在する場合のみ、シンボリックリンクにたいしてt
をリターンする。
この関数は、filenameという名前のファイルが存在し、それを読み取ることが可能な場合はt
をリターンする。それ以外はnil
をリターンする。
この関数は、filenameという名前のファイルが存在し、それを実行することが可能な場合はt
をリターンする。それ以外はnil
をリターンする。UnixおよびGNU/Linuxシステムでは、そのファイルがディレクトリーの場合、実行パーミッションはディレクトリー内のファイルの存在と属性をチェックでき、ファイルのモードが許せばオープンできることを意味する。
この関数は、filenameという名前のファイルに書き込み可能、または作成可能可能な場合はt
をリターンする。それ以外はnil
をリターンする。ファイルが存在し、それに書き込むことができるなら、ファイルは書き込み可能である。ファイルが存在せず、指定されたディレクトリーが存在して、そのディレクトリーに書き込むことができるなら、書き込み可能である。
以下の例では、fooは親ディレクトリーが存在しないので、たとえユーザーがそのディレクトリーを作成可能であっても、ファイルは書き込み可能ではない。
(file-writable-p "~/no-such-dir/foo") ⇒ nil
この関数は、ファイルとしての名前がdirnameであるようなディレクトリー内にある既存のファイルをオープンするパーミッションをもつ場合は、t
をリターンする。それ以外(またはそのようなディレクトリーが存在しない場合)はnil
をリターンする。dirnameの値はディレクトリー名(/foo/など)、または名前がディレクトリー(最後のスラッシュがない/fooなど)であるようなファイルである。
たとえば、以下では/foo/内の任意のファイルを読み取る試みは、エラーになると推測される:
(file-accessible-directory-p "/foo") ⇒ nil
この関数は、読み取り用にファイルfilenameをオープンして、クローズした後にnil
をリターンする。しかし、オープンに失敗した場合は、stringをエラーメッセージのテキストに使用して、エラーをシグナルする。
この関数は、ファイルfilenameを削除して、それを新たに作成しても、そのファイルの所有者が変更されずに維持される場合は、t
をリターンする。これは、存在しないファイルにたいしてもt
をリターンする。
オプション引数groupが非nil
の場合、この関数はファイルのグループが変更されないこともチェックする。
filenameがシンボリックリンクの場合は、ここで述べる他の関数と異なり、file-ownership-preserved-p
はfilenameをターゲットで置き換えない。しかし、この関数は親ディレクトリーのすべての階層において、シンボリックリンクを再帰的にフォローする(follow:
辿る)。
この関数は、filenameのモードビット(mode
bits)をリターンする。これは読み取り、書き込み、実行パーミッションを要約する整数である。filenameでのシンボリックリンクは、すべての階層において再帰的にフォローされる。ファイルが存在しない場合のリターン値はnil
である。
モードビットの説明は、See File permissions in The GNU
Coreutils
Manualを参照のこと。たとえば最下位ビットが1なら、そのファイルは実行可能、2ビット目が1なら書き込み可能、...となる。設定できる最大の値は4095(8進の7777)であり、これはすべてのユーザーが読み取り、書き込み、実行のパーミッションをもち、他のユーザーとグループにたいしてSUIDビット、およびstickyビットがセットされる。
これらのパーミッションのセットに使用されるset-file-modes
関数については、Changing File Names and Attributesを参照のこと。
(file-modes "~/junk/diffs")
⇒ 492 ; 10進整数
(format "%o" 492)
⇒ "754" ; 8進に変換した値
(set-file-modes "~/junk/diffs" #o666) ⇒ nil
$ ls -l diffs -rw-rw-rw- 1 lewis lewis 3063 Oct 30 16:00 diffs
MS-DOSにたいする注意:
MS-DOSでは、“実行可能”を表すようなファイルのモードビットは存在しない。そのため、file-modes
はファイル名が.com、.bat、.exeなどのような標準的な実行可能な拡張子のいずれかで終わる場合は、ファイルを実行可能であると判断する。Unix標準の‘#!’署名で始まるshellスクリプトやPerlスクリプトも、実行可能と判断される。Unixとの互換性のために、ディレクトリーも実行可能と報告される。file-attributes
(File Attributesを参照)も、これらの慣習にしたがう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ディレクトリー、シンボリックリンク、および通常ファイルのような、さまざまな種類のファイルを区別する方法を説明します。
ファイルfilenameがシンボリックリンクの場合、file-symlink-p
関数は(非再帰的な)リンクターゲットを文字列としてリターンする(リンクターゲット文字列は、そのターゲットの完全な絶対ファイル名である必要はない。リンクが指すのが完全なファイル名か判断するのは、簡単な処理ではない。以下を参照されたい)。filenameのディレクトリー部分(leading
directory)にシンボリックリンクが含まれる場合、この関数はそれらを再帰的にフォローする。
ファイルfilenameがシンボリックリンクではない、または存在しない場合、file-symlink-p
はnil
をリターンする。
この関数の使用例をいくつか示す:
(file-symlink-p "not-a-symlink") ⇒ nil
(file-symlink-p "sym-link") ⇒ "not-a-symlink"
(file-symlink-p "sym-link2") ⇒ "sym-link"
(file-symlink-p "/bin") ⇒ "/pub/bin"
3つ目の例では、関数はsym-linkをリターンするものの、たとえそれ自体がシンボリックリンクであっても、リンク先の解決を行わないことに注意されたい。これが上述した“非再帰的(non-recursive)”の意味するところであり、シンボリックリンクをフォローする処理は、そのリンクターゲット自体がリンクの場合、再帰的には行われない。
この関数がリターンするのは、そのシンボリックリンクに何が記録されているかを示す文字列であり、それにはディレクトリー部分が含まれていても、いなくても構わない。この関数は完全修飾されたファイル名を生成するためにリンクターゲットを展開しないし、リンクターゲットが絶対ファイル名でなければ、(もしあっても)filename引数のディレクトリー部分は使用しない。以下に例を示す:
(file-symlink-p "/foo/bar/baz") ⇒ "some-file"
ここでは、たとえ与えられた/foo/bar/bazが完全修飾されたファイル名であるにも関わらず、その結果は異なり、実際には何のディレクトリー部分ももたない。some-file自体がシンボリックリンクかもしれないので、単にその前に先行ディレクトリーを追加することはできず、絶対ファイル名を生成するために、単にexpand-file-name
(Functions that Expand Filenamesを参照)を使用することもできないからである。
この理由により、あるファイルがシンボリックリンクか否かという単一の事実よりも多くを判定する必要がある場合に、この関数が有用であることは稀である。実際にリンクターゲットのファイル名が必要な場合は、Truenamesで説明するfile-chase-links
またはfile-truename
を使用すること。
以下の2つの関数は、filenameにたいして、シンボリックリンクを全階層において再帰的にフォローする。
この関数は、filenameが既存のディレクトリー名ならt
、それ以外はnil
をリターンする。
(file-directory-p "~rms") ⇒ t
(file-directory-p "~rms/lewis/files.texi") ⇒ nil
(file-directory-p "~rms/lewis/no-such-file") ⇒ nil
(file-directory-p "$HOME") ⇒ nil
(file-directory-p (substitute-in-file-name "$HOME")) ⇒ t
この関数は、ファイルfilenameが存在し、かつそれが通常ファイル(ディレクトリー、名前付きパイプ、端末、その他I/Oデバイス以外)の場合はt
をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルの実名(truename)とは、全階層においてシンボリックリンクを残らずフォローした後、名前コンポーネントに出現する‘.’と‘..’を除いて簡略化した名前のことです。これは、そのファイルにたいする正規名(canonical name)の一種です。ファイルが常に一意な実名をもつ訳ではありません。あるファイルにたいする異なる実名の個数は、そのファイルにたいするハードリンクの個数と同じです。しかし、実名はシンボリックリンクによる名前の変動を解消するのに有用です。
この関数は、ファイルfilenameの実名をリターンする。引数が絶対ファイル名でない場合、この関数は最初にdefault-directory
にたいしてこれを展開する。
この関数は、環境変数を展開しない。これを行うのはsubstitute-in-file-name
だけである。Definition of substitute-in-file-nameを参照のこと。
名前コンポーネントに出現する‘..’に先行するシンボリックリンクリンクをフォローする必要がある場合は、直接間接を問わずexpand-file-name
を呼び出す前に、file-truename
を呼び出すこと。そうしないと、‘..’の直前にある名前コンポーネントは、file-truename
が呼び出される前に“簡略化”により取り除かれてしまう。expand-file-name
呼び出しの必要を無くすため、file-truename
はexpand-file-name
が行うのと同じ方法で‘~’を扱う。Functions that Expand Filenamesを参照のこと。
この関数は、filenameで始まるシンボリックリンクを、シンボリックリンクではない名前のファイル名までフォローして、そのファイル名をリターンする。この関数は、親ディレクトリーの階層にあるシンボリックリンクをフォローしない。
limitに数を指定した場合は、その数のリンクを追跡した後、この関数はたとえそれが依然としてシンボリックリンクであっても、それをリターンする。
file-chase-links
とfile-truename
の違いを説明するために、/usr/fooがディレクトリー/home/fooへのシンボリックリンクであり、/home/foo/helloが(少なくともシンボリックリンクではない)通常ファイル、または存在しないファイルであるとします。この場合は以下のようになります:
(file-chase-links "/usr/foo/hello") ;; 親ディレクトリーのリンクはフォローしない ⇒ "/usr/foo/hello" (file-truename "/usr/foo/hello") ;; /homeはシンボリックリンクではないと仮定 ⇒ "/home/foo/hello"
この関数は、ファイルfile1とfile2の名前が同じファイルの場合はt
をリターンする。これは、リモートファイル名も適切な方法で処理することを除き、実名の比較と似ている。file1またはfile2が存在しない場合、リターン値は不定である。
この関数は、fileがディレクトリーdir内のファイル、またはサブディレクトリーの場合は、t
をリターンする。また、fileとdirが同じディレクトリーの場合も、t
をリターンする。この関数は、2つのディレクトリーの実名を比較する。dirが既存のディレクトリーの名前でない場合、リターン値はnil
である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ファイルの詳細な情報を取得する関数について説明します。それらの情報にはファイルの所有者やグループの番号、ファイル名の個数、inode番号、サイズやアクセス日時、変更日時が含まれます。
この関数は、ファイルfilename1がファイルfilename2より新しい場合は、t
をリターンする。filename1が存在しない場合はnil
、filename1は存在するがfilename2が存在しない場合はt
をリターンする。
以下の例では、aug-19が19日、aug-20が20日に書き込まれ、ファイルno-fileは存在しないものとする。
(file-newer-than-file-p "aug-19" "aug-20") ⇒ nil
(file-newer-than-file-p "aug-20" "aug-19") ⇒ t
(file-newer-than-file-p "aug-19" "no-file") ⇒ t
(file-newer-than-file-p "no-file" "aug-19") ⇒ nil
以下の2つの関数のfilename引数がシンボリックリンクの場合、これらの関数はそれをリンクターゲットで置き換えません。しかしどちらの関数も、親ディレクトリーのすべての階層において、シンボリックリンクを再帰的にフォローします。
この関数は、ファイルfilenameの属性(attributes)のリストをリターンする。オープンできないファイルが指定された場合は、nil
をリターンする。オプション引数id-formatは、属性UIDおよびGID(以下参照)にたいして望ましいフォーマットを指定し、有効な値は'string
および'integer
である。デフォルトは'integer
だが、わたしたちはこれの変更を計画しているので、リターンされるUIDまたはGIDを使用する場合は、id-formatにたいして非nil
値を指定するべきである。
リストの要素は順に:
t
、シンボリックリンクにたいしては文字列(リンクされる名前)、テキストファイルにたいしてはnil
。
add-name-to-file
を使用して作成できる(Changing File Names and Attributesを参照)。
(sec-high sec-low microsec
picosec)
からなるリスト(これはcurrent-time
の値と似ている。Time of Dayを参照されたい)。いくつかのFATベースのファイルシステムでは、最終アクセスの日付だけが記録されるので、この時刻には常に最終アクセス日の真夜中が保持されることに注意。
(high
.
low)
という形式の値になる。ここでlowは下位16ビットである。それにたいしてさえinode番号が大きい場合、値は(high
middle
.
low)
という形式になる。ここでhigh
は上位ビット、middleは中位24ビット、lowは下位16ビットを保持する。
たとえば、以下はfiles.texiのファイル属性である:
(file-attributes "files.texi" 'string) ⇒ (nil 1 "lh" "users" (20614 64019 50040 152000) (20000 23 0 0) (20614 64555 902289 872000) 122295 "-rw-rw-rw-" t (5888 2 . 43978) (15479 . 46724))
この結果を解釈すると:
nil
ディレクトリーでもシンボリックリンクでもない。
1
(カレントデフォルトディレクトリー内で名前files.texiは)単一の名前をもつ。
"lh"
名前"lh"のユーザーにより所有される。
"users"
名前"users"のグループ。
(20614 64019 50040 152000)
最終アクセスがOctober 23, 2012, at 20:12:03.050040152 UTC。
(20000 23 0 0)
最終更新がJuly 15, 2001, at 08:53:43 UTC。
(20614 64555 902289 872000)
最終ステータス変更がOctober 23, 2012, at 20:20:59.902289872 UTC。
122295
バイト長は122295バイト(しかしマルチバイトシーケンスが含まれていたり、EOLフォーマットがCRLFの場合は122295文字が含まれないだろう)。
"-rw-rw-rw-"
所有者、グループ、その他にたいして読み取り、書き込みアクセスのモードをもつ。
t
単なるプレースホルダーであり、何の情報ももたない。
(5888 2 . 43978)
inode番号は6473924464520138。
(15479 . 46724)
ファイルシステムのデバイス番号は1014478468。
この関数は、ファイルfilenameがもつ名前(ハードリンク)の個数をリターンする。ファイルが存在しない場合、この関数はnil
をリターンする。シンボリックリンクは、リンク先のファイルの名前とは判断されないので、この関数に影響しないことに注意。
$ ls -l foo* -rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo -rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo1
(file-nlinks "foo") ⇒ 2
(file-nlinks "doesnt-exist") ⇒ nil
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
いくつかのオペレーティングシステムでは、それぞれのファイルを任意の拡張ファイル属性(extended file attributes)に関連付けることができます。現在のところ、Emacsは拡張ファイル属性のうち2つの特定セット(ACL: Access Control List、およびSELinuxコンテキスト)にたいする問い合わせと設定をサポートします。これらの拡張ファイル属性は、前のセクションで議論した“Unixスタイル”の基本的なパーミッションより洗練されたファイルアクセス制御を強いるために、いくつかのシステムで利用されます。
ACLとSELinuxについての詳細な解説は、このマニュアルの範囲を超えます。わたしたちの目的のためには、それぞれのファイルはACL(ACLベースのファイル制御システムの元でACLのプロパティを指定)および/またはSELinuxコンテキスト(SELinuxシステムの元でSELinuxのプロパティを指定)に割り当てることができる、という理解でよいでしょう。
この関数は、ファイルfilenameにたいするACLをリターンする。ACLにたいする正確なLisp表現は不確定(かつ将来のEmacsバージョンで変更され得る)だが、これはset-file-acl
が引数aclにとる値と同じである(Changing File Names and Attributesを参照)。
根底にあるACL実装はプラットフォーム固有である。EmacsはGNU/LinuxおよびBSDではPOSIX ACLインターフェイスを使用し、MS-WindowsではネイティブのファイルセキュリティAPIをPOSIX ACLインターフェイスでエミュレートする。
ACLサポートなしでEmacsがコンパイルされた場合、ファイルが存在しないかアクセス不能な場合、またはその他の理由によりEmacsがACLエントリーを判断できない場合、リターン値はnil
である。
この関数は、ファイルfilenameのSELinuxコンテキストを、(user role
type
range)
という形式のリストでリターンする。リストの要素は、そのコンテキストのユーザー、ロール、タイプ、レンジを文字列として表す値である。これらの実際の意味についての詳細は、SELinuxのドキュメントを参照のこと。リターン値は、set-file-selinux-context
がcontext引数でとるのと同じ形式である(Changing File Names and Attributesを参照)。
SELinuxサポートなしでEmacsがコンパイルされた場合、ファイルが存在しないかアクセス不能な場合、またはシステムがSELinuxをサポートしない場合、リターン値は(nil
nil nil nil)
である。
この関数は、Emacsが認識するファイルfilenameの拡張属性をalistでリターンする。現在のところ、この関数はACLとSELinuxの両方を取得するための便利な方法としての役目を果たす。他のファイルに同じファイルアクセス属性を適用するために、リターンされたalistを2つ目の引数としてset-file-extended-attributes
を呼び出すことができる(Changing File Names and Attributesを参照)。
要素のうちの1つは(acl
. acl)
で、aclはfile-acl
がリターンするのと同じ形式である。
他の要素は(selinux-context
.
context)
で、contextはfile-selinux-context
がリターンするのと同じ形式である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ディレクトリーのリスト(パス(path))からファイルを検索したり、標準の実行可能ファイル用ディレクトリーから実行可能ファイルを検索する方法を説明します。
ユーザー固有の設定ファイル(configuration file)の検索については、Standard File Namesの関数locate-user-emacs-file
を参照してください。
この関数は、pathで与えられるディレクトリーリスト内で、filenameという名前のファイルを検索して、suffixes内のサフィックスの検索を試みる。そのようなファイルが見つかった場合はファイルの絶対ファイル名(Absolute and Relative File Namesを参照)をリターンし、それ以外はnil
をリターンする。
オプション引数suffixesは、検索時にfilenameに追加するファイル名サフィックスのリストを与える。locate-file
は、検索するディレクトリーごとに、それらのサフィックスを試みる。suffixesがnil
、または("")
の場合は、サフィックスなしで、filenameだけがそのまま使用される。suffixesの典型的な値はexec-suffixes
(Functions that Create Subprocessesを参照)、load-suffixes
、load-file-rep-suffixes
、および関数get-load-suffixes
(Load Suffixesを参照)である。
実行可能プログラムを探すときはexec-path
(Functions that Create Subprocessesを参照)、Lispファイルを探すときはload-path
(Library Searchを参照)がpathの典型的な値である。filenameが絶対ファイル名の場合、pathは効果がないが、サフィックスにたいするsuffixesは依然として試行される。
オプション引数predicateが非nil
の場合、それは候補ファイルが適切かどうかテストする述語関数を指定する。述語関数には、単一の引数として候補ファイル名が渡される。predicateがnil
、または省略された場合は、述語としてfile-readable-p
を使用する。file-executable-p
やfile-directory-p
など、その他の有用な述語については、Distinguishing Kinds of Filesを参照のこと。
互換性のために、predicateにはexecutable
、readable
、writable
、exists
、またはこれらシンボルの1つ以上のリストも指定できる。
この関数は、programという名前の実行可能ファイルを検索して、その実行可能ファイルの絶対ファイル名と、もしあればファイル名の拡張子も含めてリターンする。ファイルが見つからない場合は、nil
をリターンする。この関数は、exec-path
内のすべてのディレクトリーを検索し、exec-suffixes
内のすべてのファイル名拡張子の検索も試みる(Functions that Create Subprocessesを参照)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションの関数は、ファイルのリネーム(rename: 改名)、コピー、削除(delete)、リンク、およびモード(パーミッション)のセットを行います。
newnameという引数をもつ関数では、newnameという名前のファイルが既に存在する場合の振る舞いは、引数ok-if-already-existsの値に依存します。
nil
の場合は、file-already-exists
エラーがシグナルされる。
以下の4つのコマンドはすべて、1つ目の引数にたいして親ディレクトリーの全階層のシンボリックリンクを再帰的にフォローしますが、その引数自体がシンボリックリンクの場合は、copy-file
だけが(再帰的な)ターゲットを置き換えます。
この関数は、oldnameという名前のファイルに、newnameという名前を追加で与える。これはnewnameという名前が、oldnameにたいする新たな“ハードリンク”になることを意味する。
以下の例の最初の部分として、2つのファイルfooとfoo3をリストする。
$ ls -li fo* 81908 -rw-rw-rw- 1 rms rms 29 Aug 18 20:32 foo 84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3
ここで、add-name-to-file
を呼び出してハードリンクを作成し、再度ファイルをリストする。このリストには、1つのファイルにたいして2つの名前fooとfoo2が表示される。
(add-name-to-file "foo" "foo2") ⇒ nil
$ ls -li fo* 81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo 81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo2 84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3
最後に以下を評価する:
(add-name-to-file "foo" "foo3" t)
そして、ファイルを再度リストする。今度は1つのファイルにたいして3つの名前foo、foo2、foo3がある。foo3の古いコンテンツは失われた。
(add-name-to-file "foo1" "foo3") ⇒ nil
$ ls -li fo* 81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo 81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo2 81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo3
この関数は、1つのファイルにたいして複数の名前をもつことが許されないオペレーティングシステムでは無意味である。いくつかのシステムでは、かわりにファイルをコピーすることにより複数の名前を実装している。
File Attributesのfile-nlinks
も参照のこと。
このコマンドは、filenameをnewnameにリネームする。
filenameがfilenameとは別に追加の名前をもつ場合、それらは自身の名前をもち続ける。実際のところ、add-name-to-file
で名前newnameを追加してからfilenameを削除するのは、瞬間的な遷移状態を別とすると、リネームと同じ効果がある。
このコマンドは、ファイルoldnameをnewnameにコピーする。oldnameが存在しない場合は、エラーをシグナルする。newnameがディレクトリーの場合は、その最後の名前コンポーネントを保持するように、そのディレクトリーの中にoldnameをコピーする。
timeが非nil
の場合、この関数は新たなファイルにたいして、古いファイルと同じ最終変更時刻を与える(これはいくつかの限られたオペレーティングシステムでのみ機能する)。時刻のセットでエラーが発生した場合、copy-file
はfile-date-error
エラーをシグナルする。インタラクティブに呼び出された場合、プレフィックス引数はtimeにたいして非nil
値を指定する。
引数preserve-uid-gidがnil
の場合は、新たなファイルのユーザーおよびグループの所有権の決定を、オペレーティングシステムに委ねる(通常はEmacsを実行中のユーザーである)。preserve-uid-gidが非nil
の場合は、そのファイルのユーザーとグループの所有権のコピーを試みる。これはいくつかのオペレーティングシステムで、かつそれを行うための正しいパーミッションをもつ場合のみ機能する。
オプション引数preserve-permissionsが非nil
の場合、この関数はoldnameのファイルモード(または“パーミッション”)、同様にACL(Access
Control List)とSELinuxコンテキストをnewnameにコピーする。Information about Filesを参照のこと。
それ以外では、newnameが既存ファイルならファイルモードは変更されず、新たに作成された場合はデフォルトのファイルパーミッション(以下のset-default-file-modes
を参照)によりマスクされる。どちらの場合も、ACLまたはSELinuxコンテキストはコピーされない。
このコマンドは、filenameにたいしてnewnameという名前のシンボリックリンクを作成する。これは、コマンド‘ln -s filename newname’と似ている。
この関数は、シンボリックリンクをサポートしないシステムでは利用できない。
このコマンドは、ファイルfilenameを削除する。ファイルが複数の名前をもつ場合は、他の名前で存在し続ける。filenameがシンボリックリンクの場合、delete-file
はシンボリックリンクだけを削除して、(たとえこれが親ディレクトリーの全階層のシンボリックリンクをフォローするとしても)ターゲットは削除しない。
ファイルが存在しない、または削除できない場合は、適切な種類のfile-error
エラーがシグナルされる(UnixおよびGNU/Linuxでは、ファイルのディレクトリーが書き込み可能ならファイルは削除可能である)。
オプション引数trashが非nil
、かつ変数delete-by-moving-to-trash
が非nil
の場合、このコマンドはファイルを削除するかわりに、システムのTrash(ゴミ箱)にファイルを移動する。Miscellaneous File Operations in The GNU Emacs
Manualを参照のこと。インタラクティブに呼び出された際は、プレフィックス引数がない場合trashはt
、それ以外はnil
である。
Creating, Copying and Deleting Directoriesのdelete-directory
も参照のこと。
この関数は、filenameのファイルモード(またはパーミッション)をmodeにセットする。この関数は、filenameにたいして全階層でシンボリックリンクをフォローする。
非インタラクティブに呼び出された場合、modeは整数でなければならない。その整数の下位12ビットだけが使用される。ほとんどのシステムでは、意味があるのは下位9ビットだけである。modeを入力刷る、Lisp構文を使用できる。たとえば、
(set-file-modes #o644)
これは、そのファイルが所有者により読み取りと書き込み、グループメンバーにより読み取り、その他のユーザーにより読み取り可能であることを指定する。モードビットの仕様の説明は、File
permissions in The GNU Coreutils
Manualを参照のこと。
インタラクティブに呼び出された場合、modeはread-file-modes
(以下参照)を使用してミニバッファーから読み取られる。この場合、ユーザーは整数、またはパーミッションをシンボルで表現する文字列をタイプできる。
ファイルのパーミッションをリターンする関数file-modes
については、File Attributesを参照のこと。
この関数は、EmacsおよびEmacsのサブプロセスが新たに作成するファイルに、デフォルトのパーミッションをセットする。Emacsにより作成されたすべてのファイルはこれらのパーミッション、およびそれらのサブセットとなるパーミッションをもつ(デフォルトファイルパーミッションが実行を許可しても、write-region
は実行パーミッションを付与しないだろう)。UnixおよびGNU/Linuxでは、デフォルトのパーミッションは“umask”の値のビット単位の補数で与えられる。
引数modeは上記のset-file-modes
と同様、パーミッションを指定する整数であること。下位9ビットだけに意味がある。
デフォルトのファイルパーミッションは、既存ファイルの変更されたバージョンを保存する際は効果がない。ファイルの保存では、既存のパーミッションが保持される。
この関数は、デフォルトのファイルモードを整数でリターンする。
この関数は、ミニバッファーからファイルモードビットのセットを読み取る。1つ目のオプション引数promptは非デフォルトのプロンプトを指定する。2つ目のオプション引数base-fileは、ユーザーが既存ファイルのパーミッションに相対的なモードビット指定をタイプした場合に、この関数がリターンするモードビッの元となる権限をもつファイルの名前を指定する。
ユーザー入力が8進数で表される場合、この関数はその数字をリターンする。それが"u=rwx"
のようなモードビットの完全なシンボル指定の場合、この関数はfile-modes-symbolic-to-number
を使用して、それを等価な数字に変換し、結果をリターンする。"o+g"
のように相対的な指定の場合、その指定の元となるパーミッションは、base-fileのモードビットから取得される。base-fileが省略、またはnil
の場合、この関数は元となるモードビットとして0
を使用する。完全指定および相対指定は、"u+r,g+rx,o+r,g-w"
のように組み合わせることができる。ファイルモード指定の説明は、File
permissions in The GNU Coreutils
Manualを参照のこと。
この関数は、modes内のシンボルによるファイルモード指定を、等価な整数に変換する。シンボル指定が既存ファイルにもとづく場合は、オプション引数base-modesからそのファイルのモードビットが取得される。その引数が省略、またはnil
の場合は、0(すべてのアクセスが許可されない)がデフォルトになる。
この関数は、filenameのアクセス時刻と変更時刻をtimeにセットする。時刻が正しくセットされればt
、それ以外はnil
がリターン値となる。timeのデフォルトはカレント時刻であり、current-time
がリターンするフォーマットでなければならない(Time of Dayを参照)。
この関数は、filename
にたいしてEmacsが認識する拡張ファイル属性をセットする。2つ目の引数attribute-alistは、file-extended-attributes
がリターンするalistと同じ形式であること。Extended File Attributesを参照のこと。
この関数は、filenameにたいするSELinuxセキュリティコンテキストにcontextをセットする。context引数は、各要素が文字列であるような(user
role type range)
というリストであること。Extended File Attributesを参照されたい。
この関数は、filenameのSELinuxコンテキストのセットに成功した場合はt
をリターンする。コンテキストがセットされなかった場合(SELinuxが無効、またはEmacsがSELinuxサポートなしでコンパイルされた場合等)は、nil
をリターンする。
この関数は、filenameにたいするACLにaclをセットする。acl引数は、関数file-acl
がリターンするのと同じ形式であること。Extended File Attributesを参照されたい。
この関数はfilenameのACLのセットに成功したらt
、それ以外はnil
をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルは一般的に名前で参照され、Emacsでも他と同様です。Emacsでは、ファイル名は文字列で表現されます。ファイルを操作する関数はすべて、ファイル名引数に文字列を期待します。
ファイル自体の操作に加えて、Emacs Lispプログラムでファイル名を処理する必要(ファイル名の一部を取得して、関連するファイル名構築にその一部を使用する等)がしばしばあります。このセクションでは、ファイル名を扱う方法を説明します。
このセクションの関数は実際にファイルにアクセスする訳ではないので、既存のファイルやディレクトリーを参照しないファイル名を処理できます。
MS-DOSおよびMS-Windowsでは、これらの関数は(実際にファイルを操作する関数と同様)、MS-DOSおよびMS-Windowsのファイル名構文を受け入れます。この構文はUnix構文のようにバックスラッシュでコンポーネントを区切りますが、これらの関数は常にUnix構文をリターンします。これにより、Unix構文でファイル名を指定するLispプログラムが、変更なしですべてのシステムで正しく機能することが可能になるのです。13
24.8.1 File Name Components | ファイル名のディレクトリー部分と、それ以外。 | |
24.8.2 Absolute and Relative File Names | カレントディレクトリーにたいして相対的なファイル名。 | |
24.8.3 Directory Names | ディレクトリーとしてのディレクトリー名と、ファイルとしてのファイル名の違い。 | |
24.8.4 Functions that Expand Filenames | 相対ファイル名から絶対ファイル名への変換。 | |
24.8.5 Generating Unique File Names | 一時ファイル用の名前の生成。 | |
24.8.6 File Name Completion | 与えられたファイル名にたいする補完を探す。 | |
24.8.7 Standard File Names | パッケージが固定されたファイル名を使用する際に、種々のオペレーティングシステムをシンプルに処理する方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
オペレーティングシステムは、ファイルをディレクトリーにグループ化します。あるファイルを指定するためには、ディレクトリーと、そのディレクトリー内でのファイルの名前を指定しなければなりません。それゆえ、Emacsはファイル名をディレクトリー名パートと非ディレクトリー(またはディレクトリー内ファイル名)パートという、2つの主要パートから判断します。どちらのパートも空の場合があり得ます。これら2つのパートを結合することにより、元のファイル名が再作成されます。
ほとんどのシステムでは、最後のスラッシュ(MS-DOSおよびMS-Windowsではバックスラッシュも許される)までのすべてがディレクトリーパートです。残りが非ディレクトリーパートです。
ある目的のために、非ディレクトリーパートはさらに正式名称(the name proper)とバージョン番号に細分されます。ほとんどのシステムでは、名前にバージョン番号をもつのは、バックアップファイルだけです。
この関数は、filenameのディレクトリーパートをディレクトリー名(Directory Namesを参照)としてリターンする。filenameがディレクトリーパートを含まない場合は、nil
をリターンする。
GNUおよびUnixシステムでは、この関数がリターンする文字列は常にスラッシュで終わる。MS-DOSでは、コロンで終わることもあり得る。
(file-name-directory "lewis/foo") ; Unixの例
⇒ "lewis/"
(file-name-directory "foo") ; Unixの例
⇒ nil
この関数は、filenameの非ディレクトリーパートをリターンする。
(file-name-nondirectory "lewis/foo") ⇒ "foo"
(file-name-nondirectory "foo") ⇒ "foo"
(file-name-nondirectory "lewis/") ⇒ ""
この関数は、任意のファイルバージョン番号、バックアップバージョン番号、末尾のチルダを取り除いてfilenameをリターンする。
keep-backup-versionが非nil
の場合は、ファイルシステムなどが理解するような真のファイルバージョン番号は破棄されるが、バックアップバージョン番号は保持される。
(file-name-sans-versions "~rms/foo.~1~") ⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo~") ⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo") ⇒ "~rms/foo"
この関数は、filenameからもしあればすべてのバージョン番号とバックアップ番号を取り除いた後、終端の“拡張子(extension)”をリターンする。ファイル名の拡張子とは、最後の名前コンポーネント(からすべてのバージョン番号とバックアップ番号を取り去った後)の最後の‘.’に後続するパートである。
この関数は、fooのような拡張子のないファイル名にたいしては、nil
をリターンする。foo.のようなnull拡張子にたいしては、""
をリターンする。ファイル名の最終コンポーネントが‘.’で始まる場合、その‘.’は拡張子の開始とはみなされない。したがって、.emacsの拡張子は‘.emacs’ではなくnil
である。
periodが非nil
の場合、拡張子を区切るピリオドもリターン値に含まれるようにななる。その場合、もしfilenameが拡張子をもたないなら、リターン値は""
である。
この関数は、もしあればfilenameから拡張子を除いてリターンする。もしバージョン番号またはバックアップ番号があるなら、ファイルが拡張子をもつ場合のみ、それを削除する。たとえば、
(file-name-sans-extension "foo.lose.c") ⇒ "foo.lose" (file-name-sans-extension "big.hack/foo") ⇒ "big.hack/foo" (file-name-sans-extension "/my/home/.emacs") ⇒ "/my/home/.emacs" (file-name-sans-extension "/my/home/.emacs.el") ⇒ "/my/home/.emacs" (file-name-sans-extension "~/foo.el.~3~") ⇒ "~/foo" (file-name-sans-extension "~/foo.~3~") ⇒ "~/foo.~3~"
最後の2つの例の‘.~3~’は、拡張子ではなくバックアップ番号であることに注意。
この関数は、file-name-sans-extension
とfile-name-nondirectory
を組み合わせたものである。たとえば、
(file-name-base "/my/home/foo.c") ⇒ "foo"
filename引数のデフォルトは、buffer-file-name
である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルシステム内のすべてのディレクトリーは、ルートディレクトリーから開始されるツリーを形成します。このツリーのルートから開始されるすべてのディレクトリー名により、ファイル名を指定でき、それを絶対(absolute)ファイル名と呼びます。デフォルトディレクトリーからの相対的なツリー中の位置でファイルを指定するこでき、それは相対(relative)ファイル名と呼ばれます。UnixおよびGNU/Linuxでは、絶対ファイル名は‘/’または‘~’で始まり、相対ファイル名は違います(abbreviate-file-nameを参照)。MS-DOSおよびMS-Windowsでは、絶対ファイル名はスラッシュ、バックスラッシュ、またはドライブ指定‘x:/’で始まります。ここでxはドライブ文字(drive letter)です。
この関数は、filenameが絶対ファイル名の場合はt
、それ以外はnil
をリターンする。
(file-name-absolute-p "~rms/foo") ⇒ t
(file-name-absolute-p "rms/foo") ⇒ nil
(file-name-absolute-p "/user/rms/foo") ⇒ t
相対ファイル名が与えられた場合は、expand-file-name
を使用して、それを絶対ファイル名に変換できます(Functions that Expand Filenamesを参照)。この関数は、絶対ファイル名を相対ファイル名に変換します:
この関数は、directory(絶対ディレクトリー名またはディレクトリーファイル名)から相対的な結果となると仮定して、filenameと等価な相対ファイル名のリターンを試みる。directoryが省略、またはnil
の場合、カレントバッファーのデフォルトディレクトリーがデフォルトとなる。
絶対ファイル名がデバイス名で始まるオペレーティングシステムが、いくつか存在する。そのようなシステムでは、2つの異なるデバイス名から開始されるfilenameは、directoryにもとづく等価な相対ファイル名をもたない。この場合、file-relative-name
は絶対形式でfilenameをリターンする。
(file-relative-name "/foo/bar" "/foo/") ⇒ "bar" (file-relative-name "/foo/bar" "/hack/") ⇒ "../foo/bar"
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ディレクトリー名(directory name)とは、ディレクトリーの名前のことです。ディレクトリーは実際にはファイルの一種なので、ファイル名をもちます。これはディレクトリー名と関連がありますが、同一ではありません(これは、Unixの通常の用語とは異なる)。同じ実体にたいするこれら2つの異なる名前は、構文的な変換により関連付けられます。GNUおよびUnixシステムでは、ことは単純です。ディレクトリー名はスラッシュで終わり、ファイルとしてのディレクトリーの名前には、そのスラッシュがありません。MS-DOSでは、この関連付けはより複雑です。
ディレクトリー名と、ファイルとしてのディレクトリーの名前の違いは、些細ですが重要です。Emacsの変数、または関数の引数を記述する際、それがディレクトリー名であるとしており、ディレクトリーのファイル名は許されません。file-name-directory
が文字列をリターンするときは、常にディレクトリー名です。
以下の2つの関数は、ディレクトリー名とファイル名の間で変換を行います。これらの関数は、‘$HOME’のような環境変数や、‘~’、‘.’、‘..’などの構文にたいして、特別なことは何も行いません。
この関数は、オペレーティングシステムがディレクトリーの名前と解釈する形式で、filenameを表す文字列をリターンする。ほとんどのシステムでは、(もし終端にそれがなければ)これは文字列にスラッシュを追加することを意味する。
(file-name-as-directory "~rms/lewis") ⇒ "~rms/lewis/"
この関数は、オペレーティングシステムがファイルの名前と解釈する形式で、dirnameを表す文字列をリターンする。ほとんどのシステムでは、これは文字列から最後のスラッシュ(またはバックスラッシュ)を削除することを意味する。
(directory-file-name "~lewis/") ⇒ "~lewis"
ディレクトリーにたいしては、concat
を使用して相対ファイルと組み合わせることができます:
(concat dirname relfile)
これを行う前に、ファイル名が相対的であるか確認してください。絶対ファイル名を使用した場合、結果は構文的に不正になるか、間違ったファイルを参照する可能性があります。
ディレクトリーファイル名作成にこのような組み合わせを使用したい場合は、最初にfile-name-as-directory
を使用して、それをディレクトリー名に変換しなければなりません:
(concat (file-name-as-directory dirfile) relfile)
以下のような、手動によるスラッシュの結合を試みてはなりません
;;; 間違い!
(concat dirfile "/" relfile)
なぜなら、これには可搬性がないからです。常にfile-name-as-directory
を使用してください。
ディレクトリー名をディレクトリーの省略名に変換するには、以下の関数を使用します:
この関数は、filenameの省略された形式をリターンする。これはdirectory-abbrev-alist
(see File Aliases in The GNU Emacs
Manual)で指定される省略形を適用した後、引数のファイル名がユーザーのホームディレクトリー、またはそのサブディレクトリーにある場合は、それを‘~’に置き換える。ホームディレクトリーがルートディレクトリーの場合、多くのシステムでは結果が短縮されないので、‘~’で置き換えない。
これは名前の一部であるような省略形さえも認識するので、ディレクトリー名とファイル名にも使用できる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイル名の展開(expanding)とは、相対ファイル名を絶対ファイル名に変換することを意味します。これはデフォルトディレクトリーから相対的に行われるため、展開されるファイル名と同様、デフォルトディレクトリーも指定しなければなりません。これは~/のような省略形 (abbreviate-file-nameを参照)、 の展開、および./やname/../のような冗長さの排除も行います。 も展開します。
この関数は、filenameを絶対ファイル名に変換する。directoryが与えられた場合、filenameが相対的なら、それは開始点となるデフォルトディレクトリーになる(directoryの値は、それ自体が絶対ディレクトリー名、またはディレクトリーファイル名であるべきで、それは‘~’で始まるかもしれない)。それ以外では、カレントバッファーのdefault-directory
の値が使用される。たとえば:
(expand-file-name "foo") ⇒ "/xcssun/users/rms/lewis/foo"
(expand-file-name "../foo") ⇒ "/xcssun/users/rms/foo"
(expand-file-name "foo" "/usr/spool/") ⇒ "/usr/spool/foo"
結合されたファイル名の最初のスラッシュの前が‘~’の場合は、環境変数HOME
(通常はユーザーのホームディレクトリー)の値に展開される。最初のスラッシュの前が‘~user’で、かつuserが有効なログイン名の場合は、userのホームディレクトリーに展開される。
‘.’または‘..’を含むファイル名は、正規化形式に簡略化される:
(expand-file-name "bar/../foo") ⇒ "/xcssun/users/rms/lewis/foo"
出力に‘..’コンポーネントが残り得る場合もある:
(expand-file-name "../home" "/") ⇒ "/../home"
これは、ルートディレクトリー/の上位の“スーパールート(superroot)”という概念をもつファイルシステムのためのものである。その他のファイルシステムでは、/../は/とまったく同じに解釈される。
expand-file-name
は環境変数を展開しないことに注意。substitute-in-file-name
だけが、それを行う。
(expand-file-name "$HOME/foo") ⇒ "/xcssun/users/rms/lewis/$HOME/foo"
expand-file-name
は、あらゆる階層においてシンボリックリンクをフォローしないことにも注意。これは‘..’の扱いがfile-truename
とexpand-file-name
で異なることに起因する。‘/tmp/bar’がディレクトリー‘/tmp/foo/bar’にたいするシンボリックリンクであると仮定すると:
(file-truename "/tmp/bar/../myfile") ⇒ "/tmp/foo/myfile"
(expand-file-name "/tmp/bar/../myfile") ⇒ "/tmp/myfile"
直接間接を問わず、事前にexpand-file-name
を呼び出さずに‘..’に先行するシンボリックリンクをフォローする必要があるかもしれない場合は、それを呼び出さずに確実にfile-truename
を呼び出すべきである。Truenamesを参照のこと。
このバッファーローカル変数の値は、カレントバッファーにたいするデフォルトディレクトリーである。これは絶対ディレクトリー名であること。これは‘~’で始まるかもしれない。この変数は、すべてのバッファーにおいてバッファーローカルである。
2つ目の引数がnil
の場合、expand-file-name
はデフォルトディレクトリーを使用する。
値は常にスラッシュで終わる文字列である。
default-directory ⇒ "/user/lewis/manual/"
この関数は、filename内で参照される環境変数を、環境変数の値に置き換える。標準的なUnixシェル構文にしたがい、 ‘$’は環境変数値置き換えのプレフィックスである。入力に‘$$’が含まれる場合、それ‘$’に置き換えられる。これにより、ユーザーが‘$’を“クォート”する手段が与えられる。
環境変数名は‘$’の後に続く一連の英数字(アンダースコアを含む)である。‘$’の後続文字が、‘{’の場合はマッチする‘}’までのすべてが変数名である。
substitute-in-file-name
により生成された出力でsubstitute-in-file-name
を呼び出すと、不正な結果となる傾向がある。たとえば、単一の‘$’をクォートするための‘$$’の使用は正しく機能しないだろうし、環境変数値の中の‘$’は再帰的な置換を導くだろう。したがって、この関数を呼び出して、出力をこの関数に渡すプログラムは、その後の不正な結果を防ぐために、すべての‘$’文字を二重化する必要がある。
以下では、ユーザーのホームディレクトリー名を保持する環境変数HOME
は、値‘/xcssun/users/rms’をもつとする。
(substitute-in-file-name "$HOME/foo") ⇒ "/xcssun/users/rms/foo"
置き換え後は、‘/’の直後に‘~’や別の‘/’が出現した場合、この関数は、‘/’の前にあるすべてを無視する。
(substitute-in-file-name "bar/~/foo") ⇒ "~/foo"
(substitute-in-file-name "/usr/local/$HOME/foo")
⇒ "/xcssun/users/rms/foo"
;; /usr/local/は破棄された
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
一時ファイルに書き込む必要があるプログラムが、いくつかあります。以下は、そのようなファイルを構築する、便利な方法です:
(make-temp-file name-of-application)
make-temp-file
の役目は、2人の異なるユーザー、またはジョブが、完全に一致する名前のファイルの使用を防ぐことです。
この関数は、一時ファイルを作成して、その名前をリターンする。Emacsは、Emacsの各ジョブごとに異なるランダムないくつかの文字をprefixに追加することにより、一時ファイルの名前を作成する。結果として新たに空のファイルが作成されることが保障される。MS-DOSでは、8+3のファイル名制限に適合するよう、文字列stringは切り詰められる可能性がある。prefixが相対ファイル名の場合、それはtemporary-file-directory
にたいして展開される。
(make-temp-file "foo") ⇒ "/tmp/foo232J6v"
make-temp-file
がリターンした際、一時ファイルは空で作成される。この時点で、そのファイルに意図するコンテンツを書き込むべきである。
dir-flagがnil
の場合、make-temp-file
は空のファイルのかわりに、空のディレクトリーを作成する。これはディレクトリー名ではなく、ディレクトリーのファイル名をリターンする。Directory Namesを参照のこと。
suffixが非nil
の場合、make-temp-file
はそれをファイル名の最後に追加する。
同じEmacs内で実行される異なるライブラリー間での競合を防ぐために、make-temp-file
を使用する各Lispプログラムがプログラム自身のprefixを使用するべきである。prefixの最後に追加される数字は、異なるEmacsジョブ内で実行される、同じアプリケーションを区別する。追加される文字により、同一のEmacsジョブ内でも、多数の名前を区別することが可能になる。
一時ファイル用のデフォルトディレクトリーは、変数temporary-file-directory
により制御されます。この変数により、すべての一時ファイルにたいして、ユーザーがディレクトリーを指定する、一貫した方法が与えられます。small-temporary-file-directory
が非nil
の場合は、かわりにそれを使うプログラムもいくつかあります。これを使う場合は、make-temp-file
を呼び出す前に、正しいディレクトリーにたいしてプレフィックスを展開するべきです。
この変数は、一時ファイル作成用のディレクトリー名を指定する。値はディレクトリー名であるべきだが、もし値がディレクトリーのファイル名(Directory Namesを参照)ならば、Lispプログラムがかわりに対処すればよい。expand-file-name
の2つ目の引数としてその値を使用するのは、それを達成するよい方法である。
デフォルト値は、オペレーティングシステムにたいして適切な方法により決定される。これは環境変数TMPDIR
、TMP
、TEMP
にもとづき、これらの変数が定義されていなければ、システム依存の名前にフォールバックする。
一時ファイルの作成にmake-temp-file
を使用しない場合でも、一時ファイルを置くディレクトリーを判断するために、依然としてこの変数を使用するべきである。しかし、一時ファイルが小さくなることを求める場合は、small-temporary-file-directory
が非nil
ならば、それを使用するべきである。
この変数は、小さいかもしれない特定の一時ファイル作成用のディレクトリー名を指定する。
小さくなるかもしれない一時ファイルに書き込みたい場合は、以下のようにディレクトリーを計算するべきである:
(make-temp-file (expand-file-name prefix (or small-temporary-file-directory temporary-file-directory)))
この関数は、一意なファイル名として使用できる文字列を生成する。この名前はbase-nameで始まり、それに各Emacsジョブごとに異なる、複数のランダムな文字を追加したものである。これはmake-temp-file
と似ているが、(i)名前だけを作成し、ファイルは作成しない、(ii)base-nameは絶対ファイル名であること、という点が異なる(MS-DOSシステムでは、8+3ファイル名制限に適合するよう、base-nameが切り詰められる)。
警告: この関数を使用するべきではない。かわりにmake-temp-file
を使用すること!
この関数は、競合状態の影響を受けやすい。make-temp-name
呼び出しと一時ファイル作成のタイムラグは、セキュリティーホールとなる場合があるかもしれない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ファイル名を補完するための、低レベルサブルーチンについて説明します。より高レベルの関数については、Reading File Namesを参照してください。
この関数は、ディレクトリーdirectory内で、partial-filenameで始まる名前のファイルにたいして、すべての補完可能なリストをリターンする。補完の順番はそのディレクトリー内でのファイル順序であり、これは予測不能で何の情報ももたない。
引数partial-filenameは非ディレクトリーパートを含むファイル名でなければならず、スラッシュ(いくつかのシステムではバックスラッシュ)が含まれていてはならない。directoryが絶対ディレクトリーでない場合は、directoryの前にカレントバッファーのデフォルトディレクトリーが追加される。
以下の例では、~rms/lewisがカレントデフォルトディレクトリーで、名前が‘f’で始まる5つのファイルfoo、file~、file.c、file.c.~1~、file.c.~2~があるものとする:
(file-name-all-completions "f" "") ⇒ ("foo" "file~" "file.c.~2~" "file.c.~1~" "file.c")
(file-name-all-completions "fo" "") ⇒ ("foo")
この関数は、ディレクトリーdirectory内で、ファイル名filenameを補完する。これはディレクトリーdirectory内で、filenameで始まるすべてのファイル名にたいして、最長の共通プレフィックスをリターンする。predicateが非nil
の場合は、この関数を1引数で呼び出して絶対ファイル名に展開後、predicateを満足しない補完候補を無視する。
マッチが1つだけ存在し、かつfilenameが正確にそれにマッチする場合、関数はt
をリターンする。関数は、ディレクトリーdirectoryがfilenameで始まる名前のファイルを含まない場合は、nil
をリターンする。
以下の例では、~rms/lewisがカレントデフォルトディレクトリーで、名前が‘f’で始まる5つのファイルfoo、file~、file.c、file.c.~1~、file.c.~2~があるものとする:
(file-name-completion "fi" "") ⇒ "file"
(file-name-completion "file.c.~1" "") ⇒ "file.c.~1~"
(file-name-completion "file.c.~1~" "") ⇒ t
(file-name-completion "file.c.~3" "") ⇒ nil
file-name-completion
は通常、このリスト内の任意の文字列で終わるファイル名を無視する。すべての可能な補完がこれらのサフィックスのいずれか1つで終わるときは、それらを無視しない。この変数は、file-name-all-completions
に影響しない。
典型的な値は、以下のようになる:
completion-ignored-extensions ⇒ (".o" ".elc" "~" ".dvi")
completion-ignored-extensions
のある要素がスラッシュ‘/’で終わる場合、それはディレクトリーを示す。スラッシュで終わらない要素がディレクトリーにマッチすることは決してない。したがって、上記の値はfoo.elcという名前のディレクトリーを除外しないだろう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispプログラムが特定の用途のために標準的なファイル名を指定する必要がある場合があります。典型的には、カレントユーザーにより指定された設定データを保持する場合がそうです。そのようなファイルは通常、user-emacs-directory
により指定されるディレクトリーに置かれ、デフォルトでは~/.emacs.dです(The Init Fileを参照)。たとえば、abbrev(abbreviation:
省略形)の定義は、デフォルトでは~/.emacs.d/abbrev_defsに格納されます。このようなファイル名を指定するには、関数locate-user-emacs-file
を使用するのが、もっとも簡単な方法です。
この関数は、Emacs特有の設定ファイル、またはデータファイルにたいする絶対ファイル名をリターンする。引数base-nameは、ソファイル名であること。リターン値は、user-emacs-directory
で指定されるディレクトリー内の絶対ファイル名である。このディレクトリーが存在しない場合、この関数はディレクトリーを作成する。
オプション引数old-nameが非nil
の場合、それはユーザーのホームディレクトリー内のファイル~/old-nameを指定する。そのようなファイルが存在する場合、リターン値はbase-nameで指定されるファイルではなく、そのファイルの絶対ファイル名となる。これは、Emacsパッケージが後方互換を提供するために使用されることを意図した引数である。たとえば、user-emacs-directory
導入前、abbrevファイルは~/.abbrev_defsに置かれていた。以下は、abbrev-file-name
の定義である:
(defcustom abbrev-file-name (locate-user-emacs-file "abbrev_defs" ".abbrev_defs") "Default name of file from which to read abbrevs." … :type 'file)
ファイル名の標準化のための低レベル関数はconvert-standard-filename
で、これはサブルーチンとしてlocate-user-emacs-file
により使用される。
この関数は、filenameにもとづき、カレントオペレーティングシステムの慣習に適合するファイル名をリターンする。
GNUおよびUnixシステムでは、これは単にfilenameをリターンする。その他のオペレーティングシステムでは、システム固有のファイル名規約にしたがうだろう。たとえばMS-DOSでは、この関数はMS-DOSファイル名制限にしたがうよう、先頭の‘.’を‘_’に変換したり、‘.’の後続の文字を3文字に切り詰める等、さまざまな変更を行う。
この関数でGNUおよびUnixシステムの慣習に適合する名前を指定して、それをconvert-standard-filename
に渡すのが推奨される使用方法である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ディレクトリーとはファイルの一種で、さまざまな名前のファイルを含んでいます。ディレクトリーは、ファイルシステムの機能です。
Emacsはディレクトリー内のファイル名をLispのリストとして一覧したり、シェルコマンドls
を使用してバッファー内にファイル名を表示することができます。後者の場合、Emacsはオプションで各ファイルに関する情報も表示でき、それはls
コマンドに渡すオプションに依存します。
この関数は、ディレクトリーdirectory内のファイルの名前のリストをリターンする。デフォルトでは、このリストはアルファベット順である。
full-nameが非nil
の場合、この関数はファイルの絶対ファイル名をリターンし、それ以外は指定されたディレクトリーにたいする相対ファイル名をリターンする。
match-regexpが非nil
の場合、この関数はその正規表現にたいするマッチを含むファイル名だけをリターンし、それ以外のファイル名はリストから除外される。大文字小文字を区別するファイルシステムでは、大文字小文字を区別する正規表現マッチングが行われる。
nosortが非nil
の場合、directory-files
はリストをソートしないので、取得するファイル名に特定の順序はない。最大限の可能なスピードを得る必要があり、ファイル処理順を気にしない場合は、この関数を使用する。ユーザーから処理順が可視の場合は、名前をソートすれば、おそらくユーザーはより幸せになるだろう。
(directory-files "~lewis") ⇒ ("#foo#" "#foo.el#" "." ".." "dired-mods.el" "files.texi" "files.texi.~1~")
directoryが読み取り可能なディレクトリー名でない場合は、エラーがシグナルされる。
これは、どのファイルを報告するか、およびファイル名を報告する方法において、directory-files
と似ている。しかし、この関数はファイル名のリストをリターンするかわりに、各ファイルごとにリスト(filename
.
attributes)
をリターンする。ここでattributesは、そのファイルにたいしてfile-attributes
がリターンするであろう値である。オプション引数id-formatは、file-attributes
の対応する引数と同じ意味をもつ(Definition of file-attributesを参照)。
この関数は、ワイルドカードパッケージpatternを展開して、それにマッチするファイル名のリストをリターンする。
絶対ファイル名としてpatternが記述された場合は、値も絶対ファイル名になる。
patternが相対ファイル名で記述されている場合、それはカレントデフォルトディレクトリーにたいして相対的に解釈される。リターンされるファイル名も、通常はカレントデフォルトディレクトリーにたいする相対ファイル名になる。しかしfullが非nil
の場合は、絶対ファイル名がリターンされる。
この関数は、ls
のswitchesに対応するフォーマットで、(カレントバッファー内に)ディレクトリーfileのディレクトリーリストを挿入する。これは、挿入したテキストの後にポイントを残す。switchesにはオプション文字列、または個別のオプションを表す文字列リストを指定できる。
引数fileにはディレクトリー名、またはワイルドカード文字を含むファイル名を指定できる。wildcardが非nil
の場合、fileはワイルドカードを伴うファイル指定として扱われることを意味する。
full-directory-pが非nil
の場合、ディレクトリーリストにたいしてディレクトリーの完全なコンテンツ表示を要求することを意味する。fileがディレクトリーで、スイッチに‘-d’が含まれないときは、t
を指定するべきである(ls
へのオプション‘-d’は、ディレクトリーのコンテンツではなく、ファイルとしてディレクトリーを表示するよう指定する)。
ほとんどのシステムでは、この関数は変数insert-directory-program
の名前のディレクトリーリスト用プログラムを実行することにより機能する。wildcardが非nil
の場合は、ワイルドカード展開するために、shell-file-name
で指定されるシェルの実行も行う。
MS-DOSおよびMS-Windowsシステムは、標準的なUnixプログラムls
を欠くので、この関数はLispコードでls
をエミュレートする。
技術的な詳細としては、switchesにロングオプション‘--dired’が含まれる際にinsert-directory
は、diredのためにこれを特別に扱う。しかし他のオプションと同様、通常は等価なショートオプション‘-D’が単にinsert-directory-program
に渡されるだけである。
この変数の値は、関数insert-directory
用にディレクトリーリストを生成するプログラムである。この値は、Lispコードでリストを生成するシステムでは無視される。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs
Lispのファイル操作関数のほとんどは、ディレクトリーであるようなファイルに使用されたときはエラーとなります。たとえば、delete-file
でディレクトリーの削除はできません。以下のスペシャルカは、ディレクトリーの作成と削除を行うために存在します。
このコマンドは、dirnameという名前のディレクトリーを作成する。parentsが非nil
の場合(インタラクティブな呼び出しでは、常に非nil
となる)、その親ディレクトリーがまだ存在しなければ、最初にそれを作成することを意味する。
mkdir
は、これにたいするエイリアスである。
このコマンドは、dirnameという名前のディレクトリーを、newnameにコピーする。newnameが既存のディレクトリーの場合、dirnameはそれのサブディレクトリーにコピーされるだろう。
これは、常にコピーされるファイルのファイルモードを、対応する元のファイルモードに一致させる。
3つ目の引数keep-timeが非nil
の場合は、コピーされるファイルの修正時刻を保持することを意味する。プレフィックス引数を与えると、keep-timeが非nil
になる。
4つ目の引数parentsは、親ディレクトリーが存在しない場合に作成するかどうかを指定する。インタラクティブな場合、これはデフォルトで発生する。
5つ目の引数copy-contentsが非nil
の場合、それはnewnameが既存のディレクトリーならば、そのサブディレクトリーとしてdirnameをコピーするかわりに、dirnameのコンテンツをnewnameにコピーする。
このコマンドは、dirnameという名前のディレクトリーを削除する。関数delete-file
はディレクトリーであるようなファイルにたいしては機能しない。それらにたいしては、delete-directory
を使用しなければならない。recursiveがnil
で、ディレクトリー内にファイルが存在する場合、delete-directory
はエラーをシグナルする。
delete-directory
は、親ディレクトリーの階層のシンボリックリンクだけをフォローする。
オプション引数trashが非nil
、かつ変数delete-by-moving-to-trash
が非nil
の場合、このコマンドはファイルを削除するかわりに、システムのTrash(ゴミ箱)にファイルを移動する。Miscellaneous File Operations in The GNU Emacs
Manualを参照のこと。インタラクティブに呼び出された際は、プレフィックス引数がない場合trashはt
、それ以外はnil
である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
特定のファイル名にたいして、特別な処理を実装できます。これは、それらの名前のmagic化と呼ばれます。この機能は主に、リモートファイルにたいするアクセスの実装に使用されます(Remote Files in The GNU Emacs Manualを参照)。
magicファイル名を定義するには、名前クラスを定義するための正規表現、およびそれにマッチするファイル名にたいするEmacsファイル操作プリミティブすべてを実装するハンドラーを定義しなければなりません。
変数file-name-handler-alist
は各ハンドラーに適用するときを決定する正規表現とともに、ハンドラーのリストを保持します。各要素は、以下の形式をもちます:
(regexp . handler)
ファイルアクセス、およびファイル名変換にたいするすべてのEmacsプリミティブは、file-name-handler-alist
にたいして与えられたファイル名をチェックします。そのファイル名がregexpにマッチした場合、そのプリミティブがhandlerを呼び出してファイルを処理します。
handlerの1つ目の引数には、プリミティブの名前をシンボルとして与えます。残りの引数は、そのプリミティブに引数として渡されます(これらの引数の1つ目は、ほとんどの場合はファイル名自体である)。たとえば以下を行い:
(file-exists-p filename)
filenameがハンドラーhandlerをもつ場合、handlerは以下のように呼び出されます:
(funcall handler 'file-exists-p filename)
関数が2つ以上の引数をとる場合、それらはファイル名でなければならず、関数はそれらのファイル名それぞれにたいしてハンドラーをチェックします。たとえば、
(expand-file-name filename dirname)
以下を行った場合は、filenameにたいするハンドラーをチェックした後、dirnameにたいするハンドラーをチェックします。どちらの場合も、handlerは以下のように呼び出されます:
(funcall handler 'expand-file-name filename dirname)
その後、handlerはfilenameとdirnameのどちらを処理するか解決する必要があります。
指定されたファイル名が2つ以上のハンドラーにマッチする場合は、ファイル名内で最後に開始するマッチが優先されます。リモートファイルアクセスのようなジョブにたいするハンドラーに先立ち、解凍のようなジョブにたいするハンドラーが最初に処理されるように、このルールが選択されました。
以下は、magicファイル名ハンドラーが処理する操作です:
access-file
、add-name-to-file
、byte-compiler-base-file-name
、
copy-directory
、copy-file
、delete-directory
、delete-file
、diff-latest-backup-file
、directory-file-name
、directory-files
、directory-files-and-attributes
、dired-compress-file
、dired-uncache
、
expand-file-name
、file-accessible-directory-p
、file-acl
、file-attributes
、file-directory-p
、file-equal-p
、file-executable-p
、file-exists-p
、file-in-directory-p
、file-local-copy
、file-modes
、file-name-all-completions
、file-name-as-directory
、file-name-completion
、file-name-directory
、file-name-nondirectory
、file-name-sans-versions
、file-newer-than-file-p
、file-notify-add-watch
、file-notify-rm-watch
、file-ownership-preserved-p
、file-readable-p
、file-regular-p
、file-remote-p
、file-selinux-context
、file-symlink-p
、file-truename
、file-writable-p
、find-backup-file-name
、get-file-buffer
、insert-directory
、insert-file-contents
、
load
、make-auto-save-file-name
、make-directory
、make-directory-internal
、make-symbolic-link
、
process-file
、rename-file
、set-file-acl
、set-file-modes
、set-file-selinux-context
、set-file-times
、set-visited-file-modtime
、shell-command
、start-file-process
、substitute-in-file-name
、
unhandled-file-name-directory
、vc-registered
、verify-visited-file-modtime
、
write-region
insert-file-contents
にたいするハンドラーは通常、visit引数が非nil
の場合は、(set-buffer-modified-p
nil)
によりそのバッファーの変更フラグをクリアーする必要があります。これには、もしそのバッファーがロックされていたら、ロックを解除する効果もあります。
ハンドラー関数は上記すべての操作を処理しなければならず、他の操作が将来追加される可能性もあります。これらの操作自体すべてを実装する必要はありません — 特定の操作にたいして特別なことを行う必要がないときは、その操作を“通常の方法”で処理するよう、そのプリミティブを再呼び出しできます。認識できない操作にたいしては、常にそのプリミティブを再呼び出しするべきです。以下は、これを行う方法の1つです:
(defun my-file-handler (operation &rest args) ;; 特別に処理する必要がある、 ;; 特別な操作を最初にチェックする (cond ((eq operation 'insert-file-contents) …) ((eq operation 'write-region) …) … ;; 関知しないその他の操作を処理する (t (let ((inhibit-file-name-handlers (cons 'my-file-handler (and (eq inhibit-file-name-operation operation) inhibit-file-name-handlers))) (inhibit-file-name-operation operation)) (apply operation args)))))
ハンドラー関数が通常のEmacsプリミティブを呼び出す決定をした際は、無限再起を引き起こすような、同一ハンドラーからのプリミティブの再呼び出しを防ぐ必要があります。上記の例では、変数inhibit-file-name-handlers
とinhibit-file-name-operation
により、これを行う方法を示しています。上記の例のように、これらを正確に使用するよう、注意してください。複数ハンドラーの正しい振る舞い、およびそれぞれがハンドラーをもつかもしれない2つのファイル名にたいする操作にたいする詳細は、非常に重要です。
ファイルへの実アクセスにたいして実際には特別なことを行わないハンドラー(たとえばリモートファイル名にたいしてホスト名の補完を実装するハンドラーなど)は、safe-magic
プロパティに非nil
をもつべきです。たとえば、Emacsは通常はPATH
内で見い出されるようなディレクトリーが、プレフィックス‘/:’によりmagicファイル名に見えるような場合に、magicファイル名にならないよう“保護”します。しかし、safe-magic
プロパティに非nil
をもつハンドラーがそれらにたいして使用された場合、‘/:’は追加されません。
ファイル名ハンドラーは、普通とは異なる方法でそれを処理(handle)するのが、どの操作(operation)なのかを宣言するために、operations
プロパティをもつことができます。このプロパティが非nil
値をもつ場合、それは操作のリストであるべきです。その場合は、それらの操作だけがハンドラーを呼び出すでしょう。これは無駄を省きますが、主な目的はオートロードされるハンドラー関数が実際に処理を行うとき以外はロードされないようにすることです。
通常のプリミティブにたいして、単にすべての操作を延期するのは、機能しません。たとえば、ファイル名ハンドラーがfile-exists-p
にたいして適用された場合は、通常のload
コードは正しく機能しないでしょうから、ハンドラー自身でload
を処理しなければなりません。しかし、ハンドラーがfile-exists-p
プロパティを使用して、file-exists-p
を処理しないことを宣言した場合は、普通とは異なる方法でload
を処理する必要はなくなります。
この変数は、特定の操作にたいして現在のところ使用を抑制されているハンドラーのリストを保持する。
特定のハンドラーにたいして、現在のところ抑制されている操作。
この関数は、fileというファイル名にたいするハンドラー関数、それが存在しなければnil
をリターンする。引数operationは、そのファイルを処理する操作であること。これは、ハンドラー呼び出し時に1つ目の引数として渡すことになる値である。operationがinhibit-file-name-operation
と等しい、またはそのハンドラーのoperations
内に存在しない場合、この関数はnil
をリターンする。
この関数は、ファイルfilenameがまだローカルマシン上にない場合は、それをローカルマシン上の通常の非magicファイルにコピーする。magicファイル名は、それらが他のマシン上のファイルを参照する場合は、file-local-copy
操作を処理するべきである。リモートファイルアクセス以外の目的にたいして使用されるmagicファイル名は、file-local-copy
を処理するべきではない。その場合、この関数はそのファイルをローカルファイルとして扱うだろう。
filenameがローカルの場合、それがmagicか否かにかかわらず、この関数は何も行わずに、nil
をリターンする。それ以外では、ローカルコピーファイルのファイル名をリターンする。
この関数は、filenameがリモートファイルかどうかをテストする。filenameがローカル(リモートではない)の場合、リターン値はnil
である。filenameが正にリモートの場合、リターン値はそのリモートシステムを識別する文字列である。
この識別子文字列は、ホスト名とユーザー名、およびリモートシステムへのアクセスに使用されるメソッドを表す文字列も同様に含めることができる。たとえば、ファイル名/sudo::/some/file
にたいするリモート識別子文字列は、/sudo:root@localhost:
となる。
2つの異なるファイルにたいしてfile-remote-p
が同じ識別子をリターンした場合は、それらが同じファイルシステム上に格納されていて、互いに配慮しつつアクセス可能であることを意味する。これはたとえば、同時に両方のファイルにアクセスするリモートプロセスを開始することが可能なことを意味する。ファイルハンドラーの実装者は、この方式を保証する必要がある。
identificationは、文字列としてリターンされるべき識別子の一部を指定する。identificationにはmethod
、user
、host
のシンボルを指定できる。他の値はすべてnil
のように扱われ、それは完全な識別子文字列をリターンすることを意味する。上記の例では、リモートのuser
識別子文字列は、root
になるだろう。
connectedが非nil
の場合、たとえfilenameがリモートであっても、Emacsがそのホストにたいする接続をもたない場合、この関数はnil
をリターンする。これは、接続が存在しない際の接続の遅延を回避したいときに有用である。
この関数は、magicではないディレクトリーの名前をリターンする。これは、filenameがmagicでなければ、それのディレクトリーパートを使用する。magicファイル名にたいしては、何の値をリターンするかを決定するために、ファイル名ハンドラーを呼び出す。filenameがローカルプロセスからアクセス不能な場合、ファイル名ハンドラーはnil
をリターンすることにより、それを示すべきである。
これは、サブプロセスの実行に有用である。すべてのサブプロセスは、自身が属すカレントディレクトリーとして非magicディレクトリーをもたなければならず、この関数はそれを導出するよい手段である。
リモートファイルの属性は、よりよいパフォーマンスのためにキャッシュすることができる。キャッシュがEmacsの制御外で変更された場合、そのキャッシュ値は無効になり、再読込しなければならない。
この変数がnil
にセットされていると、キャッシュ値は決して失効しない。このセッティングは、Emacs以外にリモートファイルを変更するものがないことが確実な場合のみ、慎重に使用すること。これがt
にセットされていると、キャッシュ値は決して使用されない。これはもっとも安全な値であるが、パフォーマンスは低下するかもしれない。
折衷的な値としては、これを正の数字にセットする。これは、キャッシュされてからその数字の秒数の間は、キャッシュ値を使用することを意味する。リモートファイルが定期的にチェックされる場合には、この変数を定期的なチェックの間隔より小さい値にletバインドするのは、よい考えかもしれない。たとえば:
(defun display-time-file-nonempty-p (file) (let ((remote-file-name-inhibit-cache (- display-time-interval 5))) (and (file-exists-p file) (< 0 (nth 7 (file-attributes (file-chase-links file)))))))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsは、バッファー内のデータ(テキスト、テキストプロパティ、あるいはその他の情報)と、ファイル名に格納するのに適した表現との間で双方向の変換をするために、複数のステップを処理します。このセクションでは、このフォーマット変換(format
conversion)を行う基本的な関数、すなわちファイルをバッファーに読み込むinsert-file-contents
と、バッファーをファイルに書き込むwrite-region
を説明します。
24.12.1 Overview | insert-file-contents とwrite-region
| |
24.12.2 Round-Trip Specification | format-alist の使用。
| |
24.12.3 Piecemeal Specification | 非ペアー変換の指定。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数insert-file-contents
:
format-alist
のエントリーにより定義されているようにフォーマット処理して、
after-insert-file-functions
内の関数を呼び出す。
関数write-region
:
write-region-annotate-functions
内の関数を呼び出し、
format-alist
のエントリーにより定義されているようにフォーマット処理して、
これは、もっとも低レベルでの操作を対照的に示したもので、対象の読み取りと書き込みの処理が逆順で対応しています。このセクションの残りでは、上記で名前のでた3つの変数を取り囲む2つの機能と、いくつかの関連する関数を説明します。文字のエンコードとデコードについての詳細は、Coding Systemsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
読み取りと書き込みのもっとも一般的な機能は、変数format-alist
で制御されます。これはファイルフォーマット(file
format)仕様のリストで、Emacsバッファー内のデータにたいして、ファイル内で使用されるテキスト表現を記述します。読み取りと書き込みの仕様記述はペアーになっており、わたしたちがそれを“ラウンドトリップ(round-trip)”仕様と呼ぶのは、これが理由です(非ペアー仕様については、see section Piecemeal Specificationを参照)。
このリストには、定義されるファイルフォーマットごとに、1つのフォーマット定義が含まれる。フォーマット定義はそれぞれ、以下の形式のリストである:
(name doc-string regexp from-fn to-fn modify mode-fn preserve)
以下は、フォーマット定義内で要素がもつ意味である:
フォーマットの名前。
フォーマットのドキュメント文字列。
このフォーマットで表現されるファイルの認識に使用される正規表現。nil
の場合、フォーマットが自動的に適用されることは決してない。
このフォーマットのデータをデコードする、(ファイルデータを通常のEmacsデータ表現に変換するための)シェルコマンド、または関数。
シェルコマンドは文字列として表され、Emacsはそのコマンドを、変換処理のためのフィルターとして実行する。
from-fnが関数の場合、それは変換するべきバッファー部分を指定する2つの引数、beginとendで呼び出される。これは、インプレースでテキストを編集することにより変換を行うべきである。これはテキスト長を変更する可能性があるので、from-fnは変更されたend位置をリターンすること。
ファイルの先頭が、この変換によりregexpにマッチしないようにするのは、from-fnの役目の1つである。そうでないと、おそらく再度変換が呼び出される。
このフォーマットのデータをエンコード、すなわち通常のEmacsデータ表現をこのフォーマットに変換するためのシェルコマンド、または関数。
to-fnが文字列の場合、それはシェルコマンドである。Emacsは変換処理のためのフィルターとして、このコマンドを実行する。
to-fnが関数の場合、それは3つの引数で呼び出される。beginとendは変換されるべきバッファー部分、bufferでそれがどのバッファーかを指定する。変換を行うには、2つの方法がある:
(position
.
string)
という形式の要素をもつリストで、positionは書き込まれるテキスト内での相対位置を指定する整数、stringはそこに追加される注釈である。このリストは、to-fnがそれをリターンする際、位置順でソートされていなければならない。
write-region
が実際にバッファーからファイルにテキストを書き込む際には、指定された注釈を対応する位置に混合する。これはすべて、バッファーを変更せずに行われる。
フラグ。エンコード関数がバッファーを変更する場合はt
、注釈リストをリターンすることにより機能する場合はnil
。
このフォーマットから変換されたファイルをvisit後に呼び出される、マイナーモード関数。この関数は1つの引数で呼び出され、それが整数1の場合、マイナーモード関数はそのモードを有効にする。
フラグ。format-write-file
がbuffer-file-format
からこのフォーマットを取り除くべきでない場合はt
。
関数insert-file-contents
は、指定されたファイルを読み込む際にファイルフォーマットを自動的に認識します。これは、フォーマット定義の正規表現にたいしてファイルの先頭テキストをチェックして、マッチが見つかった場合は、そのフォーマットにたいするデコード関数を呼び出します。その後は再度、既知のフォーマットすべてをチェックします。適用できるフォーマットがない間は、チェックを続行します。
find-file-noselect
、またはそれを使用するコマンドでファイルをvisitすることにより、同じように変換が行われます(内部でinsert-file-contents
を呼び出すため)。さらに、それをデコードする各フォーマットのモード関数も呼び出します。これは、バッファーローカル変数buffer-file-format
内に、フォーマット名のリストを格納します。
この変数は、visitしているファイルのフォーマットを表す。より正確には、これはカレントバッファーのファイルをvisitに起因するデコードのファイルフォーマット名のリストである。これは、すべてのバッファーにたいして、常にローカルである。
write-region
がデータをファイルに書き込む際には、まずbuffer-file-format
にリストされたフォーマットにたいするエンコード関数を、リスト内での出現順に呼び出します。
このコマンドは、カレントバッファーのコンテンツを、フォーマット名のリストformatにもとづいたフォーマットで、ファイルfileに書き込む。これはformatを起点に、buffer-file-format
の値からpreserveフラグ(上記参照)が非nil
の要素にたいして、それがまだformat内に存在しない場合は、任意の個数それらを追加する。その後、将来の保存においてデフォルトとなるよう、このフォーマットでbuffer-file-format
を更新する。format引数を除き、このコマンドはwrite-file
と似ている。特に、confirmはwrite-file
での対応する引数と、意味およびinteractiveでの扱いが同じである。Definition of write-fileを参照のこと。
このコマンドは、ファイルfileを探して、それをフォーマットformatにしたがって変換する。これは、後でそのバッファーを保存する場合に、formatをデフォルトにすることも行う。
引数formatは、フォーマット名のリストである。formatがnil
の場合、何の変換も行われない。interactiveに呼び出した場合は、formatにたいして単にRETをタイプすると、nil
が指定される。
このコマンドは、ファイルfileのコンテンツを、フォーマットformatにしたがって変換して挿入する。begとendが非nil
の場合、それはinsert-file-contents
と同様、ファイルのどの部分を読み込むかを指定する(Reading from Filesを参照)。
リターン値は、絶対ファイル名のリスト、および挿入されたデータの長さ(変換後)であり、これはinsert-file-contents
がリターンするものと同様である。
引数formatは、フォーマット名のリストである。formatがnil
の場合、何の変換も行われない。interactiveに呼び出した場合は、formatにたいして単にRETをタイプすると、nil
が指定される。
この変数は、自動保存(auto-saving)にたいして使用するフォーマットを指定する。値はbuffer-file-format
と同様、ファイル名のリストであるが、これはauto-saveファイルへの書き込みで、buffer-file-format
のかわりに使用される。値がt
(デフォルト)の場合、自動保存は当バッファーの通常の保存時と同じフォーマットを使用する。この変数は、すべてのバッファーにおいて、常にバッファーローカルである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
前のサブセクション(Round-Trip Specificationを参照)で説明したラウンドトリップ指定とは対照的に、変数after-insert-file-functions
とwrite-region-annotate-functions
を使用して、読み取りと書き込みの変換を個別に制御できます。
変換は、ある表現を起点として、他の表現を生成します。これを行う変換が1つだけのときは、何を起点とするかに関して競合は存在しません。しかし、複数の変換呼び出しが存在する場合、同じデータを起点にする必要がある2つの変換の間に、競合が発生するかもしれません。
この状況を理解するには、write-region
中のテキストプロパティの変換コンテキストが最善です。たとえば、あるバッファーの位置42の文字が‘X’で、それのテキストプロパティがfoo
だとします。foo
にたいする変換が、たとえばそのバッファーに‘FOO:’を挿入することにより行われる場合、それは位置42の文字‘X’を‘F’に変更します。そして次の変換は、間違ったデータを起点に開始されるでしょう。
競合を避けるためには、協調的な変換がバッファーを変更せずに、position昇順でソートされた、(position
. string)
という形式の要素をもつリストを、注釈(annotations)に指定します。
2つ以上の変換が存在する場合、write-region
はそれらの注釈を、1つのソート済みリストに破壊的にマージします。後でそのバッファーのテキストを実際にファイルに書き込む際に、対応する位置にある指定された注釈を混合します。これはすべて、バッファーを変更せずに行われます。
これとは対照的に、読み取り時にはそのテキストの混合された注釈は、即座に処理されます。insert-file-contents
は、変更される何らかのテキストの先頭にポイントをセットしてから、そのテキストの長さで変換関数を呼び出します。これらの関数は常に、挿入されるテキストの先頭のポイントをリターンするべきです。最初の変換により注釈が削除されても、その後の変換が誤って処理することはないので、このアプローチは読み取りに際しては正しく機能します。すべての変換関数は、それが認識する注釈のスキャン、その注釈の削除、バッファーテキストの変更(たとえばテキストプロパティのセット等)、およびそれらの変更に由来する更新されたテキスト長のリターンを行うべきです。1つの関数によりリターンされた値は、次の関数への引数になります。
write-region
にたいして呼び出す、関数のリスト。リスト内の各関数は、書き込まれるリージョンの開始と終了の、2つの引数で呼び出される。これらの関数は、そのバッファーのコンテンツを変更するべきではない。かわりに注釈をリターンすること。
特別なケースとして、関数がカレントと異なるバッファーをリターンするかもしれない。Emacsはこれを、カレントバッファーが出力される変更されたテキストを含むものとして理解する。つまり、Emacsはwrite-region
呼び出しの引数startとendを、新たなバッファーのpoint-min
とpoint-max
に変更して与える。さらに、以前のすべての注釈はこの関数により処理されるので、Emacsはそれらの破棄も行う。
この変数の値が非nil
の場合、それは関数であること。この関数は、write-region
完了後に引数なしで呼び出される。
write-region-annotate-functions
内のある関数がカレントと異なるバッファーをリターンした場合、Emacsはwrite-region-post-annotation-function
を複数回呼び出す。Emacsは最後にカレントだったバッファーでそれを呼び出し、その前にカレントだったバッファーで再度これを呼び出す、...のようにして元のバッファーに戻る。
したがって、write-region-annotate-functions
内の関数は、バッファーを作成して、kill-buffer
のそのバッファーでのローカル値にこの変数を与え、変更されたテキストでそのバッファーをセットアップして、そのバッファーをカレントにすることができる。そのバッファーは、write-region
完了後にkillされるだろう。
このリスト内の各関数は、挿入されるテキストの先頭にポイントがある状態で、挿入される文字数を1つの引数として、insert-file-contents
により呼び出される。すべての関数はポイントを未変更のまま、その関数によって変更された、挿入後テキストの新たな文字数をリターンするべきである。
わたしたちは、ユーザーがファイル内にテキストプロパティを格納したりそれらを取得するために、そしてさまざまなデータフォーマットを体験することにより、適切なフォーマットを見つけるために、これらのフックを使用してLispプログラムを記述することを推奨します。最終的には、わたしたちがEmacs内にインストールできる、良質で汎用性のある拡張をユーザーが開発することを望みます。
わたしたちは、テキストプロパティの名前や値として、任意のLispオブジェクトの処理を試みることは推奨しません — なぜなら汎用的なプログラムはおそらく記述が困難で、かつ低速だからです。かわりに、十分な柔軟性をもち、エンコードが難しすぎない、想定されるデータ型のセットを選択してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バックアップファイルおよびauto-save(自動保存)ファイルは、Emacsがクラッシュ、またはユーザー自身のエラーからユーザーの保護を試みるための、2つの手段です。自動保存(auto-saving)は、カレントの編集セッション開始以降のテキストを保存します。一方バックアップファイルは、カレントセッションの前のファイルコンテンツを保存します。
25.1 Backup Files | バックアップファイルの作成と名前選択の方法。 | |
25.2 Auto-Saving | auto-saveファイルの作成と名前選択の方法。 | |
25.3 Reverting | revert-buffer とその動作のカスタマイズ方法。
|
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バックアップファイル(backup file)とは、編集中ファイルの古いコンテンツのコピーです。Emacsは、visitされているファイルにバッファーを最初に保存するとき、バックアップファイルを作成します。したがって、バックアップファイルには通常、カレント編集セッションの前にあったような、ファイルのコンテンツが含まれています。バックアップファイルのコンテンツには、通常は一度存在したバックアップファイルが変更されずに残ります。
バックアップは通常、visitされているファイルを新たな名前にリネームすることにより作成されます。オプションで、バックアップファイルがvisitされているファイルをコピーすることにより作成されるように指定できます。この選択により、複数の名前をもつファイルのときに、違いが生じます。また、編集中のファイルの所有者が元のオーナーのままか、それとも編集ユーザーになるかにも、影響し得ます。
デフォルトでは、Emacsは編集中のファイルごとに、単一のバックアップファイルを作成します。かわりに、番号付きバックアップ(numbered backup)を要求することもできます。その場合は、新たなバックアップファイルそれぞれが、新たな名前を得ます。必要なくなったときは古い番号付きバックアップを削除したり、Emacsがそれらを自動的に削除することもできます。
25.1.1 Making Backup Files | Emacsがバックアップファイルを作成する方法とタイミング。 | |
25.1.2 Backup by Renaming or by Copying? | 2つの選択肢: 古いファイルのリネームとコピー。 | |
25.1.3 Making and Deleting Numbered Backup Files | ソースファイルごとに複数のバックアップを保持する。 | |
25.1.4 Naming Backup Files | バックアップファイル名の計算方法とカスタマイズ。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は、もしそれが適切であれば、カレントバッファーにvisitされているファイルのバックアップを作成する。これは、最初のバッファー保存を行う前に、save-buffer
により呼び出される。
リネームによりバックアップが作成された場合、リターン値は(modes extra-alist
backupname)という形式のコンスセルである。ここでmodesは、file-modes
(Testing Accessibilityを参照)でリターンされるような元ファイルのモードビット、extra-alistはfile-extended-attributes
(Extended File Attributesを参照)によりリターンされるような元ファイルの拡張属性を示すalist、そしてbackupnameはバックアップの名前である。
他のすべての場合(コピーによりバックアップが作成された、またはバックアップが作成されなかった)、この関数はnil
をリターンする。
このバッファーローカル変数は、そのバッファーのファイルがバッファーによりバックアップされたかどうかを明示する。非nil
の場合、バックアップファイルは書き込み済みであり、それ以外では、(バックアップが有効なら)次回保存時にファイルはバックアップされる。この変数は永続的にローカルであり、kill-all-local-variables
はそれを変更しない。
この変数は、バックアップファイルを作成するかどうかを決定する。非nil
の場合、Emacsは初回保存時にすべてのファイルのバックアップを作成する
— ただしbackup-inhibited
がnil
の場合(以下参照)。
以下の例は、Rmailバッファーだけで変数make-backup-files
を変更して、それ以外では変更しない方法を示す。この変数をnil
にセットすると、Emacsはそれらのファイルのバックアップ作成をストップし、それはディスク容量の消費を節約するだろう(あなたは、このコードをinitファイルに配置したいと思うかもしれない)。
(add-hook 'rmail-mode-hook (lambda () (setq-local make-backup-files nil)))
この変数の値は、あるファイルがバックアップファイルをもつべきかどうかを決定する、特定の機会に呼び出される関数である。関数は、判断すべき絶対ファイル名という、1つの引数を受け取る。この関数がnil
をリターンした場合、そのファイルにたいするバックアップは無効になる。それ以外では、このセクション内の他の変数がバックアップ作成の是非と方法を指定する。
デフォルト値はnormal-backup-enable-predicate
で、これはtemporary-file-directory
とsmall-temporary-file-directory
内のファイルをチェックする。
この変数が非nil
の場合、バックアップは抑止される。これは、visitされているファイル名にたいするbackup-enable-predicate
のテスト結果を記録する。さらに、visitされているファイルにたいするバックアップ抑止にもとづくその他機構によっても、使用され得る。たとえば、VCはバージョンコントロールシステムに管理されるファイルのバックアップを防ぐために、この変数を非nil
にセットする。
これは永続的にローカルなので、メジャーモード変更により値は失われない。メジャーモードはこの変数ではなく、かわりにmake-backup-files
をセットするべきである。
この変数の値は、ファイル名パターンとバックアップディレクトリー名のalistである。各要素は以下の形式をもつ
(regexp . directory)
名前がregexpにマッチするファイルのバックアップが、directory内に作成されるだろう。directoryには相対ディレクトリー、または絶対ディレクトリーを指定できる。絶対ディレクトリーの場合は、マッチするすべてのファイルが同じディレクトリー内にバックアップされる。このディレクトリー内でのファイル名は、クラッシュを避けるために、バックアップされるファイルの完全名のすべてのディレクトリー区切りは、‘!’に変更される。結果の名前を切り詰めるファイルシステムでは、これは正しく機能しないだろう。
すべてのバックアップが単一のディレクトリーで行われる一般的なケースでは、alistは‘"."’と適切なディレクトリーからなるペアーの、単一の要素を含むべきである。
この変数がnil
(デフォルト)、またはファイル名のマッチに失敗した場合、バックアップは元のファイルのディレクトリーに作成される。
長いファイル名のないMS-DOSファイルシステムでは、この変数は常に無視される。
この変数の値は、バックアップファイル名を作成する関数である。関数make-backup-file-name
は、これを呼び出す。Naming Backup Filesを参照のこと。
特定のファイルにたいして特別なことを行うために、これをバッファーローカルにすることもできる。変更する場合は、backup-file-name-p
とfile-name-sans-versions
も変更する必要があるかもしれない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsがバックアップファイルを作成できる、2つの方法があります:
デフォルトは、1つ目の方法のリネームです。
変数backup-by-copying
が非nil
の場合、それは2つ目の方法、つまり元のファイルをコピーして、新たなバッファー内容で上書きすることを意味します。変数file-precious-flag
が非nil
の場合にも、(メイン機能の副作用として)この効果があります。Saving Buffersを参照してください。
この変数が非nil
の場合、Emacsは常にコピーによりバックアップファイルを作成する。デフォルトはnil
。
以下の3つの変数が非nil
の際は、ある特定のケースに2つ目の方法が使用されます。その特定のケースに該当しないファイルの処理に影響はありません。
この変数が非nil
の場合、Emacsは複数名(ハードリンク)をもつファイルにたいして、コピーによりバックアップを作成する。デフォルトはnil
。
backup-by-copying
が非nil
の場合は常にコピーによりバックアップが作成されるので、この変数はbackup-by-copying
がnil
のときだけ意味がある。
この変数が非nil
(デフォルト)の場合、リネームによりファイルの所有者、またはグループが変更されるケースでは、Emacsはコピーによりバックアップを作成する。
リネームによりファイルの所有者、またはグループが変更されない場合、値は効果をもたない。つまり、そのディレクトリーで新たに作成されるファイルにたいするデフォルトのグループに属するユーザーにより所有されるファイルが該当する。
backup-by-copying
が非nil
の場合は常にコピーによりバックアップが作成されるので、この変数はbackup-by-copying
がnil
のときだけ意味がある。
この変数が非nil
の場合、特定のユーザーID値(具体的には、特定の値以下のID数値)にたいしてのみ、backup-by-copying-when-mismatch
と同じように振る舞うことを指定する。変数には、その数値をセットする。
したがって、ファイル所有者の変更を防ぐ必要がある際は、backup-by-copying-when-privileged-mismatch
を0にセットすれば、スーパーユーザーだけがコピーによるバックアップを行うことができる。
デフォルトは200。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ファイルの名前がfooの場合、番号付きバックアップのバージョン名はfoo.~v~となります。vはfoo.~1~、foo.~2~、foo.~3~、…、foo.~259~のように、さまざまな整数です。
この変数は、単一の非番号付きバックアップファイルを作成するか、それとも複数の番号付きバックアップを作成するかを制御する。
nil
visitされたファイルが番号付きバックアップの場合は番号付きバックアップを作成し、それ以外は作成しない。これがデフォルトである。
never
番号付きバックアップを作成しない。
番号付きバックアップを作成する。
番号付きバックアップを使用することにより、バックアップのバージョン番号は最終的には非常に大きな番号になるので、それらを削除しなければなりません。Emacsはこれを自動で行うことができ、ユーザーに削除するか確認することもできます。
この変数の値は、新たな番号付きバックアップが作成された際に保持すべき、もっとも新しいバージョンの個数である。新たに作成されたバックアップもカウントされる。デフォルトは2。
この変数の値は、新たな番号付きバックアップが作成された際に保持すべき、もっとも古いバージョンの個数である。デフォルトは2。
番号が1、2、3、5、7のバックアップがあり、かつこれらの変数が値2をもつ場合は、番号が1と2のバックアップは古いバージョンとして保持され、番号が5と7のバックアップは新しいバージョンとして保持される。そして、番号が3のバックアップは、余分なバックアップとなる。関数find-backup-file-name
(Naming Backup Filesを参照)は、どのバージョンのバックアップを削除するかを決定する役目を負うが、この関数自身がバックアップを削除する訳ではない。
この変数がt
の場合は、ファイルの保存により、余分なバージョンのバックアップは、暗黙里に削除される。nil
の場合は、余分なバックアップの削除前に確認を求めることを意味し、それ以外では、余分なバックアップは削除されない。
この変数は、Dired内のコマンド.(ピリオド。dired-clean-directory
)で、もっとも新しいバージョンのバックアップをいくつ保持するかを指定する。これは、新たにバックアップファイルを作成する際に、kept-new-versions
を指定するのと同等である。デフォルトは2。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、主にバックアップファイルの命名規則を再定義してカスタマイズできる関数を記載します。これらの1つを変更した場合は、おそらく残りも変更する必要があります。
この関数は、filenameがバックアップファイルとして利用可能ならば、非nil
値をリターンする。これは名前のチェックだけを行い、filenameという名前のファイルが存在するかどうかはチェックしない。
(backup-file-name-p "foo") ⇒ nil
(backup-file-name-p "foo~") ⇒ 3
この関数の標準的な定義は、以下のようになる:
(defun backup-file-name-p (file) "FILEがバックアップファイルなら\ (番号付きか否かに関わらず)非nilをリターンする" (string-match "~\\'" file))
このように、ファイル名が‘~’で終わる場合、この関数は非nil
値をリターンする(ドキュメント文字列を分割するために、1行目でバックスラッシュを使用しているが、これはドキュメント文字列内で単一行を生成する)。
この単純な式は、カスタマイズのための再定義を簡便にするために、個々の関数内に配されている。
この関数は、ファイルfilenameの非番号付きバックアップファイル名として使用される文字列をリターンする。Unixでは、これは単にfilenameにチルダを追加する。
ほとんどのオペレーティングシステムでは、この関数の標準的な定義は以下のようになる:
(defun make-backup-file-name (file) "FILEにたいして非番号付きバックアップファイル名を作成する" (concat file "~"))
この関数を再定義することにより、バックアップファイルの命名規則を変更できる。以下は、チルダの追加に加えて、先頭に‘.’を追加するよう、make-backup-file-name
を再定義する例である:
(defun make-backup-file-name (filename) (expand-file-name (concat "." (file-name-nondirectory filename) "~") (file-name-directory filename)))
(make-backup-file-name "backups.texi") ⇒ ".backups.texi~"
Diredコマンドのいくつかを含むEmacsの一部では、バックアップファイル名が‘~’で終わると仮定している。この規則にしたがわない場合、深刻な問題とはならないだろうが、それらのコマンドが若干好ましくない結果をもたらすかもしれない。
この関数は、filenameの新たなバックアップファイル用のファイル名を計算する。これは、特定の既存バックアップファイルにたいする削除の提案も行うかもしれない。find-backup-file-name
は、CARが新たなバックアップファイル名で、CDRが削除を提案するバックアップファイルのリストであるようなリストをリターンする。値にはnil
も指定でき、これはバックアップが作成されないことを意味する。
kept-old-versions
およびkept-new-versions
の2つの変数は、どのバージョンのバックアップを保持するべきかを決定する。この関数は、値のCDRから該当するバージョンを除外することにより、それらを保持する。Making and Deleting Numbered Backup Filesを参照のこと。
以下の例の値は、新しいバックアップファイルに使用する名前が~rms/foo.~5~で、~rms/foo.~3~は呼び出し側が今削除を検討するべき“余分”なバージョンであることを示している。
(find-backup-file-name "~rms/foo") ⇒ ("~rms/foo.~5~" "~rms/foo.~3~")
この関数は、filenameにたいするもっとも最近のバックアップファイル名、バックアップファイルがない場合はnil
をリターンする。
ファイル比較関数のいくつかは、自動的にもっとも最近のバックアップを比較できるように、この関数を使用している。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsは、visitしているすべてのファイルを定期的に保存します。これは自動保存(auto-saving)と呼ばれます。自動保存は、システムがクラッシュした場合に失われる作業量を、ある作業量以下にします。デフォルトでは、自動保存は300キーストロークごと、またはidle時の30秒後に発生します。自動保存に関するユーザー向けの情報については、Auto-Saving: Protection Against Disasters in The GNU Emacs Manualを参照してください。ここでは、自動保存の実施に使用される関数と、それらを制御する変数について説明します。
このバッファーローカル変数は、カレントバッファーの自動保存に使用されるファイル名である。そのバッファーが自動保存されるべきでない場合は、nil
。
buffer-auto-save-file-name ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
これはバッファーローカルなマイナーモードであるAuto Saveモードにたいする、モードコマンドである。Auto Saveモードが有効なときは、そのバッファーで自動保存が有効である。呼び出し方は、他のマイナーモードと同様(Conventions for Writing Minor Modesを参照)。
ほとんどのマイナーモードとは異なり、auto-save-mode
変数は存在しない。buffer-auto-save-file-name
が非nil
、かつbuffer-saved-size
(以下参照)が非0ならば、Auto
Saveモードは有効である。
この関数は、filenameがauto-saveファイルのような文字列の場合は、非nil
をリターンする。先頭と末尾がハッシュマーク(‘#’)の名前はauto-saveファイルの可能性があるという、auto-saveファイルにたいする通常の命名規則を想定する。引数filenameは、ディレクトリーパートを含むべきではない。
(make-auto-save-file-name) ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
(auto-save-file-name-p "#backups.texi#") ⇒ 0
(auto-save-file-name-p "backups.texi") ⇒ nil
この関数の標準的な定義は、以下のようになる:
(defun auto-save-file-name-p (filename) "FILENAMEが以下を満たすなら非nilをリターンする" (string-match "^#.*#$" filename))
auto-saveファイルの命名規則規則を変更したいときにカスタマイズできるようにするために、この関数は存在する。これを再定義した場合は、それに対応して関数make-auto-save-file-name
も忘れずに再定義すること。
この関数は、カレントバッファーの自動保存に使用されるファイル名をリターンする。これは、ファイル名の先頭と末尾にハッシュマーク(‘#’)を単に追加する。この関数は、変数auto-save-visited-file-name
(以下参照)を調べない。呼び出し側は、まずその変数をチェックするべきである。
(make-auto-save-file-name) ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
以下は、この関数の標準的な定義の簡略版である:
(defun make-auto-save-file-name () "カレントバッファーの自動保存に使用される\ ファイル名をリターンする" (if buffer-file-name
(concat (file-name-directory buffer-file-name) "#" (file-name-nondirectory buffer-file-name) "#") (expand-file-name (concat "#%" (buffer-name) "#"))))
auto-saveファイルの命名規則をカスタマイズするために再定義できるように、これは独立した関数として存在している。ただし、これに対応した方法でauto-save-file-name-p
も忘れずに変更すること。
この変数が非nil
の場合、Emacsはvisit中のファイルにバッファーを自動保存する。つまり、自動保存は編集中ファイルと同じファイルにたいして行われる。通常この変数はnil
なので、auto-saveファイルはmake-auto-save-file-name
で作成された別の名前をもつ。
この変数の値を変更した際は、バッファー内でauto-saveモードが再度有効になるまで、既存バッファーにたいして新たな値は効果をもたない。すでにauto-saveモードが有効な場合は、再度auto-save-mode
が呼び出されるまで、同じファイルに自動保存が行われる。
この関数は、カレントバッファーが最後に読み込み、または保存されて以降、自動保存されていればt
をリターンする。
この関数は、カレントバッファーを自動保存済みとマークする。そのバッファーは、バッファーテキストが再度変更されるまで、自動保存されないだろう。この関数はnil
をリターンする。
この変数の値は、自動保存の頻度を入力イベント数で指定する。この分の入力イベント読み取りごとに、Emacsは自動保存が有効なすべてのバッファーにたいして、自動保存を行う。これを0にすると、タイプした文字数にもとづく自動保存は無効になる。
この変数の値は、自動保存が発生すべきidle時間の秒数である。この秒数分ユーザーが休止するたびに、Emacsは自動保存が有効なすべてのバッファーにたいして、自動保存を行う(カレントバッファーが非常に大きい場合、指定されたタイムアウトはサイズ増加とともに増加される因子で乗ぜられる。1MBのバッファーにたいして、この因子はおよそ4である)。
値が0、またはnil
の場合、idle時間にもとづく自動保存は行われず、auto-save-interval
で指定される入力イベント数の後のみ自動保存が行われる。
このノーマルフックは、自動保存が行われようとするたびに毎回実行される。
この変数が非nil
の場合は、ファイルをvisitするバッファーの自動保存がデフォルトで有効になり、それ以外では有効にならない。
この関数は、自動保存される必要があるすべてのバッファーを自動保存する。これは自動保存が有効、かつ前回の自動保存以降に変更されたすべてのバッファーを保存する。
いずれかのバッファーが自動保存される場合、通常do-auto-save
は自動保存が行われる間、それを示すメッセージ‘Auto-saving...’をエコーエリアに表示する。しかし、no-messageが非nil
の場合、このメッセージは抑制される。
current-onlyが非nil
の場合は、カレントバッファーだけが自動保存される。
この関数は、delete-auto-save-files
が非nil
なら、カレントバッファーのauto-saveファイルを削除する。これは、バッファー保存時に毎回呼び出される。
forceがnil
の場合、この関数は最後に本当の保存が行われて以降、カレントEmacsセッションにより書き込まれたファイルだけを削除する。
この変数は、関数delete-auto-save-file-if-necessary
により使用される。これが非nil
の場合、Emacsは(visitされているファイルに)本当に保存が行われたとき、auto-saveファイルを削除する。これはデスク容量を節約し、ディレクトリーを整理する。
この関数は、visitされているファイルの名前が変更されていれば、カレントバッファーのauto-saveファイルの名前を調整する。これは、カレントEmacsセッションでauto-saveファイルが作成されていれば、既存のauto-saveファイルもリネームする。visitされているファイルの名前が変更されていない場合、この関数は何も行わない。
このバッファーローカル変数の値は、カレントバッファーが最後に読み取り、保存、または自動保存されたときのバッファーの長さである。これは、サイズの大幅な減少の検知に使用され、それに応じて自動保存がオフに切り替えられる。
-1の場合、それはサイズの大幅な減少により、そのバッファーの自動保存が一時的に停止されていることを意味する。明示的な保存により、この変数に正の値が格納され、自動保存が再び有効になる。自動保存をオフやオンに切り替えることでも、またはこの変数を更新されるので、サイズの大幅な減少は忘れられてしまう。
-2の場合は、そのバッファーがバッファーサイズの変更を無視すべきことを意味する。特に、バッファーサイズの変更により、一時的に自動保存を停止するべきではない。
この変数は、(非nil
の場合は)すべてのauto-saveファイルの名前を記録するファイルを指定する。Emacsが自動保存を行うたびに、そのEmacsは自動保存が有効な各バッファーごとに2行ずつ書き込みを行う。1行目はvisitされているファイルの名前(ファイルをvisitしないバッファーの場合は空)、2行目はauto-saveファイルの名前を示す。
Emacsを正常にexitしたときは、このファイルは削除される。Emacsがクラッシュした場合は、このファイルを調べることにより、失われるはずだった作業を含む、すべてのauto-saveファイルを探すことができる。recover-session
コマンドは、それらを見つけるために、このファイルを使用する。
このファイルにたいするデフォルト名は、ユーザーのホームディレクトリーの、‘.saves-’で始まるファイルを指定する。この名前には、EmacsのプロセスIDと、ホスト名も含まれる。
initファイルを読み込んだ後、(nil
にセット済みでなければ)Emacsはこのプレフィックスにもとづきホスト名とプロセスIDを追加して、auto-save-list-file-name
を初期化する。initファイル内でこれをnil
にセットした場合、Emacsはauto-save-list-file-name
を初期化しない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるファイルにたいして大きな変更を行った後、気が変わって元に戻したくなった場合は、revert-buffer
コマンドでそのファイルの以前のバージョンを読み込むことにより、それらの変更を取り消すことができます。詳細は、Reverting a Buffer in The GNU Emacs Manualを参照してください。
このコマンドは、バージョンのテキストを、ディスク上のvisitされているファイルのテキストで置き換える。これにより、ファイルがvisit、または保存された以降に行ったすべての変更は、アンドゥ(undo: 取り消し)される。
デフォルトでは、もっとも最近のauto-saveファイルのほうがvisitされているファイルより新しく、かつ引数ignore-autoがnil
の場合、revert-buffer
はユーザーにたいしてかわりにauto-saveファイルを使用するかどうか確認を求める。このコマンドをinteractiveに呼び出したとき、プレフィックス数引数が指定されていなければ、ignore-autoはt
となる。つまり、interactive呼び出しは、デフォルトではauto-saveファイルのチェックを行わない。
revert-buffer
は通常、バッファーを変更する前に確認を求める。しかし、引数noconfirmが非nil
の場合、revert-buffer
は確認を求めない。
このコマンドは通常、normal-mode
を使用することにより、そのバッファーのメジャーモードとマイナーモードを再初期化する。しかし、preserve-modesが非nil
の場合、モードは変更されずに残る。
リバート(revert:
戻す、復元する)は、insert-file-contents
の置き換え機能を使用することにより、バッファー内のマーカー位置の保持を試みる。バッファーのコンテンツとファイルのコンテンツがリバート操作を行う前に等しい場合、リバートはすべてのマーカーを保持する。等しくない場合、リバートによりバッファーは変更される。この場合は、(もしあれば)バッファーの最初と最後にある未変更のテキスト内にあるマーカーは保持される。他のマーカーを保持しても、それらは正しくないだろう。
revert-buffer
は処理を行っている間、この変数を非nil
値にバインドする。
このセクションの残りの部分で説明する変数をセットすることにより、revert-buffer
が処理を行う方法をカスタマイズできます。
この変数は、問い合わせなしでリバートされるべきファイルのリストを保持する。値は、正規表現のリスト。visitされているファイルの名前がこれらの正規表現のいずれかにマッチし、かつバッファーが未変更だがディスク上のファイルは変更されている場合、revert-buffer
はユーザーに確認を求めることなく、ファイルをリバートする。
メジャーモードのいくつかは、以下の変数をローカルにバインドすることにより、revert-buffer
をカスタマイズします:
この変数の値は、そのバッファーをリバートするために使用する関数である。これはリバート処理を行うための、2つのオプション引数をとる関数であること。2つのオプション引数ignore-autoとnoconfirmは、revert-buffer
が受け取る引数である。
Diredモードのような、編集されるテキストにファイルのコンテンツは含まれず、他の方式により再生成され得るモードは、この変数のバッファーローカル値に、コンテンツを再生成する特別な関数を与えることができる。
この変数の値は、そのバッファーをリバートする際に、更新されたコンテンツの挿入に使用される関数を指定する。その関数は、2つの引数をとる。1つ目は使用するファイル名で、2つ目がt
ならユーザーはauto-saveファイルの読み込みにたいして確認を求められる。
revert-buffer-function
のかわりにこの変数をモードが変更する理由は、revert-buffer
が行残りの処理(ユーザーへの確認、アンドゥリストのクリアー、適切なメジャーモードの決定、以下のフックの実行)にたいする重複や置き換えを避けるためである。
このノーマルフックは、変更されたコンテンツを挿入する前に、デフォルトのrevert-buffer-function
により実行される。カスタマイズしたrevert-buffer-function
は、このフックを実行するかどうか判らない。
このノーマルフックは、変更されたコンテンツを挿入した後に、デフォルトのrevert-buffer-function
により実行される。カスタマイズしたrevert-buffer-function
は、このフックを実行するかどうか判らない。
この変数の値は、バッファーがリバートを要するかどうかをチェックするために呼び出される関数を指定する。デフォルト値は、修正時刻をチェックすることにより、ファイルをvisitするバッファーだけを処理する。ファイルをvisitしないバッファーには、カスタム関数が必要になる ((emacs)Supporting additional buffersを参照)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファー(buffer)とは、編集されるテキストを含むLispオブジェクトのことです。バッファーは、visitされるファイルのコンテンツを保持するために使用されます。しかし、ファイルをvisitしないバッファーも存在するかもしれません。一度に複数のバッファーが存在するかもしれませんが、カレントバッファー(current buffer)に指定できるのは、常に1つのバッファーだけです。ほとんどの編集コマンドは、カレントバッファーのコンテンツにたいして作用します。カレントバッファーを含むすべてのバッファーは、任意のウィンドウ内に表示されるときも、表示されない場合もあります。
26.1 Buffer Basics | バッファーとは? | |
26.2 The Current Buffer | バッファーをカレントに指定することにより、プリミティブはバッファーのコンテンツにアクセスする。 | |
26.3 Buffer Names | バッファー名にたいするアクセスと変更。 | |
26.4 Buffer File Name | バッファーファイル名は、どのファイルをvisitしているかを示す。 | |
26.5 Buffer Modification | 保存が必要なら、バッファーは変更されている(modified)。 | |
26.6 Buffer Modification Time | "Emacsの裏"でvisitされているファイルが変更されたかどうかを判断する。 | |
26.7 Read-Only Buffers | 読み取り専用バッファーでのテキスト変更は許されない。 | |
26.8 The Buffer List | すべての既存バッファーを閲覧する方法。 | |
26.9 Creating Buffers | バッファーを作成する関数。 | |
26.10 Killing Buffers | 明示的にkillされるまで、バッファーは存在する。 | |
26.11 Indirect Buffers | インダイレクトバッファーは、他のバッファーとテキストを共有する。 | |
26.12 Swapping Text Between Two Buffers | 2つのバッファー間でのテキストの交換。 | |
26.13 The Buffer Gap | バッファー内のギャップ。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファー(buffer)とは、編集されるテキストを含むLispオブジェクトのことです。バッファーは、visitされるファイルのコンテンツを保持するために使用されます。しかし、ファイルをvisitしないバッファーも存在します。一度に複数のバッファーが存在するかもしれませんが、カレントバッファー(current buffer)に指定できるのは、常に1つのバッファーだけです。ほとんどの編集コマンドは、カレントバッファーのコンテンツにたいして作用します。カレントバッファーを含むすべてのバッファーは、任意のウィンドウ内に表示されるときも、表示されない場合もあります。
Emacs編集におけるバッファーは、個別に名前をもち、編集可能なテキストを保持するオブジェクトです。Lispプログラムにたいして、バッファーはスペシャルデータ型として表されます。バッファーのコンテンツを、拡張可能な文字列と考えることができます。挿入と削除は、バッファー内の任意の箇所で発生し得ます。Textを参照してください。
Lispのバッファーオブジェクトは、多くの情報要素を含んでいます。これらの情報のいくつかは変数を通じてプログラマーが直接アクセスできるのにたいして、その他の情報は特殊な目的のための関数を通じてのみアクセスすることができます。たとえば、visitされているファイルの名前は変数を通じて直接アクセスできますが、ポイント値はプリミティブ関数からのみアクセスできます。
直接アクセス可能な、バッファー固有の情報は、バッファーローカル(buffer-local)な変数バインディング内に格納されます。これは、特定のバッファー内だけで効力のある変数値のことです。この機能により、それぞれのバッファーは、特定の変数の値をオーバーライドすることができます。ほとんどのメジャーモードは、この方法でfill-column
やcomment-column
のような変数をオーバーライドしています。バッファーローカルな変数、およびそれらに関連する関数についての詳細は、Buffer-Local Variablesを参照してください。
バッファーからファイルをvisitする関数および変数については、Visiting Files、およびSaving Buffersを参照してください。ウィンドウ内へのバッファー表示に関連する関数および変数については、Buffers and Windowsを参照してください。
この関数は、objectがバッファーならt
、それ以外はnil
をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
一般的に、1つのEmacsセッション内には、多くのバッファーが存在します。常に、それらのうちの1つがカレントバッファー(current buffer)に指定され、ます。カレントバッファーとは、ほとんどの編集が行われるバッファーのことです。テキストを調べたり変更するプリミティブのほとんどは、暗黙的にカレントバッファーにたいして処理を行います(Textを参照)。
通常は、選択されたウィンドウ内に表示されるバッファーがカレントバッファーですが、常にそうではありません。Lispプログラムは、バッファーのコンテンツを処理するために、スクリーン上に表示されているものを変更することなく、任意のバッファーを一時的にカレントに指定できます。カレントバッファーの指定にたいしてもっとも基本的な関数は、set-buffer
です。
この関数は、カレントバッファーをリターンする関数。
(current-buffer) ⇒ #<buffer buffers.texi>
この関数は、buffer-or-nameをカレントバッファーにする。buffer-or-nameは既存のバッファー、または既存のバッファーの名前でなければならない。リターン値は、カレントになったバッファーである。
この関数は、そのバッファーをどのウィンドウにも表示しないので、必然的にユーザーはそのバッファーを見ることはできない。しかし、Lispプログラムはその後、そのバッファーにたいして処理を行うことになるだろう。
編集コマンドがエディターコマンドループにリターンする際、Emacsは選択されたウィンドウ内に表示されているバッファーにたいして、自動的にset-buffer
を呼び出します。これは混乱を防ぐためで、これにより、Emacsがコマンドを読み取るときに、カーソルのあるバッファーが、コマンドを適用されるバッファーになるのが保証されます(Command Loopを参照)。したがって、異なるバッファーを指示して切り替える場合に、set-buffer
を使用するべきではありません。これを行うためには、Switching to a Buffer in a Windowで説明されているカを使用してください。
Lisp関数を記述する際は、処理後にカレントバッファーをリストアするために、コマンドループのこの振る舞いに依存しないでください。編集コマンドは、コマンドループだけではなく、他のプログラムからLisp関数としても呼び出されます。呼び出し側にとっては、そのサブルーチンがカレントだったバッファーを変更しないほうが便利です(もちろん、それがサブルーチンの目的でない場合ですが)。
他のバッファーにたいして一時的に処理を行うには、save-current-buffer
フォーム内にset-buffer
を置きます。以下の例は、コマンドappend-to-buffer
の簡略版です:
(defun append-to-buffer (buffer start end) "リージョンのテキストをBUFFERに追加する" (interactive "BAppend to buffer: \nr") (let ((oldbuf (current-buffer))) (save-current-buffer (set-buffer (get-buffer-create buffer)) (insert-buffer-substring oldbuf start end))))
ここでは、カレントバッファーを記録するためにローカル変数にバインドしてから、後でsave-current-buffer
がそれを再びカレントにするよう、取り計らっています。次に、set-buffer
が指定されたバッファーをカレントにして、insert-buffer-substring
が元のバッファーの文字列を、指定された(今はカレントの)バッファーにコピーします。
かわりに、with-current-buffer
マクロを使用することもできます:
(defun append-to-buffer (buffer start end) "BUFFERにリージョンのテキストを追加する" (interactive "BAppend to buffer: \nr") (let ((oldbuf (current-buffer))) (with-current-buffer (get-buffer-create buffer) (insert-buffer-substring oldbuf start end))))
どちらの場合でも、追加されるバッファーが偶然他のウィンドウに表示されていた場合には、次回の再表示でそのテキストがどのように変更されたか表示されるでしょう。どのウィンドウにも表示されていない場合には、スクリーン上で即座に変更を目にすることはありません。コマンドはバッファーを一時的にカレントにしますが、そのことがバッファーの表示を誘因する訳ではありません。
バッファーローカルバインディングをもつ変数にたいして、(let
や関数引数などで)ローカルバインディングを作成する場合は、そのローカルバインディングのスコープの最初と最後で、同じバッファーがカレントとなることを確認してください。そうしないと、あるバッファーではバインドして、他のバッファーではバインドされないことになるかもしれません!
set-buffer
の使用において、カレントバッファーが戻ることに依存しないでください。なぜなら、間違ったバッファーがカレントのときにquitが発生した場合、その処理は行われないでしょう。たとえば上記の例に倣うと、以下は間違ったやり方です:
(let ((oldbuf (current-buffer))) (set-buffer (get-buffer-create buffer)) (insert-buffer-substring oldbuf start end) (set-buffer oldbuf))
例で示したようにsave-current-buffer
、またはwith-current-buffer
を使用すれば、quitやthrow
を、通常の評価と同様に処理できます。
スペシャルフォームsave-current-buffer
は、カレントバッファーの識別を保存して、bodyフォームを評価し、最後にそのバッファーをカレントにリストアする。リターン値は、body内の最後のフォームの値である。throw
やエラーを通じた異常exitの場合でも、カレントバッファーはリストアされる(Nonlocal Exitsを参照)。
カレントとして使用されていたバッファーが、save-current-buffer
によるexit時にkillされていた場合は、それが再びカレントとなることは当然ない。かわりに、exit直前にカレントバッファーが何であれ、それがカレントになる。
with-current-buffer
マクロは、カレントバッファーの識別を保存して、buffer-or-nameをカレントにし、bodyフォームを評価して、最後にカレントバッファーをリストアする。buffer-or-nameには既存のバッファー、または既存のバッファー名を指定しなければならない。
リターン値は、body内の最後のフォームの値である。throw
やエラーを通じた異常exitの場合でも、カレントバッファーはリストアされる(Nonlocal Exitsを参照)。
with-temp-buffer
マクロは、一時的なバッファーをカレントバッファーとして、bodyフォームを評価する。これはカレントバッファーの識別を保存して、一時的なバッファーを作成、それをカレントとして、bodyフォームを評価し、一時バッファーをkillする間に、以前のカレントバッファーをリストアする。
デフォルトでは、このマクロにより作成されたバッファー内のアンドゥ情報(Undoを参照)は記録されない(が、必要ならbodyでそれを有効にできる)。
リターン値は、body内の最後のフォームの値である。最後のフォームとして(buffer-string)
を使用することにより、一時バッファーのコンテンツをリターンできる。
throw
やエラーを通じた異常exitの場合でも、カレントバッファーはリストアされる(Nonlocal Exitsを参照)。
Writing to
Filesのwith-temp-file
も参照されたい。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
それぞれのバッファーは、文字列で表される一意な名前をもちます。バッファーにたいして機能する関数の多くは、引数としてバッファーとバッファー名の両方を受け入れます。buffer-or-nameという名前の引数がこのタイプで、それが文字列でもバッファーでもない場合は、エラーがシグナルされます。bufferという名前の引数は、名前ではなく実際のバッファーオブジェクトでなければなりません。
短命でユーザーが関心をもたないようなバッファーは名前がスペースで始まり、それらについてはlist-buffers
およびbuffer-menu
コマンドは無視します(が、ファイルをvisitしているようなバッファーは無視されない)。スペースで始まる名前は、初期状態ではアンドゥ情報の記録も無効になっています。Undoを参照してください。
この関数は、bufferの名前を文字列としてリターンする。bufferのデフォルトは、カレントバッファーである。
buffer-name
がnil
をリターンした場合、それはbufferがkillされていることを意味する。Killing Buffersを参照のこと。
(buffer-name) ⇒ "buffers.texi"
(setq foo (get-buffer "temp")) ⇒ #<buffer temp>
(kill-buffer foo) ⇒ nil
(buffer-name foo) ⇒ nil
foo ⇒ #<killed buffer>
この関数は、カレントバッファーをnewnameにリネームする。newnameが文字列でない場合は、エラーをシグナルする。
newnameがすでに使用済みの場合、rename-buffer
は通常はエラーをシグナルする。しかし、uniqueが非nil
の場合は、未使用の名前となるようにnewnameを変更する。interactiveに呼び出した場合は、プレフィックス数引数によりuniqueに非nil
を指定できる(この方法により、コマンドrename-uniquely
は実装される)。
この関数は、実際にバッファーに与えられた名前をリターンする。
この関数は、buffer-or-nameで指定されたバッファーをリターンする。buffer-or-nameが文字列で、かつそのような名前のバッファーが存在しない場合、値はnil
になる。buffer-or-nameがバッファーの場合は、与えられたバッファーをリターンする。これは有用とは言い難く、引数は通常は名前である。たとえば:
(setq b (get-buffer "lewis")) ⇒ #<buffer lewis>
(get-buffer b) ⇒ #<buffer lewis>
(get-buffer "Frazzle-nots") ⇒ nil
Creating Buffersの関数get-buffer-create
も参照のこと。
この関数は、新たなバッファーにたいして一意となるような名前をリターンする — が、バッファーは作成しない。この名前はstarting-nameで始まり、内部が数字であるような‘<…>’を追加することにより、すべてのバッファーでカレントで使用されていない名前を生成する。この数字は2で始まり、既存バッファーの名前でない名前になる数字まで増加される。
オプション引数ignoreが非nil
の場合、それは潜在的にバッファー名であるような文字列であること。これは、たとえそれが(通常は拒絶されるであろう)既存バッファーの名前であっても、試みられた場合は、潜在的に受容可能なバッファーとして考慮することを意味する。つまり‘foo’、‘foo<2>’、‘foo<3>’、‘foo<4>’という名前のバッファーが存在する場合、
(generate-new-buffer-name "foo") ⇒ "foo<5>" (generate-new-buffer-name "foo" "foo<3>") ⇒ "foo<3>" (generate-new-buffer-name "foo" "foo<6>") ⇒ "foo<5>"
Creating Buffersの関連する関数generate-new-buffer
も参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーファイル名(buffer file
name)とは、そのバッファーにvisitされているファイルの名前です。バッファーがファイルをvisiblyしていなければ、バッファーファイル名はnil
です。大抵、バッファー名はバッファーファイル名の非ディレクトリーパートと同じですが、バッファーファイル名とバッファー名は別物であり、個別にセットすることができます。Visiting Filesを参照してください。
この関数は、bufferがvisitしているファイルの、絶対ファイル名をリターンする。bufferがファイルをvisitしていない場合、buffer-file-name
はnil
をリターンする。bufferが与えられない場合のデフォルトは、カレントバッファーになる。
(buffer-file-name (other-buffer)) ⇒ "/usr/user/lewis/manual/files.texi"
このバッファーローカル変数は、カレントバッファーにvisitされているファイルの名前、ファイルをvisitしていなければnil
が含まれる。これは永続的なローカル変数であり、kill-all-local-variables
の影響を受けない。
buffer-file-name ⇒ "/usr/user/lewis/manual/buffers.texi"
他のさまざまな事項を変更せずに、この変数を変更するのは危険である。通常は、set-visited-file-name
を使用するほうがよい(以下参照)。バッファー名の変更などのような、そこで行われることのいくつかは、絶対必要という訳ではないが、その他の事項はEmacsが混乱するのを防ぐために必要不可欠である。
このバッファーローカル変数は、カレントバッファーにvisitされているファイルの省略された形式の実名(truename)、ファイルをvisitしていない場合はnil
を保持する。これは永続的にローカルであり、kill-all-local-variables
の影響を受けない。See section Truenames、およびabbreviate-file-nameを参照のこと。
このバッファーローカル変数は、カレントバッファーにvisitされているファイルのファイル番号(file number)とデバイス番号(device
number)、ファイルをvisitしていない場合はnil
を保持する。これは永続的にローカルであり、kill-all-local-variables
の影響を受けない。
値は通常、(filenum
devnum)
のような形式のリストである。この番号ペアーは、システム上でアクセス可能なすべてのファイルの中から、ファイルを一意に識別する。より詳細な情報は、File Attributesのfile-attributes
を参照のこと。
buffer-file-name
がシンボリックリンク名の場合は、どちらの番号も再帰的なターゲットを参照する。
この関数は、ファイルfilenameをvisitしているバッファーをリターンする。そのようなバッファーが存在しない場合は、nil
をリターンする。引数filenameは文字列でなければならず、展開(Functions that Expand Filenamesを参照)された後、killされていないすべてのバッファーがvisitしているファイル名と比較される。バッファーのbuffer-file-name
は、filenameの展開形と正確にマッチしなければならないことに注意。この関数は、同じファイルにたいする他の名前は、認識しないだろう。
(get-file-buffer "buffers.texi") ⇒ #<buffer buffers.texi>
特殊な状況下では、複数のバッファーが同じファイル名をvisitすることがあり得る。そのような場合、この関数はバッファーリスト内の最初に該当するバッファーをリターンする。
これはget-file-buffer
と似ているが、そのファイルを違う名前でvisitしているかもしれないすべてのバッファーをリターンする。つまり、バッファーのbuffer-file-name
はfilenameの展開形式と正確にマッチする必要はなく、同じファイルを参照することだけが要求される。predicateが非nil
の場合、それはfilenameをvisitしているバッファーを1つの引数とする関数であること。そのバッファーにたいして、predicateが非nil
をリターンした場合のみ、適切なリターン値と判断される。リターンすべき適切なバッファーが見つからない場合、find-buffer-visiting
はnil
をリターンする。
filenameが非空文字列の場合、この関数はカレントバッファーにvisitされているファイルの名前を、filenameに変更する(バッファーがファイルをvisitしていない場合は、visitするファイルとしてfilenameを与える)。そのバッファーにたいする次回の保存では、新たに指定されたファイルに保存されるだろう。
このコマンドは、たとえそのバッファーのコンテンツがその前にvisitされていたファイルとマッチしていても、(Emacsが関知するかぎり)filenameのコンテンツとはマッチしないので、バッファーが変更されている(modified)とマークする。これは、その名前がすでに使用されていなければ、新たなファイル名に対応してバッファーをリネームする。
filenameがnil
、または空文字列の場合、それは“visitされているファイルがない”ことを意味する。この場合、set-visited-file-name
はバッファーの変更フラグを変更することなく、そのバッファーがファイルをvisitしていないとマークする。
この関数はfilenameをvisitしているバッファーがすでに存在する場合は、通常はユーザーに確認を求める。しかし、no-queryが非nil
の場合は、この質問を行わない。filenameをvisitしているバッファーがすでに存在し、かつユーザーが承認、またはno-queryが非nil
の場合、この関数は中に数字が入った‘<…>’をfilenameに追加して、新たなバッファーの名前を一意にする。
along-with-fileが非nil
の場合、それは前にvisitされていたファイルがfilenameにリネームされたと想定することを意味する。この場合、コマンドはバッファーの修正フラグを変更せず、そのバッファーの記録されている最終ファイル変更時刻をvisited-file-modtime
が報告する時刻(Buffer Modification Timeを参照)で変更もしない。along-with-fileがnil
の場合、この関数はvisited-file-modtime
が0をリターンした後に、記録済みの最終ファイル変更時刻をクリアーする。
関数set-visited-file-name
がinteractiveに呼び出されたときは、ミニバッファー内でfilenameの入力を求める。
このバッファーローカル変数は、visitしているファイル名をもたないバッファーにたいして、バッファーリスト中のvisitしているファイル名を表示する場所に表示する文字列を指定する。Diredバッファーは、この変数を使用する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsは、各バッファーにたいして、バッファーのテキストを変更したかどうかを記録するために、変更フラグ(modified
flag)と呼ばれるフラグを管理しています。このフラグは、バッファーのコンテンツを変更すると常にt
にセットされ、バッファーを保存したときnil
にクリアーされます。したがって、このフラグは保存されていない変更があるかどうかを表します。フラグの値は通常、モードライン内(Variables Used in the Mode Lineを参照)に表示され、保存(Saving Buffersを参照)と自動保存(Auto-Savingを参照)を制御します。
いくつかのLispプログラムは、このフラグを明示的にセットします。たとえば、関数set-visited-file-name
は、このフラグをt
にセットします。なぜなら、たとえその前にvisitしていたファイルが変更されていなくても、テキストは新たにvisitされたファイルとマッチしないからです。
バッファーのコンテンツを変更する関数については、Textで説明されています。
この関数は、バッファーbufferが最後にファイルから読み込まれた、あるいは保存されてから変更されていればt
、それ以外ではnil
をリターンする。bufferが与えられない場合は、カレントバッファーがテストされる。
この関数は、flagが非nil
ならカレントバッファーを変更済みとしてマークし、nil
なら未変更としてマークする。
この関数を呼び出すことによる別の効果は、それがカレントバッファーのモードラインの無条件な再表示を引き起こすことである。実際のところ、関数force-mode-line-update
は、以下を行うことにより機能する:
(set-buffer-modified-p (buffer-modified-p))
set-buffer-modified-p
と同様だが、モードラインにたいする強制的な再表示を行わない。
このコマンドは、カレントバッファーが変更されておらず、保存する必要がないとマークする。argが非nil
の場合、これは変更されているとマークするので、次回の適切なタイミングでバッファーは保存されるだろう。interactiveに呼び出された場合、argはプレフィックス引数である。
この関数は、エコーエリア内にメッセージをプリントするので、プログラム内で使用してはならない。かわりに、set-buffer-modified-p
(上記)を使用すること。
この関数は、bufferの変更カウント(modification-count)をリターンする。これは、バッファーが変更されるたびに増加されるカウンターである。bufferがnil
(または省略)の場合は、カレントバッファーが使用される。このカウンターは、時折0にクリアーされ得る。
この関数は、bufferの文字変更に関わる変更カウントをリターンする。テキストプロパティを変更しても、このカウンターは変化しない。しかし、そのバッファーにテキストが挿入、または削除されるたびに、このカウンターはbuffer-modified-tick
によりリターンされるであろう値にリセットされる。buffer-chars-modified-tick
を2回呼び出してリターンされる値を比較することにより、その呼び出しの間にバッファー内で文字変更があったかどうかを知ることができる。bufferがnil
(または省略)の場合は、カレントバッファーが使用される。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるファイルをvisitして、そのバッファー内で変更を行って、その一方ではディスク上でファイル自身が変更されたとします。この時点でバッファーを保存すると、ファイル内の変更は上書きされるでしょう。これが正に望んでいる動作のときもありますが、通常は有用な情報が失われてしまいます。したがって、Emacsはファイルを保存する前に、以下で説明する関数を使用して、ファイルの変更時刻をチェックします(ファイルの変更時刻を調べる方法は、File Attributesを参照)。
この関数は、buffer(デフォルトはカレントバッファー)にvisitされているファイルにたいして記録されている変更時刻と、オペレーティングシステムにより記録された実際の変更時刻を比較する。これら2つの時刻は、Emacsがそのファイルをvisit、もしくは保存して以降、他のプロセスにより書き込みがされていなければ、等しくなるはずである。
この関数は、実際の最終変更時刻と、Emacsが記録した変更時刻が同じならt
、それ以外はnil
をリターンする。そのバッファーが記録済みの最終変更時刻をもたない、すなわちvisited-file-modtime
が0をリターンするような場合も、t
をリターンする。
これは、たとえvisited-file-modtime
が非0の値をリターンしたとしても、ファイルをvisitしていないバッファーにたいしては、常にt
をリターンする。たとえば、diredバッファーにたいして、この関数は常にt
をリターンする。また、存在せず、
以前に存在したこともなかったファイルをvisitするバッファーにたいしてt
をリターンするが、visitしているファイルが削除されたバッファーにたいしてはnil
をリターンする。
この関数は、カレントバッファーによりvisitされているファイルの最終変更時刻の記録をクリアーする。結果として、このバッファーにを次回の保存では、ファイルの変更時刻の食い違いは報告されなくなる。
この関数はset-visited-file-name
、および変更済みファイルの上書きを防ぐための通常テストを行わない例外的な箇所で呼び出される。
この関数は、カレントバッファーの記録された最終ファイル変更時刻を、(high low microsec
picosec)
のような形式のリストでリターンする(これは、file-attributes
が時刻値をリターンするために使用するフォーマットと同じである。File Attributesを参照されたい)。
バッファーが最終変更時刻の記録をもたない場合、この関数は0をリターンする。これが発生するのは、たとえばバッファーがファイルをvisitしていなかったり、clear-visited-file-modtime
で最終変更時刻が明示的にクリアーされた場合である。しかしvisited-file-modtime
は、いくつかの非ファイルバッファーにたいするリストをリターンすることに注意。たとえば、ディレクトリーをリストするDiredバッファーでは、Diredが記録するそのディレクトリーの最終変更時刻がリターンされる。
バッファーがファイルをvisitしていない場合、この関数は-1をリターンする。
この関数は、バッファーがvisitしているファイルの最終変更時刻の記録を、timeが非nil
、それ以外はvisitしているファイルの最終変更時刻により更新する。
timeがnil
や0でない場合、それはcurrent-time
で使用される形式(high
low microsec picosec)
というフォーマットであること(Time of Dayを参照)。
この関数は、バッファーが通常のようにファイルから読み取られたものでない場合や、ファイル自身が害のない既知の理由により変更されている場合に有用である。
これは、visitしているファイルfilenameがバッファーのテキストより新しいときにバッファーの変更を試みた後、ユーザーに処理方法を尋ねるために使用する関数である。Emacsはディスク上のファイルの変更時刻が、バッファーを最後に保存した時刻より新しいかどうかで、これを検知する。これはおそらく、他のプログラムがそのファイルを変更したことを意味する。
この関数が正常にリターンするかどうかは、ユーザーの答えに依存する。関数はバッファーの変更が処理された場合は正常にリターンし、バッファーの変更が許可されなかった場合は、データ(filename)
とともにエラーfile-supersession
をシグナルする。
この関数は、適切なタイミングでEmacsにより自動的に呼び出される。これは、再定義することによりEmacsをカスタマイズ可能にするために存在する。標準的な定義は、ファイルuserlock.elを参照されたい。
File Locksのファイルロックのメカニズムも参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるバッファーが読み取り専用(read-only)の場合は、たとえスクロールやナローイングによってファイルのコンテンツのビューを変更しても、そのコンテンツを変更することはできません。
読み取り専用バッファーは、2つのタイプの状況において使用されます:
ここでの目的は、ユーザーにたいしてそのファイルへの保存を意図したバッファーの編集が無益、または望ましくないかもしれないことを伝えることである。それにも関わらずバッファーのテキストの変更を望むユーザーは、C-x C-qで読み取り専用フラグをクリアーした後、これを行うことができる。
このようなモードのスペシャルコマンドは、buffer-read-only
を(let
により)nil
にバインドしたり、テキストを変更する箇所ではinhibit-read-only
をt
にバインドする。
このバッファーローカル変数は、そのバッファーが読み取り専用かどうかを指定する。この変数が非nil
なら、そのバッファーは読み取り専用である。
この変数が非nil
の場合、読み取り専用バッファー、およびその実際の値に依存して、一部もしくはすべての読み取り専用文字が変更されている。バッファー内の読み取り専用文字とは、テキストプロパティread-only
が非nil
の文字である。テキストプロパティについての詳細は、Properties with Special Meaningsを参照のこと。
inhibit-read-only
がt
の場合、すべてのread-only
文字プロパティは効果がなくなる。inhibit-read-only
がリストの場合、read-only
文字プロパティがリストのメンバーなら効果がなくなる(比較はeq
で行われる)。
これは、バッファーローカルなマイナーモードである、Read
Onlyモードにたいするモードコマンドである。このモードが有効なときは、そのバッファーのbuffer-read-only
は非nil
である。無効なときは、そのバッファーのbuffer-read-only
はnil
である。呼び出す際の慣習は、他のマイナーモードコマンドの慣習と同じである(Conventions for Writing Minor Modesを参照)。
このマイナーモードは他のマイナーモードとは異なり、主にbuffer-read-only
にたいするラッパーの役目を果たし、別個にread-only-mode
変数は存在しない。Read
Onlyモードが無効なときでも、read-only
テキストプロパティが非nil
の文字は読み取り専用のままである。一時的にすべての読み取り専用ステータスを無視するには、上述のinhibit-read-only
をバインドすること。
Read
Onlyモードを有効にする際、このモードコマンドはオプションview-read-only
が非nil
なら、Viewモードも有効にする。Miscellaneous Buffer Operations in The GNU Emacs
Manualを参照のこと。Read Onlyモードを無効にする際に、もしもViewモードが有効なら、Viewモードも無効にする。
この関数は、カレントバッファーが読み取り専用の場合は、buffer-read-only
エラーをシグナルする。カレントバッファーが読み取り専用の場合にエラーをシグナルする他の方法については、Using interactive
を参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーリスト(buffer
list)とは、すべての生きた(killされていない)バッファーのリストです。このリスト内のバッファーの順序は主に、それぞれのバッファーがウィンドウに表示されたのがどれほど最近なのかにもとづきます。いくつかの関数、特にother-buffer
はこの順序を使用します。ユーザーに表示されるバッファーリストも、この順序にしたがいます。
バッファーを作成すると、それはバッファーリストの最後に追加され
バッファーをkillすることにより、そのリストから削除されます。ウィンドウに表示するためにバッファーが選択されたとき(Switching to a Buffer in a Windowを参照)、あるいはバッファーを表示するウィンドウが選択されたとき(Selecting Windowsを参照)、そのバッファーは常にこのリストの先頭に移動します。バッファーがバリー(以下のbury-buffer
を参照)されたときは、このリストの最後に移動します。バッファーリストを直接操作するために利用できる、Lispプログラマー向けの関数は存在しません。
説明した基本バッファーリスト(fundamental buffer
list)に加えて、Emacsはそれぞれのフレームにたいしてローカルバッファーリスト(local buffer
list)を保守します。ローカルバッファーリストでは、そのフレーム内で表示されていた(または選択されたウィンドウの)バッファーが先頭になります(この順序は、そのフレームのフレームパラメーターbuffer-list
に記録される。Buffer Parametersを参照されたい)。そのフレームでは表示されていないフレームは後になるよう、並び順は基本バッファーリストに準じます。
この関数は、すべてのバッファーを含むバッファーリストをリターンする(名前がスペースで始まるバッファーも含む)。リストの要素はバッファーの名前ではなく、実際のバッファーである。
frameがフレームの場合は、frameのローカルバッファーリストをリターンする。frameがnil
、または省略された場合は、基本バッファーリストが使用される。その場合、そのバッファーを表示するフレームがどれかとは無関係に、もっとも最近に表示、または選択されたバッファーの順になる。
(buffer-list) ⇒ (#<buffer buffers.texi> #<buffer *Minibuf-1*> #<buffer buffer.c> #<buffer *Help*> #<buffer TAGS>)
;; ミニバッファーの名前が ;; スペースで始まることに注意! (mapcar (function buffer-name) (buffer-list)) ⇒ ("buffers.texi" " *Minibuf-1*" "buffer.c" "*Help*" "TAGS")
buffer-list
からリターンされるリストは、それ専用に構築されたリストであり、Emacsの内部的なデータ構造ではないし、それを変更してもバッファーの並び順に影響はありません。基本バッファーリスト内のバッファーの並び順を変更したい場合に簡単なのは、以下の方法です:
(defun reorder-buffer-list (new-list) (while new-list (bury-buffer (car new-list)) (setq new-list (cdr new-list))))
この方法により、バッファーを失ったり、有効な生きたバッファー以外の何かを追加する危険を犯さずに、リストに任意の並び順を指定できます。
特定のフレームのバッファーリストの並び順や値を変更するには、modify-frame-parameters
でそのフレームのbuffer-list
パラメーターをセットしてください(Access to Frame Parametersを参照)。
この関数は、バッファーリスト中でbuffer以外の最初のバッファーをリターンする。これは通常選択されたウィンドウ(フレームframe、または選択されたフレーム。Input Focusを参照)に、もっとも最近表示された、buffer以外のバッファーである。名前がスペースで始まるバッファーは、考慮されない。
bufferが与えられない(または生きたバッファーでない)場合、other-buffer
は選択されたフレームのローカルバッファーリスト内の、最初のバッファーをリターンする(frameが非nil
の場合は、frameのローカルバッファーリスト内の最初のバッファーをリターンする)。
frameが非nil
のbuffer-predicate
パラメーターをもつ場合は、どのバッファーを考慮すべきかを決定するために、other-buffer
はその述語を使用する。これはそれぞれのバッファーごとにその述語を一度呼び出して、値がnil
ならそのバッファーは無視される。Buffer Parametersを参照のこと。
visible-okがnil
ならば、other-buffer
はやむを得ない場合を除き、任意の可視のフレーム上のウィンドウ内で可視のバッファーをリターンすることを避ける。visible-okが非nil
の場合は、バッファーがどこかで表示されているかどうかは問題にしない。
適切なバッファーが存在しない場合は、バッファー*scratch*を(必要なら作成して)リターンする。
この関数は、frameのバッファーリスト内から、buffer以外の最後のバッファーをリターンする。frameが省略、またはnil
の場合は、選択されたフレームのバッファーリストを使用する。
引数visible-okは、上述したother-buffer
と同様に扱われる。適切なバッファーを見つけられない場合は、バッファー*scratch*がリターンされる。
このコマンドは、バッファーリスト内の他のバッファーの並び順を変更することなく、buffer-or-nameをバッファーリストの最後に置く。つまり、このバッファーはother-buffer
がリターンする候補で、もっとも期待度が低くなる。引数はバッファー自身か、バッファーの名前を指定できる。
この関数は、基本バッファーリストと同様に、それぞれのフレームのbuffer-list
パラメーターを操作する。したがってバリー(bury:
埋める、隠す)したバッファーは、(buffer-list
frame)
および(buffer-list)
の値の最後に置かれるだろう。さらに、そのバッファーが選択されたウィンドウに表示されていれば、そのウィンドウのバッファーリストの最後にバッファーを置くことも行う(Window Historyを参照)。
buffer-or-nameがnil
、または省略された場合は、カレントバッファーをバリーすることを意味する。加えて、カレントバッファーが選択されたウィンドウに表示されている場合は、そのウィンドウを削除するか、他のバッファーを表示する。より正確には、選択されたウィンドウが専用(dedicated)のウィンドウ(see section Dedicated Windows)であり、かつそのフレーム上に他のウィンドウが存在する場合、専用ウィンドウは削除される。それがフレーム上で唯一のウィンドウであり、かつそのフレームが端末上で唯一のフレームでない場合、そのフレームはframe-auto-hide-function
で指定される関数を呼び出すことにより、“開放”される(Quitting Windowsを参照)。それ以外の場合は、他のバッファーをそのウィンドウ内に表示するために、switch-to-prev-buffer
を呼び出す(Window Historyを参照)。buffer-or-nameが他のウィンドウで表示されていた場合は、そのまま表示され続ける。
あるバッファーにたいして、それを表示するすべてのウィンドウでバッファーを置き換えるには、replace-buffer-in-windows
を使用する。Buffers and Windowsを参照のこと。
このコマンドは、選択されたフレームのローカルバッファーリストの最後のバッファーに切り替える。より正確には、選択されたウィンドウ内で、last-buffer
(上記参照)がリターンするバッファーを表示するために、関数switch-to-buffer
を呼び出す(Switching to a Buffer in a Windowを参照)。
これは、バッファーリストが変更されたときは、常に実行されるノーマルフックである。(暗黙的に)このフックを実行する関数はget-buffer-create
(Creating Buffersを参照)、rename-buffer
(Buffer Namesを参照)、kill-buffer
(Killing Buffersを参照)、bury-buffer
(上記参照)、select-window
(Selecting Windowsを参照)である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、バッファーを作成する2つのプリミティブについて説明します。get-buffer-create
は、指定された名前の既存バッファーが見つからない場合は作成します。generate-new-buffer
は、常に新たにバッファーを作成して、それに一意な名前を与えます。
バッファーを作成するために使用できる他の関数には、with-output-to-temp-buffer
(Temporary Displaysを参照)、およびcreate-file-buffer
(Visiting Filesを参照)が含まれます。サブプロセスの開始によっても、バッファーを作成することができます(Processesを参照)。
この関数は、buffer-or-nameという名前のバッファーをリターンする。リターンされたバッファーはカレントにならない — この関数はカレントがどのバッファーであるかを変更しない。
buffer-or-nameは文字列、または既存バッファーのいずれかでなければならない。これが文字列で、かつ既存の生きたバッファーの名前の場合、get-buffer-create
はそのバッファーをリターンする。そのようなバッファーが存在しなければ、新たにバッファーを作成する。buffer-or-nameが文字列ではなくバッファーの場合、たとえそのバッファーが生きていなくても、与えられたバッファーをリターンする。
(get-buffer-create "foo") ⇒ #<buffer foo>
新たに作成されたバッファーにたいするメジャーモードは、Fundamentalモードにセットされる(変数major-mode
のデフォルト値は、より高いレベルで処理される。How Emacs Chooses a Major Modeを参照されたい)。名前がスペースで始まる場合、そのバッファーのアンドゥ情報の記録は、初期状態では無効である(Undoを参照)。
この関数は、新たに空のバッファーを作成してリターンするが、それをカレントにはしない。バッファーの名前は、関数generate-new-buffer-name
にnameを渡すことにより生成される(Buffer Namesを参照)。つまり、nameという名前のバッファーが存在しなければ、それが新たなバッファーの名前になり、その名前が使用されていた場合は、‘<n>’という形式のサフィックスがnameに追加される。ここでnは整数である。
nameが文字列でない場合は、エラーがシグナルされる。
(generate-new-buffer "bar") ⇒ #<buffer bar>
(generate-new-buffer "bar") ⇒ #<buffer bar<2>>
(generate-new-buffer "bar") ⇒ #<buffer bar<3>>
新たなバッファーにたいするメジャーモードは、Fundamentalモードにセットされる。変数major-mode
のデフォルト値は、より高いレベルで処理される。How Emacs Chooses a Major Modeを参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーのkillにより、 そのバッファーの名前はEmacsにとって未知の名前となり、そのバッファーが占めていたメモリースペースは、他の用途に使用できるようになります。
バッファーに対応するバッファーオブジェクトは、それを参照するものがあればkillされても存在し続けますが、それをカレントにしたり表示することができないよう、特別にマークされます。とはいえ、killされたバッファーの同一性は保たれるので、2つの識別可能なバッファーをkillした場合、たとえ両方死んだバッファーであっても、eq
による同一性は残ります。
あるウィンドウ内においてカレント、あるいは表示されているバッファーをkillした場合、Emacsはかわりに他の何らかのバッファーを自動的に選択、または表示します。これは、バッファーのkillにより、カレントバッファーが変更されることを意味します。したがって、バッファーをkillする際は、(killされるバッファーがカレントを偶然知っていた場合を除き)カレントバッファーの変更に関しても、事前に注意を払うべきです。The Current Bufferを参照してください。
1つ以上のインダイレクト バッファー(Indirect Buffersを参照) のベースとなるバッファーをkillした場合は、インダイレクトバッファーも同様に自動的にkillされます。
バッファーのbuffer-name
がnil
の場合のみ、バッファーはkillされる。killされていないバッファーは生きた(live)バッファーと呼ばれる。あるバッファーにたいして、そのバッファーが生きているか、またはkillされているかを確認するには、buffer-live-p
を使用する(下記参照)。
この関数は、バッファーbuffer-or-nameをkillして、そのバッファーのメモリーを他の用途のために開放、またはオペレーティングシステムに返却する。buffer-or-nameがnil
、または省略された場合は、カレントバッファーをkillする。
そのバッファーをprocess-buffer
として所有するすべてのプロセスには、通常はプロセスを終了させるシグナルSIGHUP
(“hangup”)が送信される。Sending Signals to Processesを参照のこと。
バッファーがファイルをvisitしていて、かつ保存されていない変更が含まれる場合、kill-buffer
はバッファーをkillする前に、ユーザーにたいして確認を求める。これは、kill-buffer
がinteractiveに呼び出されていなくても、行われる。この確認要求を抑制するには、kill-buffer
の呼び出し前に、変更フラグ(modified
flag)をクリアーすればよい。Buffer Modificationを参照のこと。
killされるバッファーをカレントで表示しているすべてのバッファーをクリーンアップするために、この関数はreplace-buffer-in-windows
を呼び出す。
すでに死んでいるバッファーをkillしても、効果はない。
この関数は、実際にバッファーをkillした場合は、t
をリターンする。ユーザーが確認で拒否を選択、またはbuffer-or-nameがすでに死んでいる場合は、nil
をリターンする。
(kill-buffer "foo.unchanged") ⇒ t (kill-buffer "foo.changed") ---------- Buffer: Minibuffer ---------- Buffer foo.changed modified; kill anyway? (yes or no) yes ---------- Buffer: Minibuffer ---------- ⇒ t
保存されていない変更について確認を求める前に、kill-buffer
はリストkill-buffer-query-functions
内の関数を、出現順に引数なしで呼び出す。
Before confirming unsaved changes, calls the functions in the list , in
order of appearance, with no arguments.
それらが呼び出される際には、killされるバッファーがカレントになる。この機能は、これらの関数がユーザーに確認を求めるというアイデアが元となっている。これらの関数のいずれかがnil
をリターンした場合、kill-buffer
はそのバッファーの命を奪わない。
これは、尋ねることになっている質問をすべて終えた後、実際にバッファーをkillする直前に、kill-buffer
により実行されるノーマルフックである。この変数は永続的にローカルであり、メジャーモードの変更により、そのローカルバインディングはクリアーされない。
特定のバッファーにおいてこの変数が非nil
の場合、save-buffers-kill-emacs
およびsave-some-buffers
(この関数の2つ目のオプション引数がt
の場合)は、ファイルをvisitしているバッファーと同じように、そのバッファーの保存を提案する。Definition of save-some-buffersを参照のこと。何らかの理由により変数buffer-offer-save
をセットする際は、自動的にバッファーローカルになる。Buffer-Local Variablesを参照のこと。
特定のバッファーにおいてこの変数が非nil
の場合、save-buffers-kill-emacs
およびsave-some-buffers
は、(バッファーが変更されていれば)ユーザーに確認を求めることなく、そのバッファーを保存する。何らかの理由によりこの変数をセットする際は、自動的にバッファーローカルになる。
この関数は、objectが生きたバッファー(killされていないバッファー)ならt
、それ以外はnil
をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
インダイレクトバッファー(indirect buffer: 間接バッファー)とは、ベースバッファー(base buffer)と呼ばれる他のバッファーとテキストを共有します。いくつかの点において、インダイレクトバッファーはファイル間でのシンボリックリンクに類似しています。ベースバッファー自身は、インダイレクトバッファーでない可能性があります。
インダイレクトバッファーのテキストは、常にベースバッファーのテキストと同一です。編集により一方が変更されると、それは即座に他方のバッファーから可視になります。これには文字自体に加えて、テキストプロパティも同様に含まれます。
他のすべての観点において、インダイレクトバッファーとそのベースバッファーは、完全に別物です。それらは別の名前、独自のポイント値、ナローイング、マーカー、オーバーレイ、メジャーモード、バッファーローカルな変数バインディングをもちます(ただし、どちらかのバッファーでのテキストの挿入や削除を行うと、両方のバッファーでマーカーとオーバーレイの再配置が行われる)。
インダイレクトバッファーはファイルをvisitできませんが、ベースバッファーは可能です。インダイレクトバッファーの保存を試みた場合、実際にはベースバッファーが保存されます。
インダイレクトバッファーをkillしても、ベースバッファーに影響はありません。ベースバッファーをkillすると、インダイレクトバッファーはkillされて、再びカレントバッファーになることはできません。
これは、ベースバッファーがbase-bufferであるような、nameという名前のインダイレクトバッファーを作成してリターンする。引数base-bufferは生きたバッファー、または既存バッファーの名前(文字列)を指定できる。nameが既存バッファーの名前の場合は、エラーがシグナルされる。
cloneが非nil
の場合、インダイレクトバッファーは最初はbase-bufferのメジャーモード、マイナーモード、バッファーローカル変数等の“状態”を共有する。cloneが省略、またはnil
の場合、インダイレクトバッファーの情報は、新たなバッファーにたいするデフォルト状態にセットされる。
base-bufferがインダイレクトバッファーの場合は、新たなバッファーのベースとして、それのベースバッファーが使用される。さらに、cloneが非nil
ならば、初期状態はbase-bufferではなく、実際のベースバッファーからコピーされる。
この関数は、カレントバッファーのベースバッファーを共有するインダイレクトバッファーを新たに作成し、カレントバッファーの残りの属性をコピーしてリターンする(カレントバッファーがインダイレクトバッファーでない場合は、それがベースバッファーとして使用される)。
display-flagが非nil
の場合、それはpop-to-buffer
を呼び出すことにより新しいバッファーを表示することを意味する。norecordが非nil
の場合、それは新しいバッファーをバッファーリストの先頭に置かないことを意味する。
この関数は、buffer(デフォルトはカレントバッファー)のベースバッファーをリターンする。bufferがインダイレクトバッファーでない場合、値はnil
になり、それ以外では値は他のバッファーとなり、このバッファーがインダイレクトバッファーではあり得ない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
特別なモードでは、ユーザーが同一のバッファーから複数の非常に異なったテキストにアクセスできるようにしなければならない場合があります。たとえば、バッファーのテキストのサマリーを表示して、ユーザーがそのテキストにアクセスできるようにする場合です。
これは、(ユーザーがテキストを編集した際には同期を保つ)複数バッファーや、ナローイング(Narrowingを参照)により実装することができるかもしれません。しかし、これらの候補案はときに退屈になりがちであり、特にそれぞれのテキストタイプが正しい表示と編集コマンドを提供するために高価なバッファーグローバル操作を要求する場合には、飛び抜けて高価になる場合があります。
Emacsは、そのようなモードにたいする、別の機能を提供します。buffer-swap-text
を使用すれば、2つのバッファー間でバッファーテキストを素早く交換することができます。この関数は、テキストの移動は行わず、異なるテキスト塊(text
chunk)をポイントするように、バッファーオブジェクトの内部的なデータ構造だけを変更するので、非常に高速です。これを使用することにより、2つ以上のバッファーグループから、個々のバッファーのコンテンツすべてを併せもつような、単一の仮想バッファー(virtual
buffer)が実在するように、見せかけることができます。
この関数は、カレントバッファーのテキストと、引数bufferのテキストを交換する。2つのバッファーのいずれか一方がインダイレクトバッファー(Indirect Buffersを参照)、またはインダイレクトバッファーのベースバッファーの場合は、エラーをシグナルする。
バッファーテキストに関連するすべてのバッファープロパティ、つまりポイントとマークの位置、すべてのマーカーとオーバーレイ、テキストプロパティ、アンドゥリスト、enable-multibyte-characters
フラグの値(enable-multibyte-charactersを参照)等も、同じように交換される。
ファイルをvisitしているバッファーにbuffer-swap-text
を使用した場合は、交換されたテキストではなく、そのバッファーの元のテキストを保存するようにフックをセットアップするべきです。write-region-annotate-functions
は、正にこの目的のために機能します。そのバッファーのbuffer-saved-size
を、おそらく交換されたテキストにたいする変更が自動保存に干渉しないであろう、-2にセットするべきでしょう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsのバッファーは、挿入と削除を高速にするために、不可視のギャップ(gap)を使用して実装されています。挿入はギャップ部分を充填し、削除はギャップを追加することにより機能します。もちろん、これは最初にギャップを挿入もしくは削除の部位(locus)に移動しなければならないことを意味します。Emacsは、ユーザーが挿入、または削除を試みたときだけ、ギャップを移動します。大きなバッファー内の遠く離れた位置で編集した後、他の箇所での最初の編集コマンドに無視できない遅延が発生する場合があるのは、これが理由です。
このメカニズムは暗に機能するものであり、Lispコードはギャップのカレント位置に影響されるべきでは決してありませんが、以下の関数はギャップ状態に関する情報の取得に利用できます。
この関数は、カレントバッファー内のギャップのカレント位置をリターンする。
この関数は、カレントバッファー内のギャップのサイズをリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このチャプターでは、Emacsのウィンドウに関連する関数と変数について説明します。Emacsが利用可能なスクリーン領域にウィンドウが割り当てられる方法については、Framesを参照してください。ウィンドウ内にテキストが表示される方法についての情報は、Emacs Displayを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウ(window)とは、任意のバッファーを表示するために使用される、スクリーンの領域です。Emacs Lispでは、ウィンドウはスペシャルLispオブジェクトとして表現されます。
ウィンドウは、フレームへとグループ化されます(Framesを参照)。それぞれのフレームは、最低でも1つのウィンドウを含みます。ユーザーは、複数のバッファーを1度に閲覧するために、それを複数のオーバーラップしないウィンドウに分割することができます。Lispプログラムは、さまざまな目的にたいして、複数のウィンドウを使用できます。たとえばRmailでは、1つのウィンドウでメッセージタイトル、もう一方のウィンドウで選択したメッセージのコンテンツを閲覧できます。
Emacsは、グラフィカルなデスクトップ環境や、X Window Systemのようなウィンドウシステムとは異なる意味で、“ウィンドウ(window)”という単語を使用します。EmacsがX上で実行されているときは、XのグラフィカルなXウィンドウは、Emacsでの(1つ以上のEmacsウィンドウを含んだ)フレームになります。Emacsがテキスト端末上で実行されているときは、フレームが端末スクリーン全体を占有します。
Xのウィンドウとは異なり、Emacsのウィンドウはタイル表示(tiled)され、フレームの領域内でオーバーラップされることは決してありません。あるウィンドウが作成、リサイズ、削除されるとき、変更されたウィンドウスペースの変更は各ウィンドウの調整により取得・譲与されるので、そのフレームの総領域に変化はありません。
この関数は、objectがウィンドウ(バッファーの表示有無に関わらず)ならt
、それ以外はnil
をリターンする。
生きたウィンドウ(live window)とは、あるフレーム内で実際にバッファーを表示しているウィンドウのことです。
この関数は、objectが生きたウィンドウならt
、それ以外はnil
をリターンする。生きたウィンドウとは、バッファーを表示するウィンドウのこと。
各フレーム内のウィンドウは、ウィンドウツリー(window tree)内へと組織化されます。Windows and Framesを参照してください。それぞれのウィンドウツリーのリーフノード(leaf nodes)は、実際にバッファーを表示している生きたウィンドウです。ウィンドウツリーの内部ノード(internal node)は内部ウィンドウ(internal windows)と呼ばれ、これらは生きたウィンドウではありません。
有効なウィンドウ(valid window)とは、生きたウィンドウか、内部ウィンドウのいずれかです。有効なウィンドウにたいしては、それを削除(delete)、すなわちそのウィンドウのフレームから削除することができます(Deleting Windowsを参照)。その場合、それは有効なウィンドウではなくなりますが、それを表すLispオブジェクトは依然として他のLispオブジェクトから参照されたままかもしれません。削除されたウィンドウは、保存されたウィンドウ設定(window configuration)をリストアすることにより、再び有効になるかもしれません(Window Configurationsを参照)。
window-valid-p
により、削除されたウィンドウから有効なウィンドウを区別できます。
この関数は、objectが生きたウィンドウ、またはウィンドウツリー内の内部ウィンドウの場合は、t
をリターンする。それ以外(objectが削除されたウィンドウの場合も含む)は、nil
をリターンする。
それぞれのフレーム内において、常にただ1つのEmacsウィンドウがそのフレームで選択されている(selected within the
frame)もとして指定されます。選択されたフレームにたいしては、そのウィンドウは選択されたウィンドウ(selected
window)と呼ばれます。選択されたウィンドウは、編集のほとんどが行われるウィンドウであり、選択されたウィンドウに表示されるカーソルがあるウィンドウです(Cursor Parametersを参照)。選択されたウィンドウのバッファーは通常は、set-buffer
が使用された場合を除き、カレントバッファーでもあります(The Current Bufferを参照)。選択されていないフレームでは、そのフレームが選択されたときは、そのフレームで選択されていたウィンドウが選択されたウィンドウになります。Selecting Windowsを参照してください。
この関数は、選択されたウィンドウをリターンする(これは常に生きたウィンドウである)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウはそれぞれ、正確に1つのフレームに属します(Framesを参照)。
この関数は、ウィンドウwindowが属するフレームをリターンする。windowがnil
の場合のデフォルトは、選択されたウィンドウである。
この関数は、フレームframeに属する、生きたウィンドウのリストをリターンする。frameが省略、またはnil
の場合のデフォルトは、選択されたフレームである。
オプション引数minibufferは、リターンされるリストにミニバッファーウィンドウを含めるべきかどうかを指定する。minibufferがt
の場合は、ミニバッファーウィンドウが含まれる。minibufferがnil
、または省略された場合は、ミニバッファーウィンドウがアクティブのときだけ含まれる。minibufferがnil
とt
以外の場合、ミニバッファーウィンドウは含まれない。
オプション引数windowが非nil
の場合、それは指定されたフレーム上の生きたウィンドウであること。その場合は、windowがリターンされるリストの最初の要素になる。windowが省略、またはnil
の場合は、そのフレームの選択されたウィンドウが最初の要素になる。
同一フレーム内のウィンドウは、リーフノード(leaf nodes)が生きたウィンドウであるような、ウィンドウツリー(window tree)内に組織化されます。ウィンドウツリーの内部ノード(internal nodes)は生きたウィンドウではありません。これらのウィンドウは、生きたウィンドウ間の関係を組織化するという目的のために存在します。ウィンドウツリーのルートノード(root node)は、ルートウィンドウ(root window)と呼ばれます。ルートノードは生きたウィンドウ(そのフレームにウィンドウが1つだけの場合)、または内部ウィンドウのいずれかです。
ミニバッファーウィンドウ(Minibuffer Windowsを参照)は、そのフレームがミニバッファーだけのフレームでない限り、そのフレームのウィンドウツリーの一部にはなりません。にもかかわらず、このセクションのほとんどの関数は、引数としてミニバッファーウィンドウを受け付けます。さらにこのセクションの最後に説明する関数window-tree
は、実際のウィンドウツリーと並列してミニバッファーウィンドウをリストします。
この関数は、frame-or-windowにたいするルートウィンドウをリターンする。引数frame-or-windowは、ウィンドウかフレームのいずれかであること。これが省略、またはnil
の場合のデフォルトは、選択されたフレームである。frame-or-windowがウィンドウの場合、リターン値はそのウィンドウのフレームのルートウィンドウである。
ウィンドウが分割(split)されているときは、以前は1つだった2つの生きたウィンドウが存在します。これらのうちの一方は、元のウィンドウと同じLispウィンドウオブジェクトとして表され、もう一方は新たに作成されたLispウィンドウオブジェクトとして表されます。これらの生きたウィンドウは両方とも、単一の内部ウィンドウの子ウィンドウ(child windows)として、ウィンドウツリーのリーフノードになります。もし必要なら、Emacsはこの内部ウィンドウを自動的に作成します。この内部ウィンドウは親ウィンドウ(parent window)とも呼ばれ、ウィンドウツリー内の適切な位置に配置されます。同じ親を共有するウィンドウセットは、兄弟(sibling)と呼ばれます。
この関数は、windowの親ウィンドウ(parent
window)をリターンする。windowが省略、またはnil
の場合のデフォルトは、選択されたウィンドウである。windowが親をもたない(ミニバッファーウィンドウやそのフレームのルートウィンドウ)場合、リターン値はnil
である。
内部ウィンドウはそれぞれ、常に最低でも2つの子ウィンドウをもちます。ウィンドウ削除によりこの数値が1になった場合、Emacsは自動的に内部ウィンドウを削除して、その残った単一の子ウィンドウがウィンドウツリー内のその位置に配置されます。
子ウィンドウはそれぞれ生きたウィンドウ、または(次に自身の子ウィンドウをもつであろう)内部ウィンドウのいずれかです。したがって、各内部ウィンドウは、最終的にはその内部ウィンドウの子孫であるような生きたウィンドウにより占有される領域を結合した、特定の矩形スクリーン領域(screen area)を占有すると考えることができます。
内部ウィンドウそれぞれにたいして、近接する子たちのスクリーン領域は、垂直(vertically)または水平(horizontally)のいずれかにより整列されます(両方で整列されることはない)。子ウィンドウが他の子ウィンドウと上下に整列される場合、それらは垂直コンビネーション(vertical combination)、左右に整列される場合は水平コンビネーション(horizontal combination)を形成すると表現されます。以下の例で考えてみましょう:
______________________________________ | ______ ____________________________ | || || __________________________ || || ||| ||| || ||| ||| || ||| ||| || |||____________W4____________||| || || __________________________ || || ||| ||| || ||| ||| || |||____________W5____________||| ||__W2__||_____________W3_____________ | |__________________W1__________________|
このフレームのルートウィンドウは、内部ウィンドウW1です。これの子ウィンドウは、生きたウィンドウW2と内部ウィンドウW3からなる水平コンビネーションを形成します。W3の子ウィンドウは、生きたウィンドウW4とW5からなる垂直コンビネーションを形成します。したがって、このウィンドウツリー内の生きたウィンドウはW2、W4、およびW5です。
以下の関数は、内部ウィンドウの子ウィンドウ、および子ウィンドウの兄弟を取得するのに使用できます。
この関数は、内部ウィンドウwindowの子ウィンドウが垂直コンビネーションを形成する場合は、windowの一番上の子ウィンドウをリターンする。他のタイプのウィンドウにたいするリターン値はnil
である。
この関数は、内部ウィンドウwindowの子ウィンドウが水平コンビネーションを形成する場合は、windowの一番左の子ウィンドウをリターンする。他のタイプのウィンドウにたいするリターン値はnil
である。
この関数は、内部ウィンドウwindowの最初の子ウィンドウをリターンする。これは、垂直コンビネーションにたいしては一番上、水平コンビネーションにたいしては一番左の子ウィンドウである。windowが生きたウィンドウの場合、リターン値はnil
である。
この関数は、windowが垂直コンビネーションの一部である場合のみ、非nil
をリターンする。windowが省略、またはnil
の場合のデフォルトは、選択されたウィンドウである。
オプション引数horizontalが非nil
ならば、windowが水平コンビネーションの一部である場合のみ非nil
をリターンすることを意味する。
この関数は、ウィンドウwindowの次の兄弟をリターンする。省略またはnil
の場合、windowのデフォルトは選択されたウィンドウになる。windowが、その親の最後の子の場合、リターン値はnil
である。
この関数は、ウィンドウwindowの前の兄弟をリターンする。省略またはnil
の場合、windowのデフォルトは選択されたウィンドウになる。windowが、その親の最初の子の場合、リターン値はnil
である。
関数window-next-sibling
およびwindow-prev-sibling
を、ウィンドウのサイクル順(Cyclic Ordering of Windowsを参照)において次、または前のウィンドウをリターンする関数next-window
およびprevious-window
と混同しないでください。
任意のフレーム上の最初の生きたウィンドウや、与えられたウィンドウにもっとも近いウィンドウを探すために、以下の関数を使用できます。
この関数は、frame-or-windowにより指定されたフレームの、左上隅の生きたウィンドウをリターンする。引数frame-or-windowでは、ウィンドウか生きたフレームを示さなければならず、デフォルトは選択されたフレームである。frame-or-windowがウィンドウを指定する場合、この関数はそのウィンドウのフレームの最初のウィンドウをリターンする。前の例のフレームが(frame-first-window)
に指定されたとするならば、W2がリターンされる。
この関数は、ウィンドウwindow内の位置window-point
から、方向directionにあるもっとも近い生きたウィンドウをリターンする。引数directionはabove
、below
、left
、right
のいずれかでなければならない。オプション引数windowは生きたウィンドウを示さなければならず、デフォルトは選択されたウィンドウである。
この関数は、パラメーターno-other-window
が非nil
のウィンドウをリターンしない(Window Parametersを参照)。もっとも近いウィンドウのno-other-window
パラメーターが非nil
の場合、この関数は指定された方向でno-other-window
パラメーターがnil
の、他のウィンドウを探す。オプション引数ignoreが非nil
の場合は、たとえno-other-window
パラメーターが非nil
のウィンドウでも、リターンされ得る。
オプション引数signが負の数値の場合、それは参照位置としてwindow-point
のかわりに、windowの右端、または下端を使用することを意味する。signが正の数値の場合、それは参照位置としてwindowの左端、または上端を使用することを意味する。
オプション引数wrapが非nil
の場合、それはフレームのボーダー(borders:
枠線)をdirectionがラップアラウンド(wrap around:
最後に達したら最初に戻る)することを意味する。たとえば、windowはフレームの最上にあり、directionがabove
の場合、フレームにミニバッファーがあればミニバッファーウィンドウ、それ以外はフレーム最下のウィンドウウィンドウリターンする。
オプション引数miniがnil
の場合、それはミニバッファーがカレントでアクティブな場合のみ、ミニバッファーウィンドウをリターンすることを意味する。miniが非nil
ならば、たとえ非アクティブなときでもミニバッファーウィンドウをリターンする。しかし、wrapが非nil
の場合は、常にminiがnil
であるかのように動作する。
適切なウィンドウが見つからない場合、この関数はnil
をリターンする。
以下の関数により、任意のフレームのウィンドウツリー全体を取得できます:
この関数は、フレームframeにたいするウィンドウツリーを表すリストをリターンする。frameが省略、またはnil
の場合のデフォルトは、選択されたフレームである。
リターン値は、(root
mini)
という形式のリストである。ここでrootはそのフレームのウィンドウツリーのルートウィンドウ、miniはそのフレームのミニバッファーウィンドウを表す。
ルートウィンドウが生きている場合、rootはそのウィンドウ自身である。それ以外では、rootはリスト(dir
edges w1 w2
...)
である。ここでdirは水平コンビネーションならnil
、垂直コンビネーションならt
となり、edgesはそのコンビネーションのサイズと位置を与え、残りの要素は子ウィンドウである。子ウィンドウはそれぞれ、同じようにウィンドウオブジェクト(生きたウィンドウにたいして)、または上記フォーマットと同じ形式のリスト(内部ウィンドウにたいして)かもしれない。edges要素はwindow-edges
がリターンする値のような、リスト(left
top right bottom)
である(Coordinates and Windowsを参照)。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の図は、生きたウィンドウの構造を示しています:
____________________________________________ |______________ Header Line ______________|RD| ^ ^ |LS|LF|LM| |RM|RF|RS| | | | | | | | | | | | | | Window | | | | Text Area | | | | | Window Body | | | | | (Window Body) | | | | | Total Height | | | | | | | | | Height | | | | |<- Window Body Width ->| | | | | | v |__|__|__|_______________________|__|__|__| | | |_______________ Mode Line _______________|__| | |_____________ Bottom Divider _______________| v <---------- Window Total Width ------------>
ウィンドウの中央はテキストエリア(text area: テキスト領域)、またはボディー(body: 本体、本文)と呼ばれる、バッファーテキストが表示される場所です。テキストエリアは、一連のオプションエリアで囲まれている可能性があります。左右には、内側から外側に向かって、図中にLMとRMで示される左右のマージン(Displaying in the Marginsを参照)、LFとRFで示される左右のフリンジ(Fringesを参照)、そしてLSとRSはスクロールバー(Scroll Barsを参照)で、常に表示されるのはいずれか一方だけです。そしてRDはディバイダー(Window Dividersを参照)を示しています。ウィンドウの上端はヘッダーライン(Window Header Linesを参照)、下端にはモードライン(Mode Line Formatを参照)と、その下に下端ディバイダー(Window Dividersを参照)があります。
Emacsは、ウィンドウの高さと幅を求めるために、さまざまな関数を提供します。これらの関数がリターンする値の多くは、ピクセル単位か、行単位と列単位のいずれかにより指定できます。グラフィカルなディスプレイでは、後者は実際にはframe-char-height
およびframe-char-width
によりリターンされる、そのフレームのデフォルトフォントが指定する、“デフォルト文字”の高さと幅に対応します。したがって、あるウィンドウが異なるフォントやサイズでテキストを表示していると、そのウィンドウにたいして報告される行高さと列幅は、実際にウィンドウ内で表示されるテキスト行数と列数とは、異なるかもしれません。
ウィンドウのトータル高さ(total height)とは、そのウィンドウのボディー、ヘッダーライン、モードライン、(もしあれば)下端ディバイダーを構成する行数のことです。フレームにはエコーエリア、メニューバー、ツールバーが含まれるかもしれないので、フレームの高さはそのフレームのルートウィンドウ(Windows and Framesを参照)の高さとは異なることに注意してください(Frame Size And Positionを参照)。
この関数は、ウィンドウwindowのトータル高さを、行でリターンする。windowが省略、またはnil
の場合のデフォルトは、選択されたウィンドウである。windowが内部ウィンドウの場合、リターン値はそのウィンドウの子孫となるウィンドウにより占有されるトータル高さになる。
ウィンドウのピクセル高さが、そのウィンドウがあるフレームのデフォルト文字高さの整数倍でない場合は、そのウィンドウが占有する行数が内部で丸められる。これは、そのウィンドウが親ウィンドウの場合は、すべての子ウィンドウのトータル高さの合計が、親ウィンドウのトータル高さと内部的に等しくなるような方法により行われる。これは、たとえ2つのウィンドウのピクセル高さが等しくでも、内部的なトータル高さは1行分異なるかもしれないことを意味する。さらにこれは、そのウィンドウが垂直コンビネーションされていて、かつ右の兄弟をもつ場合、その兄弟の上端行は、このウィンドウの上端行とトータル高さから計算されるかもしれないことも意味する(Coordinates and Windowsを参照)。
オプション引数roundがceiling
の場合、この関数はwindowのピクセル高さを、そのフレームの文字高さで除した数より大であるような最小の整数、floor
の場合は除した数より小であるような最大の整数、それ以外のroundにたいしては、windowsのトータル高さの内部値をリターンする。
トータル幅(total width)とは、そのウィンドウのボディーを構成する列数、マージン、フリンジ、スクロールバー、(もしあれば)右ディバイダーです。
この関数は、ウィンドウwindowのトータル幅を列でリターンする。windowが省略、またはnil
の場合のデフォルトは、選択されたウィンドウである。windowが内部ウィンドウの場合、リターン値はその子孫のウィンドウが占有するトータル幅になる。
ウィンドウのピクセル幅が、そのウィンドウがあるフレームのデフォルト文字幅の整数倍でない場合は、そのウィンドウが占有する列数が内部で丸められる。これは、そのウィンドウが親ウィンドウの場合は、すべての子ウィンドウのトータル幅の合計が、親ウィンドウのトータル幅と内部的に等しくなるような方法により行われる。これは、たとえ2つのウィンドウのピクセル幅が等しくでも、内部的なトータル幅は1列分異なるかもしれないことを意味する。さらにこれは、そのウィンドウが水平コンビネーションされていて、かつ右の兄弟をもつ場合、その兄弟の左端行は、このウィンドウの左端行とトータル幅から計算されるかもしれないことも意味する(Coordinates and Windowsを参照)。オプション引数roundは、window-total-height
の場合と同様に振る舞う。
この関数は、ウィンドウwindowのトータル高さを行で、またはトータル幅を列でリターンする。horizontalが省略、またはnil
の場合はwindowにたいしてwindow-total-height
を呼び出すのと等価であり、それ以外ではwindowにたいしてwindow-total-width
を呼び出すのと等価である。オプション引数roundは、window-total-height
の場合と同様に振る舞う。
以下の2つの関数は、ウィンドウのトータルサイズをピクセル単位でリターンさせるために使用できます。
この関数は、ウィンドウwindowのトータル高さを、ピクセルでリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウである。
リターン値には、(もしあれば)モードライン、ヘッダーライン、下端ディバイダーが含まれる。windowが内部ウィンドウの場合、そのピクセル高さは子ウィンドウたちによりスパンされるスクリーン領域のピクセル高さになる。
この関数は、ウィンドウwindowの幅をピクセルでリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウである。
リターン値には、フリンジ、windowのマージン、同様にwindowに属する垂直ディバイダーとスクロールバーが含まれる。windowが内部ウィンドウの場合、そのピクセル幅は子ウィンドウたちによりスパンされるスクリーン領域の幅になる。
以下の関数は、与えられたウィンドウに隣接するウィンドウがあるかどうかを判断するために使用できます。
この関数は、フレーム内でwindowの上下に他のウィンドウがなければ非nil
をリターンする(トータル高さがそのフレーム上のルートウィンドウと等しい)。windowが省略、またはnil
の場合のデフォルトは、選択されたウィンドウである。
この関数は、フレーム内でwindowの左右に他のウィンドウがなければ非nil
をリターンする(トータル幅がそのフレーム上のルートウィンドウと等しい)。windowが省略、またはnil
の場合のデフォルトは、選択されたウィンドウである。
ウィンドウのボディー高さ(body height)とは、モードライン、ヘッダーライン、下端ディバイダーを含まないテキスト領域の高さです。
この関数は、ウィンドウwindowのボディーの高さを、行でリターンする。windowが省略、またはnil
の場合のデフォルトは選択されたウィンドウで、それ以外では生きたウィンドウでなければならない。
オプション引数pixelwiseが非nil
の場合、この関数はピクセルで計算windowのボディー高さをリターンする。
pixelwiseがnil
の場合は、必要ならリターン値はもっとも近い整数に切り下げられる。これは、テキスト領域の下端行が部分的に可視の場合、その行は計数されないこと、さらに任意のウィンドウのボディー高さは、window-total-height
によりリターンされるそのウィンドウのトータル高さ決して超過し得ないことをも意味する。
ウィンドウのボディー幅(body width)とは、スクロールバー、フリンジ、マージン、右ディバイダーを含まないテキスト領域の幅です。
この関数は、ウィンドウwindowのボディーの幅を、列でリターンする。windowが省略、またはnil
の場合のデフォルトは選択されたウィンドウであり、それ以外では生きたウィンドウでなければならない
オプション引数pixelwiseが非nil
の場合、この関数はwindowのボディーの幅をピクセル単位でリターンする。
pixelwiseがnil
の場合、リターン値は必要ならもっとも近い整数に切り下げられる。これはテキスト領域の右端の列が部分的に可視な場合は、その列は計数されないことを意味する。さらにこれは、ウィンドウのボディーの幅が、window-total-width
によりリターンされるウィンドウのトータル幅を決して超過し得ないことをも意味する。
この関数は、windowのボディーの高さ、または幅をリターンする。horizontalが省略、またはnil
の場合は、windowにたいしてwindow-body-height
、それ以外の場合は、window-body-width
を呼び出すのと同じである。いずれの場合も、オプション引数pixelwiseは、呼び出された関数に渡される。
以前のバージョンのEmacsとの互換性のため、window-height
はwindow-total-height
、window-width
はwindow-body-width
にたいするエイリアスです。これらのエイリアス時代遅れと考えられております、将来的には削除されるでしょう。
ウィンドウのモードラインとヘッダーラインのピクセル高さは、以下の関数により取得できる。それらのリターン値は、そのウィンドウが以前に表示されていない場合を除き、通常は加算される。その場合、リターン値はそのウィンドウのフレームにたいして使用を予想されるフォントが元になる。
この関数は、windowモードラインの高さをピクセルでリターンする。windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。windowにモードラインがない場合、リターン値は0である。
この関数は、windowのヘッダーラインの高さをピクセルでリターンする。windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。windowにヘッダーラインがない場合のリターン値は0である。
ウィンドウディバイダー(Window Dividersを参照)、フリンジ(Fringesを参照)、スクロールバー(Scroll Barsを参照)、ディスプレイマージン(Displaying in the Marginsを参照)を取得する関数については、対応するセクションで説明されています。
ウィンドウのサイズを変更(Resizing Windowsを参照)したり、ウィンドウを分割(split)するコマンド(Splitting Windowsを参照)は、指定できるウィンドウの最小の高さと幅を指定する変数window-min-height
およびwindow-min-width
にしたがう。これらのコマンドは、ウィンドウのサイズがfixed(固定)になる変数window-size-fixed
にもしたがう。
このオプションは、任意のウィンドウの最小のトータル高さを行で指定する。この値は最低でも1つのテキスト行、同様にモードライン、ヘッダーライン、(もしあれば)下端ディバイダーに対応する必要がある。
このオプションは、すべてのウィンドウの最小のトータル幅を列で指定する。この値は、2つのテキスト列、同様に(もしあれば)マージン、フリンジ、スクロールバー、右ディバイダーに対応する必要がある。
このバッファーローカル変数が非nil
の場合、そのバッファーを表示するすべてのウィンドウのサイズが、通常は変更できなくなる。ウィンドウ削除やそのフレームのサイズ変更により、それ以外に方法がなければ、依然としてウィンドウのサイズは変更されるかもしれない。
値がheight
の場合は、そのウィンドウの高さだけが固定される。値がwidth
の場合は、そのウィンドウの幅だけが固定される。その他の非nil
値では、幅と高さの両方が固定される。
この変数がnil
場合でも、そのバッファーを表示している任意のウィンドウを任意の方向にリサイズできるとはいえない。これを決定するには、関数window-resizable
を使用する。Resizing Windowsを参照のこと。
以降の関数は、ある特定の大きさのウィンドウにたいして、それのwindow-min-height
とwindow-min-width
とwindow-size-fixed
の値と、領域のサイズを示す。
この関数は、windowの最小のサイズをリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウ。オプション引数horizontalが非nil
の場合は、windowの最小の列数、それ以外はwindowの最小の行数をリターンすることを意味する。
このリターン値により、windowのサイズが実際にその値にセットされた場合に、windowのすべてのコンポーネントが完全に可視にとどまることが保証される。horizontalがnil
の場合は、モードライン、ヘッダーライン、および下端ディバイダーが含まれる。horizontalが非nil
の場合は、もしあればフリンジ、スクロールバー、右ディバイダーが含まれる。しかしこれには、マージン用に予約済みのスペースは含まれない。
オプション引数ignoreが非nil
の場合は、window-min-height
またはwindow-min-width
によりセットされる固定サイズのウィンドウに強いられる制限を無視することを意味する。ignoreがsafe
の場合は、生きたウィンドウは可能な限り小さなwindow-safe-min-height
の行と、window-safe-min-width
の列を得る。ignoreにウィンドウが指定された場合は、そのウィンドウにたいする制限だけを無視する。その他の非nil
値では、すべてのウィンドウにたいする上記制限のすべてが無視されることを意味する。
オプション引数pixelwiseが非nil
の場合は、windowの最小サイズがピクセルで計数されてリターンされることを意味する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、フレームのサイズを変更せずにウィンドウのサイズを変更する関数について説明します。生きたウィンドウはオーバーラップしないので、これらの関数は2つ以上のウィンドウを含む関数上でのみ意味があります(ウィンドウのリサイズにより隣接するウィンドウのサイズも変更される)。フレーム上に単一のウィンドウしか存在しない場合には、フレームの変更以外によりウィンドウのサイズ変更はできません(Frame Size And Positionを参照)。
注記した場合を除き、これらの関数は引数として内部ウィンドウも受け付けます。内部ウィンドウのリサイズにより、同じスペースにフィットするよう、子ウィンドウもリサイズされます。
この関数は、windowのサイズがdelta行により垂直に変更され得る場合は、deltaをリターンする。オプション引数horizontalが非nil
の場合は、windowがdelta列単位に水平方向にリサイズ可能ならば、かわりにdeltaをリターンする。これは、実際にはウィンドウのサイズを変更しない。
windowがnil
の場合のデフォルトは選択されたウィンドウ。
deltaが正の値の場合は、そのウィンドウが行または列の単位で拡張可能かどうかをチェックすることを意味し、deltaが負の値の場合は、そのウィンドウが行または列の単位で縮小可能かどうかをチェックすることを意味する。deltaが非0の場合のリターン値0は、そのウィンドウがリサイズ可能であることを意味する。
通常、変数window-min-height
とwindow-min-width
は許容される最小のウィンドウサイズを指定する(Window Sizesを参照)。しかし、オプション引数ignoreが非nil
の場合、この関数はwindow-size-fixed
と同様にwindow-min-height
とwindow-min-width
を無視する。そのかわりに、ヘッダーライン、モードライン、(もしあれば)下端ディバイダーに加えて1行分の高さのテキストエリアから構成されるウィンドウを、最小高さのウィンドウとし、フリンジ、マージン、スクロールバー、(もしあれば)右ディバイダーに加えて1列分の幅のテキストエリアから構成されるウィンドウを、最小幅のウィンドウと判断する。
オプション引数pixelwiseが非nil
の場合、deltaはピクセル単位として解釈される。
この関数は、windowをdelta増加することによりリサイズする。horizontalがnil
の場合は高さをdelta行、それ以外は幅をdelta行変更する。正のdeltaはウィンドウの拡大、負のdeltaは縮小を意味する。
windowがnil
の場合のデフォルトは、選択されたウィンドウである。要求されたようにウィンドウをリサイズできない場合は、エラーをシグナルする。
オプション引数ignoreは、上述の関数window-resizable
の場合と同じ意味をもつ。
オプション引数pixelwiseが非nil
の場合、deltaはピクセル単位として解釈される。
この関数はどのウィンドウのエッジを変更するかの選択は、オプションwindow-combination-resize
の値と、関連するウィンドウのコンビネーションリミット(combination
limits: 組み合わせ制限)に依存し、両方のエッジを変更するような場合もいくつかある。Recombining Windowsを参照のこと。ウィンドウの下端または右端のエッジを移動することだけでリサイズするには、関数adjust-window-trailing-edge
を使用すること。
この関数は、windowの下端エッジをdelta行分移動する。オプション引数horizontalが非nil
の場合は、かわりに右端エッジをdelta列分移動する。windowがnil
の場合のデフォルトは、選択されたウィンドウである。
オプション引数pixelwiseが非nil
の場合、deltaはピクセル単位として解釈される。
正のdeltaはエッジを下方もしくは右方へ移動し、負のdeltaはエッジを上方もしくは左方へ移動する。deltaで指定された範囲までエッジを移動できない場合、この関数はエラーをシグナルすることなく、可能な限りエッジを移動する。
この関数は、移動されたエッジに隣接するウィンドウのリサイズを試みる。何らかの理由(隣接するウィンドウが固定サイズの場合等)により、それが不可能な場合は、他のウィンドウをリサイズするかもしれない。
このオプションの値が非nil
の場合、Emacsはウィンドウをピクセル単位でリサイズする。現在のところ、これはsplit-window
(Splitting Windowsを参照)、maximize-window
、minimize-window
、fit-window-to-buffer
、shrink-window-if-larger-than-buffer
(すべて以下に記述)、およびfit-frame-to-buffer
(Frame Size And Positionを参照)のような関数に影響を与える。
あるフレームのピクセルサイズがそのフレームの文字サイズの整数倍でないときは、たとえこのオプションがnil
であっても、少なくとも1つのウィンドウがピクセル単位でリサイズされるであろうことに注意されたい。デフォルト値はnil
である。
以下のコマンドは、より具体的な方法でウィンドウをリサイズします。これらがインタラクティブに呼び出されたときは、選択されたウィンドウにたいして作用します。
このコマンドは、windowの高さまたは幅を、ウィンドウ内のテキストにフィットするように調整する。windowがリサイズできた場合は非nil
、それ以外はnil
をリターンする。windowが省略またはnil
の場合のデフォルトは選択されたウィンドウ、それ以外の場合は生きたウィンドウであること。
windowが垂直コンビネーションの一部の場合、この関数はwindowの高さを調整する。新たな高さは、そのウィンドウのバッファーのアクセス可能な範囲の実際の高さから計算される。オプション引数max-heightが非nil
の場合、それはこの関数がwindowに与えることができる、最大のトータル高さを指定する。オプション引数min-heightが非nil
の場合、それは与えることができる最小のトータル高さを指定し、それは変数window-min-height
をオーバーライドする。max-heightとmin-heightはどちらも、(もしあれば)モードライン、ヘッダーライン、下端ディバイダーを含む行数で指定する。
windowが水平コンビネーションの一部で、かつオプションfit-window-to-buffer-horizontally
(以下参照)の値が非nil
の場合、この関数はwindowの幅を調整する。新たな幅は、windowのカレントのスタート位置以降の、バッファーの最長の行から計算される。オプション引数max-widthは最大幅を指定し、デフォルトはwindowのフレーム幅である。オプション引数min-widthは最小幅を指定し、デフォルトはwindow-min-width
である。max-widthとmin-widthはどちらも、(もしあれば)フリンジ、マージン、スクロールバーを含む列数で指定する。
オプションfit-frame-to-buffer
(以下参照)が非nil
の場合、この関数はfit-frame-to-buffer
(see section Frame Size And Position)を呼び出すことにより、windowのコンテンツにフィットするように、windowのフレームのリサイズを試みるだろう。
これが非nil
の場合、fit-window-to-buffer
はウィンドウを水平方向にリサイズできる。これがnil
(デフォルト)の場合、fit-window-to-buffer
はウィンドウウィンドウ決して水平方向にリサイズしない。これがonly
の場合は、ウィンドウを水平方向だけにリサイズできる。その他の値では、fit-window-to-buffer
がウィンドウをどちらの方向にもリサイズできることを意味する。
このオプションが非nil
の場合、fit-window-to-buffer
はフレームをフレームのコンテンツにフィットさせることができる。フレームは、フレームのルートウィンドウが生きたウィンドウで、かつこのオプションが非nil
の場合のみ、フィットされる。これがhorizontally
の場合、フレームは水平方向にのみフィットされる。これがvertically
の場合、フレームは垂直方向にのみフィットされる。その他の非nil
値は、フレームがどちらの方向にもフィットできることを意味する。
このコマンドは、windowにたいしてそのバッファーを完全に表示できるが、window-min-height
以上の行を表示できるまで、可能な限りwindowの高さを縮小する。リターン値は、そのウィンドウがリサイズされれば非nil
、それ以外は非nil
。windowが省略またはnil
の場合のデフォルトは、選択されたウィンドウである。それ以外では、生きたウィンドウであること。
このコマンドは、そのウィンドウがバッファーのすべてを表示するにはすでに高さが低すぎる場合、バッファーのどこかがスクリーンからスクロールオフされている場合、またはそのウィンドウがフレーム内で唯一の生きたウィンドウの場合は何も行わない。
このコマンドは、自身の処理を行うために、fit-window-to-buffer
(上記参照)を呼び出す。
この関数は、各ウィンドウにたいして完全な幅、および/または完全な高さを与えるような方法により、各ウィンドウのバランスをとる。window-or-frameにフレームを指定した場合は、そのフレーム上のすべてのウィンドウのバランスをとる。window-or-frameにウィンドウを指定した場合は、そのウィンドウとウィンドウのsiblings(兄弟)にたいしてのみのバランスをとる(Windows and Framesを参照)。
この関数は、選択されたフレーム上のすべてのウィンドウにたいして、おおよそ同じスクリーンエリアを与えようと試みる。完全な幅、または高さをもつウィンドウにたいしては、他のウィンドウと比較して、より多くのスペースは与えられない。
この関数は、windowにたいして、そのフレームをリサイズしたり、他のウィンドウを削除することなく、水平垂直の両方向において、可能な限り大きくなるように試みる。windowが省略またはnil
の場合のデフォルトは、選択されたウィンドウである。
この関数は、windowにたいして、そのフレームをリサイズしたり、そのウィンドウを削除することなく、水平垂直の両方向において、可能な限り小さくなるように試みる。windowが省略またはnil
の場合のデフォルトは、選択されたウィンドウである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、既存のウィンドウを分割(split: スプリットすることにより、新たにウィンドウを作成する関数について説明します。
この関数は、ウィンドウwindowの隣に、新たに生きたウィンドウを作成する。windowが省略またはnil
の場合のデフォルトは、選択されたウィンドウである。そのウィンドウは“分割(split)”されて、サイズは縮小される。そのスペースは、リターンされる新たなウィンドウにより吸収される。
オプションの第2引数sizeは、windowおよび/または新たなウィンドウのサイズを決定する。これが省略またはnil
の場合は、両方のウィンドウに同じサイズが割り当てられる。行数が奇数の場合、余りの1行は新たなウィンドウに割り当てられる。sizeが正の数値の場合、windowにsizeの行数(sideの値によっては列数)が与えられる。sizeが負の数値の場合、新たなウィンドウに-sizeの行数(または列数)が与えられる。
sizeがnil
の場合、この関数は変数window-min-height
とwindow-min-width
にしたがう(Window Sizesを参照)。つまり、分割によりこれらの変数の指定より小さいウィンドウが作成されるようなときは、エラーをシグナルする。しかし、sizeにたいして非nil
値を指定すれば、これらの変数は無視される。その場合、許容される最小のウィンドウは、テキストエリアの高さが1行、および/または幅が2列のウィンドウであるとされる。
したがって、sizeが指定された場合、生成されるウィンドウがモードラインやスクロールバー等すべてのエリアを含むのに十分な大きさがあるかどうかチェックするのは、呼び出し側の責任である。これに関して、必要最小限のwindowを決定するために、関数window-min-size
(Window Sizesを参照)を使用できる。新たなウィンドウは通常、モードラインやスクロールバー等のエリアをwindowから“継承”するので、この関数は新たなウィンドウの最小サイズも良好に推定する。呼び出し側は、次回の再表示前にこれに応じて継承されたエリアを削除する場合のみ、より小さなサイズを指定すること。
オプションの第3引数sideは、新たなウィンドウの位置をwindowから相対的に指定する。nil
またはbelow
の場合、新たなウィンドウはwindowの下に、above
の場合はwindowの上に配される。どちらの場合も、sizeはウィンドウのトータル高さを行数で指定する。
sideがt
またはright
の場合、新たなウィンドウはwindowの右に、sideがleft
の場合はwindowの左に配される。どちらの場合も、sizeはウィンドウのトータル幅を列数で指定する。
オプションの第4引数pixelwiseが非nil
の場合は、sizeを行や列ではなくピクセル単位で解釈することを意味する。
windowが生きたウィンドウの場合、新たなウィンドウはマージンやスクロールバーを含む、さまざまなプロパティを継承する。windowが内部ウィンドウ(internal window)の場合、新たなウィンドウはwindowのフレームのプロパティを継承する。
変数ignore-window-parameters
がnil
の場合に限り、この関数の挙動はwindowなパラメーターにより変更されるかもしれない。ウィンドウパラメーターsplit-window
の値がt
の場合、この関数はその他すべてのウィンドウパラメーターを無視する。それ以外では、ウィンドウパラメーターsplit-window
の値が関数の場合は、split-window
の通常アクションのかわりに、引数window、size、sideでその関数が呼び出される。値が関数以外の場合、この関数は(もしあれば)ウィンドウパラメーターwindow-atom
またはwindow-side
にしたがう。Window Parametersを参照のこと。
例として、Windows and Framesで議論したウィンドウ構成(window
configuration)を得るための、一連のsplit-window
呼び出しを以下に挙げます。この例では、生きたウィンドウの分割と、内部ウィンドウの分割も示します。最初はW4で表される、単一のウィンドウ(生きたルートウィンドウ)を含むフレームから開始します。(split-window
W4)
を呼び出すことにより、以下のウィンドウ構成が得られます。
______________________________________ | ____________________________________ | || || || || || || ||_________________W4_________________|| | ____________________________________ | || || || || || || ||_________________W5_________________|| |__________________W3__________________|
split-window
呼び出しにより、W5で示す生きたウィンドウが新たに作成されました。W3で示される内部ウィンドウも新たに作成され、これはルートウィンドウかつW4とW5の親ウィンドウになります。
次は、引数として内部ウィンドウW3を渡して、(split-window W3 nil 'left)
を呼び出します。
______________________________________ | ______ ____________________________ | || || __________________________ || || ||| ||| || ||| ||| || ||| ||| || |||____________W4____________||| || || __________________________ || || ||| ||| || ||| ||| || |||____________W5____________||| ||__W2__||_____________W3_____________ | |__________________W1__________________|
内部ウィンドウW3の左に、生きたウィンドウW2が新たに作成されました。そして、内部ウィンドウW1が新たに作成され、これが新たにルートウィンドウになります。
インタラクティブな使用にたいして、Emacsは選択されたウィンドウを常に分割するコマンドを2つ提供します。これらは内部でsplit-window
を呼び出します。
この関数は、選択されたウィンドウが左となるような、横並びの2つのウィンドウに分割する。sizeが正ならば左のウィンドウがsize列、負ならば右のウィンドウが-size列を与えられる。
この関数は、選択されたウィンドウが上となるような、縦並びの2つのウィンドウに分割する。sizeが正ならば上のウィンドウがsize行、負ならば下のウィンドウが-size行を与えられる。
この変数の値が非nil
(デフォルト)なら、 split-window-below
は上述のように振る舞う。
nil
の場合、split-window-below
は再表示が最小となるように、2つのウィンドウの各ポイントを調節する(これは低速な端末で有用である)。これは何であれ、以前ポイントがあったスクリーン行(screen
line)を含むウィンドウを選択する。これは低レベルsplit-window
関数ではなく、split-window-below
だけに影響することに注意。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウを削除(delete)することにより、フレームのウィンドウツリーからウィンドウが取り除かれます。それが生きたウィンドウの場合は、スクリーンに表示されなくなります。内部ウィンドウの場合は、その子ウィンドウも削除されます。
ウィンドウを削除した後でも、それへの参照が残っている限り、Lispオブジェクトとして存在し続けます。ウィンドウ構成(window configuration)をリストアすることにより、ウィンドウの削除は取り消すことができます(Window Configurationsを参照)。
この関数は、表示からwindowを削除して、nil
をリターンする。windowが省略またはnil
の場合のデフォルトは、選択されたウィンドウである。そのウィンドウを削除するとウィンドウツリーにウィンドウが存在しなくなるような場合(それがフレーム内で唯一の生きたウィンドウである場合等)は、エラーをシグナルする。
デフォルトでは、windowが占めていたスペースは、(もしあれば)隣接する兄弟ウィンドウのうちの1つに与えられる。しかし、変数window-combination-resize
が非nil
の場合、そのスペースはウィンドウコンビネーション内の残りのすべてのウィンドウに比例的に分配される。See section Recombining Windowsを参照のこと。
変数ignore-window-parameters
がnil
の場合に限り、この関数の振る舞いはwindowのウィンドウパラメーターにより変更される可能性がある。ウィンドウパラメーターdelete-window
の値がt
の場合、この関数はその他すべてのウィンドウパラメーターを無視する。ウィンドウパラメーターdelete-window
が関数の場合は、通常のdelete-window
のかわりに、引数windowでその関数が呼び出される。それ以外では、この関数は(もしあれば)ウィンドウパラメーターwindow-atom
またはwindow-side
にしたがう。Window Parametersを参照のこと。
この関数は、必要に応じて他のウィンドウを削除することにより、windowでフレームを充填する。windowが省略またはnil
の場合のデフォルトは、選択されたウィンドウである。リターン値はnil
。
変数ignore-window-parameters
がnil
の場合に限り、この関数の振る舞いは変更される可能性がある。ウィンドウパラメーターdelete-other-windows
の値がt
の場合、この関数は他のすべてのウィンドウパラメーターを無視する。ウィンドウパラメーターdelete-other-windows
の値が関数の場合は、delete-other-windows
の通常の動作のかわりに、引数windowでその関数が呼び出される。それ以外では、この関数は(もしあれば)ウィンドウパラメーターwindow-atom
またはwindow-side
にしたがう。Window Parametersを参照のこと。
この関数は、buffer-or-nameを表示しているすべてのウィンドウにたいしてdelete-window
を呼び出すことにより、それらを削除する。buffer-or-nameはバッファー、またはバッファー名であること。省略またはnil
の場合のデフォルトはカレントバッファーである。指定されたバッファーを表示するウィンドウが存在しない場合、この関数は何も行わない。ミニバッファーが指定された場合は、エラーをシグナルする。
そのバッファーの表示に専用(dedicated)のウィンドウがあり、フレーム上でそれが唯一のウィンドウの場合、それが端末上で唯一のフレームでなければ、この関数はそのフレームも削除する。
オプション引数frameは、操作を行うフレームがどれかを指定する:
nil
すべてのフレームを処理することを意味する。
t
選択されたフレームを処理することを意味する。
visible
可視なすべてのフレームを処理することを意味する。
0
可視またはアイコン化されたすべてのフレームを処理することを意味する。
この引数の意味は、すべての生きたウィンドウを走査する他の関数(Cyclic Ordering of Windowsを参照)における場合とは異なることに注意。特に、ここでのt
とnil
のもつ意味は、これら他の関数の場合とは逆である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウWの最後の兄弟を削除したときは、ウィンドウツリー内の親ウィンドウをWを置き換えることにより、その親ウィンドウも削除されます。これは、新たなウィンドウコンビネーションを形成するために、Wがその親の兄弟たちと再結合されなければならないことを意味します。生きたウィンドウを削除することにより、必然的に2つの内部ウィンドウが削除されるかもしれない場合もあります。
______________________________________ | ______ ____________________________ | || || __________________________ || || ||| ___________ ___________ ||| || |||| || |||| || ||||____W6_____||_____W7____|||| || |||____________W4____________||| || || __________________________ || || ||| ||| || ||| ||| || |||____________W5____________||| ||__W2__||_____________W3_____________ | |__________________W1__________________|
この構成におけるW5の削除は、通常はW3とW4の削除を引き起こします。残りの生きたウィンドウW2、W6、W7は親をW7とする水平コンビネーションを形成するために再結合されます。
しかし、ときにはW4のような親ウィンドウを削除しないほうが合理的な場合もあります。特に、親ウィンドウが同じタイプのコンビネーション内に埋め込まれるコンビネーションを保護するために使用されるときは、それを削除するべきではありません。そのような埋め込みは、あるウィンドウを分割した後に続けて新たなウィンドウを削除する際、Emacsが関連するフレームで分割前にあったレイアウトを確実に再確立するために意味があります。
親がW1であるような2つの生きたウィンドウW2とW3を開始点とするシナリオを考えてみましょう。
______________________________________ | ____________________________________ | || || || || || || || || || || || || ||_________________W2_________________|| | ____________________________________ | || || || || ||_________________W3_________________|| |__________________W1__________________|
W2を分割すると、以下のようにウィンドウW4が新たに作成されます。
______________________________________ | ____________________________________ | || || || || ||_________________W2_________________|| | ____________________________________ | || || || || ||_________________W4_________________|| | ____________________________________ | || || || || ||_________________W3_________________|| |__________________W1__________________|
ここでウィンドウを垂直方向に拡大すると、Emacsはもしそのようなウィンドウがあれば、下位の兄弟ウィンドウから対応するスペースを得ようと試みます。このシナリオでふぁW4の拡大により、W3からスペースが奪われます。
______________________________________ | ____________________________________ | || || || || ||_________________W2_________________|| | ____________________________________ | || || || || || || || || ||_________________W4_________________|| | ____________________________________ | ||_________________W3_________________|| |__________________W1__________________|
W4を削除すると、前にW3から奪ったスペースを含む、スペース全体がW2に与えられるでしょう。
______________________________________ | ____________________________________ | || || || || || || || || || || || || || || || || ||_________________W2_________________|| | ____________________________________ | ||_________________W3_________________|| |__________________W1__________________|
これは特にW4が一時的にバッファーを表示するために使用されていて(Temporary Displaysを参照)、かつ初期のレイアウトで作業を継続したい場合は直感に反するかもしれません。
この振る舞いは、W2を分割する際に、新たな親ウィンドウを作成することにより解決できます。
この変数は、ウィンドウ分割により新たに親ウィンドウを作成させるかどうかを制御する。以下の値が認識される:
nil
これは、既存のウィンドウコンビネーションと同じ方向で分割が発生した場合(これ以外の場合は、いずれにせよ内部ウィンドウが新たに作成される)は、既存の親ウィンドウが存在するならば、新たな生きたウィンドウがそれを共有できることを意味する。
window-size
この場合、display-buffer
はalist引数内のエントリーwindow-height
またはwindow-width
に親ウィンドウが渡されるなら、新たに親ウィンドウを作成する(Action Functions for display-buffer
を参照)。
temp-buffer
この値は、一時的なバッファーを表示するウィンドウの分割に際し、新たに親ウィンドウを作成する。
display-buffer
これは、display-buffer
(Choosing a Window for Displayを参照)がウィンドウを分割する際に、常に親ウィンドウを新たに作成することを意味する。
t
この場合は、ウィンドウを分割する際、常に親ウィンドウが新たに作成される。したがって、この変数の値が常にt
の場合は、すべてのウィンドウツリーm常に2分木(ルートウィンドウ以外のすべてのウィンドウが正確に1つの兄弟をもつようなツリー)になる。
デフォルトはnil
で、これら以外の値は将来のために予約済みである。
この返信のセッティングの結果としてsplit-window
が新たに親ウィンドウを作成した場合は、新たに作成された内部ウィンドウにたいしてset-window-combination-limit
(以下参照)も呼び出す。これは、子ウィンドウが削除された際の、ウィンドウツリーの再配置に影響する(以下参照)。
window-combination-limit
がt
の場合、このシナリオの初期構成では以下のようになるでしょう:
______________________________________ | ____________________________________ | || __________________________________ || ||| ||| |||________________W2________________||| || __________________________________ || ||| ||| |||________________W4________________||| ||_________________W5_________________|| | ____________________________________ | || || || || ||_________________W3_________________|| |__________________W1__________________|
子としてW2および新たな生きたウィンドウをもつ内部ウィンドウW5が新たに作成されます。ここでW2はW4の唯一の兄弟なので、W4を拡大するとW3は変更せずに、W2を縮小しようと試みるでしょう。W5は垂直コンビネーションW1に埋め込まれた、2つのウィンドウからなる垂直コンビネーションを表すことに注意してください。
この関数は、ウィンドウwindowのコンビネーションリミット(combination limit:
結合限界をlimitにセットする。この値は、関数window-combination-limit
を通じて取得できる。効果については以下を参照のこと。これは内部ウィンドウにたいしてのみ意味をもつことに注意されたい。split-window
は、呼び出された際に変数window-combination-limit
がt
ならば、t
をlimitとして、この関数を呼び出す。
この関数は、windowにたいするコンビネーションリミットをリターンする。
コンビネーションリミットは、内部ウィンドウにたいしてのみ意味をもつ。これがnil
の場合は、Emacsはウィンドウ削除に応じて、兄弟同士で新たなウィンドウコンビネーションを形成することにより、windowの子ウィンドウをグループ化するために、windowの自動的な削除を許す。コンビネーションリミットがt
の場合、windowの子ウィンドウは、その兄弟と自動的に再結合されることは決してない。
このセクションの冒頭で示した構成の場合、W4(W6とW7の親ウィンドウ)のコンビネーションリミットはt
なので、t
を削除しても暗黙でW4も削除されることはない。
かわりに、同じ構成内の中の1つのウィンドウが分割または削除されたときは常に構成内のすべてのウィンドウをリサイズすることにより、上記で示した問題を避けることができます。これは、そのような操作にたいして、この方法以外では小さすぎるようなウィンドウの分割も可能にします。
この変数がnil
の場合、split-window
はウィンドウ(以下window)自身と新たなウィンドウの両方にたいして、windowのスクリーンエリアが十分大きい場合のみ、windowを分割できる。
この変数がt
の場合、split-window
は新たなウィンドウに対応するため、windowと同じコンビネーション内の、すべてのウィンドウのリサイズを試みる。これは特に、windowが固定サイズウィンドウのときや、通常の分割には小さすぎるときも、split-window
をが成功することを許す。さらに、続けてwindowをリサイズ、または削除すると、そのコンビネーション内のその他すべてのウィンドウをリサイズする。
デフォルトはnil
で、それ以外の値は、将来の使用のため予約済みである。この変数の値は、window-combination-limit
が非nil
の場合は無視される。
window-combination-resize
の効果を説明するために、以下のフレームレイアウトを考えてください。
______________________________________ | ____________________________________ | || || || || || || || || ||_________________W2_________________|| | ____________________________________ | || || || || || || || || ||_________________W3_________________|| |__________________W1__________________|
window-combination-resize
がnil
の場合、ウィンドウW3を分割しても、W2のサイズは変更されません:
______________________________________ | ____________________________________ | || || || || || || || || ||_________________W2_________________|| | ____________________________________ | || || ||_________________W3_________________|| | ____________________________________ | || || ||_________________W4_________________|| |__________________W1__________________|
window-combination-resize
がt
の場合は、W3を分割すると3つの生きたウィンドウすべてを、おおよそ同じ高さにします:
______________________________________ | ____________________________________ | || || || || ||_________________W2_________________|| | ____________________________________ | || || || || ||_________________W3_________________|| | ____________________________________ | || || || || ||_________________W4_________________|| |__________________W1__________________|
生きたウィンドウW2、W3、W4のいずれを削除しても、削除されたウィンドウのスペースは、残りの2つの生きたウィンドウに相対的に分配されます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は、windowを選択されたウィンドウにして、そのフレーム内で選択されたウィンドウとし(Basic Concepts of Emacs Windowsを参照)、そのフレームを選択する。また、windowのバッファー(Buffers and Windowsを参照)をカレントにして、そのバッファーのpoint
の値(Windows and Pointを参照)を、windowのwindow-point
の値にセットする。windowは生きたウィンドウでなければならない。リターン値はwindowである。
デフォルトでは、この関数はwindowのバッファーをバッファーリストの先頭(The Buffer Listを参照)に移動して、windowをもっとも最近選択されたウィンドウにする。しかし、オプション引数norecordが非nil
の場合は、これらの追加処理は省略される。
この関数は、norecordがnil
ならば、buffer-list-update-hook
(The Buffer List)を実行する。コーディングを単純にするために、アプリケーションや内部ルーチンは、しばしばウィンドウを一時的に選択することがあることに注意。一般的には、そのような選択(以下のマクロsave-selected-window
とwith-selected-window
による選択も含む)は記録されないので、buffer-list-update-hook
の汚染は避けられる。選択を“実際にカウント”するのは、windowのフレームの次回表示時に可視の変更が発生したときで、それらは常に記録されるべきである。これは、あるウィンドウが選択されるたびに関数を実行するためには、それをbuffer-list-update-hook
に配するのが良い選択であることも意味している。
引数norecordに非nil
を指定したselect-window
の連続呼び出しは、ウィンドウの並び順を選択時刻により決定します。関数get-lru-window
は、もっとも昔に選択された生きたウィンドウ(Cyclic Ordering of Windowsを参照)を取得するために使用できます。
このマクロは、選択されたフレーム、同様に各フレームの選択されたウィンドウを記録し、formsを順に実行してから、以前に選択されていたフレームとウィンドウをリストアする。これはカレントバッファーの保存とリストアも行う。リターン値はforms内の最後のフォームの値である。
このマクロは、ウィンドウのサイズ、コンテンツ、配置についての保存やリストアは何も行わない。したがって、formsがそれらを変更した場合、その変更は永続化される。あるフレームにおいて以前に選択されていたウィンドウがformsのexit時にもはや生きていない場合、そのフレームの選択されたウィンドウはそのまま放置される。以前に選択されていたウィンドウがもはや生きていない場合はformsの最後に選択されていたウィンドウが何であれ、それが選択されたままになる。カレントバッファーformsのexit時にそれが生きている場合のみリストアされる。
このマクロは、もっとも最近に選択されたウィンドウとバッファーリストの順番を、どちらも変更しない。
このマクロはwindowを選択して、formsを順に実行してから、以前に選択されていたウィンドウとカレントバッファーをリストアする。たとえば、引数norecordをnil
でselect-window
を呼び出す等、forms内で故意に変更しない限り、もっとも最近に選択されたウィンドウとバッファーリストの順番は変更されない。
このマクロは、もっとも最近に選択されたウィンドウとバッファーリストの順番を変更しない。
この関数は、フレームframe内で選択されているウィンドウをリターンする。frameは生きたフレームであること。省略またはnil
の場合のデフォルトは、選択されたフレームである。
この関数は、windowをフレームframe内で選択されたウィンドウにする。frameは生きたフレームであること。省略またはnil
の場合のデフォルトは、選択されたフレームである。windowは生きたウィンドウであること。省略またはnil
の場合のデフォルトは選択されたウィンドウである。
frameが選択されたフレームの場合は、windowを選択されたウィンドウにする。
オプション引数norecordが非nil
の場合、この関数はもっとも最近に選択されたウィンドウのリストとバッファーリストを、どちらも変更しない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他のウィンドウを選択するためにコマンドC-x
o(other-window
)を使う際には、特定の順番で生きたウィンドウを巡回します。与えられた任意のウィンドウ構成にたいして、この順序は決して変更されません。これは、ウィンドウのサイクル順序(cyclic
ordering of windows)と呼ばれます。
この順序は、そのフレームのリーフノードである生きたウィンドウを取得するために、ツリーを深さ優先で走査することにより決定されます(Windows and Framesを参照)。ミニバッファーがアクティブな場合は、ミニバッファーウィンドウも含まれます。この順序は巡回的(cyclic)なので、この順序の最後のウィンドウの次には最初のウィンドウが配されます。
この関数は、ウィンドウのサイクル順でwindowの次の生きたウィンドウをリターンする。windowは生きたウィンドウであること。省略またはnil
の場合のデフォルトは選択されたウィンドウである。
オプション引数minibufは、サイクル順にミニバッファーウィンドウを含めるべきかどうかを指定する。通常は、minibufがnil
のときは、ミニバッファーウィンドウがカレントで“アクティブ”な場合のみミニバッファーウィンドウが含まれる。これは、C-x
oの振る舞うと合致する(ミニバッファーが使用されている限りミニバッファーウィンドウはアクティブであることに注意。Minibuffersを参照のこと)。
minibufがt
の場合、サイクル順にはすべてのミニバッファーウィンドウが含まれる。minibufがt
とnil
のいずれとも異なる場合は、たとえアクティブであってもミニバッファーウィンドウは含まれない。
オプション引数all-framesは、考慮に入れるフレームを指定する:
nil
を指定した場合は、windowのフレーム上にあるウィンドウを考慮することを意味する。。(minibuf引数で指定されたことにより)ミニバッファーウィンドウが考慮される場合は、ミニバッファーウィンドウを共有するフレームも考慮される。
t
を指定した場合は、すべての既存フレーム上のウィンドウを考慮することを意味する。
visible
を指定した場合は、すべての可視フレーム上のウィンドウを考慮することを意味する。
複数のフレームが考慮される場合は、すべての生きたフレームのリストの順にしたがってそれらのフレームを順に追加することにより、サイクル順を取得する(Finding All Framesを参照)。
この関数は、ウィンドウのサイクル順においてwindowの前に位置する、生きたウィンドウをリターンする。その他の引数は、next-window
の場合と同様に処理される。
この関数は、ウィンドウのサイクル順において、選択されたウィンドウからcount番目に位置する、生きたウィンドウをリターンする。countが正の数ならcount個のウィンドウを前方にスキップし、負の数なら-count個のウィンドウを後方にスキップする。countが0の場合は、選択されたウィンドウを単に再選択する.インタラクティブに呼び出された場合、countはプレフィックス数引数である。
オプション引数all-framesは、next-window
にnil
のminibuf引数を指定したときのnext-window
の場合と同じ意味をもつ。
この関数は、非nil
のウィンドウパラメーターno-other-window
をもつウィンドウを選択しない。
この関数は、生きたウィンドウそれぞれにたいして、ウィンドウを引数に関数funを呼び出す。
これはウィンドウのサイクル順にしたがう。オプション引数minibufとall-framesは、含まれるウィンドウセットを指定する。これらは、next-window
の引数の場合と同じ意味をもつ。all-framesがフレームを指定する場合、最初に処理されるのはそのフレームの最初のウィンドウ(frame-first-window
がリターンするウィンドウ)であり、選択されたウィンドウである必要はない。
funがウィンドウの分割や削除によりウィンドウ構成を変更する場合でも、処理するウィンドウセットは初回のfun呼び出しに先立ち決定されるため、変更されない。
この関数は、選択されたウィンドウが唯一の生きたウィンドウの場合はt
、それ以外はnil
をリターンする。
ミニバッファーウィンドウがアクティブな場合、ミニバッファーウィンドウは通常は考慮される(そのため、この関数はnil
をリターンする)。しかし、オプション引数no-miniが非nil
の場合は、たとえアクティブであっても、ミニバッファーウィンドウは無視される。オプション引数all-framesは、next-window
の場合と同じ意味をもつ。
以下は、何らかの条件を満足するウィンドウを、それらを選択することなくリターンする関数です:
この関数は、発見的には“もっとも最近に使用された”ウィンドウであるような、生きたウィンドウをリターンする。オプション引数all-framesは、next-window
の場合と同じ意味をもつ。
フル幅のウィンドウが存在する場合は、それらのウィンドウだけが考慮される。ミニバッファーが候補になることは、決してない。オプション引数dedicatedがnil
の場合は、専用のバッファー(Dedicated Windowsを参照)が候補になることは、決してない。唯一の候補が選択されたウィンドウである場合以外は、決して選択されたウィンドウをリターンしない。しかし、オプション引数not-selectedが非nil
ならば、そのような場合でもこの関数はnil
をリターンする。
この関数は、もっとも大きいエリア(高さ掛ける幅)をもつウィンドウをリターンする。オプション引数all-framesは検索するウィンドウを指定し、意味はnext-window
の場合と同様。
ミニバッファーウィンドウは決して候補とならない。オプション引数dedicatedがnil
の場合、専用ウィンドウ(Dedicated Windowsウィンドウを参照)は決して候補にならない。オプション引数not-selectedが非nil
の場合、選択されたウィンドウは決して候補にならない。オプション引数not-selectedが非nil
、かつ唯一の候補が選択されたウィンドウの場合、この関数はnil
をリターンする。
同サイズの候補ウィンドウが2つある場合、この関数はウィンドウのサイクル順で、選択されたウィンドウから数えて最初にあるウィンドウを優先する。
この関数は、ウィンドウのサイクル順内の各ウィンドウにたいして、そのウィンドウを引数に、関数predicateを順に呼び出す。いずれかのウィンドウにたいしてpredicateが非nil
をリターンした場合、この関数は処理を停止して、そのウィンドウをリターンする。そのようなうlが見つからなければ、リターン値はdefault(これのデフォルトはnil
)となる。
オプション引数
minibufとall-framesは検索するウィンドウを指定し、意味はnext-window
の場合と同様である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ウィンドウのコンテンツを調べたりセットするための、低レベルな関数を説明します。ウィンドウ内に特定のバッファーを表示するための高レベルな関数については、Switching to a Buffer in a Windowを参照してください。
この関数は、windowが表示しているバッファーをリターンする。windowが省略またはnil
の場合のデフォルトは、選択されたウィンドウである。windowが内部ウィンドウの場合、この関数はnil
をリターンする。
この関数は、
windowにbuffer-or-nameウィンドウ表示させる。windowは生きたウィンドウであること。nil
の場合のデフォルトは、選択されたウィンドウである。buffer-or-nameは、バッファー、あるいは既存のバッファー名であること。この関数は、選択されていたウィンドウを変更せず、カレントバッファーも直接は変更しない(The Current Bufferを参照)。リターン値はnil
である。
windowが、あるバッファーにたいして特に専用で、かつbuffer-or-nameがそのバッファーを指定しない場合、この関数はエラーをシグナルする。Dedicated Windowsを参照のこと。
デフォルトでは、この関数は指定されたバッファーのローカル変数にもとづいて、windowの位置、ディスプレイマージン、フリンジ幅、スクロールバーのセッティングをリセットする。しかし、オプション引数keep-marginsが非nil
の場合は、ディスプレイマージンとフリンジ幅は未変更のままにする。
アプリケーションを記述する際は、直接set-window-buffer
を呼び出すのではなく、通常はSwitching to a Buffer in a Windowで説明する高レベルの関数を使用するべきである。
これは、window-scroll-functions
の後にwindow-configuration-change-hook
を実行する。Hooks for Window Scrolling and Changesを参照のこと。
このバッファーローカル変数は、ウィンドウ内にバッファーが表示された回数を記録する。。これは、そのバッファーにたいしてset-window-buffer
が呼び出されるたびに増分される
このバッファーローカル変数は、バッファーがウィンドウに最後に表示された時刻を記録する。バッファーが表示されたことがない場合は、nil
をリターンする。これは、そのバッファーにたいしてset-window-buffer
が呼び出されるたびに、current-time
がリターンする値により更新される(Time of Dayを参照)。
この関数は、ウィンドウのサイクル順内で、選択されたウィンドウを起点に、buffer-or-nameを表示する最初のウィンドウをリターンする.<(Cyclic Ordering of Windowsを参照)。そのようなウィンドウが存在しない場合、リターン値はnil
となる。
buffer-or-nameはバッファーか、バッファーの名前であること。省略またはnil
の場合のデフォルトは、カレントバッファーである。オプション引数all-framesは、考慮するウィンドウを指定する。
t
は、すべての既存フレーム上のウィンドウを考慮することを意味する。
visible
は、すべての可視フレーム上のウィンドウを考慮することを意味する。
これらの意味は、next-window
のall-frames引数の場合とは若干異なることに注意されたい(Cyclic Ordering of Windowsを参照)。この不一致の解消のために、EEmacsの将来のバージョンにおいて、この関数は変更されるかもしれない。
この関数は、その時点でbuffer-or-nameを表示する、すべてのウィンドウのリストをリターンする。buffer-or-nameはバッファー、または既存バッファーの名前であること。省略またはnil
の場合のデフォルトは、カレントバッファーである。
引数minibufとall-framesは、関数next-window
の場合と同じ意味をもつ(Cyclic Ordering of Windowsを参照)。all-frames引数は、get-buffer-window
の場合と正確に同じようには振る舞わないことに注意すること。
このコマンドは、buffer-or-nameを表示しているすべてのウィンドウで、それを他の何らかのバッファーに置き換える。buffer-or-nameはバッファー、または既存のバッファーの名前であること。省略またはnil
の場合のデフォルトは、カレントバッファーである。
各ウィンドウで置き換えられるバッファーは、switch-to-prev-buffer
を通じて選択される(Window Historyを参照)。buffer-or-nameを表示している専用ウィンドウはすべて、可能なら削除される(Dedicated Windowsを参照)。そのようなウィンドウがそのフレームで唯一のウィンドウで、かつ同一端末上に他のフレームが存在する場合は、そのフレームも同様に削除される。その端末上の唯一のフレームの唯一のウィンドウの場合は、いずれにせよそのバッファーは置き換えられる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、あるウィンドウ内で特定のバッファーにスイッチするための、高レベルな関数について説明します。“バッファーをスイッチする”とは一般的に、(1)そのバッファーをあるウィンドウに表示して、(2)そのウィンドウを選択されたウィンドウとし(かつそのフレームを選択されたフレームとし、(3)そのバッファーウィンドウカレントバッファーにすることを意味します。
Lispプログラムがアクセスや変更できるように、バッファーを一時的にカレントにするのにこれらの関数を使用しないでください。これらはウィンドウヒストリー(Window Historyを参照)の変更のような副作用をもつので、そのような方法での使用はユーザーを驚かせることになるでしょう。バッファーをLispで変更するためにカレントにしたい場合はwith-current-buffer
、save-current-buffer
、set-buffer
を使用します。The Current Bufferを参照してください。
このコマンドは、選択されたウィンドウ内でbuffer-or-nameを表示して、それをカレントバッファーにしようと試みる。これはよくインタラクティブ(C-x bのバインディングで)に使用され、同様にLispプログラムでも使用される。リターン値はスイッチしたバッファーである。
buffer-or-nameがnil
の場合のデフォルトは、other-buffer
によりリターンされるバッファーになる(The Buffer Listを参照)。buffer-or-nameが既存のバッファーの名前でない文字列の場合、この関数はその名前で新たにバッファーを作成する。新たなバッファーのメジャーモードは、変数major-mode
により決定される(Major Modesを参照)。
通常は、指定されたバッファーはバッファーリスト —
グローバルバッファーリストと選択されたフレームのバッファーリストの両方の先頭に置かれる(The Buffer Listを参照)。しかし、オプション引数norecordが非nil
なら、これは行われない。
switch-to-buffer
が、選択されたウィンドウ内にバッファーを表示するのが不可能なことが時折ある。これは、選択されたウィンドウがミニバッファーウィンドウの場合や、選択されたウィンドウがそのバッファーにたいして特に専用(strongly
dedicated)な場合に発生する(Dedicated Windowsを参照)。この場合、このコマンドはpop-to-buffer
(以下参照)を呼び出すことにより、通常は何か他のウィンドウにそのバッファーの表示を試みる。しかし、オプション引数が非nil
なら、かわりにエラーをシグナルする。
デフォルトでは、switch-to-buffer
はバッファーのpoint
位置でバッファーを表示します。この振る舞いは、以下のオプションを使用して調整できます。
この変数がnil
の場合、switch-to-buffer
はbuffer-or-nameにより指定されたバッファーを、そのバッファーのpoint
位置で表示する。この変数がalready-displayed
なら、そのバッファーが任意の可視またはアイコン化されたフレーム上の他のウィンドウで表示されている場合は、選択されたウィンドウ内の以前の位置でのバッファーの表示を試みる。この変数がt
なら、switch-to-buffer
は選択されたウィンドウ内の以前の位置でそのバッファーを表示しようと試みる。
この変数は、バッファーがすでに選択されたウィンドウに表示されているか、これまで表示されたことがない、またはバッファーを表示するためにswitch-to-buffer
がpop-to-buffer
を呼び出した場合は無視される。
以下の2つのコマンドは、説明している機能以外はswitch-to-buffer
と類似しています。
この関数は、buffer-or-nameで指定されたバッファーを、選択されたウィンドウ以外の、別のウィンドウに表示する。これは関数pop-to-buffer
(以下参照)を内部で使用する。
選択されたウィンドウが指定されたバッファーをすでに表示している場合は表示を続けるが、見つかった他のウィンドウも同様にそのバッファーを表示する。
引数buffer-or-nameとnorecordは、switch-to-buffer
の場合と同じ意味をもつ。
この関数は、buffer-or-nameで指定されたバッファーを、新たなフレームに表示する。これは関数pop-to-buffer
(以下参照)を内部で使用する。
指定されたバッファーがすでにカレント端末上の任意のフレームの他のウィンドウに表示されている場合、これはフレームを新たに作成せずにそのウィンドウに切り替える。しかし、これを行うために選択されたウィンドウを使用することは決してない。
引数buffer-or-nameとnorecordは、switch-to-buffer
の場合と同じ意味をもつ。
上述したコマンドは、任意のウィンドウにバッファーを柔軟に表示して、編集用にそのウィンドウを選択する関数pop-to-buffer
を使用しています。次に、pop-to-buffer
はバッファーの表示にdisplay-buffer
を使用します。したがって、display-buffer
に影響する変数も、同様に影響します。display-buffer
のドキュメントについては、Choosing a Window for Displayを参照してください。
この関数は、buffer-or-nameをカレントバッファーにして、なるべく前に選択されていたウィンドウではないウィンドウにそれを表示する。そしてその後に、表示しているウィンドウを選択する。そのウィンドウが別のグラフィカルなフレーム上にある場合は、可能ならそのフレームが入力フォーカスを与えられる(Input Focusを参照)。リターン値は、切り替えたバッファーである。
buffer-or-nameがnil
の場合のデフォルトは、other-buffer
によりリターンされるバッファーになる(The Buffer Listを参照)。buffer-or-nameが既存のバッファーの名前でない文字列の場合、この関数はその名前で新たにバッファーを作成する。新たなバッファーのメジャーモードは、変数major-mode
により決定される(Major Modesを参照)。
actionが非nil
の場合、それはdisplay-buffer
に渡すディスプレイアクション(display
action)であること(Choosing a Window for Displayを参照)。非nil
、非リスト値の場合は、たとえそのバッファーがすでに選択されたウィンドウに表示されていたとしても、選択されたウィンドウではなく、ウィンドウをポップ(pop)することを意味する。
switch-to-buffer
と同様、norecordがnil
なら、この関数はバッファーリストを更新する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コマンドdisplay-buffer
は、表示のために柔軟にウィンドウを選択して、そのウィンドウ内に指定されたバッファーを表示します。これは、キーバインディングC-x
4
C-oを通じて、インタラクティブに呼び出すことができます。また、switch-to-buffer
やpop-to-buffer
を含む、多くの関数およびコマンドにより、サブルーチンとしても使用されます(Switching to a Buffer in a Windowを参照)。
このコマンドは、ウィンドウ内に表示するウィンドウを探すために、いくつかの複雑なステップを実行します。これらのステップはディスプレイアクション(display
actions)を用いて記述されます。ディスプレイアクションは、(function
.
alist)
という形式をもちます。ここで、functionは関数、または関数リストで、わたしたちはこれをアクション関数(action
functions)として参照します。alistは連想リスト(association
list)で、わたしたちはこれをアクションalist(action alists)として参照します。
アクション関数は、表示するバッファーと、アクションalistという、2つの引数を受け取ります。これは、自身の条件にしたがってウィンドウウィンドウ選択、または作成して、バッファーをウィンドウ内に表示します。成功した場合はそのウィンドウ、それ以外はnil
をリターンします。事前定義されたアクション関数については、Action Functions for display-buffer
を参照してください。
display-buffer
は、複数ソースからのディスプレイアクションを組み合わせて、アクション関数のいずれか1つがバッファーの表示を管理して非nil
値をリターンするまで、アクション関数を順に呼び出します。
このコマンドは、ウィンドウウィンドウ選択したり、そのバッファーをカレントにすることなく、buffer-or-nameをウィンドウに表示させる。引数buffer-or-nameはバッファー、または既存のバッファーの名前でなければならない。リターン値は、そのバッファーを表示するために選ばれたウィンドウである。
オプション引数actionが非nil
の場合、それは通常はディスプレイアクション(上述)であること。display-buffer
は、以下のソース(記載順)からディスプレイアクションを集約して、アクション関数リストとアクションalistを構築する:
display-buffer-overriding-action
。
display-buffer-alist
。
display-buffer-base-action
。
display-buffer-fallback-action
。
各アクション関数は、いずれかが非nil
をリターンするまで、第1引数にバッファー、第2引数に組み合わせられたアクションalistで、順番に呼び出される。呼び出し側は、ウィンドウ内にバッファーを表示しない場合を処理する用意があることを示すために、アクションalistの要素として(allow-no-window
. t)
を渡すことができる。
引数actionには非nil
の非list値も指定できる。これは、たとえ選択されたウィンドウがすでにそのバッファーを表示していても、選択されたウィンドウではない別のウィンドウにバッファーが表示されるべきだという、特別な意味をもつ。プレフィックス引数とともにインタラクティブに呼び出された場合、actionはt
である。
オプション引数frameが非nil
の場合は、そのバッファーがすでに表示されているか判断する際、どのフレームをチェックするかを指定する。これはactionのアクションalistに、要素(reusable-frames
. frame)
を追加するのと等価である。Action Functions for display-buffer
を参照のこと。
この変数の値は、display-buffer
により最高の優先順で扱われるディスプレイアクションであること。デフォルト値は空(つまり(nil
. nil)
)である。
このオプションの値は、ディスプレイアクションにコンディション(condition:
状態)をマップするalistである。コンディションはそれぞれ、バッファー名にマッチする正規表現か、2つの引数をとる関数で、引数はバッファー名とdisplay-buffer
に渡すaction引数である。display-buffer
に渡されたバッファー名がこのalist内の正規表現にマッチするか、コンディションで指定された関数が非nil
をリターンした場合、display-buffer
はバッファーを表示すために、対応するディスプレイアクションを使用する。
このオプションの値は、ディスプレイアクションであること。このオプションは、display-buffer
呼び出しにたいする、“標準”のディスプレイアクションを定義するために使用できる。
このディスプレイアクションは、display-buffer
にたいして、他のディスプレイアクションが与えられなかった場合の代替え処理を指定する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
display-buffer
以下の基本的なアクション関数がEmacs内で定義されています。これらの関数はそれぞれ表示するバッファーbufferと、アクションalistという、2つの引数をとります。それぞれのアクション関数は、成功した場合はウィンドウ、失敗したらnil
をリターンします。
この関数は、選択されたウィンドウ内に、bufferの表示を試みる。選択されたウィンドウがミニバッファーウィンドウや、他のバッファー専用(Dedicated Windowsを参照)の場合は失敗する。alistに非nil
のinhibit-same-window
エントリーがある場合も失敗する。
この関数は、すでにbufferを表示しているウィンドウを探すことにより、バッファーの“表示”を試みる。
alistに非nil
のinhibit-same-window
エントリーがある場合、選択されたウィンドウは再利用に適さない。alistにreusable-frames
エントリーが含まれる場合、その値により再利用可能なウィンドウをどのフレームで検索するか決定される:
nil
は、選択されたフレーム(実際には最後の非ミニバッファーフレーム)上のウィンドウを考慮することを意味する。
t
は、すべてのフレーム上のウィンドウを考慮することを意味する。
visible
は、すべての可視フレーム上のウィンドウを考慮することを意味する。
これらは、next-window
にたいするall-frames引数の場合とは若干異なることに注意(Cyclic Ordering of Windowsを参照)。
alistにreusable-frames
エントリーが含まれない場合、通常この関数は選択されたフレームだけを検索する。しかし、変数pop-up-frames
が非nil
なら、カレント端末上のすべてのフレームを検索する。Additional Options for Displaying Buffersを参照。
この関数が他のフレーム上のウィンドウを選択した場合は、そのフレームを可視にするとともに、alistがinhibit-switch-frame
エントリー(Additional Options for Displaying Buffersを参照)を含んでいなければ、必要ならそのフレームを最前面に移動(raise)する。
この関数は、新たにフレームを作成して、そのフレームのウィンドウ内にバッファーを表示する。これは実際には、pop-up-frame-function
(Additional Options for Displaying Buffersを参照)内で指定された関数を呼び出すことにより、フレーム作成を行う。alistがpop-up-frame-parameters
エントリーを含む場合は、その連想値(associated
value)が新たに作成されたフレームのパラメーターに追加される。
この関数は、最大もしくはもっとも長い間参照されていない(LRU: least
recently-used)ウィンドウを分割することにより、bufferの表示を試みる。これは実際には、split-window-preferred-function
(Additional Options for Displaying Buffersを参照)内で指定された関数を呼び出すことにより分割を行う。
新たなウィンドウのサイズは、alistにエントリーwindow-height
とwindow-width
を与えることにより調整できる。ウィンドウの高さを調整するには、CARがwindow-height
でCDRが以下のいずれかであるようなエントリーを使用する:
nil
は、新たなウィンドウの高さを変更しないことを意味する。
shrink-window-if-larger-than-buffer
およびfit-window-to-buffer
である。Resizing Windowsを参照のこと。
ウィンドウの幅を調整するには、CARがwindow-width
でCDRが以下のいずれかであるようなエントリーを使用する:
nil
は、新たなウィンドウの幅を変更しないことを意味する。
この関数は、何らかの理由により分割を行えるウィンドウが存在しない場合は、失敗する可能性がある(選択されたフレームがフレームパラメーターunsplittable
をもつ場合等。Buffer Parametersを参照のこと)。
この関数は、選択されたウィンドウの下のウィンドウ内にbufferの表示を試みる。これは選択されたウィンドウの分割、または選択されたウィンドウの下のウィンドウの使用を意味する。新たにウィンドウを作成した場合は、alistに適切なwindow-height
またはwindow-width
エントリーが含まれていれば、サイズの調整も行うだろう。上記を参照のこと。
この関数は、以前にbufferを表示していたウィンドウ内に、そのバッファーの表示を試みる。alistに非nil
のinhibit-same-window
エントリーがある場合、選択されたウィンドウは再利用に適さない。alistにreusable-frames
エントリーが含まれる場合、その値はdisplay-buffer-reuse-window
と同様、適正なウィンドウをどのフレームから検索するかを決定する。
alistにprevious-window
エントリーがある場合は、そのエントリーにより指定されたウィンドウは、たとえそのウィンドウが以前にbufferを表示したことが一度もなくても、上記メソッドが見つけた他のすべてのウィンドウをオーバーライドするだろう。
この関数は、選択されたフレームの最下にあるウィンドウ内にbufferの表示を試みる。
これは、フレーム最下のウィンドウまたはフレームのルートウィンドウを分割するか、選択されたフレーム最下の既存ウィンドウを再利用する。
この関数は、既存のウィンドウを選択して、そのウィンドウ内にbufferを表示することにより、バッファーの表示を試みる。すべてのウィンドウが他のバッファー専用の場合、この関数は失敗する可能性がある(Dedicated Windowsを参照)。
alistに非nil
のallow-no-window
エントリーがある場合、この関数はbuffer
を表示しない。これにより、デフォルトの動作をオーバーライドして、バッファーの表示を避けることができる。これは、呼び出し側がallow-no-window
に非nil
値を指定して、display-buffer
からリターンされたnil
値を処理できるようなケースを想定している。
アクション関数を説明するために、以下の例を考えてみましょう。
(display-buffer (get-buffer-create "*foo*") '((display-buffer-reuse-window display-buffer-pop-up-window display-buffer-pop-up-frame) (reusable-frames . 0) (window-height . 10) (window-width . 40)))
上記のフォームを評価することにより、以下のようにdisplay-buffer
が実行されます:
(1)*foo*と呼ばれるバッファーが、すでに可視またはアイコン化されたフレームに表示されている場合は、そのウィンドウを再利用する。
(2)それ以外の場合は、新たなウィンドウをポップアップするか、それが不可能なら新たなフレームでバッファーを表示する。(3)
すべてのステップが失敗した場合は、それが何であれdisplay-buffer-base-action
およびdisplay-buffer-fallback-action
が指示するものを使用して処理を行う。
さらにdisplay-buffer
は、(display-buffer
により*foo*が前からそこに配置されていた場合は)再使用されるウィンドウ、およびポップアップされたウィンドウにたいして調整を試みます。そのウィンドウが垂直コンビネーションの一部なら、高さはその行数にセットされるでしょう。数字“10”のかわりに関数fit-window-to-buffer
を指定した場合、display-buffer
は空のバッファーにフィットするようにウィンドウを1行にセットするでしょう。ウィンドウが水平コンビネーションの一部なら、列数を40にセットします。新たなウィンドウが垂直または水平に組み合わせられるかは、ウィンドウの分割方向とsplit-window-preferred-function
、split-height-threshold
、split-width-threshold
の値に依存します(Additional Options for Displaying Buffersを参照)。
ここで、事前に以下のような‘display-buffer-alist’にたいするセットアップが存在していて、この呼び出しを組み合わせたとしましょう。
(let ((display-buffer-alist (cons '("\\*foo\\*" (display-buffer-reuse-window display-buffer-below-selected) (reusable-frames) (window-height . 5)) display-buffer-alist))) (display-buffer (get-buffer-create "*foo*") '((display-buffer-reuse-window display-buffer-pop-up-window display-buffer-pop-up-frame) (reusable-frames . 0) (window-height . 10) (window-width . 40))))
このフォームは、まず選択されたフレーム上で*foo*を表示しているウィンドウを再利用するよう、display-buffer
に試みさせます。そのようなウィンドウが存在しなければ、選択されたウィンドウの分割を試み、またはそれが不可能なら選択されたウィンドウの下のウィンドウを使用します。
選択されたウィンドウの下にウィンドウがない、あるいは下のウィンドウがそれのバッファーに専用の場合、display-buffer
は前の例で説明したように処理を行うでしょう。しかし、再利用されたウィンドウやポップアップされたウィンドウの高さ調整を試みる場合は、display-buffer
のaction引数内の行数に対応する指定をオーバーライドする、行数“5”へのセットを試みることに注意してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
display-buffer
の標準のディスプレイアクション(see section Choosing a Window for Display)は、さまざまなユーザーオプションにより変更が可能です。
この変数の値が非nil
の場合、display-buffer
は表示のために既存のバッファーを分割して新たなウィンドウの作成を許される。
この変数は、主に後方互換のために提供される。値がnil
のときは、アクション関数display-buffer-pop-up-window
(Action Functions for display-buffer
を参照)を呼び出すだけのdisplay-buffer-fallback-action
内の特別なメカニズムを経由して、display-buffer
にしたがう。この変数は、display-buffer-alist
等により直接指定できる、display-buffer-pop-up-window
自体からは参照されない。
この変数は、バッファーを表示する新たなウィンドウを作成するための、ウィンドウを分割する関数を指定する。これは、実際にウィンドウを分割するために、アクション関数display-buffer-pop-up-window
により使用される(Action Functions for display-buffer
を参照)。
デフォルト値はsplit-window-sensibly
で、これは以下で記述する。値は、ウィンドウを引数とする関数でなければならず、(要求されたバッファーを表示するために使用されるであろう)新たなウィンドウ、またはnil
(分割の失敗を意味する)をリターンしなければならない。
この関数は、windowを分割して、新たに作成したウィンドウをリターンする。windowを分割できなければ、nil
をリターンする。
この関数は、ウィンドウが分割できるかどうか判断する際の、通常のルールにしたがう(Splitting Windowsを参照)。最初にまず、split-height-threshold
(以下参照)、およびその他が課す制約の元、新たなウィンドウが下になるように分割を試みる。これが失敗したら、split-width-threshold
(以下参照)が課す制約の元、新たなウィンドウが右になるように分割を試みる。これが失敗して、かつそのウィンドウがそのフレームの唯一のウィンドウの場合、この関数はsplit-height-threshold
を無視して、新たなウィンドウが下になるよう、再度分割を試みる。これも同様に失敗したら、この関数は諦めてnil
をリターンする。
これはsplit-window-sensibly
により使用される変数であり、ウィンドウを分割して新たなウィンドウを下に配置するかどうかを指定する。整数の場合は、元のウィンドウが最低でもその行数なければ分割しないことを意味する。nil
の場合は、この方法では分割しないことを意味する。
これはsplit-window-sensibly
により使用される変数であり、ウィンドウを分割して新たなウィンドウを右に配置するかどうかを指定する。整数の場合は、元のウィンドウが最低でもその列数なければ分割しないことを意味する。nil
の場合は、この方法では分割しないことを意味する。
この変数の値が非nil
の場合、新たにフレームを作成することによりdisplay-buffer
がバッファーを表示できることを意味する。デフォルトはnil
。
非nil
値は、display-buffer
がすでにbuffer-or-nameを表示しているウィンドウを探す際に、選択されたフレームだけでなく、可視およびアイコン化されたフレームを検索できることも意味する。
この変数は主に、後方互換のために提供されている。値が非nil
のときは、アクション関数display-buffer-pop-up-frame
(Action Functions for display-buffer
を参照)を呼び出すだけのdisplay-buffer-fallback-action
内の特別なメカニズムを経由して、display-buffer
にしたがう。この変数は、display-buffer-alist
等により直接指定できる、display-buffer-pop-up-window
自体からは参照されない(これはウィンドウの分割前に行われる)。この変数は、display-buffer-alist
等により直接指定できる、display-buffer-pop-up-frame
自体からは参照されない。
この変数は、バッファーを表示する新たなウィンドウを作成するための、フレームを作成する関数を指定する。これは、アクション関数display-buffer-pop-up-frame
により使用される(Action Functions for display-buffer
を参照)。
値は、フレームまたはフレームを作成できなかった場合はnil
をリターンする、引数をとらない関数であること。デフォルト値は、pop-up-frame-alist
(以下参照)により指定されるパラメーターを使用してフレームを作成する関数である。
この変数は、フレームを新たに作成するためのpop-up-frame-function
のデフォルト関数により使用される、フレームパラメーター(Frame Parametersを参照)のalistを保持する。デフォルトはnil
。
選択されたウィンドウ内に表示されるべきバッファー名のリスト。このリスト内にバッファーの名前がある場合、display-buffer
は選択されたウィンドウ内にそのバッファーを表示することにより、そのバッファーを処理する。
選択されたウィンドウ内に表示されるバッファーを指定する、正規表現のリスト。バッファー名がこのリスト内の正規表現のいずれかにマッチする場合、display-buffer
は選択されたウィンドウ内にそのバッファーを表示することにより、そのバッファーを処理する。
この関数は、buffer-nameという名前のバッファーをdisplay-buffer
で表示する場合、それが選択されたウィンドウ内に表示されるバッファーならt
をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウはそれぞれ、リスト内に以前表示されていたバッファーと、それらのバッファーがウィンドウから削除された順序を記憶しています。このヒストリーが、たとえばreplace-buffer-in-windows
(Buffers and Windowsを参照)により使用されます。このリストはEmacsにより自動的に保守されますが、これを明示的に調べたり変更するために、以下の関数を使用できます:
この関数は、windowの前のコンテンツを指定するリストをリターンする。オプション引数windowには生きたウィンドウを指定すべきであり、デフォルトは選択されたウィンドウである。
リスト要素はそれぞれ、(buffer window-start
window-pos)
という形式をもつ。ここでbufferは、そのウィンドウで前に表示されていたウィンドウ、window-startはそのバッファーが最後に表示されていたときのウィンドウのスタート位置(The Window Start and End Positionsを参照)、window-posはwindow内にそのバッファーが最後に表示されていたときのポイント位置(Windows and Pointを参照)である。
このリストは順序付きで、より前の要素がより最近に表示されたバッファーに対応しており、通常は最初の要素がそのウィンドウからもっとも最近削除されたバッファーに対応する。
この関数は、windowの前のバッファーを、prev-buffersの値にセットする。引数windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。引数prev-buffersは、window-prev-buffers
によりリターンされるリストと同じ形式であること。
これらに加えて、それぞれのバッファーは次バッファー(next
buffers)のリストを保守します。これはswitch-to-prev-buffer
(以下参照)により再表示されたバッファーのリストです。このリストは主に、切り替えるバッファーを選択するために、switch-to-prev-buffer
とswitch-to-next-buffer
により使用されます。
この関数は、switch-to-prev-buffer
を通じてwindow内に最近表示されたバッファーのリストをリターンする。window引数は、生きたウィンドウかnil
(選択されたウィンドウの意)でなければならない。
この関数は、windowの次バッファーリストを、next-buffersにセットする。window引数は、生きたウィンドウかnil
(選択されたウィンドウの意)であること。引数next-buffersは、バッファーのリストであること。
以下のコマンドは、bury-buffer
やunbury-buffer
のように、グローバルバッファーリストを巡回するために使用できます。ただし、これらはグローバルバッファーリストではなく、指定されたウィンドウのヒストリーリストのしたがって巡回します。それに加えて、これらはウィンドウ固有なウィンドウのスタート位置とポイント位置をリストアし、すでに他のウィンドウに表示されているバッファーをも表示できます。特にswitch-to-prev-buffer
コマンドは、ウィンドウにたいする置き換えバッファーを探すためにreplace-buffer-in-windows
、bury-buffer
、quit-window
により使用されます。
このコマンドは、window内に前のバッファーを表示する。引数windowは生きたウィンドウ、またはnil
(選択されたウィンドウの意)であること。オプション引数bury-or-killが非nil
、それはwindow内にカレントで表示されているバッファーは今まさにバリーもしくはkillされるバッファーであり、したがって将来におけるこのコマンドの呼び出しで、このバッファーに切り替えるべきではないことを意味する。
前のバッファーは通常、window内にカレントで表示されているバッファーの前に表示されていたバッファーである。しかし、バリーまたはkillされたバッファー、または直近のswitch-to-prev-buffer
呼び出しですでに表示されたバッファーは、前のバッファーとして適格とはならない。
このコマンドを繰り返して呼び出すことにより、window内で前に表示されたすべてのバッファーが表示されてしまった場合、将来の呼び出しにおいては、windowが表示されているフレームのバッファーリスト(The Buffer Listを参照)から、そのフレームの他のウィンドウで表示済みのバッファーをスキップするようにして、バッファーを表示するだろう。
このコマンドは、window内の次バッファーに切り替える。つまり、window内での最後のswitch-to-prev-buffer
コマンドの効果をアンドゥする。引数windowは生きたウィンドウであること。デフォルトは選択されたウィンドウである。
アンドゥ可能なswitch-to-prev-buffer
の直近の呼び出しが存在しない場合、この関数はwindowが表示されているフレームのバッファーリスト(The Buffer Listを参照)からバッファーの表示を試みる。
デフォルトでは、switch-to-prev-buffer
とswitch-to-next-buffer
は、同一フレーム上の他のウィンドウで表示済みのバッファーに切り替えることができます。以下のオプションは、この挙動をオーバーライドするために使用できます。
この変数が非nil
の場合、switch-to-prev-buffer
およびswitch-to-next-buffer
は、そのバッファーが当該ウィンドウで過去に表示されていれば、同一フレーム上ですでに可視のバッファーに切り替えることができる。nil
の場合、switch-to-prev-buffer
およびswitch-to-next-buffer
は、同一フレーム上ですでに可視なバッファーへの切り替えを常に避けるよう試みる。デフォルトはt
。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーを表示する関数は、特定のウィンドウが、そのウィンドウのバッファーにたいして専用(dedicated)であるとマークすることにより、使用しないよう告げることができます。display-buffer
(Choosing a Window for Displayを参照)は、他のバッファーの表示に、専用バッファーを決して使用しません。 and
get-largest-window
(see section Cyclic Ordering of Windows)は、dedicated引数が非nil
のときは、専用ウィンドウを候補とみなしません。専用ウィンドウにたいする配慮に関して、set-window-buffer
(Buffers and Windowsを参照)の挙動は若干異なります。以下を参照してください。
ウィンドウからバッファー、およびフレームからウィンドウを削除することを意図した関数は、処理するウィンドウが専用ウィンドウのときは特別な挙動を示す可能性があります。ここでは3つの基本ケース、すなわち(1)そのウィンドウがフレーム上で唯一のウィンドウの場合、(2)ウィンドウはフレーム上で唯一のウィンドウだが同一端末上に別のフレームがある場合、(3)そのウィンドウが同一端末上で唯一のフレームの唯一のウィンドウの場合、を明確に区別することにします。
特に、delete-windows-on
(Deleting Windowsを参照)は関連するフレームを削除する際にケース(2)を、フレーム上で唯一のウィンドウに他のバッファーを表示する際にケース(3)を処理します。バッファーがkillされる際に呼び出される関数replace-buffer-in-windows
(see section Buffers and Windows)は、ケース(1)ではウィンドウを削除して、それ以外ではdelete-windows-on
のように振る舞います。
bury-buffer
(The Buffer Listを参照)が選択されたウィンドウを操作する際は、選択されたフレームを処理するために、frame-auto-hide-function
(Quitting Windowsを参照)を呼び出すことにより、ケース(2)を取り扱います。他の2つのケースは、replace-buffer-in-windows
と同様に処理されます。
この関数は、windowがそのバッファーにたいして専用なら非nil
、それ以外はnil
をリターンする。より正確には、最後のset-window-dedicated-p
呼び出しで割り当てられた値、またはset-window-dedicated-p
がwindowを引数として呼び出されたことがない場合はnil
がリターン値となる。windowのデフォルトは、選択されたウィンドウである。
この関数は、flagが非nil
ならwindowがそのバッファーに専用とマークし、それ以外は非専用とマークする。
特別なケースとして、flagがt
の場合、windowはそのバッファーにたいして特に専用(strongly
dedicated)となる。set-window-buffer
は、処理対象のウィンドウが特に専用のウィンドウで、かつ表示を要求されたバッファーが表示済みでない場合は、エラーをシグナルする。その他の関数は、t
を他の非nil
値と区別して扱わない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーを表示するために使用しているウィンドウを削除したいときは、フレームからそのウィンドウを削除するために、delete-window
やdelete-windows-on
を呼び出すことができます(Deleting Windowsを参照)。その、が別フレームで表示されているときは、かわりにdelete-frame
を呼び出したいと思うかもしれません(Deleting Framesを参照)。一方で、そのバッファーを表示するためにウィンドウが再利用されている場合は、関数switch-to-prev-buffer
を呼び出して、前に表示されていたバッファーを表示したいと思うかもしれません(Window Historyを参照)。最終的には、そのウィンドウのバッファーをバリー(The Buffer Listを参照)、またはkill(Killing Buffersを参照)したいと思うかもしれません。
以下のコマンドは、ウィンドウがバッファーを表示する方法を最初に入手する情報を使用して、上述した説明の自動化を試みます。
このコマンドは、windowをquitして、そのバッファーをバリーする。引数windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。プレフィックス引数killが非nil
なら、バッファーをバリーするかわりにkillする。これは、ウィンドウとそのバッファーを処理するために、次に説明する関数quit-restore-window
を呼び出す。
この関数は、windowにたいして、そのバッファーが表示される前に存在した状態へのリストアを試みる。オプション引数windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。
windowがそのバッファーを表示するために特別に作成されたバッファーの場合、この関数はそのフレームに他に少なくとも1つの生きたウィンドウがなければ、windowを削除しない。windowがそのフレームで唯一のウィンドウであり、かつそのフレームの端末上に他のフレームが存在する場合、オプション引数bury-or-killがそのウィンドウをどうするかを決定する。If
equals
kill
の場合は、無条件でフレームは削除される。それ以外では、フレームの運命はそのフレームを単一の引数とするframe-auto-hide-function
(以下参照)呼び出しにより決定される。
特別に作成されたウィンドウでない場合、この関数はwindow内で前に表示されていたバッファーの再表示を試みる。これは、前に表示されていたバッファーのウィンドウのスタート位置(The Window Start and End Positionsを参照)とポイント位置(Windows and Pointを参照)のリストアも試みる。加えて、windowのバッファーが過去に一時的にリサイズされていた場合、この関数はwindowの元の高さのリストアも試みる。
これまで説明したケースでは、window内で表示されているバッファーは、依然としてそのウィンドウにたいする最後のバッファー表示関数で表示されたバッファーである。その時点で他のバッファーが表示されている、または前に表示されていたバッファーがもはや存在しない場合、この関数はかわりに何か他のバッファーを表示するために、switch-to-prev-buffer
(Window Historyを参照)を呼び出す。
オプション引数bury-or-killは、windowを処理する方法を指定し、以下の値を処理する。
nil
これは、バッファーを特別な方法で処理しないことを意味する。結果、windowが削除されない場合は、switch-to-prev-buffer
の呼び出しにより、通常はそのバッファーが再び表示されるだろう。
append
これは、windowが削除されない場合、そのバッファーをwindowの前のバッファーリストの最後に移動するので、将来のswitch-to-prev-buffer
呼び出しでこのバッファーには切り替わることは少なくなる。これは、そのバッファーをフレームのバッファーリストの最後への移動も行う。
bury
これは、windowが削除されない場合、そのバッファーをwindowの前のバッファーリストから削除する。これは、そのバッファーをフレームのバッファーリストの最後への移動も行う。この値は、バッファーをkillすることなくswitch-to-prev-buffer
がこのバッファーに再び切り替えさせないようにする、もっとも信頼できる解決手段を提供する。
kill
これは、windowのバッファーをkillすることを意味する。
quit-restore-window
は、windowのquit-restore
ウィンドウパラメーター(Window Parametersを参照)の情報にもとづき判定を行い、処理後にそれをnil
にリセットしている。
以下のオプションは、quitすべきウィンドウ、あるいはバリーすべきバッファーをもつウィンドウを1つだけ含むフレームを処理する方法を指定します。
このオプションで指定された関数は、自動的にフレームを隠すために呼び出される。この関数は、フレームを唯一の引数として呼び出される。
ここで指定される関数は、選択されたウィンドウが専用(dedicated)で、かつバリーされるバッファーを表示しているときに、bury-buffer
(The Buffer Listを参照)から呼び出される。また、quitされるウィンドウのフレームが、そのウィンドウのバッファーを表示するために特別に作成されたフレームで、かつそのバッファーがkillされないときにも、quit-restore-window
(上記)から呼び出される。
デフォルトでは、iconify-frame
(Visibility of Framesを参照)を呼び出す。かわりに、フレームをディスプレイから削除するdelete-frame
(Deleting Framesを参照)、フレームを変更せずに残すignore
、またはフレームを唯一の引数とする任意の関数のいずれかを指定できる。
このオプションで指定された関数は、指定されたフレームが生きたウィンドウただ1つを含み、かつ同一端末上に少なくとも1つ他のフレームが存在する場合のみ呼び出されることに注意。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
それぞれのウィンドウは独自のポイント値(Pointを参照)をもっており、同じバッファーを表示する他のウィンドウの間でも、それぞれのポイント値は独立しています。これは、1つのバッファーを複数ウィンドウで表示するのに有用です。
ユーザーが関与し続ける限りポイントはカーソル位置にあり、ユーザーが他のバッファーに切り替えた際には、カーソルはそのバッファーのポイント位置にジャンプします。
この関数は、window内のカレントのポイント位置をリターンする。選択されていないウィンドウにたいしては、そのウィンドウが選択された場合の、(そのウィンドウのバッファーの)ポイント値である。windowにたいするデフォルトは、選択されたウィンドウである。
windowが選択されたウィンドウのときのリターン値は、そのウィンドウのバッファーのポイント値である。厳密には、すべてのsave-excursion
フォームの外側の“トップレベル”のポイント値のほうが、より正確であろう。しかし、この値は見つかるのが困難である。
この関数は、window内のポイントを、windowのバッファー内の位置positionに配置する。リターン値はpositionである。
windowが選択されている場合は、単にwindow内でgoto-char
を行う。
この変数は、window-point
のマーカー挿入型(Marker Insertion Typesを参照)を指定する。デフォルトはnil
で、window-point
は挿入されたテキストの後に留まるだろう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウはそれぞれ、バッファー位置を追跡するために、バッファー内で表示を開始すべき位置を指定するマーカーを保守しています。この位置は、そのウィンドウのdisplay-start(表示開始)、または単にstart(開始)と呼ばれます。この位置の後の文字が、ウィンドウの左上隅に表示される文字となります。これは通常はテキスト行の先頭になりますが、必須ではありません。
ウィンドウやバッファーを切り替えた後、およびいくつかのケースにおいては、ウィンドウが行の途中で開始される場合は、Emacsがィンドウの開始を行の開始に調整します。これは、行中で無意味な位置のウィンドウ開始のまま、特定の操作が行われるのを防ぐためです。この機能は、Lispモードのコマンドを使用して実行することによりある種のLispコードをテストする場合は、それらのコマンドがこの再調整を誘発するために邪魔になるかもしれません。そのようなコードをテストするためには、それをコマンド内に記述して、何らかのキーにバインドしてください。
この関数は、ウィンドウwindowの表示開始位置をリターンする。windowがnil
なら、選択されたウィンドウが使用される。
ウィンドウを作成したり、他のバッファーをウィンドウ内に表示する際、display-start位置は同じバッファーにたいしてもっとも最近に使用されたdisplay-start位置か、そのバッファーがそれをもたなければpoint-min
にセットされる。
ポイントがスクリーン上に確実に現れるように、再表示はwindow-start位置を更新する(前の再表示以降にwindow-start位置を明示的に指定していない場合)。再表示以外に、window-start位置を自動的に変更するものはない。ポイントを移動した場合は、次の再表示後までポイントの移動に応じてwindow-startが変更されるのを期待してはならない。
この関数は、windowのバッファーの最後を表示する位置をリターンする。windowにたいするデフォルトは、選択されたウィンドウである。
バッファーテキストの単なる変更やポイントの移動では、window-end
がリターンする値は更新されない。この値は、Emacsが再表示を行い、それが妨害されることなく再表示が完了したときのみ更新される。
windowの最後の再表示が妨害されて完了しなかった場合、Emacsはそのウィンドウ内の表示のend位置を知らない。この場合、関数はnil
をリターンする。
updateが非nil
の場合、window-end
はwindow-start
のカレント値にもとづき、どこが表示のendかにたいして最新の値をリターンする。以前に保存された位置の値がまだ有効なら、window-end
はその値をリターンする。それ以外は、バッファーのテキストをスキャンして、正しい値を計算する。
たとえupdateが非nil
でも、window-end
はポイントが画面外に移動していても、実際の再表示が行うような表示のスクロールを試みない。これは、window-start
の値を変更しない。これは実際には、スクロールが要求されない場合の表示されたテキストのendがどこかを報告する。
この関数は、windowのdisplay-start位置を、windowのバッファーのpositionにセットする。リターン値は、positionである。
表示ルーチンは、バッファーが表示されたときに、ポイント位置が可視になることを強要する。通常これらは、ポイントを可視にするために必要なときは常に、display-start位置を変更(つまりウィンドウをスクロール)する。しかし、この関数でnoforceにnil
を使用してstart位置を指定した場合は、たとえポイントを画面外になるような場所に配したとしても、positionでの表示開始を望んでいることを意味する。これによりポイントが画面外に配された場合、表示ルーチンはポイントをウィンドウ内の中央行の左マージンに移動する。
たとえば、ポイントが1のときにウィンドウのstartを次行の開始37にセットした場合、ポイントはウィンドウの最上端の“上”になるだろう。表示ルーチンは、再表示が発生したときにポイントが1のままなら、ポイントを動かすことになる。以下に例を示す:
;; 以下は式set-window-start
実行前
;; ‘foo’の様子である
---------- Buffer: foo ---------- ∗This is the contents of buffer foo. 2 3 4 5 6 ---------- Buffer: foo ----------
(set-window-start (selected-window) (save-excursion (goto-char 1) (forward-line 1) (point))) ⇒ 37
;; 以下は式set-window-start
実行後の
;; ‘foo’の様子である
---------- Buffer: foo ----------
2
3
∗4
5
6
---------- Buffer: foo ----------
noforceが非nil
で、かつ次回の再表示でポイントが画面外に配される場合、再表示はポイントと協調して機能する位置となるような新たなwindow-startを計算するので、positionは使用されない。
この関数は、window内のpositionが画面上カレントで可視のテキスト範囲内にある場合は、非nil
をリターンし、positionが表示範囲のスクロール外にある場合は、nil
をリターンする。partiallyがnil
なら、部分的に不明瞭な位置は可視とは判断されない。引数positionのデフォルトは、window内のポイントのカレント位置で、windowのデフォルトは選択されたウィンドウである。positionがt
なら、それはwindowの最後に可視だった位置をチェックすることを意味する。
この関数は、垂直スクロールだけを考慮する。
This function considers only vertical scrolling.
windowが水平にスクロールされたことだけの理由でpositionが表示範囲外の場合は、いずれにせよpos-visible-in-window-p
は非nil
をリターンする。Horizontal Scrollingを参照のこと。
positionが可視でpartiallyがnil
なら、pos-visible-in-window-p
はt
をリターンする。partiallyが非nil
でposition以降の文字が完全に可視の場合は、(x
y)
という形式のリストをリターンする。ここでxとyは、ウィンドウの左上隅からの相対的なピクセル座標である。position以降の文字が完全に可視ではない場合は、拡張された形式のリスト(x
y rtop rbot rowh
vpos)
をリターンする。ここでrtopとrbotはpositionでウィンドウ外となった上端と下端のピクセル数、rowhはその行の可視な部分の高さ、vposはその行の垂直位置(0基準の行番号)を指定する。
以下に例を示す:
;; ポイントが画面外ならrecenterする
(or (pos-visible-in-window-p
(point) (selected-window))
(recenter 0))
この関数は、window内のテキスト行lineの高さをリターンする。lineがheader-line
、mode-line
、window-line-height
のいずれかの場合は、そのウィンドウの対応する行についての情報をリターンする。それ以外では、lineは0から始まるテキスト行番号である。負数の場合は、そのウィンドウのendから数える。lineにたいするデフォルトは、window内のカレント行、windowにたいするデフォルトは、選択されたウィンドウである。
表示が最新でなければ、window-line-height
はnil
をリターンする。その場合は、関連する情報を入手するために、pos-visible-in-window-p
を使用できる。
指定されたlineに対応する行がなければ、window-line-height
はnil
をリターンする。それ以外では、リスト(height
vpos ypos
offbot)
をリターンする。ここでheightはその行の可視部分のピクセル高さ、vposとyposは最初のテキスト行上端からのその行への相対的な垂直位置の行数とピクセル数、offbotはそのテキスト行下端のウィンドウ外のピクセル数である。(最初の)テキスト行上端にウィンドウ外のピクセルがある場合、yposは負となる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
テキスト的なスクロール(textual
scrolling)とは、ウィンドウ内のテキストを上や下に移動することを意味します。これは、そのウィンドウのdisplay-startを変更することにより機能します。これは、ポイントを画面上に維持するために、window-point
の値も変更するかもしれません(Windows and Pointを参照)。
テキスト的なスクロールの基本的な関数は、(前方にスクロールする)scroll-up
と、(後方にスクロールする)scroll-down
です。これらの関数の名前における“up”と“down”は、バッファーテキストのそのウィンドウにたいする相対的な移動方向を示します。そのテキストが長いロール紙に記述されていて、スクロールコマンドはその上を上下に移動すると想像してみてください。つまり、バッファーの中央に注目している場合、繰り返してscroll-down
を呼び出すと、最終的にはバッファーの先頭を目にすることになるでしょう。
残念なことに、これは時折混乱を招きます。なぜなら、ある人はこれを逆の慣習にもとづいて考える傾向があるからです。彼らは、テキストがその場所に留まりウィンドウが移動して、“down”コマンドによりバッファー終端に移動するだろうと想像します。この慣習は、そのようなコマンドが現代風のキーボード上のPageDownという名前のキーにバインドされているという事実と一致しています。
選択されたウィンドウ内で表示されているバッファーがカレントバッファーでない場合、(scroll-other-window
以外の)テキスト的スクロール関数の結果は予測できません。The Current Bufferを参照してください。
(たとえば大きなイメージがある等で)ウィンドウにウィンドウの高さより高い行が含まれる場合、スクロール関数は部分的に可視な行をスクロールするために、そのウィンドウの垂直スクロール位置を調整します。Lisp呼び出し側は、変数auto-window-vscroll
をnil
にバインドすることにより、この機能を無効にできます(Vertical Fractional Scrollingを参照)。
この関数は、選択されたウィンドウ内でcount行前方にスクロールする。
count負の場合は、かわりに後方へスクロールする。countがnil
(または省略)の場合、スクロールされる距離は、そのウィンドウのテキストエリアの高さより小さいnext-screen-context-lines
となる。
選択されたウィンドウがそれ以上スクロールできない場合、この関数はエラーをシグナルし、それ以外はnil
をリターンする。
この関数は、選択されたウィンドウ内でcount行後方にスクロールする。
count負の場合は、かわりに後方へスクロールする。それ以外の点では、これはscroll-up
が行うのと同様に振る舞う。
これはscroll-up
と同様に振る舞うが、選択されたウィンドウがそれ以上スクロールできず、かつ変数scroll-error-top-bottom
の値がt
の場合は、かわりにそのバッファーの終端への移動を試みる。ポイントがすでに終端にある場合は、エラーをシグナルする。
これはscroll-down
と同様に振る舞うが、選択されたウィンドウがそれ以上スクロールできず、かつ変数scroll-error-top-bottom
の値がt
の場合は、かわりにそのバッファーの先頭への移動を試みる。ポイントがすでに先頭にある場合は、エラーをシグナルする。
この関数は、他のウィンドウ内のテキストを上方にcount行スクロールする。countが負、またはnil
の場合は、scroll-up
のように処理される。
変数other-window-scroll-buffer
にバッファーをセットすることにより、どのバッファーをスクロールするかを指定できる。そのバッファーが表示されていない場合、scroll-other-window
はそれを何らかのウィンドウに表示する、
選択されたウィンドウがミニバッファーのとき、次ウィンドウは通常はそのウィンドウの直上最左のウィンドウである。変数minibuffer-scroll-window
をセットすることにより、スクロールする別のウィンドウを指定できる。この変数は、ミニバッファー以外のウィンドウが選択されているときは効果がない。これが非nil
で、かつミニバッファーが選択されているとき、これはother-window-scroll-buffer
より優先される。Definition of minibuffer-scroll-windowを参照のこと。
ミニバッファーがアクティブのとき、選択されたウィンドウが下端右角のウィンドウなら、ミニバッファーが次ウィンドウになる。この場合、scroll-other-window
はミニバッファーのスクロールを試みる。ミニバッファーに含まれるのが1行だけの場合はどこにもスクロールできないので、エコーエリアに瞬時メッセージ‘End
of buffer’を表示後、その行を再表示する。
この変数が非nil
なら、それはscroll-other-window
がどのバッファーのウィンドウをスクロールするかを指定する。
このオプションは、スクロールマージン(ポイントとウィンドウの上端/下端との最小行数)のサイズを指定する。ポイントがウィンドウの上端/下端からその行数になったとき、再表示は(可能なら)ポイントをそのマージン外、ウィンドウの中央付近に移動するために、テキストを自動的にスクロールする。
この変数は、ポイントがスクリーン外(またはスクロールマージン内)に移動したとき、スクロールを自動的に行う方法を指定する。値が正の整数nの場合、再表示はそれが正しい表示範囲内にポイントを戻すなら、いずれかの方向にn行以下のテキストをスクロールする。この振る舞いは、保守的なスクロール(conservative
scrolling)と呼ばれる。それ以外の場合、スクロールはscroll-up-aggressively
やscroll-down-aggressively
のような他の変数の制御の下、通常の方法で発生する。
デフォルトの値は0で、これは保守的スクロールが発生し得ないことを意味する。
この変数の値は、nil
か、0から1までの小数fであること。これが小数なら、スクリーン上でポイントが置かれたとき、下にスクロールする場所を指定する。より正確には、ポイントがウィンドウstartより上という理由によりウィンドウが下にスクロールされるとき、新たなstart位置はウィンドウ上端からウィンドウ高さのfの箇所にポイントが置かれるように選択される。より大きなfでは、よりaggressive(積極的)にスクロールする。
ポイントを中央に配すのがその効果なので、値nil
は.5と等価である。どのような方法によりセットされたときでも、この変数は自動的にバッファーローカルになる。
scroll-up-aggressively
と同様。値fは、ポイントがウィンドウ下端からどれほどの位置に置かれるべきかを指定する。つまり、scroll-up-aggressively
と同様、大きな値dwはよりaggressive(積極的)になる。
この変数は、scroll-conservatively
のより古い変種である。違いは、値がnならn以下の値ではなく、正確にnだけのスクロールを許容することである。この機能は、scroll-margin
とは共に機能しない。デフォルトは0。
このオプションがt
なら、スクロールによりポイントがウィンドウ外に移動したとき、Emacsは常に、ポイントがポイントの上下端ではなくカーソルがそのウィンドウ内の元の垂直位置に保たれるようポイントの調整を試みる。
値が非nil
かつ非t
の場合、たとえスクロールコマンドによりポイントがウィンドウ外に移動していなくとも、Emacsはカーソルが同じ垂直位置に保たれるよう、ポイントを調整する。
このオプションはシンボルプロパティscroll-command
が非nil
であるような、すべてのスクロールコマンドに影響する。
この変数の値は、全画面スクロールされたときに残される継続される行数を指定する。たとえば、引数がnil
のscroll-up
は、ウィンドウ上端ではなく下端に残される行数でスクロールする。デフォルト値は2
。
このオプションがnil
(デフォルト)の場合、それ以上のスクロールが不可能な際に、scroll-up-command
とscroll-down-command
は単にエラーをシグナルする。
値がt
なら、これらのコマンドはかわりにポイントをバッファーの先頭か終端(スクロール方向に依存する)に移動する。ポイントがすでにその位置にある場合のみ、エラーをシグナルする。
この関数は、選択されたウィンドウ内の指定された垂直位置にポイントを表示するように、ウィンドウ内のテキストをスクロールする。これはテキストに応じた“ポイント移動”を行わない。
countが非負の数の場合は、そのウィンドウ上端からcount行下にポイントを含む行を配す。countが負なら、ウィンドウ下端から上に数えるので、-1はそのウィンドウ内で最後の利用可能な行となる。
countがnil
(または非nil
のリスト)の場合、recenter
はポイントを含む行をウィンドウの中央に配す。countがnil
なら、この関数はrecenter-redisplay
の値に応じて、フレームを再描画するかもしれない。
recenter
がインタラクティブに呼び出されたときは、rawプレフィックス引数がcountとなる。したがって、プレフィックスとしてC-uをタイプするとcountに非nil
、C-u
4ではcountに4がセットされ、後者ではカレント行を上端から4行目にセットする。
引数0では、recenter
はカレント行をウィンドウ上端に配す。コマンドrecenter-top-bottom
は、これを達成するためにより簡便な方法を提供する。
この変数が非nil
の場合は、引数nil
でrecenter
を呼び出すことにより、フレームを再描画する。デフォルト値はtty
で、これはフレームがttyフレームのときだけフレームを再描画することを意味する。
デフォルトではC-lにバインドされているこのコマンドは、recenter
と同様に動作するが、引数なしで呼び出されたときの動作が異なる。この場合、連続して呼び出すことにより、変数recenter-positions
で定義されるサイクル順に応じてポイントを配する。
これは、recenter-top-bottom
を引数なしで呼び出したときの挙動を制御する。デフォルト値は(middle top
bottom)
で、これは引数なしでrecenter-top-bottom
を連続して呼び出すと、ポイントをウィンドウの中央、上端、下端と巡回して配すことを意味する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
垂直フラクショナルスクロール(vertical fractional scrolling)とは、指定された値を行に乗ずるることによりウィンドウ内のテキストを上下にシフトすることを意味します。ウィンドウはそれぞれ、決して0より小さくなることはない、垂直スクロール位置(vertical scroll position)という数値をもっています。これは、ウィンドウのコンテンツをどこから表示開始(raise)するかを指定します。ウィンドウのコンテンツの表示開始により、一般的には上端の何行かのすべて、または一部が表示されなくなり、他の何行かのすべて、または一部が下端に表示されるようになります。通常の値は0です。
垂直スクロール位置は、通常行の高さ(デフォルトフォントの高さ)の単位で数えられます。したがって、値が.5なら、それはウィンドウのコンテンツが、通常行の半分の高さで上にスクロールされていることを、3.3なら通常行の3倍を若干超える高さで上にスクロールされていることを意味します。
垂直スクロールが覆い隠す(cover)のがどれほどの行断片(fraction of a line)、あるいは行数かは、それらの行に何が含まれるかに依存します。3.3という値が高さが高い行やイメージの一部だけを画面外にスクロールできることもあれば、.5という値が非常に低い高さの行を画面外にスクロールできることもあります。
この関数は、windowのカレントの垂直スクロール位置をリターンする。windowのデフォルトは、選択されたウィンドウである。pixels-pが非nil
の場合、リターン値は通常行高さ単位ではなく、ピクセル単位で測定される。
(window-vscroll) ⇒ 0
この関数は、windowの垂直スクロール位置をlinesにセットする。windowがnil
なら、選択されたウィンドウが使用される。引数linesは0または正であること。それ以外は0として扱われる。
実際の垂直スクロール位置は、常にピクセルの整数に対応しなければならないため、指定した値はそれに応じて丸められる。
こも丸め結果がリターン値となる。
(set-window-vscroll (selected-window) 1.2) ⇒ 1.13
pixels-pが非nil
の場合、linesはピクセル数を指定する。この場合、リターン値はlinesである。
この変数が非nil
なら、関数line-move
、scroll-up
、scroll-down
は、たとえば大きなイメージが存在する等でウィンドウ高さより高いディスプレイ行をスクロールするために、垂直スクロール位置を自動的に変更するだろう。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
水平スクロール(horizontal scrolling)とは、指定された通常文字幅の倍数でウィンドウ内のイメージを左右にシフトすることを意味します。ウィンドウはそれぞれ、決して0より小さくなることはない、水平スクロール位置(horizontal scroll position)という数値をもっています。これは、コンテンツをどれほど左にシフトするかを指定します。ウィンドウのコンテンツを左にシフトすることにより、一般的には左にある文字のすべて、または一部が表示されなくなり、右にある文字のすべて、または一部が表示されることを意味します。通常の値は0です。
水平スクロール位置は、通常文字幅を単位として数えられます。したがって値が5なら、それはウィンドウのコンテンツは通常文字幅の5倍左にスクロールされることを意味します。左の何文字が表示されなくなるかは、それらの文字の文字幅とに依存しており、行ごとに異なります。
読み取りを行う際は、“inner loop”で横方向に、“outer loop”で上から下に読み取るため、水平スクロールの効果はテキスト的スクロールや垂直スクロールとは異なります。テキスト的スクロールは表示するためのテキスト範囲の選択を引き起こし、垂直スクロールはウィンドウコンテンツを連続して移動します。しかし、水平スクロールはすべての行の一部をスクリーン外へスクロールします。
通常は、水平スクロールは行われないので、ウィンドウ左端には最左列があります。この状態では、右スクロールにより左端に新たに表示されるデータは存在しないので、右へのスクロールはできません。左スクロールにより、テキストの1列目がウィンドウ端からウィンドウ外にスクロールされ、右端にはその前は切り詰められていた(truncated)列が新たに表示されるので、左へのスクロールはできます。ウィンドウが左へ非0の量を水平スクロールされていれば、右スクロールしてそれを戻すことができますが、正味の水平スクロールが0に減少するまでの間のみ、右スクロールができます。左へどれほどスクロールできるかに制限はありませんが、最終的にはすべてのテキストが左端の外に消えるでしょう。
auto-hscroll-mode
がセットされている場合、再表示はポイントが常に可視となることを保証するために、必要に応じて水平スクロールを自動的に変更する。とはいえ、依然として水平スクロール位置を明示的に指定するのは可能である。指定した値は、自動スクロールの下限値としての役目を果たす(自動スクロールは指定された値より小さい列にウィンドウをスクロールしない)。
この関数は、選択されたウィンドウを左(countが負なら右)にcount列スクロールする。countのデフォルトはウィンドウ幅から2を減じた値である。
リターン値は、window-hscroll
(以下参照)がリターンする値と同様、変更後に実際に左に水平スクロールされたトータル量である。
ウィンドウを可能な限り右にスクロールした後は、左スクロールの合計が0であるような通常の位置に戻り、右へのそれ以上のスクロールの試みは効果をもたない。
set-minimumが非nil
の場合、新たなスクロール量は自動スクロールの下限値となる。つまり自動スクロールは、この関数がリターンする値より小さい列にウィンドウをスクロールしないだろう。インタラクティブに呼び出すと、set-minimumに非nil
を渡す。
この関数は、選択されたウィンドウを右(countが負なら左)にcount列スクロールする。countのデフォルトはウィンドウ幅から2を減じた値である。スクロール方向を除けば、これはscroll-left
と同様に機能する。
この関数は、windowの左への水平スクロールのトータル(左マージンを超えて左にスクロールされたwindow内のテキスト列数)をリターンする。windowのデフォルトは、選択されたウィンドウである。
リターン値が負になることは決してない。windowで水平スクロールが行われていない場合(これが通常)、リターン値は0である。
(window-hscroll) ⇒ 0
(scroll-left 5) ⇒ 5
(window-hscroll) ⇒ 5
この関数は、windowの水平スクロールをセットする。columnsの値は、スクロール量を左マージンからの列数で指定する。引数columnsは0または正の数であること。そうでない場合は、0とみなされる。小数値のcolumnsは、現在のところサポートされない。
シンプルにM-:を呼び出して評価する方法でテストした場合は、set-window-hscroll
が機能していないように見えるかもしれないことに注意されたい。何が発生しているかというと、この関数は水平スクロール値をセットしてリターンするが、その後にポイントを可視にするために水平スクロールを調整するよう再表示が行なわれ、これが関数の行った処理をオーバーライドしている。この関数の効果は、左マージンからポイントまでのスクロール量が、ポイントが可視のまま留まるように関数を呼び出すことにより観察できる。
リターン値はcolumnsである。
(set-window-hscroll (selected-window) 10) ⇒ 10
以下は、与えられた位置positionが水平スクロールによりスクリーン外にあるかどうかを判断する例です:
(defun hscroll-on-screen (window position) (save-excursion (goto-char position) (and (>= (- (current-column) (window-hscroll window)) 0) (< (- (current-column) (window-hscroll window)) (window-width window)))))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ウィンドウの位置を報告する関数を説明します。これらの関数のほとんどは、そのウィンドウのフレームから相対的な位置を報告します。この場合の座標原点‘(0,0)’は、そのフレームの左上隅付近になります。技術的な理由から、グラフィカルなディスプレイ上では、原点はスクリーン上のグラフィカルなウィンドウの左上隅に正確には配置されません。EmacsがGTK+とともにビルドされた場合、原点は(Emacsではなくウィンドウマネージャーおよび/またはGTK+により描画される)タイトルバー、GTK+メニューバー、ツールバーの下のEmacsウィンドウ表示に使用されるフレーム領域の左上隅になります。しかし、GTK+なしでEmacsがビルドされた場合の原点は、ツールバーの左上隅になります(この場合はEmacs自身がツールバーを描画する)。どちらの場合も、X座標とY座標は、右または下に行くにつれ増加します。
注記された箇所を除き、X座標とY座標は整数の文字単位(行数と列数)で報告されます。グラフィカルなディスプレイ上では、“行”と“列”はそれぞれ、そのフレームのデフォルトフォントにより指定される、デフォルト文字の高さと幅に対応します。
この関数は、window端の座標のリストをリターンする。If
windowが省略またはnil
の場合のデフォルトは、選択されたウィンドウである。
リターン値は、(left top right
bottom)
という形式をもつ。リストの要素は順に、そのウィンドウにより占有される最左列のX座標、最上行のY座標、最右列より1列右のX座標、最下行より1行下のY座標である。
これらは、ヘッダーライン、モードライン、スクロールバー、ウィンドウディバイダー、ディスプレイマージンを含む、ウィンドウの実際の外端であることに注意。テキスト端末では、そのウィンドウの右に隣接するウィンドウがある場合、ウィンドウの右端にはそのウィンドウと隣接するウィンドウの間のセパレーターラインが含まれる。
この関数はwindow-edges
と似ているが、そのウィンドウのテキストエリア端の値をリターンする。これらからはヘッダーライン、モードライン、スクロールバー、フリンジ、ウィンドウディバイダー、ディスプレイマージン、垂直セパレーターは除外される。
この関数は、windowの最上行のY座標をリターンする。これはwindow-edges
によりリターンされるリストのtopエントリーと等価である。
この関数は、windowの最左列のX座標をリターンする。これはwindow-edges
によりリターンされるリストのleftエントリーと等価である。
以下の関数は、フレーム相対座標(frame-relative coordinates)のセットからウィンドウへの関連付けに使用できます:
この関数は、フレームframe上の、フレーム相対座標x、yにある生きたウィンドウをリターンする。その位置にウィンドウがなければ、nil
をリターンする。frameが省略またはnil
の場合のデフォルトは、選択されたフレームである。
この関数は、ウィンドウwindowがフレーム相対座標coordinatesを占有するかどうかをチェックし、もしそうならウィンドウのどの部分かをチェックする。windowは生きたウィンドウであること。coordinatesは(x
. y)
という形式であるべきで、xとyはフレーム相対座標であること。
指定された位置にウィンドウが存在しない場合、リターン値はnil
である。それ以外では、リターン値は以下のいずれかになる:
(relx . rely)
その座標はwindow内にある。数値relxとrelyは、指定された位置にたいするウィンドウ左上隅を原点に0から数えたウィンドウ相対座標と等価である。
mode-line
その座標はwindowのモードライン内にある。
header-line
その座標はwindowのヘッダーライン内にある。
right-divider
その座標はwindowと右に隣接するウィンドウを分けるディバイダー内にある。
right-divider
その座標はwindowと下にあるウィンドウを分けるディバイダー内にある。
vertical-line
その座標はwindowと右に隣接するウィンドウを分ける垂直ライン内にある。この値は、ウィンドウにスクロールバーがないときのみ発生し得る。スクロールバー内の位置は、これらの目的にたいしてはウィンドウ外と判断される。
left-fringe
right-fringe
その座標はウィンドウの左か右のフリンジ内にある。
left-margin
right-margin
その座標はウィンドウの左か右のマージン内にある。
nil
その座標は、windowのいずれの部分でもない。
関数coordinates-in-window-p
はwindowのあるフレームを使用するので、引数としてフレームを要求しない。
以下の関数は、文字単位ではなくピクセル単位でウィンドウ位置をリターンします。主にグラフィカルなディスプレイで有用ですが、テキスト端末上でも呼び出すことができ、その場合は各文字の占めるスクリーン領域が“1ピクセル”となります。
この関数は、window端のピクセル座標のリストをリターンする。windowが省略またはnil
の場合のデフォルトは、選択されたウィンドウである。
リターン値は(left top right
bottom)
という形式をもつ。リストの要素は順にウィンドウ左端のXピクセル座標、上端のYピクセル座標、右端のXピクセル座標+1、下端のYピクセル座標+1である。
この関数はwindow-pixel-edges
と同様だが、ウィンドウ端のピクセル座標ではなく、ウィンドウのテキストエリア端のピクセル座標をリターンする。windowには生きたウィンドウを指定しなければならない。
以下の関数は、フレームではなく、ディスプレイ画面(display screen)に相対的なウィンドウ位置をピクセルでリターンする。
この関数はwindow-pixel-edges
と同様だが、ディスプレイ画面の左上隅からの相対ピクセル座標でウィンドウ端の座標をリターンする。
この関数はwindow-inside-pixel-edges
と同様だが、ディスプレイ画面の左上隅からの相対ピクセル座標でウィンドウのテキストエリア端の座標をリターンする。windowには生きたウィンドウを指定しなければならない。
この関数は、ウィンドウwindowの左端のピクセルをリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウである。
この関数は、ウィンドウwindowの上端のピクセルをリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ウィンドウ構成(window configuration)とは1つのフレーム上全体のレイアウト —
すべてのウィンドウ、およびそれらのサイズ、どんなバッファーを含んでいるか、それらのバッファーがスクロールされる方法、ポイント値とマーク値を記録し、フリンジ、マージン、スクロールバーのセッティングも記録します。これにはminibuffer-scroll-window
の値も含まれます。特別な例外として、ウィンドウ構成には選択されたウィンドウのカレントバッファーのポイント値は記録されません。
以前に保存されたウィンドウ構成をリストアすることにより、フレーム全体のレイアウトを取り戻すことができます。1つだけではなくすべてのフレームのレイアウトを記録したい場合は、ウィンドウ構成のかわりに、フレーム構成(frame configuration)を使用します。Frame Configurationsを参照してください。
この関数は、frameのカレントのウィンドウ構成を表す新たなオブジェクトをリターンする。frameのデフォルトは選択されたフレームである。変数window-persistent-parameters
は、この関数により保存されるウィンドウパラメーター(もしあれば)を指定する。Window Parametersを参照のこと。
この関数は、configurationが作成されたフレームにたいして、ウィンドウとバッファーの構成をconfigurationで指定された構成にリストアする。
引数configurationは、以前にcurrent-window-configuration
がリターンした値でなければならない。この構成は、そのフレームが選択されているか否かに関わらず、configurationが作成時のフレームから、当該フレームにリストアされる。これは常にウィンドウのサイズ変更とみなされ、window-size-change-functions
(Hooks for Window Scrolling and Changesを参照)の実行をトリガーする。なぜなら、set-window-configuration
は、新たな構成が古い構成と実際に異なるかを示す方法を知らないからである。
configurationが保存されたフレームが死んでいる(生きていない)場合、この関数が行うのは3つの変数window-min-height
、window-min-width
、minibuffer-scroll-window
のリストアだけである。この場合、関数はnil
をリターンし、それ以外はt
をリターンする。
以下は、save-window-excursion
と同様な効果を得るためにこの関数を使用する例である:
(let ((config (current-window-configuration))) (unwind-protect (progn (split-window-below nil) …) (set-window-configuration config)))
このマクロは、選択されたフレームのウィンドウ構成を記録して、formsを順に実行してから、以前のウィンドウ構成をリストアする。リターン値は、forms内の最後のフォームの値である。
Lispコードのほとんどは、このマクロを使用すべきではない。大抵はsave-selected-window
で十分である。特に、このマクロはforms内で新たなウィンドウをオープンするコードを確実に防ぐことができず、新たなウィンドウは別のフレーム内でオープンされるかもしれないが(Choosing a Window for Displayを参照)、save-window-excursion
が保存およびリストアするのは、カレントフレーム上のウィンドウ構成だけだからである。
このマクロをwindow-size-change-functions
内で使用してはならない。このマクロをexitすることによりwindow-size-change-functions
の実行がトリガーされるが、これは無限ループを引き起こす。
この関数は、objectがウィンドウ構成ならt
をリターンする。
この関数は、ポイント値、マーク値、保存されたスクロール位置を無視して(これらの観点が異なってもt
をリターンし得る)、ウィンドウ構造の観点から2つのウィンドウ構成を比較する。
関数equal
も2つのウィンドウ構成を比較できる。これはすべての点から、たとえ1つでも異なるものがあれば等しい構成とはみなさず、たとえ保存されたポイント値やマーク値が異なるだけでも、等しくないとみなす。
この関数は、ウィンドウ構成configが作成されたフレームをリターンする。
ウィンドウ構成の内部を調べる他のプリミティブも有用かもしれませんが、わたしたちはこれらを必要としないので実装されていません。ウィンドウ構成にたいしてより多くの操作を知りたい場合は、ファイルwinner.elを参照してください。
current-window-configuration
がリターンするオブジェクトは、Emacsプロセスとともに終焉します。ウィンドウ構成をディスク上に格納して、それを別のEmacsセッションに読み戻すために、次に説明する関数を使用できます。これらの関数は、フレームの状態を任意の生きたウィンドウにクローンする場合も有用です(set-window-configuration
はフレームのウィンドウを、そのフレームのルートウィンドウだけに効果的にクローンする)。
この関数は、windowの状態をLispオブジェクトとしてリターンする。引数windowは有効なウィンドウでなければならず、デフォルトは選択されたフレームのルートウィンドウである。
オプション引数writableが非nil
の場合、それはwindow-point
やwindow-start
のようなサンプリング位置にたいするマーカーを使用しないことを意味する。この状態をディスクに書き込んで別のセッションに読み戻す場合は、この引数は非nil
であること。
引数writableと変数window-persistent-parameters
の両方で、この関数によりどのウィンドウパラメーターが保存されるかを指定する。Window Parametersを参照のこと。
window-state-get
によりリターンされる値は、同一セッション内の他のウィンドウ内にあるウィンドウのクローンを作成するために使用できます。これはディスクに書き込んで、別のセッションに読み戻すこともできます。どちらの場合でも、ウィンドウの状態をリストアするためには以下の関数を使用します。
この関数は、ウィンドウ状態stateをwindow内にputする。引数stateは以前に呼び出したwindow-state-get
がリターンしたウィンドウ状態であること。オプション引数windowには生きたウィンドウ、または内部ウィンドウ(Windows and Framesを参照)のいずれかを指定でき、デフォルトは選択されたウィンドウである。windowが生きていない場合は、stateをputする前に生きたウィンドウに置き換える。
オプション引数ignoreが非nil
の場合、それは最小ウィンドウサイズと固定サイズの制限を無視することを意味する。ignoreがsafe
なら、それは1行および/または2列まで、できる限り小さくできることを意味する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、ウィンドウに追加の情報を関連付けるためにウィンドウパラメーターを使用する方法を説明します。
この関数は、windowのparameterの値をリターンする。windowのデフォルトは、選択されたウィンドウである。windowにparameterにたいするセッティングがない場合、この関数はnil
をリターンする。
この関数は、windowのすべてのパラメーターと、その値をリターンする。windowのデフォルトは、選択されたウィンドウである。リターン値はnil
、または(parameter
. value)
という形式をもつ要素からなる連想リストである。
この関数は、windowのparameterの値にvalueをセットして、valueをリターンする。windowのデフォルトは、選択されたウィンドウである。
デフォルトでは、ウィンドウ構成(window configuration)やウィンドウ状態(states of
windows)の保存とリストアを行う関数は、ウィンドウパラメーターについては関知しません(Window Configurationsを参照)。これは、save-window-excursion
のbody内でパラメーターの値を変更したときは、そのマクロのexit時に以前の値がリストアされないことを意味します。これはまた、以前にwindow-state-get
で保存されたウィンドウ状態をwindow-state-put
でリストアしたときは、クローンされたすべてのウィンドウのパラメーターがnil
にリセットされることも意味します。以下の変数により、この標準の挙動をオーバーライドできます:
この変数は、current-window-configuration
とwindow-state-get
により保存され、set-window-configuration
とwindow-state-put
によりリストアされるパラメーターを指定するalistである。Window Configurationsを参照のこと。
このalistの各エントリーのCARはパラメーターを指定するシンボルである。CDRは以下のいずれかであること:
nil
この値は、そのパラメーターがwindow-state-get
とcurrent-window-configuration
のいずれによっても保存されていないことを意味する。
t
この値は、そのパラメーターがcurrent-window-configuration
、および(writable引数がnil
の場合は)window-state-get
により保存されたことを意味する。
writable
これは、そのパラメーターが無条件でcurrent-window-configuration
とwindow-state-get
の両方により保存されたことを意味する。この値は、入力構文(read
syntax)をもたないパラメーターに使用するべきではない。使用した場合、別のセッションでwindow-state-put
を呼び出すと、invalid-read-syntax
エラーで失敗するだろう。
いくつかの関数(特にdelete-window
、delete-other-windows
、split-window
)は、window引数にパラメーターセットをもつ場合は特別な挙動を示すかもしれません。以下の変数を非nil
値にバインドすることにより、そのような特別な挙動をオーバーライドできます:
この変数が非nil
の場合、いくつかの標準関数はウィンドウパラメーターを処理しない。現在のところ影響を受ける関数はsplit-window
、delete-window
、delete-other-windows
、other-window
である。
アプリケーションは、これらの関数の呼び出し周辺で、この変数を非nil
にバインドできる。これを行った場合、そのアプリケーションはその関数のexit時に、関連するすべてのウィンドウのパラメーターを正しく割り当てる責任をもつ。
以下のパラメーターは現在のところ、ウィンドウ管理コードにより使用されています:
delete-window
このパラメーターは、delete-window
の実行に影響する(Deleting Windowsを参照)。
delete-other-windows
このパラメーターは、delete-other-windows
の実行に影響する(Deleting Windowsを参照)。
split-window
このパラメーターは、split-window
の実行に影響する(Splitting Windowsを参照)。
other-window
このパラメーターは、other-window
の実行に影響する(Cyclic Ordering of Windowsを参照)。
no-other-window
このパラメーターは、そのウィンドウをother-window
により選択不可とマークする(Cyclic Ordering of Windowsを参照)。
clone-of
このパラメーターは、そのウィンドウがクローンされたことを指定する。これはwindow-state-get
によりインストールされる(Window Configurationsを参照)。
quit-restore
このパラメーターは、バッファー表示関数によりインストールされ、quit-restore-window
により参照される(Quitting Windowsを参照)。これは4つの要素を含む:
1つ目の要素はwindow
(ウィンドウはdisplay-buffer
により特別に作られた)、frame
(別のフレームが作られた)、same
(ウィンドウは前と同じバッファーを表示する)、other
(ウィンドウは前と異なるバッファーを表示する)のシンボルのいずれかである。
2つ目の要素はシンボルwindow
、frame
、または要素がそのウィンドウに前に表示されていたバッファー、そのときのウィンドウstart位置、ウィンドウポイント位置、ウィンドウの高さであるようなリストの、いずれかである。
3つ目の要素は、そのパラメーター作成時点に選択されていたウィンドウである。関数quit-restore-window
は、その引数としてこのウィンドウが渡された際は、そのウィンドウの再選択を試みる。
4つ目の要素は、その表示がこのパラメーターの生成を引き起こしたバッファーである。quit-restore-window
は、指定されたウィンドウがまだそのバッファーを表示している場合のみ、それを削除する。
追加のパラメーターとして、window-atom
とwindow-side
があります。これらは予約されており、アプリケーションが使用するべきではありません。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、あるウィンドウがそのバッファーの違う部分を表示したり、別のバッファーを表示したとき常にLispプログラムを実行可能にする方法について説明します。これを変更できる3つのアクションがあります。それはウィンドウのスクロール、ウィンドウ内でのバッファーの切り替え、ウィンドウのサイズ変更です。最初の2つのアクションはwindow-scroll-functions
、最後のアクションはwindow-size-change-functions
を実行します。
この変数は、ウィンドウのスクロールによりEmacsが再表示前に呼び出すべき関数のリストを保持する。そのウィンドウ内に異なるバッファーを表示したときも、これらの関数が実行される。
この変数は、それぞれの関数が2つの引数、ウィンドウとウィンドウの新たなdisplay-start位置で呼び出されるので、ノーマルフックではない。
これらの関数は、window-end
(The Window Start and End Positionsを参照)を使用する際には気をつけなければならない。最新の値が必要な場合は、それを確実に入力するためにupdate引数を使用しなければならない。
警告: ウィンドウのスクロール方法を変更するためにこの機能を使用してはならない。これは、そのような用途のためにデザインされておらず、そのような使用は機能しないだろう。
この変数は、理由は何であれ、任意のウィンドウのサイズが変更された場合に呼び出される関数のリストを保持する。これらの関数は、再表示ごとに1回、サイズ変更が発生したフレーム上で1回呼び出される。
それぞれの関数は、フレームを唯一の引数として呼び出される。そのフレーム上のどのウィンドウのサイズが変更されたか、および変更された正確な方法を直接探す方法はない。とはいえ、各呼び出しにおいてsize-change関数が既存のウィンドウと、それらのサイズを記録すれば、現在のサイズと以前のサイズを比較することも可能である。
ウィンドウの作成と削除はサイズの変更とみなされるので、これらの関数の呼び出しを引き起こす。フレームのサイズ変更は、既存のウィンドウのサイズを変更するので、これも変更とみなされる。
これらの関数内で、save-selected-window
を使用できる(Selecting Windowsを参照)。しかし、save-window-excursion
(Window Configurationsを参照)を使用してはならない。このマクロのexitはサイズ変更とみなされ、それはこれらの関数の際限ない呼び出しを引き起こすだろう。
既存フレームのウィンドウ構成を変更するたびに毎回実行される、ノーマルフックである。これにはウィンドウの分割と削除、ウィンドウのサイズ変更、ウィンドウ内への異なるバッファーの表示が含まれる。
このフックのバッファーローカルな部分は、影響を受けるフレーム上の各ウィンドウにたいして、関係するウィンドウを選択、およびそのバッファーをカレントにして1回実行される。グローバルな部分は、変更されたフレームにたいして、そのフレームを選択して1回実行される。
加えて、Font Lockフォント表示関数(Font Lock fontification
function)を登録するために、jit-lock-register
を使用できる。バッファーの一部が(再)フォント表示されたときは、ウィンドウがスクロール、またはサイズ変更されたという理由で、これが常に呼び出されるだろう。Other Font Lock Variablesを参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレーム(frame)とは、1つ以上のEmacsウィンドウを含むスクリーンオブジェクトです(Windowsを参照)。これは、グラフィカル環境では“ウィンドウ”と呼ばれる類のオブジェクトです。しかし、Emacsはこの単語を異なる方法で使用しているので、ここではそれを“ウィンドウ”と呼ぶことはできません。Emacs Lispにおいてフレームオブジェクト(frame object)とは、スクリーン上のフレームを表すLispオブジェクトです。Frame Typeを参照してください。
フレームには最初、1つのメインウィンドウおよび/またはミニバッファーウィンドウが含まれます。メインウィンドウは、より小さいウィンドウに垂直、または水平に分割することができます。Splitting Windowsを参照してください。
端末(terminal)とは、1つ以上のEmacsフレームを表示する能力のあるデバイスのことです。Emacs Lispにおいて、端末オブジェクト(terminal object)とは端末を表すLispオブジェクトです。Terminal Typeを参照してください。
端末にはテキスト端末(text terminals)とグラフィカル端末(graphical
terminals)という、2つのクラスがあります。テキスト端末はグラフィック能力をもたないディスプレイで、xterm
やその他の端末エミュレーターが含まれます。テキスト端末上では、それぞれのEmacsフレームは、その端末のスクリーン全体を占有します。たとえ追加のフレームを作成してそれらを切り替えることができたとしても、端末が表示するのは一度に1つのフレームだけです。一方でグラフィカル端末は、X
Window
Systemのようなグラフィカルディスプレイシステムにより管理されています。これにより、Emacsは同一ディスプレイ上に複数のフレームを同時に表示することができます。
GNUおよびUnix systemsシステムでは、単一のEmacsセッション内で、そのEmacsがテキスト端末とグラフィカル端末のいずれで開始されたかに関わらず、任意の利用可能な端末上で、追加のフレームを作成することができます。Emacsは、グラフィカル端末とテキスト端末の両方を、同時に表示することができます。 これはたとえば、リモート地から同じセッションに接続する際などに便利でしょう。Multiple Terminalsを参照してください。
この述語(predicate)は、objectがフレームなら非nil
、それ以外はnil
をリターンする。フレームにたいしては、フレームが使用するディスプレイの種類の値となる:
t
そのフレームはテキスト端末上で表示されている。
x
そのフレームはXグラフィカル端末上で表示されている。
w32
そのフレームはMS-Windowsグラフィカル端末上で表示されている。
ns
そのフレームはGNUStepまたはMacintosh Cocoaグラフィカル端末上で表示されている。
pc
そのフレームはMS-DOS端末上で表示されている。
この関数は、frameを表示する端末オブジェクトをリターンする。frameがnil
または未指定の場合のデフォルトは、選択されたフレームである。
この述語は、objectが生きた(削除されていない)端末なら非nil
、それ以外はnil
をリターンする。生きた端末にたいしては、リターン値はその端末上で表示されているフレームの種類を示す。可能な値は、上述のframep
と同様。
28.1 Creating Frames | 追加のフレームの作成。 | |
28.2 Multiple Terminals | 異なる複数デバイス上での表示。 | |
28.3 Frame Parameters | フレームのサイズ、位置、フォント等の制御。 | |
28.4 Terminal Parameters | 端末上のすべてのフレームにたいして一般的なパラメーター。 | |
28.5 Frame Titles | フレームタイトルの自動的な更新。 | |
28.6 Deleting Frames | 明示的に削除されるまでフレームは存続する。 | |
28.7 Finding All Frames | すべての既存フレームを調べる方法。 | |
28.8 Minibuffers and Frames | フレームが使用するミニバッファーを見つける方法。 | |
28.9 Input Focus | 選択されたフレームの指定。 | |
28.10 Visibility of Frames | フレームは可視、不可視、またはアイコン化されているかもしれない。 | |
28.11 Raising and Lowering Frames | フレームを前面に移動して他のウィンドウを隠し、背面に移動して他のウィンドウがフレームを隠す。 | |
28.12 Frame Configurations | すべてのフレームの状態の保存。 | |
28.13 Mouse Tracking | マウス移動時のイベントの取得。 | |
28.14 Mouse Position | マウスの場所や移動を問い合わせる。 | |
28.15 Pop-Up Menus | ユーザーに選択させるためのメニューの表示。 | |
28.16 Dialog Boxes | yes/noを問い合わせるためのボックスの表示。 | |
28.17 Pointer Shape | マウスポインターのシェイプの指定。 | |
28.18 Window System Selections | 他のXクライアントとのテキストの転送。 | |
28.19 Drag and Drop | ドラッグアンドドロップの実装の内部。 | |
28.20 Color Names | カラー名定義の取得。 | |
28.21 Text Terminal Colors | テキスト端末のカラーの定義。 | |
28.22 X Resources | サーバーからのリソース値の取得。 | |
28.23 Display Feature Testing | 端末の機能の判定。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
新たにフレームを作成するためには、関数make-frame
を呼び出します。
この関数は、カレントバッファーを表示するフレームを作成して、それをリターンする。
alist引数は、新たなフレームのフレームパラメーターを指定するalistである。Frame Parametersを参照のこと。alist内でterminal
パラメーターを指定した場合、新たなフレームはその端末上で作成される。それ以外の場合、alist内でwindow-system
フレームパラメーターを指定した場合、それはフレームがテキスト端末とグラフィカル端末のどちらで表示されるべきかを決定する。Window Systemsを参照のこと。どちらも指定されない場合、新たなフレームは選択されたフレームと同じ端末上に作成される。
alistで指定されなかったパラメーターのデフォルトは、alist
default-frame-alist
内の値となる。そこでも指定されないパラメーターのデフォルトは、Xリソース、またはそのオペレーティングシステムで同等のものの値となる(X Resources in The GNU Emacs Manualを参照)。フレームが作成された後、Emacsは
frame-inherited-parameters
(以下参照)内にリストされたすべてのパラメーターを適用して、引数にないものはmake-frame
呼び出し時に選択されていたフレームから値を取得する。
マルチモニターディスプレイ(Multiple Terminalsを参照)では、ウィンドウマネージャーがalist内の位置パラメーター(Position Parametersを参照)の指定とは異なる位置にフレームを配置するかもしれないことに注意。たとえば、ウィンドウの大きな部分、いわゆる支配モニター(dominating monitor)上のフレームを表示するポリシーをもつウィンドウマネージャーがいくつかあります。
この関数自体はーが、新たなフレームを選択されたフレームにする訳ではない。See section Input Focusを参照のこと。以前に選択されていたフレームは、選択されたままである。しかしグラフィカル端末上では、ウィンドウシステム自身の理由により、新たなフレームが選択されるかもしれない。
make-frame
がフレームを作成する前に、それにより実行されるノーマルフック。
make-frame
がフレームを作成した後に、それにより実行されるアブノーマルフック。after-make-frame-functions
内の各関数は、作成された直後のフレームを単一の引数として受け取る。
この変数は、カレントで選択されているフレームから継承して新たに作成されたフレームのフレームパラメーターのリストを指定する。リスト内の各要素はmake-frame
の引数として与えられなかったパラメーター(シンボル)であり、make-frame
は新たに作成されたフレームのそのパラメーターに、選択されたフレームの値をセットする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacsは、それぞれの端末を端末オブジェクト(terminal object)というデータ型で表します(Terminal Typeを参照)。GNUおよびUnixシステムでは、Emacsはそれぞれのセッション内で複数の端末を同時に実行できます。その他のシステムでは、単一の端末だけが使用できます。端末オブジェクトはそれぞれ、以下の属性をもちます:
terminal-live-p
によりリターンされるシンボル(たとえばx
、t
、w32
、ns
、pc
)である。Framesを参照のこと。
端末オブジェクトを作成するプリミティブはありません。make-frame-on-display
(以下参照)を呼び出したときなど、Emacsは必要に応じてそれらを作成します。
この関数は、terminalにより使用されるデバイスのファイル名をリターンする。terminalが省略またはnil
の場合のデフォルトは、選択されたフレームの端末である。terminalはフレームでもよく、その場合はそのフレームの端末となる。
この関数は、すべての生きた端末オブジェクトのリストをリターンする。
この関数は、deviceにより与えられたデバイス名の端末をリターンする。deviceが文字列の場合は端末デバイス名、または‘host:server.screen’という形式のXディスプレイ名のいずれかを指定できる。deviceの場合、この関数はそのフレームの端末をリターンする。nil
は選択されたフレームを意味する。最後に、もしdeviceが生きた端末を表す端末オブジェクトなら、その端末がリターンされる。引数がこれらのいずれとも異なる場合、この関数はエラーをシグナルする。
この関数は、terminal上のすべてのフレームを削除して、それらが使用していたリソースを解放する。これらはアブノーマルフックdelete-terminal-functions
を実行し、各関数の引数としてterminalを渡す。
terminalが省略またはnil
の場合のデフォルトは、選択されたフレームの端末である。terminalはフレームでもよく、その場合はそのフレームの端末を意味する。
この関数は通常、唯一アクティブな端末の削除を試みるとエラーをシグナルするが、forceが非nil
なら、これを行うことができる。端末上で最後のフレームを削除した際、Emacsは自動的にこの関数を呼び出す(Deleting Framesを参照)。
delete-terminal
により実行されるアブノーマルフック。各関数は、delete-terminal
に渡されたterminalを、唯一の引数として受け取る。技術的な詳細により、この関数は端末の削除の直前、または直後のいずれかに呼び出される。
数は多くありませんが、いくつかのLisp変数は端末ローカル(terminal-local)です。つまり、それらは端末それぞれにたいして、個別にバインディングをもちます。いかなるときも、実際に効果をもつバインディングは、カレントで選択されたフレームに属する端末にたいして1つだけです。これらの変数にはdefault-minibuffer-frame
、defining-kbd-macro
、last-kbd-macro
、system-key-alist
が含まれます。これらは常に端末ローカルであり、決してバッファーローカル(Buffer-Local Variablesを参照)にはできません。
GNUおよびUnixシステムでは、Xディスプレイはそれぞれ別のグラフィカル端末になります。Xウィンドウシステム内でEmacsが開始された際は環境変数DISPLAY
、または‘--display’オプション(Initial
Options in The GNU Emacs
Manualを参照)により指定されたXディスプレイを使用します。Emacsはコマンドmake-frame-on-display
を通じて、別のXディスプレイに接続できます。それぞれのXディスプレイは各自、選択されたフレームとミニバッファーをもちます。しかしあらゆる瞬間(Input Focusを参照)において、それらのフレームのうちの1つだけが、“いわゆる選択されたフレーム”になります。emacsclient
との対話することにより、Emacsが別のテキスト端末と接続することさえ可能です。Emacs
Server in The GNU Emacs Manualを参照してください。
1つのXサーバーが、1つ以上のディスプレイを処理できます。各Xディスプレイには、‘hostname:displaynumber.screennumber’という3つの部分からなる名前があります。1つ目の部分のhostnameは、その端末が物理的に接続されるマシン名です。2つ目の部分のdisplaynumberは、同じキーボードとポインティングデバイス(マウスやタブレット等)を共有するマシンに接続された、1つ以上のモニターを識別するための、0基準の番号です。3つ目の部分のscreennumberは、そのXサーバー上の単一のモニターコレクション(a single monitor collection)の一部である、0基準のスクリーン番号(個別のモニター)です。1つのサーバー配下にある2つ以上のスクリーンを使用する際、Emacsはそれらの名前の同一部分から、それらが単一のキーボードを共有することを知ることができるのです。
MS-WindowsのようにXウィンドウシステムを使用しないシステムは、Xディスプレイの概念をサポートせず、各ホスト上には1つのディスプレイだけがあります。これらのシステム上のディスプレイ名は、上述したような3つの部分からなる名前にしたがいません。たとえば、MS-Windowsシステム上のディスプレイ名は文字列定数‘w32’です。これは互換性のために存在するものであり、ディスプレイ名を期待する関数にこれを渡すことができます。
この関数は、display上に新たにフレームを作成して、それをリターンする。その他のフレームパラメーターは、alist parametersから取得する。displayはXディスプレイの名前(文字列)であること。
この関数は、フレーム作成前にEmacsがグラフィックを表示するために“セットアップ”されることを保証する。たとえば、Emacsが(テキスト端末上で開始された等で)Xリソースを未処理なら、この時点で処理を行う。他のすべての点においては、この関数はmake-frame
(Creating Framesを参照)と同様に振る舞う。
この関数は、EmacsがどのXディスプレイに接続したかを識別するリストをリターンする。このリストの要素は文字列で、それぞれがディスプレイ名を表す。
この関数は、ディスプレイ上にフレームを作成することなく、Xディスプレイdisplayへの接続をオープンする。通常は、make-frame-on-display
が自動的に呼び出すので、Emacs
Lispプログラムがこの関数を呼び出す必要はない。これを呼び出す唯一の理由は、与えられたXディスプレイにたいして通信を確立できるかどうかチェックするためである。
オプション引数xrm-stringが非nil
なら、それは.Xresourcesファイル内で使用されるフォーマットと同一な、リソース名とリソース値である。X Resources in The GNU Emacs
Manualを参照のこと。これらの値はそのXサーバー上で記録されたリソース値をオーバーライドして、このディスプレイ上で作成されるすべてのEmacsフレームにたいして適用される。以下は、この文字列がどのようなものかを示す例である:
"*BorderWidth: 3\n*InternalBorder: 2\n"
must-succeedが非nil
なら、接続オープンの失敗によりEmacsが終了させられる。それ以外の場合は、通常のLispエラーとなる。
この関数は、ディスプレイdisplayへの接続をクローズする。これを行う前にまず、そのディスプレイ上でオープンしたすべてのフレームを削除しなければならない(Deleting Framesを参照)。
“マルチモニター”のセットアップにおいて、単一のXディスプレイが複数の物理モニターに出力される場合があります。そのようなセットアップを取得するために、関数display-monitor-attributes-list
とframe-monitor-attributes
を使用できます。
この関数は、display上の物理モニターの属性のリストをリターンする。displayにはディスプレイ名(文字列)、端末、フレームを指定でき、省略またはnil
の場合のデフォルトは、選択されたフレームのディスプレイである。このリストの各要素は、物理モニターの属性を表す連想リストである。1つ目の要素はプライマリーモニターである。以下は属性のキーと値である:
‘(x y width height)’のような、ピクセル単位でのそのモニターのスクリーンの左上隅の位置、そのサイズ。そのモニターがプライマリーモニターでない場合は、いくつかの座標が負になり得る。
‘(x y width height)’のような、ピクセル単位でのワークエリア(“使用可能”なスペース)の左上隅の位置と、そのサイズ。これはワークエリアから除外され得る、ウィンドウマネージャーのさまざまな機能(dock、taskbar等)が占めるスペースの分、‘geometry’とは異なるかもしれない。そのような機能が実際にワークエリアから差し引かれるかどうかは、そのプラットフォームと環境に依存する。繰り返しになるが、そのモニターがプライマリーモニターでない場合、いくつかの座標は負になり得る。
‘(width height)’<のような、ミリメートル単位での幅と高さ。
その物理モニターが支配(dominate)するフレームのリスト(以下参照)。
stringのような、その物理モニターの名前。
stringのような、マルチモニターの情報ソース(例: ‘XRandr’、‘Xinerama’等)。
x、y、width、heightは整数。‘name’と‘source’は欠落しているかもしれない。
あるモニター内にフレームの最大領域がある、または(フレームがどの物理モニターに跨がらないなら)そのモニターがフレームに最も近いとき、フレームは物理モニターにより支配(dominate)される。グラフィカルなディスプレイ内の(ツールチップではない)すべてのフレームは、たとえそのフレームが複数の物理モニターに跨がる(または物理モニター上にない)としても、(可視か否かによらず)正確に1つの物理モニターにより支配される。
以下は、2つのモニターディスプレイ上でこの関数により生成されたデータの例である:
(display-monitor-attributes-list) ⇒ (((geometry 0 0 1920 1080) ;; 左手側プライマリーモニター (workarea 0 0 1920 1050) ;; タスクバーが幾分かの高さを占有 (mm-size 677 381) (name . "DISPLAY1") (frames #<frame emacs@host *Messages* 0x11578c0> #<frame emacs@host *scratch* 0x114b838>)) ((geometry 1920 0 1680 1050) ;; 右手側モニター (workarea 1920 0 1680 1050) ;; スクリーン全体を使用可 (mm-size 593 370) (name . "DISPLAY2") (frames)))
この関数は、 frameを支配(上記参照)する物理モニターの属性をリターンする。 frameのデフォルトは選択されたフレームである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレームはに、その外見と挙動を制御する、多くのパラメーターがあります。フレームがどのようなパラメーターをもつかは、そのフレームが使用するディスプレイのメカニズムに依存します。
フレームパラメーターは主に、グラフィカルディスプレイのために存在します。ほとんどのフレームパラメーターは、テキスト端末上のフレームに適用時は効果がありません。テキスト端末上のフレームでは、何か特別なことを行うパラメーターはheight
、width
、name
、title
、menu-bar-lines
、buffer-list
、buffer-predicate
だけです。その端末がカラーをサポートにはforeground-color
、background-color
、background-mode
、display-type
などのパラメーターも意味をもちます。その端末が透過フレーム(frame
transparency)をサポートする場合には、パラメーターalpha
も意味をもちます。
28.3.1 Access to Frame Parameters | フレームのパラメーターの変更方法。 | |
28.3.2 Initial Frame Parameters | フレーム作成時に指定するフレームパラメーター。 | |
28.3.3 Window Frame Parameters | ウィンドウシステムにたいするフレームパラメーターのリスト。 | |
28.3.4 Frame Size And Position | フレームのサイズと位置の変更。 | |
28.3.5 Geometry | ジオメトリー仕様の解析。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数により、フレームのパラメーター値の読み取りと変更ができます。
この関数は、frameのパラメーターparameter(シンボル)の値をリターンする。frameがnil
なら、選択されたフレームのパラメーターをリターンする。frameがparameterにたいするセッティングをもたない場合、この関数はnil
をリターンする。
関数frame-parameters
は、frameのすべてのパラメーターとその値をリストするalistをリターンする。frameが省略またはnil
の場合は、選択されたフレームのパラメーターをリターンする。
この関数は、alistの要素にもとづきフレームframeのパラメーターを変更する。alist内の要素はそれぞれ(parm
. value)
という形式をもち、ここでparmはパラメーターを名付けるシンボルである。
alist内に指定されないパラメーターの値は変更されない。frameがnil
の場合のデフォルトは、選択されたフレームである。
この関数は、フレームパラメーターparmに、指定されたvalueをセットする。frameがnil
の場合のデフォルトは、選択されたフレームである。
この関数は、
alistに応じて既存のフレームすべてのフレームパラメーターを変更してから、今後に作成されるフレームに同じパラメーター値を適用するために、default-frame-alist
(と必要ならinitial-frame-alist
)を変更する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
initファイル(The Init Fileを参照)内でinitial-frame-alist
をセットすることにより、フレームの初期スタートアップにパラメーターを指定できます。
この変数の値は、初期フレーム作成時に使用されるパラメーター値のalistである。以降のフレームを変更することなく、初期フレームの外見を指定するために、この変数を使用できる。要素はそれぞれ以下の形式をもつ:
(parameter . value)
Emacsは、initファイル読み取り前に初期フレームを作成する。After reading that file, Emacs checks
initial-frame-alist
をチェックして、すでに作成済みの初期フレームに、変更する値に含まれるパラメーターのセッティングを適用する。
これらのセッティングがフレームのジオメトリーと外見に影響する場合には、間違った外見のフレームを見た後、指定した外見に変更されるのを目にするだろう。これが煩わしい場合は、Xリソースで同じジオメトリーと外見を指定できる。これらは、フレーム作成前に効果をもつ。X Resources in The GNU Emacs Manualを参照されたい。
Xリソースセッティングは通常、すべての!に適用される。初期フレームのために、あるXリソースを単独で指定して、それ以降のフレームには適用したくない場合は、次の方法によりこれを達成できる。それ以降のフレームにたいするXリソースをオーバーライドするために、default-frame-alist
内でパラメーターを指定してから、それらが初期フレームに影響するのを防ぐために、initial-frame-alist
内の同じパラメーターにたいして、Xリソースにマッチする値を指定すればよい。
これらのパラメーターに(minibuffer
.
nil)
が含まれるなら、それは初期フレームがミニバッファーをもつべきではないことを示します。この場合、Emacsは同じようにミニバッファーオンリーフレーム(minibuffer-only
frame)を別個作成します。
この変数の値は、初期ミニバッファーオンリーフレーム(initial-frame-alist
がミニバッファーのないフレームを指定する場合にEmacsが作成するミニバッファーオンリーフレームのこと)を作成時に使用されるパラメーター値のalistである。
これは、すべてのEmacsフレーム(最初のフレームとそれ以降のフレーム)にたいして、フレームパラメーターのデフォルト値を指定するalistである。Xウィンドウシステム使用時には、大抵はXリソースで同じ結果を得られる。
この変数のセットは既存フレームに影響しない。さらに、別フレームにバッファーを表示する関数は、自身のパラメーターを提供することにより、デフォルトパラメーターをオーバーライドできる。
フレームの外見を指定するコマンドラインオプションとともにEmacsを呼び出した場合、これらのオプションはinitial-frame-alist
またはdefault-frame-alist
のいずれかに要素を追加することにより、効果を発揮します。‘--geometry’や‘--maximized’のような、初期フレームだけに影響するオプションはinitial-frame-alist
、その他のオプションはdefault-frame-alist
に要素を追加します。Command Line Arguments for Emacs Invocation in The GNU
Emacs Manualを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレームがどんなパラメーターをもつかは、どのようなディスプレイのメカニズムがそれを使用するかに依存します。このセクションでは、一部、またはすべての端末種類において特別な意味をもつパラメーターを説明します。これらのうちname
、title
、height
、width
、buffer-list
、buffer-predicate
は端末フレームにおいて有意な情報を提供し、tty-color-mode
はテキスト端末上のフレームにたいして意味があります。
28.3.3.1 Basic Parameters | 基本的なパラメーター。 | |
28.3.3.2 Position Parameters | スクリーン上のフレームの位置。 | |
28.3.3.3 Size Parameters | フレームのサイズ。 | |
28.3.3.4 Layout Parameters | フレームのパーツのサイズと、一部パーツの有効化と無効化。 | |
28.3.3.5 Buffer Parameters | 表示済みまたは表示されるべきバッファーはどれか。 | |
28.3.3.6 Window Management Parameters | ウィンドウマネージャーとの対話。 | |
28.3.3.7 Cursor Parameters | カーソルの外見の制御。 | |
28.3.3.8 Font and Color Parameters | フレームテキストにたいするフォントとカラー。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のフレームパラメーターは、フレームに関してもっとも基本的な情報を提供します。title
とname
は、すべての端末において意味をもちます。
display
このフレームをオープンするためのディスプレイ。これは環境変数DISPLAY
のような、‘host:dpy.screen’という形式の文字列であること。ディスプレイ名についての詳細は、See section Multiple Terminalsを参照のこと。
display-type
このパラメーターは、このフレーム内で使用できる利用可能なカラーの範囲を記述する。値はcolor
、grayscale
、mono
のいずれか。
title
フレームが非nil
のtitleをもつ場合、それはフレーム上端にあるウィンドウシステムのタイトルバーに表示され、mode-line-frame-identification
に‘%F’(%
-Constructs in the Mode Lineを参照)を使用していればそのフレーム内のウィンドウのモードラインにも表示される。これは通常、Emacsがウィンドウシステムを使用しておらず、かつ同時に1つのフレームのみ表示可能なケースが該当する。Frame Titlesを参照のこと。
name
そのフレームの名前。title
が未指定またはnil
なら、フレーム名はフレームタイトルにたいしてデフォルトの役割りを果たす。nameを指定しない場合、Emacsは自動的にフレーム名をセットする(Frame Titlesを参照)。
フレーム作成時に明示的にフレーム名を指定した場合は、そのフレームにたいしてXリソースを照合する際にも、(Emacs実行可能形式名のかわりに)その名前が使用される。
explicit-name
フレーム作成時にフレーム名が明示的に指定された場合、このパラメーターはその名前になるだろう。明示的に名付けられなかった場合、このパラメーターはnil
になる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
位置パラメーターの値は通常はピクセル単位ですが、テキスト端末ではピクセル単位のかわりに文字数か行数で数えられます。
left
スクリーンの左(右)端からフレームの左(右)端までの、ピクセル単位での位置。値は:
正の整数は、スクリーン左端をフレーム左端に、負の整数はフレーム右端をスクリーン右端に関連付ける。
(+ pos)
これは、スクリーン左端にたいしフレーム左端の相対的位置を指定する。整数posは正および負の値をとり得る。負の値はスクリーン外側、または(マルチモニターディスプレイにたいしては)プライマリーモニター以外のモニター上の位置を指定する。
(- pos)
これは、スクリーン右端にたいしフレーム右端の相対的位置を指定する。整数posは正および負の値をとり得る。負の値はスクリーン外側、または(マルチモニターディスプレイにたいしては)プライマリーモニター以外のモニター上の位置を指定する。
プログラム指定の位置を無視するウィンドウマネージャーがいくつかある。指定した位置が無視されない保証を望む場合は、パラメーターuser-position
にも同様に非nil
値を指定すること。
top
スクリーン上(下)端にたいして、上(下)端のスクリーン位置をピクセル単位で指定する。方向が水平ではなく垂直である点を除き、これはleft
と同様に機能する。
icon-left
スクリーン左端から数えた、フレームアイコン左端のピクセル単位のスクリーン位置。ウィンドウマネージャーがこの機能をサポートすれば、これはフレームをアイコン化したとき効果を発揮する。このパラメーターに値を指定する場合はicon-top
にも値を指定しなければならず、その逆も真である。
icon-top
スクリーン上端から数えた、フレームアイコン上端のピクセル単位のスクリーン位置。ウィンドウマネージャーがこの機能をサポートすれば、これはフレームをアイコン化したとき効果を発揮する。
user-position
フレームを作成してパラメーターleft
とtop
で位置を指定する際は、指定した位置がユーザー指定(人間であるユーザーにより明示的に要求された位置)なのか、それとも単なるプログラム指定(プログラムにより選択された位置)なのかを告げるために、このパラメーターを使用する。非nil
値は、それがユーザー指定の位置であることを告げる。
ウィンドウマネージャーは一般的にユーザー指定位置に留意し、プログラム指定位置にも幾分か留意する。しかし、多くはプログラム指定位置を無視してウィンドウをウィンドウマネージャーのデフォルトの方法で配すか、ユーザーのマウスによる配置に任せる。twm
を含むウィンドウマネージャーのいくつかは、プログラム指定位置にしたがうか無視するかをユーザーの指定に任せる。
make-frame
を呼び出す際、パラメーターleft
およびtop
の値がそのユーザーにより示される嗜好を表すなら、このパラメーターに非nil
値を、それ以外はnil
を指定するべきである。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレームパラメーターはフレームのサイズを文字単位で指定します。グラフィカルなディスプレイ上では、default
フェイスがこれら文字単位の実際のピクセルサイズを決定します(Face Attributesを参照)。
height
文字単位によるフレームコンテンツの高さ(ピクセル単位で高さを取得するにはframe-pixel-height
を呼び出す。Frame Size And Positionを参照のこと)。
width
文字単位によるフレームコンテンツの幅(ピクセル単位で幅を取得するにはframe-pixel-width
を呼び出す。Frame Size And Positionを参照のこと)。
user-size
これは、サイズパラメーターheight
およびwidth
にたいして、user-position
(user-positionを参照)がtop
およびleft
が行うのと同じことを行う。
fullscreen
幅または高さ、もしくはその両方を最大化することを指定する。値fullwidth
は、可能な限り幅を広く、値fullheight
は高さを可能な限り高く、値fullboth
は幅と高さをスクリーンサイズにセット、値maximized
はフレームを最大化することを指定する。maximized
とfullboth
の違いは、前者がマウスでそのウィンドウマネージャーによる装飾をドラッグしてサイズ変更が可能なのにたいし、後者は実際のスクリーン全体を覆うためマウスによるサイズ変更ができないことである。
いくつかのウィンドウマネージャーでは、フレームを“maximized”または“fullscreen”にするために、変数frame-resize-pixelwise
を非nil
値にカスタマイズする必要があるかもしれない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のフレームパラメーターにより、フレームのさまざまなパーツを有効または無効にしたり、サイズを制御できます。
border-width
ピクセル単位でのフレームのボーダー幅。
internal-border-width
テキスト(またはフリンジ)とフレームボーダーとのピクセル単位による距離。
vertical-scroll-bars
フレームが垂直スクロール用のスクロールバーをもつべきか否か、スクロールバーをフレームのどちら側に置くか。可能な値はleft
、right
、スクロールバーなしはnil
。
scroll-bar-width
垂直スクロールバーのピクセル単位による幅。nil
はデフォルト幅の使用を意味する。
left-fringe
right-fringe
そのフレーム内のウィンドウの左右フリンジのデフォルト幅(Fringesを参照)。いずれかが0なら、対応するフリンジを削除する効果がある。 If either of these is zero, that effectively removes the corresponding fringe.
これら2つのフレームパラメーターの値を問い合わせるためにframe-parameter
を使用する際、リターン値は常に整数となる。nil
値を渡してset-frame-parameter
を使用する際は、実際のデフォルト値8ピクセルが課せられる。
合成済みフリンジ幅は列数の合計数まで加算されなければならないので、frame-parameter
の応答値は指定値より大きくなるかもしれない。左右のフリンジ間には、余分な幅が均等に配分される。しかし、フリンジのいずれか幅に負の整数を指定することにより、フリンジに正確な幅を強制できる。どちらのフリンジ幅も負の場合は、左フリンジだけが指定された幅となる。
right-divider-width
フレーム上のすべてのウィンドウの右ディバイダー(Window Dividersを参照)用に予約される、ピクセル単位の幅(厚さ)。値0は右ディバイダーを描画しないことを意味する。
bottom-divider-width
フレーム上のすべてのウィンドウの下ディバイダー(Window Dividersを参照)用に予約される、ピクセル単位の幅(厚さ)。値0は下ディバイダーを描画しないことを意味する。
menu-bar-lines
メニューバー用にフレーム上端に割り当てる行数。Menu Barモードが有効の場合のデフォルトは1、それ以外は0である。Menu Bars in The GNU Emacs Manualを参照のこと。
tool-bar-lines
ツールバー用に使用する行数。Tool Barモードが有効の場合のデフォルトは1、それ以外は0である。See Tool Bars in The GNU Emacs Manualを参照のこと。
tool-bar-position
ツールバーの位置。現在のところGTKツールバーのみ。可能な値はtop
、bottom
、left
、right
。デフォルトはtop
。
line-spacing
各テキスト行配下に残す、ピクセル単位の追加スペース(正の整数)。詳細はLine Heightを参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、フレーム内でどのバッファーが表示されているか、されるべきかを扱うためのフレームパラメーターで、すべての種類の端末上で意味があります。
minibuffer
そのフレームが自身のミニバッファーをもつか否か。もつ場合はt
、もたない場合はnil
、only
ならそのフレームが正にミニバッファーであることを意味する。値が(別フレーム内の)ミニバッファーウィンドウの場合、そのフレームはそのミニバッファーを使用する。
このフレームパラメーターはフレーム作成時に効果があち、その後は変更できない。
buffer-predicate
このフレームにたいする、buffer-predicate関数。関数other-buffer
は、どのバッファーを考慮すべきか決定するために、(選択されたフレームから)この述語がnil
でなければ、これを使用する。これは各バッファーにたいして、そのバッファーを唯一の引数として、この述語を1回呼び出す。この述語が非nil
値をリターンしたら、そのバッファーは考慮される。
buffer-list
そのフレーム内で選択されているバッファーの、もっとも最近選択されたバッファーが先頭になるような順のリスト。
unsplittable
非nil
なら、このフレームのウィンドウは決して自動的に分割されることはない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のフレームパラメーターは、ウィンドウマネージャーとフレームとの相互作用のさまざまな面を制御します。これらは、テキスト端末上では効果がありません。
visibility
フレームの可視性(visibility)の状態。可能な値は3つあり、nil
は不可視、t
は可視、icon
はアイコン化されていることを意味する。Visibility of Framesを参照のこと。
auto-raise
非nil
なら、Emacsはそのフレーム選択時に自動的にそれを前面に移動(raise)する。これを許さないウィンドウマネージャーがいくつかある。
auto-lower
非nil
なら、Emacsはそのフレームの選択解除時に自動的にそれを背面に移動(lower)する。これを許さないウィンドウマネージャーがいくつかある。
icon-type
そのフレームに使用するアイコンのタイプ。値が文字列の場合、それは使用するビットマップを含むファイルを指定し、nil
はアイコンなしを指定する(何を表示するかはウィンドウマネージャーが決定する)。その他の非nil
値は、デフォルトのEmacsアイコンを指定する。
icon-name
このフレームにたいするアイコンで使用する名前。アイコンを表示する場合は、その際に表示される。これがnil
なら、フレームのタイトルが使用される。
window-id
グラフィカルディスプレイがこのフレームにたいして使用するID番号。Emacsは、フレーム作成時にこのパラメーターを割り当てる。このパラメーターを変更しても、実際のID番号に効果はない。
outer-window-id
そのフレームが存在する最外殻のウィンドウシステムのウィンドウのID番号。window-id
と同様、このパラメーターを変更しても実際の効果はない。
wait-for-wm
非nil
なら、ジオメトリー変更を確認するために、ウィンドウマネージャーを待機するようXtに指示する。Fvwm2およびKDEのバージョンを含むウィンドウマネージャーのいくつかは確認に失敗するので、Xtがハングする。これらウィンドウマネージャーのハングを防ぐために、これをnil
にセットする。
sticky
非nil
なら、仮想デスクトップを伴うシステム上のすべての仮想デスクトップ上で、そのフレームが可視になる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このフレームパラメーター!、カーソルの外見を制御します。
cursor-type
カーソルの表示方法。適正な値は:
box
塗りつぶされた四角形(filled box)を表示する(デフォルト)。
hollow
中抜きの四角形(hollow box)を表示する。
nil
カーソルウィンドウ表示しない。
bar
文字間に垂直バー(vertical bar)を表示する。
(bar . width)
文字間に幅がwidthピクセルの垂直バー(vertical bar)を表示する。
hbar
文字間に水平バー(horizontal bar)を表示する。
(hbar . height)
文字間に高さがheightピクセルの水平バー(horizontal bar)を表示する。
フレームパラメーターcursor-type
は、変数cursor-type
およびcursor-in-non-selected-windows
によりオーバーライドされるかもしれません。
このバッファーローカル変数は、選択されたウィンドウ内で表示されているそのバッファーのカーソルの外見を制御する。この値がt
なら、それはフレームパラメーターcursor-type
で指定されたカーソルのーを使用することを意味する。それ以外では、値は上記リストのカーソルタイプのいずれかであるべきで、これはフレームパラメーターcursor-type
をオーバーライドする。
このバッファーローカル変数は、選択されていないウィンドウ内でのカーソルの外見を制御する。これは、フレームパラメーターcursor-type
と同じ値をサポートする。さらに、nil
は選択されていないウィンドウ内にはカーソルを表示せず、t
は通常のカーソルタイプの標準的な変更(塗りつぶされた四角形は中抜きの四角形に、バーはより細いバーにする)の使用を意味する。
この変数は、カーソルのブリンク(blink: 点滅)方法を指定する。各要素は(on-state
.
off-state)
という形式をもつ。カーソルタイプがon-stateと等しい(equal
を用いて比較)ときは常に、これに対応するoff-stateがブリンクが“off”の際のカーソルの外見を指定する。on-stateとoff-stateはどちらもフレームパラメーターcursor-type
に適した値であること。
それぞれのカーソルタイプのブリンク方法にたいして、そのタイプがここでon-stateとして指定されていなければ、さまざまなデフォルトが存在する。フレームパラメーターcursor-type
で指定した際に限り、この変数内での変更は即座に効果を発揮しない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のフレームパラメーターは、フォントとカラーの使用を制御します。
font-backend
フレーム内でフォントの描画に使用するためのフォントバックエンド(font
backends)を指定する、優先順のシンボルのリスト。Xでは現在のところ、x
(X core font
driver)とxft
(Xft font
driver)の2つの利用可能なフォントバックエンドがある。MS-Windowsでは現在のところ、gdi
とuniscribe
の2つの利用可能なフォントバックエンドがある(Windows
Fonts in The GNU Emacs
Manualを参照)。その他のシステムでは利用可能なフォントバックエンドは1つだけなので、このフレームパラメーターを変更しても意味がない。
background-mode
このパラメーターはdark
かlight
のいずれかで、それぞれバックグラウンドを暗く(dark)するか、明るく(light)するかに対応する。
tty-color-mode
このパラメーターは端末上で使用するカラーモードを指定し、、そのシステムの端末機能データベース(terminal capabilities
database、termcap)により与えられた端末のカラーサポートを、その値でオーバーライドする。値にはシンボルか数値を指定できる。数値の場合は、使用するカラー数(および間接的にはそれぞれのカラーを生成するためのコマンド)を指定する。たとえば(tty-color-mode
. 8)
は、標準的なテキストカラーにたいしてANSIエスケープシーケンスの使用を指定する。値-1はカラーサポートをオフに切り替える。
このパラメーターの値がシンボルの場合、それはtty-color-mode-alist
の値を通じた数値を指定するもので、かわりにそのシンボルに割り当てられた数値が使用される。
screen-gamma
これが数値の場合、Emacsはすべてのカラーの輝度を調整する“ガンマ補正(gamma correction)”を行う。値はディスプレイのスクリーンのガンマであること。
通常のPCモニター/あスクリーンガンマが2.2なので、EmacsおよびXウィンドウのカラー値は一般的にそのガンマ値のモニター上で正しく表示するよう校正されている。screen-gamma
にたいして2.2を指定した場合、それは補正が不必要であることを意味する。その他の値は、通常のモニター上でガンマ値2.2で表示されるであろう、補正されたカラーがスクリーン上に表示されるように意図された補正を要求する。
モニターが表示するカラーが明るすぎる場合は、screen-gamma
に2.2より小さい値を指定するべきである。これは、カラーをより暗くする補正を要求する。スクリーンガンマの値1.5は、LCDカラーディスプレイにたいして、よい結果を与えるだろう。
alpha
このパラメーターは、可変透明度(variable opacity)をサポートするグラフィカルディスプレイ上での、そのフレームの透明度を指定する(訳注:
opacityを訳すと逆の不透明度だが、このような場合は一般的に透明度と訳すようなので、それに倣う)。これは0から100の整数であるべきで、0は完全な透明、100hは完全な不透明を意味する。nil
値をもつこともでき、これはEmacsにフレームのopacityをセットしない(ウィンドウマネージャーに委ねる)よう告げる。
フレームが完全に見えなくなるのを防ぐために、変数frame-alpha-lower-limit
は透明度の最低限度を定義する。フレームパラメーターの値がこの変数の値より小さい場合、Emacsは後者を使用する。デフォルトのframe-alpha-lower-limit
は20。
フレームパラメーターalpha
にはコンスセル(‘active’
.
‘inactive’)
も指定できる。ここで、‘active’は選択時のフレームの透明度、‘inactive’は未選択時の透明度である。
以下は、特定のフェイスの特定のフェイス属性と自動的に等しくなるので、凖時代遅れとなったフレームパラメーターです(Standard Faces in The Emacs Manualを参照)。
font
フレーム内でテキストを表示するためのフォントの名前。これはシステムで有効なフォント名、またはEmacsフォントセット名(Fontsetsを参照)のいずれかであるような文字列である。これは、default
フェイスのfont
属性と等価である。
foreground-color
文字のイメージに使用するカラー。これは、default
フェイスの:foreground
属性と等価である。
background-color
文字のバックグラウンドに使用するカラー。これは、default
フェイスの:background
属性と等価である。
mouse-color
マウスポインターのカラー。これはmouse
フェイスの:background
属性と等価である。
cursor-color
ポイントを表示するカーソルのカラー。これは、cursor
フェイスの:background
属性と等価である。
border-color
これは、フレームのボーダーのカラーと等価である。これは、border
フェイスの:background
属性と等価である。
scroll-bar-foreground
非nil
の場合は、スクロールバーのフォアグラウンドカラー。これは、scroll-bar
フェイスの:foreground
属性と等価である。
scroll-bar-background
非nil
の場合は、スクロールバーのバックグラウンドカラー。これは、scroll-bar
フェイスの:background
属性と等価である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレームパラメーターleft
、top
、height
、width
を使用することにより、フレームのサイズと位置の読み取りや変更ができます。未指定のジオメトリーパラメーターは、それが何であれウィンドウマネージャーの通常の方法により選択されます。
以下はサイズやポジションの特別な機能にたいして動作します(正確には、これらの関数により使用される“選択されたフレーム”にたいして動作するという意味。Input Focusを参照のこと)。
この関数は、frameの左上隅をleft、topにセットする。これらの引数はピクセル単位で、通常はスクリーンの左上隅から測られる。
負のパラメーター値は、スクリーン下端から上方向にウィンドウ下端、またはスクリーン右端から左方向にウィンドウ右端の位置である。この値が常に左上隅から数えるようにして、負の引数ならフレームの一部をスクリーン左上隅の外側に配置するようにしたほうがよいのだろうが、今更これを変更するのは賢明と思えない。
これらの関数は、行または列で測ったframeの高さまたは幅をリターンする。frameを指定しないと選択されたフレームを使用する。
これらの関数は、ピクセルで測ったframeの主要表示領域の高さまたは幅をリターンする。frameを指定しないと選択されたフレームを使用する。テキスト端末では、結果はピクセルではなく文字単位となる。
これらの値には各ウィンドウの内枠ボーダー(internal borders)、スクロールバー、フリンジ(これらはフレーム自体ではなく個別のウィンドウに属す)が含まれる。高さの正確な値は、そのウィンドウシステムと使用するツールキットに依存する。GTK+では、高さにツールバーやメニューバーは含まれない。MotifとLucidのツールキットでは、ツールバーは含まれるが、メニューバーは含まれない。ツールキットなしのグラフィカルなバージョンでは、ツールバーとメニューバーの両方が含まれる。テキスト端末の場合は、結果にメニューバーが含まれる。
これらの関数は、ピクセルで測ったframeの高さまたは幅をリターンする。値は選択されたフォントに依存する。frameを指定しないと選択されたフレームを使用する。
このオプションがnil
なら、フレームのサイズは、通常はそのフレームのframe-char-height
とframe-char-width
のカレント値の倍数に丸められる。非nil
の場合、丸めは行われずフレームのサイズはピクセル単位で増加/減少が可能になる。
これをセットすることにより、次回のリサイズ処理では、ウィンドウマネージャーにこれに相当するサイズのヒントを渡す。これは、ユーザーの初期ファイル内でのみこの変数をセットすべきで、アプリケーションが一時的にこれをバインドすべきではないことを意味する。
このオプションにたいしてnil
値がもつ正確な意味は、使用されるツールキットに依存する。マウスによるフレームボーダーのドラッグは、通常は文字単位で行われる。文字サイズの整数倍ではないフレームサイズを引数としてset-frame-size
(以下参照)を呼び出すと、もしかしたら丸められたり(GTK+)、あるいは受容される(Lucid、Motif、MS-Windows)かもしれない。
いくつかのウィンドウマネージャーでは、フレームを本当に“最大化”あるいは“全画面”で表示させるためには、これを非nil
にセットする必要があるかもしれない。
この関数は、文字単位でframeのサイズをセットする。widthは列数で新たな幅を指定し、heightは行数で新たな高さを指定する。
オプション引数pixelwiseが非nil
の場合は、かわりにピクセル単位で新たな幅と高さを測ることを意味する。frame-resize-pixelwise
がnil
の場合、それが文字の整数倍でフレームサイズを増加あるいは減少させないなら、この要求を完全には尊重せずに拒絶するツールキットがいくつかあることに注意されたい。
この関数は、frameを高さheight行にリサイズする。frame内の既存ウィンドウのサイズは、フレームにフィットするよう比例して変更される。
pretendが非nil
の場合、Emacsはframe内でheight行の出力を表示するが、そのフレームの実際の高さにたいする値は変更しない。これはテキスト端末上でのみ有用である。端末が実際に実装するより小さい高さの使用は、より小さいスクリーン上での振る舞いの再現したり、スクリーン全体を使用時の端末の誤動作を観察するとき有用かもしれない。フレームの高さを“実際”のようにセットするのは、常に機能するとは限らない。なぜなら、テキスト端末上でのカーソルを正しく配置するために、正確な実サイズを知る必要があるかもしれないからである。
オプションの第4引数pixelwiseが非nil
なら、それはframeの高さがheightピクセル高くなることを意味する。frame-resize-pixelwise
がnil
の場合、それが文字の整数倍でフレームサイズを増加あるいは減少させないなら、この要求を完全には尊重せずに拒絶するツールキットがいくつかあることに注意されたい。
この関数は、文字単位でframeの幅をセットする。引数pretendは、set-frame-height
のときと同じ意味をもつ。
オプションの第4引数pixelwiseが非nil
なら、それはframeの幅がheightピクセル広くなることを意味する。frame-resize-pixelwise
がnil
の場合、それが文字の整数倍でフレームサイズを増加あるいは減少させないなら、この要求を完全には尊重せずに拒絶するツールキットがいくつかあることに注意されたい。
ウィンドウ1つだけを表示するフレームの場合は、コマンドfit-frame-to-buffer
を使用してそのフレームをウィンドウのバッファーにフィットさせることができます。
このコマンドは、frame内のバッファーのコンテンツを正確に表示するために、frameのサイズを調整する。frameには任意の生きたフレームを指定でき、デフォルトは選択されたフレームである。この調整は、frameのルートウィンドウが生きている場合のみ行われる。引数max-height、min-height、max-width、min-widthはframeのルートウィンドウの新たなトータルサイズの境界を指定する。min-heightとmin-widthのデフォルトは、window-min-height
およびwindow-min-width
である。
オプション引数onlyがvertically
の場合、この関数はフレームを垂直方向にたいしてだけリサイズするだろう。onlyがhorizontally
なら、水平方向だけにリサイズする。
fit-frame-to-buffer
の挙動は、以下にリストに挙げた2つのオプションにより制御できます。
このオプションは、fit-frame-to-buffer
によりフィットされるフレーム周囲のマージンを指定する。このようなマージンは、たとえばフレームがタスクバーとオーバーラップするのを防ぐのに有用かもしれない。
これは、フィットされるフレームの上下左右にフリーのまま残すピクセル数を指定する。デフォルトはnil
で、これは上下左右にマージンを使用しないことを意味する。ここで指定した値は、フレームのfit-frame-to-buffer-margins
パラメーターが与えられていれば、それにオーバーライドされるかもしれない。
このオプションは、fit-frame-to-buffer
にたいしてサイズの境界を指定する。これは、自身のバッファーにフィットされるすべてのフレームのルートウィンドウの最小/最大の行数および最小/最大の列数のトータルを指定する。これらの値のいずれかが非nil
なら、fit-frame-to-buffer
の相当する引数をオーバーライドする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、Xスタイルのウィンドウジオメトリー指定によるアクションのデータを調べる方法です:
関数x-parse-geometry
は、標準的なXウィンドウのジオメトリー文字列を、make-frame
の引数の一部として使用できるalistに変換する。
このalistはgeom内で指定されたパラメーターと、そのパラメーターに指定された値を記述する。各要素は(parameter
.
value)
のような形式である。可能なparameterの値はleft
、top
、width
、height
である。
サイズのパラメーターの値は整数でなければならない。位置のパラメーターleft
およびtop
の名前に関しては、かわりに右端または下端の位置を示す値もいくつかあるので、完全に正確ではない。位置パラメーターにたいして可能なvalueは前述(Position Parametersを参照)したような整数、リスト(+ pos)
、リスト(- pos)
である。
以下は例である:
(x-parse-geometry "35x70+0-0") ⇒ ((height . 70) (width . 35) (top - 0) (left . 0))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
端末はそれぞれ、関連するパラメーターのリストをもっています。これら端末パラメーター(terminal parameters)は主に、端末ローカル変数を格納するための便利な手段ですが、いくつかの端末パラメーターは特別な意味をもっています。
このセクションでは、端末のパラメーター値の読み取りや変更を行う関数を説明します。これらはすべて引数として端末かフレームいずれかを受け入れます。フレームの場合、それはそのフレームの端末の使用を意味します。引数nil
は、選択されたフレームの端末という意味です。
この関数は、terminalnのすべてのパラメーターとその値をリストするalistをリターンする。
この関数は、terminalのパラメーターparameter(シンボル)の値をリターンする。terminalがparameterにたいするセッティングをもたない場合、この関数はnil
をリターンする。
この関数は、terminalのパラメーターparmに指定されたvalueをセットして、そのパラメーターの以前の値をリターンする。
以下は、特別な意味をもついくつかの端末パラメーターのリストです:
background-mode
端末のバックグラウンドカラーの区分で、light
かdark
のいずれか。
normal-erase-is-backspace
値は1か0で、これはその端末上でnormal-erase-is-backspace-mode
がオンまたはオフのいずれに切り替えられたかに依存する。DEL
Does Not Delete in The Emacs Manualを参照のこと。
terminal-initted
端末の初期化後に、端末固有の初期化関数にセットされる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
それぞれのフレームにはname
というパラメーターがあります。これは、ウィンドウシステムが通常フレーム上端に表示するフレームタイトルにたいする、デフォルトとしての役割をもちます。フレームプロパティname
をセットすることにより、明示的に名前を指定できます。
通常は名前を明示的に指定せず、Emacsが変数frame-title-format
に格納されたテンプレートにもとづき、自動的にフレーム名を計算します。Emacsはフレームが再表示されるたびに、毎回名前を再計算します。
この変数は、フレーム名が明示的に指定されないときに、フレーム名を計算する方法を指定する。この変数の値は、実際にはmode-line-format
のようなモードライン構成(mode
line construct)だが、‘%c’および‘%l’の構成は無視される。The Data Structure of the Mode Lineを参照のこと。
この変数は、フレームタイトルを明示的に指定しないときの、アイコン化されたフレームの名前の計算方法を指定する。このタイトルはアイコン自体に表示される。
この変数はEmacsにより自動的にセットされる。フレームが2つ以上(ミニバッファーのみのフレームと不可視のフレームは勘定に入らない)のとき、値はt
となる。frame-title-format
のデフォルト値は、フレームが複数存在する場合のみ、フレーム名にバッファー名を入れるために、multiple-frames
を使用する。
この変数の値は、frame-title-format
とicon-title-format
の処理中を除き、正確である保証はない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
生きたフレーム(live frame)とは、削除されていないフレームのことです。フレームが削除される際は、たとえそれへの参照元がなくなるまでLispオブジェクトとして存在し続けるとしても、端末ディスプレイからは削除されます。
この関数は、フレームframeを削除する。frameがツールチップでなければ、まずフックdelete-frame-functions
を実行する(フックの各関数は唯一の引数としてframeを受け取る)。デフォルトでは、frameは選択されたフレームである。
ミニバッファーが別のフレームに使用されているフレームは削除できない。通常、他のフレームすべてが不可視の場合、フレームは削除できないが、forceが非nil
なら、削除が可能になる。
関数frame-live-p
は、フレームframeが削除されていなければ、非nil
をリターンする。リターンされ得る非nil
の値は、framep
と同様である。Framesを参照のこと。
いくつかのウィンドウマネージャーは、ウィンドウを削除するコマンドを提供します。これらは、そのウィンドウを操作するプログラムに特別なメッセージを送ることにより機能します。Emacsがそれらメッセージのいずれかを受け取ったときは、delete-frame
イベントを生成します。このイベントの通常の定義は、関数delete-frame
を呼び出すコマンドです。Miscellaneous System Eventsを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この関数は、すべての生きたフレーム(削除されていないフレーム)のリストをリターンする。これはバッファーにたいするbuffer-list
に類似しており、すべての端末上のフレームが含まれる。リターンされるリストは新たに作成されたものであり、このリストを変更してもEmacs内部への影響はない。
この関数はカレントで可視なフレームだけのリストをリターンする。See section Visibility of Framesを参照のこと。テキスト端末上のフレームは、実際に表示されるのが選択されたフレームだけだとしても、常に“可視”であるとみなされる。
この関数は、カレントディスプレイ上そすべてのフレームを、任意のフレームを開始点としいぇ巡回するのに便利である。これは、そのその巡回サイクル上でframeの“次”に該当するフレームをリターンする。frameが省略またはnil
の場合のデフォルトは、選択されたフレーム(Input Focusを参照)である。
2つ目の引数minibufは、どのフレームを考慮するかを示す:
nil
ミニバッファーのみのフレームを除外。
visible
すべての可視フレームを考慮する。
すべての可視およびアイコン化されたフレームを考慮する。
特定のウィンドウをミニバッファーとして使用するフレームだけを考慮する。
すべてのフレームを考慮する。
next-frame
と同様だが、すべてのフレームを逆方向に巡回する。
Cyclic Ordering of Windowsのnext-window
とprevious-window
も参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
通常は、それぞれのフレームは下端に自身のミニバッファーウィンドウをもち、そのフレームが選択された際は常にそれを使用します。フレームにミニバッファーがある場合は、minibuffer-window
でそれを取得できます(Definition of minibuffer-windowを参照)。
しかし、ミニバッファーのないフレームの作成も可能です。そのようなフレームは、別のフレームのミニバッファーウィンドウを使用しなければなりません。フレーム作成時に、(別フレーム上にある)使用するミニバッファーを明示的に指定できます。これを行わない場合は、変数default-minibuffer-frame
の値のフレーム内でミニバッファーを探します。この値は、ミニバッファーをもつフレームにしてください。
ミニバッファーのみのフレームを使用する場合は、ミニバッファーにエンター時にそのフレームを前面に移動(raise)したいと思うかもしれません。その場合は、変数minibuffer-auto-raise
にt
をセットします。Raising and Lowering Framesを参照してください。
この変数は、デフォルトでミニバッファーウィンドウとして使用するフレームを指定する。これは、既存のフレームには影響しない。これはカレント端末にたいして常にローカルで、バッファーローカルにはできない。Multiple Terminalsを参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
どんなときでも、Emacs内のただ1つのフレームが選択されたフレーム(selected frame)です。選択されたウィンドウは、常に選択されたフレーム上にあります。
Emacsがフレームを複数端末(Multiple Terminalsを参照)上に表示する際、各端末は自身の選択されたフレームをもちます。しかし、それらのうち1つだけが、“いわゆる選択されたフレーム”であり、それはもっとも最近に入力があった端末に属すフレームです。つまり、特定の端末からのコマンドをEmacsが実行する際は、その端末上の1つが選択されたフレームです。Emacsが実行するコマンドは常に1つだけなので、選択されたフレームは常に1つだけだと考える必要があります。このフレームこそ、このマニュアルで選択されたフレームと呼ぶフレームです。選択されたフレームを表示するディスプレイは、選択されたフレームのディスプレイ(selected frame’s display)です。
この関数は選択されたフレームをリターンする。
いくつかのウィンドウシステムおよびウィンドウマネージャーは、マウスがあるウィンドウオブジェクトにキーボード入力をダイレクトします。それ以外は、さまざまなウィンドウオブジェクトにフォーカスをシフト(shift
the
focus)するために、明示的なクリックやコマンドを要求します。どちらの方法でも、Emacsはフォーカスをもつフレームを自動的に追跡します。Lisp関数から別フレームに明示的に切り替えるためには、select-frame-set-input-focus
を呼び出します。
関数select-frame
を呼び出すことにより、Lispプログラムが“一時的”にフレームを切り替えることもできます。これは、そのウィンドウシステムのフォーカス概念を変更はしません。変更ではなく、何らかの方法により制御が再確認(reasserted)されるまで、ウィンドウマネージャーの制御から抜け出す(escape)のです。
テキスト端末使用時は、その端末上で一度に表示できるフレームは1つだけなので、select-frame
呼び出し後、次回の再表示で新たに選択されたフレームが実際に表示されます。このフレームは、次のselect-frame
呼び出しまで、選択されたままです。テキスト端末上の各フレームは、バッファー名の前に表示される番号をもちます(Variables Used in the Mode Lineを参照)。
この関数は、frameを選択、(他のフレームのせいで不明瞭な場合には)それを前面に移動(raise)して、Xサーバーのフォーカス授与を試みる。テキスト端末上では、次回再表示時に端末スクリーン全体に新たにフレームが表示される。オプション引数norecordは、select-frame
(下記参照)のときと同じ意味をもつ。この関数のリターン値に意味はない。
この関数は、フレームframeを選択し、Xサーバーのフォーカスがあればそれを一時的に無視する。frameにたいする選択は、次回ユーザーが別フレームに何かを行うか、この関数の次回呼び出しまで継続する(ウィンドウシステムを使用する場合は、以前に選択されていたフレームに依然としてウィンドウシステムの入力フォーカスがあるかもしれないので、コマンドループからリターン後に、そのフレームが選択されたフレームとしてリストアされるかもしれない)。
指定されたframeは選択されたフレームとなり、その端末が選択された端末になる。その後、この関数はframe内で選択されていたウィンドウを第1引数、norecordを第2引数でサブルーチンとしてselect-window
を呼び出す(したがって、norecordが非nil
なら、もっとも最近に選択されたウィンドウおよびバッファーリストの変更を避ける)。Selecting Windowsを参照のこと。
この関数はframe、またはframeが削除されていればnil
をリターンする。
一般的には、実行後に端末を戻すよう切り替えることなく、別の端末に切り替えるのが可能な手段としてselect-frame
を決して使用すべきではない。
Emacsは、サーバーおよびウィンドウマネージャーのリクエストとしてフレーム選択をアレンジすることにより、ウィンドウシステムと協調します。これは、適切なときにフォーカス(focus)と呼ばれる特殊な入力イベントを生成することにより行われます。コマンドループは、handle-switch-frame
を呼び出してフォーカスイベントを処理します。Focus Eventsを参照してください。
この関数は、フレームframe選択によりフォーカスイベントを処理する。
フォーカスイベントは通常、このコマンドを呼び出すことにより、その処理を行う。他の理由でこれを呼び出しではならない。
この関数は、frameからfocus-frameにフォーカスをリダイレクトする。これは、frameにかわってfocus-frameが以降のキーストロークとイベントを受け取るであろうことを意味する。そのようなイベント後は、last-event-frame
の値はfocus-frameになるだろう。また、frameを指定したswitch-frameイベントも、かわりに
focus-frameを選択するだろう。
focus-frameが省略またはnil
の場合は、frameにたいするすべての既存のリダイレクションがキャンセルされ、したがってframeが自身のイベントを再度受け取ることになる。
フォーカスリダイレクトの用途の1つは、ミニバッファーをもたないフレームにたいしてである。これらのフレームは、別フレーム上のミニバッファーを使用する。別フレーム上のミニバッファーをアクティブにすることは、そのフレームにフォーカスをリダイレクトすることである。これは、たとえマウスがミニバッファーをアクティブにしたフレーム内に留まっていても、ミニバッファーが属すフレームにフォーカスを置く。
フレーム選択は、フォーカスリダイレクションの変更も可能にする。foo
が選択されているときにフレームbar
を選択することにより、foo
を指すすべてのリダイレクションは、かわりにbar
を指す。これは、ユーザーがselect-window
を使用してあるフレームから別のフレームに切り替えた際に、フォーカスのリダイレクトが正しく機能することを可能にする。
これは、フォーカスが自身にリダイレクトされたフレームが、フォーカスがリダイレクトされていないフレームとは異なう扱いを受けることを意味する。前者にたいしてselect-frame
は影響するが、後者には影響がない。
このリダイレクションは、それを変更するためにredirect-frame-focus
が呼び出されるまで継続する。
これは、Emacsフレームが入力フォーカスを得た際に実行されるノーマルフックである。
これは、Emacsフレームが入力フォーカスを失った際に実行されるノーマルフックである。
これは、ユーザーがマウスを移動した際に、ウィンドウマネージャーがフォーカスを転送するかどうかをEmacsに告げるためのオプションである。非nil
なら、フォーカスは転送される。その場合、コマンドother-frame
は新たに選択されたフレームと一貫性のある位置にマウスを移動する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
グラフィカルなディスプレイ上のフレームは可視(visible)、不可視(invisible)、またはアイコン化(iconified)されているかもしれません。可視なら、そのコンテンツは通常の方法により表示されます。アイコン化されている場合、そのコンテンツは表示されませんが、ビュー内にフレームを戻すための小さいアイコンがどこかにあります(いくつかのウィンドウマネージャーは、この状態をアイコン化ではなく最小化と呼ぶが、Emacsの見地ではこれらは同等である)。フレームが不可視なら、それはまったく表示されません。
テキスト端末では、いつでも実際に表示されるのはただ1つの選択されたフレームだけなので、可視性に意味はありません。
この関数は、フレームframeの可視性の状態をリターンする。値は、frameが可視ならt
、不可視ならnil
、アイコン化されている場合はicon
になる。
テキスト端末上では、たとえ1つのフレームだけが表示されているとしても、この関数の目的にたいしては、すべてのフレームが“可視”とみなされる。Raising and Lowering Framesを参照のこと。
この関数は、フレームframeをアイコン化する。frameを省略した場合は、選択されたフレームをアイコン化する。
この関数は、フレームframeを可視にする。frameを省略した場合は、選択されたフレームを可視にする。これはフレームを前面に移動しないが、望むならraise-frame
でそれを行うことができる(Raising and Lowering Framesを参照)。
この関数は、フレームframeを不可視にする。frameを省略した場合は、選択されたフレームを不可視にする。
forceがnil
なら、この関数は他のすべてのフレームが不可視の場合は、frameを不可視にするのを拒絶する。
フレームの可視性の状態は、フレームパラメーターとしても利用可能である。つまりフレームパラメーターとして読み取りと変更ができる。Window Management Parametersを参照のこと。ウィンドウマネージャーによりユーザーがフレームのアイコン化や非アイコン化を行うこともできる。これは、Emacsが何らかの制御を及ぼすのが可能なレベルより下のレベルにおいて発生するが、Emacsはそのような変化を追跡するために使用するイベントを提供する。Miscellaneous System Eventsを参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ほとんどのウィンドウシステムは、デスクトップというメタファー(metaphor:
比喩的概念)を使用します。このメタファーの一部は、システムレベルのウィンドウ(Emacsではフレーム)が、スクリーン表面に向かって、概念的3次元の垂直方向に積まれていくというアイデアです。2つが重なる箇所では、より高い一方が、より低い一方を覆い隠します。関数raise-frame
およびlower-frame
を使用して、フレームを前面に移動(raise:
より高い位置へ上げる)したり背面に移動(lower: より低い位置へ移動)したりすることができます。
この関数は、フレームframe(デフォルトは選択されたフレーム)を前面に移動する。frameが不可視もしくはアイコン化されている場合は、それを可視にする。
この関数は、フレームframe(デフォルトは選択されたフレーム)を背面に移動する。
これが非nil
なら、ミニバッファーをアクティブにすることにより、ミニバッファーウィンドウのあるフレームが前面に移動される。
ウィンドウシステム上では、フレームパラメーターを使用して、(フレーム選択時に)auto-raising、(フレーム選択解除時に)auto-loweringを有効にできます。Window Management Parametersを参照してください。
フレームを前面または背面に移動するという概念は、テキスト端末のフレームにも適用できます。各テキスト端末上で、一度に表示されるのは、常に最前面のフレームだけです。
この関数は、terminal上の最前面のフレームをリターンする。terminalは端末オブジェクト、フレーム(そのフレームの端末を意味する)、またはnil
(選択されたフレームの端末を意味する)であること。これがテキスト端末を参照しなければ、リターン値はnil
となる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレーム構成(frame configuration)はフレームのカレント配置、すべてのプロパティ、および各ウィンドウのウィンドウ構成(Window Configurationsを参照)を記録します。
この関数は、フレームのカレント配置およびそのコンテンツを記述するフレーム構成のリストをリターンする。
この関数は、フレームの状態をconfigurationの記述にリストアする。しかし、この関数は削除されたフレームはリストアしない。
通常、この関数はconfiguration内にリストされない既存フレームすべてを削除する。しかしnodeleteが非nil
なら、希望しないそれらフレームはかわりにアイコン化される。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マウスをトラック(track: 追跡)するのが有用なことが時折あります。マウスのトラックとは、マウスの位置を示す何かを表示して、マウス移動とともにそのインジケーターを移動する、という意味です。効果的にマウスをトラックするためには、マウスが実際に移動するまで待機する手段が必要になります。
マウスをトラックする便利なのは、マウスのモーション(motion: 移動)を表すイベントを問い合わせる方法です。その後は、そのイベントを待機することにより、モーションを待機できます。加えて、発生し得る他の類のイベントも、簡単に処理できます。ボタンのリリースのような何か他のイベントだけを待機してマウスを永久にトラックするは通常は望ましくないので、これは有用です。
このスペシャルフォームは、マウスモーションイベントの生成を有効にして、bodyを実行する。通常、bodyはモーションイベントを読み取るためにread-event
を使用し、それに対応して表示を変更する。マウスモーションイベントのフォーマットについては、Motion Eventsを参照のこと。
track-mouse
の値は、body内の最後のフォームの値である。ボタンのリリースを示すup-event、またはトラックを止めるべきタイミングを意味する類のイベントを確認した際にはリターンするよう、bodyをデザインするべきである。
マウスモーションをトラックする通常の目的は、それ以降に発生するボタンのプッシュやリリースをカレント位置に示すことです。
多くの場合は、テキストプロパティmouse-face
(Properties with Special Meaningsを参照)を使用することにより、マウスをトラックする必要性を回避できます。これは、より低レベルで機能し、かつLispレベルのマウストラッキングよりスムーズに実行されます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数mouse-position
およびset-mouse-position
は、マウスのカレント位置にたいするアクセスを提供します。
この関数は、マウス位置の記述をリターンする。値は(frame x
. y)
のような形式で、xとyはframe内部の左上隅から相対的な位置を文字単位で与える整数である。
非nil
なら、この変数の値はmouse-position
にたいして呼び出される関数である。mouse-position
はリターン直前には、自身の通常のリターン値を唯一の引数としてこの関数を呼び出し、それが何であれその関数がリターンしたものをリターンする。
このアブノーマルフックは、xt-mouse.elのようにLispレベルでマウス処理を行う必要があるパッケージのために存在する。
この関数は、フレームframe内の位置x、yにマウスをワープさせる。引数xとyは、frame内部の左上隅から相対的な位置を文字単位で与える整数である。frameが不可視なら、この関数は何も行わない。リターン値に意味はない。
この関数はmouse-position
と似ているが、文字単位ではなくピクセル単位の座標をリターンする。
この関数はset-mouse-position
のようにマウスをワープするが、xとyが文字単位ではなくピクセル単位であることを除く。これらの座標が、そのフレーム内にあることは要求されない。
frameが不可視なら、この関数は何も行わない。リターン値に意味はない。
この述語関数は、frame上に表示されたマウスポインターが可視なら非nil
、それ以外はnil
をリターンする。frameが省略またはnil
なら、それは選択されたフレームを意味する。これは、make-pointer-invisible
がt
にセットされているとき有用である。これにより、ポインターが隠されていることを知ることができる。Mouse
Avoidance in The Emacs Manualを参照のこと。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lispプログラムはポップアップメニューを表示できるので、ユーザーはマウスで候補を選択できます。テキスト端末上では、マウスが利用不可なら、キーボードのモーションキーC-n、C-p、上矢印キー、下矢印キーで候補を選択できます。
この関数は、ポップアップメニューを表示して、ユーザーが何を選択したかの指標をリターンする。
引数positionは、メニュー左上隅をスクリーン上どこに置くか指定する。これはマウスボタンイベント(ユーザーがボタンを操作した位置にメニューを置くよう告げる)、または以下の形式のリストのいずれかである:
((xoffset yoffset) window)
ここで、xoffsetとyoffsetはwindow左上隅からピクセル単位で測られた座標である。windowはウィンドウ、またはフレームかもしれない。
positionがt
の場合、それはマウスのカレント位置の使用を意味する(テキスト端末上でマウスが利用不可ならフレーム左上隅)。positionがnil
なら、それは実際にメニューをポップアップせずに、menu内で指定されたキーマップと等価なキーバインディングを事前に計算することを意味する。
引数menuは、メニュー内で何を表示するかを告げる。これはキーマップまたはキーマップのリストを指定できる(Menu Keymapsを参照)。この場合、リターン値はユーザー選択に対応するイベントのリストである。選択がサブメニュー内で発生した場合、このリストには複数の要素がある(x-popup-menu
はそのイベントシーケンスにバインドされたコマンドを実際には実行しないことに注意)。テキスト端末、およびメニュータイトルをサポートするツールキットでは、menuがキーマップならタイトルはmenuのプロンプト文字列、menuがキーマップのリストなら最初のキーマップのプロンプト文字列から取得される(Defining Menusを参照)。
かわりに、menuは以下の形式をもつこともできる:
(title pane1 pane2...)
ここで、それぞれのpaneは以下の形式のリストである
(title item1 item2...)
それぞれitemは、コンスセル(line
.
value)
であること。ここでlineは文字列、valueはlineが選択された場合にリターンされる値である。メニューキーマップと異なり、nil
のvalueは選択不可のメニューアイテムを作成しない。かわりに、それぞれのitemにコンスセルではなく文字列を指定できる。これは選択不可のメニューアイテムを作成する。
たとえば有効な選択からマウスを外してクリックしたり、C-gをタイプすることにより、有効な選択を行うことなくユーザーがメニューを取り除いた場合は、通常はquitしてx-popup-menu
はリターンしない。しかし、positionがマウスボタンイベント(ユーザーがマウスでメニューを呼び出したことを示す)なら、quitは起こらずx-popup-menu
はリターンする。
使用上の注意:
メニューキーマップで定義したプレフィクスキー処理を行えるなら、メニューの表示にx-popup-menu
を使用しないでください。メニューの実装にメニューキーマップを使用する場合は、C-h
cおよびC-h
aでメニュー内の個別アイテムの確認、およびそれらにたいするヘルプを提供できます。かわりにx-popup-menu
を呼び出すコマンドを定義することによりメニューを実装した場合、ヘルプ機能はそのコマンド内部で何が起こっているか知ることができず、そのメニューアイテムのヘルプを何も与えられません。
マウス移動によりサブメニュー間を切り替えるメニューバーのメカニズムは、それがx-popup-menu
を呼び出すか確認するために、コマンドの定義を見ることができません。したがって、x-popup-menu
を使用してサブメニューの実装を試みた場合、それは統合された方式でメニューバーとともに機能しません。メニューバーのすべてのサブメニューは、親メニューのメニューキーマップにより実装され、決してx-popup-menu
で実装されないのは、これが理由です。The Menu Barを参照してください。
メニューバーのサブメニューのコンテンツを変化させたい場合にも、その実装には依然としてメニューキーマップを使用するべきです。コンテンツを変化させるためには、必要に応じてメニューキーマップのコンテンツを更新するために、フック関数をmenu-bar-update-hook
に追加してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ダイアログボックスとはポップアップメニューの一種です。外見は多少異なり、常にフレーム中央に表示され、階層を1つしかもたず1つ以上のボタンがあります。ユーザーが“yes”、“no”、および別の少数の候補で応答ができる質問を尋ねるのが、ダイアログボックスの主な用途です。単一のボタンでは、ユーザーに重要な情報の確認を強いることもできます。関数y-or-n-p
およびyes-or-no-p
は、マウスのクリックにより呼び出されたコマンドから呼び出された際は、キーボードのかわりにダイアログボックスを使用します。
この関数は、ポップアップダイアログボックスを表示して、ユーザーが何を選択したかの指標をリターンする。引数contentsは、提供するための候補を指定する。これは、以下のフォーマットをもつ:
(title (string . value)…)
これは、x-popup-menu
にたいして単一paneを指定するリストのように見える。
リターン値は、選択された候補のvalueである。
x-popup-menu
の場合と同様、このリストの要素はコンスセル(string
. value)
のかわりに、単なる文字列かもしれない。これは、選択不可のボックスを作成する。
このリスト内にnil
がある場合、それは左手側と右手側のアイテムを分ける。つまり、nil
より前のアイテムは左、nil
より後のアイテムは右に表示される。リスト内にnil
を含めない場合は、およそ半数づつが両サイドに表示される。
ダイアログボックスは、常にフレームの中央に表示される。引数positionは、どのフレームかを指定する。可能な値はx-popup-menu
の場合と同様だが、正確な座標や個別のウィンドウは問題ではなく、フレームだけが問題となる。
headerが非nil
ならボックスのフレームタイトルは‘Information’、それ以外は‘Question’になる。前者はmessage-box
(see message-boxを参照)にたいして使用される(テキスト端末上ではボックスタイトルは表示されない)。
いくつかの構成では、Emacsは本当のダイアログボックスを表示できないので、かわりにフレーム中央のポップアップメニュー内に同じアイテムを表示する。
たとえばウィンドウマネージャーを使用して、有効な選択を行うことなくユーザーがダイアログボックスを取り除いた場合は、通常はquitしてx-popup-dialog
はリターンしない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
テキストプロパティpointer
や、イメージならイメージプロパティ:pointer
および:map
を使用して、特定のテキストやイメージにたいしてマウスポインターのスタイルを指定できます。これらのプロパティに使用できる値はtext
(またはnil
)、arrow
、hand
、vdrag
、hdrag
、modeline
、hourglass
です。text
は、テキスト上で使用される、通常のマウスポインタースタイルを意味します。
ウィンドウの空部分(void parts:
バッファーコンテンツのどの部分にも対応しない部分)の上では、マウスポインターは通常arrow
スタイルを使用しますが、void-text-area-pointer
をセットすることにより、異なるスタイルを指定できます。
この変数は、空テキストエリアにたいするマウスポインタースタイルを指定する。このエリアには、行末の後や、バッファー終端行の下が含まれる。デフォルトでは、arrow
(non-text)ポインタースタイルを使用。
Xを使用する際は、変数x-pointer-shape
をセットすることにより、text
の本当の外見を指定できます。
この変数は、Emacsフレーム内でtext
ポインタースタイルに通常使用するポインターシェイプを指定する。
この変数は、マウスがマウスセンシティブテキスト上にあるときのポインターシェイプを指定する。
これらの変数は、新たに作成されるフレームに影響します。通常これらは既存のフレームに効果はありませんが、フレームのマウスカラーのインストール時には、これら2つ変数のカレント値もインストールされます。Font and Color Parametersを参照してください。
これらのポインターシェイプのいずれかを指定するために使用可能な値は、ファイルlisp/term/x-win.el内で定義されています。それらのリストを確認するには、M-x apropos RET x-pointer RETを使用してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Xウィンドウシステムでは、異なるアプリケーション間のデータ転送は、選択(selections)により行われます。Xは任意の数の選択タイプ(selection types)を定義し、それぞれが独自にデータを格納できます。しかし、一般的に使用されるのはクリップボード(clipboard)、プライマリー選択(primary selection)、セカンダリー選択(secondary selection)の3つだけです。これら3つの選択を使用するEmacsコマンドについては、Cut and Paste in The GNU Emacs Manualを参照してください。このセクションでは、X選択の読み取りとセットを行う、低レベル関数について説明します。
この関数は、X選択をセットする。これは、選択タイプtypeと、それに割り当てる値dataの、2つの引数をとる。
typeはシンボルであること。通常はPRIMARY
、SECONDARY
、CLIPBOARD
のいずれかである。これらは、Xウィンドウシステムの慣例に対応する大文字のシンボル名である。typeがnil
なら、それはPRIMARY
を意味する。
dataがnil
なら、それはその選択をクリアーすることを意味する。それ以外では、dataは文字列、シンボル、整数(2つの整数からなるコンスかリスト)、オーバーレイ、同じバッファーを指す2つのマーカーのコンスを指定できる。オーバーレイとマーカーのペアは、そのオーバーレイまたはマーカー間のテキストを意味する。引数dataには、非ベクターの選択の値のベクターも指定できる。
この関数はdataをリターンする。
この関数は、Emacsおよび別のXクライアントによりセットアップされた選択にアクセスする。これはtypeとdata-typeの、2つの引数をとる。typeは選択のタイプで、デフォルトはPRIMARY
。
data-type引数は、別のXクライアントから取得したrawデータをLispデータに変換するための、データ変換に使用する形式を指定する。意味のある値にはTEXT
、STRING
、UTF8_STRING
、TARGETS
、LENGTH
、DELETE
、FILE_NAME
、CHARACTER_POSITION
、NAME
、LINE_NUMBER
、COLUMN_NUMBER
、OWNER_OS
、HOST_NAME
、USER
、CLASS
、ATOM
、INTEGER
が含まれる(これらは、対応するX慣習の大文字シンボル名である)。data-typeのデフォルトはSTRING
。
この変数は、選択やクリップボードに読み書きする際のコーディングシステムを指定する。Coding Systemsを参照してください。デフォルトはcompound-text-with-extensions
で、これはX11が通常使用するテキスト表現に変換する。
EmacsがMS-Windows上で実行されている際は、一般的にX選択はサポートしませんが、クリップボードはサポートします。MS-Windowsでは、x-get-selection
およびx-set-selection
は、テキストデータタイプだけをサポートします。クリップボードが他のタイプのデータを保持している場合、Emacsはクリップボードを空として扱います。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ユーザーが別のアプリケーションからEmacsに何かをドラッグをした際、その別アプリケーションはEmacsがドラッグされたデータを処理可能か告げることを期待します。変数x-dnd-test-function
は、何を応答するか決定するために、Emacsにより使用されます。デフォルト値はx-dnd-default-test-function
で、これはドロップされたデータのタイプがx-dnd-known-types
内にあれば、ドロップを受け入れます。何か別の条件にもとづいてEmacsにドロップを許容または拒絶させたい場合は、x-dnd-test-function
および/またはx-dnd-known-types
をカスタマイズできます。
Emacsが異なるタイプのドロップを処理する方法を変更したり、新たなタイプを追加したい場合は、x-dnd-types-alist
をカスタマイズします。これには、他のアプリケーションがドラッグアンドドロップに使用するのが何のタイプなのか、詳細な知識が要求されます。
EmacsにURLがドロップされたとき、それはファイルかもしれませんが、他のURLタイプ(ftp、http、...)であるかもしれません。Emacsはまず、そのURLに何を行うべきか判断するために、dnd-protocol-alist
をチェックします。それにマッチがなく、かつbrowse-url-browser-function
がalistなら、Emacsはそこでマッチを探します。それでもマッチが見つからなければ、そのURLにたいするテキストを挿入します。これらの変数をカスタマイズすれば、Emacsの挙動を変更できます。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
カラー名(color name)とは、カラーを指定するテキスト(通常は文字列)です。‘black’、‘white’、‘red’等が指定できます。定義された名前のリストは、M-x list-colors-displayを使用して確認できます。‘#rgb’や‘RGB:r/g/b’のような、数値的な形式でカラーを指定することもできます。ここで、rは赤(red)、gは緑(green)、bは青(blue)のレベルを指定します。1桁、2桁、3桁、または4桁の16進数をrに使用できます。その後、gとbには同じ桁数の16進数を同様に使用しなければなりません。これにより、総桁数が3、6、9、または12桁の16進数となります(カラーの数値的なRGB指定についての詳細は、Xウィンドウシステムのドキュメントを参照されたい)。
以下の関数は、有効なカラー名と、それらの外見を判断する手段を提供します。以下で説明するように、その値は選択されたフレーム(selected frame)に依存する場合があります。“選択されたフレーム”という用語の意味については、Input Focusを参照してください。
補完付きでカラー名のユーザー入力を読み取るには、read-color
を使用します(read-colorを参照)。
この関数は、カラー名が有意かどうかを報告する。もし有意ならt
、それ以外はnil
をリターンする。引数frameは、どのフレームのディスプレイにたいして問い合わせるかを指定する。frameが省略またはnil
の場合は、選択されたフレームが使用される。
これは、使用しているディスプレイがそのカラーをサポートするかどうかは告げないことに注意。X使用時には、すべての種類のディスプレイ上のすべての定義されたカラーを問い合わせることができ、何らかの結果(通常は可能な限り近いカラー)を得ることができるでしょう。あるフレームが特定のカラーを実際に表示できるかどうか判断するためには、color-supported-p
(以下参照)を使用してください。
この関数は、以前はx-color-defined-p
と呼ばれており、その名前は今でもエイリアスとしてサポートされている。
この関数は、frame(デフォルトは選択されたフレーム)上で定義かつサポートされるカラー名のリストをリターンする。frameがカラーをサポートしなければ、値はnil
となる。
この関数は、以前はx-defined-colors
と呼ばれており、その名前は今でもエイリアスとしてサポートされている。
これは、frameが実際にカラーcolor(または最低でもそれに近いカラー)を表示可能ならt
をリターンする。frameが省略またはnil
なら、この問いは選択されたフレームに適用される。
フォアグラウンドおよびバックグラウンドにたいして異なるカラーセットをサポートする端末がいくつかある。background-pが非nil
の場合、それはcolorがバックグラウンドとして、それ以外はフォアグラウンドとして使用可能かどうかを問うことを意味する。
引数colorは、有効なカラー名でなければならない。
これは、colorがframeのディスプレイ上の定義として、グレイスケールならt
をリターンする。frameが省略またはnil
なら、この問いは選択されたフレームに適用される。colorが有効なカラー名でなければ、この関数はnil
をリターンする。
この関数は、frame上で理想的にはcolorがどのように見えるべきかを記述する値をリターンする。colorが定義済みの場合、値は赤、緑、青の割合を与える3つの整数からなるリストである。それぞれの整数の範囲は原則として0から65535だが、この範囲全体を使用しないディスプレイもいくつか存在するだろう。この3要素のリストは、カラーのRGB値(rgb values)と呼ばれる。
colorが未定義なら、値はnil
である。
(color-values "black") ⇒ (0 0 0) (color-values "white") ⇒ (65280 65280 65280) (color-values "red") ⇒ (65280 0 0) (color-values "pink") ⇒ (65280 49152 51968) (color-values "hungry") ⇒ nil
カラーの値は、frameのディスプレイにたいしてリターンされる。frameが省略またはnil
の場合、この情報は選択されたフレームのディスプレイにたいしてリターンされる。このフレームがカラーを表示できない場合、値はnil
となる。
この関数は、以前はx-color-values
と呼ばれており、その名前は今でもエイリアスとしてサポートされている。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
通常、テキスト端末は少しのカラーしかサポートせず、コンピューターはカラー選択に小さい整数を使用します。これは、選択したカラーがどのように見えるかコンピューターが信頼性をもって告げることができず、どのカラーがどのような小さい整数に対応するかという情報を、をアプリケーションに伝える必要があることを意味します。しかし、Emacsは標準的なカラーセットを知っており、それらの自動的な使用を試みるでしょう。
このセクションで説明する関数は、Emacsが端末カラーを使用する方法を制御します。
これらの関数のうちのいくつかは、Color Namesで説明したRGB値(rgb values)を使用またはリターンします。
これらの関数は、オプション引数としてディスプレイ(フレームまたは端末名のいずれか)を受け取ります。わたしたちは将来、異なる端末上で異なるカラーをEmacsにサポートさせたいと望んでいます。そうすれば、この引数はどの端末を処理するか(デフォルトは選択されたフレームの端末。Input Focusを参照のこと)を指定するようになるでしょう。しかし現在のところ、frame引数に効果はありません。
この関数は、カラー名nameを、その端末上のカラー値numberに関連付ける。
オプション引数rgbが指定された場合、それはそのカラーが実際にどのように見えるかを指定する、3つの数値のリストからなるRGB値である。rgbを指定しない場合、Emacsはそれがどのように見えるか知らないので、そのカラーを他のカラーに近似するためにtty-color-approximate
で使用することができない。
この関数は、テキスト端末の定義済みカラーのテーブルをクリアーする。
この関数は、テキスト端末がサポートする既知のカラーを記録したalistをリターンする。
それぞれの要素は、(name number . rgb)
または(name
number)
という形式をもつ。ここで、nameはカラー名、numberはその端末でカラー指定に使用される数値である。rgbが与えられた場合、それはそのカラーが実際にどのように見えるかを告げる3つのカラー値(赤、緑、青)のリストである。
この関数は、displayにたいしてサポートされた既知のカラーの中から、RGB値rgb(カラー値のリスト)で記述されたもっとも近いカラーを探す。リターン値は、tty-color-alist
の要素である。
この関数は、displayにたいしてサポートされた既知のカラーの中から、もっとも近いカラーのインデックス(整数)をリターンする。名前colorが未定義なら、値はnil
となる。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、Xリソース、または他のオペレーティングシステム上での等価物を問い合わせたり使用する関数および変数をいくつか説明します。Xリソースにたいする詳細な情報は、X Resources in The GNU Emacs Manualを参照してください。
関数x-get-resource
は、Xウィンドウのデフォルトデータベースからリソース値を取得する。
リソースは、キー(key)とクラス(class)の組み合わせによりインデックス付けされている。この関数は、‘instance.attribute’という形式をキー(instanceはEmacsが呼び出されたときの名前)、クラスとして‘Emacs.class’として使用することにより検索を行う。
オプション引数componentおよびsubclassは、それぞれキーおよびクラスを追加する。指定する場合は両方を指定するか、さもなくばどちらも指定してはならない。これらを指定した場合、キーは‘instance.component.attribute’、クラスは‘Emacs.class.subclass’となる。
この変数は、x-get-resource
が照会すべきアプリケーション名を指定する。デフォルト値は"Emacs"
。x-get-resource
の呼び出し周辺で、この変数を“Emacs”以外の文字列にバインドすることにより、アプリケーション名にたいしてXリソースを調べることができる。
この変数は、x-get-resource
が照会すべきインスタンス名を指定する。デフォルト値はEmacs呼び出し時の名前、またはスイッチ‘-name’または‘-rn’で指定された値である。
上述のいくつかを説明するために、Xリソースファイル(通常は~/.Xdefaultsや~/.Xresources)内に以下のような行があるとしましょう:
xterm.vt100.background: yellow
その場合は:
(let ((x-resource-class "XTerm") (x-resource-name "xterm")) (x-get-resource "vt100.background" "VT100.Background")) ⇒ "yellow"
(let ((x-resource-class "XTerm") (x-resource-name "xterm")) (x-get-resource "background" "VT100" "vt100" "Background")) ⇒ "yellow"
この変数が非nil
なら、EmacsはXリソースを照会せず、新たなフレーム作成時にXリソースは何も効果をもたない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションの関数は、特定のディスプレイの基本的な能力を説明します。Lispプログラムは、そのディスプレイが行えることに挙動を合わせるために、それらを使用できます。たとえば、ポップアップメニューがサポートされなければ、通常はポップアップメニューを使用するプログラムは、ミニバッファーを使用できます。
これらの関数のオプション引数displayは、問い合わせるディスプレイを指定します。これにはディスプレイ名、フレーム(フレームがあるディスプレイを指定)、またはnil
(選択されたフレームのディスプレイを参照する。Input Focusを参照されたい)を指定できます。
ディスプレイに関する情報を取得するその他の関数については、Color Namesを参照してください。
この関数は、display上でポップアップメニューがサポートされていればt
、それ以外はnil
をリターンする。Emacsディスプレイのある部分をマウスでクリックすることによりメニューがポップアップするので、ポップアップメニューのサポートにはマウスが利用可能であることが要求される。
この関数は、displayが一度に複フレームおよび複数の異なるフォントを表示する能力を有すグラフィックディスプレイならt
をリターンする。これは、Xのようなウィンドウシステムのディスプレイにたいしては真、テキスト端末にたいしては偽となる。
この関数は、displayでマウスが利用可能ならt
、それ以外はnil
をリターンする。
この関数は、そのスクリーンがカラースクリーンならt
をリターンする。これは以前はx-display-color-p
と呼ばれており、その名前はエイリアスとして今でもサポートされる。
この関数は、スクリーンがグレースケールを表示可能ならt
をリターンする(カラーディスプレイはすべてこれを行うことができる)。
この関数は、attributes内のすべてのフェイス属性がサポートされていれば非nil
をリターンする(Face Attributesを参照)。
幾分発見的ではあるが、‘サポートされる’という言葉は、基本的にはあるフェイスがattributes内のすべての属性を含み、ディスプレイにたいしてデフォルトフェイスにマージ時に、
方法で表現可能なことを意味する。2つ目のポイントは、属性:weight
black
は太字(bold)表示可能な、同様に属性:foreground
"yellow"
は黄色がかった何らかのカラーを表示可能なすべてのディスプレイで満たされるだろうが、属性:slant
italic
は斜体(italic)を自動的に‘淡色(dim)’に置き換えるttyの表示コードでは満たされないであろうことを暗に示している。
この関数は、displayが選択(selections)をサポートすればt
をリターンする。ウィンドウ化されたディスプレイでは、通常は選択がサポートされるが、他の場合にもサポートされ得る。
この関数は、displayがイメージを表示可能ならt
をリターンする。ウィンドウ化されたディスプレイは原則イメージを処理するが、イメージにたいするサポートを欠くシステムもいくつかある。イメージをサポートしないディスプレイ上では、Emacsはツールバーを表示できない。
この関数は、そのディスプレイに割り当てられたスクリーンの数をリターンする。
この関数は、スクリーンの高さをピクセルでリターンする。文字端末では、文字数で高さを与える。
“マルチモニター”にセットアップされているグラフィカル端末では、displayに割り当てられたすべての物理モニターのピクセル幅を参照することに注意。Multiple Terminalsを参照のこと。
この関数は、スクリーンの幅をピクセルでリターンする。文字端末では、文字数で幅を与える。
“マルチモニター”にセットアップされているグラフィカル端末では、displayに割り当てられたすべての物理モニターのピクセル幅を参照することに注意。Multiple Terminalsを参照のこと。
この関数は、スクリーンの高さをミリメートルでリターンする。nil
なら、Emacsがその情報を取得できなかったことを意味する。
“マルチモニター”にセットアップされているグラフィカル端末では、displayに割り当てられたすべての物理モニターのピクセル幅を参照することに注意。Multiple Terminalsを参照のこと。
この関数は、スクリーンの幅をミリメートルでリターンする。nil
なら、Emacsがその情報を取得できなかったことを意味する。
“マルチモニター”にセットアップされているグラフィカル端末では、displayに割り当てられたすべての物理モニターのピクセル幅を参照することに注意。Multiple Terminalsを参照のこと。
この変数は、システムの提供する値が不正な場合にdisplay-mm-height
およびdisplay-mm-width
がリターンするグラフィカルなディスプレイのサイズを、ユーザーが指定できるようにする。
この関数は、そのディスプレイのバッキングストアー(backing store)の能力をリターンする。バッキングストアーとは、非露出ウィンドウ(およびウィンドウの一部)のピクセルを記録しておいて、露出時に素早く表示できるようにすることを意味する。
値にはシンボルalways
、when-mapped
、not-useful
である。特定の種類のディスプレイにたいしてこの問いが適用外の際、この関数はnil
をリターンすることもある。
この関数は、そのディスプレイがSaveUnder機能をサポートすれば非nil
をリターンする。この機能は、ポップアップウィンドウに隠されるピクセルを保存して、素早くポップダウンができるようにするために使用される。
この関数は、そのディスプレイがサポートする平面数(number of planes)をリターンする。これは通常、ピクセルごとのビット(bits per pixel: 色深度[bpp])数である。ttyディスプレイでは、サポートされるカラー数の2進対数(log to base two)である。
この関数は、そのスクリーンのビジュアルクラスをリターンする。値はシンボルstatic-gray
(カラー数変更不可の限定されたグレイ)、gray-scale
(フルレンジのグレイ)、static-color
(カラー数変更不可の限定されたカラー)、pseudo-color
(限定されたカラー数のカラー)、true-color
(フルレンジのカラー)、およびdirect-color
(フルレンジのカラー)のいずれかである。
この関数は、そのスクリーンがサポートするカラーのセル数をリターンする。
以下の関数は、Emacsが指定されたdisplayを表示する場所に使用されるウィンドウシステムの追加情報を取得します(関数名先頭のx-
は歴史的理由による)。
この関数は、GNUおよびUnixシステム上のXサーバーのような、display上で実行されているGUIウィンドウシステムのバージョン番号のリストをリターンする。値は3つの整数からなるリストで、1つ目と2つ目の整数はそのプロトコルのメジャーバージョン番号とマイナーバージョン番号、3つ目の整数はウィンドウシステムソフトウェア自体のディストリビューター固有のリリース番号である。GNUおよびUnixシステムでは、通常これらはXプロトコルのバージョン番号と、Xサーバーソフトウェアのディストリビューター固有のリリース番号である。MS-Windowsでは、WidowsのOSバージョン番号である。
この関数は、ウィンドウシステムソフトウェアを提供する“ベンダー”をリターン(文字列)する。GNUおよびUnixシステムでは、それが誰であれそのXサーバーを配布するベンダーを意味する。MS-Windowsでは、Widows OSのベンダーID文字列(Microsoft)である。
X開発者がソフトウェア配布者を“vendors”とラベル付けしたことは、いかなるシステムも非商業的に開発および配布できないと彼らが誤って仮定したことを示している。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
位置(position)とは、バッファーのテキストの文字のインデックスです。より正確には、位置とは2つの文字間(または最初の文字の前、または最後の文字の後)の箇所を識別し、与えられた位置の前あるいは後の文字のように表現することができます。しかし、“ある位置にある文字”のように表現することもあり、その場合はその位置の後の文字を意味します。
位置は通常、1から始まる整数として表されますが、マーカー(markers)として表現することもできます。関数は引数に位置(整数)を期待しますが、代替としてマーカーも受け入れ、通常はそのマーカーが指すのがどのバッファーなのかは無視します。これらの関数はマーカーを整数に変換して、たとえそのマーカーが“誤った”バッファーを指していたとしても、まるで引数としてその整数が渡されたかのように、その整数を使用します。整数に変換できない場所を指すマーカーを整数のかわりに使用すると、エラーとなります。Markersを参照してください。
多くのカーソルモーションコマンドにより使用される関数を提供する“フィールド(field)”機能(Defining and Using Fields)も参照してください。
29.1 Point | 編集タスクが行われる特別な位置。 | |
29.2 Motion | ポイントの変更。 | |
29.3 Excursions | 一時的な移動とバッファーの変更。 | |
29.4 Narrowing | バッファーの一部に編集を限定する。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ポイント(point)とは、多くの編集コマンドにより使用される、バッファーの特別な位置のことです。これらのコマンドには、自己挿入型のタイプ文字やテキスト挿入関数が含まれます。その他のコマンドは、別の箇所でテキストの編集や挿入ができるようにポイントを移動します。
他の位置と同様、ポイントは特定の文字ではなく、2つの文字の間(または最初の文字の前、または最後の文字の後)を指します。通常、端末ではポイント直後の文字の上にカーソルを表示します。つまり、ポイントは実際はカーソルのある文字の前にあります。
ポイントの値は1より小さくなることはなく、そのバッファーのサイズに1を加えた値より大きくなることはありません。ナローイング(Narrowingを参照)が効力をもつ場合、ポイントはそのバッファーのアクセス可能な範囲内(範囲の境界はバッファーの先頭か終端のいずれかの可能性がある)に閉じ込められます。
バッファーはそれぞれ自身のポイント値をもち、それは他のバッファーのポイント値とは無関係です。ウィンドウもそれぞれポイント値をもち、他のウィンドウ内の同じバッファー上のポイント値とは無関係です。同じバッファーを表示する種々のウィンドウが異なるポイント値をもてるのは、これが理由です。あるバッファーがただ1つのウィンドウに表示されているときは、そのバッファーのポイントとそのウィンドウのポイントは、通常は同じ値をもち、区別が重要になるのは稀です。詳細はWindows and Pointを参照してください。
この関数は、カレントバッファー内のポイントの値を、整数でリターンする。
(point) ⇒ 175
この関数は、カレントバッファー内のアクセス可能なポイントの最小値をリターンする。これは通常は1だが、ナローイングが効力をもつ場合は、ナローイングしたリージョンの開始位置となる(Narrowingを参照)。
この関数は、カレントバッファー内のアクセス可能なポイントの最大値をリターンする。これはナローイングされていなければは(1+
(buffer-size))
だが、ナローイングが効力をもつ場合は、ナローイングしたリージョンの終端位置となる(Narrowingを参照)。
この関数は、flagが0より大なら(point-max)
、それ以外は(point-min)
をリターンする。引数flagは数値でなければならない。
この関数は、カレントバッファー内の文字数のトータルをリターンする。ナローイング(Narrowingを参照)されていなければ、point-max
はこれに1を加えた値をリターンする。
bufferにバッファーを指定した場合、値はbufferのサイズになる。
(buffer-size) ⇒ 35
(point-max) ⇒ 36
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
モーション関数は、ポイントのカレント値、バッファーの先頭または終端、または選択されたウィンドウ端のいずれかより、相対的にポイントの値を変更します。Pointを参照してください。
29.2.1 Motion by Characters | 文字単位での移動。 | |
29.2.2 Motion by Words | 単語単位での移動。 | |
29.2.3 Motion to an End of the Buffer | バッファー先頭または終端への移動。 | |
29.2.4 Motion by Text Lines | テキスト行単位での移動。 | |
29.2.5 Motion by Screen Lines | 表示される行単位での移動。 | |
29.2.6 Moving over Balanced Expressions | リストやS式の解析による移動。 | |
29.2.7 Skipping Characters | 特定の集合に属す文字のスキップ。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数は、文字数にもとづいてポイントを移動します。 goto-char
は基本的なプリミティブで、その他の関数はこれを使用しています。
この関数は、カレントバッファー内のポイントの値をpositionにセットする。
ナローイングが効力をもつ場合でも、positionは依然としてバッファー先頭から数えられるが、ポイントをアクセス可能な範囲外に移動することはできない。positionが範囲外の場合、goto-char
はアクセス可能な範囲の先頭または終端にポイントを移動する。
この関数がインタラクティブに呼び出された際は、positionの値は数プレフィクス引数、プレフィクス引数が与えられなかった場合はミニバッファーから値を読み取る。
goto-char
はpositionをリターンする。
この関数は前方、すなわちバッファーの終端方向にポイントをcount文字移動する(countが負なら後方、すなわちバッファーの先頭方向にポイントを移動する)。countがnil
の場合のデフォルトは1。
バッファー(ナローイングが効力をもつ場合はアクセス可能な範囲の境界)の先頭または終端を超えて移動を試みた場合はエラーシンボルbeginning-of-buffer
またはend-of-buffer
のエラーをシグナルする。
インタラクティブな呼び出しでは、数プレフィクス引数がcountとなる。
移動方向が逆であることを除き、これはforward-char
と同様である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の関数は、与えられた文字が単語の一部なのかどうかを判断するための構文テーブルを使用して単語を解析します。Syntax Tablesを参照してください。
この関数は、countの単語数分ポイントを前方に移動する。(countが負なら後方に移動する)。countが省略またはnil
の場合のデフォルトは1。
“単語1つ移動”とは、単語構成文字を横断して、単語区切り文字に遭遇するまでポイントを移動することを意味する。しかし、この関数はバッファーのアクセス可能範囲の境界およびフィールド境界(Defining and Using Fieldsを参照)を超えてポイントを移動できない。フィールド境界のもっとも一般的な例は、ミニバッファー内のプロンプト終端である。
バッファー境界またはフィールド境界により途中で停止することなく単語count個分の移動が可能なら、値はt
となる。それ以外ではリターン値はnil
で、ポイントはバッファー境界またはフィールド境界で停止する。
inhibit-field-text-motion
が非nil
なら、この関数はフィールド境界を無視する。
インタラクティブに呼び出された場合、countは数プレフィクス引数により指定される。
この関数は、単語の前に遭遇するまで、前方ではなく後方に移動することを除き、forward-word
と同様である。
この変数は、forward-word
とそれを使用するすべての関数の挙動に影響する。これが非nil
なら、構文クラス“エスケープ(escape)”および“クォート文字(character
quote)”内の文字は、単語の一部とみなされる。それ以外では、単語の一部とはみなされない。
この変数が非nil
ならforward-word
、forward-sentence
、forward-paragraph
を含む特定のモーション関数は、フィールド境界を無視する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーの先頭にポイントを移動するには、以下のように記述します:
(goto-char (point-min))
同様に、バッファーの終端に移動するには、以下を使用します:
(goto-char (point-max))
以下の2つは、ユーザーがこれらを行うためのコマンドです。これらはマークをセットしてメッセージをエコーエリアに表示するため、Lispプログラム内で使用しないよう警告するために、ここに記述します。
この関数は、バッファー(ナローイングが効力をもつ場合はアクセス可能範囲の境界)の先頭にポイントを移動して、以前の位置にマークをセットする(Transient Markモードの場合、マークがすでにアクティブならマークはセットしない)。
nが非nil
なら、バッファーのアクセス可能範囲の先頭から10分のnの位置にポイントを置く。インタラクティブな呼び出しでは、nは数プレフィクス引数が与えられればその値、それ以外でのデフォルトはnil
である。
警告: この関数をLispプログラム内で使用してはならない。
この関数は、バッファー(ナローイングが効力をもつ場合はアクセス可能範囲の境界)の終端にポイントを移動して、以前の位置にマークをセットする(Transient
Markモードの場合、マークがすでにアクティブならマークはセットしない)。nが非nil
なら、バッファーのアクセス可能範囲の終端から10分のnの位置にポイントを置く。
インタラクティブな呼び出しでは、nは数プレフィクス引数が与えられればその値、それ以外でのデフォルトはnil
である。<
警告: この関数をLispプログラム内で使用してはならない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
テキスト行とは、改行で区切られたバッファーの範囲です。改行は前の行の一部とみなされます。最初のテキスト行はバッファー先頭で始まり、最後のテキスト行は最後の文字が改行かどうかは関係なくバッファー終端で終わります。バッファーからテキスト行への分割は、そのウィンドウの幅、表示の行継続、タブおよびその他の制御文字の表示方法に影響されません。
この関数は、カレント行の先頭にポイントを移動する。引数countが非nil
または1以外なら、前方にcount-1行移動してから、その行の先頭に移動する。
この関数は、別の行に移動する場合を除き、フィールド境界(Defining and Using Fieldsを参照)を超えてポイントを移動しない。したがって、countがnil
または1で、かつポイントがフィールド境界で開始される場合は、ポイントを移動しない。フィールド境界を無視させるには、inhibit-field-text-motion
をt
にバインドするか、かわりにforward-line
関数を使用する。たとえば、フィールド境界を無視することを除けば、(forward-line
0)
は(beginning-of-line)
と同じことを行う。
この関数がバッファー(ナローイングが効力をもつ場合はアクセス可能範囲)の終端に到達した場合は、ポイントをその位置に置く。エラーはシグナルされない。
(beginning-of-line count)
が移動するであろう位置をリターンする。
この関数は、カレント行の終端にポイントを移動する。引数countが非nil
または1以外なら、前方にcount-1行移動してから、その行の終端に移動する。
この関数は、別の行に移動する場合を除き、フィールド境界(Defining and Using Fieldsを参照)を超えてポイントを移動しない。したがって、countがnil
または1で、かつポイントがフィールド境界で開始される場合は、ポイントを移動しない。フィールド境界を無視させるには、inhibit-field-text-motion
をt
にバインドする。
この関数がバッファー(ナローイングが効力をもつ場合はアクセス可能範囲)の終端に到達した場合は、ポイントをその位置に置く。エラーはシグナルされない。
(end-of-line count)
が移動するであろう位置をリターンする。
この関数は、前方にcount行移動して、その行の先頭にポイントを移動する。countが負なら、後方に-count行移動して、その行の先頭にポイントを移動する。countが0の場合は、カレント行の先頭にポイントを移動する。countがnil
なら、それは1を意味する。
forward-line
が指定された行数を移動する前にバッファー(またはアクセス可能範囲)の先頭か終端に遭遇した場合は、そこにポイントをセットする。エラーはシグナルされない。
forward-line
は、countと実際に移動した行数の差をリターンする。3行しかないバッファーの先頭から、5行したへの移動を試みた場合、ポイントは最終行の終端で停止し、値は2となるだろう。
インタラクティブな呼び出しでは、数プレフィクス引数がcountとなる。
この関数は、カレントバッファー内の位置startとendの間の行数をリターンする。startとendが等しければ、リターン値は0になる。それ以外は、たとえstartとendが同一行にあっても、最小でも1をリターンする。これらの間にあるテキストは、それだけを孤立して考えたると、それが空でない限りは最小でも1行を含まなければならないからである。
この関数は、カレントバッファー内の位置startとendの間にある単語の数をリターンする。
この関数は、インタラクティブに呼び出すこともできる。その場合はバッファー、またはリージョンがアクティブならリージョン内の行数、単語数、文字数を報告するメッセージをプリントする。
この関数は、カレントバッファー内のバッファー位置posに対応する行番号をリターンする。posがnil
または省略された場合は、カレントのバッファー位置が使用される。
Examining Text Near Pointの関数bolp
とeolp
も参照してください。これらの関数はポイントを移動しませんが、ポイントがすでに行頭または行末にあるかどうかをテストします。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
前のセクションの行関数は、改行文字で区切られたテキスト行だけを数えました。対照的に、以下の関数はスクリーン行を数えます。スクリーン行は、スクリーン上でテキストが表示される方法にしたがって定義されます。あるテキスト行1行が、選択されたウィンドウの幅にフィット可能な程に十分短ければ、それはスクリーン行で1行になりますが、それ以外は複数のスクリーン行になり得ます。
テキスト行が追加スクリーン行に継続されずに、そのスクリーンで切り詰められる(truncated)場合があります。そのような場合は、vertical-motion
でforward-line
のようにポイントを移動します。Truncationを参照してください。
文字列が与えられた場合、その幅は、文字の外見を制御するフラグに依存するため、与えられたテキスト断片にたいして、たとえそれが選択されたウィンドウ上でさえも(幅、切り詰め有無、ディスプレイテーブルはウィンドウごとに異なり得るので)、そのテキストがあるバッファーに応じて、vertical-motion
の挙動は異なります。Usual Display Conventionsを参照してください。
以下の関数は、スクリーン行のブレーク位置を判断するためにテキストをスキャンするため、スキャンする長さに比例して時間を要します。
この関数は、ポイントのあるスクリーン行からスクリーン行でcount行下に移動して、そのスクリーン行の先頭にポイントを移動する。countが負なら、かわりに上に移動する。
count引数には、整数のかわりにコンスセル(cols
. lines)
を指定できる。その場合、関数はスクリーン行でlines行移動して、そのスクリーン行の視覚的な行頭(visual
start)からcols列目にポイントを置く。colsは、その行の視覚的(visual)な開始から数えられることに注意。そのウィンドウが水平スクロール(Horizontal Scrollingを参照)されている場合には、ポイントが置かれる列は、スクロールされたテキストの列数が加えられるだろう。
リターン値は、ポイントが移動したスクリーン行の行数である。バッファーの先頭か終端に到達していたら、この値は絶対値ではcountより小になるかもしれない。
ウィンドウwindow引数幅、水平スクロール、ディスプレイテーブルのようなパラメーターの取得に使用される。しかしvertical-motion
は、たとえwindowがカレントで他のバッファーを表示していたとしても常に、カレントバッファーにたいして処理を行う。
この関数は、begからendのテキスト内のスクリーン行の行数をリターンする。スクリーン行数は行継続やディスプレイテーブル等により、実際の行数とは異なるかもしれない。begおよびendがnil
、または省略された場合のデフォルトは、そのバッファーのアクセス可能範囲の先頭と終端である。
そのリージョンが改行で終わる場合、オプションの第3引数count-final-newlineがnil
なら、それは無視される。
オプションの第4引数windowは、幅や水平スクロール等のパラメーターを取得するウィンドウを指定する。デフォルトは、選択されたウィンドウのパラメーターを使用する。
vertical-motion
と同様、count-screen-lines
はwindow内にどのバッファーが表示されていようと、常にカレントバッファーを使用する。これにより、バッファーが何らかのウィンドウにカレントで表示されているか否かにかかわらず、任意にバッファーにたいしてcount-screen-lines
の使用が可能になる。
この関数は、選択されたウィンドウ内にカレントで表示されているテキストに応じてポイントを移動する。これは、ウィンドウ上端からスクリーン行でcount行目の先頭にポイントを移動する。countが負なら、それはバッファー下端(バッファーが指定されたスクリーン位置の上で終わる場合はバッファーの最終行)から、-count行目の位置を指定する。
countがnil
の場合、ポイントはウィンドウ中央の行の先頭に移動する。countの絶対値がウィンドウサイズより大なら、ウィンドウが十分に高かったならそのスクリーン行は表示されていたであろう位置に、ポイントを移動する。これは、おそらく次回の再表示の際に、その箇所がスクリーン上になるようなスクロールを発生させるだろう。
インタラクティブな呼び出しでは、数プレフィクス引数がcountとなる。
リターン値は、ウィンドウ上端行を0とする、ポイントが移動した先の行番号である。
この関数は、カレントバッファーをスキャンして、スクリーン位置を計算する。これは位置fromがスクリーン座標fromposにあると仮定して、そこから位置toまたは座標toposのいずれか先に到達したほうまで、バッファーを前方にスキャンする。これはスキャン終了のバッファー位置と、スクリーン座標をリターンする。
座標引数fromposおよびtoposは、(hpos
. vpos)
という形式のコンスセルである。
引数widthは、テキストを表示するために利用可能な列数である。これは、継続行の処理に影響する。nil
は、そのウィンドウ内で使用可能な実際のテキスト列数で、(window-width
window)
がリターンする値と等しい。
引数offsetsはnil
、または(hscroll
.
tab-offset)
という形式のコンスセルのいずれかである。ここでhscrollは、左マージンのために表示されない列数であり、呼び出し側のほとんどはwindow-hscroll
を呼び出すことにより、これを取得する。一方tab-offsetは、スクリーン上の列数と、バッファー内の列数の間のオフセットである。これは継続行において、前のスクリーン行の幅がtab-width
の整数倍でないときは、非0になる可能性がある。非継続行では、これは常に0である。
ウィンドウwindowの役割は、使用するディスプレイテーブルの指定することだけである。compute-motion
は、window内に表示されているのがどのバッファーであろうと、カレントバッファーを処理する。
リターン値は、5つの要素をもつリストである:
(pos hpos vpos prevhpos contin)
ここで、posはスキャンが停止したバッファー位置、vposは垂直スクリーン位置、hposは水平スクリーン位置である。
結果prevhposは、posから1文字戻った水平位置である。結果continは、最後の行が前の文字の後(または中)から継続されていれば、t
となる。
たとえば、あるウィンドウのスクリーン行lineの列colのバッファー位置を求めるには、そのウィンドウのdisplay-start(表示開始)位置をfrom、そのウィンドウの左上隅の座標をfromposとして渡す。スキャンをそのバッファーのアクセス可能範囲の終端に制限するために、バッファーの(point-max)
をtoに、lineとcolをtoposに渡す。以下は、これを行う関数である:
(defun coordinates-of-position (col line) (car (compute-motion (window-start) '(0 . 0) (point-max) (cons col line) (window-width) (cons (window-hscroll) 0) (selected-window))))
ミニバッファーにたいしてcompute-motion
を使う際は、最初のスクリーン行の先頭の水平位置を取得するために、minibuffer-prompt-width
を使用する必要がある。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下は、バランスの取れたカッコ式(balanced-parenthesis。これらの式を横断して移動することと関連して、Emacsではsexp(S式)とも呼ばれる)と関連する、いくつかの関数です。これらの関数がさまざまな文字を処理する方法は、構文テーブル(syntax table)が制御します。Syntax Tablesを参照してください。sexp、またはその一部にたいする低レベルのプリミティブについては、Parsing Expressionsを参照してください。ユーザーレベルのコマンドについては、Commands for Editing with Parentheses in The GNU Emacs Manualを参照してください。
この関数は、バランスの取れたカッコのグループを、arg(デフォルトは1)グループ前方に移動する(単語やクォート文字のペアーでクォートされた文字列は無視される)。
この関数は、バランスの取れたカッコのグループを、arg(デフォルトは1)グループ後方に移動する(単語やクォート文字のペアーでクォートされた文字列は無視される)。
この関数は、カッコをarg(デフォルトは1)レベル外側前方に移動する。負の引数では後方に移動するが、同様に浅いレベルに移動する。
この関数は、カッコをarg(デフォルトは1)レベル内側前方に移動する。負の引数では後方に移動するが、同様に深いレベル(-argレベル)に移動する。
この関数は、バランスの取れた式(balanced expressions)を、arg(デフォルトは1)前方に移動する。バランスの取れた式にはカッコ等で区切られた式、および単語や文字列定数のようなものも含まれる。Parsing Expressionsを参照のこと。たとえば、
---------- Buffer: foo ---------- (concat∗ "foo " (car x) y z) ---------- Buffer: foo ----------
(forward-sexp 3) ⇒ nil ---------- Buffer: foo ---------- (concat "foo " (car x) y∗ z) ---------- Buffer: foo ----------
この関数は、バランスの取れた式(balanced expressions)を、arg(デフォルトは1)後方に移動する。
この関数は、後方にarg番目のdefunの先頭に移動する。argが負なら、実際には前方に移動するが、defunの終端ではなく先頭に移動することは変わらない。argのデフォルトは1。
この関数は、前方にarg番目のdefunの終端に移動する。argが負なら、実際には後方に移動するが、defunの先頭ではなく終端に移動することは変わらない。argのデフォルトは1。
非nil
なら、このバッファーローカル変数はdefunの始まりとなる開きカッコの前に出現し得るテキストを指定する正規表現を保持する。つまりd、この正規表現にたいするマッチで始まり、その後に開きカッコ構文(open-parenthesis
syntax)が続くのがdefunである。
この変数の値が非nil
なら、列0にある開きカッコはdefunの始まりとみなされる。nil
の場合、列0の開きカッコは特別な意味をもたない。デフォルトはt
。
非nil
なら、この変数はdefunの開始を見つける関数を保持する。関数beginning-of-defun
は、通常の手法を使うかわりに、その関数に自身のオプション引数を渡して、その関数を呼び出す。その引数が非nil
なら、その関数はその回数分の関数呼び出しにより、beginning-of-defun
が行うように後方に移動すること。
非nil
なら、この変数はdefunの終端を見つける関数を保持する。関数end-of-defun
は、通常の手法を使うかわりに、その関数を呼び出す。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下の2つの関数は、指定された文字セットを超えてポイントを移動します。これらの関数は、たとえば空白文字をスキップするためによく使用されます。関連する関数については、Motion and Syntaxを参照してください。
これらの関数は検索関数(Searching and Matchingを参照)が行うように、そのバッファーがマルチバイト(multibyte)ならマルチバイトに、ユニバイト(unibyte)ならユニバイトに、そのセットト文字列を変換します。
この関数は、与えられた文字セットをスキップして、カレントバッファー内のポイント前方に移動する。これはポイントの後の文字を調べて、その文字がcharacter-setにマッチすればポイントを進める。そして、マッチしない文字に到達するまで、これを継続する。この関数は、超えて移動した文字数をリターンする。
引数character-setが、正規表現での‘[…]’内部と同様だが、‘]’で終端されず、‘\’が‘^’、‘-’、‘\’をクォートする点が異なる。つまり、"a-zA-Z"
はすべての英字をスキップして最初の非英字の前で停止し、"^a-zA-Z"
はすべての非英字をスキップして最初の英字の前で停止する。Regular Expressionsを参照のこと。"[:alnum:]"
のような文字クラスも使用できる。see section Character Classesを参照されたい。
limit(数字かマーカー)が与えられた場合、それはポイントがスキップして到達できる、そのバッファー内の最大位置を指定する。ポイントはlimit、またはlimitの前でストップするだろう。
以下の例では、ポイントは最初‘T’の直前に置かれている。フォーム評価後、ポイントはその行の末尾(‘hat’の‘t’と改行の間)に置かれる。この関数は、すべての英字とスペースをスキップするが、改行はスキップしない。
---------- Buffer: foo ---------- I read "∗The cat in the hat comes back" twice. ---------- Buffer: foo ----------
(skip-chars-forward "a-zA-Z ") ⇒ 18 ---------- Buffer: foo ---------- I read "The cat in the hat∗ comes back" twice. ---------- Buffer: foo ----------
この関数は、limitに至るまでcharacter-setにマッチする文字をスキップして、ポイントを後方に移動する。これはskip-chars-forward
と同様だが、ポイントを移動する方向が異なる。
リターン値は、移動した距離を示す。これは、0以上の整数である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラム中の限定された部分で、ポイントを“一時的”に移動するのが便利なことが時折あります。これはエクスカーション(excursion:
遠足、小旅行)と呼ばれ、スペシャルフォームsave-excursion
により行います。この構成は、初期のカレントバッファー自体、ポイントおよびマークの値を記憶して、そのエクスカーション完了時にそれらをリストアします。これはプログラムのある部分において、プログラムの他の部分に影響を与えることなくポイントを移動する標準的な手段であり、EmacsのLispソース内では何度も使用されています。
カレントバッファー自体のみの保存およびリストアが必要な場合は、かわりにsave-current-buffer
やwith-current-buffer
を使用してください(The Current Bufferを参照)。ウィンドウ構成の保存やリストアが必要なら、Window ConfigurationsおよびFrame Configurationsで説明されているフォームを参照してください。
このスペシャルフォームは、カレントバッファー自体、およびポイント値とマーク値を保存してbodyを評価し、最後にバッファーおよび保存したポイントとマークの値をリストアする。throw
またはエラーを通じたアブノーマルexit(Nonlocal Exitsを参照)の場合でも、保存された3つすべての値はリストアされる。
save-excursion
がリターンする値はbody内の最後のフォームの結果、またはbodyフォームが与えられなければnil
をリターンする。
save-excursion
は、エクスカーション開始時にカレントだったバッファーのポイントとマークだけを保存ため、そのエクスカーション中に変更された他のバッファーのポイントおよび/またはマークは、その後も効果が残るでしょう。これはしばしば予期せぬ結果を招くので、エクスカーション中にset-buffer
を呼び出した場合、バイトコンパイラーは警告を発します:
Warning: Use `with-current-buffer' rather than save-excursion+set-buffer
このような問題を避けるには、以下の例のように望むカレントバッファーをセット後にのみsave-excursion
を呼び出すべきです:
(defun append-string-to-buffer (string buffer) "BUFFER末尾にSTRINGを追加" (with-current-buffer buffer (save-excursion (goto-char (point-max)) (insert string))))
同じように、save-excursion
はswitch-to-buffer
のような関数が変更したウィンドウ/バッファーの対応をリストアしません。
警告:
保存されたポイント値に隣接する通常のテキスト挿入は、それがすべてのマーカーを再配置するのと同様、保存されたポイントカーを再配置します。より正確には、保存される値は挿入タイプnil
のマーカーです。Marker Insertion Typesを参照してください。したがって、保存されたポイント値のリストア時は、通常は挿入されたテキストの直前になります。
たとえsave-excursion
がマーク位置を保存しても、バッファーを変更する関数がdeactivate-mark
をセットするのを禁止しないため、そのコマンド完了後にマークの非アクティブ化が効力を発揮します。The Markを参照してください。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ナローイング(narrowing)とは、Emacs編集コマンドがアドレス指定可能なテキストを、あるバッファー内の制限された文字範囲に限定することを意味します。アドレス可能なテキストは、そのバッファーのアクセス可能範囲(accessible portion)と呼ばれます。
ナローイングは2つのバッファー位置により指定され、それがアクセス可能範囲の開始と終了になります。ほとんどの編集コマンドおよびプリミティブにたいし、これらの位置はそれぞれそのバッファーの先頭と終端に置き換えられます。ナローイングが効果をもつ間、アクセス可能範囲外のテキストは表示されず、その外部にポイントを移動することはできません。ナローイングは実際のバッファー位置(Pointを参照)を変更しないことに注意してください。ほとんどの関数は、アクセス可能範囲外のテキストにたいする操作を受け付けません。
バッファーを保存するコマンドは、ナローイングの影響を受けません。どんなナローイングであろうと、それらはバッファー全体を保存します。
単一バッファー内に、タイプが大きく異なるテキストを複数表示する必要がある場合は、Swapping Text Between Two Buffersで説明する代替機能の使用を考慮してみてください。
この関数は、アクセス可能範囲の開始と終了に、カレントバッファーのstartとendをセットする。どちらの引数も、文字位置で指定すること。
インタラクティブな呼び出しでは、startとendはカレントリージョン(ポイントとマークで、小さいほうが前者)にセットされる。
この関数は、カレントページだけを含むように、カレントバッファーのアクセス可能範囲をセットする。1つ目のオプション引数move-countが非nil
の場合は、move-countで前方または後方へ移動後に、1ページにナローすることを意味する。変数page-delimiter
は、ページの開始と終了の位置を指定する(Standard Regular Expressions Used in Editingを参照)。
インタラクティブな呼び出しでは、move-countには数プレフィクス引数がセットされる。
この関数は、カレントバッファーにたいするすべてのナローイングをキャンセルする。これはワイドニング(widening)と呼ばれる。これは、以下の式と等価である:
(narrow-to-region 1 (1+ (buffer-size)))
この関数は、そのバッファーがナローされていれば非nil
、それ以外はnil
をリターンする。
このスペシャルフォームは、アクセス可能範囲のカレントのバインドを保存してbodyを評価し、以前に有効だったナローイング(またはナローイングのない状態)と同じ状態になるよう最後に保存されたバインドをリストアする。ナローイングの状態は、throw
またはエラーを通じたアブノーマルexit(Nonlocal Exitsを参照)イベント内においても、リストアされる。したがって、この構成は一時的にバッファーをナローする明快な手段である。
save-restriction
がリターンする値は、body内の最後のフォームのリターン値、またはbodyフォームが与えられなければnil
である。
注意: save-restriction
使用時は間違いを起こしやすい。これを試みる前にここでの説明全体を通読すること。
bodyがカレントバッファーを変更する場合でも、save-restriction
は依然として元のバッファー(その制限が保存されたバッファー)上の制限をリストアするが、カレントバッファー自体はリストアしない。
save-restriction
は、ポイントとマークをリストアしない。これを行うにはsave-excursion
を使用する。save-restriction
とsave-excursion
の両方を共に使用するなら、始め(外側)にsave-excursion
を記述すること。それ以外では、一時的なナローイング影響下で古いポイント値がリストアされる。古いポイント値が一時的なナローイング境界外なら、それを実際にリストアするのは失敗するだろう。
以下は、save-restriction
の正しい使い方の簡単な例である:
---------- Buffer: foo ---------- This is the contents of foo This is the contents of foo This is the contents of foo∗ ---------- Buffer: foo ----------
(save-excursion (save-restriction (goto-char 1) (forward-line 2) (narrow-to-region 1 (point)) (goto-char (point-min)) (replace-string "foo" "bar"))) ---------- Buffer: foo ---------- This is the contents of bar This is the contents of bar This is the contents of foo∗ ---------- Buffer: foo ----------
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マーカー(marker)とは、あるバッファー内で取り囲んでいるテキストにたいして相対的な位置を指定するために使用されるオブジェクトです。テキストが挿入または削除されると常に、マーカーは自動的にそのバッファーの先頭からのオフセットを自動的に変更して、自身の左右にある文字の間に留まります。
30.1 Overview of Markers | マーカー構成要素と再配置方法。 | |
30.2 Predicates on Markers | オブジェクトがマーカーか否かのテスト。 | |
30.3 Functions that Create Markers | 空マーカーや特定箇所のマーカーの作成。 | |
30.4 Information from Markers | マーカーのバッファーや文字位置を探す。 | |
30.5 Marker Insertion Types | マーカーが指す位置への挿入時にマーカーを再配置する2つの方法。 | |
30.6 Moving Marker Positions | 新たなバッファーや位置にマーカーを移動する。 | |
30.7 The Mark | マーカーによる"マーク"の実装方法。 | |
30.8 The Region | "リージョン"へのアクセス方法。 |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マーカーは、バッファーとそのバッファー内の位置を指定します。マーカーは、位置を要求する関数内において、位置を表すために整数と同じようにして使用することができます。その場合、そのマーカーのバッファーは、通常は無視されます。この方法で使用されるマーカーは通常、その関数が処理するバッファー内の位置を指しますが、それは完全にプログラマーの責任です。位置についての完全な説明は、Positionsを参照してください。
マーカーはマーカー位置(marker position)、マーカーバッファー(marker buffer)、挿入タイプ(insertion type)という3つの属性をもちます。マーカー位置は、そのバッファー内の位置としてのマーカーと、(その時点において)等しい整数です。しかし、マーカー位置はマーカー生存期間中に変化し得るものであり、頻繁に変化されます。バッファー内でのテキストの挿入や削除で、マーカーは再配置されます。マーカー前後の2文字以外の場所で挿入や削除がおこなわれても、マーカー位置はその2文字間に留まるというのが、このアイデアです。再配置により、マーカーと等価な整数は変更されます。
マーカー位置周辺のテキストを削除することにより、そのマーカーは削除されたテキストの直前および直後にある文字の間に残されます。マーカー位置へのテキスト挿入では、マーカーは通常は新たなテキストの前か後のいずれかに置かれます。その挿入がinsert-before-markers
(Inserting Textを参照)で行われたものでなければ、どちらに置かれるかはマーカーの挿入タイプ(Marker Insertion Typesを参照)に依存します。
バッファーでの挿入と削除では、すべてのマーカーをチェックして、必要ならそれらを再配置しなければなりません。これは、多数のマーカーをもつバッファーでの処理を遅くします。それ以上マーカーが不必要なのが確信できる場合には、存在しない場所も指さないようにマーカーを設定することは、この理由によりよいアイデアといえるでしょう。それ以上アクセスされる可能性がないマーカーは、最終的には削除されます(Garbage Collectionを参照)。
マーカー位置にたいして算術演算を行うことは一般的なので、それらの演算子のほとんど(+
や-
を含む)が、引数としてマーカーに渡すことができます。そのような場合には、マーカーはカレント位置を意味します。
以下ではマーカー渡す作成とセットを行い、ポイントをマーカーに移動しています:
;; 最初はどこも指さない新たなマーカーを作成:
(setq m1 (make-marker))
⇒ #<marker in no buffer>
;; カレントバッファーの99と100番目の
;; 文字間を指すようm1
をセット:
(set-marker m1 100)
⇒ #<marker at 100 in markers.texi>
;; ここでバッファー先頭に1文字挿入:
(goto-char (point-min))
⇒ 1
(insert "Q")
⇒ nil
;; m1
は適切に更新された
m1
⇒ #<marker at 101 in markers.texi>
;; 同じ位置を指す2つのマーカーは ;;equal
だがeq
に非ず (setq m2 (copy-marker m1)) ⇒ #<marker at 101 in markers.texi> (eq m1 m2) ⇒ nil (equal m1 m2) ⇒ t
;; マーカー使用終了時、存在しない場所を指すようセット
(set-marker m1 nil)
⇒ #<marker in no buffer>
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるオブジェクトがマーカーなのか、それとも整数かマーカーのいずれかであるか確認するために、テストを行うことができます。後者のテストは、マーカーと整数の両方にたいして機能する算術関数において有用です。
この関数は、objectがマーカーならnil
、それ以外はt
をリターンする。多くの関数はマーカーか整数のいずれかを受け入れるだろうが、整数はマーカーと異なることに注意。
この関数は、objectが整数またはマーカーならt
、それ以外はnil
をリターンする。
この関数は、objectが数値(整数か浮動小数点数のいずれか)またはマーカーならt
、それ以外はnil
をリターンする。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マーカーを新たに作成する際は、存在しない場所、ポイントの現在位置、バッファーのアクセス可能範囲の先頭や終端、または別の与えられたマーカーと同じ箇所を指すようにすることができます。
以下の4つの関数はすべて、挿入タイプnil
のマーカーをリターンします。Marker Insertion Typesを参照してください。
この関数は、どこも指さないマーカーを新たに作成してリターンする。
(make-marker) ⇒ #<marker in no buffer>
この関数は、カレントバッファーのポイント現在位置を指すマーカーを新たに作成してリターンする。See section Pointを参照のこと。例は以下のcopy-marker
を参照されたい。
この関数は、バッファーのアクセス可能範囲の先頭を指すマーカーを新たに作成してリターンする。ナローイングが効力をもたなければ、これはバッファーの先頭になるだろう。Narrowingを参照のこと。
この関数は、バッファーのアクセス可能範囲の終端を指すマーカーを新たに作成してリターンする。ナローイングが効力をもたなければ、これはバッファーの終端になるだろう。Narrowingを参照のこと。
以下に、このチャプターのテキストのソースファイルのバージョンを含むバッファーにたいして、この関数およびpoint-min-marker
を使用した例を示す。
(point-min-marker) ⇒ #<marker at 1 in markers.texi> (point-max-marker) ⇒ #<marker at 24080 in markers.texi>
(narrow-to-region 100 200) ⇒ nil
(point-min-marker) ⇒ #<marker at 100 in markers.texi>
(point-max-marker) ⇒ #<marker at 200 in markers.texi>
引数としてマーカーを渡されると、copy-marker
はmarker-or-integerが行うようにして、同じバッファーの同じ位置を指すマーカーを新たに作成してリターンする。整数を渡された場合、copy-marker
はカレントバッファーの位置marker-or-integerを指すマーカーを新たに作成してリターンする。
新たなマーカーの挿入タイプは、引数insertion-typeにより指定される。Marker Insertion Typesを参照のこと。
(copy-marker 0) ⇒ #<marker at 1 in markers.texi>
(copy-marker 90000) ⇒ #<marker at 24080 in markers.texi>
markerがマーカーと整数のいずれでもない場合は、エラーがシグナルされる。
2つのマーカーは、それらが同じバッファーの同じ位置、またはどちらも存在しない場所を指す場合は、(eq
ではないものの)equal
とみなされます。
(setq p (point-marker)) ⇒ #<marker at 2139 in markers.texi>
(setq q (copy-marker p)) ⇒ #<marker at 2139 in markers.texi>
(eq p q) ⇒ nil
(equal p q) ⇒ t
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、マーカーオブジェクトの構成要素にアクセスする関数を説明します。
この関数は、markerが指す位置、または存在しない場所ならnil
をリターンする。
この関数は、markerがその内部を指すバッファー、存在しない場所を指す場合はnil
をリターンする。
(setq m (make-marker)) ⇒ #<marker in no buffer>
(marker-position m) ⇒ nil
(marker-buffer m) ⇒ nil
(set-marker m 3770 (current-buffer)) ⇒ #<marker at 3770 in markers.texi>
(marker-buffer m) ⇒ #<buffer markers.texi>
(marker-position m) ⇒ 3770
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マーカーが指す位置に直接テキストを挿入する際、そのマーカーを再配置するために利用可能な手段が2つあります。そのマーカーはは挿入されたテキストの前、あるいは後を指すことができます。マーカーの挿入タイプ(insertion
type)を指定することにより、マーカーがどちらを行うか指定できます。insert-before-markers
を使用する場合は、マーカーの挿入タイプを無視して、常にマーカーが挿入されたテキストの後を指すよう再配置されることに注意してください。
この関数は、マーカーmarkerの挿入タイプを、typeにセットする。typeがt
の場合、テキスト挿入時にmarkerはその位置まで進められるだろう。typeがnil
なら、テキスト挿入時にmarkerはそこまで進められない。
この関数は、markerのカレント挿入タイプを報告する。
挿入タイプを指定するための引数を受け取らない、マーカーを作成する関数のほとんどは、挿入タイプnil
のマーカーを作成します。また、マークがもつデフォルトの挿入タイプもnil
です。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このセクションでは、既存マーカーの位置を変更する方法について説明します。これを行う際は、そのマーカーがあなたのプログラム外部に使用されているかどうか、もし使用されているならマーカーを移動した結果どのような影響が生じるかを確実に理解する必要があります。さもないと、Emacsの他の部分で、混乱した出来事が発生するかもしれません。
この関数は、buffer内でmarkerをpositionに移動する。bufferが与えられなかった場合のデフォルトは、カレントバッファーである。
positionがnil
、または存在しない場所を指すマーカーの場合、markerは存在しない場所を指すようにセットされる。
リターン値はmarkerである。
(setq m (point-marker)) ⇒ #<marker at 4714 in markers.texi>
(set-marker m 55) ⇒ #<marker at 55 in markers.texi>
(setq b (get-buffer "foo")) ⇒ #<buffer foo>
(set-marker m 0 b) ⇒ #<marker at 1 in foo>
これはset-marker
の別名である。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バッファーはそれぞれ、マーク(mark)という、バッファー専用の特別なマーカーをもちますバッファーが新たに作成される際、すでにこのマーカーは存在していますが、どこも指していません。これは、そのバッファーにはまだマークが“存在しない”ことを意味します。それ以降のコマンドがマークをセットできます。
マークは、kill-region
やindent-rigidly
のような多くのコマンドにたいして、テキスト範囲をバインドするための位置を指定します。通常これらのコマンドは、ポイントとマークの間の、リージョン(region)と呼ばれるテキストに作用します。リージョンを操作するコマンドを記述する場合は、マークを直接調べず、かわりに‘r’指定とともにinteractive
を使用してください。このようにすれば、インタラクティブな呼び出しではコマンドの引数としてポイントとマークの値が提供され、かつ他のLispプログラムは引数を明示的に指定できます。Code Characters for interactive
を参照してください。
いくつかのコマンドは、その副作用(side-effect)としてマークをセットします。コマンドは、ユーザーがそれを使用する可能性がある場合のみマークをセットするべきであり、決してコマンドの内部的な目的にたいして使用してはなりません。たとえばreplace-regexp
コマンドは、何らかの置換を行う前にマークにポイントの値をセットしますが、その理由はこれによりユーザーが置換を終えた後、簡単にその位置に戻ることが可能になるからです。
一度バッファー内にマークが“存在”すれば、その存在は通常は決して消えることはありません。しかし、Transient
Markモードが有効な場合、マークが非アクティブ(inactive)になることはあります。バッファーローカル変数mark-active
が非nil
なら、それはマークがアクティブであることを意味します。コマンドはマークを直接非アクティブにするために関数deactivate-mark
を呼び出すことができ、変数deactivate-mark
を非nil
値にセットすることにより、エディターコマンドループ(editor
command loop)にリターン時にマークの非アクティブ化を要求できます。
Transient Markモードが有効な場合、通常ならポイント近傍に適用される特定の編集コマンドは、マークがアクティブなときはかわりにリージョンに適用されます。これがTransient Markモードを使用する主な動機です(他にも、マークアクティブ時にはリージョンのハイライトが有効になるという理由もある。Emacs Displayを参照されたい)。
マークに加えて、バッファーはそれぞれマークリング(mark
ring)をもっています。これは、以前のマーク値を含むマーカーのリストです。編集コマンドがマークを変更する際、それらのコマンドは通常はマークの旧値をマークリングに保存するべきです。変数mark-ring-max
は、マークリング内のエントリー最大数を指定します。リストがこの長さに達すると、最後の要素を削除して、新たな要素が追加されます。
これとは別にグローバルマークリング(global mark ring)がありますが、それは少数の特定のユーザーレベルコマンドでのみ使用され、Lispプログラムとは関連しないので、ここでは説明しません。
この関数は、カレントバッファーのマーク位置を整数でリターンする。そのバッファー内でそれまでマークがセットされていなければnil
をリターンする。
Transient
Markモードが有効、かつmark-even-if-inactive
がnil
の場合、マークが非アクティブならmark
はエラーをシグナルする。しかし、forceが非nil
なら、mark
はマークの非アクティブ性を無視して、何にせよマーク位置(かnil
)をリターンする。
この関数は、カレントバッファーのマークを表すマーカーをリターンする。これはコピーではなく、内部的に使用されるマーカーである。したがって、このマーカー位置にたいする変更は、そのバッファーのマークに直接影響する。それが望む効果でなければ、これを行ってはならない。
(setq m (mark-marker)) ⇒ #<marker at 3420 in markers.texi>
(set-marker m 100) ⇒ #<marker at 100 in markers.texi>
(mark-marker) ⇒ #<marker at 100 in markers.texi>
他のマーカー同様、このマーカーを任意のバッファー位置にセットできる。このマーカーに、これがマークする以外のバッファーを指すようにすると、完全に整合性があるものの、いささか奇妙な結果を得ることになるだろう。これを行わないことを、わたしたちは推奨する!
この関数は、マークをpositionにセットして、そのマークをアクティブにする。マークの旧値はマークリングにpushされない。
注意:
マークが移動したことをユーザーに確認させ、かつ前のマーク位置が失われることを望む場合のみ、この関数を使用すること。通常は、マークセット時に古いマークはmark-ring
にpushされるべきである。この理由により、ほとんどのアプリケーションはset-mark
ではなく、push-mark
およびpop-mark
を使用するべきである。
Emacs Lispの初心者プログラマーは、誤った用途にマークの使用を試みがちである。ユーザーの利便のために位置を保存するのがマークである。編集コマンドは、マーク変更がコマンドのユーザーレベル機能の一部でない限り、マークを変更するべきではない(そして、そのような場合にはその効果をドキュメントするべきである)。Lispプログラムの内部的な使用のために位置を記憶するためには、マークをLisp変数に格納すること。たとえば:
(let ((beg (point))) (forward-line 1) (delete-region beg (point)))
この関数は、カレントバッファーのマークをpositionにセットして、前のマークをmark-ring
にpushする。positionがnil
の場合は、ポイントの値を使用する。
関数push-mark
は通常、マークをアクティブにしない。アクティブにする場合は、引数activateにt
を指定する。
nomsgがnil
なら、メッセージ‘Mark set’が表示される。
この関数は、mark-ring
のトップ要素をpopして、そのマークをバッファーの実際のマークにする。これはバッファー内のポイントを移動せず、mark-ring
が空なら何も行わない。これはマークを非アクティブ化する。
この変数が非nil
なら、Transient Markモードを有効にする。Transient
Markモードでは、すべてのバッファー変更プリミティブがdeactivate-mark
をセットする。結果として、バッファーを変更するほとんどのコマンドも、マークを非アクティブにする。
Transient
Markモードが有効かつマークがアクティブの場合、通常はポイント近傍に適用されるコマンドの多くは、かわりにリージョンに適用される。そのようなコマンドは、リージョンを処理すべきかどうかをテストするために、関数use-region-p
を使用するべきである。The Regionを参照のこと。
Lispプログラムは、一時的にTransient
Markモードを有効にするために、transient-mark-mode
をnil
でもt
でもない値にセットできる。値がlambda
なら、バッファー変更のような通常ならマークを非アクティブ化するような操作の後、Transient
Markモードを自動的にオフに切り替える。値が(only . oldval)
なら、後続のコマンドがポイントを移動かつシフト変換(shift-translationを参照)されていない場合、あるいは通常はマークを非アクティブにするその他の操作の場合は、transient-mark-mode
に値oldvalをセットする。
これが非nil
なら、LispプログラムおよびEmacsユーザーは、たとえ非アクティブでもマークを使用できる。このオプションは、Transient
Markモードの動作に影響を及ぼす。このオプションが非nil
なら、マークの非アクティブ化によりリージョンのハイライトはオフに切り替えられるが、マークを使用するコマンドは、あたかもマークがアクティブであるかのように振る舞う。
エディターコマンドがこの変数を非nil
にセットすると、エディターコマンドループはコマンドのリターン後に、(Transient
Markモードが有効なら)マークを非アクティブにする。バッファーを変更するすべてのプリミティブは、コマンド終了時にマークを非アクティブにするために、deactivate-mark
をセットする。
コマンド終了時にマークを非アクティブにすることなくバッファーを変更するLispコードを記述するためには、変更を行うコードの周辺でdeactivate-mark
をnil
にバインドすること。たとえば:
(let (deactivate-mark) (insert " "))
Transient
Markモードが有効、またはforceが非nil
の場合、この関数はマークを非アクティブにしてノーマルフックdeactivate-mark-hook
を実行し、それ以外は何も行わない。
この変数が非nil
なら、マークはアクティブである。この変数は、それぞれのバッファーにたいして、常にローカルである。通常はポイント近傍を操作するコマンドが、かわりにリージョンを操作すべきかどうかを判断するために、この変数の値を使用してはならない。その目的にたいしては、関数use-region-p
を使用すること(The Regionを参照)。
これらのノーマルフックは、マークがアクティブまたは非アクティブになった際に、順次実行される。マークがアクティブで、かつリージョンが変更された可能性があるなら、コマンドループの最後にフックactivate-mark-hook
も実行される。
この関数は、ポイント移動コマンドの“シフト選択(shift-selection)”の動作を実装する。Shift Selection in The GNU Emacs
Manualを参照のこと。これは、interactive
指定に文字‘^’を含むコマンド呼び出し時は常に、そのコマンド自身を実行する前に、Emacsコマンドループにより自動的に呼び出される(^を参照)。
shift-select-mode
が非nil
、かつカレントコマンドがシフト変換(shift-translationを参照)を通じて呼び出された場合、この関数はマークをセットして一時的にリージョンをアクティブにする(すでにこの方法によりリージョンが一時的にアクティブにされている場合を除く)。それ以外では、リージョンが一時的にアクティブにされていれば、マークを非アクティブにして、変数transient-mark-mode
に前の値をリストアする。
このバッファーローカル変数の値は、もっとも最近のものが先頭となった、カレントバッファーの以前に保存されたマークのリストである。
mark-ring ⇒ (#<marker at 11050 in markers.texi> #<marker at 10832 in markers.texi> …)
この変数の値は、mark-ring
の最大サイズである。これより多くのマークがmark-ring
にpushされると、新たなマーク追加時にpush-mark
は古いマークを破棄する。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ポイントとマークの間のテキストは、リージョン(region)という名で知られています。さまざまな関数がポイントとマークで区切られたテキストを操作しますが、ここではリージョンそのものに特に関連する関数だけを説明します。
以下の2つの関数は、マークが何処も指していなければエラーをシグナルします。Transient
Markモードが有効、かつmark-even-if-inactive
がnil
なら、マークが非アクティブな場合のエラーをシグナルします。
この関数は、リージョンの先頭位置を、(整数として)リターンする。これは、ポイントかマークのいずれか小さいほうの位置である。
この関数は、リージョンの終端位置を、(整数として)リターンする。これは、ポイントかマークのいずれか大きいほうの位置である。
リージョンにたいして操作を行うようにデザインされたコマンドがリージョンの先頭と終端を探すには、region-beginning
およびregion-end
を使用するかわりに、通常は‘r’指定とともにinteractive
を使用するべきです。これにより、他のLispプログラムが引数として明示的にリージョンの境界を指定できるようになります。Code Characters for interactive
を参照してください。。
この関数は、Transient
Markモードが有効でマークがアクティブであり、かつバッファー内に有効なリージョンがあればt
をリターンする。この関数は、マークアクティブ時にはポイント近傍のテキストのかわりにリージョンを操作するコマンドにより使用されることを意図している。
リージョンは、それが非0のサイズをもつか、あるいはユーザーオプションuse-empty-active-region
が非nil
(デフォルトはnil
)なら有効である。関数region-active-p
はuse-region-p
と同様だが、すべてのリージョンを有効とみなす。リージョンが空ならポイントにたいして操作を行うほうが適切な場合が多いため、ほとんどの場合はregion-active-p
を使用するべきではない。
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes the functions that deal with the text in a buffer. Most examine, insert, or delete text in the current buffer, often operating at point or on text adjacent to point. Many are interactive. All the functions that change the text provide for undoing the changes (see section Undo).
Many text-related functions operate on a region of text defined by two
buffer positions passed in arguments named start and end.
These arguments should be either markers (see section Markers) or numeric
character positions (see section Positions). The order of these arguments
does not matter; it is all right for start to be the end of the
region and end the beginning. For example, (delete-region 1
10)
and (delete-region 10 1)
are equivalent. An
args-out-of-range
error is signaled if either start or
end is outside the accessible portion of the buffer. In an
interactive call, point and the mark are used for these arguments.
Throughout this chapter, “text” refers to the characters in the buffer, together with their properties (when relevant). Keep in mind that point is always between two characters, and the cursor appears on the character after point.
31.1 Examining Text Near Point | Examining text in the vicinity of point. | |
31.2 Examining Buffer Contents | Examining text in a general fashion. | |
31.3 Comparing Text | Comparing substrings of buffers. | |
31.4 Inserting Text | Adding new text to a buffer. | |
31.5 User-Level Insertion Commands | User-level commands to insert text. | |
31.6 Deleting Text | Removing text from a buffer. | |
31.7 User-Level Deletion Commands | User-level commands to delete text. | |
31.8 The Kill Ring | Where removed text sometimes is saved for later use. | |
31.9 Undo | Undoing changes to the text of a buffer. | |
31.10 Maintaining Undo Lists | How to enable and disable undo information. How to control how much information is kept. | |
31.11 Filling | Functions for explicit filling. | |
31.12 Margins for Filling | How to specify margins for filling commands. | |
31.13 Adaptive Fill Mode | Adaptive Fill mode chooses a fill prefix from context. | |
31.14 Auto Filling | How auto-fill mode is implemented to break lines. | |
31.15 Sorting Text | Functions for sorting parts of the buffer. | |
31.16 Counting Columns | Computing horizontal positions, and using them. | |
31.17 Indentation | Functions to insert or adjust indentation. | |
31.18 Case Changes | Case conversion of parts of the buffer. | |
31.19 Text Properties | Assigning Lisp property lists to text characters. | |
31.20 Substituting for a Character Code | Replacing a given character wherever it appears. | |
31.21 Registers | How registers are implemented. Accessing the text or position stored in a register. | |
31.22 Transposition of Text | Swapping two portions of a buffer. | |
31.23 Dealing With Compressed Data | Dealing with compressed data. | |
31.24 Base 64 Encoding | Conversion to or from base 64 encoding. | |
31.25 Checksum/Hash | Computing cryptographic hashes. | |
31.26 Parsing HTML and XML | ||
31.27 Atomic Change Groups | Installing several buffer changes "atomically". | |
31.28 Change Hooks | Supplying functions to be run when text is changed. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Many functions are provided to look at the characters around point.
Several simple functions are described here. See also looking-at
in Regular Expression Searching.
In the following four functions, “beginning” or “end” of buffer refers to the beginning or end of the accessible portion.
This function returns the character in the current buffer at (i.e.,
immediately after) position position. If position is out of
range for this purpose, either before the beginning of the buffer, or at
or beyond the end, then the value is nil
. The default for
position is point.
In the following example, assume that the first character in the buffer is ‘@’:
(string (char-after 1)) ⇒ "@"
This function returns the character in the current buffer immediately
before position position. If position is out of range for
this purpose, either at or before the beginning of the buffer, or beyond
the end, then the value is nil
. The default for
position is point.
This function returns the character following point in the current
buffer. This is similar to (char-after (point))
. However, if
point is at the end of the buffer, then following-char
returns 0.
Remember that point is always between characters, and the cursor
normally appears over the character following point. Therefore, the
character returned by following-char
is the character the
cursor is over.
In this example, point is between the ‘a’ and the ‘c’.
---------- Buffer: foo ---------- Gentlemen may cry ``Pea∗ce! Peace!,'' but there is no peace. ---------- Buffer: foo ----------
(string (preceding-char)) ⇒ "a" (string (following-char)) ⇒ "c"
This function returns the character preceding point in the current
buffer. See above, under following-char
, for an example. If
point is at the beginning of the buffer, preceding-char
returns
0.
This function returns t
if point is at the beginning of the
buffer. If narrowing is in effect, this means the beginning of the
accessible portion of the text. See also point-min
in
Point.
This function returns t
if point is at the end of the buffer.
If narrowing is in effect, this means the end of accessible portion of
the text. See also point-max
in See section Point.
This function returns t
if point is at the beginning of a line.
See section Motion by Text Lines. The beginning of the buffer (or of its accessible
portion) always counts as the beginning of a line.
This function returns t
if point is at the end of a line. The
end of the buffer (or of its accessible portion) is always considered
the end of a line.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions that allow a Lisp program to convert any portion of the text in the buffer into a string.
This function returns a string containing a copy of the text of the
region defined by positions start and end in the current
buffer. If the arguments are not positions in the accessible portion
of the buffer, buffer-substring
signals an
args-out-of-range
error.
Here’s an example which assumes Font-Lock mode is not enabled:
---------- Buffer: foo ---------- This is the contents of buffer foo ---------- Buffer: foo ----------
(buffer-substring 1 10) ⇒ "This is t"
(buffer-substring (point-max) 10) ⇒ "he contents of buffer foo\n"
If the text being copied has any text properties, these are copied into the string along with the characters they belong to. See section Text Properties. However, overlays (see section Overlays) in the buffer and their properties are ignored, not copied.
For example, if Font-Lock mode is enabled, you might get results like these:
(buffer-substring 1 10) ⇒ #("This is t" 0 1 (fontified t) 1 9 (fontified t))
This is like buffer-substring
, except that it does not copy text
properties, just the characters themselves. See section Text Properties.
This function returns the contents of the entire accessible portion of the current buffer, as a string.
This function filters the buffer text between start and end
using a function specified by the variable
filter-buffer-substring-function
, and returns the result.
The default filter function consults the obsolete wrapper hook
filter-buffer-substring-functions
, and the obsolete variable
buffer-substring-filters
. If both of these are nil
, it
returns the unaltered text from the buffer, i.e., what
buffer-substring
would return.
If delete is non-nil
, the function deletes the text
between start and end after copying it, like
delete-and-extract-region
.
Lisp code should use this function instead of buffer-substring
,
buffer-substring-no-properties
,
or delete-and-extract-region
when copying into user-accessible
data structures such as the kill-ring, X clipboard, and registers.
Major and minor modes can modify filter-buffer-substring-function
to alter such text as it is copied out of the buffer.
The value of this variable is a function that filter-buffer-substring
will call to do the actual work. The function receives three
arguments, the same as those of filter-buffer-substring
,
which it should treat as per the documentation of that function. It
should return the filtered text (and optionally delete the source text).
The following two variables are obsoleted by
filter-buffer-substring-function
, but are still supported for
backward compatibility.
This obsolete variable is a wrapper hook, whose members should be functions
that accept four arguments: fun, start, end, and
delete. fun is a function that takes three arguments
(start, end, and delete), and returns a string. In
both cases, the start, end, and delete arguments are
the same as those of filter-buffer-substring
.
The first hook function is passed a fun that is equivalent to
the default operation of filter-buffer-substring
, i.e., it
returns the buffer-substring between start and end
(processed by any buffer-substring-filters
) and optionally
deletes the original text from the buffer. In most cases, the hook
function will call fun once, and then do its own processing of
the result. The next hook function receives a fun equivalent to
this, and so on. The actual return value is the result of all the
hook functions acting in sequence.
The value of this obsolete variable should be a list of functions
that accept a single string argument and return another string.
The default filter-buffer-substring
function passes the buffer
substring to the first function in this list, and the return value of
each function is passed to the next function. The return value of the
last function is passed to filter-buffer-substring-functions
.
This function returns the symbol (or word) at or near point, as a string. The return value includes no text properties.
If the optional argument really-word is non-nil
, it finds a
word; otherwise, it finds a symbol (which includes both word
characters and symbol constituent characters).
If the optional argument strict is non-nil
, then point
must be in or next to the symbol or word—if no symbol or word is
there, the function returns nil
. Otherwise, a nearby symbol or
word on the same line is acceptable.
Return the thing around or next to point, as a string.
The argument thing is a symbol which specifies a kind of syntactic
entity. Possibilities include symbol
, list
, sexp
,
defun
, filename
, url
, word
, sentence
,
whitespace
, line
, page
, and others.
---------- Buffer: foo ---------- Gentlemen may cry ``Pea∗ce! Peace!,'' but there is no peace. ---------- Buffer: foo ---------- (thing-at-point 'word) ⇒ "Peace" (thing-at-point 'line) ⇒ "Gentlemen may cry ``Peace! Peace!,''\n" (thing-at-point 'whitespace) ⇒ nil
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function lets you compare portions of the text in a buffer, without copying them into strings first.
This function lets you compare two substrings of the same buffer or two
different buffers. The first three arguments specify one substring,
giving a buffer (or a buffer name) and two positions within the
buffer. The last three arguments specify the other substring in the
same way. You can use nil
for buffer1, buffer2, or
both to stand for the current buffer.
The value is negative if the first substring is less, positive if the first is greater, and zero if they are equal. The absolute value of the result is one plus the index of the first differing characters within the substrings.
This function ignores case when comparing characters
if case-fold-search
is non-nil
. It always ignores
text properties.
Suppose you have the text ‘foobarbar haha!rara!’ in the current buffer; then in this example the two substrings are ‘rbar ’ and ‘rara!’. The value is 2 because the first substring is greater at the second character.
(compare-buffer-substrings nil 6 11 nil 16 21) ⇒ 2
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Insertion means adding new text to a buffer. The inserted text goes at point—between the character before point and the character after point. Some insertion functions leave point before the inserted text, while other functions leave it after. We call the former insertion after point and the latter insertion before point.
Insertion moves markers located at positions after the insertion
point, so that they stay with the surrounding text (see section Markers).
When a marker points at the place of insertion, insertion may or may
not relocate the marker, depending on the marker’s insertion type
(see section Marker Insertion Types). Certain special functions such as
insert-before-markers
relocate all such markers to point after
the inserted text, regardless of the markers’ insertion type.
Insertion functions signal an error if the current buffer is read-only (see section Read-Only Buffers) or if they insert within read-only text (see section Properties with Special Meanings).
These functions copy text characters from strings and buffers along with their properties. The inserted characters have exactly the same properties as the characters they were copied from. By contrast, characters specified as separate arguments, not part of a string or buffer, inherit their text properties from the neighboring text.
The insertion functions convert text from unibyte to multibyte in order to insert in a multibyte buffer, and vice versa—if the text comes from a string or from a buffer. However, they do not convert unibyte character codes 128 through 255 to multibyte characters, not even if the current buffer is a multibyte buffer. See section Converting Text Representations.
This function inserts the strings and/or characters args into the
current buffer, at point, moving point forward. In other words, it
inserts the text before point. An error is signaled unless all
args are either strings or characters. The value is nil
.
This function inserts the strings and/or characters args into the
current buffer, at point, moving point forward. An error is signaled
unless all args are either strings or characters. The value is
nil
.
This function is unlike the other insertion functions in that it relocates markers initially pointing at the insertion point, to point after the inserted text. If an overlay begins at the insertion point, the inserted text falls outside the overlay; if a nonempty overlay ends at the insertion point, the inserted text falls inside that overlay.
This command inserts count instances of character into the current buffer before point. The argument count must be an integer, and character must be a character.
If called interactively, this command prompts for character using its Unicode name or its code point. See Inserting Text in The GNU Emacs Manual.
This function does not convert unibyte character codes 128 through 255 to multibyte characters, not even if the current buffer is a multibyte buffer. See section Converting Text Representations.
If inherit is non-nil
, the inserted characters inherit
sticky text properties from the two characters before and after the
insertion point. See section Stickiness of Text Properties.
This function inserts a portion of buffer from-buffer-or-name
into the current buffer before point. The text inserted is the region
between start (inclusive) and end (exclusive). (These
arguments default to the beginning and end of the accessible portion
of that buffer.) This function returns nil
.
In this example, the form is executed with buffer ‘bar’ as the current buffer. We assume that buffer ‘bar’ is initially empty.
---------- Buffer: foo ---------- We hold these truths to be self-evident, that all ---------- Buffer: foo ----------
(insert-buffer-substring "foo" 1 20) ⇒ nil ---------- Buffer: bar ---------- We hold these truth∗ ---------- Buffer: bar ----------
This is like insert-buffer-substring
except that it does not
copy any text properties.
See section Stickiness of Text Properties, for other insertion functions that inherit text properties from the nearby text in addition to inserting it. Whitespace inserted by indentation functions also inherits text properties.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes higher-level commands for inserting text, commands intended primarily for the user but useful also in Lisp programs.
This command inserts the entire accessible contents of
from-buffer-or-name (which must exist) into the current buffer
after point. It leaves the mark after the inserted text. The value
is nil
.
This command inserts the last character typed; it does so count
times, before point, and returns nil
. Most printing characters
are bound to this command. In routine use, self-insert-command
is the most frequently called function in Emacs, but programs rarely use
it except to install it on a keymap.
In an interactive call, count is the numeric prefix argument.
Self-insertion translates the input character through
translation-table-for-input
. See section Translation of Characters.
This command calls auto-fill-function
whenever that is
non-nil
and the character inserted is in the table
auto-fill-chars
(see section Auto Filling).
This command performs abbrev expansion if Abbrev mode is enabled and
the inserted character does not have word-constituent
syntax. (See section Abbrevs and Abbrev Expansion, and Table of Syntax Classes.) It is also
responsible for calling blink-paren-function
when the inserted
character has close parenthesis syntax (see section Blinking Parentheses).
The final thing this command does is to run the hook
post-self-insert-hook
. You could use this to automatically
reindent text as it is typed, for example.
Do not try substituting your own definition of
self-insert-command
for the standard one. The editor command
loop handles this function specially.
This command inserts newlines into the current buffer before point. If number-of-newlines is supplied, that many newline characters are inserted.
This function calls auto-fill-function
if the current column
number is greater than the value of fill-column
and
number-of-newlines is nil
. Typically what
auto-fill-function
does is insert a newline; thus, the overall
result in this case is to insert two newlines at different places: one
at point, and another earlier in the line. newline
does not
auto-fill if number-of-newlines is non-nil
.
This command indents to the left margin if that is not zero. See section Margins for Filling.
The value returned is nil
. In an interactive call, count
is the numeric prefix argument.
This variable controls whether overwrite mode is in effect. The value
should be overwrite-mode-textual
, overwrite-mode-binary
,
or nil
. overwrite-mode-textual
specifies textual
overwrite mode (treats newlines and tabs specially), and
overwrite-mode-binary
specifies binary overwrite mode (treats
newlines and tabs like any other characters).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Deletion means removing part of the text in a buffer, without saving it in the kill ring (see section The Kill Ring). Deleted text can’t be yanked, but can be reinserted using the undo mechanism (see section Undo). Some deletion functions do save text in the kill ring in some special cases.
All of the deletion functions operate on the current buffer.
This function deletes the entire text of the current buffer
(not just the accessible portion), leaving it
empty. If the buffer is read-only, it signals a buffer-read-only
error; if some of the text in it is read-only, it signals a
text-read-only
error. Otherwise, it deletes the text without
asking for any confirmation. It returns nil
.
Normally, deleting a large amount of text from a buffer inhibits further
auto-saving of that buffer “because it has shrunk”. However,
erase-buffer
does not do this, the idea being that the future
text is not really related to the former text, and its size should not
be compared with that of the former text.
This command deletes the text between positions start and
end in the current buffer, and returns nil
. If point was
inside the deleted region, its value afterward is start.
Otherwise, point relocates with the surrounding text, as markers do.
This function deletes the text between positions start and end in the current buffer, and returns a string containing the text just deleted.
If point was inside the deleted region, its value afterward is start. Otherwise, point relocates with the surrounding text, as markers do.
This command deletes count characters directly after point, or
before point if count is negative. If killp is
non-nil
, then it saves the deleted characters in the kill ring.
In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.
The value returned is always nil
.
This command deletes count characters directly before point, or
after point if count is negative. If killp is
non-nil
, then it saves the deleted characters in the kill ring.
In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.
The value returned is always nil
.
This command deletes count characters backward, changing tabs
into spaces. When the next character to be deleted is a tab, it is
first replaced with the proper number of spaces to preserve alignment
and then one of those spaces is deleted instead of the tab. If
killp is non-nil
, then the command saves the deleted
characters in the kill ring.
Conversion of tabs to spaces happens only if count is positive. If it is negative, exactly -count characters after point are deleted.
In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.
The value returned is always nil
.
This option specifies how backward-delete-char-untabify
should
deal with whitespace. Possible values include untabify
, the
default, meaning convert a tab to many spaces and delete one;
hungry
, meaning delete all tabs and spaces before point with
one command; all
meaning delete all tabs, spaces and newlines
before point, and nil
, meaning do nothing special for
whitespace characters.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes higher-level commands for deleting text, commands intended primarily for the user but useful also in Lisp programs.
This function deletes all spaces and tabs around point. It returns
nil
.
If backward-only is non-nil
, the function deletes
spaces and tabs before point, but not after point.
In the following examples, we call delete-horizontal-space
four
times, once on each line, with point between the second and third
characters on the line each time.
---------- Buffer: foo ---------- I ∗thought I ∗ thought We∗ thought Yo∗u thought ---------- Buffer: foo ----------
(delete-horizontal-space) ; Four times.
⇒ nil
---------- Buffer: foo ----------
Ithought
Ithought
Wethought
You thought
---------- Buffer: foo ----------
This function joins the line point is on to the previous line, deleting
any whitespace at the join and in some cases replacing it with one
space. If join-following-p is non-nil
,
delete-indentation
joins this line to the following line
instead. The function returns nil
.
If there is a fill prefix, and the second of the lines being joined
starts with the prefix, then delete-indentation
deletes the
fill prefix before joining the lines. See section Margins for Filling.
In the example below, point is located on the line starting ‘events’, and it makes no difference if there are trailing spaces in the preceding line.
---------- Buffer: foo ---------- When in the course of human ∗ events, it becomes necessary ---------- Buffer: foo ----------
(delete-indentation) ⇒ nil
---------- Buffer: foo ---------- When in the course of human∗ events, it becomes necessary ---------- Buffer: foo ----------
After the lines are joined, the function fixup-whitespace
is
responsible for deciding whether to leave a space at the junction.
This function replaces all the horizontal whitespace surrounding point
with either one space or no space, according to the context. It
returns nil
.
At the beginning or end of a line, the appropriate amount of space is none. Before a character with close parenthesis syntax, or after a character with open parenthesis or expression-prefix syntax, no space is also appropriate. Otherwise, one space is appropriate. See section Table of Syntax Classes.
In the example below, fixup-whitespace
is called the first time
with point before the word ‘spaces’ in the first line. For the
second invocation, point is directly after the ‘(’.
---------- Buffer: foo ---------- This has too many ∗spaces This has too many spaces at the start of (∗ this list) ---------- Buffer: foo ----------
(fixup-whitespace) ⇒ nil (fixup-whitespace) ⇒ nil
---------- Buffer: foo ---------- This has too many spaces This has too many spaces at the start of (this list) ---------- Buffer: foo ----------
This command replaces any spaces and tabs around point with a single
space, or n spaces if n is specified. It returns
nil
.
This function deletes blank lines surrounding point. If point is on a blank line with one or more blank lines before or after it, then all but one of them are deleted. If point is on an isolated blank line, then it is deleted. If point is on a nonblank line, the command deletes all blank lines immediately following it.
A blank line is defined as a line containing only tabs and spaces.
delete-blank-lines
returns nil
.
Delete trailing whitespace in the region defined by start and end.
This command deletes whitespace characters after the last non-whitespace character in each line in the region.
If this command acts on the entire buffer (i.e. if called
interactively with the mark inactive, or called from Lisp with
end nil
), it also deletes all trailing lines at the end of the
buffer if the variable delete-trailing-lines
is non-nil
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Kill functions delete text like the deletion functions, but save it so that the user can reinsert it by yanking. Most of these functions have ‘kill-’ in their name. By contrast, the functions whose names start with ‘delete-’ normally do not save text for yanking (though they can still be undone); these are “deletion” functions.
Most of the kill commands are primarily for interactive use, and are not described here. What we do describe are the functions provided for use in writing such commands. You can use these functions to write commands for killing text. When you need to delete text for internal purposes within a Lisp function, you should normally use deletion functions, so as not to disturb the kill ring contents. See section Deleting Text.
Killed text is saved for later yanking in the kill ring. This
is a list that holds a number of recent kills, not just the last text
kill. We call this a “ring” because yanking treats it as having
elements in a cyclic order. The list is kept in the variable
kill-ring
, and can be operated on with the usual functions for
lists; there are also specialized functions, described in this section,
that treat it as a ring.
Some people think this use of the word “kill” is unfortunate, since it refers to operations that specifically do not destroy the entities “killed”. This is in sharp contrast to ordinary life, in which death is permanent and “killed” entities do not come back to life. Therefore, other metaphors have been proposed. For example, the term “cut ring” makes sense to people who, in pre-computer days, used scissors and paste to cut up and rearrange manuscripts. However, it would be difficult to change the terminology now.
31.8.1 Kill Ring Concepts | What text looks like in the kill ring. | |
31.8.2 Functions for Killing | Functions that kill text. | |
31.8.3 Yanking | How yanking is done. | |
31.8.4 Functions for Yanking | Commands that access the kill ring. | |
31.8.5 Low-Level Kill Ring | Functions and variables for kill ring access. | |
31.8.6 Internals of the Kill Ring | Variables that hold kill ring data. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The kill ring records killed text as strings in a list, most recent first. A short kill ring, for example, might look like this:
("some text" "a different piece of text" "even older text")
When the list reaches kill-ring-max
entries in length, adding a
new entry automatically deletes the last entry.
When kill commands are interwoven with other commands, each kill command makes a new entry in the kill ring. Multiple kill commands in succession build up a single kill ring entry, which would be yanked as a unit; the second and subsequent consecutive kill commands add text to the entry made by the first one.
For yanking, one entry in the kill ring is designated the “front” of the ring. Some yank commands “rotate” the ring by designating a different element as the “front”. But this virtual rotation doesn’t change the list itself—the most recent entry always comes first in the list.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
kill-region
is the usual subroutine for killing text. Any
command that calls this function is a “kill command” (and should
probably have ‘kill’ in its name). kill-region
puts the
newly killed text in a new element at the beginning of the kill ring or
adds it to the most recent element. It determines automatically (using
last-command
) whether the previous command was a kill command,
and if so appends the killed text to the most recent entry.
This function kills the text in the region defined by start and
end. The text is deleted but saved in the kill ring, along with
its text properties. The value is always nil
.
In an interactive call, start and end are point and the mark.
If the buffer or text is read-only, kill-region
modifies the kill
ring just the same, then signals an error without modifying the buffer.
This is convenient because it lets the user use a series of kill
commands to copy text from a read-only buffer into the kill ring.
If this option is non-nil
, kill-region
does not signal an
error if the buffer or text is read-only. Instead, it simply returns,
updating the kill ring but not changing the buffer.
This command saves the region defined by start and end on
the kill ring (including text properties), but does not delete the text
from the buffer. It returns nil
.
The command does not set this-command
to kill-region
, so a
subsequent kill command does not append to the same kill ring entry.
In Lisp programs, it is better to use kill-new
or
kill-append
instead of this command. See section Low-Level Kill Ring.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Yanking means inserting text from the kill ring, but it does not
insert the text blindly. The yank
command, and related
commands, use insert-for-yank
to perform special processing on
the text before it is inserted.
This function works like insert
, except that it processes the
text in string according to the yank-handler
text
property, as well as the variables yank-handled-properties
and
yank-excluded-properties
(see below), before inserting the
result into the current buffer.
This function resembles insert-buffer-substring
, except that it
processes the text according to yank-handled-properties
and
yank-excluded-properties
. (It does not handle the
yank-handler
property, which does not normally occur in buffer
text anyway.)
If you put a yank-handler
text property on all or part of a
string, that alters how insert-for-yank
inserts the string. If
different parts of the string have different yank-handler
values (comparison being done with eq
), each substring is
handled separately. The property value must be a list of one to four
elements, with the following format (where elements after the first
may be omitted):
(function param noexclude undo)
Here is what the elements do:
When function is non-nil
, it is called instead of
insert
to insert the string, with one argument—the string to
insert.
If param is present and non-nil
, it replaces string
(or the substring of string being processed) as the object
passed to function (or insert
). For example, if
function is yank-rectangle
, param should be a list
of strings to insert as a rectangle.
If noexclude is present and non-nil
, that disables the
normal action of yank-handled-properties
and
yank-excluded-properties
on the inserted string.
If undo is present and non-nil
, it is a function that will be
called by yank-pop
to undo the insertion of the current object.
It is called with two arguments, the start and end of the current
region. function can set yank-undo-function
to override
the undo value.
This variable specifies special text property handling conditions for
yanked text. It takes effect after the text has been inserted (either
normally, or via the yank-handler
property), and prior to
yank-excluded-properties
taking effect.
The value should be an alist of elements (prop
. fun)
. Each alist element is handled in order. The inserted
text is scanned for stretches of text having text properties eq
to prop; for each such stretch, fun is called with three
arguments: the value of the property, and the start and end positions
of the text.
The value of this variable is the list of properties to remove from
inserted text. Its default value contains properties that might lead
to annoying results, such as causing the text to respond to the mouse
or specifying key bindings. It takes effect after
yank-handled-properties
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes higher-level commands for yanking, which are
intended primarily for the user but useful also in Lisp programs.
Both yank
and yank-pop
honor the
yank-excluded-properties
variable and yank-handler
text
property (see section Yanking).
This command inserts before point the text at the front of the kill
ring. It sets the mark at the beginning of that text, using
push-mark
(see section The Mark), and puts point at the end.
If arg is a non-nil
list (which occurs interactively when
the user types C-u with no digits), then yank
inserts the
text as described above, but puts point before the yanked text and
sets the mark after it.
If arg is a number, then yank
inserts the argth
most recently killed text—the argth element of the kill ring
list, counted cyclically from the front, which is considered the
first element for this purpose.
yank
does not alter the contents of the kill ring, unless it
used text provided by another program, in which case it pushes that text
onto the kill ring. However if arg is an integer different from
one, it rotates the kill ring to place the yanked string at the front.
yank
returns nil
.
This command replaces the just-yanked entry from the kill ring with a different entry from the kill ring.
This is allowed only immediately after a yank
or another
yank-pop
. At such a time, the region contains text that was just
inserted by yanking. yank-pop
deletes that text and inserts in
its place a different piece of killed text. It does not add the deleted
text to the kill ring, since it is already in the kill ring somewhere.
It does however rotate the kill ring to place the newly yanked string at
the front.
If arg is nil
, then the replacement text is the previous
element of the kill ring. If arg is numeric, the replacement is
the argth previous kill. If arg is negative, a more recent
kill is the replacement.
The sequence of kills in the kill ring wraps around, so that after the oldest one comes the newest one, and before the newest one goes the oldest.
The return value is always nil
.
If this variable is non-nil
, the function yank-pop
uses
its value instead of delete-region
to delete the text
inserted by the previous yank
or
yank-pop
command. The value must be a function of two
arguments, the start and end of the current region.
The function insert-for-yank
automatically sets this variable
according to the undo element of the yank-handler
text property, if there is one.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions and variables provide access to the kill ring at a lower level, but are still convenient for use in Lisp programs, because they take care of interaction with window system selections (see section Window System Selections).
The function current-kill
rotates the yanking pointer, which
designates the “front” of the kill ring, by n places (from newer
kills to older ones), and returns the text at that place in the ring.
If the optional second argument do-not-move is non-nil
,
then current-kill
doesn’t alter the yanking pointer; it just
returns the nth kill, counting from the current yanking pointer.
If n is zero, indicating a request for the latest kill,
current-kill
calls the value of
interprogram-paste-function
(documented below) before
consulting the kill ring. If that value is a function and calling it
returns a string or a list of several string, current-kill
pushes the strings onto the kill ring and returns the first string.
It also sets the yanking pointer to point to the kill-ring entry of
the first string returned by interprogram-paste-function
,
regardless of the value of do-not-move. Otherwise,
current-kill
does not treat a zero value for n specially:
it returns the entry pointed at by the yanking pointer and does not
move the yanking pointer.
This function pushes the text string onto the kill ring and
makes the yanking pointer point to it. It discards the oldest entry
if appropriate. It also invokes the value of
interprogram-cut-function
(see below).
If replace is non-nil
, then kill-new
replaces the
first element of the kill ring with string, rather than pushing
string onto the kill ring.
This function appends the text string to the first entry in the
kill ring and makes the yanking pointer point to the combined entry.
Normally string goes at the end of the entry, but if
before-p is non-nil
, it goes at the beginning. This
function also invokes the value of interprogram-cut-function
(see below).
This variable provides a way of transferring killed text from other
programs, when you are using a window system. Its value should be
nil
or a function of no arguments.
If the value is a function, current-kill
calls it to get the
“most recent kill”. If the function returns a non-nil
value,
then that value is used as the “most recent kill”. If it returns
nil
, then the front of the kill ring is used.
To facilitate support for window systems that support multiple
selections, this function may also return a list of strings. In that
case, the first string is used as the “most recent kill”, and all
the other strings are pushed onto the kill ring, for easy access by
yank-pop
.
The normal use of this function is to get the window system’s
clipboard as the most recent kill, even if the selection belongs to
another application. See section Window System Selections. However, if
the clipboard contents come from the current Emacs session, this
function should return nil
.
This variable provides a way of communicating killed text to other
programs, when you are using a window system. Its value should be
nil
or a function of one required argument.
If the value is a function, kill-new
and kill-append
call
it with the new first element of the kill ring as the argument.
The normal use of this function is to put newly killed text in the window system’s clipboard. See section Window System Selections.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The variable kill-ring
holds the kill ring contents, in the
form of a list of strings. The most recent kill is always at the front
of the list.
The kill-ring-yank-pointer
variable points to a link in the
kill ring list, whose CAR is the text to yank next. We say it
identifies the “front” of the ring. Moving
kill-ring-yank-pointer
to a different link is called
rotating the kill ring. We call the kill ring a “ring” because
the functions that move the yank pointer wrap around from the end of the
list to the beginning, or vice-versa. Rotation of the kill ring is
virtual; it does not change the value of kill-ring
.
Both kill-ring
and kill-ring-yank-pointer
are Lisp
variables whose values are normally lists. The word “pointer” in the
name of the kill-ring-yank-pointer
indicates that the variable’s
purpose is to identify one element of the list for use by the next yank
command.
The value of kill-ring-yank-pointer
is always eq
to one
of the links in the kill ring list. The element it identifies is the
CAR of that link. Kill commands, which change the kill ring, also
set this variable to the value of kill-ring
. The effect is to
rotate the ring so that the newly killed text is at the front.
Here is a diagram that shows the variable kill-ring-yank-pointer
pointing to the second entry in the kill ring ("some text" "a
different piece of text" "yet older text")
.
kill-ring ---- kill-ring-yank-pointer | | | v | --- --- --- --- --- --- --> | | |------> | | |--> | | |--> nil --- --- --- --- --- --- | | | | | | | | -->"yet older text" | | | --> "a different piece of text" | --> "some text"
This state of affairs might occur after C-y (yank
)
immediately followed by M-y (yank-pop
).
This variable holds the list of killed text sequences, most recently killed first.
This variable’s value indicates which element of the kill ring is at the
“front” of the ring for yanking. More precisely, the value is a tail
of the value of kill-ring
, and its CAR is the kill string
that C-y should yank.
The value of this variable is the maximum length to which the kill
ring can grow, before elements are thrown away at the end. The default
value for kill-ring-max
is 60.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Most buffers have an undo list, which records all changes made
to the buffer’s text so that they can be undone. (The buffers that
don’t have one are usually special-purpose buffers for which Emacs
assumes that undoing is not useful. In particular, any buffer whose
name begins with a space has its undo recording off by default;
see Buffer Names.) All the primitives that modify the
text in the buffer automatically add elements to the front of the undo
list, which is in the variable buffer-undo-list
.
This buffer-local variable’s value is the undo list of the current
buffer. A value of t
disables the recording of undo information.
Here are the kinds of elements an undo list can have:
position
This kind of element records a previous value of point; undoing this element moves point to position. Ordinary cursor motion does not make any sort of undo record, but deletion operations use these entries to record where point was before the command.
(beg . end)
This kind of element indicates how to delete text that was inserted. Upon insertion, the text occupied the range beg–end in the buffer.
(text . position)
This kind of element indicates how to reinsert text that was deleted.
The deleted text itself is the string text. The place to
reinsert it is (abs position)
. If position is
positive, point was at the beginning of the deleted text, otherwise it
was at the end. Zero or more (marker . adjustment)
elements follow immediately after this element.
(t . time-flag)
This kind of element indicates that an unmodified buffer became
modified. A time-flag of the form
(sec-high sec-low microsec
picosec)
represents the visited file’s modification time as of
when it was previously visited or saved, using the same format as
current-time
; see Time of Day.
A time-flag of 0 means the buffer does not correspond to any file;
-1 means the visited file previously did not exist.
primitive-undo
uses these
values to determine whether to mark the buffer as unmodified once again;
it does so only if the file’s status matches that of time-flag.
(nil property value beg . end)
This kind of element records a change in a text property. Here’s how you might undo the change:
(put-text-property beg end property value)
(marker . adjustment)
This kind of element records the fact that the marker marker was relocated due to deletion of surrounding text, and that it moved adjustment character positions. If the marker’s location is consistent with the (text . position) element preceding it in the undo list, then undoing this element moves marker - adjustment characters.
(apply funname . args)
This is an extensible undo item, which is undone by calling funname with arguments args.
(apply delta beg end funname . args)
This is an extensible undo item, which records a change limited to the range beg to end, which increased the size of the buffer by delta characters. It is undone by calling funname with arguments args.
This kind of element enables undo limited to a region to determine whether the element pertains to that region.
nil
This element is a boundary. The elements between two boundaries are called a change group; normally, each change group corresponds to one keyboard command, and undo commands normally undo an entire group as a unit.
This function places a boundary element in the undo list. The undo
command stops at such a boundary, and successive undo commands undo
to earlier and earlier boundaries. This function returns nil
.
The editor command loop automatically calls undo-boundary
just
before executing each key sequence, so that each undo normally undoes
the effects of one command. As an exception, the command
self-insert-command
, which produces self-inserting input
characters (see section User-Level Insertion Commands), may remove the boundary
inserted by the command loop: a boundary is accepted for the first
such character, the next 19 consecutive self-inserting input
characters do not have boundaries, and then the 20th does; and so on
as long as the self-inserting characters continue. Hence, sequences
of consecutive character insertions can be undone as a group.
All buffer modifications add a boundary whenever the previous undoable change was made in some other buffer. This is to ensure that each command makes a boundary in each buffer where it makes changes.
Calling this function explicitly is useful for splitting the effects of
a command into more than one unit. For example, query-replace
calls undo-boundary
after each replacement, so that the user can
undo individual replacements one by one.
This variable is normally nil
, but the undo commands bind it to
t
. This is so that various kinds of change hooks can tell when
they’re being called for the sake of undoing.
This is the basic function for undoing elements of an undo list. It undoes the first count elements of list, returning the rest of list.
primitive-undo
adds elements to the buffer’s undo list when it
changes the buffer. Undo commands avoid confusion by saving the undo
list value at the beginning of a sequence of undo operations. Then the
undo operations use and update the saved value. The new elements added
by undoing are not part of this saved value, so they don’t interfere with
continuing to undo.
This function does not bind undo-in-progress
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to enable and disable undo information for a given buffer. It also explains how the undo list is truncated automatically so it doesn’t get too big.
Recording of undo information in a newly created buffer is normally
enabled to start with; but if the buffer name starts with a space, the
undo recording is initially disabled. You can explicitly enable or
disable undo recording with the following two functions, or by setting
buffer-undo-list
yourself.
This command enables recording undo information for buffer
buffer-or-name, so that subsequent changes can be undone. If no
argument is supplied, then the current buffer is used. This function
does nothing if undo recording is already enabled in the buffer. It
returns nil
.
In an interactive call, buffer-or-name is the current buffer. You cannot specify any other buffer.
This function discards the undo list of buffer-or-name, and disables further recording of undo information. As a result, it is no longer possible to undo either previous changes or any subsequent changes. If the undo list of buffer-or-name is already disabled, this function has no effect.
In an interactive call, BUFFER-OR-NAME is the current buffer. You
cannot specify any other buffer. This function returns nil
.
As editing continues, undo lists get longer and longer. To prevent
them from using up all available memory space, garbage collection trims
them back to size limits you can set. (For this purpose, the “size”
of an undo list measures the cons cells that make up the list, plus the
strings of deleted text.) Three variables control the range of acceptable
sizes: undo-limit
, undo-strong-limit
and
undo-outer-limit
. In these variables, size is counted as the
number of bytes occupied, which includes both saved text and other
data.
This is the soft limit for the acceptable size of an undo list. The change group at which this size is exceeded is the last one kept.
This is the upper limit for the acceptable size of an undo list. The
change group at which this size is exceeded is discarded itself (along
with all older change groups). There is one exception: the very latest
change group is only discarded if it exceeds undo-outer-limit
.
If at garbage collection time the undo info for the current command exceeds this limit, Emacs discards the info and displays a warning. This is a last ditch limit to prevent memory overflow.
If this variable is non-nil
, when the undo info exceeds
undo-outer-limit
, Emacs asks in the echo area whether to
discard the info. The default value is nil
, which means to
discard it automatically.
This option is mainly intended for debugging. Garbage collection is inhibited while the question is asked, which means that Emacs might leak memory if the user waits too long before answering the question.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Filling means adjusting the lengths of lines (by moving the line
breaks) so that they are nearly (but no greater than) a specified
maximum width. Additionally, lines can be justified, which means
inserting spaces to make the left and/or right margins line up
precisely. The width is controlled by the variable fill-column
.
For ease of reading, lines should be no longer than 70 or so columns.
You can use Auto Fill mode (see section Auto Filling) to fill text automatically as you insert it, but changes to existing text may leave it improperly filled. Then you must fill the text explicitly.
Most of the commands in this section return values that are not
meaningful. All the functions that do filling take note of the current
left margin, current right margin, and current justification style
(see section Margins for Filling). If the current justification style is
none
, the filling functions don’t actually do anything.
Several of the filling functions have an argument justify.
If it is non-nil
, that requests some kind of justification. It
can be left
, right
, full
, or center
, to
request a specific style of justification. If it is t
, that
means to use the current justification style for this part of the text
(see current-justification
, below). Any other value is treated
as full
.
When you call the filling functions interactively, using a prefix
argument implies the value full
for justify.
This command fills the paragraph at or after point. If
justify is non-nil
, each line is justified as well.
It uses the ordinary paragraph motion commands to find paragraph
boundaries. See Paragraphs in The GNU Emacs Manual.
When region is non-nil
, then if Transient Mark mode is
enabled and the mark is active, this command calls fill-region
to fill all the paragraphs in the region, instead of filling only the
current paragraph. When this command is called interactively,
region is t
.
This command fills each of the paragraphs in the region from start
to end. It justifies as well if justify is
non-nil
.
If nosqueeze is non-nil
, that means to leave whitespace
other than line breaks untouched. If to-eop is non-nil
,
that means to keep filling to the end of the paragraph—or the next hard
newline, if use-hard-newlines
is enabled (see below).
The variable paragraph-separate
controls how to distinguish
paragraphs. See section Standard Regular Expressions Used in Editing.
This command fills each paragraph in the region according to its individual fill prefix. Thus, if the lines of a paragraph were indented with spaces, the filled paragraph will remain indented in the same fashion.
The first two arguments, start and end, are the beginning
and end of the region to be filled. The third and fourth arguments,
justify and citation-regexp, are optional. If
justify is non-nil
, the paragraphs are justified as
well as filled. If citation-regexp is non-nil
, it means the
function is operating on a mail message and therefore should not fill
the header lines. If citation-regexp is a string, it is used as
a regular expression; if it matches the beginning of a line, that line
is treated as a citation marker.
Ordinarily, fill-individual-paragraphs
regards each change in
indentation as starting a new paragraph. If
fill-individual-varying-indent
is non-nil
, then only
separator lines separate paragraphs. That mode can handle indented
paragraphs with additional indentation on the first line.
This variable alters the action of fill-individual-paragraphs
as
described above.
This command considers a region of text as a single paragraph and fills
it. If the region was made up of many paragraphs, the blank lines
between paragraphs are removed. This function justifies as well as
filling when justify is non-nil
.
If nosqueeze is non-nil
, that means to leave whitespace
other than line breaks untouched. If squeeze-after is
non-nil
, it specifies a position in the region, and means don’t
canonicalize spaces before that position.
In Adaptive Fill mode, this command calls fill-context-prefix
to
choose a fill prefix by default. See section Adaptive Fill Mode.
This command inserts spaces between the words of the current line so
that the line ends exactly at fill-column
. It returns
nil
.
The argument how, if non-nil
specifies explicitly the style
of justification. It can be left
, right
, full
,
center
, or none
. If it is t
, that means to do
follow specified justification style (see current-justification
,
below). nil
means to do full justification.
If eop is non-nil
, that means do only left-justification
if current-justification
specifies full justification. This is
used for the last line of a paragraph; even if the paragraph as a
whole is fully justified, the last line should not be.
If nosqueeze is non-nil
, that means do not change interior
whitespace.
This variable’s value specifies the style of justification to use for
text that doesn’t specify a style with a text property. The possible
values are left
, right
, full
, center
, or
none
. The default value is left
.
This function returns the proper justification style to use for filling the text around point.
This returns the value of the justification
text property at
point, or the variable default-justification if there is no such
text property. However, it returns nil
rather than none
to mean “don’t justify”.
If this variable is non-nil
, a period followed by just one space
does not count as the end of a sentence, and the filling functions
avoid breaking the line at such a place.
If this variable is non-nil
, a sentence can end without a
period. This is used for languages like Thai, where sentences end
with a double space but without a period.
If this variable is non-nil
, it should be a string of
characters that can end a sentence without following spaces.
This variable provides a way to override the filling of paragraphs.
If its value is non-nil
, fill-paragraph
calls this
function to do the work. If the function returns a non-nil
value, fill-paragraph
assumes the job is done, and immediately
returns that value.
The usual use of this feature is to fill comments in programming language modes. If the function needs to fill a paragraph in the usual way, it can do so as follows:
(let ((fill-paragraph-function nil)) (fill-paragraph arg))
This variable provides a way to override how the filling functions,
such as fill-region
and fill-paragraph
, move forward to
the next paragraph. Its value should be a function, which is called
with a single argument n, the number of paragraphs to move, and
should return the difference between n and the number of
paragraphs actually moved. The default value of this variable is
forward-paragraph
. See Paragraphs in The GNU Emacs
Manual.
If this variable is non-nil
, the filling functions do not delete
newlines that have the hard
text property. These “hard
newlines” act as paragraph separators. See Hard and Soft Newlines in The GNU Emacs Manual.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This buffer-local variable, if non-nil
, specifies a string of
text that appears at the beginning of normal text lines and should be
disregarded when filling them. Any line that fails to start with the
fill prefix is considered the start of a paragraph; so is any line
that starts with the fill prefix followed by additional whitespace.
Lines that start with the fill prefix but no additional whitespace are
ordinary text lines that can be filled together. The resulting filled
lines also start with the fill prefix.
The fill prefix follows the left margin whitespace, if any.
This buffer-local variable specifies the maximum width of filled lines. Its value should be an integer, which is a number of columns. All the filling, justification, and centering commands are affected by this variable, including Auto Fill mode (see section Auto Filling).
As a practical matter, if you are writing text for other people to
read, you should set fill-column
to no more than 70. Otherwise
the line will be too long for people to read comfortably, and this can
make the text seem clumsy.
The default value for fill-column
is 70.
This sets the left-margin
property on the text from from to
to to the value margin. If Auto Fill mode is enabled, this
command also refills the region to fit the new margin.
This sets the right-margin
property on the text from from
to to to the value margin. If Auto Fill mode is enabled,
this command also refills the region to fit the new margin.
This function returns the proper left margin value to use for filling
the text around point. The value is the sum of the left-margin
property of the character at the start of the current line (or zero if
none), and the value of the variable left-margin
.
This function returns the proper fill column value to use for filling
the text around point. The value is the value of the fill-column
variable, minus the value of the right-margin
property of the
character after point.
This function moves point to the left margin of the current line. The
column moved to is determined by calling the function
current-left-margin
. If the argument n is non-nil
,
move-to-left-margin
moves forward n-1 lines first.
If force is non-nil
, that says to fix the line’s
indentation if that doesn’t match the left margin value.
This function removes left margin indentation from the text between
from and to. The amount of indentation to delete is
determined by calling current-left-margin
. In no case does this
function delete non-whitespace. If from and to are omitted,
they default to the whole buffer.
This function adjusts the indentation at the beginning of the current
line to the value specified by the variable left-margin
. (That
may involve either inserting or deleting whitespace.) This function
is value of indent-line-function
in Paragraph-Indent Text mode.
This variable specifies the base left margin column. In Fundamental mode, RET indents to this column. This variable automatically becomes buffer-local when set in any fashion.
This variable gives major modes a way to specify not to break a line
at certain places. Its value should be a list of functions. Whenever
filling considers breaking the line at a certain place in the buffer,
it calls each of these functions with no arguments and with point
located at that place. If any of the functions returns
non-nil
, then the line won’t be broken there.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Adaptive Fill Mode is enabled, Emacs determines the fill prefix automatically from the text in each paragraph being filled rather than using a predetermined value. During filling, this fill prefix gets inserted at the start of the second and subsequent lines of the paragraph as described in Filling, and in Auto Filling.
Adaptive Fill mode is enabled when this variable is non-nil
.
It is t
by default.
This function implements the heart of Adaptive Fill mode; it chooses a fill prefix based on the text between from and to, typically the start and end of a paragraph. It does this by looking at the first two lines of the paragraph, based on the variables described below.
Usually, this function returns the fill prefix, a string. However,
before doing this, the function makes a final check (not specially
mentioned in the following) that a line starting with this prefix
wouldn’t look like the start of a paragraph. Should this happen, the
function signals the anomaly by returning nil
instead.
In detail, fill-context-prefix
does this:
adaptive-fill-function
(if any),
then the regular expression adaptive-fill-regexp
(see below).
The first non-nil
result of these, or the empty string if
they’re both nil
, becomes the first line’s candidate.
adaptive-fill-first-line-regexp
below).
nil
.
Adaptive Fill mode matches this regular expression against the text starting after the left margin whitespace (if any) on a line; the characters it matches are that line’s candidate for the fill prefix.
The default value matches whitespace with certain punctuation characters intermingled.
Used only in one-line paragraphs, this regular expression acts as an
additional check of the validity of the one available candidate fill
prefix: the candidate must match this regular expression, or match
comment-start-skip
. If it doesn’t, fill-context-prefix
replaces the candidate with a string of spaces “of the same width”
as it.
The default value of this variable is "\\`[ \t]*\\'"
, which
matches only a string of whitespace. The effect of this default is to
force the fill prefixes found in one-line paragraphs always to be pure
whitespace.
You can specify more complex ways of choosing a fill prefix
automatically by setting this variable to a function. The function is
called with point after the left margin (if any) of a line, and it
must preserve point. It should return either “that line’s” fill
prefix or nil
, meaning it has failed to determine a prefix.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Auto Fill mode is a minor mode that fills lines automatically as text is inserted. This section describes the hook used by Auto Fill mode. For a description of functions that you can call explicitly to fill and justify existing text, see Filling.
Auto Fill mode also enables the functions that change the margins and justification style to refill portions of the text. See section Margins for Filling.
The value of this buffer-local variable should be a function (of no
arguments) to be called after self-inserting a character from the table
auto-fill-chars
. It may be nil
, in which case nothing
special is done in that case.
The value of auto-fill-function
is do-auto-fill
when
Auto-Fill mode is enabled. That is a function whose sole purpose is to
implement the usual strategy for breaking a line.
This variable specifies the function to use for
auto-fill-function
, if and when Auto Fill is turned on. Major
modes can set buffer-local values for this variable to alter how Auto
Fill works.
A char table of characters which invoke auto-fill-function
when
self-inserted—space and newline in most language environments. They
have an entry t
in the table.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The sorting functions described in this section all rearrange text in
a buffer. This is in contrast to the function sort
, which
rearranges the order of the elements of a list (see section Functions that Rearrange Lists).
The values returned by these functions are not meaningful.
This function is the general text-sorting routine that subdivides a buffer into records and then sorts them. Most of the commands in this section use this function.
To understand how sort-subr
works, consider the whole accessible
portion of the buffer as being divided into disjoint pieces called
sort records. The records may or may not be contiguous, but they
must not overlap. A portion of each sort record (perhaps all of it) is
designated as the sort key. Sorting rearranges the records in order by
their sort keys.
Usually, the records are rearranged in order of ascending sort key.
If the first argument to the sort-subr
function, reverse,
is non-nil
, the sort records are rearranged in order of
descending sort key.
The next four arguments to sort-subr
are functions that are
called to move point across a sort record. They are called many times
from within sort-subr
.
sort-subr
is
called. Therefore, you should usually move point to the beginning of
the buffer before calling sort-subr
.
This function can indicate there are no more sort records by leaving point at the end of the buffer.
nil
value to be used as the sort key, or
return nil
to indicate that the sort key is in the buffer
starting at point. In the latter case, endkeyfun is called to
find the end of the sort key.
nil
and this argument is omitted (or
nil
), then the sort key extends to the end of the record. There
is no need for endkeyfun if startkeyfun returns a
non-nil
value.
The argument predicate is the function to use to compare keys.
If keys are numbers, it defaults to <
; otherwise it defaults to
string<
.
As an example of sort-subr
, here is the complete function
definition for sort-lines
:
;; Note that the first two lines of doc string ;; are effectively one line when viewed by a user. (defun sort-lines (reverse beg end) "Sort lines in region alphabetically;\ argument means descending order. Called from a program, there are three arguments:
REVERSE (non-nil means reverse order),\ BEG and END (region to sort). The variable `sort-fold-case' determines\ whether alphabetic case affects the sort order."
(interactive "P\nr") (save-excursion (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (let ((inhibit-field-text-motion t)) (sort-subr reverse 'forward-line 'end-of-line)))))
Here forward-line
moves point to the start of the next record,
and end-of-line
moves point to the end of record. We do not pass
the arguments startkeyfun and endkeyfun, because the entire
record is used as the sort key.
The sort-paragraphs
function is very much the same, except that
its sort-subr
call looks like this:
(sort-subr reverse (function (lambda () (while (and (not (eobp)) (looking-at paragraph-separate)) (forward-line 1)))) 'forward-paragraph)
Markers pointing into any sort records are left with no useful
position after sort-subr
returns.
If this variable is non-nil
, sort-subr
and the other
buffer sorting functions ignore case when comparing strings.
This command sorts the region between start and end alphabetically as specified by record-regexp and key-regexp. If reverse is a negative integer, then sorting is in reverse order.
Alphabetical sorting means that two sort keys are compared by comparing the first characters of each, the second characters of each, and so on. If a mismatch is found, it means that the sort keys are unequal; the sort key whose character is less at the point of first mismatch is the lesser sort key. The individual characters are compared according to their numerical character codes in the Emacs character set.
The value of the record-regexp argument specifies how to divide the buffer into sort records. At the end of each record, a search is done for this regular expression, and the text that matches it is taken as the next record. For example, the regular expression ‘^.+$’, which matches lines with at least one character besides a newline, would make each such line into a sort record. See section Regular Expressions, for a description of the syntax and meaning of regular expressions.
The value of the key-regexp argument specifies what part of each record is the sort key. The key-regexp could match the whole record, or only a part. In the latter case, the rest of the record has no effect on the sorted order of records, but it is carried along when the record moves to its new position.
The key-regexp argument can refer to the text matched by a subexpression of record-regexp, or it can be a regular expression on its own.
If key-regexp is:
then the text matched by the digitth ‘\(...\)’ parenthesis grouping in record-regexp is the sort key.
then the whole record is the sort key.
then sort-regexp-fields
searches for a match for the regular
expression within the record. If such a match is found, it is the sort
key. If there is no match for key-regexp within a record then
that record is ignored, which means its position in the buffer is not
changed. (The other records may move around it.)
For example, if you plan to sort all the lines in the region by the first word on each line starting with the letter ‘f’, you should set record-regexp to ‘^.*$’ and set key-regexp to ‘\<f\w*\>’. The resulting expression looks like this:
(sort-regexp-fields nil "^.*$" "\\<f\\w*\\>" (region-beginning) (region-end))
If you call sort-regexp-fields
interactively, it prompts for
record-regexp and key-regexp in the minibuffer.
This command alphabetically sorts lines in the region between
start and end. If reverse is non-nil
, the sort
is in reverse order.
This command alphabetically sorts paragraphs in the region between
start and end. If reverse is non-nil
, the sort
is in reverse order.
This command alphabetically sorts pages in the region between
start and end. If reverse is non-nil
, the sort
is in reverse order.
This command sorts lines in the region between start and end, comparing them alphabetically by the fieldth field of each line. Fields are separated by whitespace and numbered starting from 1. If field is negative, sorting is by the -fieldth field from the end of the line. This command is useful for sorting tables.
This command sorts lines in the region between start and end, comparing them numerically by the fieldth field of each line. Fields are separated by whitespace and numbered starting from 1. The specified field must contain a number in each line of the region. Numbers starting with 0 are treated as octal, and numbers starting with ‘0x’ are treated as hexadecimal.
If field is negative, sorting is by the -fieldth field from the end of the line. This command is useful for sorting tables.
This variable specifies the default radix for
sort-numeric-fields
to parse numbers.
This command sorts the lines in the region between beg and end, comparing them alphabetically by a certain range of columns. The column positions of beg and end bound the range of columns to sort on.
If reverse is non-nil
, the sort is in reverse order.
One unusual thing about this command is that the entire line containing position beg, and the entire line containing position end, are included in the region sorted.
Note that sort-columns
rejects text that contains tabs, because
tabs could be split across the specified columns. Use M-x
untabify to convert tabs to spaces before sorting.
When possible, this command actually works by calling the sort
utility program.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The column functions convert between a character position (counting characters from the beginning of the buffer) and a column position (counting screen characters from the beginning of a line).
These functions count each character according to the number of
columns it occupies on the screen. This means control characters count
as occupying 2 or 4 columns, depending upon the value of
ctl-arrow
, and tabs count as occupying a number of columns that
depends on the value of tab-width
and on the column where the tab
begins. See section Usual Display Conventions.
Column number computations ignore the width of the window and the amount of horizontal scrolling. Consequently, a column value can be arbitrarily high. The first (or leftmost) column is numbered 0. They also ignore overlays and text properties, aside from invisibility.
This function returns the horizontal position of point, measured in columns, counting from 0 at the left margin. The column position is the sum of the widths of all the displayed representations of the characters between the start of the current line and point.
For an example of using current-column
, see the description of
count-lines
in Motion by Text Lines.
This function moves point to column in the current line. The calculation of column takes into account the widths of the displayed representations of the characters between the start of the line and point.
When called interactively, column is the value of prefix numeric argument. If column is not an integer, an error is signaled.
If it is impossible to move to column column because that is in
the middle of a multicolumn character such as a tab, point moves to the
end of that character. However, if force is non-nil
, and
column is in the middle of a tab, then move-to-column
converts the tab into spaces so that it can move precisely to column
column. Other multicolumn characters can cause anomalies despite
force, since there is no way to split them.
The argument force also has an effect if the line isn’t long
enough to reach column column; if it is t
, that means to
add whitespace at the end of the line to reach that column.
The return value is the column number actually moved to.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The indentation functions are used to examine, move to, and change whitespace that is at the beginning of a line. Some of the functions can also change whitespace elsewhere on a line. Columns and indentation count from zero at the left margin.
31.17.1 Indentation Primitives | Functions used to count and insert indentation. | |
31.17.2 Indentation Controlled by Major Mode | Customize indentation for different modes. | |
31.17.3 Indenting an Entire Region | Indent all the lines in a region. | |
31.17.4 Indentation Relative to Previous Lines | Indent the current line based on previous lines. | |
31.17.5 Adjustable “Tab Stops” | Adjustable, typewriter-like tab stops. | |
31.17.6 Indentation-Based Motion Commands | Move to first non-blank character. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the primitive functions used to count and insert indentation. The functions in the following sections use these primitives. See section Size of Displayed Text, for related functions.
This function returns the indentation of the current line, which is the horizontal position of the first nonblank character. If the contents are entirely blank, then this is the horizontal position of the end of the line.
This function indents from point with tabs and spaces until column
is reached. If minimum is specified and non-nil
, then at
least that many spaces are inserted even if this requires going beyond
column. Otherwise the function does nothing if point is already
beyond column. The value is the column at which the inserted
indentation ends.
The inserted whitespace characters inherit text properties from the surrounding text (usually, from the preceding text only). See section Stickiness of Text Properties.
If this variable is non-nil
, indentation functions can insert
tabs as well as spaces. Otherwise, they insert only spaces. Setting
this variable automatically makes it buffer-local in the current buffer.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An important function of each major mode is to customize the TAB key to indent properly for the language being edited. This section describes the mechanism of the TAB key and how to control it. The functions in this section return unpredictable values.
This is the command bound to TAB in most editing modes. Its usual action is to indent the current line, but it can alternatively insert a tab character or indent a region.
Here is what it does:
indent-region
to indent all the
text in the region (see section Indenting an Entire Region).
indent-line-function
is indent-to-left-margin
(a trivial command that inserts a tab
character), or if the variable tab-always-indent
specifies that
a tab character ought to be inserted (see below), then it inserts a
tab character.
indent-line-function
. If the line is already
indented, and the value of tab-always-indent
is complete
(see below), it tries completing the text at point.
If rigid is non-nil
(interactively, with a prefix
argument), then after this command indents a line or inserts a tab, it
also rigidly indents the entire balanced expression which starts at
the beginning of the current line, in order to reflect the new
indentation. This argument is ignored if the command indents the
region.
This variable’s value is the function to be used by
indent-for-tab-command
, and various other indentation commands,
to indent the current line. It is usually assigned by the major mode;
for instance, Lisp mode sets it to lisp-indent-line
, C mode
sets it to c-indent-line
, and so on. The default value is
indent-relative
. See section Automatic Indentation of code.
This command calls the function in indent-line-function
to
indent the current line in a way appropriate for the current major mode.
This function inserts a newline, then indents the new line (the one
following the newline just inserted) according to the major mode. It
does indentation by calling indent-according-to-mode
.
This command reindents the current line, inserts a newline at point,
and then indents the new line (the one following the newline just
inserted). It does indentation on both lines by calling
indent-according-to-mode
.
This variable can be used to customize the behavior of the TAB
(indent-for-tab-command
) command. If the value is t
(the default), the command normally just indents the current line. If
the value is nil
, the command indents the current line only if
point is at the left margin or in the line’s indentation; otherwise,
it inserts a tab character. If the value is complete
, the
command first tries to indent the current line, and if the line was
already indented, it calls completion-at-point
to complete the
text at point (see section Completion in Ordinary Buffers).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes commands that indent all the lines in the region. They return unpredictable values.
This command indents each nonblank line starting between start
(inclusive) and end (exclusive). If to-column is
nil
, indent-region
indents each nonblank line by calling
the current mode’s indentation function, the value of
indent-line-function
.
If to-column is non-nil
, it should be an integer
specifying the number of columns of indentation; then this function
gives each line exactly that much indentation, by either adding or
deleting whitespace.
If there is a fill prefix, indent-region
indents each line
by making it start with the fill prefix.
The value of this variable is a function that can be used by
indent-region
as a short cut. It should take two arguments, the
start and end of the region. You should design the function so
that it will produce the same results as indenting the lines of the
region one by one, but presumably faster.
If the value is nil
, there is no short cut, and
indent-region
actually works line by line.
A short-cut function is useful in modes such as C mode and Lisp mode,
where the indent-line-function
must scan from the beginning of
the function definition: applying it to each line would be quadratic in
time. The short cut can update the scan information as it moves through
the lines indenting them; this takes linear time. In a mode where
indenting a line individually is fast, there is no need for a short cut.
indent-region
with a non-nil
argument to-column has
a different meaning and does not use this variable.
This function indents all lines starting between start (inclusive) and end (exclusive) sideways by count columns. This “preserves the shape” of the affected region, moving it as a rigid unit.
This is useful not only for indenting regions of unindented text, but also for indenting regions of formatted code. For example, if count is 3, this command adds 3 columns of indentation to every line that begins in the specified region.
If called interactively with no prefix argument, this command invokes a transient mode for adjusting indentation rigidly. See Indentation Commands in The GNU Emacs Manual.
This is like indent-rigidly
, except that it doesn’t alter lines
that start within strings or comments.
In addition, it doesn’t alter a line if nochange-regexp matches at
the beginning of the line (if nochange-regexp is non-nil
).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes two commands that indent the current line based on the contents of previous lines.
This command inserts whitespace at point, extending to the same column as the next indent point of the previous nonblank line. An indent point is a non-whitespace character following whitespace. The next indent point is the first one at a column greater than the current column of point. For example, if point is underneath and to the left of the first non-blank character of a line of text, it moves to that column by inserting whitespace.
If the previous nonblank line has no next indent point (i.e., none at a
great enough column position), indent-relative
either does
nothing (if unindented-ok is non-nil
) or calls
tab-to-tab-stop
. Thus, if point is underneath and to the right
of the last column of a short line of text, this command ordinarily
moves point to the next tab stop by inserting whitespace.
The return value of indent-relative
is unpredictable.
In the following example, point is at the beginning of the second line:
This line is indented twelve spaces. ∗The quick brown fox jumped.
Evaluation of the expression (indent-relative nil)
produces the
following:
This line is indented twelve spaces. ∗The quick brown fox jumped.
In this next example, point is between the ‘m’ and ‘p’ of ‘jumped’:
This line is indented twelve spaces. The quick brown fox jum∗ped.
Evaluation of the expression (indent-relative nil)
produces the
following:
This line is indented twelve spaces. The quick brown fox jum ∗ped.
This command indents the current line like the previous nonblank line,
by calling indent-relative
with t
as the
unindented-ok argument. The return value is unpredictable.
If the previous nonblank line has no indent points beyond the current column, this command does nothing.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section explains the mechanism for user-specified “tab stops” and the mechanisms that use and set them. The name “tab stops” is used because the feature is similar to that of the tab stops on a typewriter. The feature works by inserting an appropriate number of spaces and tab characters to reach the next tab stop column; it does not affect the display of tab characters in the buffer (see section Usual Display Conventions). Note that the TAB character as input uses this tab stop feature only in a few major modes, such as Text mode. See Tab Stops in The GNU Emacs Manual.
This command inserts spaces or tabs before point, up to the next tab
stop column defined by tab-stop-list
.
This variable defines the tab stop columns used by tab-to-tab-stop
.
It should be either nil
, or a list of increasing integers,
which need not be evenly spaced. The list is implicitly
extended to infinity through repetition of the interval between the
last and penultimate elements (or tab-width
if the list has
fewer than two elements). A value of nil
means a tab stop
every tab-width
columns.
Use M-x edit-tab-stops to edit the location of tab stops interactively.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These commands, primarily for interactive use, act based on the indentation in the text.
This command moves point to the first non-whitespace character in the
current line (which is the line in which point is located). It returns
nil
.
This command moves point backward arg lines and then to the
first nonblank character on that line. It returns nil
.
If arg is omitted or nil
, it defaults to 1.
This command moves point forward arg lines and then to the first
nonblank character on that line. It returns nil
.
If arg is omitted or nil
, it defaults to 1.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The case change commands described here work on text in the current buffer. See section Case Conversion in Lisp, for case conversion functions that work on strings and characters. See section The Case Table, for how to customize which characters are upper or lower case and how to convert them.
This function capitalizes all words in the region defined by
start and end. To capitalize means to convert each word’s
first character to upper case and convert the rest of each word to lower
case. The function returns nil
.
If one end of the region is in the middle of a word, the part of the word within the region is treated as an entire word.
When capitalize-region
is called interactively, start and
end are point and the mark, with the smallest first.
---------- Buffer: foo ---------- This is the contents of the 5th foo. ---------- Buffer: foo ----------
(capitalize-region 1 37) ⇒ nil ---------- Buffer: foo ---------- This Is The Contents Of The 5th Foo. ---------- Buffer: foo ----------
This function converts all of the letters in the region defined by
start and end to lower case. The function returns
nil
.
When downcase-region
is called interactively, start and
end are point and the mark, with the smallest first.
This function converts all of the letters in the region defined by
start and end to upper case. The function returns
nil
.
When upcase-region
is called interactively, start and
end are point and the mark, with the smallest first.
This function capitalizes count words after point, moving point
over as it does. To capitalize means to convert each word’s first
character to upper case and convert the rest of each word to lower case.
If count is negative, the function capitalizes the
-count previous words but does not move point. The value
is nil
.
If point is in the middle of a word, the part of the word before point is ignored when moving forward. The rest is treated as an entire word.
When capitalize-word
is called interactively, count is
set to the numeric prefix argument.
This function converts the count words after point to all lower
case, moving point over as it does. If count is negative, it
converts the -count previous words but does not move point.
The value is nil
.
When downcase-word
is called interactively, count is set
to the numeric prefix argument.
This function converts the count words after point to all upper
case, moving point over as it does. If count is negative, it
converts the -count previous words but does not move point.
The value is nil
.
When upcase-word
is called interactively, count is set to
the numeric prefix argument.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each character position in a buffer or a string can have a text property list, much like the property list of a symbol (see section Property Lists). The properties belong to a particular character at a particular place, such as, the letter ‘T’ at the beginning of this sentence or the first ‘o’ in ‘foo’—if the same character occurs in two different places, the two occurrences in general have different properties.
Each property has a name and a value. Both of these can be any Lisp
object, but the name is normally a symbol. Typically each property
name symbol is used for a particular purpose; for instance, the text
property face
specifies the faces for displaying the character
(see section Properties with Special Meanings). The usual way to access the property
list is to specify a name and ask what value corresponds to it.
If a character has a category
property, we call it the
property category of the character. It should be a symbol. The
properties of the symbol serve as defaults for the properties of the
character.
Copying text between strings and buffers preserves the properties
along with the characters; this includes such diverse functions as
substring
, insert
, and buffer-substring
.
31.19.1 Examining Text Properties | Looking at the properties of one character. | |
31.19.2 Changing Text Properties | Setting the properties of a range of text. | |
31.19.3 Text Property Search Functions | Searching for where a property changes value. | |
31.19.4 Properties with Special Meanings | Particular properties with special meanings. | |
31.19.5 Formatted Text Properties | Properties for representing formatting of text. | |
31.19.6 Stickiness of Text Properties | How inserted text gets properties from neighboring text. | |
31.19.7 Lazy Computation of Text Properties | Computing text properties in a lazy fashion only when text is examined. | |
31.19.8 Defining Clickable Text | Using text properties to make regions of text do something when you click on them. | |
31.19.9 Defining and Using Fields | The field property defines
fields within the buffer.
| |
31.19.10 Why Text Properties are not Intervals | Why text properties do not use Lisp-visible text intervals. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The simplest way to examine text properties is to ask for the value of
a particular property of a particular character. For that, use
get-text-property
. Use text-properties-at
to get the
entire property list of a character. See section Text Property Search Functions, for
functions to examine the properties of a number of characters at once.
These functions handle both strings and buffers. Keep in mind that positions in a string start from 0, whereas positions in a buffer start from 1.
This function returns the value of the prop property of the character after position pos in object (a buffer or string). The argument object is optional and defaults to the current buffer.
If there is no prop property strictly speaking, but the character
has a property category that is a symbol, then get-text-property
returns
the prop property of that symbol.
This function is like get-text-property
, except that it checks
overlays first and then text properties. See section Overlays.
The argument object may be a string, a buffer, or a window. If it is a window, then the buffer displayed in that window is used for text properties and overlays, but only the overlays active for that window are considered. If object is a buffer, then overlays in that buffer are considered first, in order of decreasing priority, followed by the text properties. If object is a string, only text properties are considered, since strings never have overlays.
This function is like get-char-property
, except that it pays
attention to properties’ stickiness and overlays’ advancement settings
instead of the property of the character at (i.e. right after)
position.
This is like get-char-property
, but gives extra information
about the overlay that the property value comes from.
Its value is a cons cell whose CAR is the property value, the
same value get-char-property
would return with the same
arguments. Its CDR is the overlay in which the property was
found, or nil
, if it was found as a text property or not found
at all.
If position is at the end of object, both the CAR and
the CDR of the value are nil
.
This variable holds an alist which maps property names to a list of
alternative property names. If a character does not specify a direct
value for a property, the alternative property names are consulted in
order; the first non-nil
value is used. This variable takes
precedence over default-text-properties
, and category
properties take precedence over this variable.
This function returns the entire property list of the character at
position in the string or buffer object. If object is
nil
, it defaults to the current buffer.
This variable holds a property list giving default values for text
properties. Whenever a character does not specify a value for a
property, neither directly, through a category symbol, or through
char-property-alias-alist
, the value stored in this list is
used instead. Here is an example:
(setq default-text-properties '(foo 69) char-property-alias-alist nil) ;; Make sure character 1 has no properties of its own. (set-text-properties 1 2 nil) ;; What we get, when we ask, is the default value. (get-text-property 1 'foo) ⇒ 69
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The primitives for changing properties apply to a specified range of
text in a buffer or string. The function set-text-properties
(see end of section) sets the entire property list of the text in that
range; more often, it is useful to add, change, or delete just certain
properties specified by name.
Since text properties are considered part of the contents of the buffer (or string), and can affect how a buffer looks on the screen, any change in buffer text properties marks the buffer as modified. Buffer text property changes are undoable also (see section Undo). Positions in a string start from 0, whereas positions in a buffer start from 1.
This function sets the prop property to value for the text
between start and end in the string or buffer object.
If object is nil
, it defaults to the current buffer.
This function adds or overrides text properties for the text between
start and end in the string or buffer object. If
object is nil
, it defaults to the current buffer.
The argument props specifies which properties to add. It should have the form of a property list (see section Property Lists): a list whose elements include the property names followed alternately by the corresponding values.
The return value is t
if the function actually changed some
property’s value; nil
otherwise (if props is nil
or
its values agree with those in the text).
For example, here is how to set the comment
and face
properties of a range of text:
(add-text-properties start end '(comment t face highlight))
This function deletes specified text properties from the text between
start and end in the string or buffer object. If
object is nil
, it defaults to the current buffer.
The argument props specifies which properties to delete. It
should have the form of a property list (see section Property Lists): a list
whose elements are property names alternating with corresponding values.
But only the names matter—the values that accompany them are ignored.
For example, here’s how to remove the face
property.
(remove-text-properties start end '(face nil))
The return value is t
if the function actually changed some
property’s value; nil
otherwise (if props is nil
or
if no character in the specified text had any of those properties).
To remove all text properties from certain text, use
set-text-properties
and specify nil
for the new property
list.
Like remove-text-properties
except that
list-of-properties is a list of property names only, not an
alternating list of property names and values.
This function completely replaces the text property list for the text
between start and end in the string or buffer object.
If object is nil
, it defaults to the current buffer.
The argument props is the new property list. It should be a list whose elements are property names alternating with corresponding values.
After set-text-properties
returns, all the characters in the
specified range have identical properties.
If props is nil
, the effect is to get rid of all properties
from the specified range of text. Here’s an example:
(set-text-properties start end nil)
Do not rely on the return value of this function.
This function acts on the text between start and end,
adding the face face to the face
text property.
face should be a valid value for the face
property
(see section Properties with Special Meanings), such as a face name or an anonymous face
(see section Faces).
If any text in the region already has a non-nil
face
property,
those face(s) are retained. This function sets the face
property to a list of faces, with face as the first element (by
default) and the pre-existing faces as the remaining elements. If the
optional argument append is non-nil
, face is
appended to the end of the list instead. Note that in a face list,
the first occurring value for each attribute takes precedence.
For example, the following code would assign a italicized green face to the text between start and end:
(add-face-text-property start end 'italic) (add-face-text-property start end '(:foreground "red")) (add-face-text-property start end '(:foreground "green"))
The optional argument object, if non-nil
, specifies a
buffer or string to act on, rather than the current buffer. If
object is a string, then start and end are
zero-based indices into the string.
The easiest way to make a string with text properties is with
propertize
:
This function returns a copy of string with the text properties
properties added. These properties apply to all the characters
in the string that is returned. Here is an example that constructs a
string with a face
property and a mouse-face
property:
(propertize "foo" 'face 'italic 'mouse-face 'bold-italic) ⇒ #("foo" 0 3 (mouse-face bold-italic face italic))
To put different properties on various parts of a string, you can
construct each part with propertize
and then combine them with
concat
:
(concat (propertize "foo" 'face 'italic 'mouse-face 'bold-italic) " and " (propertize "bar" 'face 'italic 'mouse-face 'bold-italic)) ⇒ #("foo and bar" 0 3 (face italic mouse-face bold-italic) 3 8 nil 8 11 (face italic mouse-face bold-italic))
See section Examining Buffer Contents, for the function
buffer-substring-no-properties
, which copies text from the
buffer but does not copy its properties.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In typical use of text properties, most of the time several or many consecutive characters have the same value for a property. Rather than writing your programs to examine characters one by one, it is much faster to process chunks of text that have the same property value.
Here are functions you can use to do this. They use eq
for
comparing property values. In all cases, object defaults to the
current buffer.
For good performance, it’s very important to use the limit argument to these functions, especially the ones that search for a single property—otherwise, they may spend a long time scanning to the end of the buffer, if the property you are interested in does not change.
These functions do not move point; instead, they return a position (or
nil
). Remember that a position is always between two characters;
the position returned by these functions is between two characters with
different properties.
The function scans the text forward from position pos in the string or buffer object until it finds a change in some text property, then returns the position of the change. In other words, it returns the position of the first character beyond pos whose properties are not identical to those of the character just after pos.
If limit is non-nil
, then the scan ends at position
limit. If there is no property change before that point, this
function returns limit.
The value is nil
if the properties remain unchanged all the way
to the end of object and limit is nil
. If the value
is non-nil
, it is a position greater than or equal to pos.
The value equals pos only when limit equals pos.
Here is an example of how to scan the buffer by chunks of text within which all properties are constant:
(while (not (eobp))
(let ((plist (text-properties-at (point)))
(next-change
(or (next-property-change (point) (current-buffer))
(point-max))))
Process text from point to next-change…
(goto-char next-change)))
This is like next-property-change
, but scans back from pos
instead of forward. If the value is non-nil
, it is a position
less than or equal to pos; it equals pos only if limit
equals pos.
The function scans text for a change in the prop property, then returns the position of the change. The scan goes forward from position pos in the string or buffer object. In other words, this function returns the position of the first character beyond pos whose prop property differs from that of the character just after pos.
If limit is non-nil
, then the scan ends at position
limit. If there is no property change before that point,
next-single-property-change
returns limit.
The value is nil
if the property remains unchanged all the way to
the end of object and limit is nil
. If the value is
non-nil
, it is a position greater than or equal to pos; it
equals pos only if limit equals pos.
This is like next-single-property-change
, but scans back from
pos instead of forward. If the value is non-nil
, it is a
position less than or equal to pos; it equals pos only if
limit equals pos.
This is like next-property-change
except that it considers
overlay properties as well as text properties, and if no change is
found before the end of the buffer, it returns the maximum buffer
position rather than nil
(in this sense, it resembles the
corresponding overlay function next-overlay-change
, rather than
next-property-change
). There is no object operand
because this function operates only on the current buffer. It returns
the next address at which either kind of property changes.
This is like next-char-property-change
, but scans back from
pos instead of forward, and returns the minimum buffer
position if no change is found.
This is like next-single-property-change
except that it
considers overlay properties as well as text properties, and if no
change is found before the end of the object, it returns the
maximum valid position in object rather than nil
. Unlike
next-char-property-change
, this function does have an
object operand; if object is not a buffer, only
text-properties are considered.
This is like next-single-char-property-change
, but scans back
from pos instead of forward, and returns the minimum valid
position in object if no change is found.
This function returns non-nil
if at least one character between
start and end has a property prop whose value is
value. More precisely, it returns the position of the first such
character. Otherwise, it returns nil
.
The optional fifth argument, object, specifies the string or buffer to scan. Positions are relative to object. The default for object is the current buffer.
This function returns non-nil
if at least one character between
start and end does not have a property prop with value
value. More precisely, it returns the position of the first such
character. Otherwise, it returns nil
.
The optional fifth argument, object, specifies the string or buffer to scan. Positions are relative to object. The default for object is the current buffer.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a table of text property names that have special built-in meanings. The following sections list a few additional special property names that control filling and property inheritance. All other names have no standard meaning, and you can use them as you like.
Note: the properties composition
, display
,
invisible
and intangible
can also cause point to move to
an acceptable place, after each Emacs command. See section Adjusting Point After Commands.
category
If a character has a category
property, we call it the
property category of the character. It should be a symbol. The
properties of this symbol serve as defaults for the properties of the
character.
face
The face
property controls the appearance of the character
(see section Faces). The value of the property can be the following:
(keyword
value …)
, where each keyword is a face attribute
name and value is a value for that attribute.
(foreground-color . color-name)
or (background-color . color-name)
. This specifies the
foreground or background color, similar to (:foreground
color-name)
or (:background color-name)
. This
form is supported for backward compatibility only, and should be
avoided.
Font Lock mode (see section Font Lock Mode) works in most buffers by
dynamically updating the face
property of characters based on
the context.
The add-face-text-property
function provides a convenient way
to set this text property. See section Changing Text Properties.
font-lock-face
This property specifies a value for the face
property that Font
Lock mode should apply to the underlying text. It is one of the
fontification methods used by Font Lock mode, and is useful for
special modes that implement their own highlighting.
See section Precalculated Fontification. When Font Lock mode is disabled,
font-lock-face
has no effect.
mouse-face
This property is used instead of face
when the mouse is on or
near the character. For this purpose, “near” means that all text
between the character and where the mouse is have the same
mouse-face
property value.
Emacs ignores all face attributes from the mouse-face
property
that alter the text size (e.g., :height
, :weight
, and
:slant
). Those attributes are always the same as for the
unhighlighted text.
fontified
This property says whether the text is ready for display. If
nil
, Emacs’s redisplay routine calls the functions in
fontification-functions
(see section Automatic Face Assignment) to prepare this
part of the buffer before it is displayed. It is used internally by
the “just in time” font locking code.
display
This property activates various features that change the
way text is displayed. For example, it can make text appear taller
or shorter, higher or lower, wider or narrow, or replaced with an image.
See section The display
Property.
help-echo
If text has a string as its help-echo
property, then when you
move the mouse onto that text, Emacs displays that string in the echo
area, or in the tooltip window (see Tooltips in The GNU Emacs
Manual).
If the value of the help-echo
property is a function, that
function is called with three arguments, window, object and
pos and should return a help string or nil
for
none. The first argument, window is the window in which
the help was found. The second, object, is the buffer, overlay or
string which had the help-echo
property. The pos
argument is as follows:
help-echo
property, and pos is the position in the overlay’s buffer.
display
property), pos is the position in that
string.
If the value of the help-echo
property is neither a function nor
a string, it is evaluated to obtain a help string.
You can alter the way help text is displayed by setting the variable
show-help-function
(see Help display).
This feature is used in the mode line and for other active text.
keymap
The keymap
property specifies an additional keymap for
commands. When this keymap applies, it is used for key lookup before
the minor mode keymaps and before the buffer’s local map.
See section Active Keymaps. If the property value is a symbol, the
symbol’s function definition is used as the keymap.
The property’s value for the character before point applies if it is
non-nil
and rear-sticky, and the property’s value for the
character after point applies if it is non-nil
and
front-sticky. (For mouse clicks, the position of the click is used
instead of the position of point.)
local-map
This property works like keymap
except that it specifies a
keymap to use instead of the buffer’s local map. For most
purposes (perhaps all purposes), it is better to use the keymap
property.
syntax-table
The syntax-table
property overrides what the syntax table says
about this particular character. See section Syntax Properties.
read-only
If a character has the property read-only
, then modifying that
character is not allowed. Any command that would do so gets an error,
text-read-only
. If the property value is a string, that string
is used as the error message.
Insertion next to a read-only character is an error if inserting
ordinary text there would inherit the read-only
property due to
stickiness. Thus, you can control permission to insert next to
read-only text by controlling the stickiness. See section Stickiness of Text Properties.
Since changing properties counts as modifying the buffer, it is not
possible to remove a read-only
property unless you know the
special trick: bind inhibit-read-only
to a non-nil
value
and then remove the property. See section Read-Only Buffers.
invisible
A non-nil
invisible
property can make a character invisible
on the screen. See section Invisible Text, for details.
intangible
If a group of consecutive characters have equal and non-nil
intangible
properties, then you cannot place point between them.
If you try to move point forward into the group, point actually moves to
the end of the group. If you try to move point backward into the group,
point actually moves to the start of the group.
If consecutive characters have unequal non-nil
intangible
properties, they belong to separate groups; each
group is separately treated as described above.
When the variable inhibit-point-motion-hooks
is non-nil
,
the intangible
property is ignored.
Beware: this property operates at a very low level, and affects a lot of code in unexpected ways. So use it with extreme caution. A common misuse is to put an intangible property on invisible text, which is actually unnecessary since the command loop will move point outside of the invisible text at the end of each command anyway. See section Adjusting Point After Commands.
field
Consecutive characters with the same field
property constitute a
field. Some motion functions including forward-word
and
beginning-of-line
stop moving at a field boundary.
See section Defining and Using Fields.
cursor
Normally, the cursor is displayed at the beginning or the end of any
overlay and text property strings present at the current buffer
position. You can place the cursor on any desired character of these
strings by giving that character a non-nil
cursor
text
property. In addition, if the value of the cursor
property is
an integer, it specifies the number of buffer’s character
positions, starting with the position where the overlay or the
display
property begins, for which the cursor should be
displayed on that character. Specifically, if the value of the
cursor
property of a character is the number n, the
cursor will be displayed on this character for any buffer position in
the range [ovpos..ovpos+n)
, where ovpos
is the overlay’s starting position given by overlay-start
(see section Managing Overlays), or the position where the display
text property begins in the buffer.
In other words, the string character with the cursor
property
of any non-nil
value is the character where to display the
cursor. The value of the property says for which buffer positions to
display the cursor there. If the value is an integer n,
the cursor is displayed there when point is anywhere between the
beginning of the overlay or display
property and n
positions after that. If the value is anything else and
non-nil
, the cursor is displayed there only when point is at
the beginning of the display
property or at
overlay-start
.
When the buffer has many overlay strings (e.g., see section before-string) or display
properties that are
strings, it is a good idea to use the cursor
property on these
strings to cue the Emacs display about the places where to put the
cursor while traversing these strings. This directly communicates to
the display engine where the Lisp program wants to put the cursor, or
where the user would expect the cursor.
pointer
This specifies a specific pointer shape when the mouse pointer is over this text or image. See section Pointer Shape, for possible pointer shapes.
line-spacing
A newline can have a line-spacing
text or overlay property that
controls the height of the display line ending with that newline. The
property value overrides the default frame line spacing and the buffer
local line-spacing
variable. See section Line Height.
line-height
A newline can have a line-height
text or overlay property that
controls the total height of the display line ending in that newline.
See section Line Height.
wrap-prefix
If text has a wrap-prefix
property, the prefix it defines will
be added at display time to the beginning of every continuation line
due to text wrapping (so if lines are truncated, the wrap-prefix is
never used). It may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the
:width
or :align-to
display properties (see section Specified Spaces).
A wrap-prefix may also be specified for an entire buffer using the
wrap-prefix
buffer-local variable (however, a
wrap-prefix
text-property takes precedence over the value of
the wrap-prefix
variable). See section Truncation.
line-prefix
If text has a line-prefix
property, the prefix it defines will
be added at display time to the beginning of every non-continuation
line. It may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the
:width
or :align-to
display properties (see section Specified Spaces).
A line-prefix may also be specified for an entire buffer using the
line-prefix
buffer-local variable (however, a
line-prefix
text-property takes precedence over the value of
the line-prefix
variable). See section Truncation.
modification-hooks
If a character has the property modification-hooks
, then its
value should be a list of functions; modifying that character calls
all of those functions before the actual modification. Each function
receives two arguments: the beginning and end of the part of the
buffer being modified. Note that if a particular modification hook
function appears on several characters being modified by a single
primitive, you can’t predict how many times the function will
be called.
Furthermore, insertion will not modify any existing character, so this
hook will only be run when removing some characters, replacing them
with others, or changing their text-properties.
If these functions modify the buffer, they should bind
inhibit-modification-hooks
to t
around doing so, to
avoid confusing the internal mechanism that calls these hooks.
Overlays also support the modification-hooks
property, but the
details are somewhat different (see section Overlay Properties).
insert-in-front-hooks
insert-behind-hooks
The operation of inserting text in a buffer also calls the functions
listed in the insert-in-front-hooks
property of the following
character and in the insert-behind-hooks
property of the
preceding character. These functions receive two arguments, the
beginning and end of the inserted text. The functions are called
after the actual insertion takes place.
See also Change Hooks, for other hooks that are called when you change text in a buffer.
point-entered
point-left
The special properties point-entered
and point-left
record hook functions that report motion of point. Each time point
moves, Emacs compares these two property values:
point-left
property of the character after the old location,
and
point-entered
property of the character after the new
location.
If these two values differ, each of them is called (if not nil
)
with two arguments: the old value of point, and the new one.
The same comparison is made for the characters before the old and new
locations. The result may be to execute two point-left
functions
(which may be the same function) and/or two point-entered
functions (which may be the same function). In any case, all the
point-left
functions are called first, followed by all the
point-entered
functions.
It is possible to use char-after
to examine characters at various
buffer positions without moving point to those positions. Only an
actual change in the value of point runs these hook functions.
The variable inhibit-point-motion-hooks
can inhibit running the
point-left
and point-entered
hooks, see Inhibit point motion hooks.
composition
This text property is used to display a sequence of characters as a
single glyph composed from components. But the value of the property
itself is completely internal to Emacs and should not be manipulated
directly by, for instance, put-text-property
.
When this variable is
non-nil
, point-left
and point-entered
hooks are
not run, and the intangible
property has no effect. Do not set
this variable globally; bind it with let
.
If this variable is non-nil
, it specifies a
function called to display help strings. These may be help-echo
properties, menu help strings (see section Simple Menu Items,
see section Extended Menu Items), or tool bar help strings (see section Tool bars). The specified function is called with one argument, the help
string to display. Tooltip mode (see Tooltips in The GNU Emacs
Manual) provides an example.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These text properties affect the behavior of the fill commands. They are used for representing formatted text. See section Filling, and Margins for Filling.
hard
If a newline character has this property, it is a “hard” newline.
The fill commands do not alter hard newlines and do not move words
across them. However, this property takes effect only if the
use-hard-newlines
minor mode is enabled. See Hard and Soft Newlines in The GNU Emacs Manual.
right-margin
This property specifies an extra right margin for filling this part of the text.
left-margin
This property specifies an extra left margin for filling this part of the text.
justification
This property specifies the style of justification for filling this part of the text.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Self-inserting characters normally take on the same properties as the preceding character. This is called inheritance of properties.
A Lisp program can do insertion with inheritance or without,
depending on the choice of insertion primitive. The ordinary text
insertion functions, such as insert
, do not inherit any
properties. They insert text with precisely the properties of the
string being inserted, and no others. This is correct for programs
that copy text from one context to another—for example, into or out
of the kill ring. To insert with inheritance, use the special
primitives described in this section. Self-inserting characters
inherit properties because they work using these primitives.
When you do insertion with inheritance, which properties are inherited, and from where, depends on which properties are sticky. Insertion after a character inherits those of its properties that are rear-sticky. Insertion before a character inherits those of its properties that are front-sticky. When both sides offer different sticky values for the same property, the previous character’s value takes precedence.
By default, a text property is rear-sticky but not front-sticky; thus, the default is to inherit all the properties of the preceding character, and nothing from the following character.
You can control the stickiness of various text properties with two
specific text properties, front-sticky
and rear-nonsticky
,
and with the variable text-property-default-nonsticky
. You can
use the variable to specify a different default for a given property.
You can use those two text properties to make any specific properties
sticky or nonsticky in any particular part of the text.
If a character’s front-sticky
property is t
, then all
its properties are front-sticky. If the front-sticky
property is
a list, then the sticky properties of the character are those whose
names are in the list. For example, if a character has a
front-sticky
property whose value is (face read-only)
,
then insertion before the character can inherit its face
property
and its read-only
property, but no others.
The rear-nonsticky
property works the opposite way. Most
properties are rear-sticky by default, so the rear-nonsticky
property says which properties are not rear-sticky. If a
character’s rear-nonsticky
property is t
, then none of its
properties are rear-sticky. If the rear-nonsticky
property is a
list, properties are rear-sticky unless their names are in the
list.
This variable holds an alist which defines the default rear-stickiness
of various text properties. Each element has the form
(property . nonstickiness)
, and it defines the
stickiness of a particular text property, property.
If nonstickiness is non-nil
, this means that the property
property is rear-nonsticky by default. Since all properties are
front-nonsticky by default, this makes property nonsticky in both
directions by default.
The text properties front-sticky
and rear-nonsticky
, when
used, take precedence over the default nonstickiness specified in
text-property-default-nonsticky
.
Here are the functions that insert text with inheritance of properties:
Insert the strings strings, just like the function insert
,
but inherit any sticky properties from the adjoining text.
Insert the strings strings, just like the function
insert-before-markers
, but inherit any sticky properties from the
adjoining text.
See section Inserting Text, for the ordinary insertion functions which do not inherit.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Instead of computing text properties for all the text in the buffer, you can arrange to compute the text properties for parts of the text when and if something depends on them.
The primitive that extracts text from the buffer along with its
properties is buffer-substring
. Before examining the properties,
this function runs the abnormal hook buffer-access-fontify-functions
.
This variable holds a list of functions for computing text properties.
Before buffer-substring
copies the text and text properties for a
portion of the buffer, it calls all the functions in this list. Each of
the functions receives two arguments that specify the range of the
buffer being accessed. (The buffer itself is always the current
buffer.)
The function buffer-substring-no-properties
does not call these
functions, since it ignores text properties anyway.
In order to prevent the hook functions from being called more than
once for the same part of the buffer, you can use the variable
buffer-access-fontified-property
.
If this variable’s value is non-nil
, it is a symbol which is used
as a text property name. A non-nil
value for that text property
means, “the other text properties for this character have already been
computed”.
If all the characters in the range specified for buffer-substring
have a non-nil
value for this property, buffer-substring
does not call the buffer-access-fontify-functions
functions. It
assumes these characters already have the right text properties, and
just copies the properties they already have.
The normal way to use this feature is that the
buffer-access-fontify-functions
functions add this property, as
well as others, to the characters they operate on. That way, they avoid
being called over and over for the same text.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Clickable text is text that can be clicked, with either the mouse or via a keyboard command, to produce some result. Many major modes use clickable text to implement textual hyper-links, or links for short.
The easiest way to insert and manipulate links is to use the
button
package. See section Buttons. In this section, we will
explain how to manually set up clickable text in a buffer, using text
properties. For simplicity, we will refer to the clickable text as a
link.
Implementing a link involves three separate steps: (1) indicating
clickability when the mouse moves over the link; (2) making RET
or Mouse-2 on that link do something; and (3) setting up a
follow-link
condition so that the link obeys
mouse-1-click-follows-link
.
To indicate clickability, add the mouse-face
text property to
the text of the link; then Emacs will highlight the link when the
mouse moves over it. In addition, you should define a tooltip or echo
area message, using the help-echo
text property. See section Properties with Special Meanings. For instance, here is how Dired indicates that file
names are clickable:
(if (dired-move-to-filename) (add-text-properties (point) (save-excursion (dired-move-to-end-of-filename) (point)) '(mouse-face highlight help-echo "mouse-2: visit this file in other window")))
To make the link clickable, bind RET and Mouse-2 to commands that perform the desired action. Each command should check to see whether it was called on a link, and act accordingly. For instance, Dired’s major mode keymap binds Mouse-2 to the following command:
(defun dired-mouse-find-file-other-window (event) "In Dired, visit the file or directory name you click on." (interactive "e") (let ((window (posn-window (event-end event))) (pos (posn-point (event-end event))) file) (if (not (windowp window)) (error "No file chosen")) (with-current-buffer (window-buffer window) (goto-char pos) (setq file (dired-get-file-for-visit))) (if (file-directory-p file) (or (and (cdr dired-subdir-alist) (dired-goto-subdir file)) (progn (select-window window) (dired-other-window file))) (select-window window) (find-file-other-window (file-name-sans-versions file t)))))
This command uses the functions posn-window
and
posn-point
to determine where the click occurred, and
dired-get-file-for-visit
to determine which file to visit.
Instead of binding the mouse command in a major mode keymap, you can
bind it within the link text, using the keymap
text property
(see section Properties with Special Meanings). For instance:
(let ((map (make-sparse-keymap))) (define-key map [mouse-2] 'operate-this-button) (put-text-property link-start link-end 'keymap map))
With this method, you can easily define different commands for different links. Furthermore, the global definition of RET and Mouse-2 remain available for the rest of the text in the buffer.
The basic Emacs command for clicking on links is Mouse-2.
However, for compatibility with other graphical applications, Emacs
also recognizes Mouse-1 clicks on links, provided the user
clicks on the link quickly without moving the mouse. This behavior is
controlled by the user option mouse-1-click-follows-link
.
See Mouse References in The GNU Emacs Manual.
To set up the link so that it obeys
mouse-1-click-follows-link
, you must either (1) apply a
follow-link
text or overlay property to the link text, or (2)
bind the follow-link
event to a keymap (which can be a major
mode keymap or a local keymap specified via the keymap
text
property). The value of the follow-link
property, or the
binding for the follow-link
event, acts as a “condition” for
the link action. This condition tells Emacs two things: the
circumstances under which a Mouse-1 click should be regarded as
occurring “inside” the link, and how to compute an “action code”
that says what to translate the Mouse-1 click into. The link
action condition can be one of the following:
mouse-face
If the condition is the symbol mouse-face
, a position is inside
a link if there is a non-nil
mouse-face
property at that
position. The action code is always t
.
For example, here is how Info mode handles Mouse-1:
(define-key Info-mode-map [follow-link] 'mouse-face)
If the condition is a function, func, then a position pos
is inside a link if (func pos)
evaluates to
non-nil
. The value returned by func serves as the action
code.
For example, here is how pcvs enables Mouse-1 to follow links on file names only:
(define-key map [follow-link] (lambda (pos) (eq (get-char-property pos 'face) 'cvs-filename-face)))
If the condition value is anything else, then the position is inside a link and the condition itself is the action code. Clearly, you should specify this kind of condition only when applying the condition via a text or property overlay on the link text (so that it does not apply to the entire buffer).
The action code tells Mouse-1 how to follow the link:
If the action code is a string or vector, the Mouse-1 event is
translated into the first element of the string or vector; i.e., the
action of the Mouse-1 click is the local or global binding of
that character or symbol. Thus, if the action code is "foo"
,
Mouse-1 translates into f. If it is [foo]
,
Mouse-1 translates into foo.
For any other non-nil
action code, the Mouse-1 event is
translated into a Mouse-2 event at the same position.
To define Mouse-1 to activate a button defined with
define-button-type
, give the button a follow-link
property. The property value should be a link action condition, as
described above. See section Buttons. For example, here is how Help mode
handles Mouse-1:
(define-button-type 'help-xref 'follow-link t 'action #'help-button-action)
To define Mouse-1 on a widget defined with
define-widget
, give the widget a :follow-link
property.
The property value should be a link action condition, as described
above. For example, here is how the link
widget specifies that
a Mouse-1 click shall be translated to RET:
(define-widget 'link 'item "An embedded link." :button-prefix 'widget-link-prefix :button-suffix 'widget-link-suffix :follow-link "\C-m" :help-echo "Follow the link." :format "%[%t%]")
This function returns non-nil
if position pos in the
current buffer is on a link. pos can also be a mouse event
location, as returned by event-start
(see section Accessing Mouse Events).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A field is a range of consecutive characters in the buffer that are
identified by having the same value (comparing with eq
) of the
field
property (either a text-property or an overlay property).
This section describes special functions that are available for
operating on fields.
You specify a field with a buffer position, pos. We think of each field as containing a range of buffer positions, so the position you specify stands for the field containing that position.
When the characters before and after pos are part of the same
field, there is no doubt which field contains pos: the one those
characters both belong to. When pos is at a boundary between
fields, which field it belongs to depends on the stickiness of the
field
properties of the two surrounding characters (see section Stickiness of Text Properties). The field whose property would be inherited by text
inserted at pos is the field that contains pos.
There is an anomalous case where newly inserted text at pos
would not inherit the field
property from either side. This
happens if the previous character’s field
property is not
rear-sticky, and the following character’s field
property is not
front-sticky. In this case, pos belongs to neither the preceding
field nor the following field; the field functions treat it as belonging
to an empty field whose beginning and end are both at pos.
In all of these functions, if pos is omitted or nil
, the
value of point is used by default. If narrowing is in effect, then
pos should fall within the accessible portion. See section Narrowing.
This function returns the beginning of the field specified by pos.
If pos is at the beginning of its field, and
escape-from-edge is non-nil
, then the return value is
always the beginning of the preceding field that ends at pos,
regardless of the stickiness of the field
properties around
pos.
If limit is non-nil
, it is a buffer position; if the
beginning of the field is before limit, then limit will be
returned instead.
This function returns the end of the field specified by pos.
If pos is at the end of its field, and escape-from-edge is
non-nil
, then the return value is always the end of the following
field that begins at pos, regardless of the stickiness of
the field
properties around pos.
If limit is non-nil
, it is a buffer position; if the end
of the field is after limit, then limit will be returned
instead.
This function returns the contents of the field specified by pos, as a string.
This function returns the contents of the field specified by pos, as a string, discarding text properties.
This function deletes the text of the field specified by pos.
This function “constrains” new-pos to the field that old-pos belongs to—in other words, it returns the position closest to new-pos that is in the same field as old-pos.
If new-pos is nil
, then constrain-to-field
uses
the value of point instead, and moves point to the resulting position
in addition to returning that position.
If old-pos is at the boundary of two fields, then the acceptable
final positions depend on the argument escape-from-edge. If
escape-from-edge is nil
, then new-pos must be in
the field whose field
property equals what new characters
inserted at old-pos would inherit. (This depends on the
stickiness of the field
property for the characters before and
after old-pos.) If escape-from-edge is non-nil
,
new-pos can be anywhere in the two adjacent fields.
Additionally, if two fields are separated by another field with the
special value boundary
, then any point within this special
field is also considered to be “on the boundary”.
Commands like C-a with no argument, that normally move backward
to a specific kind of location and stay there once there, probably
should specify nil
for escape-from-edge. Other motion
commands that check fields should probably pass t
.
If the optional argument only-in-line is non-nil
, and
constraining new-pos in the usual way would move it to a different
line, new-pos is returned unconstrained. This used in commands
that move by line, such as next-line
and
beginning-of-line
, so that they respect field boundaries only in
the case where they can still move to the right line.
If the optional argument inhibit-capture-property is
non-nil
, and old-pos has a non-nil
property of that
name, then any field boundaries are ignored.
You can cause constrain-to-field
to ignore all field boundaries
(and so never constrain anything) by binding the variable
inhibit-field-text-motion
to a non-nil
value.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some editors that support adding attributes to text in the buffer do so by letting the user specify “intervals” within the text, and adding the properties to the intervals. Those editors permit the user or the programmer to determine where individual intervals start and end. We deliberately provided a different sort of interface in Emacs Lisp to avoid certain paradoxical behavior associated with text modification.
If the actual subdivision into intervals is meaningful, that means you can distinguish between a buffer that is just one interval with a certain property, and a buffer containing the same text subdivided into two intervals, both of which have that property.
Suppose you take the buffer with just one interval and kill part of the text. The text remaining in the buffer is one interval, and the copy in the kill ring (and the undo list) becomes a separate interval. Then if you yank back the killed text, you get two intervals with the same properties. Thus, editing does not preserve the distinction between one interval and two.
Suppose we “fix” this problem by coalescing the two intervals when the text is inserted. That works fine if the buffer originally was a single interval. But suppose instead that we have two adjacent intervals with the same properties, and we kill the text of one interval and yank it back. The same interval-coalescence feature that rescues the other case causes trouble in this one: after yanking, we have just one interval. Once again, editing does not preserve the distinction between one interval and two.
Insertion of text at the border between intervals also raises questions that have no satisfactory answer.
However, it is easy to arrange for editing to behave consistently for questions of the form, “What are the properties of text at this buffer or string position?” So we have decided these are the only questions that make sense; we have not implemented asking questions about where intervals start or end.
In practice, you can usually use the text property search functions in place of explicit interval boundaries. You can think of them as finding the boundaries of intervals, assuming that intervals are always coalesced whenever possible. See section Text Property Search Functions.
Emacs also provides explicit intervals as a presentation feature; see Overlays.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following functions replace characters within a specified region based on their character codes.
This function replaces all occurrences of the character old-char with the character new-char in the region of the current buffer defined by start and end.
If noundo is non-nil
, then subst-char-in-region
does
not record the change for undo and does not mark the buffer as modified.
This was useful for controlling the old selective display feature
(see section Selective Display).
subst-char-in-region
does not move point and returns
nil
.
---------- Buffer: foo ---------- This is the contents of the buffer before. ---------- Buffer: foo ----------
(subst-char-in-region 1 20 ?i ?X) ⇒ nil ---------- Buffer: foo ---------- ThXs Xs the contents of the buffer before. ---------- Buffer: foo ----------
This function applies a translation table to the characters in the buffer between positions start and end.
The translation table table is a string or a char-table;
(aref table ochar)
gives the translated character
corresponding to ochar. If table is a string, any
characters with codes larger than the length of table are not
altered by the translation.
The return value of translate-region
is the number of
characters that were actually changed by the translation. This does
not count characters that were mapped into themselves in the
translation table.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A register is a sort of variable used in Emacs editing that can hold a variety of different kinds of values. Each register is named by a single character. All ASCII characters and their meta variants (but with the exception of C-g) can be used to name registers. Thus, there are 255 possible registers. A register is designated in Emacs Lisp by the character that is its name.
This variable is an alist of elements of the form (name .
contents)
. Normally, there is one element for each Emacs
register that has been used.
The object name is a character (an integer) identifying the register.
The contents of a register can have several possible types:
A number stands for itself. If insert-register
finds a number
in the register, it converts the number to decimal.
A marker represents a buffer position to jump to.
A string is text saved in the register.
A rectangle is represented by a list of strings.
(window-configuration position)
This represents a window configuration to restore in one frame, and a position to jump to in the current buffer.
(frame-configuration position)
This represents a frame configuration to restore, and a position to jump to in the current buffer.
This represents a file to visit; jumping to this value visits file filename.
This represents a file to visit and a position in it; jumping to this value visits file filename and goes to buffer position position. Restoring this type of position asks the user for confirmation first.
The functions in this section return unpredictable values unless otherwise stated.
This function returns the contents of the register
reg, or nil
if it has no contents.
This function sets the contents of register reg to value. A register can be set to any value, but the other register functions expect only certain data types. The return value is value.
This command displays what is contained in register reg.
This command inserts contents of register reg into the current buffer.
Normally, this command puts point before the inserted text, and the
mark after it. However, if the optional second argument beforep
is non-nil
, it puts the mark before and point after.
You can pass a non-nil
second argument beforep to this
function interactively by supplying any prefix argument.
If the register contains a rectangle, then the rectangle is inserted with its upper left corner at point. This means that text is inserted in the current line and underneath it on successive lines.
If the register contains something other than saved text (a string) or a rectangle (a list), currently useless things happen. This may be changed in the future.
This function reads and returns a register name, prompting with
prompt and possibly showing a preview of the existing registers
and their contents. The preview is shown in a temporary window, after
the delay specified by the user option register-preview-delay
,
if its value and register-alist
are both non-nil
. The
preview is also shown if the user requests help (e.g., by typing the
help character). We recommend that all interactive commands which
read register names use this function.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function can be used to transpose stretches of text:
This function exchanges two nonoverlapping portions of the buffer. Arguments start1 and end1 specify the bounds of one portion and arguments start2 and end2 specify the bounds of the other portion.
Normally, transpose-regions
relocates markers with the transposed
text; a marker previously positioned within one of the two transposed
portions moves along with that portion, thus remaining between the same
two characters in their new position. However, if leave-markers
is non-nil
, transpose-regions
does not do this—it leaves
all markers unrelocated.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When auto-compression-mode
is enabled, Emacs automatically
uncompresses compressed files when you visit them, and automatically
recompresses them if you alter and save them. See Compressed
Files in The GNU Emacs Manual.
The above feature works by calling an external executable (e.g.,
gzip
). Emacs can also be compiled with support for built-in
decompression using the zlib library, which is faster than calling an
external program.
This function returns non-nil
if built-in zlib decompression is
available.
This function decompresses the region between start and
end, using built-in zlib decompression. The region should
contain data that were compressed with gzip or zlib. On success, the
function replaces the contents of the region with the decompressed
data. On failure, the function leaves the region unchanged and
returns nil
. This function can be called only in unibyte
buffers.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Base 64 code is used in email to encode a sequence of 8-bit bytes as a longer sequence of ASCII graphic characters. It is defined in Internet RFC142045. This section describes the functions for converting to and from this code.
This function converts the region from beg to end into base
64 code. It returns the length of the encoded text. An error is
signaled if a character in the region is multibyte, i.e., in a
multibyte buffer the region must contain only characters from the
charsets ascii
, eight-bit-control
and
eight-bit-graphic
.
Normally, this function inserts newline characters into the encoded
text, to avoid overlong lines. However, if the optional argument
no-line-break is non-nil
, these newlines are not added, so
the output is just one long line.
This function converts the string string into base 64 code. It
returns a string containing the encoded text. As for
base64-encode-region
, an error is signaled if a character in the
string is multibyte.
Normally, this function inserts newline characters into the encoded
text, to avoid overlong lines. However, if the optional argument
no-line-break is non-nil
, these newlines are not added, so
the result string is just one long line.
This function converts the region from beg to end from base 64 code into the corresponding decoded text. It returns the length of the decoded text.
The decoding functions ignore newline characters in the encoded text.
This function converts the string string from base 64 code into the corresponding decoded text. It returns a unibyte string containing the decoded text.
The decoding functions ignore newline characters in the encoded text.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs has built-in support for computing cryptographic hashes. A cryptographic hash, or checksum, is a digital “fingerprint” of a piece of data (e.g., a block of text) which can be used to check that you have an unaltered copy of that data.
Emacs supports several common cryptographic hash algorithms: MD5, SHA-1, SHA-2, SHA-224, SHA-256, SHA-384 and SHA-512. MD5 is the oldest of these algorithms, and is commonly used in message digests to check the integrity of messages transmitted over a network. MD5 is not “collision resistant” (i.e., it is possible to deliberately design different pieces of data which have the same MD5 hash), so you should not used it for anything security-related. A similar theoretical weakness also exists in SHA-1. Therefore, for security-related applications you should use the other hash types, such as SHA-2.
This function returns a hash for object. The argument
algorithm is a symbol stating which hash to compute: one of
md5
, sha1
, sha224
, sha256
, sha384
or sha512
. The argument object should be a buffer or a
string.
The optional arguments start and end are character
positions specifying the portion of object to compute the
message digest for. If they are nil
or omitted, the hash is
computed for the whole of object.
If the argument binary is omitted or nil
, the function
returns the text form of the hash, as an ordinary Lisp string.
If binary is non-nil
, it returns the hash in binary
form, as a sequence of bytes stored in a unibyte string.
This function does not compute the hash directly from the internal representation of object’s text (see section Text Representations). Instead, it encodes the text using a coding system (see section Coding Systems), and computes the hash from that encoded text. If object is a buffer, the coding system used is the one which would be chosen by default for writing the text into a file. If object is a string, the user’s preferred coding system is used (see Recognize Coding in GNU Emacs Manual).
This function returns an MD5 hash. It is semi-obsolete, since for
most purposes it is equivalent to calling secure-hash
with
md5
as the algorithm argument. The object,
start and end arguments have the same meanings as in
secure-hash
.
If coding-system is non-nil
, it specifies a coding system
to use to encode the text; if omitted or nil
, the default
coding system is used, like in secure-hash
.
Normally, md5
signals an error if the text can’t be encoded
using the specified or chosen coding system. However, if
noerror is non-nil
, it silently uses raw-text
coding instead.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs is compiled with libxml2 support, the following functions are available to parse HTML or XML text into Lisp object trees.
This function parses the text between start and end as HTML, and returns a list representing the HTML parse tree. It attempts to handle “real world” HTML by robustly coping with syntax mistakes.
The optional argument base-url, if non-nil
, should be a
string specifying the base URL for relative URLs occurring in links.
In the parse tree, each HTML node is represented by a list in which the first element is a symbol representing the node name, the second element is an alist of node attributes, and the remaining elements are the subnodes.
The following example demonstrates this. Given this (malformed) HTML document:
<html><head></head><body width=101><div class=thing>Foo<div>Yes
A call to libxml-parse-html-region
returns this:
(html () (head ()) (body ((width . "101")) (div ((class . "thing")) "Foo" (div () "Yes"))))
This function renders the parsed HTML in dom into the current
buffer. The argument dom should be a list as generated by
libxml-parse-html-region
. This function is, e.g., used by
EWW in The Emacs Web Wowser Manual.
This function is the same as libxml-parse-html-region
, except
that it parses the text as XML rather than HTML (so it is stricter
about syntax).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In database terminology, an atomic change is an indivisible change—it can succeed entirely or it can fail entirely, but it cannot partly succeed. A Lisp program can make a series of changes to one or several buffers as an atomic change group, meaning that either the entire series of changes will be installed in their buffers or, in case of an error, none of them will be.
To do this for one buffer, the one already current, simply write a
call to atomic-change-group
around the code that makes the
changes, like this:
(atomic-change-group (insert foo) (delete-region x y))
If an error (or other nonlocal exit) occurs inside the body of
atomic-change-group
, it unmakes all the changes in that buffer
that were during the execution of the body. This kind of change group
has no effect on any other buffers—any such changes remain.
If you need something more sophisticated, such as to make changes in
various buffers constitute one atomic group, you must directly call
lower-level functions that atomic-change-group
uses.
This function sets up a change group for buffer buffer, which defaults to the current buffer. It returns a “handle” that represents the change group. You must use this handle to activate the change group and subsequently to finish it.
To use the change group, you must activate it. You must do this before making any changes in the text of buffer.
This function activates the change group that handle designates.
After you activate the change group, any changes you make in that buffer become part of it. Once you have made all the desired changes in the buffer, you must finish the change group. There are two ways to do this: you can either accept (and finalize) all the changes, or cancel them all.
This function accepts all the changes in the change group specified by handle, making them final.
This function cancels and undoes all the changes in the change group specified by handle.
Your code should use unwind-protect
to make sure the group is
always finished. The call to activate-change-group
should be
inside the unwind-protect
, in case the user types C-g
just after it runs. (This is one reason why
prepare-change-group
and activate-change-group
are
separate functions, because normally you would call
prepare-change-group
before the start of that
unwind-protect
.) Once you finish the group, don’t use the
handle again—in particular, don’t try to finish the same group
twice.
To make a multibuffer change group, call prepare-change-group
once for each buffer you want to cover, then use nconc
to
combine the returned values, like this:
(nconc (prepare-change-group buffer-1) (prepare-change-group buffer-2))
You can then activate the multibuffer change group with a single call
to activate-change-group
, and finish it with a single call to
accept-change-group
or cancel-change-group
.
Nested use of several change groups for the same buffer works as you would expect. Non-nested use of change groups for the same buffer will get Emacs confused, so don’t let it happen; the first change group you start for any given buffer should be the last one finished.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These hook variables let you arrange to take notice of all changes in all buffers (or in a particular buffer, if you make them buffer-local). See also Properties with Special Meanings, for how to detect changes to specific parts of the text.
The functions you use in these hooks should save and restore the match data if they do anything that uses regular expressions; otherwise, they will interfere in bizarre ways with the editing operations that call them.
This variable holds a list of functions to call before any buffer modification. Each function gets two arguments, the beginning and end of the region that is about to change, represented as integers. The buffer that is about to change is always the current buffer.
This variable holds a list of functions to call after any buffer modification. Each function receives three arguments: the beginning and end of the region just changed, and the length of the text that existed before the change. All three arguments are integers. The buffer that has been changed is always the current buffer.
The length of the old text is the difference between the buffer positions before and after that text as it was before the change. As for the changed text, its length is simply the difference between the first two arguments.
Output of messages into the *Messages* buffer does not call these functions.
The macro executes body normally, but arranges to call the after-change functions just once for a series of several changes—if that seems safe.
If a program makes several text changes in the same area of the buffer,
using the macro combine-after-change-calls
around that part of
the program can make it run considerably faster when after-change hooks
are in use. When the after-change hooks are ultimately called, the
arguments specify a portion of the buffer including all of the changes
made within the combine-after-change-calls
body.
Warning: You must not alter the values of
after-change-functions
within
the body of a combine-after-change-calls
form.
Warning: if the changes you combine occur in widely scattered parts of the buffer, this will still work, but it is not advisable, because it may lead to inefficient behavior for some change hook functions.
This variable is a normal hook that is run whenever a buffer is changed that was previously in the unmodified state.
If this variable is non-nil
, all of the change hooks are
disabled; none of them run. This affects all the hook variables
described above in this section, as well as the hooks attached to
certain special text properties (see section Properties with Special Meanings) and overlay
properties (see section Overlay Properties).
Also, this variable is bound to non-nil
while running those
same hook variables, so that by default modifying the buffer from
a modification hook does not cause other modification hooks to be run.
If you do want modification hooks to be run in a particular piece of
code that is itself run from a modification hook, then rebind locally
inhibit-modification-hooks
to nil
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter covers the special issues relating to characters and how they are stored in strings and buffers.
32.1 Text Representations | How Emacs represents text. | |
32.2 Disabling Multibyte Characters | Controlling whether to use multibyte characters. | |
32.3 Converting Text Representations | Converting unibyte to multibyte and vice versa. | |
32.4 Selecting a Representation | Treating a byte sequence as unibyte or multi. | |
32.5 Character Codes | How unibyte and multibyte relate to codes of individual characters. | |
32.6 Character Properties | Character attributes that define their behavior and handling. | |
32.7 Character Sets | The space of possible character codes is divided into various character sets. | |
32.8 Scanning for Character Sets | Which character sets are used in a buffer? | |
32.9 Translation of Characters | Translation tables are used for conversion. | |
32.10 Coding Systems | Coding systems are conversions for saving files. | |
32.11 Input Methods | Input methods allow users to enter various non-ASCII characters without special keyboards. | |
32.12 Locales | Interacting with the POSIX locale. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs buffers and strings support a large repertoire of characters from many different scripts, allowing users to type and display text in almost any known written language.
To support this multitude of characters and scripts, Emacs closely
follows the Unicode Standard. The Unicode Standard assigns a
unique number, called a codepoint, to each and every character.
The range of codepoints defined by Unicode, or the Unicode
codespace, is 0..#x10FFFF
(in hexadecimal notation),
inclusive. Emacs extends this range with codepoints in the range
#x110000..#x3FFFFF
, which it uses for representing characters
that are not unified with Unicode and raw 8-bit bytes that
cannot be interpreted as characters. Thus, a character codepoint in
Emacs is a 22-bit integer.
To conserve memory, Emacs does not hold fixed-length 22-bit numbers that are codepoints of text characters within buffers and strings. Rather, Emacs uses a variable-length internal representation of characters, that stores each character as a sequence of 1 to 5 8-bit bytes, depending on the magnitude of its codepoint15. For example, any ASCII character takes up only 1 byte, a Latin-1 character takes up 2 bytes, etc. We call this representation of text multibyte.
Outside Emacs, characters can be represented in many different encodings, such as ISO-8859-1, GB-2312, Big-5, etc. Emacs converts between these external encodings and its internal representation, as appropriate, when it reads text into a buffer or a string, or when it writes text to a disk file or passes it to some other process.
Occasionally, Emacs needs to hold and manipulate encoded text or binary non-text data in its buffers or strings. For example, when Emacs visits a file, it first reads the file’s text verbatim into a buffer, and only then converts it to the internal representation. Before the conversion, the buffer holds encoded text.
Encoded text is not really text, as far as Emacs is concerned, but
rather a sequence of raw 8-bit bytes. We call buffers and strings
that hold encoded text unibyte buffers and strings, because
Emacs treats them as a sequence of individual bytes. Usually, Emacs
displays unibyte buffers and strings as octal codes such as
\237
. We recommend that you never use unibyte buffers and
strings except for manipulating encoded text or binary non-text data.
In a buffer, the buffer-local value of the variable
enable-multibyte-characters
specifies the representation used.
The representation for a string is determined and recorded in the string
when the string is constructed.
This variable specifies the current buffer’s text representation.
If it is non-nil
, the buffer contains multibyte text; otherwise,
it contains unibyte encoded text or binary non-text data.
You cannot set this variable directly; instead, use the function
set-buffer-multibyte
to change a buffer’s representation.
Buffer positions are measured in character units. This function
returns the byte-position corresponding to buffer position
position in the current buffer. This is 1 at the start of the
buffer, and counts upward in bytes. If position is out of
range, the value is nil
.
Return the buffer position, in character units, corresponding to given
byte-position in the current buffer. If byte-position is
out of range, the value is nil
. In a multibyte buffer, an
arbitrary value of byte-position can be not at character
boundary, but inside a multibyte sequence representing a single
character; in this case, this function returns the buffer position of
the character whose multibyte sequence includes byte-position.
In other words, the value does not change for all byte positions that
belong to the same character.
Return t
if string is a multibyte string, nil
otherwise. This function also returns nil
if string is
some object other than a string.
This function returns the number of bytes in string.
If string is a multibyte string, this can be greater than
(length string)
.
This function concatenates all its argument bytes and makes the result a unibyte string.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, Emacs starts in multibyte mode: it stores the contents of buffers and strings using an internal encoding that represents non-ASCII characters using multi-byte sequences. Multibyte mode allows you to use all the supported languages and scripts without limitations.
Under very special circumstances, you may want to disable multibyte character support, for a specific buffer. When multibyte characters are disabled in a buffer, we call that unibyte mode. In unibyte mode, each character in the buffer has a character code ranging from 0 through 255 (0377 octal); 0 through 127 (0177 octal) represent ASCII characters, and 128 (0200 octal) through 255 (0377 octal) represent non-ASCII characters.
To edit a particular file in unibyte representation, visit it using
find-file-literally
. See section Functions for Visiting Files. You can
convert a multibyte buffer to unibyte by saving it to a file, killing
the buffer, and visiting the file again with
find-file-literally
. Alternatively, you can use C-x
RET c (universal-coding-system-argument
) and specify
‘raw-text’ as the coding system with which to visit or save a
file. See Specifying a Coding System for File Text in GNU Emacs Manual. Unlike find-file-literally
, finding
a file as ‘raw-text’ doesn’t disable format conversion,
uncompression, or auto mode selection.
The buffer-local variable enable-multibyte-characters
is
non-nil
in multibyte buffers, and nil
in unibyte ones.
The mode line also indicates whether a buffer is multibyte or not.
With a graphical display, in a multibyte buffer, the portion of the
mode line that indicates the character set has a tooltip that (amongst
other things) says that the buffer is multibyte. In a unibyte buffer,
the character set indicator is absent. Thus, in a unibyte buffer
(when using a graphical display) there is normally nothing before the
indication of the visited file’s end-of-line convention (colon,
backslash, etc.), unless you are using an input method.
You can turn off multibyte support in a specific buffer by invoking the
command toggle-enable-multibyte-characters
in that buffer.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can convert unibyte text to multibyte; it can also convert multibyte text to unibyte, provided that the multibyte text contains only ASCII and 8-bit raw bytes. In general, these conversions happen when inserting text into a buffer, or when putting text from several strings together in one string. You can also explicitly convert a string’s contents to either representation.
Emacs chooses the representation for a string based on the text from which it is constructed. The general rule is to convert unibyte text to multibyte text when combining it with other multibyte text, because the multibyte representation is more general and can hold whatever characters the unibyte text has.
When inserting text into a buffer, Emacs converts the text to the
buffer’s representation, as specified by
enable-multibyte-characters
in that buffer. In particular, when
you insert multibyte text into a unibyte buffer, Emacs converts the text
to unibyte, even though this conversion cannot in general preserve all
the characters that might be in the multibyte text. The other natural
alternative, to convert the buffer contents to multibyte, is not
acceptable because the buffer’s representation is a choice made by the
user that cannot be overridden automatically.
Converting unibyte text to multibyte text leaves ASCII characters unchanged, and converts bytes with codes 128 through 255 to the multibyte representation of raw eight-bit bytes.
Converting multibyte text to unibyte converts all ASCII and eight-bit characters to their single-byte form, but loses information for non-ASCII characters by discarding all but the low 8 bits of each character’s codepoint. Converting unibyte text to multibyte and back to unibyte reproduces the original unibyte text.
The next two functions either return the argument string, or a newly created string with no text properties.
This function returns a multibyte string containing the same sequence
of characters as string. If string is a multibyte string,
it is returned unchanged. The function assumes that string
includes only ASCII characters and raw 8-bit bytes; the
latter are converted to their multibyte representation corresponding
to the codepoints #x3FFF80
through #x3FFFFF
, inclusive
(see section codepoints).
This function returns a unibyte string containing the same sequence of characters as string. It signals an error if string contains a non-ASCII character. If string is a unibyte string, it is returned unchanged. Use this function for string arguments that contain only ASCII and eight-bit characters.
This function returns a unibyte string containing a single byte of character data, character. It signals an error if character is not an integer between 0 and 255.
This converts the multibyte character char to a unibyte character, and returns that character. If char is neither ASCII nor eight-bit, the function returns -1.
This convert the unibyte character char to a multibyte character, assuming char is either ASCII or raw 8-bit byte.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes it is useful to examine an existing buffer or string as multibyte when it was unibyte, or vice versa.
Set the representation type of the current buffer. If multibyte
is non-nil
, the buffer becomes multibyte. If multibyte
is nil
, the buffer becomes unibyte.
This function leaves the buffer contents unchanged when viewed as a sequence of bytes. As a consequence, it can change the contents viewed as characters; for instance, a sequence of three bytes which is treated as one character in multibyte representation will count as three characters in unibyte representation. Eight-bit characters representing raw bytes are an exception. They are represented by one byte in a unibyte buffer, but when the buffer is set to multibyte, they are converted to two-byte sequences, and vice versa.
This function sets enable-multibyte-characters
to record which
representation is in use. It also adjusts various data in the buffer
(including overlays, text properties and markers) so that they cover the
same text as they did before.
This function signals an error if the buffer is narrowed, since the narrowing might have occurred in the middle of multibyte character sequences.
This function also signals an error if the buffer is an indirect buffer. An indirect buffer always inherits the representation of its base buffer.
If string is already a unibyte string, this function returns string itself. Otherwise, it returns a new string with the same bytes as string, but treating each byte as a separate character (so that the value may have more characters than string); as an exception, each eight-bit character representing a raw byte is converted into a single byte. The newly-created string contains no text properties.
If string is a multibyte string, this function returns string itself. Otherwise, it returns a new string with the same bytes as string, but treating each multibyte sequence as one character. This means that the value may have fewer characters than string has. If a byte sequence in string is invalid as a multibyte representation of a single character, each byte in the sequence is treated as a raw 8-bit byte. The newly-created string contains no text properties.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The unibyte and multibyte text representations use different
character codes. The valid character codes for unibyte representation
range from 0 to #xFF
(255)—the values that can fit in one
byte. The valid character codes for multibyte representation range
from 0 to #x3FFFFF
. In this code space, values 0 through
#x7F
(127) are for ASCII characters, and values
#x80
(128) through #x3FFF7F
(4194175) are for
non-ASCII characters.
Emacs character codes are a superset of the Unicode standard.
Values 0 through #x10FFFF
(1114111) correspond to Unicode
characters of the same codepoint; values #x110000
(1114112)
through #x3FFF7F
(4194175) represent characters that are not
unified with Unicode; and values #x3FFF80
(4194176) through
#x3FFFFF
(4194303) represent eight-bit raw bytes.
This returns t
if charcode is a valid character, and
nil
otherwise.
(characterp 65) ⇒ t
(characterp 4194303) ⇒ t
(characterp 4194304) ⇒ nil
This function returns the largest value that a valid character codepoint can have.
(characterp (max-char)) ⇒ t
(characterp (1+ (max-char))) ⇒ nil
This function returns the byte at character position pos in the current buffer. If the current buffer is unibyte, this is literally the byte at that position. If the buffer is multibyte, byte values of ASCII characters are the same as character codepoints, whereas eight-bit raw bytes are converted to their 8-bit codes. The function signals an error if the character at pos is non-ASCII.
The optional argument string means to get a byte value from that string instead of the current buffer.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A character property is a named attribute of a character that specifies how the character behaves and how it should be handled during text processing and display. Thus, character properties are an important part of specifying the character’s semantics.
On the whole, Emacs follows the Unicode Standard in its implementation of character properties. In particular, Emacs supports the Unicode Character Property Model, and the Emacs character property database is derived from the Unicode Character Database (UCD). See the Character Properties chapter of the Unicode Standard, for a detailed description of Unicode character properties and their meaning. This section assumes you are already familiar with that chapter of the Unicode Standard, and want to apply that knowledge to Emacs Lisp programs.
In Emacs, each property has a name, which is a symbol, and a set of
possible values, whose types depend on the property; if a character
does not have a certain property, the value is nil
. As a
general rule, the names of character properties in Emacs are produced
from the corresponding Unicode properties by downcasing them and
replacing each ‘_’ character with a dash ‘-’. For example,
Canonical_Combining_Class
becomes
canonical-combining-class
. However, sometimes we shorten the
names to make their use easier.
Some codepoints are left unassigned by the UCD—they don’t correspond to any character. The Unicode Standard defines default values of properties for such codepoints; they are mentioned below for each property.
Here is the full list of value types for all the character properties that Emacs knows about:
name
Corresponds to the Name
Unicode property. The value is a
string consisting of upper-case Latin letters A to Z, digits, spaces,
and hyphen ‘-’ characters. For unassigned codepoints, the value
is nil
.
general-category
Corresponds to the General_Category
Unicode property. The
value is a symbol whose name is a 2-letter abbreviation of the
character’s classification. For unassigned codepoints, the value
is Cn
.
canonical-combining-class
Corresponds to the Canonical_Combining_Class
Unicode property.
The value is an integer. For unassigned codepoints, the value
is zero.
bidi-class
Corresponds to the Unicode Bidi_Class
property. The value is a
symbol whose name is the Unicode directional type of the
character. Emacs uses this property when it reorders bidirectional
text for display (see section Bidirectional Display). For unassigned
codepoints, the value depends on the code blocks to which the
codepoint belongs: most unassigned codepoints get the value of
L
(strong L), but some get values of AL
(Arabic letter)
or R
(strong R).
decomposition
Corresponds to the Unicode properties Decomposition_Type
and
Decomposition_Value
. The value is a list, whose first element
may be a symbol representing a compatibility formatting tag, such as
small
16; the other elements are characters that give the
compatibility decomposition sequence of this character. For
unassigned codepoints, the value is the character itself.
decimal-digit-value
Corresponds to the Unicode Numeric_Value
property for
characters whose Numeric_Type
is ‘Decimal’. The value is
an integer. For unassigned codepoints, the value is
nil
, which means NaN, or “not-a-number”.
digit-value
Corresponds to the Unicode Numeric_Value
property for
characters whose Numeric_Type
is ‘Digit’. The value is an
integer. Examples of such characters include compatibility
subscript and superscript digits, for which the value is the
corresponding number. For unassigned codepoints, the value is
nil
, which means NaN.
numeric-value
Corresponds to the Unicode Numeric_Value
property for
characters whose Numeric_Type
is ‘Numeric’. The value of
this property is a number. Examples of
characters that have this property include fractions, subscripts,
superscripts, Roman numerals, currency numerators, and encircled
numbers. For example, the value of this property for the character
U+2155
(VULGAR FRACTION ONE FIFTH) is 0.2
. For
unassigned codepoints, the value is nil
, which means
NaN.
mirrored
Corresponds to the Unicode Bidi_Mirrored
property. The value
of this property is a symbol, either Y
or N
. For
unassigned codepoints, the value is N
.
mirroring
Corresponds to the Unicode Bidi_Mirroring_Glyph
property. The
value of this property is a character whose glyph represents the
mirror image of the character’s glyph, or nil
if there’s no
defined mirroring glyph. All the characters whose mirrored
property is N
have nil
as their mirroring
property; however, some characters whose mirrored
property is
Y
also have nil
for mirroring
, because no
appropriate characters exist with mirrored glyphs. Emacs uses this
property to display mirror images of characters when appropriate
(see section Bidirectional Display). For unassigned codepoints, the value
is nil
.
old-name
Corresponds to the Unicode Unicode_1_Name
property. The value
is a string. Unassigned codepoints, and characters that have no value
for this property, the value is nil
.
iso-10646-comment
Corresponds to the Unicode ISO_Comment
property. The value is
a string. For unassigned codepoints, the value is an empty string.
uppercase
Corresponds to the Unicode Simple_Uppercase_Mapping
property.
The value of this property is a single character. For unassigned
codepoints, the value is nil
, which means the character itself.
lowercase
Corresponds to the Unicode Simple_Lowercase_Mapping
property.
The value of this property is a single character. For unassigned
codepoints, the value is nil
, which means the character itself.
titlecase
Corresponds to the Unicode Simple_Titlecase_Mapping
property.
Title case is a special form of a character used when the first
character of a word needs to be capitalized. The value of this
property is a single character. For unassigned codepoints, the value
is nil
, which means the character itself.
This function returns the value of char’s propname property.
(get-char-code-property ?\s 'general-category) ⇒ Zs
(get-char-code-property ?1 'general-category) ⇒ Nd
;; subscript 4 (get-char-code-property ?\u2084 'digit-value) ⇒ 4
;; one fifth (get-char-code-property ?\u2155 'numeric-value) ⇒ 0.2
;; Roman IV (get-char-code-property ?\u2163 'numeric-value) ⇒ 4
This function returns the description string of property prop’s
value, or nil
if value has no description.
(char-code-property-description 'general-category 'Zs) ⇒ "Separator, Space"
(char-code-property-description 'general-category 'Nd) ⇒ "Number, Decimal Digit"
(char-code-property-description 'numeric-value '1/5) ⇒ nil
This function stores value as the value of the property propname for the character char.
The value of this variable is a char-table (see section Char-Tables) that
specifies, for each character, its Unicode General_Category
property as a symbol.
The value of this variable is a char-table that specifies, for each character, a symbol whose name is the script to which the character belongs, according to the Unicode Standard classification of the Unicode code space into script-specific blocks. This char-table has a single extra slot whose value is the list of all script symbols.
The value of this variable is a char-table that specifies the width of each character in columns that it will occupy on the screen.
The value of this variable is a char-table that specifies, for each
character, whether it is printable or not. That is, if evaluating
(aref printable-chars char)
results in t
, the character
is printable, and if it results in nil
, it is not.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An Emacs character set, or charset, is a set of characters
in which each character is assigned a numeric code point. (The
Unicode Standard calls this a coded character set.) Each Emacs
charset has a name which is a symbol. A single character can belong
to any number of different character sets, but it will generally have
a different code point in each charset. Examples of character sets
include ascii
, iso-8859-1
, greek-iso8859-7
, and
windows-1255
. The code point assigned to a character in a
charset is usually different from its code point used in Emacs buffers
and strings.
Emacs defines several special character sets. The character set
unicode
includes all the characters whose Emacs code points are
in the range 0..#x10FFFF
. The character set emacs
includes all ASCII and non-ASCII characters.
Finally, the eight-bit
charset includes the 8-bit raw bytes;
Emacs uses it to represent raw bytes encountered in text.
Returns t
if object is a symbol that names a character set,
nil
otherwise.
The value is a list of all defined character set names.
This function returns a list of all defined character sets ordered by
their priority. If highestp is non-nil
, the function
returns a single character set of the highest priority.
This function makes charsets the highest priority character sets.
This function returns the name of the character set of highest
priority that character belongs to. ASCII characters
are an exception: for them, this function always returns ascii
.
If restriction is non-nil
, it should be a list of
charsets to search. Alternatively, it can be a coding system, in
which case the returned charset must be supported by that coding
system (see section Coding Systems).
This function returns the property list of the character set charset. Although charset is a symbol, this is not the same as the property list of that symbol. Charset properties include important information about the charset, such as its documentation string, short name, etc.
This function sets the propname property of charset to the given value.
This function returns the value of charsets property propname.
This command displays a list of characters in the character set charset.
Emacs can convert between its internal representation of a character and the character’s codepoint in a specific charset. The following two functions support these conversions.
This function decodes a character that is assigned a code-point
in charset, to the corresponding Emacs character, and returns
it. If charset doesn’t contain a character of that code point,
the value is nil
. If code-point doesn’t fit in a Lisp
integer (see section most-positive-fixnum), it can be
specified as a cons cell (high . low)
, where
low are the lower 16 bits of the value and high are the
high 16 bits.
This function returns the code point assigned to the character
char in charset. If the result does not fit in a Lisp
integer, it is returned as a cons cell (high . low)
that fits the second argument of decode-char
above. If
charset doesn’t have a codepoint for char, the value is
nil
.
The following function comes in handy for applying a certain function to all or part of the characters in a charset:
Call function for characters in charset. function
is called with two arguments. The first one is a cons cell
(from . to)
, where from and to
indicate a range of characters contained in charset. The second
argument passed to function is arg.
By default, the range of codepoints passed to function includes
all the characters in charset, but optional arguments
from-code and to-code limit that to the range of
characters between these two codepoints of charset. If either
of them is nil
, it defaults to the first or last codepoint of
charset, respectively.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes it is useful to find out which character set a particular character belongs to. One use for this is in determining which coding systems (see section Coding Systems) are capable of representing all of the text in question; another is to determine the font(s) for displaying that text.
This function returns the charset of highest priority containing the
character at position pos in the current buffer. If pos
is omitted or nil
, it defaults to the current value of point.
If pos is out of range, the value is nil
.
This function returns a list of the character sets of highest priority that contain characters in the current buffer between positions beg and end.
The optional argument translation specifies a translation table
to use for scanning the text (see section Translation of Characters). If
it is non-nil
, then each character in the region is translated
through this table, and the value returned describes the translated
characters instead of the characters actually in the buffer.
This function returns a list of character sets of highest priority
that contain characters in string. It is just like
find-charset-region
, except that it applies to the contents of
string instead of part of the current buffer.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A translation table is a char-table (see section Char-Tables) that specifies a mapping of characters into characters. These tables are used in encoding and decoding, and for other purposes. Some coding systems specify their own particular translation tables; there are also default translation tables which apply to all other coding systems.
A translation table has two extra slots. The first is either
nil
or a translation table that performs the reverse
translation; the second is the maximum number of characters to look up
for translating sequences of characters (see the description of
make-translation-table-from-alist
below).
This function returns a translation table based on the argument
translations. Each element of translations should be a
list of elements of the form (from . to)
; this says
to translate the character from into to.
The arguments and the forms in each argument are processed in order, and if a previous form already translates to to some other character, say to-alt, from is also translated to to-alt.
During decoding, the translation table’s translations are applied to
the characters that result from ordinary decoding. If a coding system
has the property :decode-translation-table
, that specifies the
translation table to use, or a list of translation tables to apply in
sequence. (This is a property of the coding system, as returned by
coding-system-get
, not a property of the symbol that is the
coding system’s name. See section Basic Concepts of
Coding Systems.) Finally, if
standard-translation-table-for-decode
is non-nil
, the
resulting characters are translated by that table.
During encoding, the translation table’s translations are applied to
the characters in the buffer, and the result of translation is
actually encoded. If a coding system has property
:encode-translation-table
, that specifies the translation table
to use, or a list of translation tables to apply in sequence. In
addition, if the variable standard-translation-table-for-encode
is non-nil
, it specifies the translation table to use for
translating the result.
This is the default translation table for decoding. If a coding
systems specifies its own translation tables, the table that is the
value of this variable, if non-nil
, is applied after them.
This is the default translation table for encoding. If a coding
systems specifies its own translation tables, the table that is the
value of this variable, if non-nil
, is applied after them.
Self-inserting characters are translated through this translation table before they are inserted. Search commands also translate their input through this table, so they can compare more reliably with what’s in the buffer.
This variable automatically becomes buffer-local when set.
This function returns a translation table made from vec that is
an array of 256 elements to map bytes (values 0 through #xFF) to
characters. Elements may be nil
for untranslated bytes. The
returned table has a translation table for reverse mapping in the
first extra slot, and the value 1
in the second extra slot.
This function provides an easy way to make a private coding system
that maps each byte to a specific character. You can specify the
returned table and the reverse translation table using the properties
:decode-translation-table
and :encode-translation-table
respectively in the props argument to
define-coding-system
.
This function is similar to make-translation-table
but returns
a complex translation table rather than a simple one-to-one mapping.
Each element of alist is of the form (from
. to)
, where from and to are either characters or
vectors specifying a sequence of characters. If from is a
character, that character is translated to to (i.e., to a
character or a character sequence). If from is a vector of
characters, that sequence is translated to to. The returned
table has a translation table for reverse mapping in the first extra
slot, and the maximum length of all the from character sequences
in the second extra slot.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs reads or writes a file, and when Emacs sends text to a subprocess or receives text from a subprocess, it normally performs character code conversion and end-of-line conversion as specified by a particular coding system.
How to define a coding system is an arcane matter, and is not documented here.
32.10.1 Basic Concepts of Coding Systems | Basic concepts. | |
32.10.2 Encoding and I/O | How file I/O functions handle coding systems. | |
32.10.3 Coding Systems in Lisp | Functions to operate on coding system names. | |
32.10.4 User-Chosen Coding Systems | Asking the user to choose a coding system. | |
32.10.5 Default Coding Systems | Controlling the default choices. | |
32.10.6 Specifying a Coding System for One Operation | Requesting a particular coding system for a single file operation. | |
32.10.7 Explicit Encoding and Decoding | Encoding or decoding text without doing I/O. | |
32.10.8 Terminal I/O Encoding | Use of encoding for terminal I/O. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Character code conversion involves conversion between the internal representation of characters used inside Emacs and some other encoding. Emacs supports many different encodings, in that it can convert to and from them. For example, it can convert text to or from encodings such as Latin 1, Latin 2, Latin 3, Latin 4, Latin 5, and several variants of ISO 2022. In some cases, Emacs supports several alternative encodings for the same characters; for example, there are three coding systems for the Cyrillic (Russian) alphabet: ISO, Alternativnyj, and KOI8.
Every coding system specifies a particular set of character code
conversions, but the coding system undecided
is special: it
leaves the choice unspecified, to be chosen heuristically for each
file, based on the file’s data.
In general, a coding system doesn’t guarantee roundtrip identity: decoding a byte sequence using coding system, then encoding the resulting text in the same coding system, can produce a different byte sequence. But some coding systems do guarantee that the byte sequence will be the same as what you originally decoded. Here are a few examples:
iso-8859-1, utf-8, big5, shift_jis, euc-jp
Encoding buffer text and then decoding the result can also fail to reproduce the original text. For instance, if you encode a character with a coding system which does not support that character, the result is unpredictable, and thus decoding it using the same coding system may produce a different text. Currently, Emacs can’t report errors that result from encoding unsupported characters.
End of line conversion handles three different conventions used on various systems for representing end of line in files. The Unix convention, used on GNU and Unix systems, is to use the linefeed character (also called newline). The DOS convention, used on MS-Windows and MS-DOS systems, is to use a carriage-return and a linefeed at the end of a line. The Mac convention is to use just carriage-return. (This was the convention used on the Macintosh system prior to OS X.)
Base coding systems such as latin-1
leave the end-of-line
conversion unspecified, to be chosen based on the data. Variant
coding systems such as latin-1-unix
, latin-1-dos
and
latin-1-mac
specify the end-of-line conversion explicitly as
well. Most base coding systems have three corresponding variants whose
names are formed by adding ‘-unix’, ‘-dos’ and ‘-mac’.
The coding system raw-text
is special in that it prevents
character code conversion, and causes the buffer visited with this
coding system to be a unibyte buffer. For historical reasons, you can
save both unibyte and multibyte text with this coding system. When
you use raw-text
to encode multibyte text, it does perform one
character code conversion: it converts eight-bit characters to their
single-byte external representation. raw-text
does not specify
the end-of-line conversion, allowing that to be determined as usual by
the data, and has the usual three variants which specify the
end-of-line conversion.
no-conversion
(and its alias binary
) is equivalent to
raw-text-unix
: it specifies no conversion of either character
codes or end-of-line.
The coding system utf-8-emacs
specifies that the data is
represented in the internal Emacs encoding (see section Text Representations). This is like raw-text
in that no code
conversion happens, but different in that the result is multibyte
data. The name emacs-internal
is an alias for
utf-8-emacs
.
This function returns the specified property of the coding system
coding-system. Most coding system properties exist for internal
purposes, but one that you might find useful is :mime-charset
.
That property’s value is the name used in MIME for the character coding
which this coding system can read and write. Examples:
(coding-system-get 'iso-latin-1 :mime-charset) ⇒ iso-8859-1 (coding-system-get 'iso-2022-cn :mime-charset) ⇒ iso-2022-cn (coding-system-get 'cyrillic-koi8 :mime-charset) ⇒ koi8-r
The value of the :mime-charset
property is also defined
as an alias for the coding system.
This function returns the list of aliases of coding-system.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The principal purpose of coding systems is for use in reading and
writing files. The function insert-file-contents
uses a coding
system to decode the file data, and write-region
uses one to
encode the buffer contents.
You can specify the coding system to use either explicitly
(see section Specifying a Coding System for One Operation), or implicitly using a default
mechanism (see section Default Coding Systems). But these methods may not
completely specify what to do. For example, they may choose a coding
system such as undefined
which leaves the character code
conversion to be determined from the data. In these cases, the I/O
operation finishes the job of choosing a coding system. Very often
you will want to find out afterwards which coding system was chosen.
This buffer-local variable records the coding system used for saving the
buffer and for writing part of the buffer with write-region
. If
the text to be written cannot be safely encoded using the coding system
specified by this variable, these operations select an alternative
encoding by calling the function select-safe-coding-system
(see section User-Chosen Coding Systems). If selecting a different encoding
requires to ask the user to specify a coding system,
buffer-file-coding-system
is updated to the newly selected coding
system.
buffer-file-coding-system
does not affect sending text
to a subprocess.
This variable specifies the coding system for saving the buffer (by
overriding buffer-file-coding-system
). Note that it is not used
for write-region
.
When a command to save the buffer starts out to use
buffer-file-coding-system
(or save-buffer-coding-system
),
and that coding system cannot handle
the actual text in the buffer, the command asks the user to choose
another coding system (by calling select-safe-coding-system
).
After that happens, the command also updates
buffer-file-coding-system
to represent the coding system that
the user specified.
I/O operations for files and subprocesses set this variable to the coding system name that was used. The explicit encoding and decoding functions (see section Explicit Encoding and Decoding) set it too.
Warning: Since receiving subprocess output sets this variable, it can change whenever Emacs waits; therefore, you should copy the value shortly after the function call that stores the value you are interested in.
The variable selection-coding-system
specifies how to encode
selections for the window system. See section Window System Selections.
The variable file-name-coding-system
specifies the coding
system to use for encoding file names. Emacs encodes file names using
that coding system for all file operations. If
file-name-coding-system
is nil
, Emacs uses a default
coding system determined by the selected language environment. In the
default language environment, any non-ASCII characters in
file names are not encoded specially; they appear in the file system
using the internal Emacs representation.
Warning: if you change file-name-coding-system
(or
the language environment) in the middle of an Emacs session, problems
can result if you have already visited files whose names were encoded
using the earlier coding system and are handled differently under the
new coding system. If you try to save one of these buffers under the
visited file name, saving may use the wrong file name, or it may get
an error. If such a problem happens, use C-x C-w to specify a
new file name for that buffer.
On Windows 2000 and later, Emacs by default uses Unicode APIs to
pass file names to the OS, so the value of
file-name-coding-system
is largely ignored. Lisp applications
that need to encode or decode file names on the Lisp level should use
utf-8
coding-system when system-type
is
windows-nt
; the conversion of UTF-8 encoded file names to the
encoding appropriate for communicating with the OS is performed
internally by Emacs.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are the Lisp facilities for working with coding systems:
This function returns a list of all coding system names (symbols). If
base-only is non-nil
, the value includes only the
base coding systems. Otherwise, it includes alias and variant coding
systems as well.
This function returns t
if object is a coding system
name or nil
.
This function checks the validity of coding-system. If that is
valid, it returns coding-system. If coding-system is
nil
, the function return nil
. For any other values, it
signals an error whose error-symbol
is coding-system-error
(see section signal).
This function returns the type of end-of-line (a.k.a. eol)
conversion used by coding-system. If coding-system
specifies a certain eol conversion, the return value is an integer 0,
1, or 2, standing for unix
, dos
, and mac
,
respectively. If coding-system doesn’t specify eol conversion
explicitly, the return value is a vector of coding systems, each one
with one of the possible eol conversion types, like this:
(coding-system-eol-type 'latin-1) ⇒ [latin-1-unix latin-1-dos latin-1-mac]
If this function returns a vector, Emacs will decide, as part of the
text encoding or decoding process, what eol conversion to use. For
decoding, the end-of-line format of the text is auto-detected, and the
eol conversion is set to match it (e.g., DOS-style CRLF format will
imply dos
eol conversion). For encoding, the eol conversion is
taken from the appropriate default coding system (e.g.,
default value of buffer-file-coding-system
for
buffer-file-coding-system
), or from the default eol conversion
appropriate for the underlying platform.
This function returns a coding system which is like coding-system
except for its eol conversion, which is specified by eol-type
.
eol-type should be unix
, dos
, mac
, or
nil
. If it is nil
, the returned coding system determines
the end-of-line conversion from the data.
eol-type may also be 0, 1 or 2, standing for unix
,
dos
and mac
, respectively.
This function returns a coding system which uses the end-of-line
conversion of eol-coding, and the text conversion of
text-coding. If text-coding is nil
, it returns
undecided
, or one of its variants according to eol-coding.
This function returns a list of coding systems that could be used to encode a text between from and to. All coding systems in the list can safely encode any multibyte characters in that portion of the text.
If the text contains no multibyte characters, the function returns the
list (undecided)
.
This function returns a list of coding systems that could be used to
encode the text of string. All coding systems in the list can
safely encode any multibyte characters in string. If the text
contains no multibyte characters, this returns the list
(undecided)
.
This function returns a list of coding systems that could be used to encode all the character sets in the list charsets.
This function checks whether coding systems in the list
coding-system-list
can encode all the characters in the region
between start and end. If all of the coding systems in
the list can encode the specified text, the function returns
nil
. If some coding systems cannot encode some of the
characters, the value is an alist, each element of which has the form
(coding-system1 pos1 pos2 …)
, meaning
that coding-system1 cannot encode characters at buffer positions
pos1, pos2, ....
start may be a string, in which case end is ignored and the returned value references string indices instead of buffer positions.
This function chooses a plausible coding system for decoding the text from start to end. This text should be a byte sequence, i.e., unibyte text or multibyte text with only ASCII and eight-bit characters (see section Explicit Encoding and Decoding).
Normally this function returns a list of coding systems that could
handle decoding the text that was scanned. They are listed in order of
decreasing priority. But if highest is non-nil
, then the
return value is just one coding system, the one that is highest in
priority.
If the region contains only ASCII characters except for such
ISO-2022 control characters ISO-2022 as ESC
, the value is
undecided
or (undecided)
, or a variant specifying
end-of-line conversion, if that can be deduced from the text.
If the region contains null bytes, the value is no-conversion
,
even if the region contains text encoded in some coding system.
This function is like detect-coding-region
except that it
operates on the contents of string instead of bytes in the buffer.
If this variable has a non-nil
value, null bytes are ignored
when detecting the encoding of a region or a string. This allows to
correctly detect the encoding of text that contains null bytes, such
as Info files with Index nodes.
If this variable has a non-nil
value, ISO-2022 escape sequences
are ignored when detecting the encoding of a region or a string. The
result is that no text is ever detected as encoded in some ISO-2022
encoding, and all escape sequences become visible in a buffer.
Warning: Use this variable with extreme caution,
because many files in the Emacs distribution use ISO-2022 encoding.
This function returns the list of character sets (see section Character Sets) supported by coding-system. Some coding systems that support too many character sets to list them all yield special values:
(emacs)
.
(unicode)
.
iso-2022
.
emacs-mule
.
See Process Information, in
particular the description of the functions
process-coding-system
and set-process-coding-system
, for
how to examine or set the coding systems used for I/O to a subprocess.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function selects a coding system for encoding specified text, asking the user to choose if necessary. Normally the specified text is the text in the current buffer between from and to. If from is a string, the string specifies the text to encode, and to is ignored.
If the specified text includes raw bytes (see section Text Representations), select-safe-coding-system
suggests
raw-text
for its encoding.
If default-coding-system is non-nil
, that is the first
coding system to try; if that can handle the text,
select-safe-coding-system
returns that coding system. It can
also be a list of coding systems; then the function tries each of them
one by one. After trying all of them, it next tries the current
buffer’s value of buffer-file-coding-system
(if it is not
undecided
), then the default value of
buffer-file-coding-system
and finally the user’s most
preferred coding system, which the user can set using the command
prefer-coding-system
(see Recognizing
Coding Systems in The GNU Emacs Manual).
If one of those coding systems can safely encode all the specified
text, select-safe-coding-system
chooses it and returns it.
Otherwise, it asks the user to choose from a list of coding systems
which can encode all the text, and returns the user’s choice.
default-coding-system can also be a list whose first element is
t and whose other elements are coding systems. Then, if no coding
system in the list can handle the text, select-safe-coding-system
queries the user immediately, without trying any of the three
alternatives described above.
The optional argument accept-default-p, if non-nil
,
should be a function to determine whether a coding system selected
without user interaction is acceptable. select-safe-coding-system
calls this function with one argument, the base coding system of the
selected coding system. If accept-default-p returns nil
,
select-safe-coding-system
rejects the silently selected coding
system, and asks the user to select a coding system from a list of
possible candidates.
If the variable select-safe-coding-system-accept-default-p
is
non-nil
, it should be a function taking a single argument.
It is used in place of accept-default-p, overriding any
value supplied for this argument.
As a final step, before returning the chosen coding system,
select-safe-coding-system
checks whether that coding system is
consistent with what would be selected if the contents of the region
were read from a file. (If not, this could lead to data corruption in
a file subsequently re-visited and edited.) Normally,
select-safe-coding-system
uses buffer-file-name
as the
file for this purpose, but if file is non-nil
, it uses
that file instead (this can be relevant for write-region
and
similar functions). If it detects an apparent inconsistency,
select-safe-coding-system
queries the user before selecting the
coding system.
Here are two functions you can use to let the user specify a coding system, with completion. See section Completion.
This function reads a coding system using the minibuffer, prompting with string prompt, and returns the coding system name as a symbol. If the user enters null input, default specifies which coding system to return. It should be a symbol or a string.
This function reads a coding system using the minibuffer, prompting with string prompt, and returns the coding system name as a symbol. If the user tries to enter null input, it asks the user to try again. See section Coding Systems.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes variables that specify the default coding system for certain files or when running certain subprograms, and the function that I/O operations use to access them.
The idea of these variables is that you set them once and for all to the
defaults you want, and then do not change them again. To specify a
particular coding system for a particular operation in a Lisp program,
don’t change these variables; instead, override them using
coding-system-for-read
and coding-system-for-write
(see section Specifying a Coding System for One Operation).
This variable is an alist of text patterns and corresponding coding
systems. Each element has the form (regexp
. coding-system)
; a file whose first few kilobytes match
regexp is decoded with coding-system when its contents are
read into a buffer. The settings in this alist take priority over
coding:
tags in the files and the contents of
file-coding-system-alist
(see below). The default value is set
so that Emacs automatically recognizes mail files in Babyl format and
reads them with no code conversions.
This variable is an alist that specifies the coding systems to use for
reading and writing particular files. Each element has the form
(pattern . coding)
, where pattern is a regular
expression that matches certain file names. The element applies to file
names that match pattern.
The CDR of the element, coding, should be either a coding system, a cons cell containing two coding systems, or a function name (a symbol with a function definition). If coding is a coding system, that coding system is used for both reading the file and writing it. If coding is a cons cell containing two coding systems, its CAR specifies the coding system for decoding, and its CDR specifies the coding system for encoding.
If coding is a function name, the function should take one
argument, a list of all arguments passed to
find-operation-coding-system
. It must return a coding system
or a cons cell containing two coding systems. This value has the same
meaning as described above.
If coding (or what returned by the above function) is
undecided
, the normal code-detection is performed.
This variable is an alist that specifies the coding systems to use for
reading and writing particular files. Its form is like that of
file-coding-system-alist
, but, unlike the latter, this variable
takes priority over any coding:
tags in the file.
This variable is an alist specifying which coding systems to use for a
subprocess, depending on which program is running in the subprocess. It
works like file-coding-system-alist
, except that pattern is
matched against the program name used to start the subprocess. The coding
system or systems specified in this alist are used to initialize the
coding systems used for I/O to the subprocess, but you can specify
other coding systems later using set-process-coding-system
.
Warning: Coding systems such as undecided
, which
determine the coding system from the data, do not work entirely reliably
with asynchronous subprocess output. This is because Emacs handles
asynchronous subprocess output in batches, as it arrives. If the coding
system leaves the character code conversion unspecified, or leaves the
end-of-line conversion unspecified, Emacs must try to detect the proper
conversion from one batch at a time, and this does not always work.
Therefore, with an asynchronous subprocess, if at all possible, use a
coding system which determines both the character code conversion and
the end of line conversion—that is, one like latin-1-unix
,
rather than undecided
or latin-1
.
This variable is an alist that specifies the coding system to use for
network streams. It works much like file-coding-system-alist
,
with the difference that the pattern in an element may be either a
port number or a regular expression. If it is a regular expression, it
is matched against the network service name used to open the network
stream.
This variable specifies the coding systems to use for subprocess (and network stream) input and output, when nothing else specifies what to do.
The value should be a cons cell of the form (input-coding
. output-coding)
. Here input-coding applies to input from
the subprocess, and output-coding applies to output to it.
This variable holds a list of functions that try to determine a coding system for a file based on its undecoded contents.
Each function in this list should be written to look at text in the
current buffer, but should not modify it in any way. The buffer will
contain undecoded text of parts of the file. Each function should
take one argument, size, which tells it how many characters to
look at, starting from point. If the function succeeds in determining
a coding system for the file, it should return that coding system.
Otherwise, it should return nil
.
If a file has a ‘coding:’ tag, that takes precedence, so these functions won’t be called.
This function tries to determine a suitable coding system for
filename. It examines the buffer visiting the named file, using
the variables documented above in sequence, until it finds a match for
one of the rules specified by these variables. It then returns a cons
cell of the form (coding . source)
, where
coding is the coding system to use and source is a symbol,
one of auto-coding-alist
, auto-coding-regexp-alist
,
:coding
, or auto-coding-functions
, indicating which one
supplied the matching rule. The value :coding
means the coding
system was specified by the coding:
tag in the file
(see coding tag in The GNU Emacs Manual).
The order of looking for a matching rule is auto-coding-alist
first, then auto-coding-regexp-alist
, then the coding:
tag, and lastly auto-coding-functions
. If no matching rule was
found, the function returns nil
.
The second argument size is the size of text, in characters,
following point. The function examines text only within size
characters after point. Normally, the buffer should be positioned at
the beginning when this function is called, because one of the places
for the coding:
tag is the first one or two lines of the file;
in that case, size should be the size of the buffer.
This function returns a suitable coding system for file
filename. It uses find-auto-coding
to find the coding
system. If no coding system could be determined, the function returns
nil
. The meaning of the argument size is like in
find-auto-coding
.
This function returns the coding system to use (by default) for performing operation with arguments. The value has this form:
(decoding-system . encoding-system)
The first element, decoding-system, is the coding system to use for decoding (in case operation does decoding), and encoding-system is the coding system for encoding (in case operation does encoding).
The argument operation is a symbol; it should be one of
write-region
, start-process
, call-process
,
call-process-region
, insert-file-contents
, or
open-network-stream
. These are the names of the Emacs I/O
primitives that can do character code and eol conversion.
The remaining arguments should be the same arguments that might be given
to the corresponding I/O primitive. Depending on the primitive, one
of those arguments is selected as the target. For example, if
operation does file I/O, whichever argument specifies the file
name is the target. For subprocess primitives, the process name is the
target. For open-network-stream
, the target is the service name
or port number.
Depending on operation, this function looks up the target in
file-coding-system-alist
, process-coding-system-alist
,
or network-coding-system-alist
. If the target is found in the
alist, find-operation-coding-system
returns its association in
the alist; otherwise it returns nil
.
If operation is insert-file-contents
, the argument
corresponding to the target may be a cons cell of the form
(filename . buffer)
. In that case, filename
is a file name to look up in file-coding-system-alist
, and
buffer is a buffer that contains the file’s contents (not yet
decoded). If file-coding-system-alist
specifies a function to
call for this file, and that function needs to examine the file’s
contents (as it usually does), it should examine the contents of
buffer instead of reading the file.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can specify the coding system for a specific operation by binding
the variables coding-system-for-read
and/or
coding-system-for-write
.
If this variable is non-nil
, it specifies the coding system to
use for reading a file, or for input from a synchronous subprocess.
It also applies to any asynchronous subprocess or network stream, but in
a different way: the value of coding-system-for-read
when you
start the subprocess or open the network stream specifies the input
decoding method for that subprocess or network stream. It remains in
use for that subprocess or network stream unless and until overridden.
The right way to use this variable is to bind it with let
for a
specific I/O operation. Its global value is normally nil
, and
you should not globally set it to any other value. Here is an example
of the right way to use the variable:
;; Read the file with no character code conversion.
(let ((coding-system-for-read 'no-conversion))
(insert-file-contents filename))
When its value is non-nil
, this variable takes precedence over
all other methods of specifying a coding system to use for input,
including file-coding-system-alist
,
process-coding-system-alist
and
network-coding-system-alist
.
This works much like coding-system-for-read
, except that it
applies to output rather than input. It affects writing to files,
as well as sending output to subprocesses and net connections.
When a single operation does both input and output, as do
call-process-region
and start-process
, both
coding-system-for-read
and coding-system-for-write
affect it.
When this variable is non-nil
, no end-of-line conversion is done,
no matter which coding system is specified. This applies to all the
Emacs I/O and subprocess primitives, and to the explicit encoding and
decoding functions (see section Explicit Encoding and Decoding).
Sometimes, you need to prefer several coding systems for some
operation, rather than fix a single one. Emacs lets you specify a
priority order for using coding systems. This ordering affects the
sorting of lists of coding systems returned by functions such as
find-coding-systems-region
(see section Coding Systems in Lisp).
This function returns the list of coding systems in the order of their
current priorities. Optional argument highestp, if
non-nil
, means return only the highest priority coding system.
This function puts coding-systems at the beginning of the priority list for coding systems, thus making their priority higher than all the rest.
This macro execute body, like progn
does
(see section progn), with coding-systems at the front of
the priority list for coding systems. coding-systems should be
a list of coding systems to prefer during execution of body.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
All the operations that transfer text in and out of Emacs have the ability to use a coding system to encode or decode the text. You can also explicitly encode and decode text using the functions in this section.
The result of encoding, and the input to decoding, are not ordinary text. They logically consist of a series of byte values; that is, a series of ASCII and eight-bit characters. In unibyte buffers and strings, these characters have codes in the range 0 through #xFF (255). In a multibyte buffer or string, eight-bit characters have character codes higher than #xFF (see section Text Representations), but Emacs transparently converts them to their single-byte values when you encode or decode such text.
The usual way to read a file into a buffer as a sequence of bytes, so
you can decode the contents explicitly, is with
insert-file-contents-literally
(see section Reading from Files);
alternatively, specify a non-nil
rawfile argument when
visiting a file with find-file-noselect
. These methods result in
a unibyte buffer.
The usual way to use the byte sequence that results from explicitly
encoding text is to copy it to a file or process—for example, to write
it with write-region
(see section Writing to Files), and suppress
encoding by binding coding-system-for-write
to
no-conversion
.
Here are the functions to perform explicit encoding or decoding. The
encoding functions produce sequences of bytes; the decoding functions
are meant to operate on sequences of bytes. All of these functions
discard text properties. They also set last-coding-system-used
to the precise coding system they used.
This command encodes the text from start to end according
to coding system coding-system. Normally, the encoded text
replaces the original text in the buffer, but the optional argument
destination can change that. If destination is a buffer,
the encoded text is inserted in that buffer after point (point does
not move); if it is t
, the command returns the encoded text as
a unibyte string without inserting it.
If encoded text is inserted in some buffer, this command returns the length of the encoded text.
The result of encoding is logically a sequence of bytes, but the buffer remains multibyte if it was multibyte before, and any 8-bit bytes are converted to their multibyte representation (see section Text Representations).
Do not use undecided
for coding-system when
encoding text, since that may lead to unexpected results. Instead,
use select-safe-coding-system
(see section select-safe-coding-system) to suggest a suitable encoding,
if there’s no obvious pertinent value for coding-system.
This function encodes the text in string according to coding
system coding-system. It returns a new string containing the
encoded text, except when nocopy is non-nil
, in which
case the function may return string itself if the encoding
operation is trivial. The result of encoding is a unibyte string.
This command decodes the text from start to end according
to coding system coding-system. To make explicit decoding
useful, the text before decoding ought to be a sequence of byte
values, but both multibyte and unibyte buffers are acceptable (in the
multibyte case, the raw byte values should be represented as eight-bit
characters). Normally, the decoded text replaces the original text in
the buffer, but the optional argument destination can change
that. If destination is a buffer, the decoded text is inserted
in that buffer after point (point does not move); if it is t
,
the command returns the decoded text as a multibyte string without
inserting it.
If decoded text is inserted in some buffer, this command returns the length of the decoded text.
This command puts a charset
text property on the decoded text.
The value of the property states the character set used to decode the
original text.
This function decodes the text in string according to
coding-system. It returns a new string containing the decoded
text, except when nocopy is non-nil
, in which case the
function may return string itself if the decoding operation is
trivial. To make explicit decoding useful, the contents of
string ought to be a unibyte string with a sequence of byte
values, but a multibyte string is also acceptable (assuming it
contains 8-bit bytes in their multibyte form).
If optional argument buffer specifies a buffer, the decoded text is inserted in that buffer after point (point does not move). In this case, the return value is the length of the decoded text.
This function puts a charset
text property on the decoded text.
The value of the property states the character set used to decode the
original text:
(decode-coding-string "Gr\374ss Gott" 'latin-1) ⇒ #("Grüss Gott" 0 9 (charset iso-8859-1))
This function decodes the text from from to to as if
it were being read from file filename using insert-file-contents
using the rest of the arguments provided.
The normal way to use this function is after reading text from a file without decoding, if you decide you would rather have decoded it. Instead of deleting the text and reading it again, this time with decoding, you can call this function.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can use coding systems to decode keyboard input and encode
terminal output. This is useful for terminals that transmit or
display text using a particular encoding, such as Latin-1. Emacs does
not set last-coding-system-used
when encoding or decoding
terminal I/O.
This function returns the coding system used for decoding keyboard
input from terminal. A value of no-conversion
means no
decoding is done. If terminal is omitted or nil
, it
means the selected frame’s terminal. See section Multiple Terminals.
This command specifies coding-system as the coding system to use
for decoding keyboard input from terminal. If
coding-system is nil
, that means not to decode keyboard
input. If terminal is a frame, it means that frame’s terminal;
if it is nil
, that means the currently selected frame’s
terminal. See section Multiple Terminals.
This function returns the coding system that is in use for encoding
terminal output from terminal. A value of no-conversion
means no encoding is done. If terminal is a frame, it means
that frame’s terminal; if it is nil
, that means the currently
selected frame’s terminal.
This command specifies coding-system as the coding system to use
for encoding terminal output from terminal. If
coding-system is nil
, that means not to encode terminal
output. If terminal is a frame, it means that frame’s terminal;
if it is nil
, that means the currently selected frame’s
terminal.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Input methods provide convenient ways of entering non-ASCII characters from the keyboard. Unlike coding systems, which translate non-ASCII characters to and from encodings meant to be read by programs, input methods provide human-friendly commands. (See Input Methods in The GNU Emacs Manual, for information on how users use input methods to enter text.) How to define input methods is not yet documented in this manual, but here we describe how to use them.
Each input method has a name, which is currently a string; in the future, symbols may also be usable as input method names.
This variable holds the name of the input method now active in the
current buffer. (It automatically becomes local in each buffer when set
in any fashion.) It is nil
if no input method is active in the
buffer now.
This variable holds the default input method for commands that choose an
input method. Unlike current-input-method
, this variable is
normally global.
This command activates input method input-method for the current
buffer. It also sets default-input-method
to input-method.
If input-method is nil
, this command deactivates any input
method for the current buffer.
This function reads an input method name with the minibuffer, prompting
with prompt. If default is non-nil
, that is returned
by default, if the user enters empty input. However, if
inhibit-null is non-nil
, empty input signals an error.
The returned value is a string.
This variable defines all the supported input methods. Each element defines one input method, and should have the form:
(input-method language-env activate-func title description args...)
Here input-method is the input method name, a string; language-env is another string, the name of the language environment this input method is recommended for. (That serves only for documentation purposes.)
activate-func is a function to call to activate this method. The args, if any, are passed as arguments to activate-func. All told, the arguments to activate-func are input-method and the args.
title is a string to display in the mode line while this method is active. description is a string describing this method and what it is good for.
The fundamental interface to input methods is through the
variable input-method-function
. See section Reading One Event,
and Invoking the Input Method.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
POSIX defines a concept of “locales” which control which language to use in language-related features. These Emacs variables control how Emacs interacts with these features.
This variable specifies the coding system to use for decoding system
error messages and—on X Window system only—keyboard input, for
encoding the format argument to format-time-string
, and for
decoding the return value of format-time-string
.
This variable specifies the locale to use for generating system error
messages. Changing the locale can cause messages to come out in a
different language or in a different orthography. If the variable is
nil
, the locale is specified by environment variables in the
usual POSIX fashion.
This variable specifies the locale to use for formatting time values.
Changing the locale can cause messages to appear according to the
conventions of a different language. If the variable is nil
, the
locale is specified by environment variables in the usual POSIX fashion.
This function returns locale data item for the current POSIX locale, if available. item should be one of these symbols:
codeset
Return the character set as a string (locale item CODESET
).
days
Return a 7-element vector of day names (locale items
DAY_1
through DAY_7
);
months
Return a 12-element vector of month names (locale items MON_1
through MON_12
).
paper
Return a list (width height)
for the default paper
size measured in millimeters (locale items PAPER_WIDTH
and
PAPER_HEIGHT
).
If the system can’t provide the requested information, or if
item is not one of those symbols, the value is nil
. All
strings in the return value are decoded using
locale-coding-system
. See Locales in The GNU Libc Manual,
for more information about locales and locale items.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU Emacs provides two ways to search through a buffer for specified text: exact string searches and regular expression searches. After a regular expression search, you can examine the match data to determine which text matched the whole regular expression or various portions of it.
33.1 Searching for Strings | Search for an exact match. | |
33.2 Searching and Case | Case-independent or case-significant searching. | |
33.3 Regular Expressions | Describing classes of strings. | |
33.4 Regular Expression Searching | Searching for a match for a regexp. | |
33.5 POSIX Regular Expression Searching | Searching POSIX-style for the longest match. | |
33.6 The Match Data | Finding out which part of the text matched, after a string or regexp search. | |
33.7 Search and Replace | Commands that loop, searching and replacing. | |
33.8 Standard Regular Expressions Used in Editing | Useful regexps for finding sentences, pages,... |
The ‘skip-chars…’ functions also perform a kind of searching. See section Skipping Characters. To search for changes in character properties, see Text Property Search Functions.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These are the primitive functions for searching through the text in a
buffer. They are meant for use in programs, but you may call them
interactively. If you do so, they prompt for the search string; the
arguments limit and noerror are nil
, and repeat
is 1. For more details on interactive searching, see Searching and Replacement in The GNU Emacs Manual.
These search functions convert the search string to multibyte if the buffer is multibyte; they convert the search string to unibyte if the buffer is unibyte. See section Text Representations.
This function searches forward from point for an exact match for string. If successful, it sets point to the end of the occurrence found, and returns the new value of point. If no match is found, the value and side effects depend on noerror (see below).
In the following example, point is initially at the beginning of the
line. Then (search-forward "fox")
moves point after the last
letter of ‘fox’:
---------- Buffer: foo ---------- ∗The quick brown fox jumped over the lazy dog. ---------- Buffer: foo ----------
(search-forward "fox") ⇒ 20 ---------- Buffer: foo ---------- The quick brown fox∗ jumped over the lazy dog. ---------- Buffer: foo ----------
The argument limit specifies the bound to the search, and should
be a position in the current buffer. No match extending after
that position is accepted. If limit is omitted or nil
, it
defaults to the end of the accessible portion of the buffer.
What happens when the search fails depends on the value of
noerror. If noerror is nil
, a search-failed
error is signaled. If noerror is t
, search-forward
returns nil
and does nothing. If noerror is neither
nil
nor t
, then search-forward
moves point to the
upper bound and returns nil
.
The argument noerror only affects valid searches which fail to find a match. Invalid arguments cause errors regardless of noerror.
If repeat is a positive number n, it serves as a repeat count: the search is repeated n times, each time starting at the end of the previous time’s match. If these successive searches succeed, the function succeeds, moving point and returning its new value. Otherwise the search fails, with results depending on the value of noerror, as described above. If repeat is a negative number -n, it serves as a repeat count of n for a search in the opposite (backward) direction.
This function searches backward from point for string. It is
like search-forward
, except that it searches backwards rather
than forwards. Backward searches leave point at the beginning of the
match.
This function searches forward from point for a “word” match for string. If it finds a match, it sets point to the end of the match found, and returns the new value of point.
Word matching regards string as a sequence of words, disregarding punctuation that separates them. It searches the buffer for the same sequence of words. Each word must be distinct in the buffer (searching for the word ‘ball’ does not match the word ‘balls’), but the details of punctuation and spacing are ignored (searching for ‘ball boy’ does match ‘ball. Boy!’).
In this example, point is initially at the beginning of the buffer; the search leaves it between the ‘y’ and the ‘!’.
---------- Buffer: foo ---------- ∗He said "Please! Find the ball boy!" ---------- Buffer: foo ----------
(word-search-forward "Please find the ball, boy.") ⇒ 39 ---------- Buffer: foo ---------- He said "Please! Find the ball boy∗!" ---------- Buffer: foo ----------
If limit is non-nil
, it must be a position in the current
buffer; it specifies the upper bound to the search. The match found
must not extend after that position.
If noerror is nil
, then word-search-forward
signals
an error if the search fails. If noerror is t
, then it
returns nil
instead of signaling an error. If noerror is
neither nil
nor t
, it moves point to limit (or the
end of the accessible portion of the buffer) and returns nil
.
If repeat is non-nil
, then the search is repeated that many
times. Point is positioned at the end of the last match.
Internally, word-search-forward
and related functions use the
function word-search-regexp
to convert string to a
regular expression that ignores punctuation.
This command is identical to word-search-forward
, except that
the beginning or the end of string need not match a word
boundary, unless string begins or ends in whitespace.
For instance, searching for ‘ball boy’ matches ‘ball boyee’,
but does not match ‘balls boy’.
This function searches backward from point for a word match to
string. This function is just like word-search-forward
except that it searches backward and normally leaves point at the
beginning of the match.
This command is identical to word-search-backward
, except that
the beginning or the end of string need not match a word
boundary, unless string begins or ends in whitespace.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
By default, searches in Emacs ignore the case of the text they are searching through; if you specify searching for ‘FOO’, then ‘Foo’ or ‘foo’ is also considered a match. This applies to regular expressions, too; thus, ‘[aB]’ would match ‘a’ or ‘A’ or ‘b’ or ‘B’.
If you do not want this feature, set the variable
case-fold-search
to nil
. Then all letters must match
exactly, including case. This is a buffer-local variable; altering the
variable affects only the current buffer. (See section Introduction to Buffer-Local Variables.) Alternatively, you may change the default value.
In Lisp code, you will more typically use let
to bind
case-fold-search
to the desired value.
Note that the user-level incremental search feature handles case distinctions differently. When the search string contains only lower case letters, the search ignores case, but when the search string contains one or more upper case letters, the search becomes case-sensitive. But this has nothing to do with the searching functions used in Lisp code. See Incremental Search in The GNU Emacs Manual.
This buffer-local variable determines whether searches should ignore
case. If the variable is nil
they do not ignore case; otherwise
(and by default) they do ignore case.
This variable determines whether the higher-level replacement
functions should preserve case. If the variable is nil
, that
means to use the replacement text verbatim. A non-nil
value
means to convert the case of the replacement text according to the
text being replaced.
This variable is used by passing it as an argument to the function
replace-match
. See section Replacing the Text that Matched.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A regular expression, or regexp for short, is a pattern that denotes a (possibly infinite) set of strings. Searching for matches for a regexp is a very powerful operation. This section explains how to write regexps; the following section says how to search for them.
For interactive development of regular expressions, you can use the M-x re-builder command. It provides a convenient interface for creating regular expressions, by giving immediate visual feedback in a separate buffer. As you edit the regexp, all its matches in the target buffer are highlighted. Each parenthesized sub-expression of the regexp is shown in a distinct face, which makes it easier to verify even very complex regexps.
33.3.1 Syntax of Regular Expressions | Rules for writing regular expressions. | |
33.3.2 Complex Regexp Example | Illustrates regular expression syntax. | |
33.3.3 Regular Expression Functions | Functions for operating on regular expressions. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Regular expressions have a syntax in which a few characters are special constructs and the rest are ordinary. An ordinary character is a simple regular expression that matches that character and nothing else. The special characters are ‘.’, ‘*’, ‘+’, ‘?’, ‘[’, ‘^’, ‘$’, and ‘\’; no new special characters will be defined in the future. The character ‘]’ is special if it ends a character alternative (see later). The character ‘-’ is special inside a character alternative. A ‘[:’ and balancing ‘:]’ enclose a character class inside a character alternative. Any other character appearing in a regular expression is ordinary, unless a ‘\’ precedes it.
For example, ‘f’ is not a special character, so it is ordinary, and therefore ‘f’ is a regular expression that matches the string ‘f’ and no other string. (It does not match the string ‘fg’, but it does match a part of that string.) Likewise, ‘o’ is a regular expression that matches only ‘o’.
Any two regular expressions a and b can be concatenated. The result is a regular expression that matches a string if a matches some amount of the beginning of that string and b matches the rest of the string.
As a simple example, we can concatenate the regular expressions ‘f’ and ‘o’ to get the regular expression ‘fo’, which matches only the string ‘fo’. Still trivial. To do something more powerful, you need to use one of the special regular expression constructs.
33.3.1.1 Special Characters in Regular Expressions | Special characters in regular expressions. | |
33.3.1.2 Character Classes | Character classes used in regular expressions. | |
33.3.1.3 Backslash Constructs in Regular Expressions | Backslash-sequences in regular expressions. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a list of the characters that are special in a regular expression.
is a special character that matches any single character except a newline. Using concatenation, we can make regular expressions like ‘a.b’, which matches any three-character string that begins with ‘a’ and ends with ‘b’.
is not a construct by itself; it is a postfix operator that means to match the preceding regular expression repetitively as many times as possible. Thus, ‘o*’ matches any number of ‘o’s (including no ‘o’s).
‘*’ always applies to the smallest possible preceding expression. Thus, ‘fo*’ has a repeating ‘o’, not a repeating ‘fo’. It matches ‘f’, ‘fo’, ‘foo’, and so on.
The matcher processes a ‘*’ construct by matching, immediately, as many repetitions as can be found. Then it continues with the rest of the pattern. If that fails, backtracking occurs, discarding some of the matches of the ‘*’-modified construct in the hope that that will make it possible to match the rest of the pattern. For example, in matching ‘ca*ar’ against the string ‘caaar’, the ‘a*’ first tries to match all three ‘a’s; but the rest of the pattern is ‘ar’ and there is only ‘r’ left to match, so this try fails. The next alternative is for ‘a*’ to match only two ‘a’s. With this choice, the rest of the regexp matches successfully.
Warning: Nested repetition operators can run for an indefinitely long time, if they lead to ambiguous matching. For example, trying to match the regular expression ‘\(x+y*\)*a’ against the string ‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz’ could take hours before it ultimately fails. Emacs must try each way of grouping the ‘x’s before concluding that none of them can work. Even worse, ‘\(x*\)*’ can match the null string in infinitely many ways, so it causes an infinite loop. To avoid these problems, check nested repetitions carefully, to make sure that they do not cause combinatorial explosions in backtracking.
is a postfix operator, similar to ‘*’ except that it must match the preceding expression at least once. So, for example, ‘ca+r’ matches the strings ‘car’ and ‘caaaar’ but not the string ‘cr’, whereas ‘ca*r’ matches all three strings.
is a postfix operator, similar to ‘*’ except that it must match the preceding expression either once or not at all. For example, ‘ca?r’ matches ‘car’ or ‘cr’; nothing else.
These are “non-greedy” variants of the operators ‘*’, ‘+’ and ‘?’. Where those operators match the largest possible substring (consistent with matching the entire containing expression), the non-greedy variants match the smallest possible substring (consistent with matching the entire containing expression).
For example, the regular expression ‘c[ad]*a’ when applied to the string ‘cdaaada’ matches the whole string; but the regular expression ‘c[ad]*?a’, applied to that same string, matches just ‘cda’. (The smallest possible match here for ‘[ad]*?’ that permits the whole expression to match is ‘d’.)
is a character alternative, which begins with ‘[’ and is terminated by ‘]’. In the simplest case, the characters between the two brackets are what this character alternative can match.
Thus, ‘[ad]’ matches either one ‘a’ or one ‘d’, and ‘[ad]*’ matches any string composed of just ‘a’s and ‘d’s (including the empty string). It follows that ‘c[ad]*r’ matches ‘cr’, ‘car’, ‘cdr’, ‘caddaar’, etc.
You can also include character ranges in a character alternative, by writing the starting and ending characters with a ‘-’ between them. Thus, ‘[a-z]’ matches any lower-case ASCII letter. Ranges may be intermixed freely with individual characters, as in ‘[a-z$%.]’, which matches any lower case ASCII letter or ‘$’, ‘%’ or period.
If case-fold-search
is non-nil
, ‘[a-z]’ also
matches upper-case letters. Note that a range like ‘[a-z]’ is
not affected by the locale’s collation sequence, it always represents
a sequence in ASCII order.
Note also that the usual regexp special characters are not special inside a character alternative. A completely different set of characters is special inside character alternatives: ‘]’, ‘-’ and ‘^’.
To include a ‘]’ in a character alternative, you must make it the first character. For example, ‘[]a]’ matches ‘]’ or ‘a’. To include a ‘-’, write ‘-’ as the first or last character of the character alternative, or put it after a range. Thus, ‘[]-]’ matches both ‘]’ and ‘-’. (As explained below, you cannot use ‘\]’ to include a ‘]’ inside a character alternative, since ‘\’ is not special there.)
To include ‘^’ in a character alternative, put it anywhere but at the beginning.
If a range starts with a unibyte character c and ends with a multibyte character c2, the range is divided into two parts: one spans the unibyte characters ‘c..?\377’, the other the multibyte characters ‘c1..c2’, where c1 is the first character of the charset to which c2 belongs.
A character alternative can also specify named character classes (see section Character Classes). This is a POSIX feature. For example, ‘[[:ascii:]]’ matches any ASCII character. Using a character class is equivalent to mentioning each of the characters in that class; but the latter is not feasible in practice, since some classes include thousands of different characters.
‘[^’ begins a complemented character alternative. This matches any character except the ones specified. Thus, ‘[^a-z0-9A-Z]’ matches all characters except letters and digits.
‘^’ is not special in a character alternative unless it is the first character. The character following the ‘^’ is treated as if it were first (in other words, ‘-’ and ‘]’ are not special there).
A complemented character alternative can match a newline, unless newline is
mentioned as one of the characters not to match. This is in contrast to
the handling of regexps in programs such as grep
.
You can specify named character classes, just like in character alternatives. For instance, ‘[^[:ascii:]]’ matches any non-ASCII character. See section Character Classes.
When matching a buffer, ‘^’ matches the empty string, but only at the beginning of a line in the text being matched (or the beginning of the accessible portion of the buffer). Otherwise it fails to match anything. Thus, ‘^foo’ matches a ‘foo’ that occurs at the beginning of a line.
When matching a string instead of a buffer, ‘^’ matches at the beginning of the string or after a newline character.
For historical compatibility reasons, ‘^’ can be used only at the beginning of the regular expression, or after ‘\(’, ‘\(?:’ or ‘\|’.
is similar to ‘^’ but matches only at the end of a line (or the end of the accessible portion of the buffer). Thus, ‘x+$’ matches a string of one ‘x’ or more at the end of a line.
When matching a string instead of a buffer, ‘$’ matches at the end of the string or before a newline character.
For historical compatibility reasons, ‘$’ can be used only at the end of the regular expression, or before ‘\)’ or ‘\|’.
has two functions: it quotes the special characters (including ‘\’), and it introduces additional special constructs.
Because ‘\’ quotes special characters, ‘\$’ is a regular expression that matches only ‘$’, and ‘\[’ is a regular expression that matches only ‘[’, and so on.
Note that ‘\’ also has special meaning in the read syntax of Lisp
strings (see section String Type), and must be quoted with ‘\’. For
example, the regular expression that matches the ‘\’ character is
‘\\’. To write a Lisp string that contains the characters
‘\\’, Lisp syntax requires you to quote each ‘\’ with another
‘\’. Therefore, the read syntax for a regular expression matching
‘\’ is "\\\\"
.
Please note: For historical compatibility, special characters are treated as ordinary ones if they are in contexts where their special meanings make no sense. For example, ‘*foo’ treats ‘*’ as ordinary since there is no preceding expression on which the ‘*’ can act. It is poor practice to depend on this behavior; quote the special character anyway, regardless of where it appears.
As a ‘\’ is not special inside a character alternative, it can
never remove the special meaning of ‘-’ or ‘]’. So you
should not quote these characters when they have no special meaning
either. This would not clarify anything, since backslashes can
legitimately precede these characters where they have special
meaning, as in ‘[^\]’ ("[^\\]"
for Lisp string syntax),
which matches any single character except a backslash.
In practice, most ‘]’ that occur in regular expressions close a character alternative and hence are special. However, occasionally a regular expression may try to match a complex pattern of literal ‘[’ and ‘]’. In such situations, it sometimes may be necessary to carefully parse the regexp from the start to determine which square brackets enclose a character alternative. For example, ‘[^][]]’ consists of the complemented character alternative ‘[^][]’ (which matches any single character that is not a square bracket), followed by a literal ‘]’.
The exact rules are that at the beginning of a regexp, ‘[’ is special and ‘]’ not. This lasts until the first unquoted ‘[’, after which we are in a character alternative; ‘[’ is no longer special (except when it starts a character class) but ‘]’ is special, unless it immediately follows the special ‘[’ or that ‘[’ followed by a ‘^’. This lasts until the next special ‘]’ that does not end a character class. This ends the character alternative and restores the ordinary syntax of regular expressions; an unquoted ‘[’ is special again and a ‘]’ not.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a table of the classes you can use in a character alternative, and what they mean:
This matches any ASCII character (codes 0–127).
This matches any letter or digit. (At present, for multibyte characters, it matches anything that has word syntax.)
This matches any letter. (At present, for multibyte characters, it matches anything that has word syntax.)
This matches space and tab only.
This matches any ASCII control character.
This matches ‘0’ through ‘9’. Thus, ‘[-+[:digit:]]’ matches any digit, as well as ‘+’ and ‘-’.
This matches graphic characters—everything except ASCII control characters, space, and the delete character.
This matches any lower-case letter, as determined by the current case
table (see section The Case Table). If case-fold-search
is
non-nil
, this also matches any upper-case letter.
This matches any multibyte character (see section Text Representations).
This matches any non-ASCII character.
This matches printing characters—everything except ASCII control characters and the delete character.
This matches any punctuation character. (At present, for multibyte characters, it matches anything that has non-word syntax.)
This matches any character that has whitespace syntax (see section Table of Syntax Classes).
This matches any unibyte character (see section Text Representations).
This matches any upper-case letter, as determined by the current case
table (see section The Case Table). If case-fold-search
is
non-nil
, this also matches any lower-case letter.
This matches any character that has word syntax (see section Table of Syntax Classes).
This matches the hexadecimal digits: ‘0’ through ‘9’, ‘a’ through ‘f’ and ‘A’ through ‘F’.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
For the most part, ‘\’ followed by any character matches only that character. However, there are several exceptions: certain sequences starting with ‘\’ that have special meanings. Here is a table of the special ‘\’ constructs.
specifies an alternative. Two regular expressions a and b with ‘\|’ in between form an expression that matches anything that either a or b matches.
Thus, ‘foo\|bar’ matches either ‘foo’ or ‘bar’ but no other string.
‘\|’ applies to the largest possible surrounding expressions. Only a surrounding ‘\( … \)’ grouping can limit the grouping power of ‘\|’.
If you need full backtracking capability to handle multiple uses of ‘\|’, use the POSIX regular expression functions (see section POSIX Regular Expression Searching).
is a postfix operator that repeats the previous pattern exactly m times. Thus, ‘x\{5\}’ matches the string ‘xxxxx’ and nothing else. ‘c[ad]\{3\}r’ matches string such as ‘caaar’, ‘cdddr’, ‘cadar’, and so on.
is a more general postfix operator that specifies repetition with a minimum of m repeats and a maximum of n repeats. If m is omitted, the minimum is 0; if n is omitted, there is no maximum.
For example, ‘c[ad]\{1,2\}r’ matches the strings ‘car’,
‘cdr’, ‘caar’, ‘cadr’, ‘cdar’, and ‘cddr’, and
nothing else.
‘\{0,1\}’ or ‘\{,1\}’ is equivalent to ‘?’.
‘\{0,\}’ or ‘\{,\}’ is equivalent to ‘*’.
‘\{1,\}’ is equivalent to ‘+’.
is a grouping construct that serves three purposes:
This last application is not a consequence of the idea of a parenthetical grouping; it is a separate feature that was assigned as a second meaning to the same ‘\( … \)’ construct because, in practice, there was usually no conflict between the two meanings. But occasionally there is a conflict, and that led to the introduction of shy groups.
is the shy group construct. A shy group serves the first two purposes of an ordinary group (controlling the nesting of other operators), but it does not get a number, so you cannot refer back to its value with ‘\digit’. Shy groups are particularly useful for mechanically-constructed regular expressions, because they can be added automatically without altering the numbering of ordinary, non-shy groups.
Shy groups are also called non-capturing or unnumbered groups.
is the explicitly numbered group construct. Normal groups get their number implicitly, based on their position, which can be inconvenient. This construct allows you to force a particular group number. There is no particular restriction on the numbering, e.g., you can have several groups with the same number in which case the last one to match (i.e., the rightmost match) will win. Implicitly numbered groups always get the smallest integer larger than the one of any previous group.
matches the same text that matched the digitth occurrence of a grouping (‘\( … \)’) construct.
In other words, after the end of a group, the matcher remembers the beginning and end of the text matched by that group. Later on in the regular expression you can use ‘\’ followed by digit to match that same text, whatever it may have been.
The strings matching the first nine grouping constructs appearing in the entire regular expression passed to a search or matching function are assigned numbers 1 through 9 in the order that the open parentheses appear in the regular expression. So you can use ‘\1’ through ‘\9’ to refer to the text matched by the corresponding grouping constructs.
For example, ‘\(.*\)\1’ matches any newline-free string that is composed of two identical halves. The ‘\(.*\)’ matches the first half, which may be anything, but the ‘\1’ that follows must match the same exact text.
If a ‘\( … \)’ construct matches more than once (which can happen, for instance, if it is followed by ‘*’), only the last match is recorded.
If a particular grouping construct in the regular expression was never matched—for instance, if it appears inside of an alternative that wasn’t used, or inside of a repetition that repeated zero times—then the corresponding ‘\digit’ construct never matches anything. To use an artificial example, ‘\(foo\(b*\)\|lose\)\2’ cannot match ‘lose’: the second alternative inside the larger group matches it, but then ‘\2’ is undefined and can’t match anything. But it can match ‘foobb’, because the first alternative matches ‘foob’ and ‘\2’ matches ‘b’.
matches any word-constituent character. The editor syntax table determines which characters these are. See section Syntax Tables.
matches any character that is not a word constituent.
matches any character whose syntax is code. Here code is a character that represents a syntax code: thus, ‘w’ for word constituent, ‘-’ for whitespace, ‘(’ for open parenthesis, etc. To represent whitespace syntax, use either ‘-’ or a space character. See section Table of Syntax Classes, for a list of syntax codes and the characters that stand for them.
matches any character whose syntax is not code.
matches any character whose category is c. Here c is a
character that represents a category: thus, ‘c’ for Chinese
characters or ‘g’ for Greek characters in the standard category
table. You can see the list of all the currently defined categories
with M-x describe-categories RET. You can also define
your own categories in addition to the standard ones using the
define-category
function (see section Categories).
matches any character whose category is not c.
The following regular expression constructs match the empty string—that is, they don’t use up any characters—but whether they match depends on the context. For all, the beginning and end of the accessible portion of the buffer are treated as if they were the actual beginning and end of the buffer.
matches the empty string, but only at the beginning of the buffer or string being matched against.
matches the empty string, but only at the end of the buffer or string being matched against.
matches the empty string, but only at point. (This construct is not defined when matching against a string.)
matches the empty string, but only at the beginning or end of a word. Thus, ‘\bfoo\b’ matches any occurrence of ‘foo’ as a separate word. ‘\bballs?\b’ matches ‘ball’ or ‘balls’ as a separate word.
‘\b’ matches at the beginning or end of the buffer (or string) regardless of what text appears next to it.
matches the empty string, but not at the beginning or end of a word, nor at the beginning or end of the buffer (or string).
matches the empty string, but only at the beginning of a word. ‘\<’ matches at the beginning of the buffer (or string) only if a word-constituent character follows.
matches the empty string, but only at the end of a word. ‘\>’ matches at the end of the buffer (or string) only if the contents end with a word-constituent character.
matches the empty string, but only at the beginning of a symbol. A symbol is a sequence of one or more word or symbol constituent characters. ‘\_<’ matches at the beginning of the buffer (or string) only if a symbol-constituent character follows.
matches the empty string, but only at the end of a symbol. ‘\_>’ matches at the end of the buffer (or string) only if the contents end with a symbol-constituent character.
Not every string is a valid regular expression. For example, a string
that ends inside a character alternative without a terminating ‘]’
is invalid, and so is a string that ends with a single ‘\’. If
an invalid regular expression is passed to any of the search functions,
an invalid-regexp
error is signaled.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a complicated regexp which was formerly used by Emacs to
recognize the end of a sentence together with any whitespace that
follows. (Nowadays Emacs uses a similar but more complex default
regexp constructed by the function sentence-end
.
See section Standard Regular Expressions Used in Editing.)
Below, we show first the regexp as a string in Lisp syntax (to distinguish spaces from tab characters), and then the result of evaluating it. The string constant begins and ends with a double-quote. ‘\"’ stands for a double-quote as part of the string, ‘\\’ for a backslash as part of the string, ‘\t’ for a tab and ‘\n’ for a newline.
"[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)[ \t\n]*" ⇒ "[.?!][]\"')}]*\\($\\| $\\| \\| \\)[ ]*"
In the output, tab and newline appear as themselves.
This regular expression contains four parts in succession and can be deciphered as follows:
[.?!]
The first part of the pattern is a character alternative that matches any one of three characters: period, question mark, and exclamation mark. The match must begin with one of these three characters. (This is one point where the new default regexp used by Emacs differs from the old. The new value also allows some non-ASCII characters that end a sentence without any following whitespace.)
[]\"')}]*
The second part of the pattern matches any closing braces and quotation
marks, zero or more of them, that may follow the period, question mark
or exclamation mark. The \"
is Lisp syntax for a double-quote in
a string. The ‘*’ at the end indicates that the immediately
preceding regular expression (a character alternative, in this case) may be
repeated zero or more times.
\\($\\| $\\|\t\\| \\)
The third part of the pattern matches the whitespace that follows the end of a sentence: the end of a line (optionally with a space), or a tab, or two spaces. The double backslashes mark the parentheses and vertical bars as regular expression syntax; the parentheses delimit a group and the vertical bars separate alternatives. The dollar sign is used to match the end of a line.
[ \t\n]*
Finally, the last part of the pattern matches any additional whitespace beyond the minimum needed to end a sentence.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions operate on regular expressions.
This function returns a regular expression whose only exact match is
string. Using this regular expression in looking-at
will
succeed only if the next characters in the buffer are string;
using it in a search function will succeed if the text being searched
contains string. See section Regular Expression Searching.
This allows you to request an exact string match or search when calling a function that wants a regular expression.
(regexp-quote "^The cat$") ⇒ "\\^The cat\\$"
One use of regexp-quote
is to combine an exact string match with
context described as a regular expression. For example, this searches
for the string that is the value of string, surrounded by
whitespace:
(re-search-forward (concat "\\s-" (regexp-quote string) "\\s-"))
This function returns an efficient regular expression that will match any of the strings in the list strings. This is useful when you need to make matching or searching as fast as possible—for example, for Font Lock mode17.
If the optional argument paren is non-nil
, then the
returned regular expression is always enclosed by at least one
parentheses-grouping construct. If paren is words
, then
that construct is additionally surrounded by ‘\<’ and ‘\>’;
alternatively, if paren is symbols
, then that construct
is additionally surrounded by ‘\_<’ and ‘\_>’
(symbols
is often appropriate when matching
programming-language keywords and the like).
This simplified definition of regexp-opt
produces a
regular expression which is equivalent to the actual value
(but not as efficient):
(defun regexp-opt (strings &optional paren) (let ((open-paren (if paren "\\(" "")) (close-paren (if paren "\\)" ""))) (concat open-paren (mapconcat 'regexp-quote strings "\\|") close-paren)))
This function returns the total number of grouping constructs (parenthesized expressions) in regexp. This does not include shy groups (see section Backslash Constructs in Regular Expressions).
This function returns a regular expression matching a character in the list of characters chars.
(regexp-opt-charset '(?a ?b ?c ?d ?e)) ⇒ "[a-e]"
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In GNU Emacs, you can search for the next match for a regular
expression (see section Syntax of Regular Expressions) either incrementally or not.
For incremental search commands, see Regular
Expression Search in The GNU Emacs Manual. Here we describe
only the search functions useful in programs. The principal one is
re-search-forward
.
These search functions convert the regular expression to multibyte if the buffer is multibyte; they convert the regular expression to unibyte if the buffer is unibyte. See section Text Representations.
This function searches forward in the current buffer for a string of text that is matched by the regular expression regexp. The function skips over any amount of text that is not matched by regexp, and leaves point at the end of the first match found. It returns the new value of point.
If limit is non-nil
, it must be a position in the current
buffer. It specifies the upper bound to the search. No match
extending after that position is accepted.
If repeat is supplied, it must be a positive number; the search
is repeated that many times; each repetition starts at the end of the
previous match. If all these successive searches succeed, the search
succeeds, moving point and returning its new value. Otherwise the
search fails. What re-search-forward
does when the search
fails depends on the value of noerror:
nil
Signal a search-failed
error.
t
Do nothing and return nil
.
Move point to limit (or the end of the accessible portion of the
buffer) and return nil
.
In the following example, point is initially before the ‘T’. Evaluating the search call moves point to the end of that line (between the ‘t’ of ‘hat’ and the newline).
---------- Buffer: foo ---------- I read "∗The cat in the hat comes back" twice. ---------- Buffer: foo ----------
(re-search-forward "[a-z]+" nil t 5) ⇒ 27 ---------- Buffer: foo ---------- I read "The cat in the hat∗ comes back" twice. ---------- Buffer: foo ----------
This function searches backward in the current buffer for a string of text that is matched by the regular expression regexp, leaving point at the beginning of the first text found.
This function is analogous to re-search-forward
, but they are not
simple mirror images. re-search-forward
finds the match whose
beginning is as close as possible to the starting point. If
re-search-backward
were a perfect mirror image, it would find the
match whose end is as close as possible. However, in fact it finds the
match whose beginning is as close as possible (and yet ends before the
starting point). The reason for this is that matching a regular
expression at a given spot always works from beginning to end, and
starts at a specified beginning position.
A true mirror-image of re-search-forward
would require a special
feature for matching regular expressions from end to beginning. It’s
not worth the trouble of implementing that.
This function returns the index of the start of the first match for
the regular expression regexp in string, or nil
if
there is no match. If start is non-nil
, the search starts
at that index in string.
For example,
(string-match "quick" "The quick brown fox jumped quickly.") ⇒ 4
(string-match "quick" "The quick brown fox jumped quickly." 8) ⇒ 27
The index of the first character of the string is 0, the index of the second character is 1, and so on.
After this function returns, the index of the first character beyond
the match is available as (match-end 0)
. See section The Match Data.
(string-match "quick" "The quick brown fox jumped quickly." 8) ⇒ 27
(match-end 0) ⇒ 32
This predicate function does what string-match
does, but it
avoids modifying the match data.
This function determines whether the text in the current buffer directly
following point matches the regular expression regexp. “Directly
following” means precisely that: the search is “anchored” and it can
succeed only starting with the first character following point. The
result is t
if so, nil
otherwise.
This function does not move point, but it does update the match data.
See section The Match Data. If you need to test for a match without modifying
the match data, use looking-at-p
, described below.
In this example, point is located directly before the ‘T’. If it
were anywhere else, the result would be nil
.
---------- Buffer: foo ---------- I read "∗The cat in the hat comes back" twice. ---------- Buffer: foo ---------- (looking-at "The cat in the hat$") ⇒ t
This function returns t
if regexp matches the text
immediately before point (i.e., ending at point), and nil
otherwise.
Because regular expression matching works only going forward, this is implemented by searching backwards from point for a match that ends at point. That can be quite slow if it has to search a long distance. You can bound the time required by specifying limit, which says not to search before limit. In this case, the match that is found must begin at or after limit. Here’s an example:
---------- Buffer: foo ---------- I read "∗The cat in the hat comes back" twice. ---------- Buffer: foo ---------- (looking-back "read \"" 3) ⇒ t (looking-back "read \"" 4) ⇒ nil
If greedy is non-nil
, this function extends the match
backwards as far as possible, stopping when a single additional
previous character cannot be part of a match for regexp. When the
match is extended, its starting position is allowed to occur before
limit.
As a general recommendation, try to avoid using looking-back
wherever possible, since it is slow. For this reason, there are no
plans to add a looking-back-p
function.
This predicate function works like looking-at
, but without
updating the match data.
If this variable is non-nil
, it should be a regular expression
that says how to search for whitespace. In that case, any group of
spaces in a regular expression being searched for stands for use of
this regular expression. However, spaces inside of constructs such as
‘[…]’ and ‘*’, ‘+’, ‘?’ are not affected by
search-spaces-regexp
.
Since this variable affects all regular expression search and match constructs, you should bind it temporarily for as small as possible a part of the code.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The usual regular expression functions do backtracking when necessary to handle the ‘\|’ and repetition constructs, but they continue this only until they find some match. Then they succeed and report the first match found.
This section describes alternative search functions which perform the full backtracking specified by the POSIX standard for regular expression matching. They continue backtracking until they have tried all possibilities and found all matches, so they can report the longest match, as required by POSIX. This is much slower, so use these functions only when you really need the longest match.
The POSIX search and match functions do not properly support the non-greedy repetition operators (see section non-greedy). This is because POSIX backtracking conflicts with the semantics of non-greedy repetition.
This is like re-search-forward
except that it performs the full
backtracking specified by the POSIX standard for regular expression
matching.
This is like re-search-backward
except that it performs the full
backtracking specified by the POSIX standard for regular expression
matching.
This is like looking-at
except that it performs the full
backtracking specified by the POSIX standard for regular expression
matching.
This is like string-match
except that it performs the full
backtracking specified by the POSIX standard for regular expression
matching.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs keeps track of the start and end positions of the segments of text found during a search; this is called the match data. Thanks to the match data, you can search for a complex pattern, such as a date in a mail message, and then extract parts of the match under control of the pattern.
Because the match data normally describe the most recent search only, you must be careful not to do another search inadvertently between the search you wish to refer back to and the use of the match data. If you can’t avoid another intervening search, you must save and restore the match data around it, to prevent it from being overwritten.
Notice that all functions are allowed to overwrite the match data unless they’re explicitly documented not to do so. A consequence is that functions that are run implicitly in the background (see section Timers for Delayed Execution, and Idle Timers) should likely save and restore the match data explicitly.
33.6.1 Replacing the Text that Matched | Replacing a substring that was matched. | |
33.6.2 Simple Match Data Access | Accessing single items of match data, such as where a particular subexpression started. | |
33.6.3 Accessing the Entire Match Data | Accessing the entire match data at once, as a list. | |
33.6.4 Saving and Restoring the Match Data | Saving and restoring the match data. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function replaces all or part of the text matched by the last search. It works by means of the match data.
This function performs a replacement operation on a buffer or string.
If you did the last search in a buffer, you should omit the
string argument or specify nil
for it, and make sure that
the current buffer is the one in which you performed the last search.
Then this function edits the buffer, replacing the matched text with
replacement. It leaves point at the end of the replacement
text.
If you performed the last search on a string, pass the same string as string. Then this function returns a new string, in which the matched text is replaced by replacement.
If fixedcase is non-nil
, then replace-match
uses
the replacement text without case conversion; otherwise, it converts
the replacement text depending upon the capitalization of the text to
be replaced. If the original text is all upper case, this converts
the replacement text to upper case. If all words of the original text
are capitalized, this capitalizes all the words of the replacement
text. If all the words are one-letter and they are all upper case,
they are treated as capitalized words rather than all-upper-case
words.
If literal is non-nil
, then replacement is inserted
exactly as it is, the only alterations being case changes as needed.
If it is nil
(the default), then the character ‘\’ is treated
specially. If a ‘\’ appears in replacement, then it must be
part of one of the following sequences:
This stands for the entire text being replaced.
This stands for the text that matched the nth subexpression in the original regexp. Subexpressions are those expressions grouped inside ‘\(…\)’. If the nth subexpression never matched, an empty string is substituted.
This stands for a single ‘\’ in the replacement text.
This stands for itself (for compatibility with replace-regexp
and related commands; see Regexp Replace in The GNU
Emacs Manual).
Any other character following ‘\’ signals an error.
The substitutions performed by ‘\&’ and ‘\n’ occur after case conversion, if any. Therefore, the strings they substitute are never case-converted.
If subexp is non-nil
, that says to replace just
subexpression number subexp of the regexp that was matched, not
the entire match. For example, after matching ‘foo \(ba*r\)’,
calling replace-match
with 1 as subexp means to replace
just the text that matched ‘\(ba*r\)’.
This function returns the text that would be inserted into the buffer
by replace-match
, but without modifying the buffer. It is
useful if you want to present the user with actual replacement result,
with constructs like ‘\n’ or ‘\&’ substituted with
matched groups. Arguments replacement and optional
fixedcase, literal, string and subexp have the
same meaning as for replace-match
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section explains how to use the match data to find out what was matched by the last search or match operation, if it succeeded.
You can ask about the entire matching text, or about a particular parenthetical subexpression of a regular expression. The count argument in the functions below specifies which. If count is zero, you are asking about the entire match. If count is positive, it specifies which subexpression you want.
Recall that the subexpressions of a regular expression are those expressions grouped with escaped parentheses, ‘\(…\)’. The countth subexpression is found by counting occurrences of ‘\(’ from the beginning of the whole regular expression. The first subexpression is numbered 1, the second 2, and so on. Only regular expressions can have subexpressions—after a simple string search, the only information available is about the entire match.
Every successful search sets the match data. Therefore, you should
query the match data immediately after searching, before calling any
other function that might perform another search. Alternatively, you
may save and restore the match data (see section Saving and Restoring the Match Data) around
the call to functions that could perform another search. Or use the
functions that explicitly do not modify the match data;
e.g., string-match-p
.
A search which fails may or may not alter the match data. In the current implementation, it does not, but we may change it in the future. Don’t try to rely on the value of the match data after a failing search.
This function returns, as a string, the text matched in the last search or match operation. It returns the entire text if count is zero, or just the portion corresponding to the countth parenthetical subexpression, if count is positive.
If the last such operation was done against a string with
string-match
, then you should pass the same string as the
argument in-string. After a buffer search or match,
you should omit in-string or pass nil
for it; but you
should make sure that the current buffer when you call
match-string
is the one in which you did the searching or
matching. Failure to follow this advice will lead to incorrect results.
The value is nil
if count is out of range, or for a
subexpression inside a ‘\|’ alternative that wasn’t used or a
repetition that repeated zero times.
This function is like match-string
except that the result
has no text properties.
This function returns the position of the start of the text matched by the last regular expression searched for, or a subexpression of it.
If count is zero, then the value is the position of the start of the entire match. Otherwise, count specifies a subexpression in the regular expression, and the value of the function is the starting position of the match for that subexpression.
The value is nil
for a subexpression inside a ‘\|’
alternative that wasn’t used or a repetition that repeated zero times.
This function is like match-beginning
except that it returns the
position of the end of the match, rather than the position of the
beginning.
Here is an example of using the match data, with a comment showing the positions within the text:
(string-match "\\(qu\\)\\(ick\\)" "The quick fox jumped quickly.") ;0123456789 ⇒ 4
(match-string 0 "The quick fox jumped quickly.") ⇒ "quick" (match-string 1 "The quick fox jumped quickly.") ⇒ "qu" (match-string 2 "The quick fox jumped quickly.") ⇒ "ick"
(match-beginning 1) ; The beginning of the match ⇒ 4 ; with ‘qu’ is at index 4.
(match-beginning 2) ; The beginning of the match ⇒ 6 ; with ‘ick’ is at index 6.
(match-end 1) ; The end of the match ⇒ 6 ; with ‘qu’ is at index 6. (match-end 2) ; The end of the match ⇒ 9 ; with ‘ick’ is at index 9.
Here is another example. Point is initially located at the beginning of the line. Searching moves point to between the space and the word ‘in’. The beginning of the entire match is at the 9th character of the buffer (‘T’), and the beginning of the match for the first subexpression is at the 13th character (‘c’).
(list (re-search-forward "The \\(cat \\)") (match-beginning 0) (match-beginning 1)) ⇒ (17 9 13)
---------- Buffer: foo ---------- I read "The cat ∗in the hat comes back" twice. ^ ^ 9 13 ---------- Buffer: foo ----------
(In this case, the index returned is a buffer position; the first character of the buffer counts as 1.)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The functions match-data
and set-match-data
read or
write the entire match data, all at once.
This function returns a list of positions (markers or integers) that
record all the information on the text that the last search matched.
Element zero is the position of the beginning of the match for the
whole expression; element one is the position of the end of the match
for the expression. The next two elements are the positions of the
beginning and end of the match for the first subexpression, and so on.
In general, element
number 2n
corresponds to (match-beginning n)
; and
element
number 2n + 1
corresponds to (match-end n)
.
Normally all the elements are markers or nil
, but if
integers is non-nil
, that means to use integers instead
of markers. (In that case, the buffer itself is appended as an
additional element at the end of the list, to facilitate complete
restoration of the match data.) If the last match was done on a
string with string-match
, then integers are always used,
since markers can’t point into a string.
If reuse is non-nil
, it should be a list. In that case,
match-data
stores the match data in reuse. That is,
reuse is destructively modified. reuse does not need to
have the right length. If it is not long enough to contain the match
data, it is extended. If it is too long, the length of reuse
stays the same, but the elements that were not used are set to
nil
. The purpose of this feature is to reduce the need for
garbage collection.
If reseat is non-nil
, all markers on the reuse list
are reseated to point to nowhere.
As always, there must be no possibility of intervening searches between
the call to a search function and the call to match-data
that is
intended to access the match data for that search.
(match-data) ⇒ (#<marker at 9 in foo> #<marker at 17 in foo> #<marker at 13 in foo> #<marker at 17 in foo>)
This function sets the match data from the elements of match-list,
which should be a list that was the value of a previous call to
match-data
. (More precisely, anything that has the same format
will work.)
If match-list refers to a buffer that doesn’t exist, you don’t get an error; that sets the match data in a meaningless but harmless way.
If reseat is non-nil
, all markers on the match-list list
are reseated to point to nowhere.
store-match-data
is a semi-obsolete alias for set-match-data
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you call a function that may search, you may need to save and restore the match data around that call, if you want to preserve the match data from an earlier search for later use. Here is an example that shows the problem that arises if you fail to save the match data:
(re-search-forward "The \\(cat \\)")
⇒ 48
(foo) ; foo
does more searching.
(match-end 0)
⇒ 61 ; Unexpected result—not 48!
You can save and restore the match data with save-match-data
:
This macro executes body, saving and restoring the match data around it. The return value is the value of the last form in body.
You could use set-match-data
together with match-data
to
imitate the effect of the special form save-match-data
. Here is
how:
(let ((data (match-data)))
(unwind-protect
… ; Ok to change the original match data.
(set-match-data data)))
Emacs automatically saves and restores the match data when it runs process filter functions (see section Process Filter Functions) and process sentinels (see section Sentinels: Detecting Process Status Changes).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you want to find all matches for a regexp in part of the buffer,
and replace them, the best way is to write an explicit loop using
re-search-forward
and replace-match
, like this:
(while (re-search-forward "foo[ \t]+bar" nil t) (replace-match "foobar"))
See section Replacing the Text that Matched, for a
description of replace-match
.
However, replacing matches in a string is more complex, especially if you want to do it efficiently. So Emacs provides a function to do this.
This function copies string and searches it for matches for
regexp, and replaces them with rep. It returns the
modified copy. If start is non-nil
, the search for
matches starts at that index in string, so matches starting
before that index are not changed.
This function uses replace-match
to do the replacement, and it
passes the optional arguments fixedcase, literal and
subexp along to replace-match
.
Instead of a string, rep can be a function. In that case,
replace-regexp-in-string
calls rep for each match,
passing the text of the match as its sole argument. It collects the
value rep returns and passes that to replace-match
as the
replacement string. The match data at this point are the result
of matching regexp against a substring of string.
If you want to write a command along the lines of query-replace
,
you can use perform-replace
to do the work.
This function is the guts of query-replace
and related
commands. It searches for occurrences of from-string in the
text between positions start and end and replaces some or
all of them. If start is nil
(or omitted), point is used
instead, and the end of the buffer’s accessible portion is used for
end.
If query-flag is nil
, it replaces all
occurrences; otherwise, it asks the user what to do about each one.
If regexp-flag is non-nil
, then from-string is
considered a regular expression; otherwise, it must match literally. If
delimited-flag is non-nil
, then only replacements
surrounded by word boundaries are considered.
The argument replacements specifies what to replace occurrences with. If it is a string, that string is used. It can also be a list of strings, to be used in cyclic order.
If replacements is a cons cell, (function . data)
, this means to call function after each match to
get the replacement text. This function is called with two arguments:
data, and the number of replacements already made.
If repeat-count is non-nil
, it should be an integer. Then
it specifies how many times to use each of the strings in the
replacements list before advancing cyclically to the next one.
If from-string contains upper-case letters, then
perform-replace
binds case-fold-search
to nil
, and
it uses the replacements without altering their case.
Normally, the keymap query-replace-map
defines the possible
user responses for queries. The argument map, if
non-nil
, specifies a keymap to use instead of
query-replace-map
.
This function uses one of two functions to search for the next
occurrence of from-string. These functions are specified by the
values of two variables: replace-re-search-function
and
replace-search-function
. The former is called when the
argument regexp-flag is non-nil
, the latter when it is
nil
.
This variable holds a special keymap that defines the valid user
responses for perform-replace
and the commands that use it, as
well as y-or-n-p
and map-y-or-n-p
. This map is unusual
in two ways:
read-key-sequence
to get the input; instead, they read a single
event and look it up “by hand”.
Here are the meaningful “bindings” for query-replace-map
.
Several of them are meaningful only for query-replace
and
friends.
act
Do take the action being considered—in other words, “yes”.
skip
Do not take action for this question—in other words, “no”.
exit
Answer this question “no”, and give up on the entire series of questions, assuming that the answers will be “no”.
exit-prefix
Like exit
, but add the key that was pressed to
unread-command-events
(see section Miscellaneous Event Input Features).
act-and-exit
Answer this question “yes”, and give up on the entire series of questions, assuming that subsequent answers will be “no”.
act-and-show
Answer this question “yes”, but show the results—don’t advance yet to the next question.
automatic
Answer this question and all subsequent questions in the series with “yes”, without further user interaction.
backup
Move back to the previous place that a question was asked about.
edit
Enter a recursive edit to deal with this question—instead of any other action that would normally be taken.
edit-replacement
Edit the replacement for this question in the minibuffer.
delete-and-edit
Delete the text being considered, then enter a recursive edit to replace it.
recenter
scroll-up
scroll-down
scroll-other-window
scroll-other-window-down
Perform the specified window scroll operation, then ask the same
question again. Only y-or-n-p
and related functions use this
answer.
quit
Perform a quit right away. Only y-or-n-p
and related functions
use this answer.
help
Display some help, then ask again.
This variable holds a keymap that extends query-replace-map
by
providing additional keybindings that are useful in multi-buffer
replacements. The additional “bindings” are:
automatic-all
Answer this question and all subsequent questions in the series with “yes”, without further user interaction, for all remaining buffers.
exit-current
Answer this question “no”, and give up on the entire series of questions for the current buffer. Continue to the next buffer in the sequence.
This variable specifies a function that perform-replace
calls
to search for the next string to replace. Its default value is
search-forward
. Any other value should name a function of 3
arguments: the first 3 arguments of search-forward
(see section Searching for Strings).
This variable specifies a function that perform-replace
calls
to search for the next regexp to replace. Its default value is
re-search-forward
. Any other value should name a function of 3
arguments: the first 3 arguments of re-search-forward
(see section Regular Expression Searching).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes some variables that hold regular expressions used for certain purposes in editing:
This is the regular expression describing line-beginnings that separate
pages. The default value is "^\014"
(i.e., "^^L"
or
"^\C-l"
); this matches a line that starts with a formfeed
character.
The following two regular expressions should not assume the match always starts at the beginning of a line; they should not use ‘^’ to anchor the match. Most often, the paragraph commands do check for a match only at the beginning of a line, which means that ‘^’ would be superfluous. When there is a nonzero left margin, they accept matches that start after the left margin. In that case, a ‘^’ would be incorrect. However, a ‘^’ is harmless in modes where a left margin is never used.
This is the regular expression for recognizing the beginning of a line
that separates paragraphs. (If you change this, you may have to
change paragraph-start
also.) The default value is
"[ \t\f]*$"
, which matches a line that consists entirely of
spaces, tabs, and form feeds (after its left margin).
This is the regular expression for recognizing the beginning of a line
that starts or separates paragraphs. The default value is
"\f\\|[ \t]*$"
, which matches a line containing only
whitespace or starting with a form feed (after its left margin).
If non-nil
, the value should be a regular expression describing
the end of a sentence, including the whitespace following the
sentence. (All paragraph boundaries also end sentences, regardless.)
If the value is nil
, as it is by default, then the function
sentence-end
constructs the regexp. That is why you
should always call the function sentence-end
to obtain the
regexp to be used to recognize the end of a sentence.
This function returns the value of the variable sentence-end
,
if non-nil
. Otherwise it returns a default value based on the
values of the variables sentence-end-double-space
(see Definition of sentence-end-double-space),
sentence-end-without-period
, and
sentence-end-without-space
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A syntax table specifies the syntactic role of each character in a buffer. It can be used to determine where words, symbols, and other syntactic constructs begin and end. This information is used by many Emacs facilities, including Font Lock mode (see section Font Lock Mode) and the various complex movement commands (see section Motion).
34.1 Syntax Table Concepts | Basic concepts of syntax tables. | |
34.2 Syntax Descriptors | How characters are classified. | |
34.3 Syntax Table Functions | How to create, examine and alter syntax tables. | |
34.4 Syntax Properties | Overriding syntax with text properties. | |
34.5 Motion and Syntax | Moving over characters with certain syntaxes. | |
34.6 Parsing Expressions | Parsing balanced expressions using the syntax table. | |
34.7 Syntax Table Internals | How syntax table information is stored. | |
34.8 Categories | Another way of classifying character syntax. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A syntax table is a data structure which can be used to look up the syntax class and other syntactic properties of each character. Syntax tables are used by Lisp programs for scanning and moving across text.
Internally, a syntax table is a char-table (see section Char-Tables).
The element at index c describes the character with code
c; its value is a cons cell which specifies the syntax of the
character in question. See section Syntax Table Internals, for details.
However, instead of using aset
and aref
to modify and
inspect syntax table contents, you should usually use the higher-level
functions char-syntax
and modify-syntax-entry
, which are
described in Syntax Table Functions.
This function returns t
if object is a syntax table.
Each buffer has its own major mode, and each major mode has its own
idea of the syntax class of various characters. For example, in Lisp
mode, the character ‘;’ begins a comment, but in C mode, it
terminates a statement. To support these variations, the syntax table
is local to each buffer. Typically, each major mode has its own
syntax table, which it installs in all buffers that use that mode.
For example, the variable emacs-lisp-mode-syntax-table
holds
the syntax table used by Emacs Lisp mode, and
c-mode-syntax-table
holds the syntax table used by C mode.
Changing a major mode’s syntax table alters the syntax in all of that
mode’s buffers, as well as in any buffers subsequently put in that
mode. Occasionally, several similar modes share one syntax table.
See section Major Mode Examples, for an example of how to set up a syntax
table.
A syntax table can inherit from another syntax table, which is called its parent syntax table. A syntax table can leave the syntax class of some characters unspecified, by giving them the “inherit” syntax class; such a character then acquires the syntax class specified by the parent syntax table (see section Table of Syntax Classes). Emacs defines a standard syntax table, which is the default parent syntax table, and is also the syntax table used by Fundamental mode.
This function returns the standard syntax table, which is the syntax table used in Fundamental mode.
Syntax tables are not used by the Emacs Lisp reader, which has its own built-in syntactic rules which cannot be changed. (Some Lisp systems provide ways to redefine the read syntax, but we decided to leave this feature out of Emacs Lisp for simplicity.)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The syntax class of a character describes its syntactic role. Each syntax table specifies the syntax class of each character. There is no necessary relationship between the class of a character in one syntax table and its class in any other table.
Each syntax class is designated by a mnemonic character, which serves as the name of the class when you need to specify a class. Usually, this designator character is one that is often assigned that class; however, its meaning as a designator is unvarying and independent of what syntax that character currently has. Thus, ‘\’ as a designator character always means “escape character” syntax, regardless of whether the ‘\’ character actually has that syntax in the current syntax table. See section Table of Syntax Classes, for a list of syntax classes and their designator characters.
A syntax descriptor is a Lisp string that describes the syntax
class and other syntactic properties of a character. When you want to
modify the syntax of a character, that is done by calling the function
modify-syntax-entry
and passing a syntax descriptor as one of
its arguments (see section Syntax Table Functions).
The first character in a syntax descriptor must be a syntax class designator character. The second character, if present, specifies a matching character (e.g., in Lisp, the matching character for ‘(’ is ‘)’); a space specifies that there is no matching character. Then come characters specifying additional syntax properties (see section Syntax Flags).
If no matching character or flags are needed, only one character (specifying the syntax class) is sufficient.
For example, the syntax descriptor for the character ‘*’ in C
mode is ". 23"
(i.e., punctuation, matching character slot
unused, second character of a comment-starter, first character of a
comment-ender), and the entry for ‘/’ is ‘. 14’ (i.e.,
punctuation, matching character slot unused, first character of a
comment-starter, second character of a comment-ender).
Emacs also defines raw syntax descriptors, which are used to describe syntax classes at a lower level. See section Syntax Table Internals.
34.2.1 Table of Syntax Classes | Table of syntax classes. | |
34.2.2 Syntax Flags | Additional flags each character can have. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a table of syntax classes, the characters that designate them, their meanings, and examples of their use.
Characters that separate symbols and words from each other. Typically, whitespace characters have no other syntactic significance, and multiple whitespace characters are syntactically equivalent to a single one. Space, tab, and formfeed are classified as whitespace in almost all major modes.
This syntax class can be designated by either ‘ ’ or ‘-’. Both designators are equivalent.
Parts of words in human languages. These are typically used in variable and command names in programs. All upper- and lower-case letters, and the digits, are typically word constituents.
Extra characters used in variable and command names along with word constituents. Examples include the characters ‘$&*+-_<>’ in Lisp mode, which may be part of a symbol name even though they are not part of English words. In standard C, the only non-word-constituent character that is valid in symbols is underscore (‘_’).
Characters used as punctuation in a human language, or used in a programming language to separate symbols from one another. Some programming language modes, such as Emacs Lisp mode, have no characters in this class since the few characters that are not symbol or word constituents all have other uses. Other programming language modes, such as C mode, use punctuation syntax for operators.
Characters used in dissimilar pairs to surround sentences or expressions. Such a grouping is begun with an open parenthesis character and terminated with a close. Each open parenthesis character matches a particular close parenthesis character, and vice versa. Normally, Emacs indicates momentarily the matching open parenthesis when you insert a close parenthesis. See section Blinking Parentheses.
In human languages, and in C code, the parenthesis pairs are ‘()’, ‘[]’, and ‘{}’. In Emacs Lisp, the delimiters for lists and vectors (‘()’ and ‘[]’) are classified as parenthesis characters.
Characters used to delimit string constants. The same string quote character appears at the beginning and the end of a string. Such quoted strings do not nest.
The parsing facilities of Emacs consider a string as a single token. The usual syntactic meanings of the characters in the string are suppressed.
The Lisp modes have two string quote characters: double-quote (‘"’) and vertical bar (‘|’). ‘|’ is not used in Emacs Lisp, but it is used in Common Lisp. C also has two string quote characters: double-quote for strings, and single-quote (‘'’) for character constants.
Human text has no string quote characters. We do not want quotation marks to turn off the usual syntactic properties of other characters in the quotation.
Characters that start an escape sequence, such as is used in string and character constants. The character ‘\’ belongs to this class in both C and Lisp. (In C, it is used thus only inside strings, but it turns out to cause no trouble to treat it this way throughout C code.)
Characters in this class count as part of words if
words-include-escapes
is non-nil
. See section Motion by Words.
Characters used to quote the following character so that it loses its normal syntactic meaning. This differs from an escape character in that only the character immediately following is ever affected.
Characters in this class count as part of words if
words-include-escapes
is non-nil
. See section Motion by Words.
This class is used for backslash in TeX mode.
Similar to string quote characters, except that the syntactic properties of the characters between the delimiters are not suppressed. Only TeX mode uses a paired delimiter presently—the ‘$’ that both enters and leaves math mode.
Characters used for syntactic operators that are considered as part of an expression if they appear next to one. In Lisp modes, these characters include the apostrophe, ‘'’ (used for quoting), the comma, ‘,’ (used in macros), and ‘#’ (used in the read syntax for certain data types).
Characters used in various languages to delimit comments. Human text has no comment characters. In Lisp, the semicolon (‘;’) starts a comment and a newline or formfeed ends one.
This syntax class does not specify a particular syntax. It says to look in the standard syntax table to find the syntax of this character.
Characters that start or end a special kind of comment. Any generic comment delimiter matches any generic comment delimiter, but they cannot match a comment starter or comment ender; generic comment delimiters can only match each other.
This syntax class is primarily meant for use with the
syntax-table
text property (see section Syntax Properties). You
can mark any range of characters as forming a comment, by giving the
first and last characters of the range syntax-table
properties
identifying them as generic comment delimiters.
Characters that start or end a string. This class differs from the string quote class in that any generic string delimiter can match any other generic string delimiter; but they do not match ordinary string quote characters.
This syntax class is primarily meant for use with the
syntax-table
text property (see section Syntax Properties). You
can mark any range of characters as forming a string constant, by
giving the first and last characters of the range syntax-table
properties identifying them as generic string delimiters.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In addition to the classes, entries for characters in a syntax table can specify flags. There are eight possible flags, represented by the characters ‘1’, ‘2’, ‘3’, ‘4’, ‘b’, ‘c’, ‘n’, and ‘p’.
All the flags except ‘p’ are used to describe comment delimiters. The digit flags are used for comment delimiters made up of 2 characters. They indicate that a character can also be part of a comment sequence, in addition to the syntactic properties associated with its character class. The flags are independent of the class and each other for the sake of characters such as ‘*’ in C mode, which is a punctuation character, and the second character of a start-of-comment sequence (‘/*’), and the first character of an end-of-comment sequence (‘*/’). The flags ‘b’, ‘c’, and ‘n’ are used to qualify the corresponding comment delimiter.
Here is a table of the possible flags for a character c, and what they mean:
Emacs supports several comment styles simultaneously in any one syntax table. A comment style is a set of flags ‘b’, ‘c’, and ‘n’, so there can be up to 8 different comment styles. Each comment delimiter has a style and only matches comment delimiters of the same style. Thus if a comment starts with the comment-start sequence of style “bn”, it will extend until the next matching comment-end sequence of style “bn”.
The appropriate comment syntax settings for C++ can be as follows:
‘124’
‘23b’
‘>’
This defines four comment-delimiting sequences:
This is a comment-start sequence for “b” style because the second character, ‘*’, has the ‘b’ flag.
This is a comment-start sequence for “a” style because the second character, ‘/’, does not have the ‘b’ flag.
This is a comment-end sequence for “b” style because the first character, ‘*’, has the ‘b’ flag.
This is a comment-end sequence for “a” style, because the newline character does not have the ‘b’ flag.
The function backward-prefix-chars
moves back over these
characters, as well as over characters whose primary syntax class is
prefix (‘'’). See section Motion and Syntax.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In this section we describe functions for creating, accessing and altering syntax tables.
This function creates a new syntax table. If table is
non-nil
, the parent of the new syntax table is table;
otherwise, the parent is the standard syntax table.
In the new syntax table, all characters are initially given the “inherit” (‘@’) syntax class, i.e., their syntax is inherited from the parent table (see section Table of Syntax Classes).
This function constructs a copy of table and returns it. If
table is omitted or nil
, it returns a copy of the
standard syntax table. Otherwise, an error is signaled if table
is not a syntax table.
This function sets the syntax entry for char according to
syntax-descriptor. char must be a character, or a cons
cell of the form (min . max)
; in the latter case,
the function sets the syntax entries for all characters in the range
between min and max, inclusive.
The syntax is changed only for table, which defaults to the current buffer’s syntax table, and not in any other syntax table.
The argument syntax-descriptor is a syntax descriptor, i.e., a string whose first character is a syntax class designator and whose second and subsequent characters optionally specify a matching character and syntax flags. See section Syntax Descriptors. An error is signaled if syntax-descriptor is not a valid syntax descriptor.
This function always returns nil
. The old syntax information in
the table for this character is discarded.
Examples:
;; Put the space character in class whitespace.
(modify-syntax-entry ?\s " ")
⇒ nil
;; Make ‘$’ an open parenthesis character, ;; with ‘^’ as its matching close. (modify-syntax-entry ?$ "(^") ⇒ nil
;; Make ‘^’ a close parenthesis character, ;; with ‘$’ as its matching open. (modify-syntax-entry ?^ ")$") ⇒ nil
;; Make ‘/’ a punctuation character, ;; the first character of a start-comment sequence, ;; and the second character of an end-comment sequence. ;; This is used in C mode. (modify-syntax-entry ?/ ". 14") ⇒ nil
This function returns the syntax class of character, represented by its designator character (see section Table of Syntax Classes). This returns only the class, not its matching character or syntax flags.
The following examples apply to C mode. (We use string
to make
it easier to see the character returned by char-syntax
.)
;; Space characters have whitespace syntax class. (string (char-syntax ?\s)) ⇒ " "
;; Forward slash characters have punctuation syntax.
;; Note that this char-syntax
call does not reveal
;; that it is also part of comment-start and -end sequences.
(string (char-syntax ?/))
⇒ "."
;; Open parenthesis characters have open parenthesis syntax.
;; Note that this char-syntax
call does not reveal that
;; it has a matching character, ‘)’.
(string (char-syntax ?\())
⇒ "("
This function makes table the syntax table for the current buffer. It returns table.
This function returns the current syntax table, which is the table for the current buffer.
This command displays the contents of the syntax table of buffer (by default, the current buffer) in a help buffer.
This macro executes body using table as the current syntax table. It returns the value of the last form in body, after restoring the old current syntax table.
Since each buffer has its own current syntax table, we should make that
more precise: with-syntax-table
temporarily alters the current
syntax table of whichever buffer is current at the time the macro
execution starts. Other buffers are not affected.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When the syntax table is not flexible enough to specify the syntax of
a language, you can override the syntax table for specific character
occurrences in the buffer, by applying a syntax-table
text
property. See section Text Properties, for how to apply text properties.
The valid values of syntax-table
text property are:
If the property value is a syntax table, that table is used instead of the current buffer’s syntax table to determine the syntax for the underlying text character.
(syntax-code . matching-char)
A cons cell of this format is a raw syntax descriptor (see section Syntax Table Internals), which directly specifies a syntax class for the underlying text character.
nil
If the property is nil
, the character’s syntax is determined from
the current syntax table in the usual way.
If this is non-nil
, the syntax scanning functions, like
forward-sexp
, pay attention to syntax text properties.
Otherwise they use only the current syntax table.
This variable, if non-nil
, should store a function for applying
syntax-table
properties to a specified stretch of text. It is
intended to be used by major modes to install a function which applies
syntax-table
properties in some mode-appropriate way.
The function is called by syntax-ppss
(see section Finding the Parse State for a Position),
and by Font Lock mode during syntactic fontification (see section Syntactic Font Lock). It is called with two arguments, start and
end, which are the starting and ending positions of the text on
which it should act. It is allowed to call syntax-ppss
on any
position before end. However, it should not call
syntax-ppss-flush-cache
; so, it is not allowed to call
syntax-ppss
on some position and later modify the buffer at an
earlier position.
This abnormal hook is run by the syntax parsing code prior to calling
syntax-propertize-function
. Its role is to help locate safe
starting and ending buffer positions for passing to
syntax-propertize-function
. For example, a major mode can add
a function to this hook to identify multi-line syntactic constructs,
and ensure that the boundaries do not fall in the middle of one.
Each function in this hook should accept two arguments, start
and end. It should return either a cons cell of two adjusted
buffer positions, (new-start . new-end)
, or
nil
if no adjustment is necessary. The hook functions are run
in turn, repeatedly, until they all return nil
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions for moving across characters that have certain syntax classes.
This function moves point forward across characters having syntax classes mentioned in syntaxes (a string of syntax class characters). It stops when it encounters the end of the buffer, or position limit (if specified), or a character it is not supposed to skip.
If syntaxes starts with ‘^’, then the function skips characters whose syntax is not in syntaxes.
The return value is the distance traveled, which is a nonnegative integer.
This function moves point backward across characters whose syntax classes are mentioned in syntaxes. It stops when it encounters the beginning of the buffer, or position limit (if specified), or a character it is not supposed to skip.
If syntaxes starts with ‘^’, then the function skips characters whose syntax is not in syntaxes.
The return value indicates the distance traveled. It is an integer that is zero or less.
This function moves point backward over any number of characters with expression prefix syntax. This includes both characters in the expression prefix syntax class, and characters with the ‘p’ flag.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions for parsing and scanning balanced expressions. We will refer to such expressions as sexps, following the terminology of Lisp, even though these functions can act on languages other than Lisp. Basically, a sexp is either a balanced parenthetical grouping, a string, or a “symbol” (i.e., a sequence of characters whose syntax is either word constituent or symbol constituent). However, characters in the expression prefix syntax class (see section Table of Syntax Classes) are treated as part of the sexp if they appear next to it.
The syntax table controls the interpretation of characters, so these functions can be used for Lisp expressions when in Lisp mode and for C expressions when in C mode. See section Moving over Balanced Expressions, for convenient higher-level functions for moving over balanced expressions.
A character’s syntax controls how it changes the state of the parser, rather than describing the state itself. For example, a string delimiter character toggles the parser state between “in-string” and “in-code”, but the syntax of characters does not directly say whether they are inside a string. For example (note that 15 is the syntax code for generic string delimiters),
(put-text-property 1 9 'syntax-table '(15 . nil))
does not tell Emacs that the first eight chars of the current buffer are a string, but rather that they are all string delimiters. As a result, Emacs treats them as four consecutive empty string constants.
34.6.1 Motion Commands Based on Parsing | Motion functions that work by parsing. | |
34.6.2 Finding the Parse State for a Position | Determining the syntactic state of a position. | |
34.6.3 Parser State | How Emacs represents a syntactic state. | |
34.6.4 Low-Level Parsing | Parsing across a specified region. | |
34.6.5 Parameters to Control Parsing | Parameters that affect parsing. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes simple point-motion functions that operate based on parsing expressions.
This function scans forward count balanced parenthetical groupings from position from. It returns the position where the scan stops. If count is negative, the scan moves backwards.
If depth is nonzero, treat the starting position as being depth parentheses deep. The scanner moves forward or backward through the buffer until the depth changes to zero count times. Hence, a positive value for depth has the effect of moving out depth levels of parenthesis from the starting position, while a negative depth has the effect of moving deeper by -depth levels of parenthesis.
Scanning ignores comments if parse-sexp-ignore-comments
is
non-nil
.
If the scan reaches the beginning or end of the accessible part of the
buffer before it has scanned over count parenthetical groupings,
the return value is nil
if the depth at that point is zero; if
the depth is non-zero, a scan-error
error is signaled.
This function scans forward count sexps from position from. It returns the position where the scan stops. If count is negative, the scan moves backwards.
Scanning ignores comments if parse-sexp-ignore-comments
is
non-nil
.
If the scan reaches the beginning or end of (the accessible part of) the
buffer while in the middle of a parenthetical grouping, an error is
signaled. If it reaches the beginning or end between groupings but
before count is used up, nil
is returned.
This function moves point forward across count complete comments
(that is, including the starting delimiter and the terminating
delimiter if any), plus any whitespace encountered on the way. It
moves backward if count is negative. If it encounters anything
other than a comment or whitespace, it stops, leaving point at the
place where it stopped. This includes (for instance) finding the end
of a comment when moving forward and expecting the beginning of one.
The function also stops immediately after moving over the specified
number of complete comments. If count comments are found as
expected, with nothing except whitespace between them, it returns
t
; otherwise it returns nil
.
This function cannot tell whether the “comments” it traverses are embedded within a string. If they look like comments, it treats them as comments.
To move forward over all comments and whitespace following point, use
(forward-comment (buffer-size))
. (buffer-size)
is a
good argument to use, because the number of comments in the buffer
cannot exceed that many.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
For syntactic analysis, such as in indentation, often the useful thing is to compute the syntactic state corresponding to a given buffer position. This function does that conveniently.
This function returns the parser state that the parser would reach at position pos starting from the beginning of the buffer. See section Parser State, for a description of the parser state.
The return value is the same as if you call the low-level parsing
function parse-partial-sexp
to parse from the beginning of the
buffer to pos (see section Low-Level Parsing). However,
syntax-ppss
uses a cache to speed up the computation. Due to
this optimization, the second value (previous complete subexpression)
and sixth value (minimum parenthesis depth) in the returned parser
state are not meaningful.
This function has a side effect: it adds a buffer-local entry to
before-change-functions
(see section Change Hooks) for
syntax-ppss-flush-cache
(see below). This entry keeps the
cache consistent as the buffer is modified. However, the cache might
not be updated if syntax-ppss
is called while
before-change-functions
is temporarily let-bound, or if the
buffer is modified without running the hook, such as when using
inhibit-modification-hooks
. In those cases, it is necessary to
call syntax-ppss-flush-cache
explicitly.
This function flushes the cache used by syntax-ppss
, starting
at position beg. The remaining arguments, ignored-args,
are ignored; this function accepts them so that it can be directly
used on hooks such as before-change-functions
(see section Change Hooks).
Major modes can make syntax-ppss
run faster by specifying
where it needs to start parsing.
If this is non-nil
, it should be a function that moves to an
earlier buffer position where the parser state is equivalent to
nil
—in other words, a position outside of any comment,
string, or parenthesis. syntax-ppss
uses it to further
optimize its computations, when the cache gives no help.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A parser state is a list of ten elements describing the state
of the syntactic parser, after it parses the text between a specified
starting point and a specified end point in the buffer. Parsing
functions such as syntax-ppss
(see section Finding the Parse State for a Position)
return a parser state as the value. Some parsing functions accept a
parser state as an argument, for resuming parsing.
Here are the meanings of the elements of the parser state:
nil
if none.
nil
if none.
nil
if inside a string. More precisely, this is the
character that will terminate the string, or t
if a generic
string delimiter character should terminate it.
t
if inside a non-nestable comment (of any comment style;
see section Syntax Flags); or the comment nesting level if inside a
comment that can be nested.
t
if the end point is just after a quote character.
nil
if not in a comment or in a
comment of style ‘a’; 1 for a comment of style ‘b’; 2 for a
comment of style ‘c’; and syntax-table
for a comment that
should be ended by a generic comment delimiter character.
nil
.
Elements 1, 2, and 6 are ignored in a state which you pass as an argument to continue parsing, and elements 8 and 9 are used only in trivial cases. Those elements are mainly used internally by the parser code.
One additional piece of useful information is available from a parser state using this function:
This function extracts, from parser state state, the last position scanned in the parse which was at top level in grammatical structure. “At top level” means outside of any parentheses, comments, or strings.
The value is nil
if state represents a parse which has
arrived at a top level position.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The most basic way to use the expression parser is to tell it to start at a given position with a certain state, and parse up to a specified end position.
This function parses a sexp in the current buffer starting at start, not scanning past limit. It stops at position limit or when certain criteria described below are met, and sets point to the location where parsing stops. It returns a parser state describing the status of the parse at the point where it stops.
If the third argument target-depth is non-nil
, parsing
stops if the depth in parentheses becomes equal to target-depth.
The depth starts at 0, or at whatever is given in state.
If the fourth argument stop-before is non-nil
, parsing
stops when it comes to any character that starts a sexp. If
stop-comment is non-nil
, parsing stops when it comes to the
start of a comment. If stop-comment is the symbol
syntax-table
, parsing stops after the start of a comment or a
string, or the end of a comment or a string, whichever comes first.
If state is nil
, start is assumed to be at the top
level of parenthesis structure, such as the beginning of a function
definition. Alternatively, you might wish to resume parsing in the
middle of the structure. To do this, you must provide a state
argument that describes the initial status of parsing. The value
returned by a previous call to parse-partial-sexp
will do
nicely.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If this variable is non-nil
, scan-sexps
treats all
non-ASCII characters as symbol constituents regardless
of what the syntax table says about them. (However, text properties
can still override the syntax.)
If the value is non-nil
, then comments are treated as
whitespace by the functions in this section and by forward-sexp
,
scan-lists
and scan-sexps
.
The behavior of parse-partial-sexp
is also affected by
parse-sexp-lookup-properties
(see section Syntax Properties).
You can use forward-comment
to move forward or backward over
one comment or several comments.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Syntax tables are implemented as char-tables (see section Char-Tables), but most Lisp programs don’t work directly with their elements. Syntax tables do not store syntax data as syntax descriptors (see section Syntax Descriptors); they use an internal format, which is documented in this section. This internal format can also be assigned as syntax properties (see section Syntax Properties).
Each entry in a syntax table is a raw syntax descriptor: a
cons cell of the form (syntax-code
. matching-char)
. syntax-code is an integer which
encodes the syntax class and syntax flags, according to the table
below. matching-char, if non-nil
, specifies a matching
character (similar to the second character in a syntax descriptor).
Here are the syntax codes corresponding to the various syntax classes:
Code | Class | Code | Class |
0 | whitespace | 8 | paired delimiter |
1 | punctuation | 9 | escape |
2 | word | 10 | character quote |
3 | symbol | 11 | comment-start |
4 | open parenthesis | 12 | comment-end |
5 | close parenthesis | 13 | inherit |
6 | expression prefix | 14 | generic comment |
7 | string quote | 15 | generic string |
For example, in the standard syntax table, the entry for ‘(’ is
(4 . 41)
. 41 is the character code for ‘)’.
Syntax flags are encoded in higher order bits, starting 16 bits from the least significant bit. This table gives the power of two which corresponds to each syntax flag.
Prefix | Flag | Prefix | Flag |
‘1’ | (lsh 1 16) | ‘p’ | (lsh 1 20) |
‘2’ | (lsh 1 17) | ‘b’ | (lsh 1 21) |
‘3’ | (lsh 1 18) | ‘n’ | (lsh 1 22) |
‘4’ | (lsh 1 19) |
Given a syntax descriptor desc (a string), this function returns the corresponding raw syntax descriptor.
This function returns the raw syntax descriptor for the character in
the buffer after position pos, taking account of syntax
properties as well as the syntax table. If pos is outside the
buffer’s accessible portion (see section accessible portion),
the return value is nil
.
This function returns the syntax code for the raw syntax descriptor syntax. More precisely, it takes the raw syntax descriptor’s syntax-code component, masks off the high 16 bits which record the syntax flags, and returns the resulting integer.
If syntax is nil
, the return value is returns nil
.
This is so that the expression
(syntax-class (syntax-after pos))
evaluates to nil
if pos
is outside the buffer’s
accessible portion, without throwing errors or returning an incorrect
code.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Categories provide an alternate way of classifying characters syntactically. You can define several categories as needed, then independently assign each character to one or more categories. Unlike syntax classes, categories are not mutually exclusive; it is normal for one character to belong to several categories.
Each buffer has a category table which records which categories are defined and also which characters belong to each category. Each category table defines its own categories, but normally these are initialized by copying from the standard categories table, so that the standard categories are available in all modes.
Each category has a name, which is an ASCII printing character in
the range ‘ ’ to ‘~’. You specify the name of a category
when you define it with define-category
.
The category table is actually a char-table (see section Char-Tables).
The element of the category table at index c is a category
set—a bool-vector—that indicates which categories character c
belongs to. In this category set, if the element at index cat is
t
, that means category cat is a member of the set, and that
character c belongs to category cat.
For the next three functions, the optional argument table defaults to the current buffer’s category table.
This function defines a new category, with name char and documentation docstring, for the category table table.
Here’s an example of defining a new category for characters that have strong right-to-left directionality (see section Bidirectional Display) and using it in a special category table:
(defvar special-category-table-for-bidi (let ((category-table (make-category-table)) (uniprop-table (unicode-property-table-internal 'bidi-class))) (define-category ?R "Characters of bidi-class R, AL, or RLO" category-table) (map-char-table #'(lambda (key val) (if (memq val '(R AL RLO)) (modify-category-entry key ?R category-table))) uniprop-table) category-table))
This function returns the documentation string of category category in category table table.
(category-docstring ?a) ⇒ "ASCII" (category-docstring ?l) ⇒ "Latin"
This function returns a category name (a character) which is not
currently defined in table. If all possible categories are in use
in table, it returns nil
.
This function returns the current buffer’s category table.
This function returns t
if object is a category table,
otherwise nil
.
This function returns the standard category table.
This function constructs a copy of table and returns it. If
table is not supplied (or is nil
), it returns a copy of the
standard category table. Otherwise, an error is signaled if table
is not a category table.
This function makes table the category table for the current buffer. It returns table.
This creates and returns an empty category table. In an empty category table, no categories have been allocated, and no characters belong to any categories.
This function returns a new category set—a bool-vector—whose initial
contents are the categories listed in the string categories. The
elements of categories should be category names; the new category
set has t
for each of those categories, and nil
for all
other categories.
(make-category-set "al") ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
This function returns the category set for character char in the
current buffer’s category table. This is the bool-vector which
records which categories the character char belongs to. The
function char-category-set
does not allocate storage, because
it returns the same bool-vector that exists in the category table.
(char-category-set ?a) ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
This function converts the category set category-set into a string containing the characters that designate the categories that are members of the set.
(category-set-mnemonics (char-category-set ?a)) ⇒ "al"
This function modifies the category set of char in category
table table (which defaults to the current buffer’s category
table). char can be a character, or a cons cell of the form
(min . max)
; in the latter case, the function
modifies the category sets of all characters in the range between
min and max, inclusive.
Normally, it modifies a category set by adding category to it.
But if reset is non-nil
, then it deletes category
instead.
This function describes the category specifications in the current
category table. It inserts the descriptions in a buffer, and then
displays that buffer. If buffer-or-name is non-nil
, it
describes the category table of that buffer instead.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An abbreviation or abbrev is a string of characters that may be expanded to a longer string. The user can insert the abbrev string and find it replaced automatically with the expansion of the abbrev. This saves typing.
The set of abbrevs currently in effect is recorded in an abbrev table. Each buffer has a local abbrev table, but normally all buffers in the same major mode share one abbrev table. There is also a global abbrev table. Normally both are used.
An abbrev table is represented as an obarray. See section Creating and Interning Symbols, for information about obarrays. Each abbreviation is represented by a symbol in the obarray. The symbol’s name is the abbreviation; its value is the expansion; its function definition is the hook function for performing the expansion (see section Defining Abbrevs); and its property list cell contains various additional properties, including the use count and the number of times the abbreviation has been expanded (see section Abbrev Properties).
Certain abbrevs, called system abbrevs, are defined by a major
mode instead of the user. A system abbrev is identified by its
non-nil
:system
property (see section Abbrev Properties).
When abbrevs are saved to an abbrev file, system abbrevs are omitted.
See section Saving Abbrevs in Files.
Because the symbols used for abbrevs are not interned in the usual obarray, they will never appear as the result of reading a Lisp expression; in fact, normally they are never used except by the code that handles abbrevs. Therefore, it is safe to use them in a nonstandard way.
If the minor mode Abbrev mode is enabled, the buffer-local variable
abbrev-mode
is non-nil
, and abbrevs are automatically
expanded in the buffer. For the user-level commands for abbrevs, see
Abbrev Mode in The GNU Emacs Manual.
35.1 Abbrev Tables | Creating and working with abbrev tables. | |
35.2 Defining Abbrevs | Specifying abbreviations and their expansions. | |
35.3 Saving Abbrevs in Files | Saving abbrevs in files. | |
35.4 Looking Up and Expanding Abbreviations | Controlling expansion; expansion subroutines. | |
35.5 Standard Abbrev Tables | Abbrev tables used by various major modes. | |
35.6 Abbrev Properties | How to read and set abbrev properties. Which properties have which effect. | |
35.7 Abbrev Table Properties | How to read and set abbrev table properties. Which properties have which effect. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to create and manipulate abbrev tables.
This function creates and returns a new, empty abbrev table—an obarray containing no symbols. It is a vector filled with zeros. props is a property list that is applied to the new table (see section Abbrev Table Properties).
This function returns a non-nil
value if object is an
abbrev table.
This function undefines all the abbrevs in abbrev-table, leaving it empty.
This function returns a copy of abbrev-table—a new abbrev table containing the same abbrev definitions. It does not copy any property lists; only the names, values, and functions.
This function defines tabname (a symbol) as an abbrev table
name, i.e., as a variable whose value is an abbrev table. It defines
abbrevs in the table according to definitions, a list of
elements of the form (abbrevname expansion
[hook] [props...])
. These elements are passed as
arguments to define-abbrev
.
The optional string docstring is the documentation string of the variable tabname. The property list props is applied to the abbrev table (see section Abbrev Table Properties).
If this function is called more than once for the same tabname, subsequent calls add the definitions in definitions to tabname, rather than overwriting the entire original contents. (A subsequent call only overrides abbrevs explicitly redefined or undefined in definitions.)
This is a list of symbols whose values are abbrev tables.
define-abbrev-table
adds the new abbrev table name to this list.
This function inserts before point a description of the abbrev table named name. The argument name is a symbol whose value is an abbrev table.
If human is non-nil
, the description is human-oriented.
System abbrevs are listed and identified as such. Otherwise the
description is a Lisp expression—a call to define-abbrev-table
that would define name as it is currently defined, but without
the system abbrevs. (The mode or package using name is supposed
to add these to name separately.)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
define-abbrev
is the low-level basic function for defining an
abbrev in an abbrev table.
When a major mode defines a system abbrev, it should call
define-abbrev
and specify t
for the :system
property. Be aware that any saved non-“system” abbrevs are restored
at startup, i.e., before some major modes are loaded. Therefore, major
modes should not assume that their abbrev tables are empty when they
are first loaded.
This function defines an abbrev named name, in
abbrev-table, to expand to expansion and call hook,
with properties props (see section Abbrev Properties). The return
value is name. The :system
property in props is
treated specially here: if it has the value force
, then it will
overwrite an existing definition even for a non-“system” abbrev of
the same name.
name should be a string. The argument expansion is
normally the desired expansion (a string), or nil
to undefine
the abbrev. If it is anything but a string or nil
, then the
abbreviation “expands” solely by running hook.
The argument hook is a function or nil
. If hook is
non-nil
, then it is called with no arguments after the abbrev is
replaced with expansion; point is located at the end of
expansion when hook is called.
If hook is a non-nil
symbol whose no-self-insert
property is non-nil
, hook can explicitly control whether
to insert the self-inserting input character that triggered the
expansion. If hook returns non-nil
in this case, that
inhibits insertion of the character. By contrast, if hook
returns nil
, expand-abbrev
(or abbrev-insert
)
also returns nil
, as if expansion had not really occurred.
Normally, define-abbrev
sets the variable
abbrevs-changed
to t
, if it actually changes the abbrev.
This is so that some commands will offer to save the abbrevs. It
does not do this for a system abbrev, since those aren’t saved anyway.
If this variable is non-nil
, it means that the user plans to use
global abbrevs only. This tells the commands that define mode-specific
abbrevs to define global ones instead. This variable does not alter the
behavior of the functions in this section; it is examined by their
callers.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A file of saved abbrev definitions is actually a file of Lisp code.
The abbrevs are saved in the form of a Lisp program to define the same
abbrev tables with the same contents. Therefore, you can load the file
with load
(see section How Programs Do Loading). However, the
function quietly-read-abbrev-file
is provided as a more
convenient interface. Emacs automatically calls this function at
startup.
User-level facilities such as save-some-buffers
can save
abbrevs in a file automatically, under the control of variables
described here.
This is the default file name for reading and saving abbrevs.
This function reads abbrev definitions from a file named filename,
previously written with write-abbrev-file
. If filename is
omitted or nil
, the file specified in abbrev-file-name
is
used.
As the name implies, this function does not display any messages.
A non-nil
value for save-abbrevs
means that Emacs should
offer to save abbrevs (if any have changed) when files are saved. If
the value is silently
, Emacs saves the abbrevs without asking
the user. abbrev-file-name
specifies the file to save the
abbrevs in.
This variable is set non-nil
by defining or altering any
abbrevs (except system abbrevs). This serves as a flag for various
Emacs commands to offer to save your abbrevs.
Save all abbrev definitions (except system abbrevs), for all abbrev
tables listed in abbrev-table-name-list
, in the file
filename, in the form of a Lisp program that when loaded will
define the same abbrevs. If filename is nil
or omitted,
abbrev-file-name
is used. This function returns nil
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Abbrevs are usually expanded by certain interactive commands,
including self-insert-command
. This section describes the
subroutines used in writing such commands, as well as the variables they
use for communication.
This function returns the symbol representing the abbrev named
abbrev. It returns nil
if that abbrev is not
defined. The optional second argument table is the abbrev table
in which to look it up. If table is nil
, this function
tries first the current buffer’s local abbrev table, and second the
global abbrev table.
This function returns the string that abbrev would expand into (as
defined by the abbrev tables used for the current buffer). It returns
nil
if abbrev is not a valid abbrev.
The optional argument table specifies the abbrev table to use,
as in abbrev-symbol
.
This command expands the abbrev before point, if any. If point does not
follow an abbrev, this command does nothing. To do the expansion, it
calls the function that is the value of the abbrev-expand-function
variable, with no arguments, and returns whatever that function does.
The default expansion function returns the abbrev symbol if it did
expansion, and nil
otherwise. If the abbrev symbol has a hook
function that is a symbol whose no-self-insert
property is
non-nil
, and if the hook function returns nil
as its
value, then the default expansion function returns nil
,
even though expansion did occur.
This function inserts the abbrev expansion of abbrev
, replacing
the text between start
and end
. If start
is
omitted, it defaults to point. name
, if non-nil
, should
be the name by which this abbrev was found (a string); it is used to
figure out whether to adjust the capitalization of the expansion. The
function returns abbrev
if the abbrev was successfully
inserted.
This command marks the current location of point as the beginning of
an abbrev. The next call to expand-abbrev
will use the text
from here to point (where it is then) as the abbrev to expand, rather
than using the previous word as usual.
First, this command expands any abbrev before point, unless arg
is non-nil
. (Interactively, arg is the prefix argument.)
Then it inserts a hyphen before point, to indicate the start of the
next abbrev to be expanded. The actual expansion removes the hyphen.
When this is set non-nil
, an abbrev entered entirely in upper
case is expanded using all upper case. Otherwise, an abbrev entered
entirely in upper case is expanded by capitalizing each word of the
expansion.
The value of this variable is a buffer position (an integer or a marker)
for expand-abbrev
to use as the start of the next abbrev to be
expanded. The value can also be nil
, which means to use the
word before point instead. abbrev-start-location
is set to
nil
each time expand-abbrev
is called. This variable is
also set by abbrev-prefix-mark
.
The value of this variable is the buffer for which
abbrev-start-location
has been set. Trying to expand an abbrev
in any other buffer clears abbrev-start-location
. This variable
is set by abbrev-prefix-mark
.
This is the abbrev-symbol
of the most recent abbrev expanded. This
information is left by expand-abbrev
for the sake of the
unexpand-abbrev
command (see Expanding
Abbrevs in The GNU Emacs Manual).
This is the location of the most recent abbrev expanded. This contains
information left by expand-abbrev
for the sake of the
unexpand-abbrev
command.
This is the exact expansion text of the most recent abbrev expanded,
after case conversion (if any). Its value is nil
if the abbrev
has already been unexpanded. This contains information left by
expand-abbrev
for the sake of the unexpand-abbrev
command.
The value of this variable is a function that expand-abbrev
will call with no arguments to do the expansion. The function can do
anything it wants before and after performing the expansion.
It should return the abbrev symbol if expansion took place.
The following sample code shows a simple use of
abbrev-expand-function
. It assumes that foo-mode
is a
mode for editing certain files in which lines that start with ‘#’
are comments. You want to use Text mode abbrevs for those lines. The
regular local abbrev table, foo-mode-abbrev-table
is
appropriate for all other lines. See section Standard Abbrev Tables, for the
definitions of local-abbrev-table
and text-mode-abbrev-table
.
See section Advising Emacs Lisp Functions, for details of add-function
.
(defun foo-mode-abbrev-expand-function (expand) (if (not (save-excursion (forward-line 0) (eq (char-after) ?#))) ;; Performs normal expansion. (funcall expand) ;; We're inside a comment: use the text-mode abbrevs. (let ((local-abbrev-table text-mode-abbrev-table)) (funcall expand)))) (add-hook 'foo-mode-hook #'(lambda () (add-function :around (local 'abbrev-expand-function) #'foo-mode-abbrev-expand-function)))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here we list the variables that hold the abbrev tables for the preloaded major modes of Emacs.
This is the abbrev table for mode-independent abbrevs. The abbrevs defined in it apply to all buffers. Each buffer may also have a local abbrev table, whose abbrev definitions take precedence over those in the global table.
The value of this buffer-local variable is the (mode-specific) abbreviation table of the current buffer. It can also be a list of such tables.
The value of this variable is a list of elements of the form
(mode . abbrev-table)
where mode is the name
of a variable: if the variable is bound to a non-nil
value,
then the abbrev-table is active, otherwise it is ignored.
abbrev-table can also be a list of abbrev tables.
This is the local abbrev table used in Fundamental mode; in other words, it is the local abbrev table in all buffers in Fundamental mode.
This is the local abbrev table used in Text mode.
This is the local abbrev table used in Lisp mode. It is the parent of the local abbrev table used in Emacs Lisp mode. See section Abbrev Table Properties.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Abbrevs have properties, some of which influence the way they work.
You can provide them as arguments to define-abbrev
, and
manipulate them with the following functions:
Set the property prop of abbrev to value val.
Return the property prop of abbrev, or nil
if the
abbrev has no such property.
The following properties have special meanings:
:count
This property counts the number of times the abbrev has
been expanded. If not explicitly set, it is initialized to 0 by
define-abbrev
.
:system
If non-nil
, this property marks the abbrev as a system abbrev.
Such abbrevs are not saved (see section Saving Abbrevs in Files).
:enable-function
If non-nil
, this property should be a function of no
arguments which returns nil
if the abbrev should not be used
and t
otherwise.
:case-fixed
If non-nil
, this property indicates that the case of the
abbrev’s name is significant and should only match a text with the
same pattern of capitalization. It also disables the code that
modifies the capitalization of the expansion.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Like abbrevs, abbrev tables have properties, some of which influence
the way they work. You can provide them as arguments to
define-abbrev-table
, and manipulate them with the functions:
Set the property prop of abbrev table table to value val.
Return the property prop of abbrev table table, or nil
if the abbrev has no such property.
The following properties have special meaning:
:enable-function
This is like the :enable-function
abbrev property except that
it applies to all abbrevs in the table. It is used before even trying
to find the abbrev before point, so it can dynamically modify the
abbrev table.
:case-fixed
This is like the :case-fixed
abbrev property except that it
applies to all abbrevs in the table.
:regexp
If non-nil
, this property is a regular expression that
indicates how to extract the name of the abbrev before point, before
looking it up in the table. When the regular expression matches
before point, the abbrev name is expected to be in submatch 1.
If this property is nil
, the default is to use
backward-word
and forward-word
to find the name. This
property allows the use of abbrevs whose name contains characters of
non-word syntax.
:parents
This property holds a list of tables from which to inherit other abbrevs.
:abbrev-table-modiff
This property holds a counter incremented each time a new abbrev is added to the table.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In the terminology of operating systems, a process is a space in which a program can execute. Emacs runs in a process. Emacs Lisp programs can invoke other programs in processes of their own. These are called subprocesses or child processes of the Emacs process, which is their parent process.
A subprocess of Emacs may be synchronous or asynchronous, depending on how it is created. When you create a synchronous subprocess, the Lisp program waits for the subprocess to terminate before continuing execution. When you create an asynchronous subprocess, it can run in parallel with the Lisp program. This kind of subprocess is represented within Emacs by a Lisp object which is also called a “process”. Lisp programs can use this object to communicate with the subprocess or to control it. For example, you can send signals, obtain status information, receive output from the process, or send input to it.
This function returns t
if object represents an Emacs
subprocess, nil
otherwise.
In addition to subprocesses of the current Emacs session, you can also access other processes running on your machine. See section Accessing Other Processes.
36.1 Functions that Create Subprocesses | Functions that start subprocesses. | |
36.2 Shell Arguments | Quoting an argument to pass it to a shell. | |
36.3 Creating a Synchronous Process | Details of using synchronous subprocesses. | |
36.4 Creating an Asynchronous Process | Starting up an asynchronous subprocess. | |
36.5 Deleting Processes | Eliminating an asynchronous subprocess. | |
36.6 Process Information | Accessing run-status and other attributes. | |
36.7 Sending Input to Processes | Sending input to an asynchronous subprocess. | |
36.8 Sending Signals to Processes | Stopping, continuing or interrupting an asynchronous subprocess. | |
36.9 Receiving Output from Processes | Collecting output from an asynchronous subprocess. | |
36.10 Sentinels: Detecting Process Status Changes | Sentinels run when process run-status changes. | |
36.11 Querying Before Exit | Whether to query if exiting will kill a process. | |
36.12 Accessing Other Processes | Accessing other processes running on your system. | |
36.13 Transaction Queues | Transaction-based communication with subprocesses. | |
36.14 Network Connections | Opening network connections. | |
36.15 Network Servers | Network servers let Emacs accept net connections. | |
36.16 Datagrams | UDP network connections. | |
36.17 Low-Level Network Access | Lower-level but more general function to create connections and servers. | |
36.18 Misc Network Facilities | Additional relevant functions for net connections. | |
36.19 Communicating with Serial Ports | Communicating with serial ports. | |
36.20 Packing and Unpacking Byte Arrays | Using bindat to pack and unpack binary data. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are three primitives that create a new subprocess in which to run
a program. One of them, start-process
, creates an asynchronous
process and returns a process object (see section Creating an Asynchronous Process).
The other two, call-process
and call-process-region
,
create a synchronous process and do not return a process object
(see section Creating a Synchronous Process). There are various higher-level
functions that make use of these primitives to run particular types of
process.
Synchronous and asynchronous processes are explained in the following sections. Since the three functions are all called in a similar fashion, their common arguments are described here.
In all cases, the function’s program argument specifies the
program to be run. An error is signaled if the file is not found or
cannot be executed. If the file name is relative, the variable
exec-path
contains a list of directories to search. Emacs
initializes exec-path
when it starts up, based on the value of
the environment variable PATH
. The standard file name
constructs, ‘~’, ‘.’, and ‘..’, are interpreted as
usual in exec-path
, but environment variable substitutions
(‘$HOME’, etc.) are not recognized; use
substitute-in-file-name
to perform them (see section Functions that Expand Filenames). nil
in this list refers to
default-directory
.
Executing a program can also try adding suffixes to the specified name:
This variable is a list of suffixes (strings) to try adding to the
specified program file name. The list should include ""
if you
want the name to be tried exactly as specified. The default value is
system-dependent.
Please note: The argument program contains only the name of the program; it may not contain any command-line arguments. You must use a separate argument, args, to provide those, as described below.
Each of the subprocess-creating functions has a buffer-or-name
argument that specifies where the standard output from the program will
go. It should be a buffer or a buffer name; if it is a buffer name,
that will create the buffer if it does not already exist. It can also
be nil
, which says to discard the output, unless a custom filter function
handles it. (See section Process Filter Functions, and Reading and Printing Lisp Objects.)
Normally, you should avoid having multiple processes send output to the
same buffer because their output would be intermixed randomly.
For synchronous processes, you can send the output to a file instead
of a buffer.
All three of the subprocess-creating functions have a &rest
argument, args. The args must all be strings, and they are
supplied to program as separate command line arguments. Wildcard
characters and other shell constructs have no special meanings in these
strings, since the strings are passed directly to the specified program.
The subprocess inherits its environment from Emacs, but you can
specify overrides for it with process-environment
. See section Operating System Environment. The subprocess gets its current directory from the
value of default-directory
.
The value of this variable is a string, the name of a directory that
contains programs that come with GNU Emacs and are intended for Emacs
to invoke. The program movemail
is an example of such a program;
Rmail uses it to fetch new mail from an inbox.
The value of this variable is a list of directories to search for
programs to run in subprocesses. Each element is either the name of a
directory (i.e., a string), or nil
, which stands for the default
directory (which is the value of default-directory
).
The value of exec-path
is used by call-process
and
start-process
when the program argument is not an absolute
file name.
Generally, you should not modify exec-path
directly. Instead,
ensure that your PATH
environment variable is set appropriately
before starting Emacs. Trying to modify exec-path
independently of PATH
can lead to confusing results.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lisp programs sometimes need to run a shell and give it a command
that contains file names that were specified by the user. These
programs ought to be able to support any valid file name. But the shell
gives special treatment to certain characters, and if these characters
occur in the file name, they will confuse the shell. To handle these
characters, use the function shell-quote-argument
:
This function returns a string that represents, in shell syntax, an argument whose actual contents are argument. It should work reliably to concatenate the return value into a shell command and then pass it to a shell for execution.
Precisely what this function does depends on your operating system. The function is designed to work with the syntax of your system’s standard shell; if you use an unusual shell, you will need to redefine this function.
;; This example shows the behavior on GNU and Unix systems. (shell-quote-argument "foo > bar") ⇒ "foo\\ \\>\\ bar" ;; This example shows the behavior on MS-DOS and MS-Windows. (shell-quote-argument "foo > bar") ⇒ "\"foo > bar\""
Here’s an example of using shell-quote-argument
to construct
a shell command:
(concat "diff -c " (shell-quote-argument oldfile) " " (shell-quote-argument newfile))
The following two functions are useful for combining a list of
individual command-line argument strings into a single string, and
taking a string apart into a list of individual command-line
arguments. These functions are mainly intended for
converting user input in the minibuffer, a Lisp string, into a list of
string arguments to be passed to call-process
or
start-process
, or for converting such lists of arguments into
a single Lisp string to be presented in the minibuffer or echo area.
This function splits string into substrings at matches for the
regular expression separators, like split-string
does
(see section Creating Strings); in addition, it removes quoting from the
substrings. It then makes a list of the substrings and returns it.
If separators is omitted or nil
, it defaults to
"\\s-+"
, which is a regular expression that matches one or more
characters with whitespace syntax (see section Table of Syntax Classes).
This function supports two types of quoting: enclosing a whole string
in double quotes "…"
, and quoting individual characters
with a backslash escape ‘\’. The latter is also used in Lisp
strings, so this function can handle those as well.
This function concatenates list-of-strings into a single string,
quoting each string as necessary. It also sticks the separator
string between each pair of strings; if separator is omitted or
nil
, it defaults to " "
. The return value is the
resulting string.
The strings in list-of-strings that need quoting are those that
include separator as their substring. Quoting a string encloses
it in double quotes "…"
. In the simplest case, if you
are consing a command from the individual command-line arguments,
every argument that includes embedded blanks will be quoted.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
After a synchronous process is created, Emacs waits for the
process to terminate before continuing. Starting Dired on GNU or
Unix18 is an example of this: it
runs ls
in a synchronous process, then modifies the output
slightly. Because the process is synchronous, the entire directory
listing arrives in the buffer before Emacs tries to do anything with it.
While Emacs waits for the synchronous subprocess to terminate, the
user can quit by typing C-g. The first C-g tries to kill
the subprocess with a SIGINT
signal; but it waits until the
subprocess actually terminates before quitting. If during that time the
user types another C-g, that kills the subprocess instantly with
SIGKILL
and quits immediately (except on MS-DOS, where killing
other processes doesn’t work). See section Quitting.
The synchronous subprocess functions return an indication of how the process terminated.
The output from a synchronous subprocess is generally decoded using a
coding system, much like text read from a file. The input sent to a
subprocess by call-process-region
is encoded using a coding
system, much like text written into a file. See section Coding Systems.
This function calls program and waits for it to finish.
The current working directory of the subprocess is
default-directory
.
The standard input for the new process comes from file infile if
infile is not nil
, and from the null device otherwise.
The argument destination says where to put the process output.
Here are the possibilities:
Insert the output in that buffer, before point. This includes both the standard output stream and the standard error stream of the process.
Insert the output in a buffer with that name, before point.
t
Insert the output in the current buffer, before point.
nil
Discard the output.
Discard the output, and return nil
immediately without waiting
for the subprocess to finish.
In this case, the process is not truly synchronous, since it can run in parallel with Emacs; but you can think of it as synchronous in that Emacs is essentially finished with the subprocess as soon as this function returns.
MS-DOS doesn’t support asynchronous subprocesses, so this option doesn’t work there.
(:file file-name)
Send the output to the file name specified, overwriting it if it already exists.
(real-destination error-destination)
Keep the standard output stream separate from the standard error stream;
deal with the ordinary output as specified by real-destination,
and dispose of the error output according to error-destination.
If error-destination is nil
, that means to discard the
error output, t
means mix it with the ordinary output, and a
string specifies a file name to redirect error output into.
You can’t directly specify a buffer to put the error output in; that is too difficult to implement. But you can achieve this result by sending the error output to a temporary file and then inserting the file into a buffer.
If display is non-nil
, then call-process
redisplays
the buffer as output is inserted. (However, if the coding system chosen
for decoding output is undecided
, meaning deduce the encoding
from the actual data, then redisplay sometimes cannot continue once
non-ASCII characters are encountered. There are fundamental
reasons why it is hard to fix this; see Receiving Output from Processes.)
Otherwise the function call-process
does no redisplay, and the
results become visible on the screen only when Emacs redisplays that
buffer in the normal course of events.
The remaining arguments, args, are strings that specify command line arguments for the program.
The value returned by call-process
(unless you told it not to
wait) indicates the reason for process termination. A number gives the
exit status of the subprocess; 0 means success, and any other value
means failure. If the process terminated with a signal,
call-process
returns a string describing the signal.
In the examples below, the buffer ‘foo’ is current.
(call-process "pwd" nil t) ⇒ 0 ---------- Buffer: foo ---------- /home/lewis/manual ---------- Buffer: foo ----------
(call-process "grep" nil "bar" nil "lewis" "/etc/passwd") ⇒ 0 ---------- Buffer: bar ---------- lewis:x:1001:1001:Bil Lewis,,,,:/home/lewis:/bin/bash ---------- Buffer: bar ----------
Here is an example of the use of call-process
, as used to
be found in the definition of the insert-directory
function:
(call-process insert-directory-program nil t nil switches (if full-directory-p (concat (file-name-as-directory file) ".") file))
This function processes files synchronously in a separate process. It
is similar to call-process
, but may invoke a file handler based
on the value of the variable default-directory
, which specifies
the current working directory of the subprocess.
The arguments are handled in almost the same way as for
call-process
, with the following differences:
Some file handlers may not support all combinations and forms of the
arguments infile, buffer, and display. For example,
some file handlers might behave as if display were nil
,
regardless of the value actually passed. As another example, some
file handlers might not support separating standard output and error
output by way of the buffer argument.
If a file handler is invoked, it determines the program to run based
on the first argument program. For instance, suppose that a
handler for remote files is invoked. Then the path that is used for
searching for the program might be different from exec-path
.
The second argument infile may invoke a file handler. The file
handler could be different from the handler chosen for the
process-file
function itself. (For example,
default-directory
could be on one remote host, and
infile on a different remote host. Or default-directory
could be non-special, whereas infile is on a remote host.)
If buffer is a list of the form (real-destination
error-destination)
, and error-destination names a file,
then the same remarks as for infile apply.
The remaining arguments (args) will be passed to the process
verbatim. Emacs is not involved in processing file names that are
present in args. To avoid confusion, it may be best to avoid
absolute file names in args, but rather to specify all file
names as relative to default-directory
. The function
file-relative-name
is useful for constructing such relative
file names.
This variable indicates whether a call of process-file
changes
remote files.
By default, this variable is always set to t
, meaning that a
call of process-file
could potentially change any file on a
remote host. When set to nil
, a file handler could optimize
its behavior with respect to remote file attribute caching.
You should only ever change this variable with a let-binding; never
with setq
.
This function sends the text from start to end as
standard input to a process running program. It deletes the text
sent if delete is non-nil
; this is useful when
destination is t
, to insert the output in the current
buffer in place of the input.
The arguments destination and display control what to do
with the output from the subprocess, and whether to update the display
as it comes in. For details, see the description of
call-process
, above. If destination is the integer 0,
call-process-region
discards the output and returns nil
immediately, without waiting for the subprocess to finish (this only
works if asynchronous subprocesses are supported; i.e., not on MS-DOS).
The remaining arguments, args, are strings that specify command line arguments for the program.
The return value of call-process-region
is just like that of
call-process
: nil
if you told it to return without
waiting; otherwise, a number or string which indicates how the
subprocess terminated.
In the following example, we use call-process-region
to run the
cat
utility, with standard input being the first five characters
in buffer ‘foo’ (the word ‘input’). cat
copies its
standard input into its standard output. Since the argument
destination is t
, this output is inserted in the current
buffer.
---------- Buffer: foo ---------- input∗ ---------- Buffer: foo ----------
(call-process-region 1 6 "cat" nil t) ⇒ 0 ---------- Buffer: foo ---------- inputinput∗ ---------- Buffer: foo ----------
For example, the shell-command-on-region
command uses
call-process-region
in a manner similar to this:
(call-process-region
start end
shell-file-name ; name of program
nil ; do not delete region
buffer ; send output to buffer
nil ; no redisplay during output
"-c" command) ; arguments for the shell
This function executes the shell command command synchronously.
The arguments are handled as in call-process
. An old calling
convention allowed to pass any number of additional arguments after
display, which were concatenated to command; this is still
supported, but strongly discouraged.
This function is like call-process-shell-command
, but uses
process-file
internally. Depending on default-directory
,
command can be executed also on remote hosts. An old calling
convention allowed to pass any number of additional arguments after
display, which were concatenated to command; this is still
supported, but strongly discouraged.
This function executes command (a string) as a shell command, then returns the command’s output as a string.
This function runs program, waits for it to finish, and returns its output as a list of strings. Each string in the list holds a single line of text output by the program; the end-of-line characters are stripped from each line. The arguments beyond program, args, are strings that specify command-line arguments with which to run the program.
If program exits with a non-zero exit status, this function signals an error.
This function works by calling call-process
, so program output
is decoded in the same way as for call-process
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In this section, we describe how to create an asynchronous process. After an asynchronous process is created, it runs in parallel with Emacs, and Emacs can communicate with it using the functions described in the following sections (see section Sending Input to Processes, and see section Receiving Output from Processes). Note that process communication is only partially asynchronous: Emacs sends data to the process only when certain functions are called, and Emacs accepts data from the process only while waiting for input or for a time delay.
An asynchronous process is controlled either via a pty
(pseudo-terminal) or a pipe. The choice of pty or pipe is made
when creating the process, based on the value of the variable
process-connection-type
(see below). Ptys are usually
preferable for processes visible to the user, as in Shell mode,
because they allow for job control (C-c, C-z, etc.)
between the process and its children, whereas pipes do not. For
subprocesses used for internal purposes by programs, it is often
better to use a pipe, because they are more efficient, and because
they are immune to stray character injections that ptys introduce for
large (around 500 byte) messages. Also, the total number of ptys is
limited on many systems and it is good not to waste them.
This function creates a new asynchronous subprocess and starts the program program running in it. It returns a process object that stands for the new subprocess in Lisp. The argument name specifies the name for the process object; if a process with this name already exists, then name is modified (by appending ‘<1>’, etc.) to be unique. The buffer buffer-or-name is the buffer to associate with the process.
If program is nil
, Emacs opens a new pseudoterminal (pty)
and associates its input and output with buffer-or-name, without
creating a subprocess. In that case, the remaining arguments
args are ignored.
The remaining arguments, args, are strings that specify command line arguments for the subprocess.
In the example below, the first process is started and runs (rather, sleeps) for 100 seconds (the output buffer ‘foo’ is created immediately). Meanwhile, the second process is started, and given the name ‘my-process<1>’ for the sake of uniqueness. It inserts the directory listing at the end of the buffer ‘foo’, before the first process finishes. Then it finishes, and a message to that effect is inserted in the buffer. Much later, the first process finishes, and another message is inserted in the buffer for it.
(start-process "my-process" "foo" "sleep" "100") ⇒ #<process my-process>
(start-process "my-process" "foo" "ls" "-l" "/bin") ⇒ #<process my-process<1>> ---------- Buffer: foo ---------- total 8336 -rwxr-xr-x 1 root root 971384 Mar 30 10:14 bash -rwxr-xr-x 1 root root 146920 Jul 5 2011 bsd-csh … -rwxr-xr-x 1 root root 696880 Feb 28 15:55 zsh4 Process my-process<1> finished Process my-process finished ---------- Buffer: foo ----------
Like start-process
, this function starts a new asynchronous
subprocess running program in it, and returns its process
object.
The difference from start-process
is that this function may
invoked a file handler based on the value of default-directory
.
This handler ought to run program, perhaps on the local host,
perhaps on a remote host that corresponds to default-directory
.
In the latter case, the local part of default-directory
becomes
the working directory of the process.
This function does not try to invoke file name handlers for program or for the program-args.
Depending on the implementation of the file handler, it might not be
possible to apply process-filter
or process-sentinel
to
the resulting process object. See section Process Filter Functions, and Sentinels: Detecting Process Status Changes.
Some file handlers may not support start-file-process
(for
example the function ange-ftp-hook-function
). In such cases,
this function does nothing and returns nil
.
This function is like start-process
, except that it uses a shell
to execute the specified command. The argument command is a shell
command name. The variable shell-file-name
specifies which shell to
use.
The point of running a program through the shell, rather than directly
with start-process
, is so that you can employ shell features such
as wildcards in the arguments. It follows that if you include any
arbitrary user-specified arguments in the command, you should quote them
with shell-quote-argument
first, so that any special shell
characters do not have their special shell meanings. See section Shell Arguments. Of course, when executing commands based on user input
you should also consider the security implications.
This function is like start-process-shell-command
, but uses
start-file-process
internally. Because of this, command
can also be executed on remote hosts, depending on default-directory
.
This variable controls the type of device used to communicate with
asynchronous subprocesses. If it is non-nil
, then ptys are
used, when available. Otherwise, pipes are used.
The value of process-connection-type
takes effect when
start-process
is called. So you can specify how to communicate
with one subprocess by binding the variable around the call to
start-process
.
(let ((process-connection-type nil)) ; use a pipe
(start-process …))
To determine whether a given subprocess actually got a pipe or a pty,
use the function process-tty-name
(see section Process Information).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Deleting a process disconnects Emacs immediately from the subprocess. Processes are deleted automatically after they terminate, but not necessarily right away. You can delete a process explicitly at any time. If you explicitly delete a terminated process before it is deleted automatically, no harm results. Deleting a running process sends a signal to terminate it (and its child processes, if any), and calls the process sentinel. See section Sentinels: Detecting Process Status Changes.
When a process is deleted, the process object itself continues to exist as long as other Lisp objects point to it. All the Lisp primitives that work on process objects accept deleted processes, but those that do I/O or send signals will report an error. The process mark continues to point to the same place as before, usually into a buffer where output from the process was being inserted.
This variable controls automatic deletion of processes that have
terminated (due to calling exit
or to a signal). If it is
nil
, then they continue to exist until the user runs
list-processes
. Otherwise, they are deleted immediately after
they exit.
This function deletes a process, killing it with a SIGKILL
signal. The argument may be a process, the name of a process, a
buffer, or the name of a buffer. (A buffer or buffer-name stands for
the process that get-buffer-process
returns.) Calling
delete-process
on a running process terminates it, updates the
process status, and runs the sentinel immediately. If the
process has already terminated, calling delete-process
has no
effect on its status, or on the running of its sentinel (which will
happen sooner or later).
(delete-process "*shell*") ⇒ nil
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Several functions return information about processes.
This command displays a listing of all living processes. In addition,
it finally deletes any process whose status was ‘Exited’ or
‘Signaled’. It returns nil
.
The processes are shown in a buffer named *Process List* (unless you specify otherwise using the optional argument buffer), whose major mode is Process Menu mode.
If query-only is non-nil
, it only lists processes
whose query flag is non-nil
. See section Querying Before Exit.
This function returns a list of all processes that have not been deleted.
(process-list) ⇒ (#<process display-time> #<process shell>)
This function returns the process named name (a string), or
nil
if there is none.
(get-process "shell") ⇒ #<process shell>
This function returns the command that was executed to start process. This is a list of strings, the first string being the program executed and the rest of the strings being the arguments that were given to the program.
(process-command (get-process "shell")) ⇒ ("bash" "-i")
This function returns information about how a network or serial
process was set up. When key is nil
, it returns
(hostname service)
for a network process, and
(port speed)
for a serial process.
For an ordinary child process, this function always returns t
.
If key is t
, the value is the complete status information
for the connection, server, or serial port; that is, the list of
keywords and values specified in make-network-process
or
make-serial-process
, except that some of the values represent
the current status instead of what you specified.
For a network process, the values include (see
make-network-process
for a complete list):
:buffer
The associated value is the process buffer.
:filter
The associated value is the process filter function.
:sentinel
The associated value is the process sentinel function.
:remote
In a connection, the address in internal format of the remote peer.
:local
The local address, in internal format.
:service
In a server, if you specified t
for service,
this value is the actual port number.
:local
and :remote
are included even if they were not
specified explicitly in make-network-process
.
For a serial process, see make-serial-process
and
serial-process-configure
for a list of keys.
If key is a keyword, the function returns the value corresponding to that keyword.
This function returns the PID of process. This is an integer that distinguishes the process process from all other processes running on the same computer at the current time. The PID of a process is chosen by the operating system kernel when the process is started and remains constant as long as the process exists.
This function returns the name of process, as a string.
This function returns the status of process-name as a symbol. The argument process-name must be a process, a buffer, or a process name (a string).
The possible values for an actual subprocess are:
run
for a process that is running.
stop
for a process that is stopped but continuable.
exit
for a process that has exited.
signal
for a process that has received a fatal signal.
open
for a network connection that is open.
closed
for a network connection that is closed. Once a connection is closed, you cannot reopen it, though you might be able to open a new connection to the same place.
connect
for a non-blocking connection that is waiting to complete.
failed
for a non-blocking connection that has failed to complete.
listen
for a network server that is listening.
nil
if process-name is not the name of an existing process.
(process-status (get-buffer "*shell*")) ⇒ run
For a network connection, process-status
returns one of the symbols
open
or closed
. The latter means that the other side
closed the connection, or Emacs did delete-process
.
This function returns non-nil
if process is alive. A
process is considered alive if its status is run
, open
,
listen
, connect
or stop
.
This function returns the symbol network
for a network
connection or server, serial
for a serial port connection, or
real
for a real subprocess.
This function returns the exit status of process or the signal
number that killed it. (Use the result of process-status
to
determine which of those it is.) If process has not yet
terminated, the value is 0.
This function returns the terminal name that process is using for
its communication with Emacs—or nil
if it is using pipes
instead of a terminal (see process-connection-type
in
Creating an Asynchronous Process). If process represents a program
running on a remote host, the terminal name used by that program on
the remote host is provided as process property remote-tty
.
This function returns a cons cell (decode . encode)
,
describing the coding systems in use for decoding output from, and
encoding input to, process (see section Coding Systems).
This function specifies the coding systems to use for subsequent output from and input to process. It will use decoding-system to decode subprocess output, and encoding-system to encode subprocess input.
Every process also has a property list that you can use to store miscellaneous values associated with the process.
This function returns the value of the propname property of process.
This function sets the value of the propname property of process to value.
This function returns the process plist of process.
This function sets the process plist of process to plist.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Asynchronous subprocesses receive input when it is sent to them by Emacs, which is done with the functions in this section. You must specify the process to send input to, and the input data to send. The data appears on the “standard input” of the subprocess.
Some operating systems have limited space for buffered input in a pty. On these systems, Emacs sends an EOF periodically amidst the other characters, to force them through. For most programs, these EOFs do no harm.
Subprocess input is normally encoded using a coding system before the
subprocess receives it, much like text written into a file. You can use
set-process-coding-system
to specify which coding system to use
(see section Process Information). Otherwise, the coding system comes from
coding-system-for-write
, if that is non-nil
; or else from
the defaulting mechanism (see section Default Coding Systems).
Sometimes the system is unable to accept input for that process, because the input buffer is full. When this happens, the send functions wait a short while, accepting output from subprocesses, and then try again. This gives the subprocess a chance to read more of its pending input and make space in the buffer. It also allows filters, sentinels and timers to run—so take account of that in writing your code.
In these functions, the process argument can be a process or
the name of a process, or a buffer or buffer name (which stands
for a process via get-buffer-process
). nil
means
the current buffer’s process.
This function sends process the contents of string as
standard input. It returns nil
. For example, to make a
Shell buffer list files:
(process-send-string "shell<1>" "ls\n") ⇒ nil
This function sends the text in the region defined by start and end as standard input to process.
An error is signaled unless both start and end are integers or markers that indicate positions in the current buffer. (It is unimportant which number is larger.)
This function makes process see an end-of-file in its input. The EOF comes after any text already sent to it. The function returns process.
(process-send-eof "shell") ⇒ "shell"
This function will tell you whether a process has given control of
its terminal to its own child process. The value is t
if this is
true, or if Emacs cannot tell; it is nil
if Emacs can be certain
that this is not so.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sending a signal to a subprocess is a way of interrupting its
activities. There are several different signals, each with its own
meaning. The set of signals and their names is defined by the operating
system. For example, the signal SIGINT
means that the user has
typed C-c, or that some analogous thing has happened.
Each signal has a standard effect on the subprocess. Most signals kill the subprocess, but some stop (or resume) execution instead. Most signals can optionally be handled by programs; if the program handles the signal, then we can say nothing in general about its effects.
You can send signals explicitly by calling the functions in this
section. Emacs also sends signals automatically at certain times:
killing a buffer sends a SIGHUP
signal to all its associated
processes; killing Emacs sends a SIGHUP
signal to all remaining
processes. (SIGHUP
is a signal that usually indicates that the
user “hung up the phone”, i.e., disconnected.)
Each of the signal-sending functions takes two optional arguments: process and current-group.
The argument process must be either a process, a process
name, a buffer, a buffer name, or nil
. A buffer or buffer name
stands for a process through get-buffer-process
. nil
stands for the process associated with the current buffer. An error
is signaled if process does not identify a process.
The argument current-group is a flag that makes a difference
when you are running a job-control shell as an Emacs subprocess. If it
is non-nil
, then the signal is sent to the current process-group
of the terminal that Emacs uses to communicate with the subprocess. If
the process is a job-control shell, this means the shell’s current
subjob. If it is nil
, the signal is sent to the process group of
the immediate subprocess of Emacs. If the subprocess is a job-control
shell, this is the shell itself.
The flag current-group has no effect when a pipe is used to
communicate with the subprocess, because the operating system does not
support the distinction in the case of pipes. For the same reason,
job-control shells won’t work when a pipe is used. See
process-connection-type
in Creating an Asynchronous Process.
This function interrupts the process process by sending the
signal SIGINT
. Outside of Emacs, typing the “interrupt
character” (normally C-c on some systems, and DEL on
others) sends this signal. When the argument current-group is
non-nil
, you can think of this function as “typing C-c”
on the terminal by which Emacs talks to the subprocess.
This function kills the process process by sending the
signal SIGKILL
. This signal kills the subprocess immediately,
and cannot be handled by the subprocess.
This function sends the signal SIGQUIT
to the process
process. This signal is the one sent by the “quit
character” (usually C-b or C-\) when you are not inside
Emacs.
This function stops the process process by sending the
signal SIGTSTP
. Use continue-process
to resume its
execution.
Outside of Emacs, on systems with job control, the “stop character”
(usually C-z) normally sends this signal. When
current-group is non-nil
, you can think of this function as
“typing C-z” on the terminal Emacs uses to communicate with the
subprocess.
This function resumes execution of the process process by sending
it the signal SIGCONT
. This presumes that process was
stopped previously.
This function sends a signal to process process. The argument signal specifies which signal to send; it should be an integer, or a symbol whose name is a signal.
The process argument can be a system process ID (an integer); that allows you to send signals to processes that are not children of Emacs. See section Accessing Other Processes.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The output that a subprocess writes to its standard output stream is passed to a function called the filter function. The default filter function simply inserts the output into a buffer, which is called the associated buffer of the process (see section Process Buffers). If the process has no buffer then the default filter discards the output.
When a subprocess terminates, Emacs reads any pending output, then stops reading output from that subprocess. Therefore, if the subprocess has children that are still live and still producing output, Emacs won’t receive that output.
Output from a subprocess can arrive only while Emacs is waiting: when
reading terminal input (see the function waiting-for-user-input-p
),
in sit-for
and sleep-for
(see section Waiting for Elapsed Time or Input), and in
accept-process-output
(see section Accepting Output from Processes). This
minimizes the problem of timing errors that usually plague parallel
programming. For example, you can safely create a process and only
then specify its buffer or filter function; no output can arrive
before you finish, if the code in between does not call any primitive
that waits.
On some systems, when Emacs reads the output from a subprocess, the
output data is read in very small blocks, potentially resulting in
very poor performance. This behavior can be remedied to some extent
by setting the variable process-adaptive-read-buffering
to a
non-nil
value (the default), as it will automatically delay reading
from such processes, thus allowing them to produce more output before
Emacs tries to read it.
It is impossible to separate the standard output and standard error streams of the subprocess, because Emacs normally spawns the subprocess inside a pseudo-TTY, and a pseudo-TTY has only one output channel. If you want to keep the output to those streams separate, you should redirect one of them to a file—for example, by using an appropriate shell command.
36.9.1 Process Buffers | By default, output is put in a buffer. | |
36.9.2 Process Filter Functions | Filter functions accept output from the process. | |
36.9.3 Decoding Process Output | Filters can get unibyte or multibyte strings. | |
36.9.4 Accepting Output from Processes | How to wait until process output arrives. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A process can (and usually does) have an associated buffer, which is an ordinary Emacs buffer that is used for two purposes: storing the output from the process, and deciding when to kill the process. You can also use the buffer to identify a process to operate on, since in normal practice only one process is associated with any given buffer. Many applications of processes also use the buffer for editing input to be sent to the process, but this is not built into Emacs Lisp.
By default, process output is inserted in the associated buffer.
(You can change this by defining a custom filter function,
see section Process Filter Functions.) The position to insert the output is
determined by the process-mark
, which is then updated to point
to the end of the text just inserted. Usually, but not always, the
process-mark
is at the end of the buffer.
Killing the associated buffer of a process also kills the process.
Emacs asks for confirmation first, if the process’s
process-query-on-exit-flag
is non-nil
(see section Querying Before Exit). This confirmation is done by the function
process-kill-buffer-query-function
, which is run from
kill-buffer-query-functions
(see section Killing Buffers).
This function returns the associated buffer of the process process.
(process-buffer (get-process "shell")) ⇒ #<buffer *shell*>
This function returns the process marker for process, which is the marker that says where to insert output from the process.
If process does not have a buffer, process-mark
returns a
marker that points nowhere.
The default filter function uses this marker to decide where to insert process output, and updates it to point after the inserted text. That is why successive batches of output are inserted consecutively.
Custom filter functions normally should use this marker in the same fashion.
For an example of a filter function that uses process-mark
,
see Process Filter Example.
When the user is expected to enter input in the process buffer for transmission to the process, the process marker separates the new input from previous output.
This function sets the buffer associated with process to
buffer. If buffer is nil
, the process becomes
associated with no buffer.
This function returns a nondeleted process associated with the buffer
specified by buffer-or-name. If there are several processes
associated with it, this function chooses one (currently, the one most
recently created, but don’t count on that). Deletion of a process
(see delete-process
) makes it ineligible for this function to
return.
It is usually a bad idea to have more than one process associated with the same buffer.
(get-buffer-process "*shell*") ⇒ #<process shell>
Killing the process’s buffer deletes the process, which kills the
subprocess with a SIGHUP
signal (see section Sending Signals to Processes).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A process filter function is a function that receives the standard output from the associated process. All output from that process is passed to the filter. The default filter simply outputs directly to the process buffer.
The filter function can only be called when Emacs is waiting for
something, because process output arrives only at such times. Emacs
waits when reading terminal input (see the function
waiting-for-user-input-p
), in sit-for
and
sleep-for
(see section Waiting for Elapsed Time or Input), and in
accept-process-output
(see section Accepting Output from Processes).
A filter function must accept two arguments: the associated process and a string, which is output just received from it. The function is then free to do whatever it chooses with the output.
Quitting is normally inhibited within a filter function—otherwise,
the effect of typing C-g at command level or to quit a user
command would be unpredictable. If you want to permit quitting inside
a filter function, bind inhibit-quit
to nil
. In most
cases, the right way to do this is with the macro
with-local-quit
. See section Quitting.
If an error happens during execution of a filter function, it is
caught automatically, so that it doesn’t stop the execution of whatever
program was running when the filter function was started. However, if
debug-on-error
is non-nil
, errors are not caught.
This makes it possible to use the Lisp debugger to debug the
filter function. See section The Lisp Debugger.
Many filter functions sometimes (or always) insert the output in the process’s buffer, mimicking the actions of the default filter. Such filter functions need to make sure that they save the current buffer, select the correct buffer (if different) before inserting output, and then restore the original buffer. They should also check whether the buffer is still alive, update the process marker, and in some cases update the value of point. Here is how to do these things:
(defun ordinary-insertion-filter (proc string) (when (buffer-live-p (process-buffer proc)) (with-current-buffer (process-buffer proc) (let ((moving (= (point) (process-mark proc))))
(save-excursion
;; Insert the text, advancing the process marker.
(goto-char (process-mark proc))
(insert string)
(set-marker (process-mark proc) (point)))
(if moving (goto-char (process-mark proc)))))))
To make the filter force the process buffer to be visible whenever new
text arrives, you could insert a line like the following just before the
with-current-buffer
construct:
(display-buffer (process-buffer proc))
To force point to the end of the new output, no matter where it was
previously, eliminate the variable moving
and call
goto-char
unconditionally.
Note that Emacs automatically saves and restores the match data while executing filter functions. See section The Match Data.
The output to the filter may come in chunks of any size. A program that produces the same output twice in a row may send it as one batch of 200 characters one time, and five batches of 40 characters the next. If the filter looks for certain text strings in the subprocess output, make sure to handle the case where one of these strings is split across two or more batches of output; one way to do this is to insert the received text into a temporary buffer, which can then be searched.
This function gives process the filter function filter. If
filter is nil
, it gives the process the default filter,
which inserts the process output into the process buffer.
This function returns the filter function of process.
In case the process’s output needs to be passed to several filters, you can
use add-function
to combine an existing filter with a new one.
See section Advising Emacs Lisp Functions.
Here is an example of the use of a filter function:
(defun keep-output (process output) (setq kept (cons output kept))) ⇒ keep-output
(setq kept nil) ⇒ nil
(set-process-filter (get-process "shell") 'keep-output) ⇒ keep-output
(process-send-string "shell" "ls ~/other\n") ⇒ nil kept ⇒ ("lewis@slug:$ "
"FINAL-W87-SHORT.MSS backup.otl kolstad.mss~ address.txt backup.psf kolstad.psf backup.bib~ david.mss resume-Dec-86.mss~ backup.err david.psf resume-Dec.psf backup.mss dland syllabus.mss " "#backups.mss# backup.mss~ kolstad.mss ")
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs writes process output directly into a multibyte buffer,
it decodes the output according to the process output coding system.
If the coding system is raw-text
or no-conversion
, Emacs
converts the unibyte output to multibyte using
string-to-multibyte
, and inserts the resulting multibyte text.
You can use set-process-coding-system
to specify which coding
system to use (see section Process Information). Otherwise, the coding
system comes from coding-system-for-read
, if that is
non-nil
; or else from the defaulting mechanism (see section Default Coding Systems). If the text output by a process contains null
bytes, Emacs by default uses no-conversion
for it; see
inhibit-null-byte-detection, for how to
control this behavior.
Warning: Coding systems such as undecided
, which
determine the coding system from the data, do not work entirely
reliably with asynchronous subprocess output. This is because Emacs
has to process asynchronous subprocess output in batches, as it
arrives. Emacs must try to detect the proper coding system from one
batch at a time, and this does not always work. Therefore, if at all
possible, specify a coding system that determines both the character
code conversion and the end of line conversion—that is, one like
latin-1-unix
, rather than undecided
or latin-1
.
When Emacs calls a process filter function, it provides the process
output as a multibyte string or as a unibyte string according to the
process’s filter coding system. Emacs
decodes the output according to the process output coding system,
which usually produces a multibyte string, except for coding systems
such as binary
and raw-text
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Output from asynchronous subprocesses normally arrives only while Emacs is waiting for some sort of external event, such as elapsed time or terminal input. Occasionally it is useful in a Lisp program to explicitly permit output to arrive at a specific point, or even to wait until output arrives from a process.
This function allows Emacs to read pending output from processes. The
output is given to their filter functions. If process is
non-nil
then this function does not return until some output
has been received from process.
The arguments seconds and millisec let you specify timeout
periods. The former specifies a period measured in seconds and the
latter specifies one measured in milliseconds. The two time periods
thus specified are added together, and accept-process-output
returns after that much time, whether or not there has been any
subprocess output.
The argument millisec is obsolete (and should not be used), because seconds can be floating point to specify waiting a fractional number of seconds. If seconds is 0, the function accepts whatever output is pending but does not wait.
If process is a process, and the argument just-this-one is
non-nil
, only output from that process is handled, suspending output
from other processes until some output has been received from that
process or the timeout expires. If just-this-one is an integer,
also inhibit running timers. This feature is generally not
recommended, but may be necessary for specific applications, such as
speech synthesis.
The function accept-process-output
returns non-nil
if it
did get some output, or nil
if the timeout expired before output
arrived.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A process sentinel is a function that is called whenever the associated process changes status for any reason, including signals (whether sent by Emacs or caused by the process’s own actions) that terminate, stop, or continue the process. The process sentinel is also called if the process exits. The sentinel receives two arguments: the process for which the event occurred, and a string describing the type of event.
The string describing the event looks like one of the following:
"finished\n"
.
"exited abnormally with code exitcode\n"
.
"name-of-signal\n"
.
"name-of-signal (core dumped)\n"
.
A sentinel runs only while Emacs is waiting (e.g., for terminal
input, or for time to elapse, or for process output). This avoids the
timing errors that could result from running sentinels at random places in
the middle of other Lisp programs. A program can wait, so that
sentinels will run, by calling sit-for
or sleep-for
(see section Waiting for Elapsed Time or Input), or accept-process-output
(see section Accepting Output from Processes). Emacs also allows sentinels to run when the command loop is
reading input. delete-process
calls the sentinel when it
terminates a running process.
Emacs does not keep a queue of multiple reasons to call the sentinel of one process; it records just the current status and the fact that there has been a change. Therefore two changes in status, coming in quick succession, can call the sentinel just once. However, process termination will always run the sentinel exactly once. This is because the process status can’t change again after termination.
Emacs explicitly checks for output from the process before running the process sentinel. Once the sentinel runs due to process termination, no further output can arrive from the process.
A sentinel that writes the output into the buffer of the process
should check whether the buffer is still alive. If it tries to insert
into a dead buffer, it will get an error. If the buffer is dead,
(buffer-name (process-buffer process))
returns nil
.
Quitting is normally inhibited within a sentinel—otherwise, the
effect of typing C-g at command level or to quit a user command
would be unpredictable. If you want to permit quitting inside a
sentinel, bind inhibit-quit
to nil
. In most cases, the
right way to do this is with the macro with-local-quit
.
See section Quitting.
If an error happens during execution of a sentinel, it is caught
automatically, so that it doesn’t stop the execution of whatever
programs was running when the sentinel was started. However, if
debug-on-error
is non-nil
, errors are not caught.
This makes it possible to use the Lisp debugger to debug the
sentinel. See section The Lisp Debugger.
While a sentinel is running, the process sentinel is temporarily
set to nil
so that the sentinel won’t run recursively.
For this reason it is not possible for a sentinel to specify
a new sentinel.
Note that Emacs automatically saves and restores the match data while executing sentinels. See section The Match Data.
This function associates sentinel with process. If
sentinel is nil
, then the process will have the default
sentinel, which inserts a message in the process’s buffer when the
process status changes.
Changes in process sentinels take effect immediately—if the sentinel is slated to be run but has not been called yet, and you specify a new sentinel, the eventual call to the sentinel will use the new one.
(defun msg-me (process event) (princ (format "Process: %s had the event `%s'" process event))) (set-process-sentinel (get-process "shell") 'msg-me) ⇒ msg-me
(kill-process (get-process "shell")) -| Process: #<process shell> had the event `killed' ⇒ #<process shell>
This function returns the sentinel of process.
In case a process status changes need to be passed to several sentinels, you
can use add-function
to combine an existing sentinel with a new one.
See section Advising Emacs Lisp Functions.
While a sentinel or filter function is running, this function returns
non-nil
if Emacs was waiting for keyboard input from the user at
the time the sentinel or filter function was called, or nil
if it
was not.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs exits, it terminates all its subprocesses by sending them
the SIGHUP
signal. Because subprocesses may be doing
valuable work, Emacs normally asks the user to confirm that it is ok
to terminate them. Each process has a query flag, which, if
non-nil
, says that Emacs should ask for confirmation before
exiting and thus killing that process. The default for the query flag
is t
, meaning do query.
This returns the query flag of process.
This function sets the query flag of process to flag. It returns flag.
Here is an example of using set-process-query-on-exit-flag
on a
shell process to avoid querying:
(set-process-query-on-exit-flag (get-process "shell") nil) ⇒ nil
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In addition to accessing and manipulating processes that are subprocesses of the current Emacs session, Emacs Lisp programs can also access other processes running on the same machine. We call these system processes, to distinguish them from Emacs subprocesses.
Emacs provides several primitives for accessing system processes.
Not all platforms support these primitives; on those which don’t,
these primitives return nil
.
This function returns a list of all the processes running on the system. Each process is identified by its PID, a numerical process ID that is assigned by the OS and distinguishes the process from all the other processes running on the same machine at the same time.
This function returns an alist of attributes for the process specified
by its process ID pid. Each association in the alist is of the
form (key . value)
, where key designates the
attribute and value is the value of that attribute. The various
attribute keys that this function can return are listed below.
Not all platforms support all of these attributes; if an attribute is
not supported, its association will not appear in the returned alist.
Values that are numbers can be either integer or floating point,
depending on the magnitude of the value.
euid
The effective user ID of the user who invoked the process. The
corresponding value is a number. If the process was invoked by
the same user who runs the current Emacs session, the value is
identical to what user-uid
returns (see section User Identification).
user
User name corresponding to the process’s effective user ID, a string.
egid
The group ID of the effective user ID, a number.
group
Group name corresponding to the effective user’s group ID, a string.
comm
The name of the command that runs in the process. This is a string that usually specifies the name of the executable file of the process, without the leading directories. However, some special system processes can report strings that do not correspond to an executable file of a program.
state
The state code of the process. This is a short string that encodes the scheduling state of the process. Here’s a list of the most frequently seen codes:
"D"
uninterruptible sleep (usually I/O)
"R"
running
"S"
interruptible sleep (waiting for some event)
"T"
stopped, e.g., by a job control signal
"Z"
“zombie”: a process that terminated, but was not reaped by its parent
For the full list of the possible states, see the manual page of the
ps
command.
ppid
The process ID of the parent process, a number.
pgrp
The process group ID of the process, a number.
sess
The session ID of the process. This is a number that is the process ID of the process’s session leader.
ttname
A string that is the name of the process’s controlling terminal. On Unix and GNU systems, this is normally the file name of the corresponding terminal device, such as /dev/pts65.
tpgid
The numerical process group ID of the foreground process group that uses the process’s terminal.
minflt
The number of minor page faults caused by the process since its beginning. (Minor page faults are those that don’t involve reading from disk.)
majflt
The number of major page faults caused by the process since its beginning. (Major page faults require a disk to be read, and are thus more expensive than minor page faults.)
cminflt
cmajflt
Like minflt
and majflt
, but include the number of page
faults for all the child processes of the given process.
utime
Time spent by the process in the user context, for running the
application’s code. The corresponding value is in the
(high low microsec picosec)
format, the same
format used by functions current-time
(see section current-time) and file-attributes
(see section File Attributes).
stime
Time spent by the process in the system (kernel) context, for
processing system calls. The corresponding value is in the same
format as for utime
.
time
The sum of utime
and stime
. The corresponding
value is in the same format as for utime
.
cutime
cstime
ctime
Like utime
, stime
, and time
, but include the
times of all the child processes of the given process.
pri
The numerical priority of the process.
nice
The nice value of the process, a number. (Processes with smaller nice values get scheduled more favorably.)
thcount
The number of threads in the process.
start
The time when the process was started, in the same
(high low microsec picosec)
format used by
file-attributes
and current-time
.
etime
The time elapsed since the process started, in the format (high
low microsec picosec)
.
vsize
The virtual memory size of the process, measured in kilobytes.
rss
The size of the process’s resident set, the number of kilobytes occupied by the process in the machine’s physical memory.
pcpu
The percentage of the CPU time used by the process since it started. The corresponding value is a floating-point number between 0 and 100.
pmem
The percentage of the total physical memory installed on the machine used by the process’s resident set. The value is a floating-point number between 0 and 100.
args
The command-line with which the process was invoked. This is a string
in which individual command-line arguments are separated by blanks;
whitespace characters that are embedded in the arguments are quoted as
appropriate for the system’s shell: escaped by backslash characters on
GNU and Unix, and enclosed in double quote characters on Windows.
Thus, this command-line string can be directly used in primitives such
as shell-command
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use a transaction queue to communicate with a subprocess
using transactions. First use tq-create
to create a transaction
queue communicating with a specified process. Then you can call
tq-enqueue
to send a transaction.
This function creates and returns a transaction queue communicating with process. The argument process should be a subprocess capable of sending and receiving streams of bytes. It may be a child process, or it may be a TCP connection to a server, possibly on another machine.
This function sends a transaction to queue queue. Specifying the queue has the effect of specifying the subprocess to talk to.
The argument question is the outgoing message that starts the transaction. The argument fn is the function to call when the corresponding answer comes back; it is called with two arguments: closure, and the answer received.
The argument regexp is a regular expression that should match
text at the end of the entire answer, but nothing before; that’s how
tq-enqueue
determines where the answer ends.
If the argument delay-question is non-nil
, delay sending
this question until the process has finished replying to any previous
questions. This produces more reliable results with some processes.
Shut down transaction queue queue, waiting for all pending transactions to complete, and then terminate the connection or child process.
Transaction queues are implemented by means of a filter function. See section Process Filter Functions.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lisp programs can open stream (TCP) and datagram (UDP) network
connections (see section Datagrams) to other processes on the same machine
or other machines.
A network connection is handled by Lisp much like a subprocess, and is
represented by a process object. However, the process you are
communicating with is not a child of the Emacs process, has no
process ID, and you can’t kill it or send it signals. All you
can do is send and receive data. delete-process
closes the
connection, but does not kill the program at the other end; that
program must decide what to do about closure of the connection.
Lisp programs can listen for connections by creating network servers. A network server is also represented by a kind of process object, but unlike a network connection, the network server never transfers data itself. When it receives a connection request, it creates a new network connection to represent the connection just made. (The network connection inherits certain information, including the process plist, from the server.) The network server then goes back to listening for more connection requests.
Network connections and servers are created by calling
make-network-process
with an argument list consisting of
keyword/argument pairs, for example :server t
to create a
server process, or :type 'datagram
to create a datagram
connection. See section Low-Level Network Access, for details. You can also use
the open-network-stream
function described below.
To distinguish the different types of processes, the
process-type
function returns the symbol network
for a
network connection or server, serial
for a serial port
connection, or real
for a real subprocess.
The process-status
function returns open
,
closed
, connect
, or failed
for network
connections. For a network server, the status is always
listen
. None of those values is possible for a real
subprocess. See section Process Information.
You can stop and resume operation of a network process by calling
stop-process
and continue-process
. For a server
process, being stopped means not accepting new connections. (Up to 5
connection requests will be queued for when you resume the server; you
can increase this limit, unless it is imposed by the operating
system—see the :server
keyword of make-network-process
,
make-network-process
.) For a network stream connection, being
stopped means not processing input (any arriving input waits until you
resume the connection). For a datagram connection, some number of
packets may be queued but input may be lost. You can use the function
process-command
to determine whether a network connection or
server is stopped; a non-nil
value means yes.
Emacs can create encrypted network connections, using either built-in
or external support. The built-in support uses the GnuTLS
(“Transport Layer Security”) library; see
the GnuTLS project page.
If your Emacs was compiled with GnuTLS support, the function
gnutls-available-p
is defined and returns non-nil
. For
more details, see Overview in The Emacs-GnuTLS manual.
The external support uses the starttls.el library, which
requires a helper utility such as gnutls-cli
to be installed
on the system. The open-network-stream
function can
transparently handle the details of creating encrypted connections for
you, using whatever support is available.
This function opens a TCP connection, with optional encryption, and returns a process object that represents the connection.
The name argument specifies the name for the process object. It is modified as necessary to make it unique.
The buffer argument is the buffer to associate with the
connection. Output from the connection is inserted in the buffer,
unless you specify your own filter function to handle the output. If
buffer is nil
, it means that the connection is not
associated with any buffer.
The arguments host and service specify where to connect to; host is the host name (a string), and service is the name of a defined network service (a string) or a port number (an integer).
The remaining arguments parameters are keyword/argument pairs that are mainly relevant to encrypted connections:
:nowait boolean
If non-nil
, try to make an asynchronous connection.
:type type
The type of connection. Options are:
plain
An ordinary, unencrypted connection.
tls
ssl
A TLS (“Transport Layer Security”) connection.
nil
network
Start with a plain connection, and if parameters ‘:success’ and ‘:capability-command’ are supplied, try to upgrade to an encrypted connection via STARTTLS. If that fails, retain the unencrypted connection.
starttls
As for nil
, but if STARTTLS fails drop the connection.
shell
A shell connection.
:always-query-capabilities boolean
If non-nil
, always ask for the server’s capabilities, even when
doing a ‘plain’ connection.
:capability-command capability-command
Command string to query the host capabilities.
:end-of-command regexp
:end-of-capability regexp
Regular expression matching the end of a command, or the end of the command capability-command. The latter defaults to the former.
:starttls-function function
Function of one argument (the response to capability-command),
which returns either nil
, or the command to activate STARTTLS
if supported.
:success regexp
Regular expression matching a successful STARTTLS negotiation.
:use-starttls-if-possible boolean
If non-nil
, do opportunistic STARTTLS upgrades even if Emacs
doesn’t have built-in TLS support.
:client-certificate list-or-t
Either a list of the form (key-file cert-file)
,
naming the certificate key file and certificate file itself, or
t
, meaning to query auth-source
for this information
(see Overview in The Auth-Source Manual).
Only used for TLS or STARTTLS.
:return-list cons-or-nil
The return value of this function. If omitted or nil
, return a
process object. Otherwise, a cons of the form (process-object
. plist)
, where plist has keywords:
:greeting string-or-nil
If non-nil
, the greeting string returned by the host.
:capabilities string-or-nil
If non-nil
, the host’s capability string.
:type symbol
The connection type: ‘plain’ or ‘tls’.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You create a server by calling make-network-process
(see section make-network-process
) with :server t
. The server will
listen for connection requests from clients. When it accepts a client
connection request, that creates a new network connection, itself a
process object, with the following parameters:
The server’s process buffer value is never used directly, but the log function can retrieve it and use it to log connections by inserting text there.
process-contact
keywords :host
, :service
, :remote
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A datagram connection communicates with individual packets rather
than streams of data. Each call to process-send
sends one
datagram packet (see section Sending Input to Processes), and each datagram
received results in one call to the filter function.
The datagram connection doesn’t have to talk with the same remote
peer all the time. It has a remote peer address which specifies
where to send datagrams to. Each time an incoming datagram is passed
to the filter function, the peer address is set to the address that
datagram came from; that way, if the filter function sends a datagram,
it will go back to that place. You can specify the remote peer
address when you create the datagram connection using the
:remote
keyword. You can change it later on by calling
set-process-datagram-address
.
If process is a datagram connection or server, this function returns its remote peer address.
If process is a datagram connection or server, this function sets its remote peer address to address.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can also create network connections by operating at a lower
level than that of open-network-stream
, using
make-network-process
.
36.17.1 make-network-process | Using make-network-process .
| |
36.17.2 Network Options | Further control over network connections. | |
36.17.3 Testing Availability of Network Features | Determining which network features work on the machine you are using. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
make-network-process
The basic function for creating network connections and network
servers is make-network-process
. It can do either of those
jobs, depending on the arguments you give it.
This function creates a network connection or server and returns the
process object that represents it. The arguments args are a
list of keyword/argument pairs. Omitting a keyword is always
equivalent to specifying it with value nil
, except for
:coding
, :filter-multibyte
, and :reuseaddr
. Here
are the meaningful keywords (those corresponding to network options
are listed in the following section):
Use the string name as the process name. It is modified if necessary to make it unique.
Specify the communication type. A value of nil
specifies a
stream connection (the default); datagram
specifies a datagram
connection; seqpacket
specifies a “sequenced packet stream”
connection. Both connections and servers can be of these types.
If server-flag is non-nil
, create a server. Otherwise,
create a connection. For a stream type server, server-flag may
be an integer, which then specifies the length of the queue of pending
connections to the server. The default queue length is 5.
Specify the host to connect to. host should be a host name or
Internet address, as a string, or the symbol local
to specify
the local host. If you specify host for a server, it must
specify a valid address for the local host, and only clients
connecting to that address will be accepted.
service specifies a port number to connect to; or, for a server,
the port number to listen on. It should be a service name that
translates to a port number, or an integer specifying the port number
directly. For a server, it can also be t
, which means to let
the system select an unused port number.
family specifies the address (and protocol) family for
communication. nil
means determine the proper address family
automatically for the given host and service.
local
specifies a Unix socket, in which case host is
ignored. ipv4
and ipv6
specify to use IPv4 and IPv6,
respectively.
For a server process, local-address is the address to listen on. It overrides family, host and service, so you might as well not specify them.
For a connection, remote-address is the address to connect to. It overrides family, host and service, so you might as well not specify them.
For a datagram server, remote-address specifies the initial setting of the remote datagram address.
The format of local-address or remote-address depends on the address family:
[a b c d p]
corresponding to
numeric IPv4 address a.b.c.d and port number
p.
[a b c d e f
g h p]
corresponding to numeric IPv6 address
a:b:c:d:e:f:g:h and
port number p.
(f . av)
, where f is the family number and
av is a vector specifying the socket address using one element
per address data byte. Do not rely on this format in portable code,
as it may depend on implementation defined constants, data sizes, and
data structure alignment.
If bool is non-nil
for a stream connection, return
without waiting for the connection to complete. When the connection
succeeds or fails, Emacs will call the sentinel function, with a
second argument matching "open"
(if successful) or
"failed"
. The default is to block, so that
make-network-process
does not return until the connection
has succeeded or failed.
If stopped is non-nil
, start the network connection or
server in the “stopped” state.
Use buffer as the process buffer.
Use coding as the coding system for this process. To specify
different coding systems for decoding data from the connection and for
encoding data sent to it, specify (decoding .
encoding)
for coding.
If you don’t specify this keyword at all, the default is to determine the coding systems from the data.
Initialize the process query flag to query-flag. See section Querying Before Exit.
Initialize the process filter to filter.
If multibyte is non-nil
, strings given to the process
filter are multibyte, otherwise they are unibyte. The default is the
default value of enable-multibyte-characters
.
Initialize the process sentinel to sentinel.
Initialize the log function of a server process to log. The log function is called each time the server accepts a network connection from a client. The arguments passed to the log function are server, connection, and message; where server is the server process, connection is the new process for the connection, and message is a string describing what has happened.
Initialize the process plist to plist.
The original argument list, modified with the actual connection
information, is available via the process-contact
function.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following network options can be specified when you create a
network process. Except for :reuseaddr
, you can also set or
modify these options later, using set-network-process-option
.
For a server process, the options specified with
make-network-process
are not inherited by the client
connections, so you will need to set the necessary options for each
child connection as it is created.
If device-name is a non-empty string identifying a network
interface name (see network-interface-list
), only handle
packets received on that interface. If device-name is nil
(the default), handle packets received on any interface.
Using this option may require special privileges on some systems.
If broadcast-flag is non-nil
for a datagram process, the
process will receive datagram packet sent to a broadcast address, and
be able to send packets to a broadcast address. This is ignored for a stream
connection.
If dontroute-flag is non-nil
, the process can only send
to hosts on the same network as the local host.
If keepalive-flag is non-nil
for a stream connection,
enable exchange of low-level keep-alive messages.
If linger-arg is non-nil
, wait for successful
transmission of all queued packets on the connection before it is
deleted (see delete-process
). If linger-arg is an
integer, it specifies the maximum time in seconds to wait for queued
packets to be sent before closing the connection. The default is
nil
, which means to discard unsent queued packets when the
process is deleted.
If oobinline-flag is non-nil
for a stream connection,
receive out-of-band data in the normal data stream. Otherwise, ignore
out-of-band data.
Set the priority for packets sent on this connection to the integer priority. The interpretation of this number is protocol specific; such as setting the TOS (type of service) field on IP packets sent on this connection. It may also have system dependent effects, such as selecting a specific output queue on the network interface.
If reuseaddr-flag is non-nil
(the default) for a stream
server process, allow this server to reuse a specific port number (see
:service
), unless another process on this host is already
listening on that port. If reuseaddr-flag is nil
, there
may be a period of time after the last use of that port (by any
process on the host) where it is not possible to make a new server on
that port.
This function sets or modifies a network option for network process
process. The accepted options and values are as for
make-network-process
. If no-error is non-nil
,
this function returns nil
instead of signaling an error if
option is not a supported option. If the function successfully
completes, it returns t
.
The current setting of an option is available via the
process-contact
function.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To test for the availability of a given network feature, use
featurep
like this:
(featurep 'make-network-process '(keyword value))
The result of this form is t
if it works to specify
keyword with value value in make-network-process
.
Here are some of the keyword—value pairs you can test in
this way.
(:nowait t)
Non-nil
if non-blocking connect is supported.
(:type datagram)
Non-nil
if datagrams are supported.
(:family local)
Non-nil
if local (a.k.a. “UNIX domain”) sockets are supported.
(:family ipv6)
Non-nil
if IPv6 is supported.
(:service t)
Non-nil
if the system can select the port for a server.
To test for the availability of a given network option, use
featurep
like this:
(featurep 'make-network-process 'keyword)
The accepted keyword values are :bindtodevice
, etc.
For the complete list, see section Network Options. This form returns
non-nil
if that particular network option is supported by
make-network-process
(or set-network-process-option
).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These additional functions are useful for creating and operating on network connections. Note that they are supported only on some systems.
This function returns a list describing the network interfaces
of the machine you are using. The value is an alist whose
elements have the form (name . address)
.
address has the same form as the local-address
and remote-address arguments to make-network-process
.
This function returns information about the network interface named
ifname. The value is a list of the form
(addr bcast netmask hwaddr flags)
.
The Internet protocol address.
The broadcast address.
The network mask.
The layer 2 address (Ethernet MAC address, for instance).
The current flags of the interface.
This function converts the Lisp representation of a network address to a string.
A five-element vector [a b c d p]
represents an IPv4 address a.b.c.d and port
number p. format-network-address
converts that to the
string "a.b.c.d:p"
.
A nine-element vector [a b c d e
f g h p]
represents an IPv6 address along
with a port number. format-network-address
converts that to
the string
"[a:b:c:d:e:f:g:h]:p"
.
If the vector does not include the port number, p, or if
omit-port is non-nil
, the result does not include the
:p
suffix.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can communicate with serial ports. For interactive use,
M-x serial-term opens a terminal window. In a Lisp program,
make-serial-process
creates a process object.
The serial port can be configured at run-time, without having to
close and re-open it. The function serial-process-configure
lets you change the speed, bytesize, and other parameters. In a
terminal window created by serial-term
, you can click on the
mode line for configuration.
A serial connection is represented by a process object, which can be
used in a similar way to a subprocess or network process. You can send and
receive data, and configure the serial port. A serial process object
has no process ID, however, and you can’t send signals to it, and the
status codes are different from other types of processes.
delete-process
on the process object or kill-buffer
on
the process buffer close the connection, but this does not affect the
device connected to the serial port.
The function process-type
returns the symbol serial
for a process object representing a serial port connection.
Serial ports are available on GNU/Linux, Unix, and MS Windows systems.
Start a terminal-emulator for a serial port in a new buffer. port is the name of the serial port to connect to. For example, this could be /dev/ttyS0 on Unix. On MS Windows, this could be COM1, or \\.\COM10 (double the backslashes in Lisp strings).
speed is the speed of the serial port in bits per second. 9600 is a common value. The buffer is in Term mode; see Term Mode in The GNU Emacs Manual, for the commands to use in that buffer. You can change the speed and the configuration in the mode line menu.
This function creates a process and a buffer. Arguments are specified as keyword/argument pairs. Here’s the list of the meaningful keywords, with the first two (port and speed) being mandatory:
:port port
This is the name of the serial port. On Unix and GNU systems, this is a file name such as /dev/ttyS0. On Windows, this could be COM1, or \\.\COM10 for ports higher than COM9 (double the backslashes in Lisp strings).
:speed speed
The speed of the serial port in bits per second. This function calls
serial-process-configure
to handle the speed; see the
following documentation of that function for more details.
:name name
The name of the process. If name is not given, port will serve as the process name as well.
:buffer buffer
The buffer to associate with the process. The value can be either a
buffer or a string that names a buffer. Process output goes at the
end of that buffer, unless you specify an output stream or filter
function to handle the output. If buffer is not given, the
process buffer’s name is taken from the value of the :name
keyword.
:coding coding
If coding is a symbol, it specifies the coding system used for
both reading and writing for this process. If coding is a cons
(decoding . encoding)
, decoding is used for
reading, and encoding is used for writing. If not specified,
the default is to determine the coding systems from the data itself.
:noquery query-flag
Initialize the process query flag to query-flag. See section Querying Before Exit. The flags defaults to nil
if unspecified.
:stop bool
Start process in the “stopped” state if bool is
non-nil
. In the stopped state, a serial process does not
accept incoming data, but you can send outgoing data. The stopped
state is cleared by continue-process
and set by
stop-process
.
:filter filter
Install filter as the process filter.
:sentinel sentinel
Install sentinel as the process sentinel.
:plist plist
Install plist as the initial plist of the process.
:bytesize
:parity
:stopbits
:flowcontrol
These are handled by serial-process-configure
, which is called
by make-serial-process
.
The original argument list, possibly modified by later configuration,
is available via the function process-contact
.
Here is an example:
(make-serial-process :port "/dev/ttyS0" :speed 9600)
This function configures a serial port connection. Arguments are
specified as keyword/argument pairs. Attributes that are not given
are re-initialized from the process’s current configuration (available
via the function process-contact
), or set to reasonable default
values. The following arguments are defined:
:process process
:name name
:buffer buffer
:port port
Any of these arguments can be given to identify the process that is to be configured. If none of these arguments is given, the current buffer’s process is used.
:speed speed
The speed of the serial port in bits per second, a.k.a. baud
rate. The value can be any number, but most serial ports work only
at a few defined values between 1200 and 115200, with 9600 being the
most common value. If speed is nil
, the function ignores
all other arguments and does not configure the port. This may be
useful for special serial ports such as Bluetooth-to-serial converters,
which can only be configured through ‘AT’ commands sent through the
connection. The value of nil
for speed is valid only for
connections that were already opened by a previous call to
make-serial-process
or serial-term
.
:bytesize bytesize
The number of bits per byte, which can be 7 or 8. If bytesize
is not given or nil
, it defaults to 8.
:parity parity
The value can be nil
(don’t use parity), the symbol
odd
(use odd parity), or the symbol even
(use even
parity). If parity is not given, it defaults to no parity.
:stopbits stopbits
The number of stopbits used to terminate a transmission
of each byte. stopbits can be 1 or 2. If stopbits is not
given or nil
, it defaults to 1.
:flowcontrol flowcontrol
The type of flow control to use for this connection, which is either
nil
(don’t use flow control), the symbol hw
(use RTS/CTS
hardware flow control), or the symbol sw
(use XON/XOFF software
flow control). If flowcontrol is not given, it defaults to no
flow control.
Internally, make-serial-process
calls
serial-process-configure
for the initial configuration of the
serial port.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to pack and unpack arrays of bytes,
usually for binary network protocols. These functions convert byte arrays
to alists, and vice versa. The byte array can be represented as a
unibyte string or as a vector of integers, while the alist associates
symbols either with fixed-size objects or with recursive sub-alists.
To use the functions referred to in this section, load the
bindat
library.
Conversion from byte arrays to nested alists is also known as deserializing or unpacking, while going in the opposite direction is also known as serializing or packing.
36.20.1 Describing Data Layout | Describing data layout. | |
36.20.2 Functions to Unpack and Pack Bytes | Doing the unpacking and packing. | |
36.20.3 Examples of Byte Unpacking and Packing | Samples of what bindat.el can do for you! |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To control unpacking and packing, you write a data layout specification, a special nested list describing named and typed fields. This specification controls the length of each field to be processed, and how to pack or unpack it. We normally keep bindat specs in variables whose names end in ‘-bindat-spec’; that kind of name is automatically recognized as “risky”.
A field’s type describes the size (in bytes) of the object
that the field represents and, in the case of multibyte fields, how
the bytes are ordered within the field. The two possible orderings
are “big endian” (also known as “network byte ordering”) and
“little endian”. For instance, the number #x23cd
(decimal
9165) in big endian would be the two bytes #x23
#xcd
;
and in little endian, #xcd
#x23
. Here are the possible
type values:
u8
byte
Unsigned byte, with length 1.
u16
word
short
Unsigned integer in network byte order, with length 2.
u24
Unsigned integer in network byte order, with length 3.
u32
dword
long
Unsigned integer in network byte order, with length 4. Note: These values may be limited by Emacs’s integer implementation limits.
u16r
u24r
u32r
Unsigned integer in little endian order, with length 2, 3 and 4, respectively.
str len
String of length len.
strz len
Zero-terminated string, in a fixed-size field with length len.
vec len [type]
Vector of len elements of type type, defaulting to bytes.
The type is any of the simple types above, or another vector
specified as a list of the form (vec len [type])
.
ip
Four-byte vector representing an Internet address. For example:
[127 0 0 1]
for localhost.
bits len
List of set bits in len bytes. The bytes are taken in big
endian order and the bits are numbered starting with 8 *
len - 1
and ending with zero. For example: bits
2
unpacks #x28
#x1c
to (2 3 4 11 13)
and
#x1c
#x28
to (3 5 10 11 12)
.
(eval form)
form is a Lisp expression evaluated at the moment the field is unpacked or packed. The result of the evaluation should be one of the above-listed type specifications.
For a fixed-size field, the length len is given as an integer specifying the number of bytes in the field.
When the length of a field is not fixed, it typically depends on the
value of a preceding field. In this case, the length len can be
given either as a list (name ...)
identifying a
field name in the format specified for bindat-get-field
below, or by an expression (eval form)
where form
should evaluate to an integer, specifying the field length.
A field specification generally has the form ([name]
handler)
, where name is optional. Don’t use names that
are symbols meaningful as type specifications (above) or handler
specifications (below), since that would be ambiguous. name can
be a symbol or an expression (eval form)
, in which case
form should evaluate to a symbol.
handler describes how to unpack or pack the field and can be one of the following:
type
Unpack/pack this field according to the type specification type.
eval form
Evaluate form, a Lisp expression, for side-effect only. If the field name is specified, the value is bound to that field name.
fill len
Skip len bytes. In packing, this leaves them unchanged, which normally means they remain zero. In unpacking, this means they are ignored.
align len
Skip to the next multiple of len bytes.
struct spec-name
Process spec-name as a sub-specification. This describes a structure nested within another structure.
union form (tag spec)…
Evaluate form, a Lisp expression, find the first tag that matches it, and process its associated data layout specification spec. Matching can occur in one of three ways:
(eval expr)
, evaluate
expr with the variable tag
dynamically bound to the value
of form. A non-nil
result indicates a match.
equal
to the value of form.
t
.
repeat count field-specs…
Process the field-specs recursively, in order, then repeat
starting from the first one, processing all the specifications count
times overall. The count is given using the same formats as a
field length—if an eval
form is used, it is evaluated just once.
For correct operation, each specification in field-specs must
include a name.
For the (eval form)
forms used in a bindat specification,
the form can access and update these dynamically bound variables
during evaluation:
last
Value of the last field processed.
bindat-raw
The data as a byte array.
bindat-idx
Current index (within bindat-raw
) for unpacking or packing.
struct
The alist containing the structured data that have been unpacked so
far, or the entire structure being packed. You can use
bindat-get-field
to access specific fields of this structure.
count
index
Inside a repeat
block, these contain the maximum number of
repetitions (as specified by the count parameter), and the
current repetition number (counting from 0). Setting count
to
zero will terminate the inner-most repeat block after the current
repetition has completed.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In the following documentation, spec refers to a data layout
specification, bindat-raw
to a byte array, and struct to an
alist representing unpacked field data.
This function unpacks data from the unibyte string or byte
array bindat-raw
according to spec. Normally, this starts unpacking at the
beginning of the byte array, but if bindat-idx is non-nil
, it
specifies a zero-based starting position to use instead.
The value is an alist or nested alist in which each element describes one unpacked field.
This function selects a field’s data from the nested alist
struct. Usually struct was returned by
bindat-unpack
. If name corresponds to just one argument,
that means to extract a top-level field value. Multiple name
arguments specify repeated lookup of sub-structures. An integer name
acts as an array index.
For example, if name is (a b 2 c)
, that means to find
field c
in the third element of subfield b
of field
a
. (This corresponds to struct.a.b[2].c
in C.)
Although packing and unpacking operations change the organization of data (in memory), they preserve the data’s total length, which is the sum of all the fields’ lengths, in bytes. This value is not generally inherent in either the specification or alist alone; instead, both pieces of information contribute to its calculation. Likewise, the length of a string or array being unpacked may be longer than the data’s total length as described by the specification.
This function returns the total length of the data in struct, according to spec.
This function returns a byte array packed according to spec from
the data in the alist struct. It normally creates and fills a
new byte array starting at the beginning. However, if bindat-raw
is non-nil
, it specifies a pre-allocated unibyte string or vector to
pack into. If bindat-idx is non-nil
, it specifies the starting
offset for packing into bindat-raw
.
When pre-allocating, you should make sure (length bindat-raw)
meets or exceeds the total length to avoid an out-of-range error.
Convert the Internet address vector ip to a string in the usual dotted notation.
(bindat-ip-to-string [127 0 0 1]) ⇒ "127.0.0.1"
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a complete example of byte unpacking and packing:
(require 'bindat) (defvar fcookie-index-spec '((:version u32) (:count u32) (:longest u32) (:shortest u32) (:flags u32) (:delim u8) (:ignored fill 3) (:offset repeat (:count) (:foo u32))) "Description of a fortune cookie index file's contents.") (defun fcookie (cookies &optional index) "Display a random fortune cookie from file COOKIES. Optional second arg INDEX specifies the associated index filename, by default \"COOKIES.dat\". Display cookie text in buffer \"*Fortune Cookie: BASENAME*\", where BASENAME is COOKIES without the directory part." (interactive "fCookies file: ") (let* ((info (with-temp-buffer (insert-file-contents-literally (or index (concat cookies ".dat"))) (bindat-unpack fcookie-index-spec (buffer-string)))) (sel (random (bindat-get-field info :count))) (beg (cdar (bindat-get-field info :offset sel))) (end (or (cdar (bindat-get-field info :offset (1+ sel))) (nth 7 (file-attributes cookies))))) (switch-to-buffer (get-buffer-create (format "*Fortune Cookie: %s*" (file-name-nondirectory cookies)))) (erase-buffer) (insert-file-contents-literally cookies nil beg (- end 3)))) (defun fcookie-create-index (cookies &optional index delim) "Scan file COOKIES, and write out its index file. Optional arg INDEX specifies the index filename, which by default is \"COOKIES.dat\". Optional arg DELIM specifies the unibyte character that, when found on a line of its own in COOKIES, indicates the border between entries." (interactive "fCookies file: ") (setq delim (or delim ?%)) (let ((delim-line (format "\n%c\n" delim)) (count 0) (max 0) min p q len offsets) (unless (= 3 (string-bytes delim-line)) (error "Delimiter cannot be represented in one byte")) (with-temp-buffer (insert-file-contents-literally cookies) (while (and (setq p (point)) (search-forward delim-line (point-max) t) (setq len (- (point) 3 p))) (setq count (1+ count) max (max max len) min (min (or min max) len) offsets (cons (1- p) offsets)))) (with-temp-buffer (set-buffer-multibyte nil) (insert (bindat-pack fcookie-index-spec `((:version . 2) (:count . ,count) (:longest . ,max) (:shortest . ,min) (:flags . 0) (:delim . ,delim) (:offset . ,(mapcar (lambda (o) (list (cons :foo o))) (nreverse offsets)))))) (let ((coding-system-for-write 'raw-text-unix)) (write-file (or index (concat cookies ".dat")))))))
The following is an example of defining and unpacking a complex structure. Consider the following C structures:
struct header { unsigned long dest_ip; unsigned long src_ip; unsigned short dest_port; unsigned short src_port; }; struct data { unsigned char type; unsigned char opcode; unsigned short length; /* in network byte order */ unsigned char id[8]; /* null-terminated string */ unsigned char data[/* (length + 3) & ~3 */]; }; struct packet { struct header header; unsigned long counters[2]; /* in little endian order */ unsigned char items; unsigned char filler[3]; struct data item[/* items */]; };
The corresponding data layout specification is:
(setq header-spec '((dest-ip ip) (src-ip ip) (dest-port u16) (src-port u16))) (setq data-spec '((type u8) (opcode u8) (length u16) ; network byte order (id strz 8) (data vec (length)) (align 4))) (setq packet-spec '((header struct header-spec) (counters vec 2 u32r) ; little endian order (items u8) (fill 3) (item repeat (items) (struct data-spec))))
A binary data representation is:
(setq binary-data [ 192 168 1 100 192 168 1 101 01 28 21 32 160 134 1 0 5 1 0 0 2 0 0 0 2 3 0 5 ?A ?B ?C ?D ?E ?F 0 0 1 2 3 4 5 0 0 0 1 4 0 7 ?B ?C ?D ?E ?F ?G 0 0 6 7 8 9 10 11 12 0 ])
The corresponding decoded structure is:
(setq decoded (bindat-unpack packet-spec binary-data)) ⇒ ((header (dest-ip . [192 168 1 100]) (src-ip . [192 168 1 101]) (dest-port . 284) (src-port . 5408)) (counters . [100000 261]) (items . 2) (item ((data . [1 2 3 4 5]) (id . "ABCDEF") (length . 5) (opcode . 3) (type . 2)) ((data . [6 7 8 9 10 11 12]) (id . "BCDEFG") (length . 7) (opcode . 4) (type . 1))))
An example of fetching data from this structure:
(bindat-get-field decoded 'item 1 'id) ⇒ "BCDEFG"
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes a number of features related to the display that Emacs presents to the user.
37.1 Refreshing the Screen | Clearing the screen and redrawing everything on it. | |
37.2 Forcing Redisplay | Forcing redisplay. | |
37.3 Truncation | Folding or wrapping long text lines. | |
37.4 The Echo Area | Displaying messages at the bottom of the screen. | |
37.5 Reporting Warnings | Displaying warning messages for the user. | |
37.6 Invisible Text | Hiding part of the buffer text. | |
37.7 Selective Display | Hiding part of the buffer text (the old way). | |
37.8 Temporary Displays | Displays that go away automatically. | |
37.9 Overlays | Use overlays to highlight parts of the buffer. | |
37.10 Size of Displayed Text | How large displayed text is. | |
37.11 Line Height | Controlling the height of lines. | |
37.12 Faces | A face defines a graphics style for text characters: font, colors, etc. | |
37.13 Fringes | Controlling window fringes. | |
37.14 Scroll Bars | Controlling vertical scroll bars. | |
37.15 Window Dividers | Separating windows visually. | |
37.16 The display Property | Enabling special display features. | |
37.17 Images | Displaying images in Emacs buffers. | |
37.18 Buttons | Adding clickable buttons to Emacs buffers. | |
37.19 Abstract Display | Emacs’s Widget for Object Collections. | |
37.20 Blinking Parentheses | How Emacs shows the matching open parenthesis. | |
37.21 Character Display | How Emacs displays individual characters. | |
37.22 Beeping | Audible signal to the user. | |
37.23 Window Systems | Which window system is being used. | |
37.24 Bidirectional Display | Display of bidirectional scripts, such as Arabic and Farsi. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The function redraw-frame
clears and redisplays the entire
contents of a given frame (see section Frames). This is useful if the
screen is corrupted.
This function clears and redisplays frame frame.
Even more powerful is redraw-display
:
This function clears and redisplays all visible frames.
In Emacs, processing user input takes priority over redisplay. If you call these functions when input is available, they don’t redisplay immediately, but the requested redisplay does happen eventually—after all the input has been processed.
On text terminals, suspending and resuming Emacs normally also refreshes the screen. Some terminal emulators record separate contents for display-oriented programs such as Emacs and for ordinary sequential display. If you are using such a terminal, you might want to inhibit the redisplay on resumption.
This variable controls whether Emacs redraws the entire screen after it
has been suspended and resumed. Non-nil
means there is no need
to redraw, nil
means redrawing is needed. The default is nil
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs normally tries to redisplay the screen whenever it waits for input. With the following function, you can request an immediate attempt to redisplay, in the middle of Lisp code, without actually waiting for input.
This function tries immediately to redisplay. The optional argument
force, if non-nil
, forces the redisplay to be performed,
instead of being preempted if input is pending.
The function returns t
if it actually tried to redisplay, and
nil
otherwise. A value of t
does not mean that
redisplay proceeded to completion; it could have been preempted by
newly arriving input.
A function run just before redisplay. It is called with one argument, the set of windows to redisplay.
Although redisplay
tries immediately to redisplay, it does
not change how Emacs decides which parts of its frame(s) to redisplay.
By contrast, the following function adds certain windows to the
pending redisplay work (as if their contents had completely changed),
but does not immediately try to perform redisplay.
This function forces some or all windows to be updated the next time
Emacs does a redisplay. If object is a window, that window is
to be updated. If object is a buffer or buffer name, all
windows displaying that buffer are to be updated. If object is
nil
(or omitted), all windows are to be updated.
This function does not do a redisplay immediately; Emacs does that as
it waits for input, or when the function redisplay
is called.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When a line of text extends beyond the right edge of a window, Emacs can continue the line (make it “wrap” to the next screen line), or truncate the line (limit it to one screen line). The additional screen lines used to display a long text line are called continuation lines. Continuation is not the same as filling; continuation happens on the screen only, not in the buffer contents, and it breaks a line precisely at the right margin, not at a word boundary. See section Filling.
On a graphical display, tiny arrow images in the window fringes indicate truncated and continued lines (see section Fringes). On a text terminal, a ‘$’ in the rightmost column of the window indicates truncation; a ‘\’ on the rightmost column indicates a line that “wraps”. (The display table can specify alternate characters to use for this; see section Display Tables).
If this buffer-local variable is non-nil
, lines that extend
beyond the right edge of the window are truncated; otherwise, they are
continued. As a special exception, the variable
truncate-partial-width-windows
takes precedence in
partial-width windows (i.e., windows that do not occupy the
entire frame width).
This variable controls line truncation in partial-width windows.
A partial-width window is one that does not occupy the entire frame
width (see section Splitting Windows). If the value is nil
, line
truncation is determined by the variable truncate-lines
(see
above). If the value is an integer n, lines are truncated if
the partial-width window has fewer than n columns, regardless of
the value of truncate-lines
; if the partial-width window has
n or more columns, line truncation is determined by
truncate-lines
. For any other non-nil
value, lines are
truncated in every partial-width window, regardless of the value of
truncate-lines
.
When horizontal scrolling (see section Horizontal Scrolling) is in use in a window, that forces truncation.
If this buffer-local variable is non-nil
, it defines a
wrap prefix which Emacs displays at the start of every
continuation line. (If lines are truncated, wrap-prefix
is
never used.) Its value may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the
:width
or :align-to
display properties (see section Specified Spaces). The value is interpreted in the same way as a display
text property. See section The display
Property.
A wrap prefix may also be specified for regions of text, using the
wrap-prefix
text or overlay property. This takes precedence
over the wrap-prefix
variable. See section Properties with Special Meanings.
If this buffer-local variable is non-nil
, it defines a
line prefix which Emacs displays at the start of every
non-continuation line. Its value may be a string or an image
(see section Other Display Specifications), or a stretch of whitespace such as
specified by the :width
or :align-to
display properties
(see section Specified Spaces). The value is interpreted in the same way
as a display
text property. See section The display
Property.
A line prefix may also be specified for regions of text using the
line-prefix
text or overlay property. This takes precedence
over the line-prefix
variable. See section Properties with Special Meanings.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The echo area is used for displaying error messages
(see section Errors), for messages made with the message
primitive,
and for echoing keystrokes. It is not the same as the minibuffer,
despite the fact that the minibuffer appears (when active) in the same
place on the screen as the echo area. See The
Minibuffer in The GNU Emacs Manual.
Apart from the functions documented in this section, you can print
Lisp objects to the echo area by specifying t
as the output
stream. See section Output Streams.
37.4.1 Displaying Messages in the Echo Area | Explicitly displaying text in the echo area. | |
37.4.2 Reporting Operation Progress | Informing user about progress of a long operation. | |
37.4.3 Logging Messages in *Messages* | Echo area messages are logged for the user. | |
37.4.4 Echo Area Customization | Controlling the echo area. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the standard functions for displaying messages in the echo area.
This function displays a message in the echo area.
format-string is a format string, and arguments are the
objects for its format specifications, like in the format
function (see section Formatting Strings). The resulting formatted string
is displayed in the echo area; if it contains face
text
properties, it is displayed with the specified faces (see section Faces).
The string is also added to the *Messages* buffer, but without
text properties (see section Logging Messages in *Messages*).
In batch mode, the message is printed to the standard error stream, followed by a newline.
If format-string is nil
or the empty string,
message
clears the echo area; if the echo area has been
expanded automatically, this brings it back to its normal size. If
the minibuffer is active, this brings the minibuffer contents back
onto the screen immediately.
(message "Minibuffer depth is %d." (minibuffer-depth)) -| Minibuffer depth is 0. ⇒ "Minibuffer depth is 0."
---------- Echo Area ---------- Minibuffer depth is 0. ---------- Echo Area ----------
To automatically display a message in the echo area or in a pop-buffer,
depending on its size, use display-message-or-buffer
(see below).
This construct displays a message in the echo area temporarily, during the execution of body. It displays message, executes body, then returns the value of the last body form while restoring the previous echo area contents.
This function displays a message like message
, but may display it
in a dialog box instead of the echo area. If this function is called in
a command that was invoked using the mouse—more precisely, if
last-nonmenu-event
(see section Information from the Command Loop) is either
nil
or a list—then it uses a dialog box or pop-up menu to
display the message. Otherwise, it uses the echo area. (This is the
same criterion that y-or-n-p
uses to make a similar decision; see
Yes-or-No Queries.)
You can force use of the mouse or of the echo area by binding
last-nonmenu-event
to a suitable value around the call.
This function displays a message like message
, but uses a dialog
box (or a pop-up menu) whenever that is possible. If it is impossible
to use a dialog box or pop-up menu, because the terminal does not
support them, then message-box
uses the echo area, like
message
.
This function displays the message message, which may be either a
string or a buffer. If it is shorter than the maximum height of the
echo area, as defined by max-mini-window-height
, it is displayed
in the echo area, using message
. Otherwise,
display-buffer
is used to show it in a pop-up buffer.
Returns either the string shown in the echo area, or when a pop-up buffer is used, the window used to display it.
If message is a string, then the optional argument buffer-name is the name of the buffer used to display it when a pop-up buffer is used, defaulting to *Message*. In the case where message is a string and displayed in the echo area, it is not specified whether the contents are inserted into the buffer anyway.
The optional arguments not-this-window and frame are as for
display-buffer
, and only used if a buffer is displayed.
This function returns the message currently being displayed in the
echo area, or nil
if there is none.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When an operation can take a while to finish, you should inform the user about the progress it makes. This way the user can estimate remaining time and clearly see that Emacs is busy working, not hung. A convenient way to do this is to use a progress reporter.
Here is a working example that does nothing useful:
(let ((progress-reporter (make-progress-reporter "Collecting mana for Emacs..." 0 500))) (dotimes (k 500) (sit-for 0.01) (progress-reporter-update progress-reporter k)) (progress-reporter-done progress-reporter))
This function creates and returns a progress reporter object, which you will use as an argument for the other functions listed below. The idea is to precompute as much data as possible to make progress reporting very fast.
When this progress reporter is subsequently used, it will display
message in the echo area, followed by progress percentage.
message is treated as a simple string. If you need it to depend
on a filename, for instance, use format
before calling this
function.
The arguments min-value and max-value should be numbers
standing for the starting and final states of the operation. For
instance, an operation that “scans” a buffer should set these to the
results of point-min
and point-max
correspondingly.
max-value should be greater than min-value.
Alternatively, you can set min-value and max-value to
nil
. In that case, the progress reporter does not report
process percentages; it instead displays a “spinner” that rotates a
notch each time you update the progress reporter.
If min-value and max-value are numbers, you can give the argument current-value a numerical value specifying the initial progress; if omitted, this defaults to min-value.
The remaining arguments control the rate of echo area updates. The progress reporter will wait for at least min-change more percents of the operation to be completed before printing next message; the default is one percent. min-time specifies the minimum time in seconds to pass between successive prints; the default is 0.2 seconds. (On some operating systems, the progress reporter may handle fractions of seconds with varying precision).
This function calls progress-reporter-update
, so the first
message is printed immediately.
This function does the main work of reporting progress of your operation. It displays the message of reporter, followed by progress percentage determined by value. If percentage is zero, or close enough according to the min-change and min-time arguments, then it is omitted from the output.
reporter must be the result of a call to
make-progress-reporter
. value specifies the current
state of your operation and must be between min-value and
max-value (inclusive) as passed to
make-progress-reporter
. For instance, if you scan a buffer,
then value should be the result of a call to point
.
This function respects min-change and min-time as passed
to make-progress-reporter
and so does not output new messages
on every invocation. It is thus very fast and normally you should not
try to reduce the number of calls to it: resulting overhead will most
likely negate your effort.
This function is similar to progress-reporter-update
except
that it prints a message in the echo area unconditionally.
The first two arguments have the same meaning as for
progress-reporter-update
. Optional new-message allows
you to change the message of the reporter. Since this function
always updates the echo area, such a change will be immediately
presented to the user.
This function should be called when the operation is finished. It prints the message of reporter followed by word “done” in the echo area.
You should always call this function and not hope for
progress-reporter-update
to print “100%”. Firstly, it may
never print it, there are many good reasons for this not to happen.
Secondly, “done” is more explicit.
This is a convenience macro that works the same way as dotimes
does, but also reports loop progress using the functions described
above. It allows you to save some typing.
You can rewrite the example in the beginning of this node using this macro this way:
(dotimes-with-progress-reporter (k 500) "Collecting some mana for Emacs..." (sit-for 0.01))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Almost all the messages displayed in the echo area are also recorded
in the *Messages* buffer so that the user can refer back to
them. This includes all the messages that are output with
message
. By default, this buffer is read-only and uses the major
mode messages-buffer-mode
. Nothing prevents the user from
killing the *Messages* buffer, but the next display of a message
recreates it. Any Lisp code that needs to access the
*Messages* buffer directly and wants to ensure that it exists
should use the function messages-buffer
.
This function returns the *Messages* buffer. If it does not
exist, it creates it, and switches it to messages-buffer-mode
.
This variable specifies how many lines to keep in the *Messages*
buffer. The value t
means there is no limit on how many lines to
keep. The value nil
disables message logging entirely. Here’s
how to display a message and prevent it from being logged:
(let (message-log-max) (message …))
To make *Messages* more convenient for the user, the logging facility combines successive identical messages. It also combines successive related messages for the sake of two cases: question followed by answer, and a series of progress messages.
A “question followed by an answer” means two messages like the
ones produced by y-or-n-p
: the first is ‘question’,
and the second is ‘question...answer’. The first
message conveys no additional information beyond what’s in the second,
so logging the second message discards the first from the log.
A “series of progress messages” means successive messages like
those produced by make-progress-reporter
. They have the form
‘base...how-far’, where base is the same each
time, while how-far varies. Logging each message in the series
discards the previous one, provided they are consecutive.
The functions make-progress-reporter
and y-or-n-p
don’t have to do anything special to activate the message log
combination feature. It operates whenever two consecutive messages
are logged that share a common prefix ending in ‘...’.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These variables control details of how the echo area works.
This variable controls where the cursor appears when a message is
displayed in the echo area. If it is non-nil
, then the cursor
appears at the end of the message. Otherwise, the cursor appears at
point—not in the echo area at all.
The value is normally nil
; Lisp programs bind it to t
for brief periods of time.
This normal hook is run whenever the echo area is cleared—either by
(message nil)
or for any other reason.
This variable determines how much time should elapse before command characters echo. Its value must be a number, and specifies the number of seconds to wait before echoing. If the user types a prefix key (such as C-x) and then delays this many seconds before continuing, the prefix key is echoed in the echo area. (Once echoing begins in a key sequence, all subsequent characters in the same key sequence are echoed immediately.)
If the value is zero, then command input is not echoed.
Normally, displaying a long message resizes the echo area to display
the entire message. But if the variable message-truncate-lines
is non-nil
, the echo area does not resize, and the message is
truncated to fit it.
The variable max-mini-window-height
, which specifies the
maximum height for resizing minibuffer windows, also applies to the
echo area (which is really a special use of the minibuffer window;
see section Minibuffer Miscellany).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Warnings are a facility for a program to inform the user of a possible problem, but continue running.
37.5.1 Warning Basics | Warnings concepts and functions to report them. | |
37.5.2 Warning Variables | Variables programs bind to customize their warnings. | |
37.5.3 Warning Options | Variables users set to control display of warnings. | |
37.5.4 Delayed Warnings | Deferring a warning until the end of a command. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Every warning has a textual message, which explains the problem for the user, and a severity level which is a symbol. Here are the possible severity levels, in order of decreasing severity, and their meanings:
:emergency
A problem that will seriously impair Emacs operation soon if you do not attend to it promptly.
:error
A report of data or circumstances that are inherently wrong.
:warning
A report of data or circumstances that are not inherently wrong, but raise suspicion of a possible problem.
:debug
A report of information that may be useful if you are debugging.
When your program encounters invalid input data, it can either
signal a Lisp error by calling error
or signal
or report
a warning with severity :error
. Signaling a Lisp error is the
easiest thing to do, but it means the program cannot continue
processing. If you want to take the trouble to implement a way to
continue processing despite the bad data, then reporting a warning of
severity :error
is the right way to inform the user of the
problem. For instance, the Emacs Lisp byte compiler can report an
error that way and continue compiling other functions. (If the
program signals a Lisp error and then handles it with
condition-case
, the user won’t see the error message; it could
show the message to the user by reporting it as a warning.)
Each warning has a warning type to classify it. The type is a
list of symbols. The first symbol should be the custom group that you
use for the program’s user options. For example, byte compiler
warnings use the warning type (bytecomp)
. You can also
subcategorize the warnings, if you wish, by using more symbols in the
list.
This function reports a warning, using message as the message
and type as the warning type. level should be the
severity level, with :warning
being the default.
buffer-name, if non-nil
, specifies the name of the buffer
for logging the warning. By default, it is *Warnings*.
This function reports a warning using the value of (format
message args...)
as the message in the *Warnings*
buffer. In other respects it is equivalent to display-warning
.
This function reports a warning using the value of (format
message args...)
as the message, (emacs)
as the
type, and :warning
as the severity level. It exists for
compatibility only; we recommend not using it, because you should
specify a specific warning type.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Programs can customize how their warnings appear by binding the variables described in this section.
This list defines the meaning and severity order of the warning severity levels. Each element defines one severity level, and they are arranged in order of decreasing severity.
Each element has the form (level string
function)
, where level is the severity level it defines.
string specifies the textual description of this level.
string should use ‘%s’ to specify where to put the warning
type information, or it can omit the ‘%s’ so as not to include
that information.
The optional function, if non-nil
, is a function to call
with no arguments, to get the user’s attention.
Normally you should not change the value of this variable.
If non-nil
, the value is a function to generate prefix text for
warnings. Programs can bind the variable to a suitable function.
display-warning
calls this function with the warnings buffer
current, and the function can insert text in it. That text becomes
the beginning of the warning message.
The function is called with two arguments, the severity level and its
entry in warning-levels
. It should return a list to use as the
entry (this value need not be an actual member of
warning-levels
). By constructing this value, the function can
change the severity of the warning, or specify different handling for
a given severity level.
If the variable’s value is nil
then there is no function
to call.
Programs can bind this variable to t
to say that the next
warning should begin a series. When several warnings form a series,
that means to leave point on the first warning of the series, rather
than keep moving it for each warning so that it appears on the last one.
The series ends when the local binding is unbound and
warning-series
becomes nil
again.
The value can also be a symbol with a function definition. That is
equivalent to t
, except that the next warning will also call
the function with no arguments with the warnings buffer current. The
function can insert text which will serve as a header for the series
of warnings.
Once a series has begun, the value is a marker which points to the buffer position in the warnings buffer of the start of the series.
The variable’s normal value is nil
, which means to handle
each warning separately.
When this variable is non-nil
, it specifies a fill prefix to
use for filling each warning’s text.
This variable specifies the format for displaying the warning type
in the warning message. The result of formatting the type this way
gets included in the message under the control of the string in the
entry in warning-levels
. The default value is " (%s)"
.
If you bind it to ""
then the warning type won’t appear at
all.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These variables are used by users to control what happens when a Lisp program reports a warning.
This user option specifies the minimum severity level that should be
shown immediately to the user. The default is :warning
, which
means to immediately display all warnings except :debug
warnings.
This user option specifies the minimum severity level that should be
logged in the warnings buffer. The default is :warning
, which
means to log all warnings except :debug
warnings.
This list specifies which warning types should not be displayed immediately for the user. Each element of the list should be a list of symbols. If its elements match the first elements in a warning type, then that warning is not displayed immediately.
This list specifies which warning types should not be logged in the warnings buffer. Each element of the list should be a list of symbols. If it matches the first few elements in a warning type, then that warning is not logged.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Sometimes, you may wish to avoid showing a warning while a command is
running, and only show it only after the end of the command. You can
use the variable delayed-warnings-list
for this.
The value of this variable is a list of warnings to be displayed after the current command has finished. Each element must be a list
(type message [level [buffer-name]])
with the same form, and the same meanings, as the argument list of
display-warning
(see section Warning Basics). Immediately after
running post-command-hook
(see section Command Loop Overview), the Emacs
command loop displays all the warnings specified by this variable,
then resets it to nil
.
Programs which need to further customize the delayed warnings
mechanism can change the variable delayed-warnings-hook
:
This is a normal hook which is run by the Emacs command loop, after
post-command-hook
, in order to to process and display delayed
warnings.
Its default value is a list of two functions:
(collapse-delayed-warnings display-delayed-warnings)
The function collapse-delayed-warnings
removes repeated entries
from delayed-warnings-list
. The function
display-delayed-warnings
calls display-warning
on each
of the entries in delayed-warnings-list
, in turn, and then sets
delayed-warnings-list
to nil
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can make characters invisible, so that they do not appear on
the screen, with the invisible
property. This can be either a
text property (see section Text Properties) or an overlay property
(see section Overlays). Cursor motion also partly ignores these
characters; if the command loop finds that point is inside a range of
invisible text after a command, it relocates point to the other side
of the text.
In the simplest case, any non-nil
invisible
property makes
a character invisible. This is the default case—if you don’t alter
the default value of buffer-invisibility-spec
, this is how the
invisible
property works. You should normally use t
as the value of the invisible
property if you don’t plan
to set buffer-invisibility-spec
yourself.
More generally, you can use the variable buffer-invisibility-spec
to control which values of the invisible
property make text
invisible. This permits you to classify the text into different subsets
in advance, by giving them different invisible
values, and
subsequently make various subsets visible or invisible by changing the
value of buffer-invisibility-spec
.
Controlling visibility with buffer-invisibility-spec
is
especially useful in a program to display the list of entries in a
database. It permits the implementation of convenient filtering
commands to view just a part of the entries in the database. Setting
this variable is very fast, much faster than scanning all the text in
the buffer looking for properties to change.
This variable specifies which kinds of invisible
properties
actually make a character invisible. Setting this variable makes it
buffer-local.
t
A character is invisible if its invisible
property is
non-nil
. This is the default.
Each element of the list specifies a criterion for invisibility; if a
character’s invisible
property fits any one of these criteria,
the character is invisible. The list can have two kinds of elements:
atom
A character is invisible if its invisible
property value is
atom or if it is a list with atom as a member; comparison
is done with eq
.
(atom . t)
A character is invisible if its invisible
property value is
atom or if it is a list with atom as a member; comparison
is done with eq
. Moreover, a sequence of such characters
displays as an ellipsis.
Two functions are specifically provided for adding elements to
buffer-invisibility-spec
and removing elements from it.
This function adds the element element to
buffer-invisibility-spec
. If buffer-invisibility-spec
was t
, it changes to a list, (t)
, so that text whose
invisible
property is t
remains invisible.
This removes the element element from
buffer-invisibility-spec
. This does nothing if element
is not in the list.
A convention for use of buffer-invisibility-spec
is that a
major mode should use the mode’s own name as an element of
buffer-invisibility-spec
and as the value of the
invisible
property:
;; If you want to display an ellipsis: (add-to-invisibility-spec '(my-symbol . t)) ;; If you don’t want ellipsis: (add-to-invisibility-spec 'my-symbol) (overlay-put (make-overlay beginning end) 'invisible 'my-symbol) ;; When done with the invisibility: (remove-from-invisibility-spec '(my-symbol . t)) ;; Or respectively: (remove-from-invisibility-spec 'my-symbol)
You can check for invisibility using the following function:
If pos-or-prop is a marker or number, this function returns a
non-nil
value if the text at that position is invisible.
If pos-or-prop is any other kind of Lisp object, that is taken
to mean a possible value of the invisible
text or overlay
property. In that case, this function returns a non-nil
value
if that value would cause text to become invisible, based on the
current value of buffer-invisibility-spec
.
Ordinarily, functions that operate on text or move point do not care
whether the text is invisible, they process invisible characters and
visible characters alike. The user-level line motion commands,
such as next-line
, previous-line
, ignore invisible
newlines if line-move-ignore-invisible
is non-nil
(the
default), i.e., behave like these invisible newlines didn’t exist in
the buffer, but only because they are explicitly programmed to do so.
If a command ends with point inside or at the boundary of
invisible text, the main editing loop relocates point to one of the
two ends of the invisible text. Emacs chooses the direction of
relocation so that it is the same as the overall movement direction of
the command; if in doubt, it prefers a position where an inserted char
would not inherit the invisible
property. Additionally, if the
text is not replaced by an ellipsis and the command only moved within
the invisible text, then point is moved one extra character so as to
try and reflect the command’s movement by a visible movement of the
cursor.
Thus, if the command moved point back to an invisible range (with the usual stickiness), Emacs moves point back to the beginning of that range. If the command moved point forward into an invisible range, Emacs moves point forward to the first visible character that follows the invisible text and then forward one more character.
These adjustments of point that ended up in the middle of
invisible text can be disabled by setting disable-point-adjustment
to a non-nil
value. See section Adjusting Point After Commands.
Incremental search can make invisible overlays visible temporarily
and/or permanently when a match includes invisible text. To enable
this, the overlay should have a non-nil
isearch-open-invisible
property. The property value should be a
function to be called with the overlay as an argument. This function
should make the overlay visible permanently; it is used when the match
overlaps the overlay on exit from the search.
During the search, such overlays are made temporarily visible by
temporarily modifying their invisible and intangible properties. If you
want this to be done differently for a certain overlay, give it an
isearch-open-invisible-temporary
property which is a function.
The function is called with two arguments: the first is the overlay, and
the second is nil
to make the overlay visible, or t
to
make it invisible again.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Selective display refers to a pair of related features for hiding certain lines on the screen.
The first variant, explicit selective display, was designed for use in a Lisp
program: it controls which lines are hidden by altering the text. This kind of
hiding is now obsolete; instead you can get the same effect with the
invisible
property (see section Invisible Text).
In the second variant, the choice of lines to hide is made automatically based on indentation. This variant is designed to be a user-level feature.
The way you control explicit selective display is by replacing a newline (control-j) with a carriage return (control-m). The text that was formerly a line following that newline is now hidden. Strictly speaking, it is temporarily no longer a line at all, since only newlines can separate lines; it is now part of the previous line.
Selective display does not directly affect editing commands. For
example, C-f (forward-char
) moves point unhesitatingly
into hidden text. However, the replacement of newline characters with
carriage return characters affects some editing commands. For
example, next-line
skips hidden lines, since it searches only
for newlines. Modes that use selective display can also define
commands that take account of the newlines, or that control which
parts of the text are hidden.
When you write a selectively displayed buffer into a file, all the control-m’s are output as newlines. This means that when you next read in the file, it looks OK, with nothing hidden. The selective display effect is seen only within Emacs.
This buffer-local variable enables selective display. This means that lines, or portions of lines, may be made hidden.
selective-display
is t
, then the character
control-m marks the start of hidden text; the control-m, and the rest
of the line following it, are not displayed. This is explicit selective
display.
selective-display
is a positive integer, then
lines that start with more than that many columns of indentation are not
displayed.
When some portion of a buffer is hidden, the vertical movement
commands operate as if that portion did not exist, allowing a single
next-line
command to skip any number of hidden lines.
However, character movement commands (such as forward-char
) do
not skip the hidden portion, and it is possible (if tricky) to insert
or delete text in an hidden portion.
In the examples below, we show the display appearance of the
buffer foo
, which changes with the value of
selective-display
. The contents of the buffer do not
change.
(setq selective-display nil) ⇒ nil ---------- Buffer: foo ---------- 1 on this column 2on this column 3n this column 3n this column 2on this column 1 on this column ---------- Buffer: foo ----------
(setq selective-display 2) ⇒ 2 ---------- Buffer: foo ---------- 1 on this column 2on this column 2on this column 1 on this column ---------- Buffer: foo ----------
If this buffer-local variable is non-nil
, then Emacs displays
‘…’ at the end of a line that is followed by hidden text.
This example is a continuation of the previous one.
(setq selective-display-ellipses t) ⇒ t ---------- Buffer: foo ---------- 1 on this column 2on this column ... 2on this column 1 on this column ---------- Buffer: foo ----------
You can use a display table to substitute other text for the ellipsis (‘…’). See section Display Tables.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Temporary displays are used by Lisp programs to put output into a buffer and then present it to the user for perusal rather than for editing. Many help commands use this feature.
This function executes the forms in body while arranging to insert
any output they print into the buffer named buffer-name, which is
first created if necessary, and put into Help mode. (See the similar
form with-temp-buffer-window
below.) Finally, the buffer is
displayed in some window, but that window is not selected.
If the forms in body do not change the major mode in the output
buffer, so that it is still Help mode at the end of their execution,
then with-output-to-temp-buffer
makes this buffer read-only at
the end, and also scans it for function and variable names to make them
into clickable cross-references. See Tips for
Documentation Strings, in particular the item on hyperlinks in
documentation strings, for more details.
The string buffer-name specifies the temporary buffer, which need
not already exist. The argument must be a string, not a buffer. The
buffer is erased initially (with no questions asked), and it is marked
as unmodified after with-output-to-temp-buffer
exits.
with-output-to-temp-buffer
binds standard-output
to the
temporary buffer, then it evaluates the forms in body. Output
using the Lisp output functions within body goes by default to
that buffer (but screen display and messages in the echo area, although
they are “output” in the general sense of the word, are not affected).
See section Output Functions.
Several hooks are available for customizing the behavior of this construct; they are listed below.
The value of the last form in body is returned.
---------- Buffer: foo ---------- This is the contents of foo. ---------- Buffer: foo ----------
(with-output-to-temp-buffer "foo" (print 20) (print standard-output)) ⇒ #<buffer foo> ---------- Buffer: foo ---------- 20 #<buffer foo> ---------- Buffer: foo ----------
If this variable is non-nil
, with-output-to-temp-buffer
calls it as a function to do the job of displaying a help buffer. The
function gets one argument, which is the buffer it should display.
It is a good idea for this function to run temp-buffer-show-hook
just as with-output-to-temp-buffer
normally would, inside of
save-selected-window
and with the chosen window and buffer
selected.
This normal hook is run by with-output-to-temp-buffer
before
evaluating body. When the hook runs, the temporary buffer is
current. This hook is normally set up with a function to put the
buffer in Help mode.
This normal hook is run by with-output-to-temp-buffer
after
displaying the temporary buffer. When the hook runs, the temporary buffer
is current, and the window it was displayed in is selected.
This macro is similar to with-output-to-temp-buffer
. Like that
construct, it executes body while arranging to insert any output
it prints into the buffer named buffer-or-name and displays that
buffer in some window. Unlike with-output-to-temp-buffer
,
however, it does not automatically switch that buffer to Help mode.
Like with-output-to-temp-buffer
it neither makes the buffer
specified by buffer-or-name current when executing body.
The otherwise identical macro with-current-buffer-window
can be
used to execute body with that buffer current.
The argument buffer-or-name specifies the temporary buffer. It
can be either a buffer, which must already exist, or a string, in which
case a buffer of that name is created, if necessary. The buffer is
marked as unmodified and read-only when with-temp-buffer-window
exits.
This macro does not call temp-buffer-show-function
. Rather, it
passes the action argument to display-buffer
in order to
display the buffer.
The value of the last form in body is returned, unless the argument quit-function is specified. In that case, it is called with two arguments: the window showing the buffer and the result of body. The final return value is then whatever quit-function returns.
This macro uses the normal hooks temp-buffer-window-setup-hook
and temp-buffer-window-show-hook
in place of the analogous hooks
run by with-output-to-temp-buffer
.
This function momentarily displays string in the current buffer at position. It has no effect on the undo list or on the buffer’s modification status.
The momentary display remains until the next input event. If the next
input event is char, momentary-string-display
ignores it
and returns. Otherwise, that event remains buffered for subsequent use
as input. Thus, typing char will simply remove the string from
the display, while typing (say) C-f will remove the string from
the display and later (presumably) move point forward. The argument
char is a space by default.
The return value of momentary-string-display
is not meaningful.
If the string string does not contain control characters, you can
do the same job in a more general way by creating (and then subsequently
deleting) an overlay with a before-string
property.
See section Overlay Properties.
If message is non-nil
, it is displayed in the echo area
while string is displayed in the buffer. If it is nil
, a
default message says to type char to continue.
In this example, point is initially located at the beginning of the second line:
---------- Buffer: foo ---------- This is the contents of foo. ∗Second line. ---------- Buffer: foo ----------
(momentary-string-display "**** Important Message! ****" (point) ?\r "Type RET when done reading") ⇒ t
---------- Buffer: foo ---------- This is the contents of foo. **** Important Message! ****Second line. ---------- Buffer: foo ---------- ---------- Echo Area ---------- Type RET when done reading ---------- Echo Area ----------
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use overlays to alter the appearance of a buffer’s text on the screen, for the sake of presentation features. An overlay is an object that belongs to a particular buffer, and has a specified beginning and end. It also has properties that you can examine and set; these affect the display of the text within the overlay.
The visual effect of an overlay is the same as of the corresponding text property (see section Text Properties). However, due to a different implementation, overlays generally don’t scale well (many operations take a time that is proportional to the number of overlays in the buffer). If you need to affect the visual appearance of many portions in the buffer, we recommend using text properties.
An overlay uses markers to record its beginning and end; thus, editing the text of the buffer adjusts the beginning and end of each overlay so that it stays with the text. When you create the overlay, you can specify whether text inserted at the beginning should be inside the overlay or outside, and likewise for the end of the overlay.
37.9.1 Managing Overlays | Creating and moving overlays. | |
37.9.2 Overlay Properties | How to read and set properties. What properties do to the screen display. | |
37.9.3 Searching for Overlays | Searching for overlays. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the functions to create, delete and move overlays, and to examine their contents. Overlay changes are not recorded in the buffer’s undo list, since the overlays are not part of the buffer’s contents.
This function returns t
if object is an overlay.
This function creates and returns an overlay that belongs to buffer and ranges from start to end. Both start and end must specify buffer positions; they may be integers or markers. If buffer is omitted, the overlay is created in the current buffer.
The arguments front-advance and rear-advance specify the
marker insertion type for the start of the overlay and for the end of
the overlay, respectively. See section Marker Insertion Types. If they
are both nil
, the default, then the overlay extends to include
any text inserted at the beginning, but not text inserted at the end.
If front-advance is non-nil
, text inserted at the
beginning of the overlay is excluded from the overlay. If
rear-advance is non-nil
, text inserted at the end of the
overlay is included in the overlay.
This function returns the position at which overlay starts, as an integer.
This function returns the position at which overlay ends, as an integer.
This function returns the buffer that overlay belongs to. It
returns nil
if overlay has been deleted.
This function deletes overlay. The overlay continues to exist as a Lisp object, and its property list is unchanged, but it ceases to be attached to the buffer it belonged to, and ceases to have any effect on display.
A deleted overlay is not permanently disconnected. You can give it a
position in a buffer again by calling move-overlay
.
This function moves overlay to buffer, and places its bounds at start and end. Both arguments start and end must specify buffer positions; they may be integers or markers.
If buffer is omitted, overlay stays in the same buffer it was already associated with; if overlay was deleted, it goes into the current buffer.
The return value is overlay.
This is the only valid way to change the endpoints of an overlay. Do not try modifying the markers in the overlay by hand, as that fails to update other vital data structures and can cause some overlays to be “lost”.
This function removes all the overlays between start and end whose property name has the value value. It can move the endpoints of the overlays in the region, or split them.
If name is omitted or nil
, it means to delete all overlays in
the specified region. If start and/or end are omitted or
nil
, that means the beginning and end of the buffer respectively.
Therefore, (remove-overlays)
removes all the overlays in the
current buffer.
This function returns a copy of overlay. The copy has the same endpoints and properties as overlay. However, the marker insertion type for the start of the overlay and for the end of the overlay are set to their default values (see section Marker Insertion Types).
Here are some examples:
;; Create an overlay. (setq foo (make-overlay 1 10)) ⇒ #<overlay from 1 to 10 in display.texi> (overlay-start foo) ⇒ 1 (overlay-end foo) ⇒ 10 (overlay-buffer foo) ⇒ #<buffer display.texi> ;; Give it a property we can check later. (overlay-put foo 'happy t) ⇒ t ;; Verify the property is present. (overlay-get foo 'happy) ⇒ t ;; Move the overlay. (move-overlay foo 5 20) ⇒ #<overlay from 5 to 20 in display.texi> (overlay-start foo) ⇒ 5 (overlay-end foo) ⇒ 20 ;; Delete the overlay. (delete-overlay foo) ⇒ nil ;; Verify it is deleted. foo ⇒ #<overlay in no buffer> ;; A deleted overlay has no position. (overlay-start foo) ⇒ nil (overlay-end foo) ⇒ nil (overlay-buffer foo) ⇒ nil ;; Undelete the overlay. (move-overlay foo 1 20) ⇒ #<overlay from 1 to 20 in display.texi> ;; Verify the results. (overlay-start foo) ⇒ 1 (overlay-end foo) ⇒ 20 (overlay-buffer foo) ⇒ #<buffer display.texi> ;; Moving and deleting the overlay does not change its properties. (overlay-get foo 'happy) ⇒ t
Emacs stores the overlays of each buffer in two lists, divided around an arbitrary “center position”. One list extends backwards through the buffer from that center position, and the other extends forwards from that center position. The center position can be anywhere in the buffer.
This function recenters the overlays of the current buffer around position pos. That makes overlay lookup faster for positions near pos, but slower for positions far away from pos.
A loop that scans the buffer forwards, creating overlays, can run
faster if you do (overlay-recenter (point-max))
first.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Overlay properties are like text properties in that the properties that alter how a character is displayed can come from either source. But in most respects they are different. See section Text Properties, for comparison.
Text properties are considered a part of the text; overlays and their properties are specifically considered not to be part of the text. Thus, copying text between various buffers and strings preserves text properties, but does not try to preserve overlays. Changing a buffer’s text properties marks the buffer as modified, while moving an overlay or changing its properties does not. Unlike text property changes, overlay property changes are not recorded in the buffer’s undo list.
Since more than one overlay can specify a property value for the same character, Emacs lets you specify a priority value of each overlay. In case two overlays have the same priority value, and one is nested in the other, then the inner one will have priority over the outer one. If neither is nested in the other then you should not make assumptions about which overlay will prevail.
These functions read and set the properties of an overlay:
This function returns the value of property prop recorded in
overlay, if any. If overlay does not record any value for
that property, but it does have a category
property which is a
symbol, that symbol’s prop property is used. Otherwise, the value
is nil
.
This function sets the value of property prop recorded in overlay to value. It returns value.
This returns a copy of the property list of overlay.
See also the function get-char-property
which checks both
overlay properties and text properties for a given character.
See section Examining Text Properties.
Many overlay properties have special meanings; here is a table of them:
priority
This property’s value determines the priority of the overlay.
If you want to specify a priority value, use either nil
(or zero), or a positive integer. Any other value has undefined behavior.
The priority matters when two or more overlays cover the same
character and both specify the same property; the one whose
priority
value is larger overrides the other. For the
face
property, the higher priority overlay’s value does not
completely override the other value; instead, its face attributes
override the face attributes of the lower priority face
property.
Currently, all overlays take priority over text properties.
Note that Emacs sometimes uses non-numeric priority values for some of
its internal overlays, so do not try to do arithmetic on the
priority of an overlay (unless it is one that you created). If you
need to put overlays in priority order, use the sorted argument
of overlays-at
. See section Searching for Overlays.
window
If the window
property is non-nil
, then the overlay
applies only on that window.
category
If an overlay has a category
property, we call it the
category of the overlay. It should be a symbol. The properties
of the symbol serve as defaults for the properties of the overlay.
face
This property controls the appearance of the text (see section Faces). The value of the property can be the following:
(keyword
value …)
, where each keyword is a face attribute
name and value is a value for that attribute.
(foreground-color . color-name)
or (background-color . color-name)
. This specifies the
foreground or background color, similar to (:foreground
color-name)
or (:background color-name)
. This
form is supported for backward compatibility only, and should be
avoided.
mouse-face
This property is used instead of face
when the mouse is within
the range of the overlay. However, Emacs ignores all face attributes
from this property that alter the text size (e.g., :height
,
:weight
, and :slant
). Those attributes are always the
same as in the unhighlighted text.
display
This property activates various features that change the
way text is displayed. For example, it can make text appear taller
or shorter, higher or lower, wider or narrower, or replaced with an image.
See section The display
Property.
help-echo
If an overlay has a help-echo
property, then when you move the
mouse onto the text in the overlay, Emacs displays a help string in the
echo area, or in the tooltip window. For details see Text help-echo.
field
Consecutive characters with the same field
property constitute a
field. Some motion functions including forward-word
and
beginning-of-line
stop moving at a field boundary.
See section Defining and Using Fields.
modification-hooks
This property’s value is a list of functions to be called if any character within the overlay is changed or if text is inserted strictly within the overlay.
The hook functions are called both before and after each change. If the functions save the information they receive, and compare notes between calls, they can determine exactly what change has been made in the buffer text.
When called before a change, each function receives four arguments: the
overlay, nil
, and the beginning and end of the text range to be
modified.
When called after a change, each function receives five arguments: the
overlay, t
, the beginning and end of the text range just
modified, and the length of the pre-change text replaced by that range.
(For an insertion, the pre-change length is zero; for a deletion, that
length is the number of characters deleted, and the post-change
beginning and end are equal.)
If these functions modify the buffer, they should bind
inhibit-modification-hooks
to t
around doing so, to
avoid confusing the internal mechanism that calls these hooks.
Text properties also support the modification-hooks
property,
but the details are somewhat different (see section Properties with Special Meanings).
insert-in-front-hooks
This property’s value is a list of functions to be called before and
after inserting text right at the beginning of the overlay. The calling
conventions are the same as for the modification-hooks
functions.
insert-behind-hooks
This property’s value is a list of functions to be called before and
after inserting text right at the end of the overlay. The calling
conventions are the same as for the modification-hooks
functions.
invisible
The invisible
property can make the text in the overlay
invisible, which means that it does not appear on the screen.
See section Invisible Text, for details.
intangible
The intangible
property on an overlay works just like the
intangible
text property. See section Properties with Special Meanings, for details.
isearch-open-invisible
This property tells incremental search how to make an invisible overlay visible, permanently, if the final match overlaps it. See section Invisible Text.
isearch-open-invisible-temporary
This property tells incremental search how to make an invisible overlay visible, temporarily, during the search. See section Invisible Text.
before-string
This property’s value is a string to add to the display at the beginning of the overlay. The string does not appear in the buffer in any sense—only on the screen.
after-string
This property’s value is a string to add to the display at the end of the overlay. The string does not appear in the buffer in any sense—only on the screen.
line-prefix
This property specifies a display spec to prepend to each non-continuation line at display-time. See section Truncation.
wrap-prefix
This property specifies a display spec to prepend to each continuation line at display-time. See section Truncation.
evaporate
If this property is non-nil
, the overlay is deleted automatically
if it becomes empty (i.e., if its length becomes zero). If you give
an empty overlay a non-nil
evaporate
property, that deletes
it immediately.
keymap
If this property is non-nil
, it specifies a keymap for a portion of the
text. This keymap is used when the character after point is within the
overlay, and takes precedence over most other keymaps. See section Active Keymaps.
local-map
The local-map
property is similar to keymap
but replaces the
buffer’s local map rather than augmenting existing keymaps. This also means it
has lower precedence than minor mode keymaps.
The keymap
and local-map
properties do not affect a
string displayed by the before-string
, after-string
, or
display
properties. This is only relevant for mouse clicks and
other mouse events that fall on the string, since point is never on
the string. To bind special mouse events for the string, assign it a
keymap
or local-map
text property. See section Properties with Special Meanings.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function returns a list of all the overlays that cover the character at
position pos in the current buffer. If sorted is non-nil
,
the list is in decreasing order of priority, otherwise it is in no particular
order. An overlay contains position pos if it begins at or before
pos, and ends after pos.
To illustrate usage, here is a Lisp function that returns a list of the overlays that specify property prop for the character at point:
(defun find-overlays-specifying (prop) (let ((overlays (overlays-at (point))) found) (while overlays (let ((overlay (car overlays))) (if (overlay-get overlay prop) (setq found (cons overlay found)))) (setq overlays (cdr overlays))) found))
This function returns a list of the overlays that overlap the region beg through end. “Overlap” means that at least one character is contained within the overlay and also contained within the specified region; however, empty overlays are included in the result if they are located at beg, strictly between beg and end, or at end when end denotes the position at the end of the buffer.
This function returns the buffer position of the next beginning or end
of an overlay, after pos. If there is none, it returns
(point-max)
.
This function returns the buffer position of the previous beginning or
end of an overlay, before pos. If there is none, it returns
(point-min)
.
As an example, here’s a simplified (and inefficient) version of the
primitive function next-single-char-property-change
(see section Text Property Search Functions). It searches forward from position
pos for the next position where the value of a given property
prop
, as obtained from either overlays or text properties,
changes.
(defun next-single-char-property-change (position prop) (save-excursion (goto-char position) (let ((propval (get-char-property (point) prop))) (while (and (not (eobp)) (eq (get-char-property (point) prop) propval)) (goto-char (min (next-overlay-change (point)) (next-single-property-change (point) prop))))) (point)))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Since not all characters have the same width, these functions let you check the width of a character. See section Indentation Primitives, and Motion by Screen Lines, for related functions.
This function returns the width in columns of the character
char, if it were displayed in the current buffer (i.e., taking
into account the buffer’s display table, if any; see section Display Tables). The width of a tab character is usually tab-width
(see section Usual Display Conventions).
This function returns the width in columns of the string string, if it were displayed in the current buffer and the selected window.
This function returns the part of string that fits within width columns, as a new string.
If string does not reach width, then the result ends where string ends. If one multi-column character in string extends across the column width, that character is not included in the result. Thus, the result can fall short of width but cannot go beyond it.
The optional argument start-column specifies the starting column.
If this is non-nil
, then the first start-column columns of
the string are omitted from the value. If one multi-column character in
string extends across the column start-column, that
character is not included.
The optional argument padding, if non-nil
, is a padding
character added at the beginning and end of the result string, to extend
it to exactly width columns. The padding character is used at the
end of the result if it falls short of width. It is also used at
the beginning of the result if one multi-column character in
string extends across the column start-column.
If ellipsis is non-nil
, it should be a string which will
replace the end of string (including any padding) if it extends
beyond width, unless the display width of string is equal
to or less than the display width of ellipsis. If
ellipsis is non-nil
and not a string, it stands for
"..."
.
(truncate-string-to-width "\tab\t" 12 4) ⇒ "ab" (truncate-string-to-width "\tab\t" 12 4 ?\s) ⇒ " ab "
The following function returns the size in pixels of text as if it were
displayed in a given window. This function is used by
fit-window-to-buffer
(see section Resizing Windows) and
fit-frame-to-buffer
(see section Frame Size And Position) to make a window
exactly as large as the text it contains.
This function returns the size of the text of window’s buffer in pixels. window must be a live window and defaults to the selected one. The return value is a cons of the maximum pixel-width of any text line and the maximum pixel-height of all text lines.
The optional argument from, if non-nil
, specifies the first
text position to consider and defaults to the minimum accessible
position of the buffer. If from is t
, it uses the minimum
accessible position that is not a newline character. The optional
argument to, if non-nil
, specifies the last text position
to consider and defaults to the maximum accessible position of the
buffer. If to is t
, it uses the maximum accessible
position that is not a newline character.
The optional argument x-limit, if non-nil
, specifies the
maximum pixel-width that can be returned. x-limit nil
or
omitted, means to use the pixel-width of window’s body
(see section Window Sizes); this is useful when the caller does not intend
to change the width of window. Otherwise, the caller should
specify here the maximum width window’s body may assume. Text
whose x-coordinate is beyond x-limit is ignored. Since
calculating the width of long lines can take some time, it’s always a
good idea to make this argument as small as needed; in particular, if
the buffer might contain long lines that will be truncated anyway.
The optional argument y-limit, if non-nil
, specifies the
maximum pixel-height that can be returned. Text lines whose
y-coordinate is beyond y-limit are ignored. Since calculating the
pixel-height of a large buffer can take some time, it makes sense to
specify this argument; in particular, if the caller does not know the
size of the buffer.
The optional argument mode-and-header-line nil
or omitted
means to not include the height of the mode- or header-line of
window in the return value. If it is either the symbol
mode-line
or header-line
, include only the height of that
line, if present, in the return value. If it is t
, include the
height of both, if present, in the return value.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The total height of each display line consists of the height of the contents of the line, plus optional additional vertical line spacing above or below the display line.
The height of the line contents is the maximum height of any character or image on that display line, including the final newline if there is one. (A display line that is continued doesn’t include a final newline.) That is the default line height, if you do nothing to specify a greater height. (In the most common case, this equals the height of the default frame font.)
There are several ways to explicitly specify a larger line height, either by specifying an absolute height for the display line, or by specifying vertical space. However, no matter what you specify, the actual line height can never be less than the default.
A newline can have a line-height
text or overlay property
that controls the total height of the display line ending in that
newline.
If the property value is t
, the newline character has no
effect on the displayed height of the line—the visible contents
alone determine the height. This is useful for tiling small images
(or image slices) without adding blank areas between the images.
If the property value is a list of the form (height
total)
, that adds extra space below the display line.
First Emacs uses height as a height spec to control extra space
above the line; then it adds enough space below the line
to bring the total line height up to total. In this case, the
other ways to specify the line spacing are ignored.
Any other kind of property value is a height spec, which translates into a number—the specified line height. There are several ways to write a height spec; here’s how each of them translates into a number:
integer
If the height spec is a positive integer, the height value is that integer.
float
If the height spec is a float, float, the numeric height value is float times the frame’s default line height.
(face . ratio)
If the height spec is a cons of the format shown, the numeric height
is ratio times the height of face face. ratio can
be any type of number, or nil
which means a ratio of 1.
If face is t
, it refers to the current face.
(nil . ratio)
If the height spec is a cons of the format shown, the numeric height is ratio times the height of the contents of the line.
Thus, any valid height spec determines the height in pixels, one way or another. If the line contents’ height is less than that, Emacs adds extra vertical space above the line to achieve the specified total height.
If you don’t specify the line-height
property, the line’s
height consists of the contents’ height plus the line spacing.
There are several ways to specify the line spacing for different
parts of Emacs text.
On graphical terminals, you can specify the line spacing for all
lines in a frame, using the line-spacing
frame parameter
(see section Layout Parameters). However, if the default value of
line-spacing
is non-nil
, it overrides the
frame’s line-spacing
parameter. An integer specifies the
number of pixels put below lines. A floating-point number specifies
the spacing relative to the frame’s default line height.
You can specify the line spacing for all lines in a buffer via the
buffer-local line-spacing
variable. An integer specifies
the number of pixels put below lines. A floating-point number
specifies the spacing relative to the default frame line height. This
overrides line spacings specified for the frame.
Finally, a newline can have a line-spacing
text or overlay
property that overrides the default frame line spacing and the buffer
local line-spacing
variable, for the display line ending in
that newline.
One way or another, these mechanisms specify a Lisp value for the spacing of each line. The value is a height spec, and it translates into a Lisp value as described above. However, in this case the numeric height value specifies the line spacing, rather than the line height.
On text terminals, the line spacing cannot be altered.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A face is a collection of graphical attributes for displaying text: font, foreground color, background color, optional underlining, etc. Faces control how Emacs displays text in buffers, as well as other parts of the frame such as the mode line.
One way to represent a face is as a property list of attributes,
like (:foreground "red" :weight bold)
. Such a list is called
an anonymous face. For example, you can assign an anonymous
face as the value of the face
text property, and Emacs will
display the underlying text with the specified attributes.
See section Properties with Special Meanings.
More commonly, a face is referred to via a face name: a Lisp
symbol associated with a set of face attributes19. Named faces are
defined using the defface
macro (see section Defining Faces).
Emacs comes with several standard named faces (see section Basic Faces).
Many parts of Emacs required named faces, and do not accept
anonymous faces. These include the functions documented in
Face Attribute Functions, and the variable font-lock-keywords
(see section Search-based Fontification). Unless otherwise stated, we
will use the term face to refer only to named faces.
This function returns a non-nil
value if object is a
named face: a Lisp symbol or string which serves as a face name.
Otherwise, it returns nil
.
37.12.1 Face Attributes | What is in a face? | |
37.12.2 Defining Faces | How to define a face. | |
37.12.3 Face Attribute Functions | Functions to examine and set face attributes. | |
37.12.4 Displaying Faces | How Emacs combines the faces specified for a character. | |
37.12.5 Face Remapping | Remapping faces to alternative definitions. | |
37.12.6 Functions for Working with Faces | How to define and examine faces. | |
37.12.7 Automatic Face Assignment | Hook for automatic face assignment. | |
37.12.8 Basic Faces | Faces that are defined by default. | |
37.12.9 Font Selection | Finding the best available font for a face. | |
37.12.10 Looking Up Fonts | Looking up the names of available fonts and information about them. | |
37.12.11 Fontsets | A fontset is a collection of fonts that handle a range of character sets. | |
37.12.12 Low-Level Font Representation | Lisp representation for character display fonts. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Face attributes determine the visual appearance of a face. The following table lists all the face attributes, their possible values, and their effects.
Apart from the values given below, each face attribute can have the
value unspecified
. This special value means that the face
doesn’t specify that attribute directly. An unspecified
attribute tells Emacs to refer instead to a parent face (see the
description :inherit
attribute below); or, failing that, to an
underlying face (see section Displaying Faces). The default
face
must specify all attributes.
Some of these attributes are meaningful only on certain kinds of displays. If your display cannot handle a certain attribute, the attribute is ignored.
:family
Font family or fontset (a string). See Fonts in The GNU
Emacs Manual, for more information about font families. The function
font-family-list
(see below) returns a list of available family
names. See section Fontsets, for information about fontsets.
:foundry
The name of the font foundry for the font family specified by
the :family
attribute (a string). See Fonts in The
GNU Emacs Manual.
:width
Relative character width. This should be one of the symbols
ultra-condensed
, extra-condensed
, condensed
,
semi-condensed
, normal
, semi-expanded
,
expanded
, extra-expanded
, or ultra-expanded
.
:height
The height of the font. In the simplest case, this is an integer in units of 1/10 point.
The value can also be floating point or a function, which specifies the height relative to an underlying face (see section Displaying Faces). A floating-point value specifies the amount by which to scale the height of the underlying face. A function value is called with one argument, the height of the underlying face, and returns the height of the new face. If the function is passed an integer argument, it must return an integer.
The height of the default face must be specified using an integer; floating point and function values are not allowed.
:weight
Font weight—one of the symbols (from densest to faintest)
ultra-bold
, extra-bold
, bold
, semi-bold
,
normal
, semi-light
, light
, extra-light
, or
ultra-light
. On text terminals which support
variable-brightness text, any weight greater than normal is displayed
as extra bright, and any weight less than normal is displayed as
half-bright.
:slant
Font slant—one of the symbols italic
, oblique
,
normal
, reverse-italic
, or reverse-oblique
. On
text terminals that support variable-brightness text, slanted text is
displayed as half-bright.
:foreground
Foreground color, a string. The value can be a system-defined color name, or a hexadecimal color specification. See section Color Names. On black-and-white displays, certain shades of gray are implemented by stipple patterns.
:distant-foreground
Alternative foreground color, a string. This is like :foreground
but the color is only used as a foreground when the background color is
near to the foreground that would have been used. This is useful for
example when marking text (i.e. the region face). If the text has a foreground
that is visible with the region face, that foreground is used.
If the foreground is near the region face background,
:distant-foreground
is used instead so the text is readable.
:background
Background color, a string. The value can be a system-defined color name, or a hexadecimal color specification. See section Color Names.
:underline
Whether or not characters should be underlined, and in what
way. The possible values of the :underline
attribute are:
nil
Don’t underline.
t
Underline with the foreground color of the face.
Underline in color color, a string specifying a color.
(:color color :style style)
color is either a string, or the symbol foreground-color
,
meaning the foreground color of the face. Omitting the attribute
:color
means to use the foreground color of the face.
style should be a symbol line
or wave
, meaning to
use a straight or wavy line. Omitting the attribute :style
means to use a straight line.
:overline
Whether or not characters should be overlined, and in what color.
If the value is t
, overlining uses the foreground color of the
face. If the value is a string, overlining uses that color. The
value nil
means do not overline.
:strike-through
Whether or not characters should be strike-through, and in what
color. The value is used like that of :overline
.
:box
Whether or not a box should be drawn around characters, its color, the
width of the box lines, and 3D appearance. Here are the possible
values of the :box
attribute, and what they mean:
nil
Don’t draw a box.
t
Draw a box with lines of width 1, in the foreground color.
Draw a box with lines of width 1, in color color.
(:line-width width :color color :style style)
This way you can explicitly specify all aspects of the box. The value width specifies the width of the lines to draw; it defaults to 1. A negative width -n means to draw a line of width n that occupies the space of the underlying text, thus avoiding any increase in the character height or width.
The value color specifies the color to draw with. The default is the foreground color of the face for simple boxes, and the background color of the face for 3D boxes.
The value style specifies whether to draw a 3D box. If it is
released-button
, the box looks like a 3D button that is not being
pressed. If it is pressed-button
, the box looks like a 3D button
that is being pressed. If it is nil
or omitted, a plain 2D box
is used.
:inverse-video
Whether or not characters should be displayed in inverse video. The
value should be t
(yes) or nil
(no).
:stipple
The background stipple, a bitmap.
The value can be a string; that should be the name of a file containing
external-format X bitmap data. The file is found in the directories
listed in the variable x-bitmap-file-path
.
Alternatively, the value can specify the bitmap directly, with a list
of the form (width height data)
. Here,
width and height specify the size in pixels, and
data is a string containing the raw bits of the bitmap, row by
row. Each row occupies (width + 7) / 8 consecutive bytes
in the string (which should be a unibyte string for best results).
This means that each row always occupies at least one whole byte.
If the value is nil
, that means use no stipple pattern.
Normally you do not need to set the stipple attribute, because it is used automatically to handle certain shades of gray.
:font
The font used to display the face. Its value should be a font object. See section Low-Level Font Representation, for information about font objects, font specs, and font entities.
When specifying this attribute using set-face-attribute
(see section Face Attribute Functions), you may also supply a font spec, a font
entity, or a string. Emacs converts such values to an appropriate
font object, and stores that font object as the actual attribute
value. If you specify a string, the contents of the string should be
a font name (see Fonts in The GNU Emacs Manual); if the
font name is an XLFD containing wildcards, Emacs chooses the first
font matching those wildcards. Specifying this attribute also changes
the values of the :family
, :foundry
, :width
,
:height
, :weight
, and :slant
attributes.
:inherit
The name of a face from which to inherit attributes, or a list of face names. Attributes from inherited faces are merged into the face like an underlying face would be, with higher priority than underlying faces (see section Displaying Faces). If a list of faces is used, attributes from faces earlier in the list override those from later faces.
This function returns a list of available font family names. The
optional argument frame specifies the frame on which the text is
to be displayed; if it is nil
, the selected frame is used.
This variable specifies the minimum distance between the baseline and the underline, in pixels, when displaying underlined text.
This variable specifies a list of directories for searching
for bitmap files, for the :stipple
attribute.
This returns t
if object is a valid bitmap specification,
suitable for use with :stipple
(see above). It returns
nil
otherwise.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The usual way to define a face is through the defface
macro.
This macro associates a face name (a symbol) with a default face
spec. A face spec is a construct which specifies what attributes a
face should have on any given terminal; for example, a face spec might
specify one foreground color on high-color terminals, and a different
foreground color on low-color terminals.
People are sometimes tempted to create a variable whose value is a
face name. In the vast majority of cases, this is not necessary; the
usual procedure is to define a face with defface
, and then use
its name directly.
This macro declares face as a named face whose default face spec
is given by spec. You should not quote the symbol face,
and it should not end in ‘-face’ (that would be redundant). The
argument doc is a documentation string for the face. The
additional keyword arguments have the same meanings as in
defgroup
and defcustom
(see section Common Item Keywords).
If face already has a default face spec, this macro does nothing.
The default face spec determines face’s appearance when no customizations are in effect (see section Customization Settings). If face has already been customized (via Custom themes or via customizations read from the init file), its appearance is determined by the custom face spec(s), which override the default face spec spec. However, if the customizations are subsequently removed, the appearance of face will again be determined by its default face spec.
As an exception, if you evaluate a defface
form with
C-M-x in Emacs Lisp mode (eval-defun
), a special feature
of eval-defun
overrides any custom face specs on the face,
causing the face to reflect exactly what the defface
says.
The spec argument is a face spec, which states how the face should appear on different kinds of terminals. It should be an alist whose elements each have the form
(display . plist)
display specifies a class of terminals (see below). plist
is a property list of face attributes and their values, specifying how
the face appears on such terminals. For backward compatibility, you
can also write an element as (display plist)
.
The display part of an element of spec determines which terminals the element matches. If more than one element of spec matches a given terminal, the first element that matches is the one used for that terminal. There are three possibilities for display:
default
This element of spec doesn’t match any terminal; instead, it specifies defaults that apply to all terminals. This element, if used, must be the first element of spec. Each of the following elements can override any or all of these defaults.
t
This element of spec matches all terminals. Therefore, any
subsequent elements of spec are never used. Normally t
is used in the last (or only) element of spec.
If display is a list, each element should have the form
(characteristic value…)
. Here
characteristic specifies a way of classifying terminals, and the
values are possible classifications which display should
apply to. Here are the possible values of characteristic:
type
The kind of window system the terminal uses—either graphic
(any graphics-capable display), x
, pc
(for the MS-DOS
console), w32
(for MS Windows 9X/NT/2K/XP), or tty
(a
non-graphics-capable display). See section window-system.
class
What kinds of colors the terminal supports—either color
,
grayscale
, or mono
.
background
The kind of background—either light
or dark
.
min-colors
An integer that represents the minimum number of colors the terminal
should support. This matches a terminal if its
display-color-cells
value is at least the specified integer.
supports
Whether or not the terminal can display the face attributes given in value… (see section Face Attributes). See Display Face Attribute Testing, for more information on exactly how this testing is done.
If an element of display specifies more than one value for a given characteristic, any of those values is acceptable. If display has more than one element, each element should specify a different characteristic; then each characteristic of the terminal must match one of the values specified for it in display.
For example, here’s the definition of the standard face
highlight
:
(defface highlight '((((class color) (min-colors 88) (background light)) :background "darkseagreen2") (((class color) (min-colors 88) (background dark)) :background "darkolivegreen") (((class color) (min-colors 16) (background light)) :background "darkseagreen2") (((class color) (min-colors 16) (background dark)) :background "darkolivegreen") (((class color) (min-colors 8)) :background "green" :foreground "black") (t :inverse-video t)) "Basic face for highlighting." :group 'basic-faces)
Internally, Emacs stores each face’s default spec in its
face-defface-spec
symbol property (see section Symbol Properties).
The saved-face
property stores any face spec saved by the user
using the customization buffer; the customized-face
property
stores the face spec customized for the current session, but not
saved; and the theme-face
property stores an alist associating
the active customization settings and Custom themes with the face
specs for that face. The face’s documentation string is stored in the
face-documentation
property.
Normally, a face is declared just once, using defface
, and
any further changes to its appearance are applied using the Customize
framework (e.g., via the Customize user interface or via the
custom-set-faces
function; see section Applying Customizations), or
by face remapping (see section Face Remapping). In the rare event that
you need to change a face spec directly from Lisp, you can use the
face-spec-set
function.
This function applies spec as a face spec for face
.
spec should be a face spec, as described in the above
documentation for defface
.
This function also defines face as a valid face name if it is not already one, and (re)calculates its attributes on existing frames.
The argument spec-type determines which spec to set. If it is
nil
or face-override-spec
, this function sets the
override spec, which overrides over all other face specs on
face. If it is customized-face
or saved-face
,
this function sets the customized spec or the saved custom spec. If
it is face-defface-spec
, this function sets the default face
spec (the same one set by defface
). If it is reset
,
this function clears out all customization specs and override specs
from face (in this case, the value of spec is ignored).
Any other value of spec-type is reserved for internal use.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions for directly accessing and modifying the attributes of a named face.
This function returns the value of the attribute attribute for face on frame.
If frame is nil
, that means the selected frame
(see section Input Focus). If frame is t
, this function
returns the value of the specified attribute for newly-created frames
(this is normally unspecified
, unless you have specified some
value using set-face-attribute
; see below).
If inherit is nil
, only attributes directly defined by
face are considered, so the return value may be
unspecified
, or a relative value. If inherit is
non-nil
, face’s definition of attribute is merged
with the faces specified by its :inherit
attribute; however the
return value may still be unspecified
or relative. If
inherit is a face or a list of faces, then the result is further
merged with that face (or faces), until it becomes specified and
absolute.
To ensure that the return value is always specified and absolute, use
a value of default
for inherit; this will resolve any
unspecified or relative values by merging with the default
face
(which is always completely specified).
For example,
(face-attribute 'bold :weight) ⇒ bold
This function returns non-nil
if value, when used as the
value of the face attribute attribute, is relative. This means
it would modify, rather than completely override, any value that comes
from a subsequent face in the face list or that is inherited from
another face.
unspecified
is a relative value for all attributes. For
:height
, floating point and function values are also relative.
For example:
(face-attribute-relative-p :height 2.0) ⇒ t
This function returns an alist of attributes of face. The
elements of the result are name-value pairs of the form
(attr-name . attr-value)
. Optional argument
frame specifies the frame whose definition of face to
return; if omitted or nil
, the returned value describes the
default attributes of face for newly created frames.
If value1 is a relative value for the face attribute attribute, returns it merged with the underlying value value2; otherwise, if value1 is an absolute value for the face attribute attribute, returns value1 unchanged.
Normally, Emacs uses the face specs of each face to automatically
calculate its attributes on each frame (see section Defining Faces). The
function set-face-attribute
can override this calculation by
directly assigning attributes to a face, either on a specific frame or
for all frames. This function is mostly intended for internal usage.
This function sets one or more attributes of face for frame. The attributes specifies in this way override the face spec(s) belonging to face.
The extra arguments arguments specify the attributes to set, and
the values for them. They should consist of alternating attribute
names (such as :family
or :underline
) and values. Thus,
(set-face-attribute 'foo nil :weight 'bold :slant 'italic)
sets the attribute :weight
to bold
and the attribute
:slant
to italic
.
If frame is t
, this function sets the default attributes
for newly created frames. If frame is nil
, this function
sets the attributes for all existing frames, as well as for newly
created frames.
The following commands and functions mostly provide compatibility
with old versions of Emacs. They work by calling
set-face-attribute
. Values of t
and nil
for
their frame argument are handled just like
set-face-attribute
and face-attribute
. The commands
read their arguments using the minibuffer, if called interactively.
These set the :foreground
attribute (or :background
attribute, respectively) of face to color.
This sets the :stipple
attribute of face to
pattern.
This sets the :font
attribute of face to font.
This sets the :weight
attribute of face to normal
if bold-p is nil
, and to bold otherwise.
This sets the :slant
attribute of face to normal if
italic-p is nil
, and to italic otherwise.
This sets the :underline
attribute of face to
underline.
This sets the :inverse-video
attribute of face to
inverse-video-p.
This swaps the foreground and background colors of face face.
The following functions examine the attributes of a face. They
mostly provide compatibility with old versions of Emacs. If you don’t
specify frame, they refer to the selected frame; t
refers
to the default data for new frames. They return unspecified
if
the face doesn’t define any value for that attribute. If
inherit is nil
, only an attribute directly defined by the
face is returned. If inherit is non-nil
, any faces
specified by its :inherit
attribute are considered as well, and
if inherit is a face or a list of faces, then they are also
considered, until a specified attribute is found. To ensure that the
return value is always specified, use a value of default
for
inherit.
This function returns the name of the font of face face.
These functions return the foreground color (or background color, respectively) of face face, as a string.
This function returns the name of the background stipple pattern of face
face, or nil
if it doesn’t have one.
This function returns a non-nil
value if the :weight
attribute of face is bolder than normal (i.e., one of
semi-bold
, bold
, extra-bold
, or
ultra-bold
). Otherwise, it returns nil
.
This function returns a non-nil
value if the :slant
attribute of face is italic
or oblique
, and
nil
otherwise.
This function returns non-nil
if face face specifies
a non-nil
:underline
attribute.
This function returns non-nil
if face face specifies
a non-nil
:inverse-video
attribute.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs displays a given piece of text, the visual appearance of the text may be determined by faces drawn from different sources. If these various sources together specify more than one face for a particular character, Emacs merges the attributes of the various faces. Here is the order in which Emacs merges the faces, from highest to lowest priority:
region
face. See Standard Faces in The GNU Emacs
Manual.
nil
face
property, Emacs applies the face(s) specified by that property. If
the overlay has a mouse-face
property and the mouse is “near
enough” to the overlay, Emacs applies the face or face attributes
specified by the mouse-face
property instead. See section Overlay Properties.
When multiple overlays cover one character, an overlay with higher priority overrides those with lower priority. See section Overlays.
face
or mouse-face
property,
Emacs applies the specified faces and face attributes. See section Properties with Special Meanings. (This is how Font Lock mode faces are applied.
See section Font Lock Mode.)
mode-line
face. For the mode line of a
non-selected window, Emacs applies the mode-line-inactive
face.
For a header line, Emacs applies the header-line
face.
default
face.
At each stage, if a face has a valid :inherit
attribute,
Emacs treats any attribute with an unspecified
value as having
the corresponding value drawn from the parent face(s). see section Face Attributes. Note that the parent face(s) may also leave the
attribute unspecified; in that case, the attribute remains unspecified
at the next level of face merging.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The variable face-remapping-alist
is used for buffer-local or
global changes in the appearance of a face. For instance, it is used
to implement the text-scale-adjust
command (see Text
Scale in The GNU Emacs Manual).
The value of this variable is an alist whose elements have the form
(face . remapping)
. This causes Emacs to display
any text having the face face with remapping, rather than
the ordinary definition of face.
remapping may be any face spec suitable for a face
text
property: either a face (i.e., a face name or a property list of
attribute/value pairs), or a list of faces. For details, see the
description of the face
text property in Properties with Special Meanings. remapping serves as the complete specification for
the remapped face—it replaces the normal definition of face,
instead of modifying it.
If face-remapping-alist
is buffer-local, its local value takes
effect only within that buffer.
Note: face remapping is non-recursive. If remapping references
the same face name face, either directly or via the
:inherit
attribute of some other face in remapping, that
reference uses the normal definition of face. For instance, if
the mode-line
face is remapped using this entry in
face-remapping-alist
:
(mode-line italic mode-line)
then the new definition of the mode-line
face inherits from the
italic
face, and the normal (non-remapped) definition of
mode-line
face.
The following functions implement a higher-level interface to
face-remapping-alist
. Most Lisp code should use these
functions instead of setting face-remapping-alist
directly, to
avoid trampling on remappings applied elsewhere. These functions are
intended for buffer-local remappings, so they all make
face-remapping-alist
buffer-local as a side-effect. They manage
face-remapping-alist
entries of the form
(face relative-spec-1 relative-spec-2 ... base-spec)
where, as explained above, each of the relative-spec-N and
base-spec is either a face name, or a property list of
attribute/value pairs. Each of the relative remapping entries,
relative-spec-N, is managed by the
face-remap-add-relative
and face-remap-remove-relative
functions; these are intended for simple modifications like changing
the text size. The base remapping entry, base-spec, has
the lowest priority and is managed by the face-remap-set-base
and face-remap-reset-base
functions; it is intended for major
modes to remap faces in the buffers they control.
This function adds the face spec in specs as relative remappings for face face in the current buffer. The remaining arguments, specs, should form either a list of face names, or a property list of attribute/value pairs.
The return value is a Lisp object that serves as a “cookie”; you can
pass this object as an argument to face-remap-remove-relative
if you need to remove the remapping later.
;; Remap the `escape-glyph' face into a combination ;; of the `highlight' and `italic' faces: (face-remap-add-relative 'escape-glyph 'highlight 'italic) ;; Increase the size of the `default' face by 50%: (face-remap-add-relative 'default :height 1.5)
This function removes a relative remapping previously added by
face-remap-add-relative
. cookie should be the Lisp
object returned by face-remap-add-relative
when the remapping
was added.
This function sets the base remapping of face in the current
buffer to specs. If specs is empty, the default base
remapping is restored, similar to calling face-remap-reset-base
(see below); note that this is different from specs containing a
single value nil
, which has the opposite result (the global
definition of face is ignored).
This overwrites the default base-spec, which inherits the global face definition, so it is up to the caller to add such inheritance if so desired.
This function sets the base remapping of face to its default value, which inherits from face’s global definition.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are additional functions for creating and working with faces.
This function returns a list of all defined face names.
This function returns the face number of face face. This is a number that uniquely identifies a face at low levels within Emacs. It is seldom necessary to refer to a face by its face number.
This function returns the documentation string of face face, or
nil
if none was specified for it.
This returns t
if the faces face1 and face2 have the
same attributes for display.
This returns non-nil
if the face face displays
differently from the default face.
A face alias provides an equivalent name for a face. You can
define a face alias by giving the alias symbol the face-alias
property, with a value of the target face name. The following example
makes modeline
an alias for the mode-line
face.
(put 'modeline 'face-alias 'mode-line)
This macro defines obsolete-face
as an alias for
current-face, and also marks it as obsolete, indicating that it
may be removed in future. when should be a string indicating
when obsolete-face
was made obsolete (usually a version number
string).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This hook is used for automatically assigning faces to text in the buffer. It is part of the implementation of Jit-Lock mode, used by Font-Lock.
This variable holds a list of functions that are called by Emacs
redisplay as needed, just before doing redisplay. They are called even
when Font Lock Mode isn’t enabled. When Font Lock Mode is enabled, this
variable usually holds just one function, jit-lock-function
.
The functions are called in the order listed, with one argument, a buffer position pos. Collectively they should attempt to assign faces to the text in the current buffer starting at pos.
The functions should record the faces they assign by setting the
face
property. They should also add a non-nil
fontified
property to all the text they have assigned faces to.
That property tells redisplay that faces have been assigned to that text
already.
It is probably a good idea for the functions to do nothing if the
character after pos already has a non-nil
fontified
property, but this is not required. If one function overrides the
assignments made by a previous one, the properties after the last
function finishes are the ones that really matter.
For efficiency, we recommend writing these functions so that they usually assign faces to around 400 to 600 characters at each call.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If your Emacs Lisp program needs to assign some faces to text, it is often a good idea to use certain existing faces or inherit from them, rather than defining entirely new faces. This way, if other users have customized the basic faces to give Emacs a certain look, your program will “fit in” without additional customization.
Some of the basic faces defined in Emacs are listed below. In addition to these, you might want to make use of the Font Lock faces for syntactic highlighting, if highlighting is not already handled by Font Lock mode, or if some Font Lock faces are not in use. See section Faces for Font Lock.
default
The default face, whose attributes are all specified. All other faces implicitly inherit from it: any unspecified attribute defaults to the attribute on this face (see section Face Attributes).
bold
italic
bold-italic
underline
fixed-pitch
variable-pitch
These have the attributes indicated by their names (e.g., bold
has a bold :weight
attribute), with all other attributes
unspecified (and so given by default
).
shadow
For “dimmed out” text. For example, it is used for the ignored part of a filename in the minibuffer (see Minibuffers for File Names in The GNU Emacs Manual).
link
link-visited
For clickable text buttons that send the user to a different buffer or “location”.
highlight
For stretches of text that should temporarily stand out. For example,
it is commonly assigned to the mouse-face
property for cursor
highlighting (see section Properties with Special Meanings).
match
For text matching a search command.
error
warning
success
For text concerning errors, warnings, or successes. For example, these are used for messages in *Compilation* buffers.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Before Emacs can draw a character on a graphical display, it must
select a font for that character20. See Fonts in The GNU Emacs Manual. Normally,
Emacs automatically chooses a font based on the faces assigned to that
character—specifically, the face attributes :family
,
:weight
, :slant
, and :width
(see section Face Attributes). The choice of font also depends on the character to be
displayed; some fonts can only display a limited set of characters.
If no available font exactly fits the requirements, Emacs looks for
the closest matching font. The variables in this section
control how Emacs makes this selection.
If a given family is specified but does not exist, this variable specifies alternative font families to try. Each element should have this form:
(family alternate-families…)
If family is specified but not available, Emacs will try the other families given in alternate-families, one by one, until it finds a family that does exist.
If there is no font that exactly matches all desired face attributes
(:width
, :height
, :weight
, and :slant
),
this variable specifies the order in which these attributes should be
considered when selecting the closest matching font. The value should
be a list containing those four attribute symbols, in order of
decreasing importance. The default is (:width :height :weight
:slant)
.
Font selection first finds the best available matches for the first attribute in the list; then, among the fonts which are best in that way, it searches for the best matches in the second attribute, and so on.
The attributes :weight
and :width
have symbolic values in
a range centered around normal
. Matches that are more extreme
(farther from normal
) are somewhat preferred to matches that are
less extreme (closer to normal
); this is designed to ensure that
non-normal faces contrast with normal ones, whenever possible.
One example of a case where this variable makes a difference is when the
default font has no italic equivalent. With the default ordering, the
italic
face will use a non-italic font that is similar to the
default one. But if you put :slant
before :height
, the
italic
face will use an italic font, even if its height is not
quite right.
This variable lets you specify alternative font registries to try, if a given registry is specified and doesn’t exist. Each element should have this form:
(registry alternate-registries…)
If registry is specified but not available, Emacs will try the other registries given in alternate-registries, one by one, until it finds a registry that does exist.
Emacs can make use of scalable fonts, but by default it does not use them.
This variable controls which scalable fonts to use. A value of
nil
, the default, means do not use scalable fonts. t
means to use any scalable font that seems appropriate for the text.
Otherwise, the value must be a list of regular expressions. Then a scalable font is enabled for use if its name matches any regular expression in the list. For example,
(setq scalable-fonts-allowed '("iso10646-1$"))
allows the use of scalable fonts with registry iso10646-1
.
This variable specifies scaling for certain faces. Its value should be a list of elements of the form
(fontname-regexp . scale-factor)
If fontname-regexp matches the font name that is about to be used, this says to choose a larger similar font according to the factor scale-factor. You would use this feature to normalize the font size if certain fonts are bigger or smaller than their nominal heights and widths would suggest.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function returns a list of available font names that match name. name should be a string containing a font name in either the Fontconfig, GTK, or XLFD format (see Fonts in The GNU Emacs Manual). Within an XLFD string, wildcard characters may be used: the ‘*’ character matches any substring, and the ‘?’ character matches any single character. Case is ignored when matching font names.
If the optional arguments reference-face and frame are specified, the returned list includes only fonts that are the same size as reference-face (a face name) currently is on the frame frame.
The optional argument maximum sets a limit on how many fonts to
return. If it is non-nil
, then the return value is truncated
after the first maximum matching fonts. Specifying a small
value for maximum can make this function much faster, in cases
where many fonts match the pattern.
The optional argument width specifies a desired font width. If
it is non-nil
, the function only returns those fonts whose
characters are (on average) width times as wide as
reference-face.
This function returns a list describing the available fonts for family
family on frame. If family is omitted or nil
,
this list applies to all families, and therefore, it contains all
available fonts. Otherwise, family must be a string; it may
contain the wildcards ‘?’ and ‘*’.
The list describes the display that frame is on; if frame is
omitted or nil
, it applies to the selected frame’s display
(see section Input Focus).
Each element in the list is a vector of the following form:
[family width point-size weight slant fixed-p full registry-and-encoding]
The first five elements correspond to face attributes; if you specify these attributes for a face, it will use this font.
The last three elements give additional information about the font.
fixed-p is non-nil
if the font is fixed-pitch.
full is the full name of the font, and
registry-and-encoding is a string giving the registry and
encoding of the font.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A fontset is a list of fonts, each assigned to a range of character codes. An individual font cannot display the whole range of characters that Emacs supports, but a fontset can. Fontsets have names, just as fonts do, and you can use a fontset name in place of a font name when you specify the “font” for a frame or a face. Here is information about defining a fontset under Lisp program control.
This function defines a new fontset according to the specification string fontset-spec. The string should have this format:
fontpattern, [charset:font]…
Whitespace characters before and after the commas are ignored.
The first part of the string, fontpattern, should have the form of a standard X font name, except that the last two fields should be ‘fontset-alias’.
The new fontset has two names, one long and one short. The long name is
fontpattern in its entirety. The short name is
‘fontset-alias’. You can refer to the fontset by either
name. If a fontset with the same name already exists, an error is
signaled, unless noerror is non-nil
, in which case this
function does nothing.
If optional argument style-variant-p is non-nil
, that says
to create bold, italic and bold-italic variants of the fontset as well.
These variant fontsets do not have a short name, only a long one, which
is made by altering fontpattern to indicate the bold and/or italic
status.
The specification string also says which fonts to use in the fontset. See below for the details.
The construct ‘charset:font’ specifies which font to use (in this fontset) for one particular character set. Here, charset is the name of a character set, and font is the font to use for that character set. You can use this construct any number of times in the specification string.
For the remaining character sets, those that you don’t specify explicitly, Emacs chooses a font based on fontpattern: it replaces ‘fontset-alias’ with a value that names one character set. For the ASCII character set, ‘fontset-alias’ is replaced with ‘ISO8859-1’.
In addition, when several consecutive fields are wildcards, Emacs collapses them into a single wildcard. This is to prevent use of auto-scaled fonts. Fonts made by scaling larger fonts are not usable for editing, and scaling a smaller font is not useful because it is better to use the smaller font in its own size, which Emacs does.
Thus if fontpattern is this,
-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24
the font specification for ASCII characters would be this:
-*-fixed-medium-r-normal-*-24-*-ISO8859-1
and the font specification for Chinese GB2312 characters would be this:
-*-fixed-medium-r-normal-*-24-*-gb2312*-*
You may not have any Chinese font matching the above font specification. Most X distributions include only Chinese fonts that have ‘song ti’ or ‘fangsong ti’ in the family field. In such a case, ‘Fontset-n’ can be specified as below:
Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\ chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*
Then, the font specifications for all but Chinese GB2312 characters have ‘fixed’ in the family field, and the font specification for Chinese GB2312 characters has a wild card ‘*’ in the family field.
This function modifies the existing fontset name to use the font matching with font-spec for the character character.
If name is nil
, this function modifies the fontset of the
selected frame or that of frame if frame is not
nil
.
If name is t
, this function modifies the default
fontset, whose short name is ‘fontset-default’.
character may be a cons; (from . to)
, where
from and to are character codepoints. In that case, use
font-spec for all characters in the range from and to
(inclusive).
character may be a charset. In that case, use font-spec for all character in the charsets.
character may be a script name. In that case, use font-spec for all character in the charsets.
font-spec may be a cons; (family . registry)
,
where family is a family name of a font (possibly including a
foundry name at the head), registry is a registry name of a font
(possibly including an encoding name at the tail).
font-spec may be a font name string.
The optional argument add, if non-nil
, specifies how to
add font-spec to the font specifications previously set. If it
is prepend
, font-spec is prepended. If it is
append
, font-spec is appended. By default,
font-spec overrides the previous settings.
For instance, this changes the default fontset to use a font of which
family name is ‘Kochi Gothic’ for all characters belonging to
the charset japanese-jisx0208
.
(set-fontset-font t 'japanese-jisx0208 (font-spec :family "Kochi Gothic"))
This function returns t
if Emacs ought to be able to display
char. More precisely, if the selected frame’s fontset has a
font to display the character set that char belongs to.
Fontsets can specify a font on a per-character basis; when the fontset does that, this function’s value may not be accurate.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Normally, it is not necessary to manipulate fonts directly. In case you need to do so, this section explains how.
In Emacs Lisp, fonts are represented using three different Lisp object types: font objects, font specs, and font entities.
Return t
if object is a font object, font spec, or font
entity. Otherwise, return nil
.
The optional argument type, if non-nil
, determines the
exact type of Lisp object to check for. In that case, type
should be one of font-object
, font-spec
, or
font-entity
.
A font object is a Lisp object that represents a font that Emacs has opened. Font objects cannot be modified in Lisp, but they can be inspected.
Return the font object that is being used to display the character at
position position in the window window. If window
is nil
, it defaults to the selected window. If string is
nil
, position specifies a position in the current buffer;
otherwise, string should be a string, and position
specifies a position in that string.
A font spec is a Lisp object that contains a set of specifications that can be used to find a font. More than one font may match the specifications in a font spec.
Return a new font spec using the specifications in arguments,
which should come in property
-value
pairs. The possible
specifications are as follows:
:name
The font name (a string), in either XLFD, Fontconfig, or GTK format. See Fonts in The GNU Emacs Manual.
:family
:foundry
:weight
:slant
:width
These have the same meanings as the face attributes of the same name. See section Face Attributes.
:size
The font size—either a non-negative integer that specifies the pixel size, or a floating-point number that specifies the point size.
:adstyle
Additional typographic style information for the font, such as ‘sans’. The value should be a string or a symbol.
:registry
The charset registry and encoding of the font, such as ‘iso8859-1’. The value should be a string or a symbol.
:script
The script that the font must support (a symbol).
:otf
The font must be an OpenType font that supports these OpenType features, provided Emacs is compiled with support for ‘libotf’ (a library for performing complex text layout in certain scripts). The value must be a list of the form
(script-tag langsys-tag gsub gpos)
where script-tag is the OpenType script tag symbol;
langsys-tag is the OpenType language system tag symbol, or
nil
to use the default language system; gsub
is a list
of OpenType GSUB feature tag symbols, or nil
if none is
required; and gpos
is a list of OpenType GPOS feature tag
symbols, or nil
if none is required. If gsub
or
gpos
is a list, a nil
element in that list means that
the font must not match any of the remaining tag symbols. The
gpos
element may be omitted.
Set the font property property in the font-spec font-spec to value.
A font entity is a reference to a font that need not be open. Its properties are intermediate between a font object and a font spec: like a font object, and unlike a font spec, it refers to a single, specific font. Unlike a font object, creating a font entity does not load the contents of that font into computer memory. Emacs may open multiple font objects of different sizes from a single font entity referring to a scalable font.
This function returns a font entity that best matches the font spec
font-spec on frame frame. If frame is nil
,
it defaults to the selected frame.
This function returns a list of all font entities that match the font spec font-spec.
The optional argument frame, if non-nil
, specifies the
frame on which the fonts are to be displayed. The optional argument
num, if non-nil
, should be an integer that specifies the
maximum length of the returned list. The optional argument
prefer, if non-nil
, should be another font spec, which is
used to control the order of the returned list; the returned font
entities are sorted in order of decreasing “closeness” to that font
spec.
If you call set-face-attribute
and pass a font spec, font
entity, or font name string as the value of the :font
attribute, Emacs opens the best “matching” font that is available
for display. It then stores the corresponding font object as the
actual value of the :font
attribute for that face.
The following functions can be used to obtain information about a font. For these functions, the font argument can be a font object, a font entity, or a font spec.
This function returns the value of the font property property for font.
If font is a font spec and the font spec does not specify
property, the return value is nil
. If font is a
font object or font entity, the value for the :script property
may be a list of scripts supported by the font.
This function returns a list of face attributes corresponding to
font. The optional argument frame specifies the frame on
which the font is to be displayed. If it is nil
, the selected
frame is used. The return value has the form
(:family family :height height :weight weight :slant slant :width width)
where the values of family, height, weight, slant, and width are face attribute values. Some of these key-attribute pairs may be omitted from the list if they are not specified by font.
This function returns the XLFD (X Logical Font Descriptor), a string,
matching font. See Fonts in The GNU Emacs Manual, for
information about XLFDs. If the name is too long for an XLFD (which
can contain at most 255 characters), the function returns nil
.
If the optional argument fold-wildcards is non-nil
,
consecutive wildcards in the XLFD are folded into one.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
On graphical displays, Emacs draws fringes next to each window: thin vertical strips down the sides which can display bitmaps indicating truncation, continuation, horizontal scrolling, and so on.
37.13.1 Fringe Size and Position | Specifying where to put the window fringes. | |
37.13.2 Fringe Indicators | Displaying indicator icons in the window fringes. | |
37.13.3 Fringe Cursors | Displaying cursors in the right fringe. | |
37.13.4 Fringe Bitmaps | Specifying bitmaps for fringe indicators. | |
37.13.5 Customizing Fringe Bitmaps | Specifying your own bitmaps to use in the fringes. | |
37.13.6 The Overlay Arrow | Display of an arrow to indicate position. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following buffer-local variables control the position and width of fringes in windows showing that buffer.
The fringes normally appear between the display margins and the window
text. If the value is non-nil
, they appear outside the display
margins. See section Displaying in the Margins.
This variable, if non-nil
, specifies the width of the left
fringe in pixels. A value of nil
means to use the left fringe
width from the window’s frame.
This variable, if non-nil
, specifies the width of the right
fringe in pixels. A value of nil
means to use the right fringe
width from the window’s frame.
Any buffer which does not specify values for these variables uses
the values specified by the left-fringe
and right-fringe
frame parameters (see section Layout Parameters).
The above variables actually take effect via the function
set-window-buffer
(see section Buffers and Windows), which calls
set-window-fringes
as a subroutine. If you change one of these
variables, the fringe display is not updated in existing windows
showing the buffer, unless you call set-window-buffer
again in
each affected window. You can also use set-window-fringes
to
control the fringe display in individual windows.
This function sets the fringe widths of window window.
If window is nil
, the selected window is used.
The argument left specifies the width in pixels of the left
fringe, and likewise right for the right fringe. A value of
nil
for either one stands for the default width. If
outside-margins is non-nil
, that specifies that fringes
should appear outside of the display margins.
This function returns information about the fringes of a window
window. If window is omitted or nil
, the selected
window is used. The value has the form (left-width
right-width outside-margins)
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Fringe indicators are tiny icons displayed in the window fringe to indicate truncated or continued lines, buffer boundaries, etc.
When this is non-nil
, Emacs displays a special glyph in the
fringe of each empty line at the end of the buffer, on graphical
displays. See section Fringes. This variable is automatically
buffer-local in every buffer.
This buffer-local variable controls how the buffer boundaries and window scrolling are indicated in the window fringes.
Emacs can indicate the buffer boundaries—that is, the first and last line in the buffer—with angle icons when they appear on the screen. In addition, Emacs can display an up-arrow in the fringe to show that there is text above the screen, and a down-arrow to show there is text below the screen.
There are three kinds of basic values:
nil
Don’t display any of these fringe icons.
left
Display the angle icons and arrows in the left fringe.
right
Display the angle icons and arrows in the right fringe.
Display the angle icons in the left fringe and don’t display the arrows.
Otherwise the value should be an alist that specifies which fringe
indicators to display and where. Each element of the alist should
have the form (indicator . position)
. Here,
indicator is one of top
, bottom
, up
,
down
, and t
(which covers all the icons not yet
specified), while position is one of left
, right
and nil
.
For example, ((top . left) (t . right))
places the top angle
bitmap in left fringe, and the bottom angle bitmap as well as both
arrow bitmaps in right fringe. To show the angle bitmaps in the left
fringe, and no arrow bitmaps, use ((top . left) (bottom . left))
.
This buffer-local variable specifies the mapping from logical fringe
indicators to the actual bitmaps displayed in the window fringes. The
value is an alist of elements (indicator
. bitmaps)
, where indicator specifies a logical indicator
type and bitmaps specifies the fringe bitmaps to use for that
indicator.
Each indicator should be one of the following symbols:
truncation
, continuation
.Used for truncation and continuation lines.
up
, down
, top
, bottom
, top-bottom
Used when indicate-buffer-boundaries
is non-nil
:
up
and down
indicate a buffer boundary lying above or
below the window edge; top
and bottom
indicate the
topmost and bottommost buffer text line; and top-bottom
indicates where there is just one line of text in the buffer.
empty-line
Used to indicate empty lines when indicate-empty-lines
is
non-nil
.
overlay-arrow
Used for overlay arrows (see section The Overlay Arrow).
Each bitmaps value may be a list of symbols (left
right [left1 right1])
. The left and
right symbols specify the bitmaps shown in the left and/or right
fringe, for the specific indicator. left1 and right1 are
specific to the bottom
and top-bottom
indicators, and
are used to indicate that the last text line has no final newline.
Alternatively, bitmaps may be a single symbol which is used in
both left and right fringes.
See section Fringe Bitmaps, for a list of standard bitmap symbols and how
to define your own. In addition, nil
represents the empty
bitmap (i.e., an indicator that is not shown).
When fringe-indicator-alist
has a buffer-local value, and
there is no bitmap defined for a logical indicator, or the bitmap is
t
, the corresponding value from the default value of
fringe-indicator-alist
is used.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When a line is exactly as wide as the window, Emacs displays the cursor in the right fringe instead of using two lines. Different bitmaps are used to represent the cursor in the fringe depending on the current buffer’s cursor type.
If this is non-nil
, lines exactly as wide as the window (not
counting the final newline character) are not continued. Instead,
when point is at the end of the line, the cursor appears in the right
fringe.
This variable specifies the mapping from logical cursor type to the
actual fringe bitmaps displayed in the right fringe. The value is an
alist where each element has the form (cursor-type
. bitmap)
, which means to use the fringe bitmap bitmap to
display cursors of type cursor-type.
Each cursor-type should be one of box
, hollow
,
bar
, hbar
, or hollow-small
. The first four have
the same meanings as in the cursor-type
frame parameter
(see section Cursor Parameters). The hollow-small
type is used
instead of hollow
when the normal hollow-rectangle
bitmap is too tall to fit on a specific display line.
Each bitmap should be a symbol specifying the fringe bitmap to be displayed for that logical cursor type. See section Fringe Bitmaps.
When fringe-cursor-alist
has a buffer-local value, and there is
no bitmap defined for a cursor type, the corresponding value from the
default value of fringes-indicator-alist
is used.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The fringe bitmaps are the actual bitmaps which represent the
logical fringe indicators for truncated or continued lines, buffer
boundaries, overlay arrows, etc. Each bitmap is represented by a
symbol.
These symbols are referred to by the variable
fringe-indicator-alist
, which maps fringe indicators to bitmaps
(see section Fringe Indicators), and the variable
fringe-cursor-alist
, which maps fringe cursors to bitmaps
(see section Fringe Cursors).
Lisp programs can also directly display a bitmap in the left or
right fringe, by using a display
property for one of the
characters appearing in the line (see section Other Display Specifications). Such
a display specification has the form
(fringe bitmap [face])
fringe is either the symbol left-fringe
or
right-fringe
. bitmap is a symbol identifying the bitmap
to display. The optional face names a face whose foreground
color is used to display the bitmap; this face is automatically merged
with the fringe
face.
Here is a list of the standard fringe bitmaps defined in Emacs, and
how they are currently used in Emacs (via
fringe-indicator-alist
and fringe-cursor-alist
):
left-arrow
, right-arrow
Used to indicate truncated lines.
left-curly-arrow
, right-curly-arrow
Used to indicate continued lines.
right-triangle
, left-triangle
The former is used by overlay arrows. The latter is unused.
up-arrow
, down-arrow
, top-left-angle
top-right-angle
bottom-left-angle
, bottom-right-angle
top-right-angle
, top-left-angle
left-bracket
, right-bracket
, top-right-angle
, top-left-angle
Used to indicate buffer boundaries.
filled-rectangle
, hollow-rectangle
filled-square
, hollow-square
vertical-bar
, horizontal-bar
Used for different types of fringe cursors.
empty-line
, exclamation-mark
, question-mark
, exclamation-mark
Not used by core Emacs features.
The next subsection describes how to define your own fringe bitmaps.
This function returns the fringe bitmaps of the display line
containing position pos in window window. The return
value has the form (left right ov)
, where left
is the symbol for the fringe bitmap in the left fringe (or nil
if no bitmap), right is similar for the right fringe, and ov
is non-nil
if there is an overlay arrow in the left fringe.
The value is nil
if pos is not visible in window.
If window is nil
, that stands for the selected window.
If pos is nil
, that stands for the value of point in
window.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function defines the symbol bitmap as a new fringe bitmap, or replaces an existing bitmap with that name.
The argument bits specifies the image to use. It should be either a string or a vector of integers, where each element (an integer) corresponds to one row of the bitmap. Each bit of an integer corresponds to one pixel of the bitmap, where the low bit corresponds to the rightmost pixel of the bitmap.
The height is normally the length of bits. However, you
can specify a different height with non-nil
height. The width
is normally 8, but you can specify a different width with non-nil
width. The width must be an integer between 1 and 16.
The argument align specifies the positioning of the bitmap
relative to the range of rows where it is used; the default is to
center the bitmap. The allowed values are top
, center
,
or bottom
.
The align argument may also be a list (align
periodic)
where align is interpreted as described above.
If periodic is non-nil
, it specifies that the rows in
bits
should be repeated enough times to reach the specified
height.
This function destroy the fringe bitmap identified by bitmap. If bitmap identifies a standard fringe bitmap, it actually restores the standard definition of that bitmap, instead of eliminating it entirely.
This sets the face for the fringe bitmap bitmap to face.
If face is nil
, it selects the fringe
face. The
bitmap’s face controls the color to draw it in.
face is merged with the fringe
face, so normally
face should specify only the foreground color.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The overlay arrow is useful for directing the user’s attention to a particular line in a buffer. For example, in the modes used for interface to debuggers, the overlay arrow indicates the line of code about to be executed. This feature has nothing to do with overlays (see section Overlays).
This variable holds the string to display to call attention to a
particular line, or nil
if the arrow feature is not in use.
On a graphical display the contents of the string are ignored; instead a
glyph is displayed in the fringe area to the left of the display area.
This variable holds a marker that indicates where to display the overlay arrow. It should point at the beginning of a line. On a non-graphical display the arrow text appears at the beginning of that line, overlaying any text that would otherwise appear. Since the arrow is usually short, and the line usually begins with indentation, normally nothing significant is overwritten.
The overlay-arrow string is displayed in any given buffer if the value
of overlay-arrow-position
in that buffer points into that
buffer. Thus, it is possible to display multiple overlay arrow strings
by creating buffer-local bindings of overlay-arrow-position
.
However, it is usually cleaner to use
overlay-arrow-variable-list
to achieve this result.
You can do a similar job by creating an overlay with a
before-string
property. See section Overlay Properties.
You can define multiple overlay arrows via the variable
overlay-arrow-variable-list
.
This variable’s value is a list of variables, each of which specifies
the position of an overlay arrow. The variable
overlay-arrow-position
has its normal meaning because it is on
this list.
Each variable on this list can have properties
overlay-arrow-string
and overlay-arrow-bitmap
that
specify an overlay arrow string (for text terminals) or fringe bitmap
(for graphical terminals) to display at the corresponding overlay
arrow position. If either property is not set, the default
overlay-arrow-string
or overlay-arrow
fringe indicator
is used.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Normally the frame parameter vertical-scroll-bars
controls
whether the windows in the frame have vertical scroll bars, and
whether they are on the left or right. The frame parameter
scroll-bar-width
specifies how wide they are (nil
meaning the default). See section Layout Parameters.
This function reports the scroll bar type settings for frame
frame. The value is a cons cell
(vertical-type . horizontal-type)
, where
vertical-type is either left
, right
, or nil
(which means no scroll bar.) horizontal-type is meant to
specify the horizontal scroll bar type, but since they are not
implemented, it is always nil
.
You can enable or disable scroll bars for a particular buffer,
by setting the variable vertical-scroll-bar
. This variable
automatically becomes buffer-local when set. The possible values are
left
, right
, t
, which means to use the
frame’s default, and nil
for no scroll bar.
You can also control this for individual windows. Call the function
set-window-scroll-bars
to specify what to do for a specific window:
This function sets the width and type of scroll bars for window window.
width specifies the scroll bar width in pixels (nil
means
use the width specified for the frame). vertical-type specifies
whether to have a vertical scroll bar and, if so, where. The possible
values are left
, right
and nil
, just like the
values of the vertical-scroll-bars
frame parameter.
The argument horizontal-type is meant to specify whether and
where to have horizontal scroll bars, but since they are not
implemented, it has no effect. If window is nil
, the
selected window is used.
Report the width and type of scroll bars specified for window.
If window is omitted or nil
, the selected window is used.
The value is a list of the form (width
cols vertical-type horizontal-type)
. The value
width is the value that was specified for the width (which may
be nil
); cols is the number of columns that the scroll
bar actually occupies.
horizontal-type is not actually meaningful.
This function returns the width in pixels of window’s vertical scrollbar. window must be a live window, and defaults to the selected window.
If you don’t specify these values for a window with
set-window-scroll-bars
, the buffer-local variables
scroll-bar-mode
and scroll-bar-width
in the buffer being
displayed control the window’s vertical scroll bars. The function
set-window-buffer
examines these variables. If you change them
in a buffer that is already visible in a window, you can make the
window take note of the new values by calling set-window-buffer
specifying the same buffer that is already displayed.
This variable, always local in all buffers, controls whether and where
to put scroll bars in windows displaying the buffer. The possible values
are nil
for no scroll bar, left
to put a scroll bar on
the left, and right
to put a scroll bar on the right.
This function reports the scroll bar type for window window.
If window is omitted or nil
, the selected window is used.
The value is a cons cell
(vertical-type . horizontal-type)
. Unlike
window-scroll-bars
, this reports the scroll bar type actually
used, once frame defaults and scroll-bar-mode
are taken into
account.
This variable, always local in all buffers, specifies the width of the
buffer’s scroll bars, measured in pixels. A value of nil
means
to use the value specified by the frame.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Window dividers are bars drawn between a frame’s windows. A “right”
divider is drawn between a window and any adjacent windows on the right.
Its width (thickness) is specified by the frame parameter
right-divider-width
. A “bottom” divider is drawn between a
window and adjacent windows on the bottom or the echo area. Its width
is specified by the frame parameter bottom-divider-width
. In
either case, specifying a width of zero means to not draw such dividers.
See section Layout Parameters.
Technically, a right divider “belongs” to the window on its left, which means that its width contributes to the total width of that window. A bottom divider “belongs” to the window above it, which means that its width contributes to the total height of that window. See section Window Sizes. When a window has both, a right and a bottom divider, the bottom divider “prevails”. This means that a bottom divider is drawn over the full total width of its window while the right divider ends above the bottom divider.
Dividers can be dragged with the mouse and are therefore useful for adjusting the sizes of adjacent windows with the mouse. They also serve to visually set apart adjacent windows when no scroll bars or mode lines are present. The following three faces allow to customize the appearance of dividers:
window-divider
When a divider is less than three pixels wide, it is drawn solidly with the foreground of this face. For larger dividers this face is used for the inner part only, excluding the first and last pixel.
window-divider-first-pixel
This is the face used for drawing the first pixel of a divider that is
at least three pixels wide. To obtain a solid appearance, set this to
the same value used for the window-divider
face.
window-divider-last-pixel
This is the face used for drawing the last pixel of a divider that is at
least three pixels wide. To obtain a solid appearance, set this to the
same value used for the window-divider
face.
You can get the sizes of the dividers of a specific window with the following two functions.
Return the width (thickness) in pixels of window’s right divider. window must be a live window and defaults to the selected one. The return value is always zero for a rightmost window.
Return the width (thickness) in pixels of window’s bottom divider. window must be a live window and defaults to the selected one. The return value is zero for the minibuffer window or a bottommost window on a minibuffer-less frame.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
display
PropertyThe display
text property (or overlay property) is used to
insert images into text, and to control other aspects of how text
displays. The value of the display
property should be a
display specification, or a list or vector containing several display
specifications. Display specifications in the same display
property value generally apply in parallel to the text they cover.
If several sources (overlays and/or a text property) specify values
for the display
property, only one of the values takes effect,
following the rules of get-char-property
. See section Examining Text Properties.
The rest of this section describes several kinds of display specifications and what they mean.
37.16.1 Display Specs That Replace The Text | Display specs that replace the text. | |
37.16.2 Specified Spaces | Displaying one space with a specified width. | |
37.16.3 Pixel Specification for Spaces | Specifying space width or height in pixels. | |
37.16.4 Other Display Specifications | Displaying an image; adjusting the height, spacing, and other properties of text. | |
37.16.5 Displaying in the Margins | Displaying text or images to the side of the main text. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some kinds of display specifications specify something to display instead of the text that has the property. These are called replacing display specifications. Emacs does not allow the user to interactively move point into the middle of buffer text that is replaced in this way.
If a list of display specifications includes more than one replacing display specification, the first overrides the rest. Replacing display specifications make most other display specifications irrelevant, since those don’t apply to the replacement.
For replacing display specifications, “the text that has the
property” means all the consecutive characters that have the same
Lisp object as their display
property; these characters are
replaced as a single unit. If two characters have different Lisp
objects as their display
properties (i.e., objects which are
not eq
), they are handled separately.
Here is an example which illustrates this point. A string serves as a replacing display specification, which replaces the text that has the property with the specified string (see section Other Display Specifications). Consider the following function:
(defun foo () (dotimes (i 5) (let ((string (concat "A")) (start (+ i i (point-min)))) (put-text-property start (1+ start) 'display string) (put-text-property start (+ 2 start) 'display string))))
This function gives each of the first ten characters in the buffer a
display
property which is a string "A"
, but they don’t
all get the same string object. The first two characters get the same
string object, so they are replaced with one ‘A’; the fact that
the display property was assigned in two separate calls to
put-text-property
is irrelevant. Similarly, the next two
characters get a second string (concat
creates a new string
object), so they are replaced with one ‘A’; and so on. Thus, the
ten characters appear as five A’s.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To display a space of specified width and/or height, use a display
specification of the form (space . props)
, where
props is a property list (a list of alternating properties and
values). You can put this property on one or more consecutive
characters; a space of the specified height and width is displayed in
place of all of those characters. These are the properties you
can use in props to specify the weight of the space:
:width width
If width is a number, it specifies that the space width should be width times the normal character width. width can also be a pixel width specification (see section Pixel Specification for Spaces).
:relative-width factor
Specifies that the width of the stretch should be computed from the
first character in the group of consecutive characters that have the
same display
property. The space width is the width of that
character, multiplied by factor.
:align-to hpos
Specifies that the space should be wide enough to reach hpos. If hpos is a number, it is measured in units of the normal character width. hpos can also be a pixel width specification (see section Pixel Specification for Spaces).
You should use one and only one of the above properties. You can also specify the height of the space, with these properties:
:height height
Specifies the height of the space. If height is a number, it specifies that the space height should be height times the normal character height. The height may also be a pixel height specification (see section Pixel Specification for Spaces).
:relative-height factor
Specifies the height of the space, multiplying the ordinary height of the text having this display specification by factor.
:ascent ascent
If the value of ascent is a non-negative number no greater than 100, it specifies that ascent percent of the height of the space should be considered as the ascent of the space—that is, the part above the baseline. The ascent may also be specified in pixel units with a pixel ascent specification (see section Pixel Specification for Spaces).
Don’t use both :height
and :relative-height
together.
The :width
and :align-to
properties are supported on
non-graphic terminals, but the other space properties in this section
are not.
Note that space properties are treated as paragraph separators for the purposes of reordering bidirectional text for display. See section Bidirectional Display, for the details.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The value of the :width
, :align-to
, :height
,
and :ascent
properties can be a special kind of expression that
is evaluated during redisplay. The result of the evaluation is used
as an absolute number of pixels.
The following expressions are supported:
expr ::= num | (num) | unit | elem | pos | image | form num ::= integer | float | symbol unit ::= in | mm | cm | width | height
elem ::= left-fringe | right-fringe | left-margin | right-margin | scroll-bar | text pos ::= left | center | right form ::= (num . expr) | (op expr ...) op ::= + | -
The form num specifies a fraction of the default frame font
height or width. The form (num)
specifies an absolute
number of pixels. If num is a symbol, symbol, its
buffer-local variable binding is used.
The in
, mm
, and cm
units specify the number of
pixels per inch, millimeter, and centimeter, respectively. The
width
and height
units correspond to the default width
and height of the current face. An image specification image
corresponds to the width or height of the image.
The elements left-fringe
, right-fringe
,
left-margin
, right-margin
, scroll-bar
, and
text
specify to the width of the corresponding area of the
window.
The left
, center
, and right
positions can be
used with :align-to
to specify a position relative to the left
edge, center, or right edge of the text area.
Any of the above window elements (except text
) can also be
used with :align-to
to specify that the position is relative to
the left edge of the given area. Once the base offset for a relative
position has been set (by the first occurrence of one of these
symbols), further occurrences of these symbols are interpreted as the
width of the specified area. For example, to align to the center of
the left-margin, use
:align-to (+ left-margin (0.5 . left-margin))
If no specific base offset is set for alignment, it is always relative to the left edge of the text area. For example, ‘:align-to 0’ in a header-line aligns with the first text column in the text area.
A value of the form (num . expr)
stands for the
product of the values of num and expr. For example,
(2 . in)
specifies a width of 2 inches, while (0.5 .
image)
specifies half the width (or height) of the specified
image.
The form (+ expr ...)
adds up the value of the
expressions. The form (- expr ...)
negates or subtracts
the value of the expressions.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are the other sorts of display specifications that you can use
in the display
text property.
string
Display string instead of the text that has this property.
Recursive display specifications are not supported—string’s
display
properties, if any, are not used.
(image . image-props)
This kind of display specification is an image descriptor (see section Images). When used as a display specification, it means to display the image instead of the text that has the display specification.
(slice x y width height)
This specification together with image
specifies a slice
(a partial area) of the image to display. The elements y and
x specify the top left corner of the slice, within the image;
width and height specify the width and height of the
slice. Integers are numbers of pixels. A floating-point number
in the range 0.0–1.0 stands for that fraction of the width or height
of the entire image.
((margin nil) string)
A display specification of this form means to display string instead of the text that has the display specification, at the same position as that text. It is equivalent to using just string, but it is done as a special case of marginal display (see section Displaying in the Margins).
(left-fringe bitmap [face])
(right-fringe bitmap [face])
This display specification on any character of a line of text causes the specified bitmap be displayed in the left or right fringes for that line, instead of the characters that have the display specification. The optional face specifies the colors to be used for the bitmap. See section Fringe Bitmaps, for the details.
(space-width factor)
This display specification affects all the space characters within the text that has the specification. It displays all of these spaces factor times as wide as normal. The element factor should be an integer or float. Characters other than spaces are not affected at all; in particular, this has no effect on tab characters.
(height height)
This display specification makes the text taller or shorter. Here are the possibilities for height:
(+ n)
This means to use a font that is n steps larger. A “step” is defined by the set of available fonts—specifically, those that match what was otherwise specified for this text, in all attributes except height. Each size for which a suitable font is available counts as another step. n should be an integer.
(- n)
This means to use a font that is n steps smaller.
A number, factor, means to use a font that is factor times as tall as the default font.
A symbol is a function to compute the height. It is called with the current height as argument, and should return the new height to use.
If the height value doesn’t fit the previous possibilities, it is
a form. Emacs evaluates it to get the new height, with the symbol
height
bound to the current specified font height.
(raise factor)
This kind of display specification raises or lowers the text it applies to, relative to the baseline of the line.
factor must be a number, which is interpreted as a multiple of the height of the affected text. If it is positive, that means to display the characters raised. If it is negative, that means to display them lower down.
If the text also has a height
display specification, that does
not affect the amount of raising or lowering, which is based on the
faces used for the text.
You can make any display specification conditional. To do that,
package it in another list of the form
(when condition . spec)
.
Then the specification spec applies only when
condition evaluates to a non-nil
value. During the
evaluation, object
is bound to the string or buffer having the
conditional display
property. position
and
buffer-position
are bound to the position within object
and the buffer position where the display
property was found,
respectively. Both positions can be different when object
is a
string.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A buffer can have blank areas called display margins on the
left and on the right. Ordinary text never appears in these areas,
but you can put things into the display margins using the
display
property. There is currently no way to make text or
images in the margin mouse-sensitive.
The way to display something in the margins is to specify it in a
margin display specification in the display
property of some
text. This is a replacing display specification, meaning that the
text you put it on does not get displayed; the margin display appears,
but that text does not.
A margin display specification looks like ((margin
right-margin) spec)
or ((margin left-margin) spec)
.
Here, spec is another display specification that says what to
display in the margin. Typically it is a string of text to display,
or an image descriptor.
To display something in the margin in association with
certain buffer text, without altering or preventing the display of
that text, put a before-string
property on the text and put the
margin display specification on the contents of the before-string.
Before the display margins can display anything, you must give them a nonzero width. The usual way to do that is to set these variables:
This variable specifies the width of the left margin, in character
cell (a.k.a. “column”) units. It is buffer-local in all buffers.
A value of nil
means no left marginal area.
This variable specifies the width of the right margin, in character
cell units. It is buffer-local in all buffers. A value of nil
means no right marginal area.
Setting these variables does not immediately affect the window. These
variables are checked when a new buffer is displayed in the window.
Thus, you can make changes take effect by calling
set-window-buffer
.
You can also set the margin widths immediately.
This function specifies the margin widths for window window, in
character cell units. The argument left controls the left
margin, and right controls the right margin (default 0
).
This function returns the width of the left and right margins of
window as a cons cell of the form (left . right)
. If one of the two marginal areas does not exist,
its width is returned as nil
; if neither of the two margins exist,
the function returns (nil)
. If window is nil
, the
selected window is used.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To display an image in an Emacs buffer, you must first create an image
descriptor, then use it as a display specifier in the display
property of text that is displayed (see section The display
Property).
Emacs is usually able to display images when it is run on a
graphical terminal. Images cannot be displayed in a text terminal, on
certain graphical terminals that lack the support for this, or if
Emacs is compiled without image support. You can use the function
display-images-p
to determine if images can in principle be
displayed (see section Display Feature Testing).
37.17.1 Image Formats | Supported image formats. | |
37.17.2 Image Descriptors | How to specify an image for use in :display .
| |
37.17.3 XBM Images | Special features for XBM format. | |
37.17.4 XPM Images | Special features for XPM format. | |
37.17.5 PostScript Images | Special features for PostScript format. | |
37.17.6 ImageMagick Images | Special features available through ImageMagick. | |
37.17.7 Other Image Types | Various other formats are supported. | |
37.17.8 Defining Images | Convenient ways to define an image for later use. | |
37.17.9 Showing Images | Convenient ways to display an image once it is defined. | |
37.17.10 Multi-Frame Images | Some images contain more than one frame. | |
37.17.11 Image Cache | Internal mechanisms of image display. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can display a number of different image formats. Some of
these image formats are supported only if particular support libraries
are installed. On some platforms, Emacs can load support libraries on
demand; if so, the variable dynamic-library-alist
can be used
to modify the set of known names for these dynamic libraries.
See section Dynamically Loaded Libraries.
Supported image formats (and the required support libraries) include
PBM and XBM (which do not depend on support libraries and are always
available), XPM (libXpm
), GIF (libgif
or
libungif
), PostScript (gs
), JPEG (libjpeg
), TIFF
(libtiff
), PNG (libpng
), and SVG (librsvg
).
Each of these image formats is associated with an image type
symbol. The symbols for the above formats are, respectively,
pbm
, xbm
, xpm
, gif
, postscript
,
jpeg
, tiff
, png
, and svg
.
Furthermore, if you build Emacs with ImageMagick
(libMagickWand
) support, Emacs can display any image format
that ImageMagick can. See section ImageMagick Images. All images
displayed via ImageMagick have type symbol imagemagick
.
This variable contains a list of type symbols for image formats which are potentially supported in the current configuration.
“Potentially” means that Emacs knows about the image types, not
necessarily that they can be used (for example, they could depend on
unavailable dynamic libraries). To know which image types are really
available, use image-type-available-p
.
This function returns non-nil
if images of type type can
be loaded and displayed. type must be an image type symbol.
For image types whose support libraries are statically linked, this
function always returns t
. For image types whose support
libraries are dynamically loaded, it returns t
if the library
could be loaded and nil
otherwise.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
An image descriptor is a list which specifies the underlying
data for an image, and how to display it. It is typically used as the
value of a display
overlay or text property (see section Other Display Specifications); but See section Showing Images, for convenient helper
functions to insert images into buffers.
Each image descriptor has the form (image . props)
,
where props is a property list of alternating keyword symbols
and values, including at least the pair :type type
that
specifies the image type.
The following is a list of properties that are meaningful for all image types (there are also properties which are meaningful only for certain image types, as documented in the following subsections):
:type type
The image type. See section Image Formats. Every image descriptor must include this property.
:file file
This says to load the image from file file. If file is
not an absolute file name, it is expanded in data-directory
.
:data data
This specifies the raw image data. Each image descriptor must have
either :data
or :file
, but not both.
For most image types, the value of a :data
property should be a
string containing the image data. Some image types do not support
:data
; for some others, :data
alone is not enough, so
you need to use other image properties along with :data
. See
the following subsections for details.
:margin margin
This specifies how many pixels to add as an extra margin around the
image. The value, margin, must be a non-negative number, or a
pair (x . y)
of such numbers. If it is a pair,
x specifies how many pixels to add horizontally, and y
specifies how many pixels to add vertically. If :margin
is not
specified, the default is zero.
:ascent ascent
This specifies the amount of the image’s height to use for its
ascent—that is, the part above the baseline. The value,
ascent, must be a number in the range 0 to 100, or the symbol
center
.
If ascent is a number, that percentage of the image’s height is used for its ascent.
If ascent is center
, the image is vertically centered
around a centerline which would be the vertical centerline of text drawn
at the position of the image, in the manner specified by the text
properties and overlays that apply to the image.
If this property is omitted, it defaults to 50.
:relief relief
This adds a shadow rectangle around the image. The value, relief, specifies the width of the shadow lines, in pixels. If relief is negative, shadows are drawn so that the image appears as a pressed button; otherwise, it appears as an unpressed button.
:conversion algorithm
This specifies a conversion algorithm that should be applied to the image before it is displayed; the value, algorithm, specifies which algorithm.
laplace
emboss
Specifies the Laplace edge detection algorithm, which blurs out small differences in color while highlighting larger differences. People sometimes consider this useful for displaying the image for a “disabled” button.
(edge-detection :matrix matrix :color-adjust adjust)
Specifies a general edge-detection algorithm. matrix must be either a nine-element list or a nine-element vector of numbers. A pixel at position x/y in the transformed image is computed from original pixels around that position. matrix specifies, for each pixel in the neighborhood of x/y, a factor with which that pixel will influence the transformed pixel; element 0 specifies the factor for the pixel at x-1/y-1, element 1 the factor for the pixel at x/y-1 etc., as shown below:
(x-1/y-1 x/y-1 x+1/y-1 x-1/y x/y x+1/y x-1/y+1 x/y+1 x+1/y+1)
The resulting pixel is computed from the color intensity of the color resulting from summing up the RGB values of surrounding pixels, multiplied by the specified factors, and dividing that sum by the sum of the factors’ absolute values.
Laplace edge-detection currently uses a matrix of
(1 0 0 0 0 0 0 0 -1)
Emboss edge-detection uses a matrix of
( 2 -1 0 -1 0 1 0 1 -2)
disabled
Specifies transforming the image so that it looks “disabled”.
:mask mask
If mask is heuristic
or (heuristic bg)
, build
a clipping mask for the image, so that the background of a frame is
visible behind the image. If bg is not specified, or if bg
is t
, determine the background color of the image by looking at
the four corners of the image, assuming the most frequently occurring
color from the corners is the background color of the image. Otherwise,
bg must be a list (red green blue)
specifying the color to assume for the background of the image.
If mask is nil
, remove a mask from the image, if it has
one. Images in some formats include a mask which can be removed by
specifying :mask nil
.
:pointer shape
This specifies the pointer shape when the mouse pointer is over this image. See section Pointer Shape, for available pointer shapes.
:map map
This associates an image map of hot spots with this image.
An image map is an alist where each element has the format
(area id plist)
. An area is specified
as either a rectangle, a circle, or a polygon.
A rectangle is a cons
(rect . ((x0 . y0) . (x1 . y1)))
which specifies the pixel coordinates of the upper left and bottom right
corners of the rectangle area.
A circle is a cons
(circle . ((x0 . y0) . r))
which specifies the center and the radius of the circle; r may
be a float or integer.
A polygon is a cons
(poly . [x0 y0 x1 y1 ...])
where each pair in the vector describes one corner in the polygon.
When the mouse pointer lies on a hot-spot area of an image, the
plist of that hot-spot is consulted; if it contains a help-echo
property, that defines a tool-tip for the hot-spot, and if it contains
a pointer
property, that defines the shape of the mouse cursor when
it is on the hot-spot.
See section Pointer Shape, for available pointer shapes.
When you click the mouse when the mouse pointer is over a hot-spot, an
event is composed by combining the id of the hot-spot with the
mouse event; for instance, [area4 mouse-1]
if the hot-spot’s
id is area4
.
This function returns t
if image spec has a mask bitmap.
frame is the frame on which the image will be displayed.
frame nil
or omitted means to use the selected frame
(see section Input Focus).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To use XBM format, specify xbm
as the image type. This image
format doesn’t require an external library, so images of this type are
always supported.
Additional image properties supported for the xbm
image type are:
:foreground foreground
The value, foreground, should be a string specifying the image
foreground color, or nil
for the default color. This color is
used for each pixel in the XBM that is 1. The default is the frame’s
foreground color.
:background background
The value, background, should be a string specifying the image
background color, or nil
for the default color. This color is
used for each pixel in the XBM that is 0. The default is the frame’s
background color.
If you specify an XBM image using data within Emacs instead of an external file, use the following three properties:
:data data
The value, data, specifies the contents of the image. There are three formats you can use for data:
:height
and :width
.
:height
and :width
in this case,
because omitting them is what indicates the data has the format of an
XBM file. The file contents specify the height and width of the image.
height
bits. In this case, you must specify
:height
and :width
, both to indicate that the string
contains just the bits rather than a whole XBM file, and to specify the
size of the image.
:width width
The value, width, specifies the width of the image, in pixels.
:height height
The value, height, specifies the height of the image, in pixels.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To use XPM format, specify xpm
as the image type. The
additional image property :color-symbols
is also meaningful with
the xpm
image type:
:color-symbols symbols
The value, symbols, should be an alist whose elements have the
form (name . color)
. In each element, name is
the name of a color as it appears in the image file, and color
specifies the actual color to use for displaying that name.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To use PostScript for an image, specify image type postscript
.
This works only if you have Ghostscript installed. You must always use
these three properties:
:pt-width width
The value, width, specifies the width of the image measured in points (1/72 inch). width must be an integer.
:pt-height height
The value, height, specifies the height of the image in points (1/72 inch). height must be an integer.
:bounding-box box
The value, box, must be a list or vector of four integers, which specifying the bounding box of the PostScript image, analogous to the ‘BoundingBox’ comment found in PostScript files.
%%BoundingBox: 22 171 567 738
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you build Emacs with ImageMagick support, you can use the
ImageMagick library to load many image formats (see File
Conveniences in The GNU Emacs Manual). The image type symbol
for images loaded via ImageMagick is imagemagick
, regardless of
the actual underlying image format.
This function returns a list of image file extensions supported by the
current ImageMagick installation. Each list element is a symbol
representing an internal ImageMagick name for an image type, such as
BMP
for .bmp images.
The value of this variable is a list of ImageMagick image types which
Emacs may attempt to render using ImageMagick. Each list element
should be one of the symbols in the list returned by
imagemagick-types
, or an equivalent string. Alternatively, a
value of t
enables ImageMagick for all possible image types.
Regardless of the value of this variable,
imagemagick-types-inhibit
(see below) takes precedence.
The value of this variable lists the ImageMagick image types which
should never be rendered using ImageMagick, regardless of the value of
imagemagick-enabled-types
. A value of t
disables
ImageMagick entirely.
This variable is an alist mapping image types to file name extensions.
Emacs uses this in conjunction with the :format
image property
(see below) to give a hint to the ImageMagick library as to the type
of an image. Each element has the form (type
extension)
, where type is a symbol specifying an image
content-type, and extension is a string that specifies the
associated file name extension.
Images loaded with ImageMagick support the following additional image descriptor properties:
:background background
background, if non-nil
, should be a string specifying a
color, which is used as the image’s background color if the image
supports transparency. If the value is nil
, it defaults to the
frame’s background color.
:width width, :height height
The :width
and :height
keywords are used for scaling the
image. If only one of them is specified, the other one will be
calculated so as to preserve the aspect ratio. If both are specified,
aspect ratio may not be preserved.
:max-width max-width, :max-height max-height
The :max-width
and :max-height
keywords are used for
scaling if the size of the image of the image exceeds these values.
If :width
is set it will have precedence over max-width
,
and if :height
is set it will have precedence over
max-height
, but you can otherwise mix these keywords as you
wish. :max-width
and :max-height
will always preserve
the aspect ratio.
:format type
The value, type, should be a symbol specifying the type of the
image data, as found in image-format-suffixes
. This is used
when the image does not have an associated file name, to provide a
hint to ImageMagick to help it detect the image type.
:rotation angle
Specifies a rotation angle in degrees.
:index frame
See section Multi-Frame Images.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
For PBM images, specify image type pbm
. Color, gray-scale and
monochromatic images are supported. For mono PBM images, two additional
image properties are supported.
:foreground foreground
The value, foreground, should be a string specifying the image
foreground color, or nil
for the default color. This color is
used for each pixel in the PBM that is 1. The default is the frame’s
foreground color.
:background background
The value, background, should be a string specifying the image
background color, or nil
for the default color. This color is
used for each pixel in the PBM that is 0. The default is the frame’s
background color.
The remaining image types that Emacs can support are:
Image type gif
.
Supports the :index
property. See section Multi-Frame Images.
Image type jpeg
.
Image type png
.
Image type svg
.
Image type tiff
.
Supports the :index
property. See section Multi-Frame Images.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The functions create-image
, defimage
and
find-image
provide convenient ways to create image descriptors.
This function creates and returns an image descriptor which uses the
data in file-or-data. file-or-data can be a file name or
a string containing the image data; data-p should be nil
for the former case, non-nil
for the latter case.
The optional argument type is a symbol specifying the image type.
If type is omitted or nil
, create-image
tries to
determine the image type from the file’s first few bytes, or else
from the file’s name.
The remaining arguments, props, specify additional image properties—for example,
(create-image "foo.xpm" 'xpm nil :heuristic-mask t)
The function returns nil
if images of this type are not
supported. Otherwise it returns an image descriptor.
This macro defines symbol as an image name. The arguments specs is a list which specifies how to display the image. The third argument, doc, is an optional documentation string.
Each argument in specs has the form of a property list, and each
one should specify at least the :type
property and either the
:file
or the :data
property. The value of :type
should be a symbol specifying the image type, the value of
:file
is the file to load the image from, and the value of
:data
is a string containing the actual image data. Here is an
example:
(defimage test-image ((:type xpm :file "~/test1.xpm") (:type xbm :file "~/test1.xbm")))
defimage
tests each argument, one by one, to see if it is
usable—that is, if the type is supported and the file exists. The
first usable argument is used to make an image descriptor which is
stored in symbol.
If none of the alternatives will work, then symbol is defined
as nil
.
This function provides a convenient way to find an image satisfying one of a list of image specifications specs.
Each specification in specs is a property list with contents
depending on image type. All specifications must at least contain the
properties :type type
and either :file file
or :data data
, where type is a symbol specifying
the image type, e.g., xbm
, file is the file to load the
image from, and data is a string containing the actual image data.
The first specification in the list whose type is supported, and
file exists, is used to construct the image specification to be
returned. If no specification is satisfied, nil
is returned.
The image is looked for in image-load-path
.
This variable’s value is a list of locations in which to search for image files. If an element is a string or a variable symbol whose value is a string, the string is taken to be the name of a directory to search. If an element is a variable symbol whose value is a list, that is taken to be a list of directory names to search.
The default is to search in the images subdirectory of the
directory specified by data-directory
, then the directory
specified by data-directory
, and finally in the directories in
load-path
. Subdirectories are not automatically included in
the search, so if you put an image file in a subdirectory, you have to
supply the subdirectory name explicitly. For example, to find the
image images/foo/bar.xpm within data-directory
, you
should specify the image as follows:
(defimage foo-image '((:type xpm :file "foo/bar.xpm")))
This function returns a suitable search path for images used by the Lisp package library.
The function searches for image first using image-load-path
,
excluding data-directory
/images, and then in
load-path
, followed by a path suitable for library, which
includes ../../etc/images and ../etc/images relative to
the library file itself, and finally in
data-directory
/images.
Then this function returns a list of directories which contains first
the directory in which image was found, followed by the value of
load-path
. If path is given, it is used instead of
load-path
.
If no-error is non-nil
and a suitable path can’t be
found, don’t signal an error. Instead, return a list of directories as
before, except that nil
appears in place of the image directory.
Here is an example of using image-load-path-for-library
:
(defvar image-load-path) ; shush compiler (let* ((load-path (image-load-path-for-library "mh-e" "mh-logo.xpm")) (image-load-path (cons (car load-path) image-load-path))) (mh-tool-bar-folder-buttons-init))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use an image descriptor by setting up the display
property yourself, but it is easier to use the functions in this
section.
This function inserts image in the current buffer at point. The
value image should be an image descriptor; it could be a value
returned by create-image
, or the value of a symbol defined with
defimage
. The argument string specifies the text to put
in the buffer to hold the image. If it is omitted or nil
,
insert-image
uses " "
by default.
The argument area specifies whether to put the image in a margin.
If it is left-margin
, the image appears in the left margin;
right-margin
specifies the right margin. If area is
nil
or omitted, the image is displayed at point within the
buffer’s text.
The argument slice specifies a slice of the image to insert. If
slice is nil
or omitted the whole image is inserted.
Otherwise, slice is a list (x y width
height)
which specifies the x and y positions and
width and height of the image area to insert. Integer
values are in units of pixels. A floating-point number in the range
0.0–1.0 stands for that fraction of the width or height of the entire
image.
Internally, this function inserts string in the buffer, and gives
it a display
property which specifies image. See section The display
Property.
This function inserts image in the current buffer at point, like
insert-image
, but splits the image into rowsxcols
equally sized slices.
If an image is inserted “sliced”, Emacs displays each slice as a separate image, and allow more intuitive scrolling up/down, instead of jumping up/down the entire image when paging through a buffer that displays (large) images.
This function puts image image in front of pos in the current buffer. The argument pos should be an integer or a marker. It specifies the buffer position where the image should appear. The argument string specifies the text that should hold the image as an alternative to the default.
The argument image must be an image descriptor, perhaps returned
by create-image
or stored by defimage
.
The argument area specifies whether to put the image in a margin.
If it is left-margin
, the image appears in the left margin;
right-margin
specifies the right margin. If area is
nil
or omitted, the image is displayed at point within the
buffer’s text.
Internally, this function creates an overlay, and gives it a
before-string
property containing text that has a display
property whose value is the image. (Whew!)
This function removes images in buffer between positions
start and end. If buffer is omitted or nil
,
images are removed from the current buffer.
This removes only images that were put into buffer the way
put-image
does it, not images that were inserted with
insert-image
or in other ways.
This function returns the size of an image as a pair
(width . height)
. spec is an image
specification. pixels non-nil
means return sizes
measured in pixels, otherwise return sizes measured in canonical
character units (fractions of the width/height of the frame’s default
font). frame is the frame on which the image will be displayed.
frame null or omitted means use the selected frame (see section Input Focus).
This variable is used to define the maximum size of image that Emacs will load. Emacs will refuse to load (and display) any image that is larger than this limit.
If the value is an integer, it directly specifies the maximum image height and width, measured in pixels. If it is floating point, it specifies the maximum image height and width as a ratio to the frame height and width. If the value is non-numeric, there is no explicit limit on the size of images.
The purpose of this variable is to prevent unreasonably large images
from accidentally being loaded into Emacs. It only takes effect the
first time an image is loaded. Once an image is placed in the image
cache, it can always be displayed, even if the value of
max-image-size
is subsequently changed (see section Image Cache).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Some image files can contain more than one image. We say that there are multiple “frames” in the image. At present, Emacs supports multiple frames for GIF, TIFF, and certain ImageMagick formats such as DJVM.
The frames can be used either to represent multiple “pages” (this is usually the case with multi-frame TIFF files, for example), or to create animation (usually the case with multi-frame GIF files).
A multi-frame image has a property :index
, whose value is an
integer (counting from 0) that specifies which frame is being displayed.
This function returns non-nil
if image contains more than
one frame. The actual return value is a cons (nimages
. delay)
, where nimages is the number of frames and
delay is the delay in seconds between them, or nil
if the image does not specify a delay. Images that are intended to be
animated usually specify a frame delay, whereas ones that are intended
to be treated as multiple pages do not.
This function returns the index of the current frame number for image, counting from 0.
This function switches image to frame number n. It
replaces a frame number outside the valid range with that of the end
of the range, unless nocheck is non-nil
. If image
does not contain a frame with the specified number, the image displays
as a hollow box.
This function animates image. The optional integer index
specifies the frame from which to start (default 0). The optional
argument limit controls the length of the animation. If omitted
or nil
, the image animates once only; if t
it loops
forever; if a number animation stops after that many seconds.
Animation operates by means of a timer. Note that Emacs imposes a
minimum frame delay of 0.01 (image-minimum-frame-delay
) seconds.
If the image itself does not specify a delay, Emacs uses
image-default-frame-delay
.
This function returns the timer responsible for animating image, if there is one.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs caches images so that it can display them again more
efficiently. When Emacs displays an image, it searches the image
cache for an existing image specification equal
to the desired
specification. If a match is found, the image is displayed from the
cache. Otherwise, Emacs loads the image normally.
This function removes the image with specification spec from the
image cache of frame frame. Image specifications are compared
using equal
. If frame is nil
, it defaults to the
selected frame. If frame is t
, the image is flushed on
all existing frames.
In Emacs’s current implementation, each graphical terminal possesses an image cache, which is shared by all the frames on that terminal (see section Multiple Terminals). Thus, refreshing an image in one frame also refreshes it in all other frames on the same terminal.
One use for image-flush
is to tell Emacs about a change in an
image file. If an image specification contains a :file
property, the image is cached based on the file’s contents when the
image is first displayed. Even if the file subsequently changes,
Emacs continues displaying the old version of the image. Calling
image-flush
flushes the image from the cache, forcing Emacs to
re-read the file the next time it needs to display that image.
Another use for image-flush
is for memory conservation. If
your Lisp program creates a large number of temporary images over a
period much shorter than image-cache-eviction-delay
(see
below), you can opt to flush unused images yourself, instead of
waiting for Emacs to do it automatically.
This function clears an image cache, removing all the images stored in
it. If filter is omitted or nil
, it clears the cache for
the selected frame. If filter is a frame, it clears the cache
for that frame. If filter is t
, all image caches are
cleared. Otherwise, filter is taken to be a file name, and all
images associated with that file name are removed from all image
caches.
If an image in the image cache has not been displayed for a specified period of time, Emacs removes it from the cache and frees the associated memory.
This variable specifies the number of seconds an image can remain in the cache without being displayed. When an image is not displayed for this length of time, Emacs removes it from the image cache.
Under some circumstances, if the number of images in the cache grows too large, the actual eviction delay may be shorter than this.
If the value is nil
, Emacs does not remove images from the cache
except when you explicitly clear it. This mode can be useful for
debugging.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Button package defines functions for inserting and manipulating buttons that can be activated with the mouse or via keyboard commands. These buttons are typically used for various kinds of hyperlinks.
A button is essentially a set of text or overlay properties, attached to a stretch of text in a buffer. These properties are called button properties. One of these properties, the action property, specifies a function which is called when the user invokes the button using the keyboard or the mouse. The action function may examine the button and use its other properties as desired.
In some ways, the Button package duplicates the functionality in the Widget package. See Introduction in The Emacs Widget Library. The advantage of the Button package is that it is faster, smaller, and simpler to program. From the point of view of the user, the interfaces produced by the two packages are very similar.
37.18.1 Button Properties | Button properties with special meanings. | |
37.18.2 Button Types | Defining common properties for classes of buttons. | |
37.18.3 Making Buttons | Adding buttons to Emacs buffers. | |
37.18.4 Manipulating Buttons | Getting and setting properties of buttons. | |
37.18.5 Button Buffer Commands | Buffer-wide commands and bindings for buttons. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each button has an associated list of properties defining its appearance and behavior, and other arbitrary properties may be used for application specific purposes. The following properties have special meaning to the Button package:
action
The function to call when the user invokes the button, which is passed
the single argument button. By default this is ignore
,
which does nothing.
mouse-action
This is similar to action
, and when present, will be used
instead of action
for button invocations resulting from
mouse-clicks (instead of the user hitting RET). If not
present, mouse-clicks use action
instead.
face
This is an Emacs face controlling how buttons of this type are
displayed; by default this is the button
face.
mouse-face
This is an additional face which controls appearance during
mouse-overs (merged with the usual button face); by default this is
the usual Emacs highlight
face.
keymap
The button’s keymap, defining bindings active within the button
region. By default this is the usual button region keymap, stored
in the variable button-map
, which defines RET and
mouse-2 to invoke the button.
type
The button type. See section Button Types.
help-echo
A string displayed by the Emacs tool-tip help system; by default,
"mouse-2, RET: Push this button"
.
follow-link
The follow-link property, defining how a Mouse-1 click behaves on this button, See section Defining Clickable Text.
button
All buttons have a non-nil
button
property, which may be useful
in finding regions of text that comprise buttons (which is what the
standard button functions do).
There are other properties defined for the regions of text in a button, but these are not generally interesting for typical uses.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Every button has a button type, which defines default values for the button’s properties. Button types are arranged in a hierarchy, with specialized types inheriting from more general types, so that it’s easy to define special-purpose types of buttons for specific tasks.
Define a ‘button type’ called name (a symbol).
The remaining arguments
form a sequence of property value pairs, specifying default
property values for buttons with this type (a button’s type may be set
by giving it a type
property when creating the button, using
the :type
keyword argument).
In addition, the keyword argument :supertype
may be used to
specify a button-type from which name inherits its default
property values. Note that this inheritance happens only when
name is defined; subsequent changes to a supertype are not
reflected in its subtypes.
Using define-button-type
to define default properties for
buttons is not necessary—buttons without any specified type use the
built-in button-type button
—but it is encouraged, since
doing so usually makes the resulting code clearer and more efficient.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Buttons are associated with a region of text, using an overlay or
text properties to hold button-specific information, all of which are
initialized from the button’s type (which defaults to the built-in
button type button
). Like all Emacs text, the appearance of
the button is governed by the face
property; by default (via
the face
property inherited from the button
button-type)
this is a simple underline, like a typical web-page link.
For convenience, there are two sorts of button-creation functions,
those that add button properties to an existing region of a buffer,
called make-...button
, and those that also insert the button
text, called insert-...button
.
The button-creation functions all take the &rest
argument
properties, which should be a sequence of property value
pairs, specifying properties to add to the button; see Button Properties. In addition, the keyword argument :type
may be
used to specify a button-type from which to inherit other properties;
see Button Types. Any properties not explicitly specified
during creation will be inherited from the button’s type (if the type
defines such a property).
The following functions add a button using an overlay (see section Overlays) to hold the button properties:
This makes a button from beg to end in the current buffer, and returns it.
This insert a button with the label label at point, and returns it.
The following functions are similar, but using text properties (see section Text Properties) to hold the button properties. Such buttons do not add markers to the buffer, so editing in the buffer does not slow down if there is an extremely large numbers of buttons. However, if there is an existing face text property on the text (e.g., a face assigned by Font Lock mode), the button face may not be visible. Both of these functions return the starting position of the new button.
This makes a button from beg to end in the current buffer, using text properties.
This inserts a button with the label label at point, using text properties.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These are functions for getting and setting properties of buttons. Often these are used by a button’s invocation function to determine what to do.
Where a button parameter is specified, it means an object referring to a specific button, either an overlay (for overlay buttons), or a buffer-position or marker (for text property buttons). Such an object is passed as the first argument to a button’s invocation function when it is invoked.
Return the position at which button starts.
Return the position at which button ends.
Get the property of button button named prop.
Set button’s prop property to val.
Call button’s action
property (i.e., invoke the function
that is the value of that property, passing it the single argument
button). If use-mouse-action is non-nil
, try to
invoke the button’s mouse-action
property instead of
action
; if the button has no mouse-action
property, use
action
as normal.
Return button’s text label.
Return button’s button-type.
Return t
if button has button-type type, or one of
type’s subtypes.
Return the button at position pos in the current buffer, or
nil
. If the button at pos is a text property button, the
return value is a marker pointing to pos.
Set the button-type type’s prop property to val.
Get the property of button-type type named prop.
Return t
if button-type type is a subtype of supertype.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These are commands and functions for locating and operating on buttons in an Emacs buffer.
push-button
is the command that a user uses to actually ‘push’
a button, and is bound by default in the button itself to RET
and to mouse-2 using a local keymap in the button’s overlay or
text properties. Commands that are useful outside the buttons itself,
such as forward-button
and backward-button
are
additionally available in the keymap stored in
button-buffer-map
; a mode which uses buttons may want to use
button-buffer-map
as a parent keymap for its keymap.
If the button has a non-nil
follow-link
property, and
mouse-1-click-follows-link
is set, a quick Mouse-1 click
will also activate the push-button
command.
See section Defining Clickable Text.
Perform the action specified by a button at location pos.
pos may be either a buffer position or a mouse-event. If
use-mouse-action is non-nil
, or pos is a
mouse-event (see section Mouse Events), try to invoke the button’s
mouse-action
property instead of action
; if the button
has no mouse-action
property, use action
as normal.
pos defaults to point, except when push-button
is invoked
interactively as the result of a mouse-event, in which case, the mouse
event’s position is used. If there’s no button at pos, do
nothing and return nil
, otherwise return t
.
Move to the nth next button, or nth previous button if
n is negative. If n is zero, move to the start of any
button at point. If wrap is non-nil
, moving past either
end of the buffer continues from the other end. If
display-message is non-nil
, the button’s help-echo string
is displayed. Any button with a non-nil
skip
property
is skipped over. Returns the button found.
Move to the nth previous button, or nth next button if
n is negative. If n is zero, move to the start of any
button at point. If wrap is non-nil
, moving past either
end of the buffer continues from the other end. If
display-message is non-nil
, the button’s help-echo string
is displayed. Any button with a non-nil
skip
property
is skipped over. Returns the button found.
Return the next button after (for next-button
) or before (for
previous-button
) position pos in the current buffer. If
count-current is non-nil
, count any button at pos
in the search, instead of starting at the next button.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The Ewoc package constructs buffer text that represents a structure of Lisp objects, and updates the text to follow changes in that structure. This is like the “view” component in the “model/view/controller” design paradigm. Ewoc means “Emacs’s Widget for Object Collections”.
An ewoc is a structure that organizes information required to construct buffer text that represents certain Lisp data. The buffer text of the ewoc has three parts, in order: first, fixed header text; next, textual descriptions of a series of data elements (Lisp objects that you specify); and last, fixed footer text. Specifically, an ewoc contains information on:
Typically, you define an ewoc with ewoc-create
, and then pass
the resulting ewoc structure to other functions in the Ewoc package to
build nodes within it, and display it in the buffer. Once it is
displayed in the buffer, other functions determine the correspondence
between buffer positions and nodes, move point from one node’s textual
representation to another, and so forth. See section Abstract Display Functions.
A node encapsulates a data element much the way a variable holds a value. Normally, encapsulation occurs as a part of adding a node to the ewoc. You can retrieve the data element value and place a new value in its place, like so:
(ewoc-data node) ⇒ value (ewoc-set-data node new-value) ⇒ new-value
You can also use, as the data element value, a Lisp object (list or vector) that is a container for the “real” value, or an index into some other structure. The example (see section Abstract Display Example) uses the latter approach.
When the data changes, you will want to update the text in the
buffer. You can update all nodes by calling ewoc-refresh
, or
just specific nodes using ewoc-invalidate
, or all nodes
satisfying a predicate using ewoc-map
. Alternatively, you can
delete invalid nodes using ewoc-delete
or ewoc-filter
,
and add new nodes in their place. Deleting a node from an ewoc deletes
its associated textual description from buffer, as well.
37.19.1 Abstract Display Functions | Functions in the Ewoc package. | |
37.19.2 Abstract Display Example | Example of using Ewoc. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In this subsection, ewoc and node stand for the structures described above (see section Abstract Display), while data stands for an arbitrary Lisp object used as a data element.
This constructs and returns a new ewoc, with no nodes (and thus no data
elements). pretty-printer should be a function that takes one
argument, a data element of the sort you plan to use in this ewoc, and
inserts its textual description at point using insert
(and never
insert-before-markers
, because that would interfere with the
Ewoc package’s internal mechanisms).
Normally, a newline is automatically inserted after the header,
the footer and every node’s textual description. If nosep
is non-nil
, no newline is inserted. This may be useful for
displaying an entire ewoc on a single line, for example, or for
making nodes “invisible” by arranging for pretty-printer
to do nothing for those nodes.
An ewoc maintains its text in the buffer that is current when
you create it, so switch to the intended buffer before calling
ewoc-create
.
This returns the buffer where ewoc maintains its text.
This returns a cons cell (header . footer)
made from ewoc’s header and footer.
This sets the header and footer of ewoc to the strings header and footer, respectively.
These add a new node encapsulating data, putting it, respectively, at the beginning or end of ewoc’s chain of nodes.
These add a new node encapsulating data, adding it to ewoc before or after node, respectively.
These return, respectively, the previous node and the next node of node in ewoc.
This returns the node in ewoc found at zero-based index n.
A negative n means count from the end. ewoc-nth
returns
nil
if n is out of range.
This extracts the data encapsulated by node and returns it.
This sets the data encapsulated by node to data.
This determines the node in ewoc which contains point (or
pos if specified), and returns that node. If ewoc has no
nodes, it returns nil
. If pos is before the first node,
it returns the first node; if pos is after the last node, it returns
the last node. The optional third arg guess
should be a node that is likely to be near pos; this doesn’t
alter the result, but makes the function run faster.
This returns the start position of node.
These move point to the previous or next, respectively, argth node
in ewoc. ewoc-goto-prev
does not move if it is already at
the first node or if ewoc is empty, whereas ewoc-goto-next
moves past the last node, returning nil
. Excepting this special
case, these functions return the node moved to.
This moves point to the start of node in ewoc.
This function regenerates the text of ewoc. It works by deleting the text between the header and the footer, i.e., all the data elements’ representations, and then calling the pretty-printer function for each node, one by one, in order.
This is similar to ewoc-refresh
, except that only nodes in
ewoc are updated instead of the entire set.
This deletes each node in nodes from ewoc.
This calls predicate for each data element in ewoc and
deletes those nodes for which predicate returns nil
.
Any args are passed to predicate.
This calls predicate for each data element in ewoc
and returns a list of those elements for which predicate
returns non-nil
. The elements in the list are ordered
as in the buffer. Any args are passed to predicate.
This calls map-function for each data element in ewoc and
updates those nodes for which map-function returns non-nil
.
Any args are passed to map-function.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a simple example using functions of the ewoc package to implement a “color components display”, an area in a buffer that represents a vector of three integers (itself representing a 24-bit RGB value) in various ways.
(setq colorcomp-ewoc nil colorcomp-data nil colorcomp-mode-map nil colorcomp-labels ["Red" "Green" "Blue"]) (defun colorcomp-pp (data) (if data (let ((comp (aref colorcomp-data data))) (insert (aref colorcomp-labels data) "\t: #x" (format "%02X" comp) " " (make-string (ash comp -2) ?#) "\n")) (let ((cstr (format "#%02X%02X%02X" (aref colorcomp-data 0) (aref colorcomp-data 1) (aref colorcomp-data 2))) (samp " (sample text) ")) (insert "Color\t: " (propertize samp 'face `(foreground-color . ,cstr)) (propertize samp 'face `(background-color . ,cstr)) "\n")))) (defun colorcomp (color) "Allow fiddling with COLOR in a new buffer. The buffer is in Color Components mode." (interactive "sColor (name or #RGB or #RRGGBB): ") (when (string= "" color) (setq color "green")) (unless (color-values color) (error "No such color: %S" color)) (switch-to-buffer (generate-new-buffer (format "originally: %s" color))) (kill-all-local-variables) (setq major-mode 'colorcomp-mode mode-name "Color Components") (use-local-map colorcomp-mode-map) (erase-buffer) (buffer-disable-undo) (let ((data (apply 'vector (mapcar (lambda (n) (ash n -8)) (color-values color)))) (ewoc (ewoc-create 'colorcomp-pp "\nColor Components\n\n" (substitute-command-keys "\n\\{colorcomp-mode-map}")))) (set (make-local-variable 'colorcomp-data) data) (set (make-local-variable 'colorcomp-ewoc) ewoc) (ewoc-enter-last ewoc 0) (ewoc-enter-last ewoc 1) (ewoc-enter-last ewoc 2) (ewoc-enter-last ewoc nil)))
This example can be extended to be a “color selection widget” (in
other words, the controller part of the “model/view/controller”
design paradigm) by defining commands to modify colorcomp-data
and to “finish” the selection process, and a keymap to tie it all
together conveniently.
(defun colorcomp-mod (index limit delta) (let ((cur (aref colorcomp-data index))) (unless (= limit cur) (aset colorcomp-data index (+ cur delta))) (ewoc-invalidate colorcomp-ewoc (ewoc-nth colorcomp-ewoc index) (ewoc-nth colorcomp-ewoc -1)))) (defun colorcomp-R-more () (interactive) (colorcomp-mod 0 255 1)) (defun colorcomp-G-more () (interactive) (colorcomp-mod 1 255 1)) (defun colorcomp-B-more () (interactive) (colorcomp-mod 2 255 1)) (defun colorcomp-R-less () (interactive) (colorcomp-mod 0 0 -1)) (defun colorcomp-G-less () (interactive) (colorcomp-mod 1 0 -1)) (defun colorcomp-B-less () (interactive) (colorcomp-mod 2 0 -1)) (defun colorcomp-copy-as-kill-and-exit () "Copy the color components into the kill ring and kill the buffer. The string is formatted #RRGGBB (hash followed by six hex digits)." (interactive) (kill-new (format "#%02X%02X%02X" (aref colorcomp-data 0) (aref colorcomp-data 1) (aref colorcomp-data 2))) (kill-buffer nil)) (setq colorcomp-mode-map (let ((m (make-sparse-keymap))) (suppress-keymap m) (define-key m "i" 'colorcomp-R-less) (define-key m "o" 'colorcomp-R-more) (define-key m "k" 'colorcomp-G-less) (define-key m "l" 'colorcomp-G-more) (define-key m "," 'colorcomp-B-less) (define-key m "." 'colorcomp-B-more) (define-key m " " 'colorcomp-copy-as-kill-and-exit) m))
Note that we never modify the data in each node, which is fixed when the
ewoc is created to be either nil
or an index into the vector
colorcomp-data
, the actual color components.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes the mechanism by which Emacs shows a matching open parenthesis when the user inserts a close parenthesis.
The value of this variable should be a function (of no arguments) to
be called whenever a character with close parenthesis syntax is inserted.
The value of blink-paren-function
may be nil
, in which
case nothing is done.
If this variable is nil
, then blink-matching-open
does
nothing.
This variable specifies the maximum distance to scan for a matching parenthesis before giving up.
This variable specifies the number of seconds to keep indicating the matching parenthesis. A fraction of a second often gives good results, but the default is 1, which works on all systems.
This function is the default value of blink-paren-function
. It
assumes that point follows a character with close parenthesis syntax
and applies the appropriate effect momentarily to the matching opening
character. If that character is not already on the screen, it
displays the character’s context in the echo area. To avoid long
delays, this function does not search farther than
blink-matching-paren-distance
characters.
Here is an example of calling this function explicitly.
(defun interactive-blink-matching-open () "Indicate momentarily the start of parenthesized sexp before point." (interactive)
(let ((blink-matching-paren-distance (buffer-size)) (blink-matching-paren t)) (blink-matching-open)))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how characters are actually displayed by Emacs. Typically, a character is displayed as a glyph (a graphical symbol which occupies one character position on the screen), whose appearance corresponds to the character itself. For example, the character ‘a’ (character code 97) is displayed as ‘a’. Some characters, however, are displayed specially. For example, the formfeed character (character code 12) is usually displayed as a sequence of two glyphs, ‘^L’, while the newline character (character code 10) starts a new screen line.
You can modify how each character is displayed by defining a display table, which maps each character code into a sequence of glyphs. See section Display Tables.
37.21.1 Usual Display Conventions | The usual conventions for displaying characters. | |
37.21.2 Display Tables | What a display table consists of. | |
37.21.3 Active Display Table | How Emacs selects a display table to use. | |
37.21.4 Glyphs | How to define a glyph, and what glyphs mean. | |
37.21.5 Glyphless Character Display | How glyphless characters are drawn. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are the conventions for displaying each character code (in the absence of a display table, which can override these conventions; see section Display Tables).
tab-width
controls the number of
spaces per tab stop (see below).
ctl-arrow
. If this variable is non-nil
(the default),
these characters are displayed as sequences of two glyphs, where the
first glyph is ‘^’ (a display table can specify a glyph to use
instead of ‘^’); e.g., the DEL character is displayed as
‘^?’.
If ctl-arrow
is nil
, these characters are displayed as
octal escapes (see below).
This rule also applies to carriage return (character code 13), if that character appears in the buffer. But carriage returns usually do not appear in buffer text; they are eliminated as part of end-of-line conversion (see section Basic Concepts of Coding Systems).
The above display conventions apply even when there is a display
table, for any character whose entry in the active display table is
nil
. Thus, when you set up a display table, you need only
specify the characters for which you want special behavior.
The following variables affect how certain characters are displayed
on the screen. Since they change the number of columns the characters
occupy, they also affect the indentation functions. They also affect
how the mode line is displayed; if you want to force redisplay of the
mode line using the new values, call the function
force-mode-line-update
(see section Mode Line Format).
This buffer-local variable controls how control characters are
displayed. If it is non-nil
, they are displayed as a caret
followed by the character: ‘^A’. If it is nil
, they are
displayed as octal escapes: a backslash followed by three octal
digits, as in ‘\001’.
The value of this buffer-local variable is the spacing between tab
stops used for displaying tab characters in Emacs buffers. The value
is in units of columns, and the default is 8. Note that this feature
is completely independent of the user-settable tab stops used by the
command tab-to-tab-stop
. See section Adjustable “Tab Stops”.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A display table is a special-purpose char-table
(see section Char-Tables), with display-table
as its subtype, which
is used to override the usual character display conventions. This
section describes how to make, inspect, and assign elements to a
display table object.
This creates and returns a display table. The table initially has
nil
in all elements.
The ordinary elements of the display table are indexed by character
codes; the element at index c says how to display the character
code c. The value should be nil
(which means to display
the character c according to the usual display conventions;
see section Usual Display Conventions), or a vector of glyph codes (which means to
display the character c as those glyphs; see section Glyphs).
Warning: if you use the display table to change the display of newline characters, the whole buffer will be displayed as one long “line”.
The display table also has six “extra slots” which serve special
purposes. Here is a table of their meanings; nil
in any slot
means to use the default for that slot, as stated below.
The glyph for the end of a truncated screen line (the default for this is ‘$’). See section Glyphs. On graphical terminals, Emacs uses arrows in the fringes to indicate truncation, so the display table has no effect.
The glyph for the end of a continued line (the default is ‘\’). On graphical terminals, Emacs uses curved arrows in the fringes to indicate continuation, so the display table has no effect.
The glyph for indicating a character displayed as an octal character code (the default is ‘\’).
The glyph for indicating a control character (the default is ‘^’).
A vector of glyphs for indicating the presence of invisible lines (the default is ‘...’). See section Selective Display.
The glyph used to draw the border between side-by-side windows (the default is ‘|’). See section Splitting Windows. This takes effect only when there are no scroll bars; if scroll bars are supported and in use, a scroll bar separates the two windows.
For example, here is how to construct a display table that mimics
the effect of setting ctl-arrow
to a non-nil
value
(see section Glyphs, for the function make-glyph-code
):
(setq disptab (make-display-table)) (dotimes (i 32) (or (= i ?\t) (= i ?\n) (aset disptab i (vector (make-glyph-code ?^ 'escape-glyph) (make-glyph-code (+ i 64) 'escape-glyph))))) (aset disptab 127 (vector (make-glyph-code ?^ 'escape-glyph) (make-glyph-code ?? 'escape-glyph)))))
This function returns the value of the extra slot slot of
display-table. The argument slot may be a number from 0 to
5 inclusive, or a slot name (symbol). Valid symbols are
truncation
, wrap
, escape
, control
,
selective-display
, and vertical-border
.
This function stores value in the extra slot slot of
display-table. The argument slot may be a number from 0 to
5 inclusive, or a slot name (symbol). Valid symbols are
truncation
, wrap
, escape
, control
,
selective-display
, and vertical-border
.
This function displays a description of the display table display-table in a help buffer.
This command displays a description of the current display table in a help buffer.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each window can specify a display table, and so can each buffer.
The window’s display table, if there is one, takes precedence over the
buffer’s display table. If neither exists, Emacs tries to use the
standard display table; if that is nil
, Emacs uses the usual
character display conventions (see section Usual Display Conventions).
Note that display tables affect how the mode line is displayed, so
if you want to force redisplay of the mode line using a new display
table, call force-mode-line-update
(see section Mode Line Format).
This function returns window’s display table, or nil
if
there is none. The default for window is the selected window.
This function sets the display table of window to table.
The argument table should be either a display table or
nil
.
This variable is automatically buffer-local in all buffers; its value
specifies the buffer’s display table. If it is nil
, there is
no buffer display table.
The value of this variable is the standard display table, which is
used when Emacs is displaying a buffer in a window with neither a
window display table nor a buffer display table defined. Its default
is nil
.
The disp-table library defines several functions for changing the standard display table.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A glyph is a graphical symbol which occupies a single character position on the screen. Each glyph is represented in Lisp as a glyph code, which specifies a character and optionally a face to display it in (see section Faces). The main use of glyph codes is as the entries of display tables (see section Display Tables). The following functions are used to manipulate glyph codes:
This function returns a glyph code representing char char with
face face. If face is omitted or nil
, the glyph
uses the default face; in that case, the glyph code is an integer. If
face is non-nil
, the glyph code is not necessarily an
integer object.
This function returns the character of glyph code glyph.
This function returns face of glyph code glyph, or nil
if
glyph uses the default face.
You can set up a glyph table to change how glyph codes are
actually displayed on text terminals. This feature is semi-obsolete;
use glyphless-char-display
instead (see section Glyphless Character Display).
The value of this variable, if non-nil
, is the current glyph
table. It takes effect only on character terminals; on graphical
displays, all glyphs are displayed literally. The glyph table should
be a vector whose gth element specifies how to display glyph
code g, where g is the glyph code for a glyph whose face
is unspecified. Each element should be one of the following:
nil
Display this glyph literally.
Display this glyph by sending the specified string to the terminal.
Display the specified glyph code instead.
Any integer glyph code greater than or equal to the length of the glyph table is displayed literally.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Glyphless characters are characters which are displayed in a special way, e.g., as a box containing a hexadecimal code, instead of being displayed literally. These include characters which are explicitly defined to be glyphless, as well as characters for which there is no available font (on a graphical display), and characters which cannot be encoded by the terminal’s coding system (on a text terminal).
The value of this variable is a char-table which defines glyphless characters and how they are displayed. Each entry must be one of the following display methods:
nil
Display the character in the usual way.
zero-width
Don’t display the character.
thin-space
Display a thin space, 1-pixel wide on graphical displays, or 1-character wide on text terminals.
empty-box
Display an empty box.
hex-code
Display a box containing the Unicode codepoint of the character, in hexadecimal notation.
Display a box containing that string.
(graphical . text)
Display with graphical on graphical displays, and with text on text terminals. Both graphical and text must be one of the display methods described above.
The thin-space
, empty-box
, hex-code
, and
ASCII string display methods are drawn with the
glyphless-char
face.
The char-table has one extra slot, which determines how to display any
character that cannot be displayed with any available font, or cannot
be encoded by the terminal’s coding system. Its value should be one
of the above display methods, except zero-width
or a cons cell.
If a character has a non-nil
entry in an active display table,
the display table takes effect; in this case, Emacs does not consult
glyphless-char-display
at all.
This user option provides a convenient way to set
glyphless-char-display
for groups of similar characters. Do
not set its value directly from Lisp code; the value takes effect only
via a custom :set
function (see section Defining Customization Variables),
which updates glyphless-char-display
.
Its value should be an alist of elements (group
. method)
, where group is a symbol specifying a group of
characters, and method is a symbol specifying how to display
them.
group should be one of the following:
c0-control
ASCII control characters U+0000
to U+001F
,
excluding the newline and tab characters (normally displayed as escape
sequences like ‘^A’; see How Text Is Displayed in The GNU Emacs Manual).
c1-control
Non-ASCII, non-printing characters U+0080
to
U+009F
(normally displayed as octal escape sequences like
‘\230’).
format-control
Characters of Unicode General Category ‘Cf’, such as ‘U+200E’ (Left-to-Right Mark), but excluding characters that have graphic images, such as ‘U+00AD’ (Soft Hyphen).
no-font
Characters for there is no suitable font, or which cannot be encoded by the terminal’s coding system.
The method symbol should be one of zero-width
,
thin-space
, empty-box
, or hex-code
. These have
the same meanings as in glyphless-char-display
, above.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes how to make Emacs ring the bell (or blink the screen) to attract the user’s attention. Be conservative about how often you do this; frequent bells can become irritating. Also be careful not to use just beeping when signaling an error is more appropriate (see section Errors).
This function beeps, or flashes the screen (see visible-bell
below).
It also terminates any keyboard macro currently executing unless
do-not-terminate is non-nil
.
This is a synonym for ding
.
This variable determines whether Emacs should flash the screen to
represent a bell. Non-nil
means yes, nil
means no.
This is effective on graphical displays, and on text terminals
provided the terminal’s Termcap entry defines the visible bell
capability (‘vb’).
If this is non-nil
, it specifies how Emacs should “ring the
bell”. Its value should be a function of no arguments. If this is
non-nil
, it takes precedence over the visible-bell
variable.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs works with several window systems, most notably the X Window System. Both Emacs and X use the term “window”, but use it differently. An Emacs frame is a single window as far as X is concerned; the individual Emacs windows are not known to X at all.
This terminal-local variable tells Lisp programs what window system Emacs is using for displaying the frame. The possible values are
x
Emacs is displaying the frame using X.
w32
Emacs is displaying the frame using native MS-Windows GUI.
ns
Emacs is displaying the frame using the Nextstep interface (used on GNUstep and Mac OS X).
pc
Emacs is displaying the frame using MS-DOS direct screen writes.
nil
Emacs is displaying the frame on a character-based terminal.
This variable holds the value of window-system
used for the
first frame created by Emacs during startup. (When Emacs is invoked
with the --daemon option, it does not create any initial
frames, so initial-window-system
is nil
. See daemon in The GNU Emacs Manual.)
This function returns a symbol whose name tells what window system is
used for displaying frame (which defaults to the currently
selected frame). The list of possible symbols it returns is the same
one documented for the variable window-system
above.
Do not use window-system
and
initial-window-system
as predicates or boolean flag variables,
if you want to write code that works differently on text terminals and
graphic displays. That is because window-system
is not a good
indicator of Emacs capabilities on a given display type. Instead, use
display-graphic-p
or any of the other display-*-p
predicates described in Display Feature Testing.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs can display text written in scripts, such as Arabic, Farsi, and Hebrew, whose natural ordering for horizontal text display runs from right to left. Furthermore, segments of Latin script and digits embedded in right-to-left text are displayed left-to-right, while segments of right-to-left script embedded in left-to-right text (e.g., Arabic or Hebrew text in comments or strings in a program source file) are appropriately displayed right-to-left. We call such mixtures of left-to-right and right-to-left text bidirectional text. This section describes the facilities and options for editing and displaying bidirectional text.
Text is stored in Emacs buffers and strings in logical (or reading) order, i.e., the order in which a human would read each character. In right-to-left and bidirectional text, the order in which characters are displayed on the screen (called visual order) is not the same as logical order; the characters’ screen positions do not increase monotonically with string or buffer position. In performing this bidirectional reordering, Emacs follows the Unicode Bidirectional Algorithm (a.k.a. UBA), which is described in Annex #9 of the Unicode standard (http://www.unicode.org/reports/tr9/). Emacs currently provides a “Non-isolate Bidirectionality” class implementation of the UBA: it does not yet support the isolate directional formatting characters introduced with Unicode Standard v6.3.0.
If the value of this buffer-local variable is non-nil
(the
default), Emacs performs bidirectional reordering for display. The
reordering affects buffer text, as well as display strings and overlay
strings from text and overlay properties in the buffer (see section Overlay Properties, and see section The display
Property). If the value is
nil
, Emacs does not perform bidirectional reordering in the
buffer.
The default value of bidi-display-reordering
controls the
reordering of strings which are not directly supplied by a buffer,
including the text displayed in mode lines (see section Mode Line Format)
and header lines (see section Window Header Lines).
Emacs never reorders the text of a unibyte buffer, even if
bidi-display-reordering
is non-nil
in the buffer. This
is because unibyte buffers contain raw bytes, not characters, and thus
lack the directionality properties required for reordering.
Therefore, to test whether text in a buffer will be reordered for
display, it is not enough to test the value of
bidi-display-reordering
alone. The correct test is this:
(if (and enable-multibyte-characters bidi-display-reordering) ;; Buffer is being reordered for display )
However, unibyte display and overlay strings are reordered if their parent buffer is reordered. This is because plain-ASCII strings are stored by Emacs as unibyte strings. If a unibyte display or overlay string includes non-ASCII characters, these characters are assumed to have left-to-right direction.
Text covered by display
text properties, by overlays with
display
properties whose value is a string, and by any other
properties that replace buffer text, is treated as a single unit when
it is reordered for display. That is, the entire chunk of text
covered by these properties is reordered together. Moreover, the
bidirectional properties of the characters in such a chunk of text are
ignored, and Emacs reorders them as if they were replaced with a
single character U+FFFC
, known as the Object Replacement
Character. This means that placing a display property over a portion
of text may change the way that the surrounding text is reordered for
display. To prevent this unexpected effect, always place such
properties on text whose directionality is identical with text that
surrounds it.
Each paragraph of bidirectional text has a base direction, either right-to-left or left-to-right. Left-to-right paragraphs are displayed beginning at the left margin of the window, and are truncated or continued when the text reaches the right margin. Right-to-left paragraphs are displayed beginning at the right margin, and are continued or truncated at the left margin.
By default, Emacs determines the base direction of each paragraph by looking at the text at its beginning. The precise method of determining the base direction is specified by the UBA; in a nutshell, the first character in a paragraph that has an explicit directionality determines the base direction of the paragraph. However, sometimes a buffer may need to force a certain base direction for its paragraphs. For example, buffers containing program source code should force all paragraphs to be displayed left-to-right. You can use following variable to do this:
If the value of this buffer-local variable is the symbol
right-to-left
or left-to-right
, all paragraphs in the
buffer are assumed to have that specified direction. Any other value
is equivalent to nil
(the default), which means to determine
the base direction of each paragraph from its contents.
Modes for program source code should set this to left-to-right
.
Prog mode does this by default, so modes derived from Prog mode do not
need to set this explicitly (see section Basic Major Modes).
This function returns the paragraph direction at point in the named
buffer. The returned value is a symbol, either
left-to-right
or right-to-left
. If buffer is
omitted or nil
, it defaults to the current buffer. If the
buffer-local value of the variable bidi-paragraph-direction
is
non-nil
, the returned value will be identical to that value;
otherwise, the returned value reflects the paragraph direction
determined dynamically by Emacs. For buffers whose value of
bidi-display-reordering
is nil
as well as unibyte
buffers, this function always returns left-to-right
.
Sometimes there’s a need to move point in strict visual order, either to the left or to the right of its current screen position. Emacs provides a primitive to do that.
This function moves point of the currently selected window to the buffer position that appears immediately to the right or to the left of point on the screen. If direction is positive, point will move one screen position to the right, otherwise it will move one screen position to the left. Note that, depending on the surrounding bidirectional context, this could potentially move point many buffer positions away. If invoked at the end of a screen line, the function moves point to the rightmost or leftmost screen position of the next or previous screen line, as appropriate for the value of direction.
The function returns the new buffer position as its value.
Bidirectional reordering can have surprising and unpleasant effects when two strings with bidirectional content are juxtaposed in a buffer, or otherwise programmatically concatenated into a string of text. A typical problematic case is when a buffer consists of sequences of text “fields” separated by whitespace or punctuation characters, like Buffer Menu mode or Rmail Summary Mode. Because the punctuation characters used as separators have weak directionality, they take on the directionality of surrounding text. As result, a numeric field that follows a field with bidirectional content can be displayed to the left of the preceding field, messing up the expected layout. There are several ways to avoid this problem:
U+200E
, LEFT-TO-RIGHT MARK, or
LRM, to the end of each field that may have bidirectional
content, or prepend it to the beginning of the following field. The
function bidi-string-mark-left-to-right
, described below, comes
in handy for this purpose. (In a right-to-left paragraph, use
U+200F
, RIGHT-TO-LEFT MARK, or RLM, instead.) This
is one of the solutions recommended by the UBA.
display
property or overlay with a
property value of the form (space . PROPS)
(see section Specified Spaces). Emacs treats this display specification as a paragraph
separator, and reorders the text on either side separately.
This function returns its argument string, possibly modified,
such that the result can be safely concatenated with another string,
or juxtaposed with another string in a buffer, without disrupting the
relative layout of this string and the next one on display. If the
string returned by this function is displayed as part of a
left-to-right paragraph, it will always appear on display to the left
of the text that follows it. The function works by examining the
characters of its argument, and if any of those characters could cause
reordering on display, the function appends the LRM
character to the string. The appended LRM character is made
invisible by giving it an invisible
text property of t
(see section Invisible Text).
The reordering algorithm uses the bidirectional properties of the
characters stored as their bidi-class
property
(see section Character Properties). Lisp programs can change these
properties by calling the put-char-code-property
function.
However, doing this requires a thorough understanding of the
UBA, and is therefore not recommended. Any changes to the
bidirectional properties of a character have global effect: they
affect all Emacs frames and windows.
Similarly, the mirroring
property is used to display the
appropriate mirrored character in the reordered text. Lisp programs
can affect the mirrored display by changing this property. Again, any
such changes affect all of Emacs display.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter is about starting and getting out of Emacs, access to values in the operating system environment, and terminal input, output.
See section Building Emacs, for related information. See section Emacs Display, for additional operating system status information pertaining to the terminal and the screen.
38.1 Starting Up Emacs | Customizing Emacs startup processing. | |
38.2 Getting Out of Emacs | How exiting works (permanent or temporary). | |
38.3 Operating System Environment | Distinguish the name and kind of system. | |
38.4 User Identification | Finding the name and user id of the user. | |
38.5 Time of Day | Getting the current time. | |
38.6 Time Conversion | Converting a time from numeric form to calendrical data and vice versa. | |
38.7 Parsing and Formatting Times | Converting a time from numeric form to text and vice versa. | |
38.8 Processor Run time | Getting the run time used by Emacs. | |
38.9 Time Calculations | Adding, subtracting, comparing times, etc. | |
38.10 Timers for Delayed Execution | Setting a timer to call a function at a certain time. | |
38.11 Idle Timers | Setting a timer to call a function when Emacs has been idle for a certain length of time. | |
38.12 Terminal Input | Accessing and recording terminal input. | |
38.13 Terminal Output | Controlling and recording terminal output. | |
38.14 Sound Output | Playing sounds on the computer’s speaker. | |
38.15 Operating on X11 Keysyms | Operating on key symbols for X Windows. | |
38.16 Batch Mode | Running Emacs without terminal interaction. | |
38.17 Session Management | Saving and restoring state with X Session Management. | |
38.18 Desktop Notifications | Desktop notifications. | |
38.19 Notifications on File Changes | File notifications. | |
38.20 Dynamically Loaded Libraries | On-demand loading of support libraries. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes what Emacs does when it is started, and how you can customize these actions.
38.1.1 Summary: Sequence of Actions at Startup | Sequence of actions Emacs performs at startup. | |
38.1.2 The Init File | Details on reading the init file. | |
38.1.3 Terminal-Specific Initialization | How the terminal-specific Lisp file is read. | |
38.1.4 Command-Line Arguments | How command-line arguments are processed, and how you can customize them. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When Emacs is started up, it performs the following operations
(see normal-top-level
in startup.el):
load-path
, by running the file named
subdirs.el in each directory in the list. Normally, this file
adds the directory’s subdirectories to the list, and those are scanned
in their turn. The files subdirs.el are normally generated
automatically when Emacs is installed.
load-path
directories. This file is intended for registering input methods.
The search is only for any personal leim-list.el files that you
may have created; it skips the directories containing the standard Emacs
libraries (these should contain only a single leim-list.el file,
which is compiled into the Emacs executable).
before-init-time
to the value of
current-time
(see section Time of Day). It also sets
after-init-time
to nil
, which signals to Lisp programs
that Emacs is being initialized.
LANG
.
initial-window-system
specifies (see section initial-window-system). The initialization function for
each supported window system is specified by
window-system-initialization-alist
. If the value
of initial-window-system
is windowsystem, then the
appropriate initialization function is defined in the file
term/windowsystem-win.el. This file should have been
compiled into the Emacs executable when it was built.
before-init-hook
.
custom-reevaluate-setting
to re-initialize the members
of the list custom-delayed-init-variables
. These are any
pre-loaded user options whose default value depends on the run-time,
rather than build-time, context.
See section custom-initialize-delay.
inhibit-default-init
is non-nil
, nor if the options
‘-q’, ‘-Q’, or ‘--batch’ were specified.
abbrev-file-name
, if that file exists and can be read
(see section abbrev-file-name). This is not done if the
option ‘--batch’ was specified.
package-enable-at-startup
is non-nil
, it calls the
function package-initialize
to activate any optional Emacs Lisp
package that has been installed. See section Packaging Basics.
after-init-time
to the value of
current-time
. This variable was set to nil
earlier;
setting it to the current time signals that the initialization phase
is over, and, together with before-init-time
, provides the
measurement of how long it took.
after-init-hook
.
initial-major-mode
.
tty-setup-hook
. This is not done
in --batch
mode, nor if term-file-prefix
is nil
.
inhibit-startup-echo-area-message
.
--batch
was specified.
initial-buffer-choice
is a string, it visits the file (or
directory) with that name. If it is a function, it calls the function
with no arguments and selects the buffer that it returns.
If the *scratch* buffer exists and is empty, it inserts
initial-scratch-message
into that buffer.
emacs-startup-hook
.
frame-notice-user-settings
, which modifies the
parameters of the selected frame according to whatever the init files
specify.
window-setup-hook
. The only difference between this
hook and emacs-startup-hook
is that this one runs after the
previously mentioned modifications to the frame parameters.
inhibit-startup-screen
or initial-buffer-choice
are non-nil
, or if the ‘--no-splash’ or ‘-Q’ command-line
options were specified.
--daemon
was specified, it calls
server-start
and detaches from the controlling terminal.
See Emacs Server in The GNU Emacs Manual.
emacs-session-restore
passing it as argument the ID of the
previous session. See section Session Management.
The following options affect some aspects of the startup sequence.
This variable, if non-nil
, inhibits the startup screen. In
that case, Emacs typically displays the *scratch* buffer; but
see initial-buffer-choice
, below.
Do not set this variable in the init file of a new user, or in a way that affects more than one user, as that would prevent new users from receiving information about copyleft and basic Emacs usage.
inhibit-startup-message
and inhibit-splash-screen
are
aliases for this variable.
If non-nil
, this variable is a string that specifies a file or
directory for Emacs to display after starting up, instead of the
startup screen.
If its value is a function, Emacs calls that function which must
return a buffer which is then displayed.
If its value is t
, Emacs displays the *scratch* buffer.
This variable controls the display of the startup echo area message. You can suppress the startup echo area message by adding text with this form to your init file:
(setq inhibit-startup-echo-area-message "your-login-name")
Emacs explicitly checks for an expression as shown above in your init
file; your login name must appear in the expression as a Lisp string
constant. You can also use the Customize interface. Other methods of
setting inhibit-startup-echo-area-message
to the same value do
not inhibit the startup message. This way, you can easily inhibit the
message for yourself if you wish, but thoughtless copying of your init
file will not inhibit the message for someone else.
This variable, if non-nil
, should be a string, which is
inserted into the *scratch* buffer when Emacs starts up. If it
is nil
, the *scratch* buffer is empty.
The following command-line options affect some aspects of the startup sequence. See Initial Options in The GNU Emacs Manual.
--no-splash
Do not display a splash screen.
--batch
Run without an interactive terminal. See section Batch Mode.
--daemon
Do not initialize any display; just start a server in the background.
--no-init-file
-q
Do not load either the init file, or the default library.
--no-site-file
Do not load the site-start library.
--quick
-Q
Equivalent to ‘-q --no-site-file --no-splash’.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you start Emacs, it normally attempts to load your init file. This is either a file named .emacs or .emacs.el in your home directory, or a file named init.el in a subdirectory named .emacs.d in your home directory.
The command-line switches ‘-q’, ‘-Q’, and ‘-u’
control whether and where to find the init file; ‘-q’ (and the
stronger ‘-Q’) says not to load an init file, while ‘-u
user’ says to load user’s init file instead of yours.
See Entering Emacs in The GNU Emacs Manual. If neither
option is specified, Emacs uses the LOGNAME
environment
variable, or the USER
(most systems) or USERNAME
(MS
systems) variable, to find your home directory and thus your init
file; this way, even if you have su’d, Emacs still loads your own init
file. If those environment variables are absent, though, Emacs uses
your user-id to find your home directory.
An Emacs installation may have a default init file, which is a
Lisp library named default.el. Emacs finds this file through
the standard search path for libraries (see section How Programs Do Loading). The Emacs distribution does not come with this file; it is
intended for local customizations. If the default init file exists,
it is loaded whenever you start Emacs. But your own personal init
file, if any, is loaded first; if it sets inhibit-default-init
to a non-nil
value, then Emacs does not subsequently load the
default.el file. In batch mode, or if you specify ‘-q’
(or ‘-Q’), Emacs loads neither your personal init file nor
the default init file.
Another file for site-customization is site-start.el. Emacs loads this before the user’s init file. You can inhibit the loading of this file with the option ‘--no-site-file’.
This variable specifies the site-customization file to load before the
user’s init file. Its normal value is "site-start"
. The only
way you can change it with real effect is to do so before dumping
Emacs.
See Init File Examples in The GNU Emacs Manual, for examples of how to make various commonly desired customizations in your .emacs file.
If this variable is non-nil
, it prevents Emacs from loading the
default initialization library file. The default value is nil
.
This normal hook is run, once, just before loading all the init files (site-start.el, your init file, and default.el). (The only way to change it with real effect is before dumping Emacs.)
This normal hook is run, once, just after loading all the init files (site-start.el, your init file, and default.el), before loading the terminal-specific library (if started on a text terminal) and processing the command-line action arguments.
This normal hook is run, once, just after handling the command line arguments. In batch mode, Emacs does not run this hook.
This normal hook is very similar to emacs-startup-hook
.
The only difference is that it runs slightly later, after setting
of the frame parameters. See section window-setup-hook.
This variable holds the absolute file name of the user’s init file. If the actual init file loaded is a compiled file, such as .emacs.elc, the value refers to the corresponding source file.
This variable holds the name of the .emacs.d directory. It is ~/.emacs.d on all platforms but MS-DOS.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Each terminal type can have its own Lisp library that Emacs loads when
run on that type of terminal. The library’s name is constructed by
concatenating the value of the variable term-file-prefix
and the
terminal type (specified by the environment variable TERM
).
Normally, term-file-prefix
has the value
"term/"
; changing this is not recommended. Emacs finds the file
in the normal manner, by searching the load-path
directories, and
trying the ‘.elc’ and ‘.el’ suffixes.
The usual role of a terminal-specific library is to enable special
keys to send sequences that Emacs can recognize. It may also need to
set or add to input-decode-map
if the Termcap or Terminfo entry
does not specify all the terminal’s function keys. See section Terminal Input.
When the name of the terminal type contains a hyphen or underscore,
and no library is found whose name is identical to the terminal’s
name, Emacs strips from the terminal’s name the last hyphen or
underscore and everything that follows
it, and tries again. This process is repeated until Emacs finds a
matching library, or until there are no more hyphens or underscores in the name
(i.e., there is no terminal-specific library). For example, if the
terminal name is ‘xterm-256color’ and there is no
term/xterm-256color.el library, Emacs tries to load
term/xterm.el. If necessary, the terminal library can evaluate
(getenv "TERM")
to find the full name of the terminal type.
Your init file can prevent the loading of the terminal-specific
library by setting the variable term-file-prefix
to nil
.
You can also arrange to override some of the actions of the
terminal-specific library by using tty-setup-hook
. This is
a normal hook that Emacs runs after initializing a new text terminal.
You could use this hook to define initializations for terminals that do not
have their own libraries. See section Hooks.
If the value of this variable is non-nil
, Emacs loads a
terminal-specific initialization file as follows:
(load (concat term-file-prefix (getenv "TERM")))
You may set the term-file-prefix
variable to nil
in your
init file if you do not wish to load the
terminal-initialization file.
On MS-DOS, Emacs sets the TERM
environment variable to ‘internal’.
This variable is a normal hook that Emacs runs after initializing a
new text terminal. (This applies when Emacs starts up in non-windowed
mode, and when making a tty emacsclient
connection.) The
hook runs after loading your init file (if applicable) and the
terminal-specific Lisp file, so you can use it to adjust the
definitions made by that file.
For a related feature, see section window-setup-hook.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can use command-line arguments to request various actions when you start Emacs. Note that the recommended way of using Emacs is to start it just once, after logging in, and then do all editing in the same Emacs session (see Entering Emacs in The GNU Emacs Manual). For this reason, you might not use command-line arguments very often; nonetheless, they can be useful when invoking Emacs from session scripts or debugging Emacs. This section describes how Emacs processes command-line arguments.
This function parses the command line that Emacs was called with, processes it, and (amongst other things) loads the user’s init file and displays the startup messages.
The value of this variable is t
once the command line has been
processed.
If you redump Emacs by calling dump-emacs
(see section Building Emacs), you may wish to set this variable to nil
first in
order to cause the new dumped Emacs to process its new command-line
arguments.
This variable is an alist of user-defined command-line options and associated handler functions. By default it is empty, but you can add elements if you wish.
A command-line option is an argument on the command line, which has the form:
-option
The elements of the command-switch-alist
look like this:
(option . handler-function)
The CAR, option, is a string, the name of a command-line option (not including the initial hyphen). The handler-function is called to handle option, and receives the option name as its sole argument.
In some cases, the option is followed in the command line by an
argument. In these cases, the handler-function can find all the
remaining command-line arguments in the variable
command-line-args-left
(see below). (The entire list of
command-line arguments is in command-line-args
.)
The command-line arguments are parsed by the command-line-1
function in the startup.el file. See also Command Line Arguments for Emacs Invocation in The
GNU Emacs Manual.
The value of this variable is the list of command-line arguments passed to Emacs.
The value of this variable is the list of command-line arguments that have not yet been processed.
This variable’s value is a list of functions for handling an
unrecognized command-line argument. Each time the next argument to be
processed has no special meaning, the functions in this list are called,
in order of appearance, until one of them returns a non-nil
value.
These functions are called with no arguments. They can access the
command-line argument under consideration through the variable
argi
, which is bound temporarily at this point. The remaining
arguments (not including the current one) are in the variable
command-line-args-left
.
When a function recognizes and processes the argument in argi
, it
should return a non-nil
value to say it has dealt with that
argument. If it has also dealt with some of the following arguments, it
can indicate that by deleting them from command-line-args-left
.
If all of these functions return nil
, then the argument is treated
as a file name to visit.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are two ways to get out of Emacs: you can kill the Emacs job, which exits permanently, or you can suspend it, which permits you to reenter the Emacs process later. (In a graphical environment, you can of course simply switch to another application without doing anything special to Emacs, then switch back to Emacs when you want.)
38.2.1 Killing Emacs | Exiting Emacs irreversibly. | |
38.2.2 Suspending Emacs | Exiting Emacs reversibly. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Killing Emacs means ending the execution of the Emacs process.
If you started Emacs from a terminal, the parent process normally
resumes control. The low-level primitive for killing Emacs is
kill-emacs
.
This command calls the hook kill-emacs-hook
, then exits the
Emacs process and kills it.
If exit-data is an integer, that is used as the exit status of the Emacs process. (This is useful primarily in batch operation; see Batch Mode.)
If exit-data is a string, its contents are stuffed into the terminal input buffer so that the shell (or whatever program next reads input) can read them.
The kill-emacs
function is normally called via the
higher-level command C-x C-c
(save-buffers-kill-terminal
). See Exiting in The GNU
Emacs Manual. It is also called automatically if Emacs receives a
SIGTERM
or SIGHUP
operating system signal (e.g., when the
controlling terminal is disconnected), or if it receives a
SIGINT
signal while running in batch mode (see section Batch Mode).
This normal hook is run by kill-emacs
, before it kills Emacs.
Because kill-emacs
can be called in situations where user
interaction is impossible (e.g., when the terminal is disconnected),
functions on this hook should not attempt to interact with the user.
If you want to interact with the user when Emacs is shutting down, use
kill-emacs-query-functions
, described below.
When Emacs is killed, all the information in the Emacs process,
aside from files that have been saved, is lost. Because killing Emacs
inadvertently can lose a lot of work, the
save-buffers-kill-terminal
command queries for confirmation if
you have buffers that need saving or subprocesses that are running.
It also runs the abnormal hook kill-emacs-query-functions
:
When save-buffers-kill-terminal
is killing Emacs, it calls the
functions in this hook, after asking the standard questions and before
calling kill-emacs
. The functions are called in order of
appearance, with no arguments. Each function can ask for additional
confirmation from the user. If any of them returns nil
,
save-buffers-kill-emacs
does not kill Emacs, and does not run
the remaining functions in this hook. Calling kill-emacs
directly does not run this hook.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
On text terminals, it is possible to suspend Emacs, which
means stopping Emacs temporarily and returning control to its superior
process, which is usually the shell. This allows you to resume
editing later in the same Emacs process, with the same buffers, the
same kill ring, the same undo history, and so on. To resume Emacs,
use the appropriate command in the parent shell—most likely
fg
.
Suspending works only on a terminal device from which the Emacs session was started. We call that device the controlling terminal of the session. Suspending is not allowed if the controlling terminal is a graphical terminal. Suspending is usually not relevant in graphical environments, since you can simply switch to another application without doing anything special to Emacs.
Some operating systems (those without SIGTSTP
, or MS-DOS) do
not support suspension of jobs; on these systems, “suspension”
actually creates a new shell temporarily as a subprocess of Emacs.
Then you would exit the shell to return to Emacs.
This function stops Emacs and returns control to the superior process.
If and when the superior process resumes Emacs, suspend-emacs
returns nil
to its caller in Lisp.
This function works only on the controlling terminal of the Emacs
session; to relinquish control of other tty devices, use
suspend-tty
(see below). If the Emacs session uses more than
one terminal, you must delete the frames on all the other terminals
before suspending Emacs, or this function signals an error.
See section Multiple Terminals.
If string is non-nil
, its characters are sent to Emacs’s
superior shell, to be read as terminal input.
The characters in string are not echoed by the superior shell;
only the results appear.
Before suspending, suspend-emacs
runs the normal hook
suspend-hook
. After the user resumes Emacs,
suspend-emacs
runs the normal hook suspend-resume-hook
.
See section Hooks.
The next redisplay after resumption will redraw the entire screen,
unless the variable no-redraw-on-reenter
is non-nil
.
See section Refreshing the Screen.
Here is an example of how you could use these hooks:
(add-hook 'suspend-hook (lambda () (or (y-or-n-p "Really suspend? ") (error "Suspend canceled"))))
(add-hook 'suspend-resume-hook (lambda () (message "Resumed!") (sit-for 2)))
Here is what you would see upon evaluating (suspend-emacs "pwd")
:
---------- Buffer: Minibuffer ---------- Really suspend? y ---------- Buffer: Minibuffer ----------
---------- Parent Shell ---------- bash$ /home/username bash$ fg
---------- Echo Area ---------- Resumed!
Note that ‘pwd’ is not echoed after Emacs is suspended. But it is read and executed by the shell.
This variable is a normal hook that Emacs runs before suspending.
This variable is a normal hook that Emacs runs on resuming after a suspension.
If tty specifies a terminal device used by Emacs, this function
relinquishes the device and restores it to its prior state. Frames
that used the device continue to exist, but are not updated and Emacs
doesn’t read input from them. tty can be a terminal object, a
frame (meaning the terminal for that frame), or nil
(meaning
the terminal for the selected frame). See section Multiple Terminals.
If tty is already suspended, this function does nothing.
This function runs the hook suspend-tty-functions
, passing the
terminal object as an argument to each function.
This function resumes the previously suspended terminal device
tty; where tty has the same possible values as it does
for suspend-tty
.
This function reopens the terminal device, re-initializes it, and
redraws it with that terminal’s selected frame. It then runs the
hook resume-tty-functions
, passing the terminal object as an
argument to each function.
If the same device is already used by another Emacs terminal, this function signals an error. If tty is not suspended, this function does nothing.
This function returns non-nil
if tty is the
controlling terminal of the Emacs session; tty can be a
terminal object, a frame (meaning the terminal for that frame), or
nil
(meaning the terminal for the selected frame).
This command suspends a frame. For GUI frames, it calls
iconify-frame
(see section Visibility of Frames); for frames on
text terminals, it calls either suspend-emacs
or
suspend-tty
, depending on whether the frame is displayed on the
controlling terminal device or not.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs provides access to variables in the operating system environment through various functions. These variables include the name of the system, the user’s UID, and so on.
This variable holds the standard GNU configuration name for the hardware/software configuration of your system, as a string. For example, a typical value for a 64-bit GNU/Linux system is ‘"x86_64-unknown-linux-gnu"’.
The value of this variable is a symbol indicating the type of operating system Emacs is running on. The possible values are:
aix
IBM’s AIX.
berkeley-unix
Berkeley BSD and its variants.
cygwin
Cygwin, a Posix layer on top of MS-Windows.
darwin
Darwin (Mac OS X).
gnu
The GNU system (using the GNU kernel, which consists of the HURD and Mach).
gnu/linux
A GNU/Linux system—that is, a variant GNU system, using the Linux kernel. (These systems are the ones people often call “Linux”, but actually Linux is just the kernel, not the whole system.)
gnu/kfreebsd
A GNU (glibc-based) system with a FreeBSD kernel.
hpux
Hewlett-Packard HPUX operating system.
irix
Silicon Graphics Irix system.
ms-dos
Microsoft’s DOS. Emacs compiled with DJGPP for MS-DOS binds
system-type
to ms-dos
even when you run it on MS-Windows.
usg-unix-v
AT&T Unix System V.
windows-nt
Microsoft Windows NT, 9X and later. The value of system-type
is always windows-nt
, e.g., even on Windows 7.
We do not wish to add new symbols to make finer distinctions unless it
is absolutely necessary! In fact, we hope to eliminate some of these
alternatives in the future. If you need to make a finer distinction
than system-type
allows for, you can test
system-configuration
, e.g., against a regexp.
This function returns the name of the machine you are running on, as a string.
The symbol system-name
is a variable as well as a function. In
fact, the function returns whatever value the variable
system-name
currently holds. Thus, you can set the variable
system-name
in case Emacs is confused about the name of your
system. The variable is also useful for constructing frame titles
(see section Frame Titles).
If this variable is non-nil
, it is used instead of
system-name
for purposes of generating email addresses. For
example, it is used when constructing the default value of
user-mail-address
. See section User Identification. (Since this is
done when Emacs starts up, the value actually used is the one saved when
Emacs was dumped. See section Building Emacs.)
This function returns the value of the environment variable var,
as a string. var should be a string. If var is undefined
in the environment, getenv
returns nil
. It returns
‘""’ if var is set but null. Within Emacs, a list of environment
variables and their values is kept in the variable process-environment
.
(getenv "USER") ⇒ "lewis"
The shell command printenv
prints all or part of the environment:
bash$ printenv PATH=/usr/local/bin:/usr/bin:/bin USER=lewis
TERM=xterm SHELL=/bin/bash HOME=/home/lewis
…
This command sets the value of the environment variable named
variable to value. variable should be a string.
Internally, Emacs Lisp can handle any string. However, normally
variable should be a valid shell identifier, that is, a sequence
of letters, digits and underscores, starting with a letter or
underscore. Otherwise, errors may occur if subprocesses of Emacs try
to access the value of variable. If value is omitted or
nil
(or, interactively, with a prefix argument), setenv
removes variable from the environment. Otherwise, value
should be a string.
If the optional argument substitute is non-nil
, Emacs
calls the function substitute-env-vars
to expand any
environment variables in value.
setenv
works by modifying process-environment
; binding
that variable with let
is also reasonable practice.
setenv
returns the new value of variable, or nil
if it removed variable from the environment.
This variable is a list of strings, each describing one environment
variable. The functions getenv
and setenv
work by means
of this variable.
process-environment ⇒ ("PATH=/usr/local/bin:/usr/bin:/bin" "USER=lewis"
"TERM=xterm" "SHELL=/bin/bash" "HOME=/home/lewis" …)
If process-environment
contains “duplicate” elements that
specify the same environment variable, the first of these elements
specifies the variable, and the other “duplicates” are ignored.
This variable holds the list of environment variables Emacs inherited from its parent process when Emacs started.
This variable holds a string that says which character separates
directories in a search path (as found in an environment variable). Its
value is ":"
for Unix and GNU systems, and ";"
for MS systems.
This function takes a search path string such as the value of
the PATH
environment variable, and splits it at the separators,
returning a list of directory names. nil
in this list means
the current directory. Although the function’s name says
“colon”, it actually uses the value of path-separator
.
(parse-colon-path ":/foo:/bar") ⇒ (nil "/foo/" "/bar/")
This variable holds the program name under which Emacs was invoked. The value is a string, and does not include a directory name.
This variable holds the directory from which the Emacs executable was
invoked, or nil
if that directory cannot be determined.
If non-nil
, this is a directory within which to look for the
lib-src and etc subdirectories. In an installed Emacs,
it is normally nil
. It is non-nil
when Emacs can’t find those directories in their standard installed
locations, but can find them in a directory related somehow to the one
containing the Emacs executable (i.e., invocation-directory
).
This function returns the current 1-minute, 5-minute, and 15-minute system load averages, in a list. The load average indicates the number of processes trying to run on the system.
By default, the values are integers that are 100 times the system load
averages, but if use-float is non-nil
, then they are
returned as floating-point numbers without multiplying by 100.
If it is impossible to obtain the load average, this function signals an error. On some platforms, access to load averages requires installing Emacs as setuid or setgid so that it can read kernel information, and that usually isn’t advisable.
If the 1-minute load average is available, but the 5- or 15-minute averages are not, this function returns a shortened list containing the available averages.
(load-average) ⇒ (169 48 36)
(load-average t) ⇒ (1.69 0.48 0.36)
The shell command uptime
returns similar information.
This function returns the process ID of the Emacs process, as an integer.
This variable holds the erase character that was selected in the system’s terminal driver, before Emacs was started.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This variable says which user’s init files should be used by
Emacs—or nil
if none. ""
stands for the user who
originally logged in. The value reflects command-line options such as
‘-q’ or ‘-u user’.
Lisp packages that load files of customizations, or any other sort of
user profile, should obey this variable in deciding where to find it.
They should load the profile of the user name found in this variable.
If init-file-user
is nil
, meaning that the ‘-q’,
‘-Q’, or ‘-batch’ option was used, then Lisp packages should
not load any customization files or user profile.
This holds the nominal email address of the user who is using Emacs. Emacs normally sets this variable to a default value after reading your init files, but not if you have already set it. So you can set the variable to some other value in your init file if you do not want to use the default value.
This function returns the name under which the user is logged in.
It uses the environment variables LOGNAME
or USER
if
either is set. Otherwise, the value is based on the effective
UID, not the real UID.
If you specify uid (a number), the result is the user name that
corresponds to uid, or nil
if there is no such user.
This function returns the user name corresponding to Emacs’s real
UID. This ignores the effective UID, and the
environment variables LOGNAME
and USER
.
This function returns the full name of the logged-in user—or the value
of the environment variable NAME
, if that is set.
If the Emacs process’s user-id does not correspond to any known user (and
provided NAME
is not set), the result is "unknown"
.
If uid is non-nil
, then it should be a number (a user-id)
or a string (a login name). Then user-full-name
returns the full
name corresponding to that user-id or login name. If you specify a
user-id or login name that isn’t defined, it returns nil
.
The symbols user-login-name
, user-real-login-name
and
user-full-name
are variables as well as functions. The functions
return the same values that the variables hold. These variables allow
you to “fake out” Emacs by telling the functions what to return. The
variables are also useful for constructing frame titles (see section Frame Titles).
This function returns the real UID of the user. The value may be floating point, in the (unlikely) event that the UID is too large to fit in a Lisp integer.
This function returns the effective UID of the user. The value may be floating point.
This function returns the effective GID of the Emacs process. The value may be floating point.
This function returns the real GID of the Emacs process. The value may be floating point.
This function returns a list of strings, listing the user names on the
system. If Emacs cannot retrieve this information, the return value
is a list containing just the value of user-real-login-name
.
This function returns a list of strings, listing the names of user
groups on the system. If Emacs cannot retrieve this information, the
return value is nil
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section explains how to determine the current time and time zone.
Most of these functions represent time as a list of either four
integers, (sec-high sec-low microsec
picosec)
, or of three
integers, (sec-high sec-low microsec)
, or of
two integers, (sec-high sec-low)
. The integers
sec-high and sec-low give the high and low bits of an
integer number of seconds. This integer,
high * 2**16 + low,
is the number of seconds from the epoch (0:00 January 1, 1970
UTC) to the specified time. The third list element microsec, if
present, gives the number of microseconds from the start of that
second to the specified time.
Similarly, the fourth list element picosec, if present, gives
the number of picoseconds from the start of that microsecond to the
specified time.
The return value of current-time
represents time using four
integers, as do the timestamps in the return value of
file-attributes
(see Definition of file-attributes). In function arguments, e.g., the time-value
argument to current-time-string
, two-, three-, and four-integer
lists are accepted. You can convert times from the list
representation into standard human-readable strings using
current-time-string
, or to other forms using the
decode-time
and format-time-string
functions documented
in the following sections.
This function returns the current time and date as a human-readable
string. The format does not vary for the initial part of the string,
which contains the day of week, month, day of month, and time of day
in that order: the number of characters used for these fields is
always the same, so you can reliably
use substring
to extract them. You should count
characters from the beginning of the string rather than from the end,
as the year might not have exactly four digits, and additional
information may some day be added at the end.
The argument time-value, if given, specifies a time to format (represented as a list of integers), instead of the current time.
(current-time-string) ⇒ "Wed Oct 14 22:21:05 1987"
This function returns the current time, represented as a list of four
integers (sec-high sec-low microsec picosec)
.
These integers have trailing zeros on systems that return time with
lower resolutions. On all current machines picosec is a
multiple of 1000, but this may change as higher-resolution clocks
become available.
This function returns the current time as a floating-point number of seconds since the epoch. The optional argument time-value, if given, specifies a time (represented as a list of integers) to convert instead of the current time.
Warning: Since the result is floating point, it may not be exact. Do not use this function if precise time stamps are required.
This function returns a list describing the time zone that the user is in.
The value has the form (offset name)
. Here
offset is an integer giving the number of seconds ahead of UTC
(east of Greenwich). A negative value means west of Greenwich. The
second element, name, is a string giving the name of the time
zone. Both elements change when daylight saving time begins or ends;
if the user has specified a time zone that does not use a seasonal time
adjustment, then the value is constant through time.
If the operating system doesn’t supply all the information necessary to
compute the value, the unknown elements of the list are nil
.
The argument time-value, if given, specifies a time (represented as a list of integers) to analyze instead of the current time.
The current time zone is determined by the TZ
environment
variable. See section Operating System Environment. For example, you can tell Emacs
to use universal time with (setenv "TZ" "UTC0")
. If TZ
is not in the environment, Emacs uses a platform-dependent default
time zone.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions convert time values (lists of two to four integers, as explained in the previous section) into calendrical information and vice versa.
Many 32-bit operating systems are limited to time values containing 32 bits of information; these systems typically handle only the times from 1901-12-13 20:45:52 UTC through 2038-01-19 03:14:07 UTC. However, 64-bit and some 32-bit operating systems have larger time values, and can represent times far in the past or future.
Time conversion functions always use the Gregorian calendar, even for dates before the Gregorian calendar was introduced. Year numbers count the number of years since the year 1 B.C., and do not skip zero as traditional Gregorian years do; for example, the year number -37 represents the Gregorian year 38 B.C.
This function converts a time value into calendrical information. If you don’t specify time, it decodes the current time. The return value is a list of nine elements, as follows:
(seconds minutes hour day month year dow dst zone)
Here is what the elements mean:
The number of seconds past the minute, as an integer between 0 and 59. On some operating systems, this is 60 for leap seconds.
The number of minutes past the hour, as an integer between 0 and 59.
The hour of the day, as an integer between 0 and 23.
The day of the month, as an integer between 1 and 31.
The month of the year, as an integer between 1 and 12.
The year, an integer typically greater than 1900.
The day of week, as an integer between 0 and 6, where 0 stands for Sunday.
t
if daylight saving time is effect, otherwise nil
.
An integer indicating the time zone, as the number of seconds east of Greenwich.
Common Lisp Note: Common Lisp has different meanings for dow and zone.
This function is the inverse of decode-time
. It converts seven
items of calendrical data into a time value. For the meanings of the
arguments, see the table above under decode-time
.
Year numbers less than 100 are not treated specially. If you want them
to stand for years above 1900, or years above 2000, you must alter them
yourself before you call encode-time
.
The optional argument zone defaults to the current time zone and
its daylight saving time rules. If specified, it can be either a list
(as you would get from current-time-zone
), a string as in the
TZ
environment variable, t
for Universal Time, or an
integer (as you would get from decode-time
). The specified
zone is used without any further alteration for daylight saving time.
If you pass more than seven arguments to encode-time
, the first
six are used as seconds through year, the last argument is
used as zone, and the arguments in between are ignored. This
feature makes it possible to use the elements of a list returned by
decode-time
as the arguments to encode-time
, like this:
(apply 'encode-time (decode-time …))
You can perform simple date arithmetic by using out-of-range values for the seconds, minutes, hour, day, and month arguments; for example, day 0 means the day preceding the given month.
The operating system puts limits on the range of possible time values; if you try to encode a time that is out of range, an error results. For instance, years before 1970 do not work on some systems; on others, years as early as 1901 do work.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions convert time values to text in a string, and vice versa. Time values are lists of two to four integers (see section Time of Day).
This function parses the time-string string and returns the corresponding time value.
This function converts time (or the current time, if time is omitted) to a string according to format-string. The argument format-string may contain ‘%’-sequences which say to substitute parts of the time. Here is a table of what the ‘%’-sequences mean:
This stands for the abbreviated name of the day of week.
This stands for the full name of the day of week.
This stands for the abbreviated name of the month.
This stands for the full name of the month.
This is a synonym for ‘%x %X’.
This has a locale-specific meaning. In the default locale (named C), it is equivalent to ‘%A, %B %e, %Y’.
This stands for the day of month, zero-padded.
This is a synonym for ‘%m/%d/%y’.
This stands for the day of month, blank-padded.
This is a synonym for ‘%b’.
This stands for the hour (00–23).
This stands for the hour (01–12).
This stands for the day of the year (001–366).
This stands for the hour (0–23), blank padded.
This stands for the hour (1–12), blank padded.
This stands for the month (01–12).
This stands for the minute (00–59).
This stands for a newline.
This stands for the nanoseconds (000000000–999999999). To ask for fewer digits, use ‘%3N’ for milliseconds, ‘%6N’ for microseconds, etc. Any excess digits are discarded, without rounding.
This stands for ‘AM’ or ‘PM’, as appropriate.
This is a synonym for ‘%I:%M:%S %p’.
This is a synonym for ‘%H:%M’.
This stands for the seconds (00–59).
This stands for a tab character.
This is a synonym for ‘%H:%M:%S’.
This stands for the week of the year (01–52), assuming that weeks start on Sunday.
This stands for the numeric day of week (0–6). Sunday is day 0.
This stands for the week of the year (01–52), assuming that weeks start on Monday.
This has a locale-specific meaning. In the default locale (named ‘C’), it is equivalent to ‘%D’.
This has a locale-specific meaning. In the default locale (named ‘C’), it is equivalent to ‘%T’.
This stands for the year without century (00–99).
This stands for the year with century.
This stands for the time zone abbreviation (e.g., ‘EST’).
This stands for the time zone numerical offset (e.g., ‘-0500’).
You can also specify the field width and type of padding for any of
these ‘%’-sequences. This works as in printf
: you write
the field width as digits in the middle of a ‘%’-sequences. If you
start the field width with ‘0’, it means to pad with zeros. If you
start the field width with ‘_’, it means to pad with spaces.
For example, ‘%S’ specifies the number of seconds since the minute; ‘%03S’ means to pad this with zeros to 3 positions, ‘%_3S’ to pad with spaces to 3 positions. Plain ‘%3S’ pads with zeros, because that is how ‘%S’ normally pads to two positions.
The characters ‘E’ and ‘O’ act as modifiers when used between
‘%’ and one of the letters in the table above. ‘E’ specifies
using the current locale’s “alternative” version of the date and time.
In a Japanese locale, for example, %Ex
might yield a date format
based on the Japanese Emperors’ reigns. ‘E’ is allowed in
‘%Ec’, ‘%EC’, ‘%Ex’, ‘%EX’, ‘%Ey’, and
‘%EY’.
‘O’ means to use the current locale’s “alternative” representation of numbers, instead of the ordinary decimal digits. This is allowed with most letters, all the ones that output numbers.
If universal is non-nil
, that means to describe the time as
Universal Time; nil
means describe it using what Emacs believes
is the local time zone (see current-time-zone
).
This function uses the C library function strftime
(see Formatting Calendar Time in The GNU C Library Reference
Manual) to do most of the work. In order to communicate with that
function, it first encodes its argument using the coding system
specified by locale-coding-system
(see section Locales); after
strftime
returns the resulting string,
format-time-string
decodes the string using that same coding
system.
This function converts seconds, the number of seconds since the
epoch, to a time value and returns that. To convert back, use
float-time
(see section Time of Day).
This function converts its argument seconds into a string of years, days, hours, etc., according to format-string. The argument format-string may contain ‘%’-sequences which control the conversion. Here is a table of what the ‘%’-sequences mean:
The integer number of 365-day years.
The integer number of days.
The integer number of hours.
The integer number of minutes.
The integer number of seconds.
Non-printing control flag. When it is used, other specifiers must be
given in the order of decreasing size, i.e., years before days, hours
before minutes, etc. Nothing will be produced in the result string to
the left of ‘%z’ until the first non-zero conversion is
encountered. For example, the default format used by
emacs-uptime
(see section emacs-uptime)
"%Y, %D, %H, %M, %z%S"
means that the number of seconds
will always be produced, but years, days, hours, and minutes will only
be shown if they are non-zero.
Produces a literal ‘%’.
Upper-case format sequences produce the units in addition to the numbers, lower-case formats produce only the numbers.
You can also specify the field width by following the ‘%’ with a
number; shorter numbers will be padded with blanks. An optional
period before the width requests zero-padding instead. For example,
"%.3Y"
might produce "004 years"
.
Warning: This function works only with values of seconds
that don’t exceed most-positive-fixnum
(see section most-positive-fixnum).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs provides several functions and primitives that return time, both elapsed and processor time, used by the Emacs process.
This function returns a string representing the Emacs
uptime—the elapsed wall-clock time this instance of Emacs is
running. The string is formatted by format-seconds
according
to the optional argument format. For the available format
descriptors, see format-seconds. If format
is nil
or omitted, it defaults to "%Y, %D, %H, %M,
%z%S"
.
When called interactively, it prints the uptime in the echo area.
This function returns the processor run time used by Emacs as a list
of four integers: (high low microsec
picosec)
, using the same format as current-time
(see section Time of Day).
Note that the time returned by this function excludes the time Emacs was not using the processor, and if the Emacs process has several threads, the returned value is the sum of the processor times used up by all Emacs threads.
If the system doesn’t provide a way to determine the processor run
time, get-internal-run-time
returns the same time as
current-time
.
This function returns the duration of the Emacs initialization (see section Summary: Sequence of Actions at Startup) in seconds, as a string. When called interactively, it prints the duration in the echo area.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions perform calendrical computations using time values
(the kind of list that current-time
returns).
This returns t
if time value t1 is less than time value
t2.
This returns the time difference t1 - t2 between two time values, in the same format as a time value.
This returns the sum of two time values, one of which ought to represent a time difference rather than a point in time. Here is how to add a number of seconds to a time value:
(time-add time (seconds-to-time seconds))
This function returns the number of days between the beginning of year 1 and time.
This returns the day number within the year corresponding to time.
This function returns t
if year is a leap year.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can set up a timer to call a function at a specified future time or after a certain length of idleness.
Emacs cannot run timers at any arbitrary point in a Lisp program; it
can run them only when Emacs could accept output from a subprocess:
namely, while waiting or inside certain primitive functions such as
sit-for
or read-event
which can wait. Therefore, a
timer’s execution may be delayed if Emacs is busy. However, the time of
execution is very precise if Emacs is idle.
Emacs binds inhibit-quit
to t
before calling the timer
function, because quitting out of many timer functions can leave
things in an inconsistent state. This is normally unproblematical
because most timer functions don’t do a lot of work. Indeed, for a
timer to call a function that takes substantial time to run is likely
to be annoying. If a timer function needs to allow quitting, it
should use with-local-quit
(see section Quitting). For example, if
a timer function calls accept-process-output
to receive output
from an external process, that call should be wrapped inside
with-local-quit
, to ensure that C-g works if the external
process hangs.
It is usually a bad idea for timer functions to alter buffer
contents. When they do, they usually should call undo-boundary
both before and after changing the buffer, to separate the timer’s
changes from user commands’ changes and prevent a single undo entry
from growing to be quite large.
Timer functions should also avoid calling functions that cause Emacs
to wait, such as sit-for
(see section Waiting for Elapsed Time or Input). This can lead to
unpredictable effects, since other timers (or even the same timer) can
run while waiting. If a timer function needs to perform an action
after a certain time has elapsed, it can do this by scheduling a new
timer.
If a timer function calls functions that can change the match data, it should save and restore the match data. See section Saving and Restoring the Match Data.
This sets up a timer that calls the function function with
arguments args at time time. If repeat is a number
(integer or floating point), the timer is scheduled to run again every
repeat seconds after time. If repeat is nil
,
the timer runs only once.
time may specify an absolute or a relative time.
Absolute times may be specified using a string with a limited variety of formats, and are taken to be times today, even if already in the past. The recognized forms are ‘xxxx’, ‘x:xx’, or ‘xx:xx’ (military time), and ‘xxam’, ‘xxAM’, ‘xxpm’, ‘xxPM’, ‘xx:xxam’, ‘xx:xxAM’, ‘xx:xxpm’, or ‘xx:xxPM’. A period can be used instead of a colon to separate the hour and minute parts.
To specify a relative time as a string, use numbers followed by units. For example:
denotes 1 minute from now.
denotes 65 seconds from now.
denotes exactly 103 months, 123 days, and 10862 seconds from now.
For relative time values, Emacs considers a month to be exactly thirty days, and a year to be exactly 365.25 days.
Not all convenient formats are strings. If time is a number
(integer or floating point), that specifies a relative time measured in
seconds. The result of encode-time
can also be used to specify
an absolute value for time.
In most cases, repeat has no effect on when first call
takes place—time alone specifies that. There is one exception:
if time is t
, then the timer runs whenever the time is a
multiple of repeat seconds after the epoch. This is useful for
functions like display-time
.
The function run-at-time
returns a timer value that identifies
the particular scheduled future action. You can use this value to call
cancel-timer
(see below).
A repeating timer nominally ought to run every repeat seconds, but remember that any invocation of a timer can be late. Lateness of one repetition has no effect on the scheduled time of the next repetition. For instance, if Emacs is busy computing for long enough to cover three scheduled repetitions of the timer, and then starts to wait, it will immediately call the timer function three times in immediate succession (presuming no other timers trigger before or between them). If you want a timer to run again no less than n seconds after the last invocation, don’t use the repeat argument. Instead, the timer function should explicitly reschedule the timer.
This variable’s value specifies the maximum number of times to repeat calling a timer function in a row, when many previously scheduled calls were unavoidably delayed.
Execute body, but give up after seconds seconds. If
body finishes before the time is up, with-timeout
returns
the value of the last form in body. If, however, the execution of
body is cut short by the timeout, then with-timeout
executes all the timeout-forms and returns the value of the last
of them.
This macro works by setting a timer to run after seconds seconds. If body finishes before that time, it cancels the timer. If the timer actually runs, it terminates execution of body, then executes timeout-forms.
Since timers can run within a Lisp program only when the program calls a
primitive that can wait, with-timeout
cannot stop executing
body while it is in the midst of a computation—only when it
calls one of those primitives. So use with-timeout
only with a
body that waits for input, not one that does a long computation.
The function y-or-n-p-with-timeout
provides a simple way to use
a timer to avoid waiting too long for an answer. See section Yes-or-No Queries.
This cancels the requested action for timer, which should be a
timer—usually, one previously returned by run-at-time
or
run-with-idle-timer
. This cancels the effect of that call to
one of these functions; the arrival of the specified time will not
cause anything special to happen.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is how to set up a timer that runs when Emacs is idle for a certain length of time. Aside from how to set them up, idle timers work just like ordinary timers.
Set up a timer which runs the next time Emacs is idle for secs
seconds. The value of secs may be a number or a value of the type
returned by current-idle-time
.
If repeat is nil
, the timer runs just once, the first time
Emacs remains idle for a long enough time. More often repeat is
non-nil
, which means to run the timer each time Emacs
remains idle for secs seconds.
The function run-with-idle-timer
returns a timer value which you
can use in calling cancel-timer
(see section Timers for Delayed Execution).
Emacs becomes idle when it starts waiting for user input, and
it remains idle until the user provides some input. If a timer is set
for five seconds of idleness, it runs approximately five seconds after
Emacs first becomes idle. Even if repeat is non-nil
,
this timer will not run again as long as Emacs remains idle, because
the duration of idleness will continue to increase and will not go
down to five seconds again.
Emacs can do various things while idle: garbage collect, autosave or handle data from a subprocess. But these interludes during idleness do not interfere with idle timers, because they do not reset the clock of idleness to zero. An idle timer set for 600 seconds will run when ten minutes have elapsed since the last user command was finished, even if subprocess output has been accepted thousands of times within those ten minutes, and even if there have been garbage collections and autosaves.
When the user supplies input, Emacs becomes non-idle while executing the input. Then it becomes idle again, and all the idle timers that are set up to repeat will subsequently run another time, one by one.
Do not write an idle timer function containing a loop which does a
certain amount of processing each time around, and exits when
(input-pending-p)
is non-nil
. This approach seems very
natural but has two problems:
Similarly, do not write an idle timer function that sets up another idle timer (including the same idle timer) with secs argument less than or equal to the current idleness time. Such a timer will run almost immediately, and continue running again and again, instead of waiting for the next time Emacs becomes idle. The correct approach is to reschedule with an appropriate increment of the current value of the idleness time, as described below.
If Emacs is idle, this function returns the length of time Emacs has
been idle, as a list of four integers: (sec-high
sec-low microsec picosec)
, using the same format as
current-time
(see section Time of Day).
When Emacs is not idle, current-idle-time
returns nil
.
This is a convenient way to test whether Emacs is idle.
The main use of current-idle-time
is when an idle timer
function wants to “take a break” for a while. It can set up another
idle timer to call the same function again, after a few seconds more
idleness. Here’s an example:
(defvar my-resume-timer nil "Timer for `my-timer-function' to reschedule itself, or nil.") (defun my-timer-function () ;; If the user types a command whilemy-resume-timer
;; is active, the next time this function is called from ;; its main idle timer, deactivatemy-resume-timer
. (when my-resume-timer (cancel-timer my-resume-timer)) ...do the work for a while... (when taking-a-break (setq my-resume-timer (run-with-idle-timer ;; Compute an idle time break-length ;; more than the current value. (time-add (current-idle-time) (seconds-to-time break-length)) nil 'my-timer-function))))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section describes functions and variables for recording or manipulating terminal input. See Emacs Display, for related functions.
38.12.1 Input Modes | Options for how input is processed. | |
38.12.2 Recording Input | Saving histories of recent or all input events. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function sets the mode for reading keyboard input. If
interrupt is non-nil
, then Emacs uses input interrupts.
If it is nil
, then it uses CBREAK mode. The default
setting is system-dependent. Some systems always use CBREAK mode
regardless of what is specified.
When Emacs communicates directly with X, it ignores this argument and uses interrupts if that is the way it knows how to communicate.
If flow is non-nil
, then Emacs uses XON/XOFF
(C-q, C-s) flow control for output to the terminal. This
has no effect except in CBREAK mode.
The argument meta controls support for input character codes
above 127. If meta is t
, Emacs converts characters with
the 8th bit set into Meta characters. If meta is nil
,
Emacs disregards the 8th bit; this is necessary when the terminal uses
it as a parity bit. If meta is neither t
nor nil
,
Emacs uses all 8 bits of input unchanged. This is good for terminals
that use 8-bit character sets.
If quit-char is non-nil
, it specifies the character to
use for quitting. Normally this character is C-g.
See section Quitting.
The current-input-mode
function returns the input mode settings
Emacs is currently using.
This function returns the current mode for reading keyboard input. It
returns a list, corresponding to the arguments of set-input-mode
,
of the form (interrupt flow meta quit)
in
which:
is non-nil
when Emacs is using interrupt-driven input. If
nil
, Emacs is using CBREAK mode.
is non-nil
if Emacs uses XON/XOFF (C-q, C-s)
flow control for output to the terminal. This value is meaningful only
when interrupt is nil
.
is t
if Emacs treats the eighth bit of input characters as
the meta bit; nil
means Emacs clears the eighth bit of every
input character; any other value means Emacs uses all eight bits as the
basic character code.
is the character Emacs currently uses for quitting, usually C-g.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This function returns a vector containing the last 300 input events from the keyboard or mouse. All input events are included, whether or not they were used as parts of key sequences. Thus, you always get the last 300 input events, not counting events generated by keyboard macros. (These are excluded because they are less interesting for debugging; it should be enough to see the events that invoked the macros.)
A call to clear-this-command-keys
(see section Information from the Command Loop)
causes this function to return an empty vector immediately afterward.
This function opens a dribble file named filename. When a dribble file is open, each input event from the keyboard or mouse (but not those from keyboard macros) is written in that file. A non-character event is expressed using its printed representation surrounded by ‘<…>’. Be aware that sensitive information (such as passwords) may end up recorded in the dribble file.
You close the dribble file by calling this function with an argument
of nil
.
See also the open-termscript
function (see section Terminal Output).
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The terminal output functions send output to a text terminal, or keep
track of output sent to the terminal. The variable baud-rate
tells you what Emacs thinks is the output speed of the terminal.
This variable’s value is the output speed of the terminal, as far as Emacs knows. Setting this variable does not change the speed of actual data transmission, but the value is used for calculations such as padding.
It also affects decisions about whether to scroll part of the screen or repaint on text terminals. See section Forcing Redisplay, for the corresponding functionality on graphical terminals.
The value is measured in baud.
If you are running across a network, and different parts of the
network work at different baud rates, the value returned by Emacs may be
different from the value used by your local terminal. Some network
protocols communicate the local terminal speed to the remote machine, so
that Emacs and other programs can get the proper value, but others do
not. If Emacs has the wrong value, it makes decisions that are less
than optimal. To fix the problem, set baud-rate
.
This function sends string to terminal without alteration.
Control characters in string have terminal-dependent effects.
This function operates only on text terminals. terminal may be
a terminal object, a frame, or nil
for the selected frame’s
terminal. In batch mode, string is sent to stdout
when
terminal is nil
.
One use of this function is to define function keys on terminals that have downloadable function key definitions. For example, this is how (on certain terminals) to define function key 4 to move forward four characters (by transmitting the characters C-u C-f to the computer):
(send-string-to-terminal "\eF4\^U\^F") ⇒ nil
This function is used to open a termscript file that will record
all the characters sent by Emacs to the terminal. It returns
nil
. Termscript files are useful for investigating problems
where Emacs garbles the screen, problems that are due to incorrect
Termcap entries or to undesirable settings of terminal options more
often than to actual Emacs bugs. Once you are certain which characters
were actually output, you can determine reliably whether they correspond
to the Termcap specifications in use.
(open-termscript "../junk/termscript") ⇒ nil
You close the termscript file by calling this function with an
argument of nil
.
See also open-dribble-file
in Recording Input.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To play sound using Emacs, use the function play-sound
. Only
certain systems are supported; if you call play-sound
on a
system which cannot really do the job, it gives an error.
The sound must be stored as a file in RIFF-WAVE format (‘.wav’) or Sun Audio format (‘.au’).
This function plays a specified sound. The argument, sound, has
the form (sound properties...)
, where the properties
consist of alternating keywords (particular symbols recognized
specially) and values corresponding to them.
Here is a table of the keywords that are currently meaningful in sound, and their meanings:
:file file
This specifies the file containing the sound to play.
If the file name is not absolute, it is expanded against
the directory data-directory
.
:data data
This specifies the sound to play without need to refer to a file. The value, data, should be a string containing the same bytes as a sound file. We recommend using a unibyte string.
:volume volume
This specifies how loud to play the sound. It should be a number in the range of 0 to 1. The default is to use whatever volume has been specified before.
:device device
This specifies the system device on which to play the sound, as a string. The default device is system-dependent.
Before actually playing the sound, play-sound
calls the functions in the list play-sound-functions
.
Each function is called with one argument, sound.
This function is an alternative interface to playing a sound file specifying an optional volume and device.
A list of functions to be called before playing a sound. Each function is called with one argument, a property list that describes the sound.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To define system-specific X11 keysyms, set the variable
system-key-alist
.
This variable’s value should be an alist with one element for each
system-specific keysym. Each element has the form (code
. symbol)
, where code is the numeric keysym code (not
including the “vendor specific” bit,
-2**28),
and symbol is the name for the function key.
For example (168 . mute-acute)
defines a system-specific key (used
by HP X servers) whose numeric code is
-2**28
+ 168.
It is not crucial to exclude from the alist the keysyms of other X servers; those do no harm, as long as they don’t conflict with the ones used by the X server actually in use.
The variable is always local to the current terminal, and cannot be buffer-local. See section Multiple Terminals.
You can specify which keysyms Emacs should use for the Meta, Alt, Hyper, and Super modifiers by setting these variables:
The name of the keysym that should stand for the Alt modifier (respectively, for Meta, Hyper, and Super). For example, here is how to swap the Meta and Alt modifiers within Emacs:
(setq x-alt-keysym 'meta) (setq x-meta-keysym 'alt)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The command-line option ‘-batch’ causes Emacs to run noninteractively. In this mode, Emacs does not read commands from the terminal, it does not alter the terminal modes, and it does not expect to be outputting to an erasable screen. The idea is that you specify Lisp programs to run; when they are finished, Emacs should exit. The way to specify the programs to run is with ‘-l file’, which loads the library named file, or ‘-f function’, which calls function with no arguments, or ‘--eval form’.
Any Lisp program output that would normally go to the echo area,
either using message
, or using prin1
, etc., with t
as the stream, goes instead to Emacs’s standard error descriptor when
in batch mode. Similarly, input that would normally come from the
minibuffer is read from the standard input descriptor.
Thus, Emacs behaves much like a noninteractive
application program. (The echo area output that Emacs itself normally
generates, such as command echoing, is suppressed entirely.)
This variable is non-nil
when Emacs is running in batch mode.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs supports the X Session Management Protocol, which is used to suspend and restart applications. In the X Window System, a program called the session manager is responsible for keeping track of the applications that are running. When the X server shuts down, the session manager asks applications to save their state, and delays the actual shutdown until they respond. An application can also cancel the shutdown.
When the session manager restarts a suspended session, it directs these applications to individually reload their saved state. It does this by specifying a special command-line argument that says what saved session to restore. For Emacs, this argument is ‘--smid session’.
Emacs supports saving state via a hook called
emacs-save-session-functions
. Emacs runs this hook when the
session manager tells it that the window system is shutting down. The
functions are called with no arguments, and with the current buffer
set to a temporary buffer. Each function can use insert
to add
Lisp code to this buffer. At the end, Emacs saves the buffer in a
file, called the session file.
Subsequently, when the session manager restarts Emacs, it loads the
session file automatically (see section Loading). This is performed by a
function named emacs-session-restore
, which is called during
startup. See section Summary: Sequence of Actions at Startup.
If a function in emacs-save-session-functions
returns
non-nil
, Emacs tells the session manager to cancel the
shutdown.
Here is an example that just inserts some text into *scratch* when Emacs is restarted by the session manager.
(add-hook 'emacs-save-session-functions 'save-yourself-test)
(defun save-yourself-test () (insert "(save-current-buffer (switch-to-buffer \"*scratch*\") (insert \"I am restored\"))") nil)
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs is able to send notifications on systems that support the
freedesktop.org Desktop Notifications Specification. In order to use
this functionality, Emacs must have been compiled with D-Bus support,
and the notifications
library must be loaded. See D-Bus in D-Bus integration in Emacs.
This function sends a notification to the desktop via D-Bus, consisting of the parameters specified by the params arguments. These arguments should consist of alternating keyword and value pairs. The supported keywords and values are as follows:
:bus bus
The D-Bus bus. This argument is needed only if a bus other than
:session
shall be used.
:title title
The notification title.
:body text
The notification body text. Depending on the implementation of the notification server, the text could contain HTML markups, like ‘"<b>bold text</b>"’, hyperlinks, or images. Special HTML characters must be encoded, as ‘"Contact <postmaster@localhost>!"’.
:app-name name
The name of the application sending the notification. The default is
notifications-application-name
.
:replaces-id id
The notification id that this notification replaces. id
must be the result of a previous notifications-notify
call.
:app-icon icon-file
The file name of the notification icon. If set to nil
, no icon
is displayed. The default is notifications-application-icon
.
:actions (key title key title ...)
A list of actions to be applied. key and title are both strings. The default action (usually invoked by clicking the notification) should have a key named ‘"default"’. The title can be anything, though implementations are free not to display it.
:timeout timeout
The timeout time in milliseconds since the display of the notification at which the notification should automatically close. If -1, the notification’s expiration time is dependent on the notification server’s settings, and may vary for the type of notification. If 0, the notification never expires. Default value is -1.
:urgency urgency
The urgency level. It can be low
, normal
, or critical
.
:action-items
When this keyword is given, the title string of the actions is interpreted as icon name.
:category category
The type of notification this is, a string. See the Desktop Notifications Specification for a list of standard categories.
:desktop-entry filename
This specifies the name of the desktop filename representing the calling program, like ‘"emacs"’.
:image-data (width height rowstride has-alpha bits channels data)
This is a raw data image format that describes the width, height, rowstride, whether there is an alpha channel, bits per sample, channels and image data, respectively.
:image-path path
This is represented either as a URI (‘file://’ is the only URI schema supported right now) or a name in a freedesktop.org-compliant icon theme from ‘$XDG_DATA_DIRS/icons’.
:sound-file filename
The path to a sound file to play when the notification pops up.
:sound-name name
A themable named sound from the freedesktop.org sound naming specification from ‘$XDG_DATA_DIRS/sounds’, to play when the notification pops up. Similar to the icon name, only for sounds. An example would be ‘"message-new-instant"’.
:suppress-sound
Causes the server to suppress playing any sounds, if it has that ability.
:resident
When set the server will not automatically remove the notification
when an action has been invoked. The notification will remain resident
in the server until it is explicitly removed by the user or by the
sender. This hint is likely only useful when the server has the
:persistence
capability.
:transient
When set the server will treat the notification as transient and by-pass the server’s persistence capability, if it should exist.
:x position
:y position
Specifies the X, Y location on the screen that the notification should point to. Both arguments must be used together.
:on-action function
Function to call when an action is invoked. The notification id and the key of the action are passed as arguments to the function.
:on-close function
Function to call when the notification has been closed by timeout or by the user. The function receive the notification id and the closing reason as arguments:
expired
if the notification has expired
dismissed
if the notification was dismissed by the user
close-notification
if the notification was closed by a call to
notifications-close-notification
undefined
if the notification server hasn’t provided a reason
Which parameters are accepted by the notification server can be
checked via notifications-get-capabilities
.
This function returns a notification id, an integer, which can be used
to manipulate the notification item with
notifications-close-notification
or the :replaces-id
argument of another notifications-notify
call. For example:
(defun my-on-action-function (id key) (message "Message %d, key \"%s\" pressed" id key)) ⇒ my-on-action-function
(defun my-on-close-function (id reason) (message "Message %d, closed due to \"%s\"" id reason)) ⇒ my-on-close-function
(notifications-notify :title "Title" :body "This is <b>important</b>." :actions '("Confirm" "I agree" "Refuse" "I disagree") :on-action 'my-on-action-function :on-close 'my-on-close-function) ⇒ 22
A message window opens on the desktop. Press "I agree" ⇒ Message 22, key "Confirm" pressed Message 22, closed due to "dismissed"
This function closes a notification with identifier id.
bus can be a string denoting a D-Bus connection, the default is
:session
.
Returns the capabilities of the notification server, a list of
symbols. bus can be a string denoting a D-Bus connection, the
default is :session
. The following capabilities can be
expected:
:actions
The server will provide the specified actions to the user.
:body
Supports body text.
:body-hyperlinks
The server supports hyperlinks in the notifications.
:body-images
The server supports images in the notifications.
:body-markup
Supports markup in the body text.
:icon-multi
The server will render an animation of all the frames in a given image array.
:icon-static
Supports display of exactly 1 frame of any given image array. This
value is mutually exclusive with :icon-multi
.
:persistence
The server supports persistence of notifications.
:sound
The server supports sounds on notifications.
Further vendor-specific caps start with :x-vendor
, like
:x-gnome-foo-cap
.
Return information on the notification server, a list of strings.
bus can be a string denoting a D-Bus connection, the default is
:session
. The returned list is (name vendor
version spec-version)
.
The product name of the server.
The vendor name. For example, ‘"KDE"’, ‘"GNOME"’.
The server’s version number.
The specification version the server is compliant with.
If spec_version is nil
, the server supports a
specification prior to ‘"1.0"’.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Several operating systems support watching of filesystems for changes of files. If configured properly, Emacs links a respective library like gfilenotify, inotify, or w32notify statically. These libraries enable watching of filesystems on the local machine.
It is also possible to watch filesystems on remote machines, see Remote Files in The GNU Emacs Manual This does not depend on one of the libraries linked to Emacs.
Since all these libraries emit different events on notified file
changes, there is the Emacs library filenotify
which provides a
unique interface.
Add a watch for filesystem events pertaining to file. This arranges for filesystem events pertaining to file to be reported to Emacs.
The returned value is a descriptor for the added watch. Its type
depends on the underlying library, it cannot be assumed to be an
integer as in the example below. It should be used for comparison by
equal
only.
If the file cannot be watched for some reason, this function
signals a file-notify-error
error.
Sometimes, mounted filesystems cannot be watched for file changes.
This is not detected by this function, a non-nil
return value
does not guarantee that changes on file will be notified.
flags is a list of conditions to set what will be watched for. It can include the following symbols:
change
watch for file changes
attribute-change
watch for file attribute changes, like permissions or modification time
If file is a directory, changes for all files in that directory will be notified. This does not work recursively.
When any event happens, Emacs will call the callback function passing it a single argument event, which is of the form
(descriptor action file [file1])
descriptor is the same object as the one returned by this function. action is the description of the event. It could be any one of the following symbols:
created
file was created
deleted
file was deleted
changed
file has changed
renamed
file has been renamed to file1
attribute-changed
a file attribute was changed
file and file1 are the name of the file(s) whose event is being reported. For example:
(require 'filenotify) ⇒ filenotify
(defun my-notify-callback (event) (message "Event %S" event)) ⇒ my-notify-callback
(file-notify-add-watch "/tmp" '(change attribute-change) 'my-notify-callback) ⇒ 35025468
(write-region "foo" nil "/tmp/foo") ⇒ Event (35025468 created "/tmp/.#foo") Event (35025468 created "/tmp/foo") Event (35025468 changed "/tmp/foo") Event (35025468 deleted "/tmp/.#foo")
(write-region "bla" nil "/tmp/foo") ⇒ Event (35025468 created "/tmp/.#foo") Event (35025468 changed "/tmp/foo") [2 times] Event (35025468 deleted "/tmp/.#foo")
(set-file-modes "/tmp/foo" (default-file-modes)) ⇒ Event (35025468 attribute-changed "/tmp/foo")
Whether the action renamed
is returned, depends on the used
watch library. It can be expected, when a directory is watched, and
both file and file1 belong to this directory. Otherwise,
the actions deleted
and created
could be returned in a
random order.
(rename-file "/tmp/foo" "/tmp/bla") ⇒ Event (35025468 renamed "/tmp/foo" "/tmp/bla")
(file-notify-add-watch "/var/tmp" '(change attribute-change) 'my-notify-callback) ⇒ 35025504
(rename-file "/tmp/bla" "/var/tmp/bla") ⇒ ;; gfilenotify Event (35025468 renamed "/tmp/bla" "/var/tmp/bla") ⇒ ;; inotify Event (35025504 created "/var/tmp/bla") Event (35025468 deleted "/tmp/bla")
Removes an existing file watch specified by its descriptor.
descriptor should be an object returned by
file-notify-add-watch
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A dynamically loaded library is a library that is loaded on demand, when its facilities are first needed. Emacs supports such on-demand loading of support libraries for some of its features.
This is an alist of dynamic libraries and external library files implementing them.
Each element is a list of the form
(library files…)
, where the car
is
a symbol representing a supported external library, and the rest are
strings giving alternate filenames for that library.
Emacs tries to load the library from the files in the order they appear in the list; if none is found, the Emacs session won’t have access to that library, and the features it provides will be unavailable.
Image support on some platforms uses this facility. Here’s an example of setting this variable for supporting images on MS-Windows:
(setq dynamic-library-alist '((xpm "libxpm.dll" "xpm4.dll" "libXpm-nox4.dll") (png "libpng12d.dll" "libpng12.dll" "libpng.dll" "libpng13d.dll" "libpng13.dll") (jpeg "jpeg62.dll" "libjpeg.dll" "jpeg-62.dll" "jpeg.dll") (tiff "libtiff3.dll" "libtiff.dll") (gif "giflib4.dll" "libungif4.dll" "libungif.dll") (svg "librsvg-2-2.dll") (gdk-pixbuf "libgdk_pixbuf-2.0-0.dll") (glib "libglib-2.0-0.dll") (gobject "libgobject-2.0-0.dll")))
Note that image types pbm
and xbm
do not need entries in
this variable because they do not depend on external libraries and are
always available in Emacs.
Also note that this variable is not meant to be a generic facility for accessing external libraries; only those already known by Emacs can be loaded through it.
This variable is ignored if the given library is statically linked into Emacs.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs provides a standard way to distribute Emacs Lisp code to users. A package is a collection of one or more files, formatted and bundled in such a way that users can easily download, install, uninstall, and upgrade it.
The following sections describe how to create a package, and how to put it in a package archive for others to download. See Packages in The GNU Emacs Manual, for a description of user-level features of the packaging system.
39.1 Packaging Basics | The basic concepts of Emacs Lisp packages. | |
39.2 Simple Packages | How to package a single .el file. | |
39.3 Multi-file Packages | How to package multiple files. | |
39.4 Creating and Maintaining Package Archives | Maintaining package archives. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A package is either a simple package or a multi-file package. A simple package is stored in a package archive as a single Emacs Lisp file, while a multi-file package is stored as a tar file (containing multiple Lisp files, and possibly non-Lisp files such as a manual).
In ordinary usage, the difference between simple packages and multi-file packages is relatively unimportant; the Package Menu interface makes no distinction between them. However, the procedure for creating them differs, as explained in the following sections.
Each package (whether simple or multi-file) has certain attributes:
A short word (e.g., ‘auctex’). This is usually also the symbol prefix used in the program (see section Emacs Lisp Coding Conventions).
A version number, in a form that the function version-to-list
understands (e.g., ‘11.86’). Each release of a package should be
accompanied by an increase in the version number.
This is shown when the package is listed in the Package Menu. It should occupy a single line, ideally in 36 characters or less.
This is shown in the buffer created by C-h P
(describe-package
), following the package’s brief description
and installation status. It normally spans multiple lines, and should
fully describe the package’s capabilities and how to begin using it
once it is installed.
A list of other packages (possibly including minimal acceptable version numbers) on which this package depends. The list may be empty, meaning this package has no dependencies. Otherwise, installing this package also automatically installs its dependencies; if any dependency cannot be found, the package cannot be installed.
Installing a package, either via the command package-install-file
,
or via the Package Menu, creates a subdirectory of
package-user-dir
named name-version, where
name is the package’s name and version its version
(e.g., ~/.emacs.d/elpa/auctex-11.86/). We call this the
package’s content directory. It is where Emacs puts the
package’s contents (the single Lisp file for a simple package, or the
files extracted from a multi-file package).
Emacs then searches every Lisp file in the content directory for
autoload magic comments (see section Autoload). These autoload
definitions are saved to a file named name-autoloads.el
in the content directory. They are typically used to autoload the
principal user commands defined in the package, but they can also
perform other tasks, such as adding an element to
auto-mode-alist
(see section How Emacs Chooses a Major Mode). Note that a package
typically does not autoload every function and variable defined
within it—only the handful of commands typically called to begin
using the package. Emacs then byte-compiles every Lisp file in the
package.
After installation, the installed package is loaded: Emacs
adds the package’s content directory to load-path
, and
evaluates the autoload definitions in name-autoloads.el.
Whenever Emacs starts up, it automatically calls the function
package-initialize
to load installed packages. This is done
after loading the init file and abbrev file (if any) and before
running after-init-hook
(see section Summary: Sequence of Actions at Startup). Automatic
package loading is disabled if the user option
package-enable-at-startup
is nil
.
This function initializes Emacs’ internal record of which packages are
installed, and loads them. The user option package-load-list
specifies which packages to load; by default, all installed packages
are loaded. See Package Installation in The GNU Emacs
Manual.
The optional argument no-activate, if non-nil
, causes
Emacs to update its record of installed packages without actually
loading them; it is for internal use only.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A simple package consists of a single Emacs Lisp source file. The file must conform to the Emacs Lisp library header conventions (see section Conventional Headers for Emacs Libraries). The package’s attributes are taken from the various headers, as illustrated by the following example:
;;; superfrobnicator.el --- Frobnicate and bifurcate flanges ;; Copyright (C) 2011 Free Software Foundation, Inc.
;; Author: J. R. Hacker <jrh@example.com> ;; Version: 1.3 ;; Package-Requires: ((flange "1.0")) ;; Keywords: multimedia, frobnicate ;; URL: http://example.com/jrhacker/superfrobnicate … ;;; Commentary: ;; This package provides a minor mode to frobnicate and/or ;; bifurcate any flanges you desire. To activate it, just type … ;;;###autoload (define-minor-mode superfrobnicator-mode …
The name of the package is the same as the base name of the file, as written on the first line. Here, it is ‘superfrobnicator’.
The brief description is also taken from the first line. Here, it is ‘Frobnicate and bifurcate flanges’.
The version number comes from the ‘Package-Version’ header, if it exists, or from the ‘Version’ header otherwise. One or the other must be present. Here, the version number is 1.3.
If the file has a ‘;;; Commentary:’ section, this section is used as the long description. (When displaying the description, Emacs omits the ‘;;; Commentary:’ line, as well as the leading comment characters in the commentary itself.)
If the file has a ‘Package-Requires’ header, that is used as the package dependencies. In the above example, the package depends on the ‘flange’ package, version 1.0 or higher. See section Conventional Headers for Emacs Libraries, for a description of the ‘Package-Requires’ header. If the header is omitted, the package has no dependencies.
The ‘Keywords’ and ‘URL’ headers are optional, but recommended.
The command describe-package
uses these to add links to its
output. The ‘Keywords’ header should contain at least one
standard keyword from the finder-known-keywords
list.
The file ought to also contain one or more autoload magic comments,
as explained in Packaging Basics. In the above example, a magic
comment autoloads superfrobnicator-mode
.
See section Creating and Maintaining Package Archives, for a explanation of how to add a single-file package to a package archive.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A multi-file package is less convenient to create than a single-file package, but it offers more features: it can include multiple Emacs Lisp files, an Info manual, and other file types (such as images).
Prior to installation, a multi-file package is stored in a package archive as a tar file. The tar file must be named name-version.tar, where name is the package name and version is the version number. Its contents, once extracted, must all appear in a directory named name-version, the content directory (see section Packaging Basics). Files may also extract into subdirectories of the content directory.
One of the files in the content directory must be named
name-pkg.el. It must contain a single Lisp form,
consisting of a call to the function define-package
, described
below. This defines the package’s version, brief description, and
requirements.
For example, if we distribute version 1.3 of the superfrobnicator as a multi-file package, the tar file would be superfrobnicator-1.3.tar. Its contents would extract into the directory superfrobnicator-1.3, and one of these would be the file superfrobnicator-pkg.el.
This function defines a package. name is the package name, a
string. version is the version, as a string of a form that can
be understood by the function version-to-list
. docstring
is the brief description.
requirements is a list of required packages and their versions.
Each element in this list should have the form (dep-name
dep-version)
, where dep-name is a symbol whose name is
the dependency’s package name, and dep-version is the
dependency’s version (a string).
If the content directory contains a file named README, this file is used as the long description.
If the content directory contains a file named dir, this is
assumed to be an Info directory file made with install-info
.
See Invoking
install-info in Texinfo. The relevant Info files should also
be present in the content directory. In this case, Emacs will
automatically add the content directory to Info-directory-list
when the package is activated.
Do not include any .elc files in the package. Those are created when the package is installed. Note that there is no way to control the order in which files are byte-compiled.
Do not include any file named name-autoloads.el. This file is reserved for the package’s autoload definitions (see section Packaging Basics). It is created automatically when the package is installed, by searching all the Lisp files in the package for autoload magic comments.
If the multi-file package contains auxiliary data files (such as
images), the package’s Lisp code can refer to these files via the
variable load-file-name
(see section Loading). Here is an example:
(defconst superfrobnicator-base (file-name-directory load-file-name)) (defun superfrobnicator-fetch-image (file) (expand-file-name file superfrobnicator-base))
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Via the Package Menu, users may download packages from package
archives. Such archives are specified by the variable
package-archives
, whose default value contains a single entry:
the archive hosted by the GNU project at http://elpa.gnu.org. This
section describes how to set up and maintain a package archive.
The value of this variable is an alist of package archives recognized by the Emacs package manager.
Each alist element corresponds to one archive, and should have the
form (id . location)
, where id is the name of
the archive (a string) and location is its base location
(a string).
If the base location starts with ‘http:’, it is treated as a HTTP URL, and packages are downloaded from this archive via HTTP (as is the case for the default GNU archive).
Otherwise, the base location should be a directory name. In this case, Emacs retrieves packages from this archive via ordinary file access. Such “local” archives are mainly useful for testing.
A package archive is simply a directory in which the package files, and associated files, are stored. If you want the archive to be reachable via HTTP, this directory must be accessible to a web server. How to accomplish this is beyond the scope of this manual.
A convenient way to set up and update a package archive is via the
package-x
library. This is included with Emacs, but not loaded
by default; type M-x load-library RET package-x RET to
load it, or add (require 'package-x)
to your init file.
See Lisp Libraries in The GNU Emacs Manual.
Once loaded, you can make use of the following:
The value of this variable is the base location of a package archive,
as a directory name. The commands in the package-x
library
will use this base location.
The directory name should be absolute. You may specify a remote name, such as /ssh:foo@example.com:/var/www/packages/, if the package archive is on a different machine. See Remote Files in The GNU Emacs Manual.
This command prompts for filename, a file name, and uploads that
file to package-archive-upload-base
. The file must be either a
simple package (a .el file) or a multi-file package (a
.tar file); otherwise, an error is raised. The package
attributes are automatically extracted, and the archive’s contents
list is updated with this information.
If package-archive-upload-base
does not specify a valid
directory, the function prompts interactively for one. If the
directory does not exist, it is created. The directory need not have
any initial contents (i.e., you can use this command to populate an
initially empty archive).
This command is similar to package-upload-file
, but instead of
prompting for a package file, it uploads the contents of the current
buffer. The current buffer must be visiting a simple package (a
.el file) or a multi-file package (a .tar file);
otherwise, an error is raised.
After you create an archive, remember that it is not accessible in the
Package Menu interface unless it is in package-archives
.
Maintaining a public package archive entails a degree of responsibility. When Emacs users install packages from your archive, those packages can cause Emacs to run arbitrary code with the permissions of the installing user. (This is true for Emacs code in general, not just for packages.) So you should ensure that your archive is well-maintained and keep the hosting system secure.
One way to increase the security of your packages is to sign them using a cryptographic key. If you have generated a private/public gpg key pair, you can use gpg to sign the package like this:
gpg -ba -o file.sig file
For a single-file package, file is the package Lisp file; for a multi-file package, it is the package tar file. You can also sign the archive’s contents file in the same way. Make the .sig files available in the same location as the packages. You should also make your public key available for people to download; e.g., by uploading it to a key server such as http://pgp.mit.edu/. When people install packages from your archive, they can use your public key to verify the signatures.
A full explanation of these matters is outside the scope of this manual. For more information on cryptographic keys and signing, see GnuPG in The GNU Privacy Guard Manual. Emacs comes with an interface to GNU Privacy Guard, see EasyPG in Emacs EasyPG Assistant Manual.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
For those users who live backwards in time, here is information about downgrading to Emacs version 23.4. We hope you will enjoy the greater simplicity that results from the absence of many Emacs 24.5 features.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
lexical-binding
variable has been
removed, and so has the lexical argument to eval
. The
defvar
and defconst
forms no longer mark variables as
dynamic, since all variables are dynamic.
Having only dynamic binding follows the spirit of Emacs extensibility, for it allows any Emacs code to access any defined variable with a minimum of fuss. But See section Proper Use of Dynamic Binding, for tips to avoid making your programs hard to understand.
nil
or omitted argument
does not enable the minor mode unconditionally; instead, it toggles
the minor mode—which is the straightforward thing to do, since that
is the behavior when invoked interactively. One downside is that it
is more troublesome to enable minor modes from hooks; you have to do
something like
(add-hook 'foo-hook (lambda () (bar-mode 1)))
or define turn-on-bar-mode
and call that from the hook.
prog-mode
dummy major mode has been removed. Instead of
using it as a crutch to meet programming mode conventions, you should
explicitly ensure that your mode follows those conventions.
See section Major Mode Conventions.
bidi-string-mark-left-to-right
has been removed; so have many
other functions and variables related to bidirectional display.
Unicode directionality characters like U+200E
("left-to-right
mark") have no special effect on display.
window-parent
, window parameters related to window arrangement,
and window-local buffer lists have all been removed. Functions for
resizing windows can delete windows if they become too small.
The “action function” feature for controlling buffer display has
been removed, including display-buffer-overriding-action
and
related variables, as well as the action argument to
display-buffer
and other functions. The way to
programmatically control how Emacs chooses a window to display a
buffer is to bind the right combination of pop-up-frames
and
other variables.
completion-extra-properties
variable, the metadata
action flag for completion functions, and the concept of
“completion categories”. Lisp programmers may now find the choice
of methods for tuning completion less bewildering, but if a package
finds the streamlined interface insufficient for its needs, it must
implement its own specialized completion feature.
copy-directory
now behaves the same whether or not the
destination is an existing directory: if the destination exists, the
contents of the first directory are copied into it (with
subdirectories handled recursively), rather than copying the first
directory into a subdirectory.
delete-file
and
delete-directory
have been removed. The variable
delete-by-moving-to-trash
must now be used with care; whenever
it is non-nil
, all calls to delete-file
or
delete-directory
use the trash.
copy-file
has been
removed. The return value of backup-buffer
no longer has an
entry for the SELinux file context.
(type item-name cache . binding)
The cache entry is used internally by Emacs to record equivalent keyboard key sequences for invoking the same command; Lisp programs should never use it.
gnutls
library has been removed, and the function
open-network-stream
correspondingly simplified.
Lisp programs that want an encrypted network connection must now call
external utilities such as starttls
or gnutls-cli
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. http://fsf.org/ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.
This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.
This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.
A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.
A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.
The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.
The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.
A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.
Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.
The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.
The “publisher” means any person or entity that distributes copies of the Document to the public.
A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.
The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.
You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and you may publicly display copies.
If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.
You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:
If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles.
You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.
You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”
You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.
A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.
Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.
If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.
You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.
The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document.
“Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site.
“CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.
“Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document.
An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.
To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:
Copyright (C) year your name. 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; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''.
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with…Texts.” line with this:
with the Invariant Sections being list their titles, with the Front-Cover Texts being list, and with the Back-Cover Texts being list.
If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.
If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Copyright © 2007 Free Software Foundation, Inc. http://fsf.org/ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for software and other kinds of works.
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program—to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
For the developers’ and authors’ protection, the GPL clearly explains that there is no warranty for this free software. For both users’ and authors’ sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users’ freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and modification follow.
“This License” refers to version 3 of the GNU General Public License.
“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
A “covered work” means either the unmodified Program or a work based on the Program.
To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work’s System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
The Corresponding Source for a work in source code form is that same work.
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work’s users, your or third parties’ legal rights to forbid circumvention of technological measures.
You may convey verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation’s users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party’s predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor’s “contributor version”.
A contributor’s “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor’s essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient’s use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.
one line to give the program's name and a brief idea of what it does. Copyright (C) year name of author This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
program Copyright (C) year name of author This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’. This is free software, and you are welcome to redistribute it under certain conditions; type ‘show c’ for details.
The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, your program’s commands might be different; for a GUI interface, you would use an “about box”.
You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see http://www.gnu.org/licenses/.
The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes no additional features of Emacs Lisp. Instead it gives advice on making effective use of the features described in the previous chapters, and describes conventions Emacs Lisp programmers should follow.
You can automatically check some of the conventions described below by running the command M-x checkdoc RET when visiting a Lisp file. It cannot check all of the conventions, and not all the warnings it gives necessarily correspond to problems, but it is worth examining them all.
D.1 Emacs Lisp Coding Conventions | Conventions for clean and robust programs. | |
D.2 Key Binding Conventions | Which keys should be bound by which programs. | |
D.3 Emacs Programming Tips | Making Emacs code fit smoothly in Emacs. | |
D.4 Tips for Making Compiled Code Fast | Making compiled code run fast. | |
D.5 Tips for Avoiding Compiler Warnings | Turning off compiler warnings. | |
D.6 Tips for Documentation Strings | Writing readable documentation strings. | |
D.7 Tips on Writing Comments | Conventions for writing comments. | |
D.8 Conventional Headers for Emacs Libraries | Standard headers for library packages. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are conventions that you should follow when writing Emacs Lisp code intended for widespread use:
This convention is mandatory for any file that includes custom definitions. If fixing such a file to follow this convention requires an incompatible change, go ahead and make the incompatible change; don’t postpone it.
Occasionally, for a command name intended for users to use, it is more convenient if some words come before the package’s name prefix. And constructs that define functions, variables, etc., work better if they start with ‘defun’ or ‘defvar’, so put the name prefix later on in the name.
This recommendation applies even to names for traditional Lisp
primitives that are not primitives in Emacs Lisp—such as
copy-list
. Believe it or not, there is more than one plausible
way to define copy-list
. Play it safe; append your name prefix
to produce a name like foo-copy-list
or mylib-copy-list
instead.
If you write a function that you think ought to be added to Emacs under
a certain name, such as twiddle-files
, don’t call it by that name
in your program. Call it mylib-twiddle-files
in your program,
and send mail to ‘bug-gnu-emacs@gnu.org’ suggesting we add
it to Emacs. If and when we do, we can change the name easily enough.
If one prefix is insufficient, your package can use two or three alternative common prefixes, so long as they make sense.
provide
at the end of each separate Lisp file.
See section Features.
require
to make sure they are loaded.
See section Features.
(eval-when-compile (require 'bar))
This tells Emacs to load bar just before byte-compiling
foo, so that the macro definition is available during
compilation. Using eval-when-compile
avoids loading bar
when the compiled version of foo is used. It should be
called before the first use of the macro in the file. See section Macros and Byte Compilation.
require
that library at the top-level and be done
with it. But if your file contains several independent features, and
only one or two require the extra library, then consider putting
require
statements inside the relevant functions rather than at
the top-level. Or use autoload
statements to load the extra
library when needed. This way people who don’t use those aspects of
your file do not need to load the extra library.
cl-lib
library
rather than the old cl
library. The latter does not
use a clean namespace (i.e., its definitions do not
start with a ‘cl-’ prefix). If your package loads cl
at
run time, that could cause name clashes for users who don’t use that
package.
There is no problem with using the cl
package at compile
time, with (eval-when-compile (require 'cl))
. That’s
sufficient for using the macros in the cl
package, because the
compiler expands them before generating the byte-code. It is still
better to use the more modern cl-lib
in this case, though.
framep
and frame-live-p
.
feature-unload-hook
, where feature is the name of
the feature the package provides, and make it undo any such changes.
Using unload-feature
to unload the file will run this function.
See section Unloading.
(defalias 'gnus-point-at-bol (if (fboundp 'point-at-bol) 'point-at-bol 'line-beginning-position))
eval-after-load
in libraries and packages
(see section Hooks for Loading). This feature is meant for personal
customizations; using it in a Lisp program is unclean, because it
modifies the behavior of another Lisp file in a way that’s not visible
in that file. This is an obstacle for debugging, much like advising a
function in the other package.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
follow-link
condition, so that the link obeys mouse-1-click-follows-link
.
See section Defining Clickable Text. See section Buttons, for an easy method of
implementing such clickable links.
Changing all the Emacs major modes to respect this convention was a lot of work; abandoning this convention would make that work go to waste, and inconvenience users. Please comply with it.
The reason for this rule is that a non-prefix binding for ESC in any context prevents recognition of escape sequences as function keys in that context.
For a state that accepts ordinary Emacs commands, or more generally any kind of state in which ESC followed by a function key or arrow key is potentially meaningful, then you must not define ESC ESC, since that would preclude recognizing an escape sequence after ESC. In these states, you should define ESC ESC ESC as the way to escape. Otherwise, define ESC ESC instead.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Following these conventions will make your program fit better into Emacs when it runs.
next-line
or previous-line
in programs; nearly
always, forward-line
is more convenient as well as more
predictable and robust. See section Motion by Text Lines.
In particular, don’t use any of these functions:
beginning-of-buffer
, end-of-buffer
replace-string
, replace-regexp
insert-file
, insert-buffer
If you just want to move point, or replace a certain string, or insert a file or buffer’s contents, without any of the other features intended for interactive users, you can replace these functions with one or two lines of simple Lisp code.
Vectors are advantageous for tables that are substantial in size and are accessed in random order (not searched front to back), provided there is no need to insert or delete elements (only lists allow that).
message
function, not princ
. See section The Echo Area.
error
(or signal
). The function error
does not return.
See section How to Signal an Error.
Don’t use message
, throw
, sleep-for
, or
beep
to report errors.
yes-or-no-p
or
y-or-n-p
should start with a capital letter and end with
‘? ’.
Enter the answer (default 42):
interactive
, if you use a Lisp expression to produce a list
of arguments, don’t try to provide the “correct” default values for
region or position arguments. Instead, provide nil
for those
arguments if they were not specified, and have the function body
compute the default value when the argument is nil
. For
instance, write this:
(defun foo (pos) (interactive (list (if specified specified-pos))) (unless pos (setq pos default-pos)) ...)
rather than this:
(defun foo (pos) (interactive (list (if specified specified-pos default-pos))) ...)
This is so that repetition of the command will recompute these defaults based on the current circumstances.
You do not need to take such precautions when you use interactive specs ‘d’, ‘m’ and ‘r’, because they make special arrangements to recompute the argument values on repetition of the command.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are ways of improving the execution speed of byte-compiled Lisp programs.
memq
, member
,
assq
, or assoc
is even faster than explicit iteration. It
can be worth rearranging a data structure so that one of these primitive
search functions can be used.
byte-compile
property. If the property is non-nil
, then the function is
handled specially.
For example, the following input will show you that aref
is
compiled specially (see section Functions that Operate on Arrays):
(get 'aref 'byte-compile) ⇒ byte-compile-two-args
Note that in this case (and many others), you must first load the
bytecomp library, which defines the byte-compile
property.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
defvar
definitions for these variables, like this:
(defvar foo)
Such a definition has no effect except to tell the compiler
not to warn about uses of the variable foo
in this file.
declare-function
statement (see section Telling the Compiler that a Function is Defined).
require
for that package to avoid compilation warnings
for them. For instance,
(eval-when-compile (require 'foo))
with-no-warnings
. See section Compiler Errors.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are some tips and conventions for the writing of documentation strings. You can check many of these conventions by running the command M-x checkdoc-minor-mode.
apropos
.
You can fill the text if that looks good. Emacs Lisp mode fills
documentation strings to the width specified by
emacs-lisp-docstring-fill-column
. However, you can sometimes
make a documentation string much more readable by adjusting its line
breaks with care. Use blank lines between sections if the
documentation string is long.
For a function, the first line should briefly answer the question, “What does this function do?” For a variable, the first line should briefly answer the question, “What does this value mean?”
Don’t limit the documentation string to one line; use as many lines as you need to explain the details of how to use the function or variable. Please use complete sentences for the rest of the text too.
eval
refers to its first argument as ‘FORM’, because the
actual argument name is form
:
Evaluate FORM and return its value.
Also write metasyntactic variables in capital letters, such as when you show the decomposition of a list or vector into subunits, some of which may vary. ‘KEY’ and ‘VALUE’ in the following example illustrate this practice:
The argument TABLE should be an alist whose elements have the form (KEY . VALUE). Here, KEY is ...
foo
, write “foo”, not
“Foo” (which is a different symbol).
This might appear to contradict the policy of writing function argument values, but there is no real contradiction; the argument value is not the same thing as the symbol that the function uses to hold the value.
If this puts a lower-case letter at the beginning of a sentence and that annoys you, rewrite the sentence so that the symbol is not at the start of it.
Help mode automatically creates a hyperlink when a documentation string uses a symbol name inside single quotes, if the symbol has either a function or a variable definition. You do not need to do anything special to make use of this feature. However, when a symbol has both a function definition and a variable definition, and you want to refer to just one of them, you can specify which one by writing one of the words ‘variable’, ‘option’, ‘function’, or ‘command’, immediately before the symbol name. (Case makes no difference in recognizing these indicator words.) For example, if you write
This function sets the variable `buffer-file-name'.
then the hyperlink will refer only to the variable documentation of
buffer-file-name
, and not to its function documentation.
If a symbol has a function definition and/or a variable definition, but those are irrelevant to the use of the symbol that you are documenting, you can write the words ‘symbol’ or ‘program’ before the symbol name to prevent making any hyperlink. For example,
If the argument KIND-OF-RESULT is the symbol `list', this function returns a list of all the objects that satisfy the criterion.
does not make a hyperlink to the documentation, irrelevant here, of the
function list
.
Normally, no hyperlink is made for a variable without variable documentation. You can force a hyperlink for such variables by preceding them with one of the words ‘variable’ or ‘option’.
Hyperlinks for faces are only made if the face name is preceded or followed by the word ‘face’. In that case, only the face documentation will be shown, even if the symbol is also defined as a variable or as a function.
To make a hyperlink to Info documentation, write the name of the Info node (or anchor) in single quotes, preceded by ‘info node’, ‘Info node’, ‘info anchor’ or ‘Info anchor’. The Info file name defaults to ‘emacs’. For example,
See Info node `Font Lock' and Info node `(elisp)Font Lock Basics'.
Finally, to create a hyperlink to URLs, write the URL in single quotes, preceded by ‘URL’. For example,
The home page for the GNU project has more information (see URL `http://www.gnu.org/').
forward-char
.
(This is normally ‘C-f’, but it may be some other character if the
user has moved key bindings.) See section Substituting Key Bindings in Documentation.
It is not practical to use ‘\\[…]’ very many times, because display of the documentation string will become slow. So use this to describe the most important commands in your major mode, and then use ‘\\{…}’ to display the rest of the mode’s keymap.
The argument FOO can be either a number \(a buffer position) or a string (a file name).
This prevents the open-parenthesis from being treated as the start of a defun (see Defuns in The GNU Emacs Manual).
dired-find-file
is:
In Dired, visit the file or directory named on this line.
defcustom
. See section Defining Global Variables.
nil
values are equivalent and indicate explicitly what
nil
and non-nil
mean.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
We recommend these conventions for comments:
Comments that start with a single semicolon, ‘;’, should all be aligned to the same column on the right of the source code. Such comments usually explain how the code on that line does its job. For example:
(setq base-version-list ; There was a base (assoc (substring fn 0 start-vn) ; version to which file-version-assoc-list)) ; this looks like ; a subversion.
Comments that start with two semicolons, ‘;;’, should be aligned to the same level of indentation as the code. Such comments usually describe the purpose of the following lines or the state of the program at that point. For example:
(prog1 (setq auto-fill-function … … ;; Update mode line. (force-mode-line-update)))
We also normally use two semicolons for comments outside functions.
;; This Lisp code is run in Emacs when it is to operate as ;; a server for other processes.
If a function has no documentation string, it should instead have a two-semicolon comment right before the function, explaining what the function does and how to call it properly. Explain precisely what each argument means and how the function interprets its possible values. It is much better to convert such comments to documentation strings, though.
Comments that start with three semicolons, ‘;;;’, should start at the left margin. We use them for comments which should be considered a “heading” by Outline minor mode. By default, comments starting with at least three semicolons (followed by a single space and a non-whitespace character) are considered headings, comments starting with two or fewer are not. Historically, triple-semicolon comments have also been used for commenting out lines within a function, but this use is discouraged.
When commenting out entire functions, use two semicolons.
Comments that start with four semicolons, ‘;;;;’, should be aligned to the left margin and are used for headings of major sections of a program. For example:
;;;; The kill ring
Generally speaking, the M-; (comment-dwim
) command
automatically starts a comment of the appropriate type; or indents an
existing comment to the right place, depending on the number of
semicolons.
See Manipulating Comments in The GNU Emacs Manual.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs has conventions for using special comments in Lisp libraries to divide them into sections and give information such as who wrote them. Using a standard format for these items makes it easier for tools (and people) to extract the relevant information. This section explains these conventions, starting with an example:
;;; foo.el --- Support for the Foo programming language ;; Copyright (C) 2010-2015 Your Name
;; Author: Your Name <yourname@example.com> ;; Maintainer: Someone Else <someone@example.com> ;; Created: 14 Jul 2010
;; Keywords: languages ;; Homepage: http://example.com/foo ;; This file is not part of GNU Emacs. ;; This file is free software… … ;; along with this file. If not, see <http://www.gnu.org/licenses/>.
The very first line should have this format:
;;; filename --- description
The description should be contained in one line. If the file needs a ‘-*-’ specification, put it after description. If this would make the first line too long, use a Local Variables section at the end of the file.
The copyright notice usually lists your name (if you wrote the file). If you have an employer who claims copyright on your work, you might need to list them instead. Do not say that the copyright holder is the Free Software Foundation (or that the file is part of GNU Emacs) unless your file has been accepted into the Emacs distribution. For more information on the form of copyright and license notices, see the guide on the GNU website.
After the copyright notice come several header comment lines, each beginning with ‘;; header-name:’. Here is a table of the conventional possibilities for header-name:
This line states the name and email address of at least the principal
author of the library. If there are multiple authors, list them on
continuation lines led by ;;
and a tab or at least two spaces.
We recommend including a contact email address, of the form
‘<…>’. For example:
;; Author: Your Name <yourname@example.com> ;; Someone Else <someone@example.com> ;; Another Person <another@example.com>
This header has the same format as the Author header. It lists the person(s) who currently maintain(s) the file (respond to bug reports, etc.).
If there is no maintainer line, the person(s) in the Author field is/are presumed to be the maintainers. Some files in Emacs use ‘FSF’ for the maintainer. This means that the original author is no longer responsible for the file, and that it is maintained as part of Emacs.
This optional line gives the original creation date of the file, and is for historical interest only.
If you wish to record version numbers for the individual Lisp program, put them in this line. Lisp files distributed with Emacs generally do not have a ‘Version’ header, since the version number of Emacs itself serves the same purpose. If you are distributing a collection of multiple files, we recommend not writing the version in every file, but only the main one.
This line lists keywords for the finder-by-keyword
help command.
Please use that command to see a list of the meaningful keywords.
This field is how people will find your package when they’re looking for things by topic. To separate the keywords, you can use spaces, commas, or both.
The name of this field is unfortunate, since people often assume it is the place to write arbitrary keywords that describe their package, rather than just the relevant Finder keywords.
This line states the homepage of the library.
If ‘Version’ is not suitable for use by the package manager, then
a package can define ‘Package-Version’; it will be used instead.
This is handy if ‘Version’ is an RCS id or something else that
cannot be parsed by version-to-list
. See section Packaging Basics.
If this exists, it names packages on which the current package depends for proper operation. See section Packaging Basics. This is used by the package manager both at download time (to ensure that a complete set of packages is downloaded) and at activation time (to ensure that a package is only activated if all its dependencies have been).
Its format is a list of lists. The car
of each sub-list is the
name of a package, as a symbol. The cadr
of each sub-list is
the minimum acceptable version number, as a string. For instance:
;; Package-Requires: ((gnus "1.0") (bubbles "2.7.2"))
The package code automatically defines a package named ‘emacs’ with the version number of the currently running Emacs. This can be used to require a minimal version of Emacs for a package.
Just about every Lisp library ought to have the ‘Author’ and ‘Keywords’ header comment lines. Use the others if they are appropriate. You can also put in header lines with other header names—they have no standard meanings, so they can’t do any harm.
We use additional stylized comments to subdivide the contents of the library file. These should be separated from anything else by blank lines. Here is a table of them:
This begins introductory comments that explain how the library works. It should come right after the copying permissions, terminated by a ‘Change Log’, ‘History’ or ‘Code’ comment line. This text is used by the Finder package, so it should make sense in that context.
This begins an optional log of changes to the file over time. Don’t put too much information in this section—it is better to keep the detailed logs in a version control system (as Emacs does) or in a separate ChangeLog file. ‘History’ is an alternative to ‘Change Log’.
This begins the actual code of the program.
This is the footer line; it appears at the very end of the file. Its purpose is to enable people to detect truncated versions of the file from the lack of a footer line.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This chapter describes how the runnable Emacs executable is dumped with the preloaded Lisp libraries in it, how storage is allocated, and some internal aspects of GNU Emacs that may be of interest to C programmers.
E.1 Building Emacs | How the dumped Emacs is made. | |
E.2 Pure Storage | Kludge to make preloaded Lisp functions shareable. | |
E.3 Garbage Collection | Reclaiming space for Lisp objects no longer used. | |
E.4 Memory Usage | Info about total size of Lisp objects made so far. | |
E.5 C Dialect | What C variant Emacs is written in. | |
E.6 Writing Emacs Primitives | Writing C code for Emacs. | |
E.7 Object Internals | Data formats of buffers, windows, processes. | |
E.8 C Integer Types | How C integer types are used inside Emacs. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section explains the steps involved in building the Emacs executable. You don’t have to know this material to build and install Emacs, since the makefiles do all these things automatically. This information is pertinent to Emacs developers.
Compilation of the C source files in the src directory produces an executable file called temacs, also called a bare impure Emacs. It contains the Emacs Lisp interpreter and I/O routines, but not the editing commands.
The command temacs -l loadup
would run temacs
and direct it to load loadup.el. The loadup
library
loads additional Lisp libraries, which set up the normal Emacs editing
environment. After this step, the Emacs executable is no longer
bare.
Because it takes some time to load the standard Lisp files, the
temacs executable usually isn’t run directly by users.
Instead, as one of the last steps of building Emacs, the command
‘temacs -batch -l loadup dump’ is run. The special ‘dump’
argument causes temacs
to dump out an executable program,
called emacs, which has all the standard Lisp files preloaded.
(The ‘-batch’ argument prevents temacs from trying to
initialize any of its data on the terminal, so that the tables of
terminal information are empty in the dumped Emacs.)
The dumped emacs executable (also called a pure Emacs)
is the one which is installed. The variable
preloaded-file-list
stores a list of the Lisp files preloaded
into the dumped Emacs. If you port Emacs to a new operating system,
and are not able to implement dumping, then Emacs must load
loadup.el each time it starts.
You can specify additional files to preload by writing a library named site-load.el that loads them. You may need to rebuild Emacs with an added definition
#define SITELOAD_PURESIZE_EXTRA n
to make n added bytes of pure space to hold the additional files; see src/puresize.h. (Try adding increments of 20000 until it is big enough.) However, the advantage of preloading additional files decreases as machines get faster. On modern machines, it is usually not advisable.
After loadup.el reads site-load.el, it finds the
documentation strings for primitive and preloaded functions (and
variables) in the file etc/DOC where they are stored, by
calling Snarf-documentation
(see Accessing Documentation).
You can specify other Lisp expressions to execute just before dumping by putting them in a library named site-init.el. This file is executed after the documentation strings are found.
If you want to preload function or variable definitions, there are three ways you can do this and make their documentation strings accessible when you subsequently run Emacs:
nil
value for byte-compile-dynamic-docstrings
as a local variable in each of these files, and load them with either
site-load.el or site-init.el. (This method has the
drawback that the documentation strings take up space in Emacs all the
time.)
It is not advisable to put anything in site-load.el or
site-init.el that would alter any of the features that users
expect in an ordinary unmodified Emacs. If you feel you must override
normal features for your site, do it with default.el, so that
users can override your changes if they wish. See section Summary: Sequence of Actions at Startup.
Note that if either site-load.el or site-init.el changes
load-path
, the changes will be lost after dumping.
See section Library Search. To make a permanent change to
load-path
, use the --enable-locallisppath option
of configure
.
In a package that can be preloaded, it is sometimes necessary (or
useful) to delay certain evaluations until Emacs subsequently starts
up. The vast majority of such cases relate to the values of
customizable variables. For example, tutorial-directory
is a
variable defined in startup.el, which is preloaded. The default
value is set based on data-directory
. The variable needs to
access the value of data-directory
when Emacs starts, not when
it is dumped, because the Emacs executable has probably been installed
in a different location since it was dumped.
This function delays the initialization of symbol to the next
Emacs start. You normally use this function by specifying it as the
:initialize
property of a customizable variable. (The argument
value is unused, and is provided only for compatibility with the
form Custom expects.)
In the unlikely event that you need a more general functionality than
custom-initialize-delay
provides, you can use
before-init-hook
(see section Summary: Sequence of Actions at Startup).
This function dumps the current state of Emacs into an executable file to-file. It takes symbols from from-file (this is normally the executable file temacs).
If you want to use this function in an Emacs that was already dumped, you must run Emacs with ‘-batch’.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lisp uses two kinds of storage for user-created Lisp objects: normal storage and pure storage. Normal storage is where all the new data created during an Emacs session are kept (see section Garbage Collection). Pure storage is used for certain data in the preloaded standard Lisp files—data that should never change during actual use of Emacs.
Pure storage is allocated only while temacs
is loading the
standard preloaded Lisp libraries. In the file emacs, it is
marked as read-only (on operating systems that permit this), so that
the memory space can be shared by all the Emacs jobs running on the
machine at once. Pure storage is not expandable; a fixed amount is
allocated when Emacs is compiled, and if that is not sufficient for
the preloaded libraries, temacs allocates dynamic memory for
the part that didn’t fit. The resulting image will work, but garbage
collection (see section Garbage Collection) is disabled in this situation,
causing a memory leak. Such an overflow normally won’t happen unless
you try to preload additional libraries or add features to the
standard ones. Emacs will display a warning about the overflow when
it starts. If this happens, you should increase the compilation
parameter SYSTEM_PURESIZE_EXTRA
in the file
src/puresize.h and rebuild Emacs.
This function makes a copy in pure storage of object, and returns it. It copies a string by simply making a new string with the same characters, but without text properties, in pure storage. It recursively copies the contents of vectors and cons cells. It does not make copies of other objects such as symbols, but just returns them unchanged. It signals an error if asked to copy markers.
This function is a no-op except while Emacs is being built and dumped; it is usually called only in preloaded Lisp files.
The value of this variable is the number of bytes of pure storage allocated so far. Typically, in a dumped Emacs, this number is very close to the total amount of pure storage available—if it were not, we would preallocate less.
This variable determines whether defun
should make a copy of the
function definition in pure storage. If it is non-nil
, then the
function definition is copied into pure storage.
This flag is t
while loading all of the basic functions for
building Emacs initially (allowing those functions to be shareable and
non-collectible). Dumping Emacs as an executable always writes
nil
in this variable, regardless of the value it actually has
before and after dumping.
You should not change this flag in a running Emacs.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When a program creates a list or the user defines a new function (such as by loading a library), that data is placed in normal storage. If normal storage runs low, then Emacs asks the operating system to allocate more memory. Different types of Lisp objects, such as symbols, cons cells, small vectors, markers, etc., are segregated in distinct blocks in memory. (Large vectors, long strings, buffers and certain other editing types, which are fairly large, are allocated in individual blocks, one per object; small strings are packed into blocks of 8k bytes, and small vectors are packed into blocks of 4k bytes).
Beyond the basic vector, a lot of objects like window, buffer, and
frame are managed as if they were vectors. The corresponding C data
structures include the struct vectorlike_header
field whose
size
member contains the subtype enumerated by enum pvec_type
and an information about how many Lisp_Object
fields this structure
contains and what the size of the rest data is. This information is
needed to calculate the memory footprint of an object, and used
by the vector allocation code while iterating over the vector blocks.
It is quite common to use some storage for a while, then release it by (for example) killing a buffer or deleting the last pointer to an object. Emacs provides a garbage collector to reclaim this abandoned storage. The garbage collector operates by finding and marking all Lisp objects that are still accessible to Lisp programs. To begin with, it assumes all the symbols, their values and associated function definitions, and any data presently on the stack, are accessible. Any objects that can be reached indirectly through other accessible objects are also accessible.
When marking is finished, all objects still unmarked are garbage. No matter what the Lisp program or the user does, it is impossible to refer to them, since there is no longer a way to reach them. Their space might as well be reused, since no one will miss them. The second (“sweep”) phase of the garbage collector arranges to reuse them.
The sweep phase puts unused cons cells onto a free list for future allocation; likewise for symbols and markers. It compacts the accessible strings so they occupy fewer 8k blocks; then it frees the other 8k blocks. Unreachable vectors from vector blocks are coalesced to create largest possible free areas; if a free area spans a complete 4k block, that block is freed. Otherwise, the free area is recorded in a free list array, where each entry corresponds to a free list of areas of the same size. Large vectors, buffers, and other large objects are allocated and freed individually.
Common Lisp note: Unlike other Lisps, GNU Emacs Lisp does not call the garbage collector when the free list is empty. Instead, it simply requests the operating system to allocate more storage, and processing continues until
gc-cons-threshold
bytes have been used.This means that you can make sure that the garbage collector will not run during a certain portion of a Lisp program by calling the garbage collector explicitly just before it (provided that portion of the program does not use so much space as to force a second garbage collection).
This command runs a garbage collection, and returns information on
the amount of space in use. (Garbage collection can also occur
spontaneously if you use more than gc-cons-threshold
bytes of
Lisp data since the previous garbage collection.)
garbage-collect
returns a list with information on amount of space in
use, where each entry has the form ‘(name size used)’
or ‘(name size used free)’. In the entry,
name is a symbol describing the kind of objects this entry represents,
size is the number of bytes used by each one, used is the number
of those objects that were found live in the heap, and optional free is
the number of those objects that are not live but that Emacs keeps around for
future allocations. So an overall result is:
((conses
cons-size used-conses free-conses) (symbols
symbol-size used-symbols free-symbols) (miscs
misc-size used-miscs free-miscs) (strings
string-size used-strings free-strings) (string-bytes
byte-size used-bytes) (vectors
vector-size used-vectors) (vector-slots
slot-size used-slots free-slots) (floats
float-size used-floats free-floats) (intervals
interval-size used-intervals free-intervals) (buffers
buffer-size used-buffers) (heap
unit-size total-size free-size))
Here is an example:
(garbage-collect) ⇒ ((conses 16 49126 8058) (symbols 48 14607 0) (miscs 40 34 56) (strings 32 2942 2607) (string-bytes 1 78607) (vectors 16 7247) (vector-slots 8 341609 29474) (floats 8 71 102) (intervals 56 27 26) (buffers 944 8) (heap 1024 11715 2678))
Below is a table explaining each element. Note that last heap
entry
is optional and present only if an underlying malloc
implementation
provides mallinfo
function.
Internal size of a cons cell, i.e., sizeof (struct Lisp_Cons)
.
The number of cons cells in use.
The number of cons cells for which space has been obtained from the operating system, but that are not currently being used.
Internal size of a symbol, i.e., sizeof (struct Lisp_Symbol)
.
The number of symbols in use.
The number of symbols for which space has been obtained from the operating system, but that are not currently being used.
Internal size of a miscellaneous entity, i.e.,
sizeof (union Lisp_Misc)
, which is a size of the
largest type enumerated in enum Lisp_Misc_Type
.
The number of miscellaneous objects in use. These include markers and overlays, plus certain objects not visible to users.
The number of miscellaneous objects for which space has been obtained from the operating system, but that are not currently being used.
Internal size of a string header, i.e., sizeof (struct Lisp_String)
.
The number of string headers in use.
The number of string headers for which space has been obtained from the operating system, but that are not currently being used.
This is used for convenience and equals to sizeof (char)
.
The total size of all string data in bytes.
Internal size of a vector header, i.e., sizeof (struct Lisp_Vector)
.
The number of vector headers allocated from the vector blocks.
Internal size of a vector slot, always equal to sizeof (Lisp_Object)
.
The number of slots in all used vectors.
The number of free slots in all vector blocks.
Internal size of a float object, i.e., sizeof (struct Lisp_Float)
.
(Do not confuse it with the native platform float
or double
.)
The number of floats in use.
The number of floats for which space has been obtained from the operating system, but that are not currently being used.
Internal size of an interval object, i.e., sizeof (struct interval)
.
The number of intervals in use.
The number of intervals for which space has been obtained from the operating system, but that are not currently being used.
Internal size of a buffer, i.e., sizeof (struct buffer)
.
(Do not confuse with the value returned by buffer-size
function.)
The number of buffer objects in use. This includes killed buffers
invisible to users, i.e., all buffers in all_buffers
list.
The unit of heap space measurement, always equal to 1024 bytes.
Total heap size, in unit-size units.
Heap space which is not currently used, in unit-size units.
If there was overflow in pure space (see section Pure Storage),
garbage-collect
returns nil
, because a real garbage
collection cannot be done.
If this variable is non-nil
, Emacs displays a message at the
beginning and end of garbage collection. The default value is
nil
.
This is a normal hook that is run at the end of garbage collection. Garbage collection is inhibited while the hook functions run, so be careful writing them.
The value of this variable is the number of bytes of storage that must
be allocated for Lisp objects after one garbage collection in order to
trigger another garbage collection. You can use the result returned by
garbage-collect
to get an information about size of the particular
object type; space allocated to the contents of buffers does not count.
Note that the subsequent garbage collection does not happen immediately
when the threshold is exhausted, but only the next time the Lisp interpreter
is called.
The initial threshold value is GC_DEFAULT_THRESHOLD
, defined in
alloc.c. Since it’s defined in word_size
units, the value
is 400,000 for the default 32-bit configuration and 800,000 for the 64-bit
one. If you specify a larger value, garbage collection will happen less
often. This reduces the amount of time spent garbage collecting, but
increases total memory use. You may want to do this when running a program
that creates lots of Lisp data.
You can make collections more frequent by specifying a smaller value, down
to 1/10th of GC_DEFAULT_THRESHOLD
. A value less than this minimum
will remain in effect only until the subsequent garbage collection, at which
time garbage-collect
will set the threshold back to the minimum.
The value of this variable specifies the amount of consing before a
garbage collection occurs, as a fraction of the current heap size.
This criterion and gc-cons-threshold
apply in parallel, and
garbage collection occurs only when both criteria are satisfied.
As the heap size increases, the time to perform a garbage collection increases. Thus, it can be desirable to do them less frequently in proportion.
The value returned by garbage-collect
describes the amount of
memory used by Lisp data, broken down by data type. By contrast, the
function memory-limit
provides information on the total amount of
memory Emacs is currently using.
This function returns the address of the last byte Emacs has allocated, divided by 1024. We divide the value by 1024 to make sure it fits in a Lisp integer.
You can use this to get a general idea of how your actions affect the memory usage.
This variable is t
if Emacs is nearly out of memory for Lisp
objects, and nil
otherwise.
This returns a list of numbers that count the number of objects created in this Emacs session. Each of these counters increments for a certain kind of object. See the documentation string for details.
This variable contains the total number of garbage collections done so far in this Emacs session.
This variable contains the total number of seconds of elapsed time during garbage collection so far in this Emacs session, as a floating-point number.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
These functions and variables give information about the total amount
of memory allocation that Emacs has done, broken down by data type.
Note the difference between these and the values returned by
garbage-collect
; those count objects that currently exist, but
these count the number or size of all allocations, including those for
objects that have since been freed.
The total number of cons cells that have been allocated so far in this Emacs session.
The total number of floats that have been allocated so far in this Emacs session.
The total number of vector cells that have been allocated so far in this Emacs session.
The total number of symbols that have been allocated so far in this Emacs session.
The total number of string characters that have been allocated so far in this session.
The total number of miscellaneous objects that have been allocated so far in this session. These include markers and overlays, plus certain objects not visible to users.
The total number of intervals that have been allocated so far in this Emacs session.
The total number of strings that have been allocated so far in this Emacs session.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The C part of Emacs is portable to C89: C99-specific features such as ‘<stdbool.h>’ and ‘inline’ are not used without a check, typically at configuration time, and the Emacs build procedure provides a substitute implementation if necessary. Some C99 features, such as declarations after statements, are too difficult to provide substitutes for, so they are avoided entirely.
At some point in the not-too-distant future the base C dialect will change from C89 to C99, and eventually it will no doubt change to C11.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Lisp primitives are Lisp functions implemented in C. The details of interfacing the C function so that Lisp can call it are handled by a few C macros. The only way to really understand how to write new C code is to read the source, but we can explain some things here.
An example of a special form is the definition of or
, from
eval.c. (An ordinary function would have the same general
appearance.)
DEFUN ("or", For, Sor, 0, UNEVALLED, 0, doc: /* Eval args until one of them yields non-nil, then return that value. The remaining args are not evalled at all. If all args return nil, return nil.
usage: (or CONDITIONS ...) */) (Lisp_Object args) { register Lisp_Object val = Qnil; struct gcpro gcpro1;
GCPRO1 (args);
while (CONSP (args)) { val = eval_sub (XCAR (args)); if (!NILP (val)) break; args = XCDR (args); }
UNGCPRO; return val; }
Let’s start with a precise explanation of the arguments to the
DEFUN
macro. Here is a template for them:
DEFUN (lname, fname, sname, min, max, interactive, doc)
This is the name of the Lisp symbol to define as the function name; in
the example above, it is or
.
This is the C function name for this function. This is the name that
is used in C code for calling the function. The name is, by
convention, ‘F’ prepended to the Lisp name, with all dashes
(‘-’) in the Lisp name changed to underscores. Thus, to call
this function from C code, call For
.
This is a C variable name to use for a structure that holds the data for the subr object that represents the function in Lisp. This structure conveys the Lisp symbol name to the initialization routine that will create the symbol and store the subr object as its definition. By convention, this name is always fname with ‘F’ replaced with ‘S’.
This is the minimum number of arguments that the function requires. The
function or
allows a minimum of zero arguments.
This is the maximum number of arguments that the function accepts, if
there is a fixed maximum. Alternatively, it can be UNEVALLED
,
indicating a special form that receives unevaluated arguments, or
MANY
, indicating an unlimited number of evaluated arguments (the
equivalent of &rest
). Both UNEVALLED
and MANY
are
macros. If max is a number, it must be more than min but
less than 8.
This is an interactive specification, a string such as might be used
as the argument of interactive
in a Lisp function. In the case
of or
, it is 0 (a null pointer), indicating that or
cannot be called interactively. A value of ""
indicates a
function that should receive no arguments when called interactively.
If the value begins with a ‘"(’, the string is evaluated as a
Lisp form. For example:
DEFUN ("foo", Ffoo, Sfoo, 0, UNEVALLED, "(list (read-char-by-name \"Insert character: \")\ (prefix-numeric-value current-prefix-arg)\ t))", doc: /* … /*)
This is the documentation string. It uses C comment syntax rather than C string syntax because comment syntax requires nothing special to include multiple lines. The ‘doc:’ identifies the comment that follows as the documentation string. The ‘/*’ and ‘*/’ delimiters that begin and end the comment are not part of the documentation string.
If the last line of the documentation string begins with the keyword ‘usage:’, the rest of the line is treated as the argument list for documentation purposes. This way, you can use different argument names in the documentation string from the ones used in the C code. ‘usage:’ is required if the function has an unlimited number of arguments.
All the usual rules for documentation strings in Lisp code (see section Tips for Documentation Strings) apply to C code documentation strings too.
After the call to the DEFUN
macro, you must write the
argument list for the C function, including the types for the
arguments. If the primitive accepts a fixed maximum number of Lisp
arguments, there must be one C argument for each Lisp argument, and
each argument must be of type Lisp_Object
. (Various macros and
functions for creating values of type Lisp_Object
are declared
in the file lisp.h.) If the primitive has no upper limit on
the number of Lisp arguments, it must have exactly two C arguments:
the first is the number of Lisp arguments, and the second is the
address of a block containing their values. These have types
int
and Lisp_Object *
respectively. Since
Lisp_Object
can hold any Lisp object of any data type, you
can determine the actual data type only at run time; so if you want
a primitive to accept only a certain type of argument, you must check
the type explicitly using a suitable predicate (see section Type Predicates).
Within the function For
itself, note the use of the macros
GCPRO1
and UNGCPRO
. These macros are defined for the
sake of the few platforms which do not use Emacs’ default
stack-marking garbage collector. The GCPRO1
macro “protects”
a variable from garbage collection, explicitly informing the garbage
collector that that variable and all its contents must be as
accessible. GC protection is necessary in any function which can
perform Lisp evaluation by calling eval_sub
or Feval
as
a subroutine, either directly or indirectly.
It suffices to ensure that at least one pointer to each object is
GC-protected. Thus, a particular local variable can do without
protection if it is certain that the object it points to will be
preserved by some other pointer (such as another local variable that
has a GCPRO
). Otherwise, the local variable needs a
GCPRO
.
The macro GCPRO1
protects just one local variable. If you
want to protect two variables, use GCPRO2
instead; repeating
GCPRO1
will not work. Macros GCPRO3
, GCPRO4
,
GCPRO5
, and GCPRO6
also exist. All these macros
implicitly use local variables such as gcpro1
; you must declare
these explicitly, with type struct gcpro
. Thus, if you use
GCPRO2
, you must declare gcpro1
and gcpro2
.
UNGCPRO
cancels the protection of the variables that are
protected in the current function. It is necessary to do this
explicitly.
You must not use C initializers for static or global variables unless the variables are never written once Emacs is dumped. These variables with initializers are allocated in an area of memory that becomes read-only (on certain operating systems) as a result of dumping Emacs. See section Pure Storage.
Defining the C function is not enough to make a Lisp primitive available; you must also create the Lisp symbol for the primitive and store a suitable subr object in its function cell. The code looks like this:
defsubr (&sname);
Here sname is the name you used as the third argument to DEFUN
.
If you add a new primitive to a file that already has Lisp primitives
defined in it, find the function (near the end of the file) named
syms_of_something
, and add the call to defsubr
there. If the file doesn’t have this function, or if you create a new
file, add to it a syms_of_filename
(e.g.,
syms_of_myfile
). Then find the spot in emacs.c where all
of these functions are called, and add a call to
syms_of_filename
there.
The function syms_of_filename
is also the place to define
any C variables that are to be visible as Lisp variables.
DEFVAR_LISP
makes a C variable of type Lisp_Object
visible
in Lisp. DEFVAR_INT
makes a C variable of type int
visible in Lisp with a value that is always an integer.
DEFVAR_BOOL
makes a C variable of type int
visible in Lisp
with a value that is either t
or nil
. Note that variables
defined with DEFVAR_BOOL
are automatically added to the list
byte-boolean-vars
used by the byte compiler.
If you want to make a Lisp variables that is defined in C behave
like one declared with defcustom
, add an appropriate entry to
cus-start.el.
If you define a file-scope C variable of type Lisp_Object
,
you must protect it from garbage-collection by calling staticpro
in syms_of_filename
, like this:
staticpro (&variable);
Here is another example function, with more complicated arguments. This comes from the code in window.c, and it demonstrates the use of macros and functions to manipulate Lisp objects.
DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p, Scoordinates_in_window_p, 2, 2, 0, doc: /* Return non-nil if COORDINATES are in WINDOW. ...
or `right-margin' is returned. */) (register Lisp_Object coordinates, Lisp_Object window) { struct window *w; struct frame *f; int x, y; Lisp_Object lx, ly;
CHECK_LIVE_WINDOW (window); w = XWINDOW (window); f = XFRAME (w->frame); CHECK_CONS (coordinates); lx = Fcar (coordinates); ly = Fcdr (coordinates); CHECK_NUMBER_OR_FLOAT (lx); CHECK_NUMBER_OR_FLOAT (ly); x = FRAME_PIXEL_X_FROM_CANON_X (f, lx) + FRAME_INTERNAL_BORDER_WIDTH(f); y = FRAME_PIXEL_Y_FROM_CANON_Y (f, ly) + FRAME_INTERNAL_BORDER_WIDTH(f);
switch (coordinates_in_window (w, x, y)) { case ON_NOTHING: /* NOT in window at all. */ return Qnil;
...
case ON_MODE_LINE: /* In mode line of window. */ return Qmode_line;
...
case ON_SCROLL_BAR: /* On scroll-bar of window. */ /* Historically we are supposed to return nil in this case. */ return Qnil;
default: abort (); } }
Note that C code cannot call functions by name unless they are defined
in C. The way to call a function written in Lisp is to use
Ffuncall
, which embodies the Lisp function funcall
. Since
the Lisp function funcall
accepts an unlimited number of
arguments, in C it takes two: the number of Lisp-level arguments, and a
one-dimensional array containing their values. The first Lisp-level
argument is the Lisp function to call, and the rest are the arguments to
pass to it. Since Ffuncall
can call the evaluator, you must
protect pointers from garbage collection around the call to
Ffuncall
.
The C functions call0
, call1
, call2
, and so on,
provide handy ways to call a Lisp function conveniently with a fixed
number of arguments. They work by calling Ffuncall
.
eval.c is a very good file to look through for examples; lisp.h contains the definitions for some important macros and functions.
If you define a function which is side-effect free, update the code
in byte-opt.el that binds side-effect-free-fns
and
side-effect-and-error-free-fns
so that the compiler optimizer
knows about it.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Emacs Lisp provides a rich set of the data types. Some of them, like cons cells, integers and strings, are common to nearly all Lisp dialects. Some others, like markers and buffers, are quite special and needed to provide the basic support to write editor commands in Lisp. To implement such a variety of object types and provide an efficient way to pass objects between the subsystems of an interpreter, there is a set of C data structures and a special type to represent the pointers to all of them, which is known as tagged pointer.
In C, the tagged pointer is an object of type Lisp_Object
. Any
initialized variable of such a type always holds the value of one of the
following basic data types: integer, symbol, string, cons cell, float,
vectorlike or miscellaneous object. Each of these data types has the
corresponding tag value. All tags are enumerated by enum Lisp_Type
and placed into a 3-bit bitfield of the Lisp_Object
. The rest of the
bits is the value itself. Integers are immediate, i.e., directly
represented by those value bits, and all other objects are represented
by the C pointers to a corresponding object allocated from the heap. Width
of the Lisp_Object
is platform- and configuration-dependent: usually
it’s equal to the width of an underlying platform pointer (i.e., 32-bit on
a 32-bit machine and 64-bit on a 64-bit one), but also there is a special
configuration where Lisp_Object
is 64-bit but all pointers are 32-bit.
The latter trick was designed to overcome the limited range of values for
Lisp integers on a 32-bit system by using 64-bit long long
type for
Lisp_Object
.
The following C data structures are defined in lisp.h to represent the basic data types beyond integers:
struct Lisp_Cons
Cons cell, an object used to construct lists.
struct Lisp_String
String, the basic object to represent a sequence of characters.
struct Lisp_Vector
Array, a fixed-size set of Lisp objects which may be accessed by an index.
struct Lisp_Symbol
Symbol, the unique-named entity commonly used as an identifier.
struct Lisp_Float
Floating-point value.
union Lisp_Misc
Miscellaneous kinds of objects which don’t fit into any of the above.
These types are the first-class citizens of an internal type system.
Since the tag space is limited, all other types are the subtypes of either
Lisp_Vectorlike
or Lisp_Misc
. Vector subtypes are enumerated
by enum pvec_type
, and nearly all complex objects like windows, buffers,
frames, and processes fall into this category. The rest of special types,
including markers and overlays, are enumerated by enum Lisp_Misc_Type
and form the set of subtypes of Lisp_Misc
.
Below there is a description of a few subtypes of Lisp_Vectorlike
.
Buffer object represents the text to display and edit. Window is the part
of display structure which shows the buffer or used as a container to
recursively place other windows on the same frame. (Do not confuse Emacs Lisp
window object with the window as an entity managed by the user interface
system like X; in Emacs terminology, the latter is called frame.) Finally,
process object is used to manage the subprocesses.
E.7.1 Buffer Internals | Components of a buffer structure. | |
E.7.2 Window Internals | Components of a window structure. | |
E.7.3 Process Internals | Components of a process structure. |
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Two structures (see buffer.h) are used to represent buffers
in C. The buffer_text
structure contains fields describing the
text of a buffer; the buffer
structure holds other fields. In
the case of indirect buffers, two or more buffer
structures
reference the same buffer_text
structure.
Here are some of the fields in struct buffer_text
:
beg
The address of the buffer contents.
gpt
gpt_byte
The character and byte positions of the buffer gap. See section The Buffer Gap.
z
z_byte
The character and byte positions of the end of the buffer text.
gap_size
The size of buffer’s gap. See section The Buffer Gap.
modiff
save_modiff
chars_modiff
overlay_modiff
These fields count the number of buffer-modification events performed
in this buffer. modiff
is incremented after each
buffer-modification event, and is never otherwise changed;
save_modiff
contains the value of modiff
the last time
the buffer was visited or saved; chars_modiff
counts only
modifications to the characters in the buffer, ignoring all other
kinds of changes; and overlay_modiff
counts only modifications
to the overlays.
beg_unchanged
end_unchanged
The number of characters at the start and end of the text that are known to be unchanged since the last complete redisplay.
unchanged_modified
overlay_unchanged_modified
The values of modiff
and overlay_modiff
, respectively,
after the last complete redisplay. If their current values match
modiff
or overlay_modiff
, that means
beg_unchanged
and end_unchanged
contain no useful
information.
markers
The markers that refer to this buffer. This is actually a single
marker, and successive elements in its marker chain
are the other
markers referring to this buffer text.
intervals
The interval tree which records the text properties of this buffer.
Some of the fields of struct buffer
are:
header
A header of type struct vectorlike_header
is common to all
vectorlike objects.
own_text
A struct buffer_text
structure that ordinarily holds the buffer
contents. In indirect buffers, this field is not used.
text
A pointer to the buffer_text
structure for this buffer. In an
ordinary buffer, this is the own_text
field above. In an
indirect buffer, this is the own_text
field of the base buffer.
next
A pointer to the next buffer, in the chain of all buffers, including killed buffers. This chain is used only for allocation and garbage collection, in order to collect killed buffers properly.
pt
pt_byte
The character and byte positions of point in a buffer.
begv
begv_byte
The character and byte positions of the beginning of the accessible range of text in the buffer.
zv
zv_byte
The character and byte positions of the end of the accessible range of text in the buffer.
base_buffer
In an indirect buffer, this points to the base buffer. In an ordinary buffer, it is null.
local_flags
This field contains flags indicating that certain variables are local
in this buffer. Such variables are declared in the C code using
DEFVAR_PER_BUFFER
, and their buffer-local bindings are stored
in fields in the buffer structure itself. (Some of these fields are
described in this table.)
modtime
The modification time of the visited file. It is set when the file is written or read. Before writing the buffer into a file, this field is compared to the modification time of the file to see if the file has changed on disk. See section Buffer Modification.
auto_save_modified
The time when the buffer was last auto-saved.
last_window_start
The window-start
position in the buffer as of the last time the
buffer was displayed in a window.
clip_changed
This flag indicates that narrowing has changed in the buffer. See section Narrowing.
prevent_redisplay_optimizations_p
This flag indicates that redisplay optimizations should not be used to display this buffer.
overlay_center
This field holds the current overlay center position. See section Managing Overlays.
overlays_before
overlays_after
These fields hold, respectively, a list of overlays that end at or
before the current overlay center, and a list of overlays that end
after the current overlay center. See section Managing Overlays.
overlays_before
is sorted in order of decreasing end position,
and overlays_after
is sorted in order of increasing beginning
position.
name
A Lisp string that names the buffer. It is guaranteed to be unique. See section Buffer Names.
save_length
The length of the file this buffer is visiting, when last read or
saved. This and other fields concerned with saving are not kept in
the buffer_text
structure because indirect buffers are never
saved.
directory
The directory for expanding relative file names. This is the value of
the buffer-local variable default-directory
(see section Functions that Expand Filenames).
filename
The name of the file visited in this buffer, or nil
. This is
the value of the buffer-local variable buffer-file-name
(see section Buffer File Name).
undo_list
backed_up
auto_save_file_name
auto_save_file_format
read_only
file_format
file_truename
invisibility_spec
display_count
display_time
These fields store the values of Lisp variables that are automatically
buffer-local (see section Buffer-Local Variables), whose corresponding
variable names have the additional prefix buffer-
and have
underscores replaced with dashes. For instance, undo_list
stores the value of buffer-undo-list
.
mark
The mark for the buffer. The mark is a marker, hence it is also
included on the list markers
. See section The Mark.
local_var_alist
The association list describing the buffer-local variable bindings of this buffer, not including the built-in buffer-local bindings that have special slots in the buffer object. (Those slots are omitted from this table.) See section Buffer-Local Variables.
major_mode
Symbol naming the major mode of this buffer, e.g., lisp-mode
.
mode_name
Pretty name of the major mode, e.g., "Lisp"
.
keymap
abbrev_table
syntax_table
category_table
display_table
These fields store the buffer’s local keymap (see section Keymaps), abbrev table (see section Abbrev Tables), syntax table (see section Syntax Tables), category table (see section Categories), and display table (see section Display Tables).
downcase_table
upcase_table
case_canon_table
These fields store the conversion tables for converting text to lower case, upper case, and for canonicalizing text for case-fold search. See section The Case Table.
minor_modes
An alist of the minor modes of this buffer.
pt_marker
begv_marker
zv_marker
These fields are only used in an indirect buffer, or in a buffer that
is the base of an indirect buffer. Each holds a marker that records
pt
, begv
, and zv
respectively, for this buffer
when the buffer is not current.
mode_line_format
header_line_format
case_fold_search
tab_width
fill_column
left_margin
auto_fill_function
truncate_lines
word_wrap
ctl_arrow
bidi_display_reordering
bidi_paragraph_direction
selective_display
selective_display_ellipses
overwrite_mode
abbrev_mode
mark_active
enable_multibyte_characters
buffer_file_coding_system
cache_long_line_scans
point_before_scroll
left_fringe_width
right_fringe_width
fringes_outside_margins
scroll_bar_width
indicate_empty_lines
indicate_buffer_boundaries
fringe_indicator_alist
fringe_cursor_alist
scroll_up_aggressively
scroll_down_aggressively
cursor_type
cursor_in_non_selected_windows
These fields store the values of Lisp variables that are automatically
buffer-local (see section Buffer-Local Variables), whose corresponding
variable names have underscores replaced with dashes. For instance,
mode_line_format
stores the value of mode-line-format
.
last_selected_window
This is the last window that was selected with this buffer in it, or nil
if that window no longer displays this buffer.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The fields of a window (for a complete list, see the definition of
struct window
in window.h) include:
frame
The frame that this window is on.
mini_p
Non-nil
if this window is a minibuffer window.
parent
Internally, Emacs arranges windows in a tree; each group of siblings has a parent window whose area includes all the siblings. This field points to a window’s parent.
Parent windows do not display buffers, and play little role in display except to shape their child windows. Emacs Lisp programs usually have no access to the parent windows; they operate on the windows at the leaves of the tree, which actually display buffers.
hchild
vchild
These fields contain the window’s leftmost child and its topmost child
respectively. hchild
is used if the window is subdivided
horizontally by child windows, and vchild
if it is subdivided
vertically. In a live window, only one of hchild
, vchild
,
and buffer
(q.v.) is non-nil
.
next
prev
The next sibling and previous sibling of this window. next
is
nil
if the window is the right-most or bottom-most in its group;
prev
is nil
if it is the left-most or top-most in its
group.
left_col
The left-hand edge of the window, measured in columns, relative to the leftmost column in the frame (column 0).
top_line
The top edge of the window, measured in lines, relative to the topmost line in the frame (line 0).
total_cols
total_lines
The width and height of the window, measured in columns and lines respectively. The width includes the scroll bar and fringes, and/or the separator line on the right of the window (if any).
buffer
The buffer that the window is displaying.
start
A marker pointing to the position in the buffer that is the first character displayed in the window.
pointm
This is the value of point in the current buffer when this window is selected; when it is not selected, it retains its previous value.
force_start
If this flag is non-nil
, it says that the window has been
scrolled explicitly by the Lisp program. This affects what the next
redisplay does if point is off the screen: instead of scrolling the
window to show the text around point, it moves point to a location that
is on the screen.
frozen_window_start_p
This field is set temporarily to 1 to indicate to redisplay that
start
of this window should not be changed, even if point
gets invisible.
start_at_line_beg
Non-nil
means current value of start
was the beginning of a line
when it was chosen.
use_time
This is the last time that the window was selected. The function
get-lru-window
uses this field.
sequence_number
A unique number assigned to this window when it was created.
last_modified
The modiff
field of the window’s buffer, as of the last time
a redisplay completed in this window.
last_overlay_modified
The overlay_modiff
field of the window’s buffer, as of the last
time a redisplay completed in this window.
last_point
The buffer’s value of point, as of the last time a redisplay completed in this window.
last_had_star
A non-nil
value means the window’s buffer was “modified” when the
window was last updated.
vertical_scroll_bar
This window’s vertical scroll bar.
left_margin_cols
right_margin_cols
The widths of the left and right margins in this window. A value of
nil
means no margin.
left_fringe_width
right_fringe_width
The widths of the left and right fringes in this window. A value of
nil
or t
means use the values of the frame.
fringes_outside_margins
A non-nil
value means the fringes outside the display margins;
othersize they are between the margin and the text.
window_end_pos
This is computed as z
minus the buffer position of the last glyph
in the current matrix of the window. The value is only valid if
window_end_valid
is not nil
.
window_end_bytepos
The byte position corresponding to window_end_pos
.
window_end_vpos
The window-relative vertical position of the line containing
window_end_pos
.
window_end_valid
This field is set to a non-nil
value if window_end_pos
is truly
valid. This is nil
if nontrivial redisplay is pre-empted, since in that
case the display that window_end_pos
was computed for did not get
onto the screen.
cursor
A structure describing where the cursor is in this window.
last_cursor
The value of cursor
as of the last redisplay that finished.
phys_cursor
A structure describing where the cursor of this window physically is.
phys_cursor_type
phys_cursor_height
phys_cursor_width
The type, height, and width of the cursor that was last displayed on this window.
phys_cursor_on_p
This field is non-zero if the cursor is physically on.
cursor_off_p
Non-zero means the cursor in this window is logically off. This is used for blinking the cursor.
last_cursor_off_p
This field contains the value of cursor_off_p
as of the time of
the last redisplay.
must_be_updated_p
This is set to 1 during redisplay when this window must be updated.
hscroll
This is the number of columns that the display in the window is scrolled horizontally to the left. Normally, this is 0.
vscroll
Vertical scroll amount, in pixels. Normally, this is 0.
dedicated
Non-nil
if this window is dedicated to its buffer.
display_table
The window’s display table, or nil
if none is specified for it.
update_mode_line
Non-nil
means this window’s mode line needs to be updated.
base_line_number
The line number of a certain position in the buffer, or nil
.
This is used for displaying the line number of point in the mode line.
base_line_pos
The position in the buffer for which the line number is known, or
nil
meaning none is known. If it is a buffer, don’t display
the line number as long as the window shows that buffer.
column_number_displayed
The column number currently displayed in this window’s mode line, or nil
if column numbers are not being displayed.
current_matrix
desired_matrix
Glyph matrices describing the current and desired display of this window.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The fields of a process (for a complete list, see the definition of
struct Lisp_Process
in process.h) include:
name
A string, the name of the process.
command
A list containing the command arguments that were used to start this
process. For a network or serial process, it is nil
if the
process is running or t
if the process is stopped.
filter
A function used to accept output from the process.
sentinel
A function called whenever the state of the process changes.
buffer
The associated buffer of the process.
pid
An integer, the operating system’s process ID. Pseudo-processes such as network or serial connections use a value of 0.
childp
A flag, t
if this is really a child process. For a network or
serial connection, it is a plist based on the arguments to
make-network-process
or make-serial-process
.
mark
A marker indicating the position of the end of the last output from this process inserted into the buffer. This is often but not always the end of the buffer.
kill_without_query
If this is non-zero, killing Emacs while this process is still running does not ask for confirmation about killing the process.
raw_status
The raw process status, as returned by the wait
system call.
status
The process status, as process-status
should return it.
tick
update_tick
If these two fields are not equal, a change in the status of the process needs to be reported, either by running the sentinel or by inserting a message in the process buffer.
pty_flag
Non-nil
if communication with the subprocess uses a pty;
nil
if it uses a pipe.
infd
The file descriptor for input from the process.
outfd
The file descriptor for output to the process.
tty_name
The name of the terminal that the subprocess is using,
or nil
if it is using pipes.
decode_coding_system
Coding-system for decoding the input from this process.
decoding_buf
A working buffer for decoding.
decoding_carryover
Size of carryover in decoding.
encode_coding_system
Coding-system for encoding the output to this process.
encoding_buf
A working buffer for encoding.
inherit_coding_system_flag
Flag to set coding-system
of the process buffer from the
coding system used to decode process output.
type
Symbol indicating the type of process: real
, network
,
serial
.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here are some guidelines for use of integer types in the Emacs C source code. These guidelines sometimes give competing advice; common sense is advised.
int len = strlen
(s);
unless the length of s
is required for other reasons to
fit in int
range.
size_t
instead of ptrdiff_t
, or uintptr_t
instead
of intptr_t
).
int
for Emacs character codes, in the range 0 .. 0x3FFFFF.
ptrdiff_t
for sizes, i.e., for integers bounded by the
maximum size of any individual C object or by the maximum number of
elements in any C array. This is part of Emacs’s general preference
for signed types. Using ptrdiff_t
limits objects to
PTRDIFF_MAX
bytes, but larger objects would cause trouble
anyway since they would break pointer subtraction, so this does not
impose an arbitrary limit.
intptr_t
for internal representations of pointers, or
for integers bounded only by the number of objects that can exist at
any given time or by the total number of bytes that can be allocated.
Currently Emacs sometimes uses other types when intptr_t
would
be better; fixing this is lower priority, as the code works as-is on
Emacs’s current porting targets.
EMACS_INT
for representing values
converted to or from Emacs Lisp fixnums, as fixnum arithmetic is based
on EMACS_INT
.
off_t
, time_t
). Do not assume that a system type is
signed, unless this assumption is known to be safe. For example,
although off_t
is always signed, time_t
need not be.
printmax_t
for representing
values that might be any signed integer that can be printed,
using a printf
-family function.
intmax_t
for representing values that might be any
signed integer value.
bool
, false
and true
for booleans.
Using bool
can make programs easier to read and a bit faster than
using int
. Although it is also OK to use int
, 0
and 1
, this older style is gradually being phased out. When
using bool
, respect the limitations of the replacement
implementation of bool
, as documented in the source file
lib/stdbool.in.h, so that Emacs remains portable to pre-C99
platforms. In particular, boolean bitfields should be of type
bool_bf
, not bool
, so that they work correctly even when
compiling Objective C with standard GCC.
unsigned int
or signed int
to
int
, as int
is less portable: it might be signed, and
might not be. Single-bit bit fields should be unsigned int
or
bool_bf
so that their values are 0 or 1.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a list of the more important error symbols in standard Emacs, grouped by concept. The list includes each symbol’s message and a cross reference to a description of how the error can occur.
Each error symbol has an set of parent error conditions that is a
list of symbols. Normally this list includes the error symbol itself
and the symbol error
. Occasionally it includes additional
symbols, which are intermediate classifications, narrower than
error
but broader than a single error symbol. For example, all
the errors in accessing files have the condition file-error
. If
we do not say here that a certain error symbol has additional error
conditions, that means it has none.
As a special exception, the error symbol quit
does not have the
condition error
, because quitting is not considered an error.
Most of these error symbols are defined in C (mainly data.c),
but some are defined in Lisp. For example, the file userlock.el
defines the file-locked
and file-supersession
errors.
Several of the specialized Lisp libraries distributed with Emacs
define their own error symbols. We do not attempt to list of all
those here.
See section Errors, for an explanation of how errors are generated and handled.
error
The message is ‘error’. See section Errors.
quit
The message is ‘Quit’. See section Quitting.
args-out-of-range
The message is ‘Args out of range’. This happens when trying to access an element beyond the range of a sequence, buffer, or other container-like object. See section Sequences, Arrays, and Vectors, and See section Text.
arith-error
The message is ‘Arithmetic error’. This occurs when trying to perform integer division by zero. See section Numeric Conversions, and See section Arithmetic Operations.
beginning-of-buffer
The message is ‘Beginning of buffer’. See section Motion by Characters.
buffer-read-only
The message is ‘Buffer is read-only’. See section Read-Only Buffers.
circular-list
The message is ‘List contains a loop’. This happens when a circular structure is encountered. See section Read Syntax for Circular Objects.
cl-assertion-failed
The message is ‘Assertion failed’. This happens when the
cl-assert
macro fails a test. See Assertions in Common Lisp
Extensions.
coding-system-error
The message is ‘Invalid coding system’. See section Coding Systems in Lisp.
cyclic-function-indirection
The message is ‘Symbol's chain of function indirections contains a loop’. See section Symbol Function Indirection.
cyclic-variable-indirection
The message is ‘Symbol's chain of variable indirections contains a loop’. See section Variable Aliases.
dbus-error
The message is ‘D-Bus error’. This is only defined if Emacs was compiled with D-Bus support. See Errors and Events in D-Bus integration in Emacs.
end-of-buffer
The message is ‘End of buffer’. See section Motion by Characters.
end-of-file
The message is ‘End of file during parsing’. Note that this is
not a subcategory of file-error
, because it pertains to the
Lisp reader, not to file I/O. See section Input Functions.
file-already-exists
This is a subcategory of file-error
. See section Writing to Files.
file-date-error
This is a subcategory of file-error
. It occurs when
copy-file
tries and fails to set the last-modification time of
the output file. See section Changing File Names and Attributes.
file-error
We do not list the error-strings of this error and its subcategories,
because the error message is normally constructed from the data items
alone when the error condition file-error
is present. Thus,
the error-strings are not very relevant. However, these error symbols
do have error-message
properties, and if no data is provided,
the error-message
property is used. See section Files.
compression-error
This is a subcategory of file-error
, which results from
problems handling a compressed file. See section How Programs Do Loading.
file-locked
This is a subcategory of file-error
. See section File Locks.
file-supersession
This is a subcategory of file-error
. See section Buffer Modification Time.
file-notify-error
This is a subcategory of file-error
. It happens, when a file
could not be watched for changes. See section Notifications on File Changes.
ftp-error
This is a subcategory of file-error
, which results from
problems in accessing a remote file using ftp. See Remote Files in The GNU Emacs Manual.
invalid-function
The message is ‘Invalid function’. See section Symbol Function Indirection.
invalid-read-syntax
The message is ‘Invalid read syntax’. See section Printed Representation and Read Syntax.
invalid-regexp
The message is ‘Invalid regexp’. See section Regular Expressions.
mark-inactive
The message is ‘The mark is not active now’. See section The Mark.
no-catch
The message is ‘No catch for tag’. See section Explicit Nonlocal Exits: catch
and throw
.
scan-error
The message is ‘Scan error’. This happens when certain syntax-parsing functions find invalid syntax or mismatched parentheses. See section Moving over Balanced Expressions, and See section Parsing Expressions.
search-failed
The message is ‘Search failed’. See section Searching and Matching.
setting-constant
The message is ‘Attempt to set a constant symbol’. This happens
when attempting to assign values to nil
, t
, and keyword
symbols. See section Variables that Never Change.
text-read-only
The message is ‘Text is read-only’. This is a subcategory of
buffer-read-only
. See section Properties with Special Meanings.
undefined-color
The message is ‘Undefined color’. See section Color Names.
user-error
The message is the empty string. See section How to Signal an Error.
void-function
The message is ‘Symbol's function definition is void’. See section Accessing Function Cell Contents.
void-variable
The message is ‘Symbol's value as variable is void’. See section Accessing Variable Values.
wrong-number-of-arguments
The message is ‘Wrong number of arguments’. See section Classification of List Forms.
wrong-type-argument
The message is ‘Wrong type argument’. See section Type Predicates.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In this section we list some of the more general keymaps. Many of these exist when Emacs is first started, but some are loaded only when the respective feature is accessed.
There are many other, more specialized, maps than these; in particular those associated with major and minor modes. The minibuffer uses several keymaps (see section Minibuffer Commands that Do Completion). For more details on keymaps, see section Keymaps.
2C-mode-map
A sparse keymap for subcommands of the prefix C-x 6.
See Two-Column Editing in The GNU Emacs Manual.
abbrev-map
A sparse keymap for subcommands of the prefix C-x a.
See Defining Abbrevs in The GNU Emacs Manual.
button-buffer-map
A sparse keymap useful for buffers containing buffers.
You may want to use this as a parent keymap. See section Buttons.
button-map
A sparse keymap used by buttons.
ctl-x-4-map
A sparse keymap for subcommands of the prefix C-x 4.
ctl-x-5-map
A sparse keymap for subcommands of the prefix C-x 5.
ctl-x-map
A full keymap for C-x commands.
ctl-x-r-map
A sparse keymap for subcommands of the prefix C-x r.
See Registers in The GNU Emacs Manual.
esc-map
A full keymap for ESC (or Meta) commands.
facemenu-keymap
A sparse keymap used for the M-o prefix key.
function-key-map
The parent keymap of all local-function-key-map
(q.v.) instances.
global-map
The full keymap containing default global key bindings.
Modes should not modify the Global map.
goto-map
A sparse keymap used for the M-g prefix key.
help-map
A sparse keymap for the keys following the help character C-h.
See section Help Functions.
Helper-help-map
A full keymap used by the help utility package.
It has the same keymap in its value cell and in its function cell.
input-decode-map
The keymap for translating keypad and function keys.
If there are none, then it contains an empty sparse keymap.
See section Keymaps for Translating Sequences of Events.
key-translation-map
A keymap for translating keys. This one overrides ordinary key
bindings, unlike local-function-key-map
. See section Keymaps for Translating Sequences of Events.
kmacro-keymap
A sparse keymap for keys that follows the C-x C-k prefix search.
See Keyboard Macros in The GNU Emacs Manual.
local-function-key-map
The keymap for translating key sequences to preferred alternatives.
If there are none, then it contains an empty sparse keymap.
See section Keymaps for Translating Sequences of Events.
menu-bar-file-menu
menu-bar-edit-menu
menu-bar-options-menu
global-buffers-menu-map
menu-bar-tools-menu
menu-bar-help-menu
These keymaps display the main, top-level menus in the menu bar.
Some of them contain sub-menus. For example, the Edit menu contains
menu-bar-search-menu
, etc. See section The Menu Bar.
minibuffer-inactive-mode-map
A full keymap used in the minibuffer when it is not active.
See Editing in the Minibuffer in The GNU Emacs Manual.
mode-line-coding-system-map
mode-line-input-method-map
mode-line-column-line-number-mode-map
These keymaps control various areas of the mode line.
See section Mode Line Format.
mode-specific-map
The keymap for characters following C-c. Note, this is in the
global map. This map is not actually mode-specific: its name was chosen
to be informative in C-h b (display-bindings
),
where it describes the main use of the C-c prefix key.
mouse-appearance-menu-map
A sparse keymap used for the S-mouse-1 key.
mule-keymap
The global keymap used for the C-x RET prefix key.
narrow-map
A sparse keymap for subcommands of the prefix C-x n.
prog-mode-map
The keymap used by Prog mode.
See section Basic Major Modes.
query-replace-map
multi-query-replace-map
A sparse keymap used for responses in query-replace
and related
commands; also for y-or-n-p
and map-y-or-n-p
. The functions
that use this map do not support prefix keys; they look up one event at a
time. multi-query-replace-map
extends query-replace-map
for multi-buffer replacements. See section query-replace-map.
search-map
A sparse keymap that provides global bindings for search-related commands.
special-mode-map
The keymap used by Special mode.
See section Basic Major Modes.
tool-bar-map
The keymap defining the contents of the tool bar.
See section Tool bars.
universal-argument-map
A sparse keymap used while processing C-u.
See section Prefix Command Arguments.
vc-prefix-map
The global keymap used for the C-x v prefix key.
x-alternatives-map
A sparse keymap used to map certain keys under graphical frames.
The function x-setup-function-keys
uses this.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The following is a list of some hook variables that let you provide functions to be called from within Emacs on suitable occasions.
Most of these variables have names ending with ‘-hook’. They are
normal hooks, run by means of run-hooks
. The value of such
a hook is a list of functions; the functions are called with no
arguments and their values are completely ignored. The recommended way
to put a new function on such a hook is to call add-hook
.
See section Hooks, for more information about using hooks.
The variables whose names end in ‘-functions’ are usually abnormal hooks (some old code may also use the deprecated ‘-hooks’ suffix); their values are lists of functions, but these functions are called in a special way (they are passed arguments, or their return values are used). The variables whose names end in ‘-function’ have single functions as their values.
This is not an exhaustive list, it only covers the more general hooks.
For example, every major mode defines a hook named
‘modename-mode-hook’. The major mode command runs this
normal hook with run-mode-hooks
as the very last thing it does.
See section Mode Hooks. Most minor modes have mode hooks too.
A special feature allows you to specify expressions to evaluate if and when a file is loaded (see section Hooks for Loading). That feature is not exactly a hook, but does a similar job.
activate-mark-hook
deactivate-mark-hook
See section The Mark.
after-change-functions
before-change-functions
first-change-hook
See section Change Hooks.
after-change-major-mode-hook
change-major-mode-after-body-hook
See section Mode Hooks.
after-init-hook
before-init-hook
emacs-startup-hook
window-setup-hook
See section The Init File.
after-insert-file-functions
write-region-annotate-functions
write-region-post-annotation-function
See section File Format Conversion.
after-make-frame-functions
before-make-frame-hook
See section Creating Frames.
after-save-hook
before-save-hook
write-contents-functions
write-file-functions
See section Saving Buffers.
after-setting-font-hook
Hook run after a frame’s font changes.
auto-save-hook
See section Auto-Saving.
before-hack-local-variables-hook
hack-local-variables-hook
See section File Local Variables.
buffer-access-fontify-functions
See section Lazy Computation of Text Properties.
buffer-list-update-hook
Hook run when the buffer list changes (see section The Buffer List).
buffer-quit-function
Function to call to “quit” the current buffer.
change-major-mode-hook
See section Creating and Deleting Buffer-Local Bindings.
command-line-functions
See section Command-Line Arguments.
delayed-warnings-hook
The command loop runs this soon after post-command-hook
(q.v.).
focus-in-hook
focus-out-hook
See section Input Focus.
delete-frame-functions
See section Deleting Frames.
delete-terminal-functions
See section Multiple Terminals.
pop-up-frame-function
split-window-preferred-function
See section Additional Options for Displaying Buffers.
echo-area-clear-hook
See section Echo Area Customization.
find-file-hook
find-file-not-found-functions
See section Functions for Visiting Files.
font-lock-extend-after-change-region-function
See section Region to Fontify after a Buffer Change.
font-lock-extend-region-functions
See section Multiline Font Lock Constructs.
font-lock-fontify-buffer-function
font-lock-fontify-region-function
font-lock-mark-block-function
font-lock-unfontify-buffer-function
font-lock-unfontify-region-function
See section Other Font Lock Variables.
fontification-functions
See section Automatic Face Assignment.
frame-auto-hide-function
See section Quitting Windows.
kill-buffer-hook
kill-buffer-query-functions
See section Killing Buffers.
kill-emacs-hook
kill-emacs-query-functions
See section Killing Emacs.
menu-bar-update-hook
See section The Menu Bar.
minibuffer-setup-hook
minibuffer-exit-hook
See section Minibuffer Miscellany.
mouse-leave-buffer-hook
Hook run when about to switch windows with a mouse command.
mouse-position-function
See section Mouse Position.
post-command-hook
pre-command-hook
See section Command Loop Overview.
post-gc-hook
See section Garbage Collection.
post-self-insert-hook
See section Keymaps and Minor Modes.
suspend-hook
suspend-resume-hook
suspend-tty-functions
resume-tty-functions
See section Suspending Emacs.
syntax-begin-function
syntax-propertize-extend-region-functions
syntax-propertize-function
font-lock-syntactic-face-function
See section Syntactic Font Lock. See section Syntax Properties.
temp-buffer-setup-hook
temp-buffer-show-function
temp-buffer-show-hook
See section Temporary Displays.
tty-setup-hook
See section Terminal-Specific Initialization.
window-configuration-change-hook
window-scroll-functions
window-size-change-functions
See section Hooks for Window Scrolling and Changes.
window-text-change-functions
Functions to call in redisplay when text in the window might change.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Jump to: | "
#
$
%
&
'
(
)
*
+
,
-
.
/
1
2
3
;
<
=
>
?
@
[
\
]
^
`
|
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
---|
Jump to: | "
#
$
%
&
'
(
)
*
+
,
-
.
/
1
2
3
;
<
=
>
?
@
[
\
]
^
`
|
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
---|
[Top] | [Contents] | [Index] | [ ? ] |
“サブ文字テーブル(sub-char-tables)”に使用される‘#^^’を目にすることがあるかもしれません。
リストの最後に要素を追加するための、これと完全に同等な方法はありません。listnameをコピーすることにより、新しいリストを作成してから、neweltをそのリストの最後に追加する、(append
listname (list
newelt))
を使用することができます。すべてのCDRを辿って、終端のnil
を置き換える、(nconc
listname (list
newelt))
を使用することもできます。コピーも変更も行なわずに、リストの先頭に要素を追加するcons
と比較してみてください。
ここでの“キー(key)”の使い方は、用語“キーシーケンス(key sequence)”とは関係ありません。キーはテーブルにあるアイテムを探すために使用される値という意味です。この場合、テーブルはalistでありalistはアイテムに関連付けられます。
S式(S-expression)、短くはsexpという言葉でも呼ばれることがありますが、わたしたちは通常、このマニュアル内ではこの用語は使用しません。
“環境”にたいするこの定義は、プログラムの結果に影響し得るすべてのデータを特に意図するものではありません。
正確に言うと、デフォルトのダイナミックスコープ(dynamic scoping)のルールでは、値セルは常にその変数のカレント値を保持しますが、レキシカルスコープ(lexical scoping)では異なります。詳細は、Scoping Rules for Variable Bindingsを参照してください。
これには、いくつか例外があります。たとえば、レキシカルバインディングは、Lispデバッガーからもアクセスできます。
MS-DOS版のEmacsは、DOSファイルシステムの制限により、かわりに_dir-locals.elという名前を使用します。
これはカリー化(currying)と関連しますが、異なる機能です。カーリングは、複数の引数をとる関数を、関数チェーンとして呼び出せるような、1つの引数を取る個々の関数に変換するような方法です。
いくつかの要素は実際に2つの引数を提供します。
ボタンダウン(button-down)はドラッグ(drag)の保守的なアンチテーゼです(訳注: 原文は“Button-down is the conservative antithesis of drag.”。ボタンダウンを着るような人種と麻薬を対比させたジョークのような気がしますが、すいません、よく分からないので直訳します)。
これはテキスト端末ののような、ツールキットを使用しないメニューにたいして要求されます。
MS-WindowsバージョンのEmacsはCygwin環境用にコンパイルされており、2つのファイル名構文の変換に、cygwin-convert-file-name-to-windows
とcygwin-convert-file-name-from-windows
を使用できます。
An RFC, an acronym for Request for Comments, is a numbered Internet informational document describing a standard. RFCs are usually written by technical experts acting on their own initiative, and are traditionally written in a pragmatic, experience-driven manner.
This internal representation is based on one of the encodings defined by the Unicode Standard, called UTF-8, for representing any Unicode codepoint, but Emacs extends UTF-8 to represent the additional codepoints it uses for raw 8-bit bytes and characters not unified with Unicode.
The Unicode specification writes these tag names inside ‘<..>’ brackets, but the tag names in Emacs do not include the brackets; e.g., Unicode specifies ‘<small>’ where Emacs uses ‘small’.
Note that regexp-opt
does not
guarantee that its result is absolutely the most efficient form
possible. A hand-tuned regular expression can sometimes be slightly
more efficient, but is almost never worth the effort.
On other systems, Emacs uses a Lisp emulation of
ls
; see Contents of Directories.
For backward compatibility, you can also use a string to specify a face name; that is equivalent to a Lisp symbol with the same name.
In this context, the term font has nothing to do with Font Lock (see section Font Lock Mode).
The benefits of a Common Lisp-style package system are considered not to outweigh the costs.
[Top] | [Contents] | [Index] | [ ? ] |
declare
Formdisplay-buffer
display
Property
[Top] | [Contents] | [Index] | [ ? ] |
[Top] | [Contents] | [Index] | [ ? ] |
This document was generated on November 2, 2018 using texi2any.
The buttons in the navigation panels have the following meaning:
Button | Name | Go to | From 1.2.3 go to |
---|---|---|---|
[ << ] | FastBack | Beginning of this chapter or previous chapter | 1 |
[ < ] | Back | Previous section in reading order | 1.2.2 |
[ Up ] | Up | Up section | 1.2 |
[ > ] | Forward | Next section in reading order | 1.2.4 |
[ >> ] | FastForward | Next chapter | 2 |
[Top] | Top | Cover (top) of document | |
[Contents] | Contents | Table of contents | |
[Index] | Index | Index | |
[ ? ] | About | About (help) |
where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure:
This document was generated on November 2, 2018 using texi2any.