- “sometimes i feel like we’re making emacs better and better because we don’t know what to do with emacs once it is finished.” – AlexSchroeder on InternetRelayChat
Click the heading to search for all pages belonging to the writing of Lisp code. These pages contain information for would-be authors of new major and minor modes: EmacsLisp style, coding conventions, pointers and documentation to existing features. What follows are some suggestions; find more other pages by searching for backlinks via the heading.
Before you get starting diving into Emacs Lisp, it’s a good idea to be aware of some EmacsLispLimitations. Once upon a time I thought I wanted to use Emacs Lisp for all of my coding needs, but then rediscovered the old truism: some languages are better suited for some tasks. – JohnWiegley
Learning Emacs Lisp
Ordered for pedagogy:
Writing a Major Mode
Tips and tricks for writing a MajorMode.
- GenericMode – For very simple modes including font-locking and comments.
- DerivedMode – For new modes very similar to existing modes.
- SampleMode – Complete Emacs Lisp example for a real major mode.
- ModeTutorial – A tutorial for mode writers.
- ImenuMode – Provide an index menu to the interesting parts in the buffer.
- Font-lock programming:
- Other tools and solutions:
Style and suggestions
Emacs Lisp Tools and Tricks
Emacs Lisp Installers
- el-get - apt-get user experience for Emacs Lisp, with full support for emacswiki
- InstallElisp - Retrieve and install elisp from Internet
- elinstall - An installer for elisp code. It sets up autoloads, load-path, etc. by Tom Breton (Tehom)
- ELPA - Emacs Lisp Package Archive by TomTromey
- Pases – Packaging system for Emacsen
- AutoInstall - Asynchronous retrieve and install elisp file from Internet.
- plugin.el – Automatic fetching, installing and loading of Emacs modules
- use-package.el – Arrange use of an elisp package
- UsePackage - Describe how to get and configure a package, then install on demand with an autoload-like mechanism
Emacs Lisp Libraries
- ArrayExtension – Support for arrays, and matrixes.
- AutoOverlays – Overlays defined by regexps, automatically created, updated and destroyed as buffer is modified.
- AVLtrees – AVL tree data structures (self-balancing binary trees)
- CompletionUI – Completion user interface, providing various highly customizable completion mechanisms (dynamic, hotkeys, cycling, tab-completion, help-echo, tooltip, menu…)
- DoReMi – Macro
‘define-doremi’ and command
‘doremi’. Use them to define commands that let you use the arrow keys and/or mouse wheel to make incremental changes to things or cycle through a ring of things.
- DictionaryTrees – Advanced dictionary data structures
- ElispParser – A small parser tool written in EmacsLisp.
- EmacsDataBase is a flexible system for defining, accessing, modifying, summarizing, and generally playing with, a set of records. You can view each record individually or summarized (with other records) in separate buffer. Record format (field names and their types) can be arbitrarily complex.
- TinyDb – A mini-database, smaller than EmacsDataBase
- ParserCompiler – A macro that compiles Recursive Descent parsers in elisp.
- Heaps – Heap data structures (a.k.a. priority queues)
- Icicles – New possibilities for using completion and cycling of completion candidates.
- IncrementalRead – Support building libraries that act incrementally on input.
- Iterate – A macro for iterating in different fashions over various data structures, similar in spirit to Common Lisp iterate library
- LaterDo – Calling functions later, thus do some sort of fake threading
- LuiMode – A Linewise User Interface
- MacroUtilities – Utilities for writing macros.
- ModeLocal – Causing a variable or function to have a value/behavior based on major mode.
- NotAndOr – Commands to transform Boolean EmacsLisp sexps.
- PatternMatching – Matching Lisp expressions based on pattern expressions.
- Queues – Queue data structures
- RecordType – Definition of a new type: record. A record is a set of named fields with their associated type.
- SemanticBovinator – A flex/bison lexer and parser generator written in EmacsLisp.
- SubdirsToList – Adding subdirectories to a list recursively
- TaggedNFA – Tagged non-deterministic finite state automata (generally used for regular expression matching algorithms)
- TcpClient – Network interface to ease the creation of network related script
- TernarySearchTrees – Ternary search tree data structures (obsolete - use Tries instead)
- ThingAtPoint – Functions to return various kinds of Emacs Lisp entity at or near point. For example, return the Lisp symbol name nearest point.
- Tries – General trie data structures (including ternary search trees)
- UseCustomizeForKeyBindings – Widget and
‘defcustom’ code to let users use Customize for key bindings.
- VectorModificationLibrary – Functions to modify vectors
- XmlParser – Writing code which reads and manipulates XML. Pointers to DOM, XPath, etc.
- Infix – Writing infix math expressions
Proof of Concept
Discussion About Emacs Lisp
- CategoryExtensionLanguage – Other Emacs extension languages currently supported, and future implementations of Emacs in other languages.
- DynamicBindingVsLexicalBinding – Benefits and pitfalls of dynamic binding and a way to simulate lexical binding.
- EmacsLispLimitations – Limitations of EmacsLisp and reasons not to use it for everything.
- LangPollResults – Preliminary results of the language poll on the #emacs channel.
- WhyDoesElispSuck – Why people say that EmacsLisp is a bad language, deprecated, not the ideal choice for the future, or <your remark here>…
- RationalElispPackaging – Design of a packaging system for Emacs Lisp software.
- Emacs Internals – I’ve been reading the source for a while. Trying to start annotate how to read the source for others. Here’s a diagram of how I see it presently. (Not sure if this is correct place to put this?)
- Namespaces – Various implementations and thoughts regarding namespaces
Xemacs is not used very much these days. This section is kept for legacy.
This list is mostly for pages that are no longer relevant because Emacs comes with features making them obsolete.