This is compat.info, produced by makeinfo version 6.7 from compat.texi. Copyright © 2022 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 no Invariant Sections, 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.” INFO-DIR-SECTION Emacs START-INFO-DIR-ENTRY * Compat: (compat). Compatibility Library for Emacs Lisp. END-INFO-DIR-ENTRY  File: compat.info, Node: Top, Next: Introduction, Up: (dir) "Compat" Manual *************** This manual documents the usage of the "Compat" Emacs lisp library, the forward-compatibility library for Emacs Lisp, corresponding to version 28.1.2.2. Copyright © 2022 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 no Invariant Sections, 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.” * Menu: * Introduction:: * Support:: * Development:: * Function Index:: * Variable Index:: — The Detailed Node Listing — Introduction * Overview:: * Usage:: * Intentions:: Usage * Additional libraries:: Support * Emacs 24.4:: Compatibility support for Emacs 24.4 * Emacs 25.1:: Compatibility support for Emacs 25.1 * Emacs 26.1:: Compatibility support for Emacs 26.1 * Emacs 27.1:: Compatibility support for Emacs 27.1 * Emacs 28.1:: Compatibility support for Emacs 28.1  File: compat.info, Node: Introduction, Next: Support, Prev: Top, Up: Top 1 Introduction ************** * Menu: * Overview:: * Usage:: * Intentions::  File: compat.info, Node: Overview, Next: Usage, Up: Introduction 1.1 Overview ============ The objective of Compat is to provide "forwards compatibility" library for Emacs Lisp. That is to say by using Compat, an Elisp package does not have to make the decision to either use new and useful functionality or support old versions of Emacs. Version 24.3 is chosen as the oldest version, because this is the newest version on CentOS 7. It is intended to preserve compatibility for at least as the Centos 7 reaches EOL (https://wiki.centos.org/About/Product), 2024. If you are developing a package with Compat in mind, consider loading ‘compat-help‘ (on your system, not in a package) to get relevant notes inserted into the help buffers of functions that are implemented or advised in Compat. Note that Compat provides a few prefixed function, ie. functions with a ‘compat-’ prefix. These are used to provide extended functionality for commands that are already defined (‘sort’, ‘assoc’, ‘seq’, ...). It might be possible to transform these into advised functions later on, so that the modified functionality is accessible without a prefix. Feedback on this point is appreciated.  File: compat.info, Node: Usage, Next: Intentions, Prev: Overview, Up: Introduction 1.2 Usage ========= The intended use-case for this library is for package developers to add as a dependency in the header: ;; Package-Requires: ((emacs "24.3") (compat "28.1.2.2")) There is no need to depend on ‘emacs’ 24.3 specifically. One can choose to any newer version, if features not provided by Compat necessitate it. In any file where compatibility forms are used, a (require 'compat) should be added early on. This will load all non-prefixed definitions (functions and macros with a leading ‘compat-‘). To load these, an additional (require 'compat-XY) ; e.g. 26 will be necessary, to load compatibility code for Emacs version XY. It is recommended to subscribe to the compat-announce (https://lists.sr.ht/~pkal/compat-announce) mailing list to be notified when new versions are released or relevant changes are made. * Menu: * Additional libraries::  File: compat.info, Node: Additional libraries, Up: Usage 1.2.1 Additional libraries -------------------------- These libraries are packages with Compat, but are disabled by default. To use them you can use ‘M-x load-library’: compat-help Add notes to ‘*Help*’ buffer, if a compatibility definition has something to warn you about. compat-font-lock Highlight functions that are implemented as compatibility definitions.  File: compat.info, Node: Intentions, Prev: Usage, Up: Introduction 1.3 Intentions ============== The library intends to provide support back until Emacs 24.3. The intended audience are package developers that are interested in using newer developments, without having to break compatibility. Sadly, total backwards compatibility cannot be provided for technical reasons. These might include: • An existing function or macro was extended by some new functionality. To support these cases, the function or macro would have to be advised. As this is usually regarded as invasive and is shown to be a significant overhead, even when the new feature is not used, this approach is not used. As a compromise, prefixed functions and macros (starting with a ‘compat-’ prefix) can be provided. • New functionality was implemented in the core, and depends on external libraries that cannot be reasonably duplicated in the scope of a compatibility library. • New functionality depends on an entire new, non-trivial library. Sometimes these are provided via ELPA (xref, project, ...), but other times it would be infeasible to duplicate an entire library within Compat while also providing the necessary backwards compatibility. • It just wasn’t added, and there is no good reason (though good excuses might exist). If you happen to find such a function, *note reporting: Development. it would be much appreciated. Always begin by assuming that this might be the case, unless proven otherwise.  File: compat.info, Node: Support, Next: Development, Prev: Introduction, Up: Top 2 Support ********* This section goes into the features that Compat manages and doesn’t manage to provide for each Emacs version. * Menu: * Emacs 24.4:: Compatibility support for Emacs 24.4 * Emacs 25.1:: Compatibility support for Emacs 25.1 * Emacs 26.1:: Compatibility support for Emacs 26.1 * Emacs 27.1:: Compatibility support for Emacs 27.1 * Emacs 28.1:: Compatibility support for Emacs 28.1  File: compat.info, Node: Emacs 24.4, Next: Emacs 25.1, Up: Support 2.1 Emacs 24.4 ============== 2.1.1 Unprefixed Definitions ---------------------------- The following functions and macros implemented in 24.4, and are provided by Compat by default: -- Macro: with-eval-after-load library body... This macro arranges to evaluate BODY at the end of loading the file LIBRARY, each time LIBRARY is loaded. If LIBRARY is already loaded, it evaluates BODY right away. You don’t need to give a directory or extension in the file name LIBRARY. Normally, you just give a bare file name, like this: (with-eval-after-load "js" (keymap-set js-mode-map "C-c C-c" 'js-eval)) To restrict which files can trigger the evaluation, include a directory or an extension or both in LIBRARY. Only a file whose absolute true name (i.e., the name with all symbolic links chased out) matches all the given name components will match. In the following example, ‘my_inst.elc’ or ‘my_inst.elc.gz’ in some directory ‘..../foo/bar’ will trigger the evaluation, but not ‘my_inst.el’: (with-eval-after-load "foo/bar/my_inst.elc" ...) LIBRARY can also be a feature (i.e., a symbol), in which case BODY is evaluated at the end of any file where ‘(provide LIBRARY)’ is called. An error in BODY does not undo the load, but does prevent execution of the rest of BODY. *Note (elisp)Hooks for Loading::. -- Function: special-form-p object This predicate tests whether its argument is a special form, and returns ‘t’ if so, ‘nil’ otherwise. *Note (elisp)Special Forms::. -- Function: macrop object This predicate tests whether its argument is a macro, and returns ‘t’ if so, ‘nil’ otherwise. *Note (elisp)Simple Macro::. -- Function: string-suffix-p suffix string &optional ignore-case This function returns non-‘nil’ if SUFFIX is a suffix of STRING; i.e., if STRING ends with SUFFIX. If the optional argument IGNORE-CASE is non-‘nil’, the comparison ignores case differences. *Note (elisp)Text Comparison::. -- Function: delete-consecutive-dups list &optional circular Destructively remove ‘equal’ consecutive duplicates from LIST. First and last elements are considered consecutive if CIRCULAR is non-nil. -- Function: define-error name message &optional parent In order for a symbol to be an error symbol, it must be defined with ‘define-error’ which takes a parent condition (defaults to ‘error’). This parent defines the conditions that this kind of error belongs to. The transitive set of parents always includes the error symbol itself, and the symbol ‘error’. Because quitting is not considered an error, the set of parents of ‘quit’ is just ‘(quit)’. *Note (elisp)Error Symbols::. -- Function: bool-vector-exclusive-or a b &optional c Return “bitwise exclusive or” of bool vectors A and B. If optional argument C is given, the result of this operation is stored into C. All arguments should be bool vectors of the same length. *Note (elisp)Bool-Vectors::. -- Function: bool-vector-union a b &optional c Return “bitwise or” of bool vectors A and B. If optional argument C is given, the result of this operation is stored into C. All arguments should be bool vectors of the same length. *Note (elisp)Bool-Vectors::. -- Function: bool-vector-intersection a b &optional c Return “bitwise and” of bool vectors A and B. If optional argument C is given, the result of this operation is stored into C. All arguments should be bool vectors of the same length. *Note (elisp)Bool-Vectors::. -- Function: bool-vector-set-difference a b &optional c Return “set difference” of bool vectors A and B. If optional argument C is given, the result of this operation is stored into C. All arguments should be bool vectors of the same length. *Note (elisp)Bool-Vectors::. -- Function: bool-vector-not a &optional b Return “set complement” of bool vector A. If optional argument B is given, the result of this operation is stored into B. All arguments should be bool vectors of the same length. *Note (elisp)Bool-Vectors::. -- Function: bool-vector-subsetp a b Return ‘t’ if every ‘t’ value in A is also ‘t’ in B, ‘nil’ otherwise. All arguments should be bool vectors of the same length. *Note (elisp)Bool-Vectors::. -- Function: bool-vector-count-consecutive a b i Return the number of consecutive elements in A equal B starting at I. ‘a’ is a bool vector, B is ‘t’ or ‘nil’, and I is an index into ‘a’. *Note (elisp)Bool-Vectors::. -- Function: bool-vector-count-population a Return the number of elements that are ‘t’ in bool vector A. *Note (elisp)Bool-Vectors::. -- Function: completion-table-with-cache function &optional ignore-case This is a wrapper for ‘completion-table-dynamic’ that saves the last argument-result pair. This means that multiple lookups with the same argument only need to call FUNCTION once. This can be useful when a slow operation is involved, such as calling an external process. *Note (elisp)Programmed Completion::. -- Function: face-spec-set face spec &optional spec-type 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 optional argument SPEC-TYPE determines which spec to set. If it is omitted or ‘nil’ or ‘face-override-spec’, this function sets the “override spec”, which overrides face specs on FACE of all the other types mentioned below. This is useful when calling this function outside of Custom code. If SPEC-TYPE is ‘customized-face’ or ‘saved-face’, this function sets the customized spec or the saved custom spec, respectively. 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). The effect of any other value of SPEC-TYPE on the face specs is reserved for internal use, but the function will still define FACE itself and recalculate its attributes, as described above. *Note (elisp)Defining Faces::. 2.1.2 Prefixed Definitions -------------------------- These functions are prefixed with ‘compat’ prefix, and are only loaded when ‘compat-24’ is required: -- Function: compat-= number-or-marker &rest number-or-markers This function tests whether all its arguments are numerically equal, and returns ‘t’ if so, ‘nil’ otherwise. *Note (elisp)Comparison of Numbers::. -- Function: compat-< number-or-marker &rest number-or-markers This function tests whether each argument is strictly less than the following argument. It returns ‘t’ if so, ‘nil’ otherwise. *Note (elisp)Comparison of Numbers::. -- Function: compat-> number-or-marker &rest number-or-markers This function tests whether each argument is strictly greater than the following argument. It returns ‘t’ if so, ‘nil’ otherwise. *Note (elisp)Comparison of Numbers::. -- Function: compat-<= number-or-marker &rest number-or-markers This function tests whether each argument is less than or equal to the following argument. It returns ‘t’ if so, ‘nil’ otherwise. *Note (elisp)Comparison of Numbers::. -- Function: compat->= number-or-marker &rest number-or-markers This function tests whether each argument is greater than or equal to the following argument. It returns ‘t’ if so, ‘nil’ otherwise. *Note (elisp)Comparison of Numbers::. These functions differ from the previous implementation in that they allow for more than two argument to be compared. -- Function: compat-split-string string &optional separators omit-nulls trim This function splits STRING into substrings based on the regular expression SEPARATORS (*note (elisp)Regular Expressions::). Each match for SEPARATORS defines a splitting point; the substrings between splitting points are made into a list, which is returned. *note (elisp)Creating Strings:: for more details. This version handles the optional argument TRIM. If it is non-‘nil’, it should be a regular expression to match text to trim from the beginning and end of each substring. If trimming makes the substring empty, it is treated as null. 2.1.3 Missing Definitions ------------------------- Compat does not provide support for the following Lisp features implemented in 24.4: • Allowing the second optional argument to ‘eval’ to specify a lexical environment. • The ‘define-alternatives’ macro. • Support for the ‘defalias-fset-function’ symbol property. • The ‘group-gid’ and ‘groupd-read-gid’ functions. • The ‘pre-redisplay-function’ hook. • Allowing for ‘with-demoted-errors’ to take a additional argument ‘format’. • The ‘add-face-text-property’ function. • No ‘tty-setup-hook’ hook. • The ‘get-pos-property’ function. • The ‘define-advice’ macro. • Support for generators. • The ‘string-trim’, ‘string-trim-left’ and ‘string-trim-right’ functions. These are instead provided as prefixed function as part of *note Emacs 26.1:: support.  File: compat.info, Node: Emacs 25.1, Next: Emacs 26.1, Prev: Emacs 24.4, Up: Support 2.2 Emacs 25.1 ============== 2.2.1 Unprefixed Definitions ---------------------------- The following functions and macros implemented in 25.1, and are provided by Compat by default: -- Function: format-message string &rest objects This function acts like ‘format’, except it also converts any grave accents (`) and apostrophes (') in STRING as per the value of ‘text-quoting-style’. Typically grave accent and apostrophe in the format translate to matching curved quotes, e.g., "Missing `%s'" might result in "Missing ‘foo’". *Note (elisp)Text Quoting Style::, for how to influence or inhibit this translation. *note (elisp)Formatting Strings::. -- Function: directory-name-p filename This function returns non-‘nil’ if FILENAME ends with a directory separator character. This is the forward slash ‘/’ on GNU and other POSIX-like systems; MS-Windows and MS-DOS recognize both the forward slash and the backslash ‘\’ as directory separators. *Note (elisp)Directory Names::. -- Function: string-greaterp string1 string2 This function returns the result of comparing STRING1 and STRING2 in the opposite order, i.e., it is equivalent to calling ‘(string-lessp STRING2 STRING1)’. *Note (elisp)Text Comparison::. -- Macro: with-file-modes mode body... This macro evaluates the BODY forms with the default permissions for new files temporarily set to MODES (whose value is as for ‘set-file-modes’ above). When finished, it restores the original default file permissions, and returns the value of the last form in BODY. This is useful for creating private files, for example. *Note (elisp)Changing Files::. -- Function: alist-get key alist &optional default remove testfn This function is similar to ‘assq’. It finds the first association ‘(KEY . VALUE)’ by comparing KEY with ALIST elements, and, if found, returns the VALUE of that association. If no association is found, the function returns DEFAULT. Comparison of KEY against ALIST elements uses the function specified by TESTFN, defaulting to ‘eq’. This is a generalized variable (*note (elisp)Generalized Variables::) that can be used to change a value with ‘setf’. When using it to set a value, optional argument REMOVE non-‘nil’ means to remove KEY’s association from ALIST if the new value is ‘eql’ to DEFAULT. *note (elisp)Association Lists::. -- Macro: if-let (bindings...) then &rest else... As with ‘let*’, BINDINGS will consist of ‘(SYMBOL VALUE-FORM)’ entries that are evaluated and bound sequentially. If all VALUE-FORM evaluate to non-‘nil’ values, then THEN is evaluated as were the case with a regular ‘let*’ expression, with all the variables bound. If any VALUE-FORM evaluates to ‘nil’, ELSE is evaluated, without any bound variables. A binding may also optionally drop the SYMBOL, and simplify to ‘(VALUE-FORM)’ if only the test is of interest. For the sake of backwards compatibility, it is possible to write a single binding without a binding list: (if-let* (SYMBOL (test)) foo bar) ≡ (if-let* ((SYMBOL (test))) foo bar) -- Macro: when-let (bindings...) &rest body As with ‘when’, if one is only interested in the case where all BINDINGS are non-nil. Otherwise BINDINGS are interpreted just as they are by ‘if-let*’. -- Macro: thread-first &rest forms Combine FORMS into a single expression by “threading” each element as the _first_ argument of their successor. Elements of FORMS can either be an list of an atom. For example, consider the threading expression and it’s equivalent macro expansion: (thread-first 5 (+ 20) (/ 25) - (+ 40)) ≡ (+ (- (/ (+ 5 20) 25)) 40) Note how the single ‘-’ got converted into a list before threading. This example uses arithmetic functions, but ‘thread-first’ is not restricted to arithmetic or side-effect free code. -- Macro: thread-last &rest forms Combine FORMS into a single expression by “threading” each element as the _last_ argument of their successor. Elements of FORMS can either be an list of an atom. For example, consider the threading expression and it’s equivalent macro expansion: (thread-first 5 (+ 20) (/ 25) - (+ 40)) ≡ (+ 40 (- (/ 25 (+ 20 5)))) Note how the single ‘-’ got converted into a list before threading. This example uses arithmetic functions, but ‘thread-last’ is not restricted to arithmetic or side-effect free code. -- Function: macroexpand-1 form &optional environment This function expands macros like ‘macroexpand’, but it only performs one step of the expansion: if the result is another macro call, ‘macroexpand-1’ will not expand it. *Note Expansion: (elisp)Expansion. -- Function: directory-files-recursively directory regexp &optional include-directories predicate follow-symlinks Return all files under DIRECTORY whose names match REGEXP. This function searches the specified DIRECTORY and its sub-directories, recursively, for files whose basenames (i.e., without the leading directories) match the specified REGEXP, and returns a list of the absolute file names of the matching files (*note absolute file names: (elisp)Relative File Names.). The file names are returned in depth-first order, meaning that files in some sub-directory are returned before the files in its parent directory. In addition, matching files found in each subdirectory are sorted alphabetically by their basenames. By default, directories whose names match REGEXP are omitted from the list, but if the optional argument INCLUDE-DIRECTORIES is non-‘nil’, they are included. By default, all subdirectories are descended into. If PREDICATE is ‘t’, errors when trying to descend into a subdirectory (for instance, if it’s not readable by this user) are ignored. If it’s neither ‘nil’ nor ‘t’, it should be a function that takes one parameter (the subdirectory name) and should return non-‘nil’ if the directory is to be descended into. Symbolic links to subdirectories are not followed by default, but if FOLLOW-SYMLINKS is non-‘nil’, they are followed. *Note (elisp)Contents of Directories::. -- Function: bool-vector &rest objects This function creates and returns a bool-vector whose elements are the arguments, OBJECTS. *Note (elisp)Bool-Vectors::. 2.2.2 Prefixed Definitions -------------------------- These functions are prefixed with ‘compat’ prefix, and are only loaded when ‘compat-25’ is required: -- Function: compat-sort sequence predicate This function sorts SEQUENCE stably. Note that this function doesn’t work for all sequences; it may be used only for lists and vectors. If SEQUENCE is a list, it is modified destructively. This functions returns the sorted SEQUENCE and compares elements using PREDICATE. A stable sort is one in which elements with equal sort keys maintain their relative order before and after the sort. Stability is important when successive sorts are used to order elements according to different criteria. *Note (elisp)Sequence Functions::. The compatibility version adds support for vectors to be sorted, not just lists. 2.2.3 Missing Definitions ------------------------- Compat does not provide support for the following Lisp features implemented in 25.1: • New ‘pcase’ patterns. • The hook ‘prefix-command-echo-keystrokes-functions’ and ‘prefix-command-preserve-state-hook’. • The hook ‘pre-redisplay-functions’. • The function ‘make-process’. • Support for the variable ‘inhibit-message’. • The ‘define-inline’ functionality. • The functions ‘string-collate-lessp’ and ‘string-collate-equalp’. • The function ‘funcall-interactivly’. • The function ‘buffer-substring-with-bidi-context’. • The function ‘font-info’. • The function ‘default-font-width’. • The function ‘window-font-height’ and ‘window-font-width’. • The function ‘window-max-chars-per-line’. • The function ‘set-binary-mode’. • The functions ‘bufferpos-to-filepos’ and ‘filepos-to-bufferpos’.  File: compat.info, Node: Emacs 26.1, Next: Emacs 27.1, Prev: Emacs 25.1, Up: Support 2.3 Emacs 26.1 ============== 2.3.1 Unprefixed Definitions ---------------------------- The following functions and macros implemented in 26.1, and are provided by Compat by default: -- Function: func-arity function This function provides information about the argument list of the specified FUNCTION. The returned value is a cons cell of the form ‘(MIN . MAX)’, where MIN is the minimum number of arguments, and MAX is either the maximum number of arguments, or the symbol ‘many’ for functions with ‘&rest’ arguments, or the symbol ‘unevalled’ if FUNCTION is a special form. Note that this function might return inaccurate results in some situations, such as the following: − Functions defined using ‘apply-partially’ (*note apply-partially: (elisp)Calling Functions.). − Functions that are advised using ‘advice-add’ (*note (elisp)Advising Named Functions::). − Functions that determine the argument list dynamically, as part of their code. *Note (elisp)What Is a Function::. -- Function: mapcan function sequence This function applies FUNCTION to each element of SEQUENCE, like ‘mapcar’, but instead of collecting the results into a list, it returns a single list with all the elements of the results (which must be lists), by altering the results (using ‘nconc’; *note (elisp)Rearrangement::). Like with ‘mapcar’, SEQUENCE can be of any type except a char-table. ;; Contrast this: (mapcar #'list '(a b c d)) ⇒ ((a) (b) (c) (d)) ;; with this: (mapcan #'list '(a b c d)) ⇒ (a b c d) *Note (elisp)Mapping Functions::. -- Function: cXXXr -- Function: cXXXXr *Note (elisp)List Elements::. -- Function: gensym &optional prefix This function returns a symbol using ‘make-symbol’, whose name is made by appending ‘gensym-counter’ to PREFIX and incrementing that counter, guaranteeing that no two calls to this function will generate a symbol with the same name. The prefix defaults to ‘"g"’. -- Variable: gensym-counter See ‘gensym’. -- Function: make-nearby-temp-file prefix &optional dir-flag suffix This function is similar to ‘make-temp-file’, but it creates a temporary file as close as possible to ‘default-directory’. If PREFIX is a relative file name, and ‘default-directory’ is a remote file name or located on a mounted file systems, the temporary file is created in the directory returned by the function ‘temporary-file-directory’. Otherwise, the function ‘make-temp-file’ is used. PREFIX, DIR-FLAG and SUFFIX have the same meaning as in ‘make-temp-file’. (let ((default-directory "/ssh:remotehost:")) (make-nearby-temp-file "foo")) ⇒ "/ssh:remotehost:/tmp/foo232J6v" -- Variable: mounted-file-systems A regular expression matching files names that are probably on a mounted file system. -- Function: temporary-file-directory The directory for writing temporary files via ‘make-nearby-temp-file’. In case of a remote ‘default-directory’, this is a directory for temporary files on that remote host. If such a directory does not exist, or ‘default-directory’ ought to be located on a mounted file system (see ‘mounted-file-systems’), the function returns ‘default-directory’. For a non-remote and non-mounted ‘default-directory’, the value of the variable ‘temporary-file-directory’ is returned. *Note (elisp)Unique File Names::. -- Macro: if-let* (bindings...) then &rest else ‘if-let*’ is mostly equivalent to ‘if-let’, with the exception that the legacy ‘(if (VAR (test)) foo bar)’ syntax is not permitted. -- Macro: when-let* (bindings...) then &rest else ‘when-let*’ is mostly equivalent to ‘when-let’, with the exception that the legacy ‘(when-let (VAR (test)) foo bar)’ syntax is not permitted. -- Macro: and-let* (bindings...) &rest body A combination of LET* and AND, analogous to ‘when-let*’. If all BINDINGS are non-‘nil’ and BODY is ‘nil’, then the result of the ‘and-let*’ form will be the last value bound in BINDINGS. **Please Note:** The implementation provided by Compat does not include a bug that was observed with Emacs 26 (see ). -- Function: file-local-name filename This function returns the _local part_ of FILENAME. This is the part of the file’s name that identifies it on the remote host, and is typically obtained by removing from the remote file name the parts that specify the remote host and the method of accessing it. For example: (file-local-name "/ssh:USER@HOST:/foo/bar") ⇒ "/foo/bar" For a remote FILENAME, this function returns a file name which could be used directly as an argument of a remote process (*note (elisp)Asynchronous Processes::, and *note (elisp)Synchronous Processes::), and as the program to run on the remote host. If FILENAME is local, this function returns it unchanged. *Note (elisp)Magic File Names::. -- Macro: file-name-quoted-p name This macro returns non-‘nil’, when NAME is quoted with the prefix ‘/:’. If NAME is a remote file name, the local part of NAME is checked. *Note (elisp)File Name Expansion::. -- Macro: file-name-quote name This macro adds the quotation prefix ‘/:’ to the file NAME. For a local file NAME, it prefixes NAME with ‘/:’. If NAME is a remote file name, the local part of NAME (*note (elisp)Magic File Names::) is quoted. If NAME is already a quoted file name, NAME is returned unchanged. (substitute-in-file-name (file-name-quote "bar/~/foo")) ⇒ "/:bar/~/foo" (substitute-in-file-name (file-name-quote "/ssh:host:bar/~/foo")) ⇒ "/ssh:host:/:bar/~/foo" The macro cannot be used to suppress file name handlers from magic file names (*note (elisp)Magic File Names::). *Note (elisp)File Name Expansion::. -- Function: read-multiple-choice prompt choices &optional help-string show-help long-form Ask user a multiple choice question. PROMPT should be a string that will be displayed as the prompt. CHOICES is an alist where the first element in each entry is a character to be entered, the second element is a short name for the entry to be displayed while prompting (if there’s room, it might be shortened), and the third, optional entry is a longer explanation that will be displayed in a help buffer if the user requests more help. If optional argument LONG-FORM is non-‘nil’, the user will have to type in long-form answers (using ‘completing-read’) instead of hitting a single key. The answers must be among the second elements of the values in the CHOICES list. Note: The Compat implementation of this function ignores the optional arguments HELP-STRING and SHOW-HELP. Therefore the optional third element in each CHOICES entry will also be disregarded. See *note Reading One Event: (elisp)Reading One Event. -- Function: image-property Defined in ‘image.el’. This function can also be used as a generalised variable. To use this you need to explicitly require ‘compat-26’. -- Function: file-attribute-type Return the field _type_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-link-number Return the field _link-number_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-user-id Return the field _user-id_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-group-id Return the field _group-id_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-access-time Return the field _access-time_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-modification-time Return the field _modification-time_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-status-change-time Return the field _modification-time_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-size Return the field _size_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-modes Return the field _modes_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-inode-number Return the field _inode-number_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-device-number Return the field _device-number_ as generated by ‘file-attributes’. *Note (elisp)File Attributes::. -- Function: file-attribute-collect attributes &rest attr-names Filter the file attributes ATTRIBUTES, as generated by ‘file-attributes’, according to ATTR-NAMES. Valid attribute names for ATTR-NAMES are: type, link-number, user-id, group-id, access-time, modification-time, status-change-time, size, modes, inode-number and device-number. (file-attributes ".") ⇒ (t 1 1000 1000 (25329 18215 325481 96000) (25325 15364 530263 840000) (25325 15364 530263 840000) 788 "drwxr-xr-x" t 137819 40) (file-attribute-collect (file-attributes ".") 'type 'modes 'inode-number) ⇒ (t "drwxr-xr-x" 137819) 2.3.2 Prefixed Definitions -------------------------- These functions are prefixed with ‘compat’ prefix, and are only loaded when ‘compat-26’ is required: -- Function: compat-assoc key alist &optional testfn This function returns the first association for KEY in ALIST, comparing KEY against the alist elements using TESTFN if it is a function, and ‘equal’ otherwise (*note (elisp)Equality Predicates::). If TESTFN is a function, it is called with two arguments: the CAR of an element from ALIST and KEY. The function returns ‘nil’ if no association in ALIST has a CAR equal to KEY, as tested by TESTFN. *Note (elisp)Association Lists::. The compatibility version adds support for handling the optional argument TESTFN. -- Function: compat-line-number-at-pos &optional pos absolute This function returns the line number in the current buffer corresponding to the buffer position POS. If POS is ‘nil’ or omitted, the current buffer position is used. If ABSOLUTE is ‘nil’, the default, counting starts at ‘(point-min)’, so the value refers to the contents of the accessible portion of the (potentially narrowed) buffer. If ABSOLUTE is non-‘nil’, ignore any narrowing and return *Note (elisp)Text Lines::. The compatibility version adds support for handling the optional argument ABSOLUTE. -- Function: compat-alist-get key alist &optional default remove testfn *Note (elisp)Association Lists::. This function is similar to ‘assq’. It finds the first association ‘(KEY . VALUE)’ by comparing KEY with ALIST elements, and, if found, returns the VALUE of that association. If no association is found, the function returns DEFAULT. Comparison of KEY against ALIST elements uses the function specified by TESTFN, defaulting to ‘eq’. *Note (elisp)Association Lists::. The compatibility version handles the optional argument TESTFN. It can also be used as a *note Generalized Variables: (elisp)generalised variable. -- Function: compat-string-trim-left string &optional regexp Remove the leading text that matches REGEXP from STRING. REGEXP defaults to ‘[ \t\n\r]+’. *Note (elisp)Creating Strings::. The compatibility version handles the optional argument REGEXP. -- Function: compat-string-trim-right string &optional regexp Remove the trailing text that matches REGEXP from STRING. REGEXP defaults to ‘[ \t\n\r]+’. *Note (elisp)Creating Strings::. The compatibility version handles the optional argument REGEXP. -- Function: compat-string-trim string &optional trim-left trim-right Remove the leading text that matches TRIM-LEFT and trailing text that matches TRIM-RIGHT from STRING. Both regexps default to ‘[ \t\n\r]+’. *Note (elisp)Creating Strings::. The compatibility version handles the optional arguments TRIM-LEFT and TRIM-RIGHT. 2.3.3 Missing Definitions ------------------------- Compat does not provide support for the following Lisp features implemented in 26.1: • The function ‘secure-hash-algorithms’. • The function ‘gnutls-avalaible-p’. • Support for records and record functions. • The function ‘mapbacktrace’. • The function ‘file-name-case-insensitive-p’. • The file-attributes constructors. • The additional elements of ‘parse-partial-sexp’. • The function ‘add-variable-watcher’. • The function ‘undo-amalgamate-change-group’. • The function ‘char-from-name’ • Signalling errors when ‘length’ or ‘member’ deal with list cycles. • The function ‘frame-list-z-order’. • The function ‘frame-restack’. • Support for side windows and atomic windows. • All changes related to ‘display-buffer’. • The function ‘window-swap-states’.  File: compat.info, Node: Emacs 27.1, Next: Emacs 28.1, Prev: Emacs 26.1, Up: Support 2.4 Emacs 27.1 ============== 2.4.1 Unprefixed Definitions ---------------------------- The following functions and macros implemented in 27.1, and are provided by Compat by default: -- Function: proper-list-p object This function returns the length of OBJECT if it is a proper list, ‘nil’ otherwise (*note (elisp)Cons Cells::). In addition to satisfying ‘listp’, a proper list is neither circular nor dotted. (proper-list-p '(a b c)) ⇒ 3 (proper-list-p '(a b . c)) ⇒ nil *Note (elisp)List-related Predicates::. -- Function: string-distance string1 string2 &optional bytecompare This function returns the _Levenshtein distance_ between the source string STRING1 and the target string STRING2. The Levenshtein distance is the number of single-character changes—deletions, insertions, or replacements—required to transform the source string into the target string; it is one possible definition of the _edit distance_ between strings. Letter-case of the strings is significant for the computed distance, but their text properties are ignored. If the optional argument BYTECOMPARE is non-‘nil’, the function calculates the distance in terms of bytes instead of characters. The byte-wise comparison uses the internal Emacs representation of characters, so it will produce inaccurate results for multibyte strings that include raw bytes (*note (elisp)Text Representations::); make the strings unibyte by encoding them (*note (elisp)Explicit Encoding::) if you need accurate results with raw bytes. *Note (elisp)Text Comparison::. -- Function: json-serialize object &rest args This function returns a new Lisp string which contains the JSON representation of OBJECT. The argument ARGS is a list of keyword/argument pairs. The following keywords are accepted: ‘:null-object’ The value decides which Lisp object to use to represent the JSON keyword ‘null’. It defaults to the symbol ‘:null’. ‘:false-object’ The value decides which Lisp object to use to represent the JSON keyword ‘false’. It defaults to the symbol ‘:false’. *Note (elisp)Parsing JSON::. -- Function: json-insert object &rest args This function inserts the JSON representation of OBJECT into the current buffer before point. The argument ARGS are interpreted as in ‘json-parse-string’. *Note (elisp)Parsing JSON::. -- Function: json-parse-string string &rest args This function parses the JSON value in STRING, which must be a Lisp string. If STRING doesn’t contain a valid JSON object, this function signals the ‘json-parse-error’ error. The argument ARGS is a list of keyword/argument pairs. The following keywords are accepted: ‘:object-type’ The value decides which Lisp object to use for representing the key-value mappings of a JSON object. It can be either ‘hash-table’, the default, to make hashtables with strings as keys; ‘alist’ to use alists with symbols as keys; or ‘plist’ to use plists with keyword symbols as keys. ‘:array-type’ The value decides which Lisp object to use for representing a JSON array. It can be either ‘array’, the default, to use Lisp arrays; or ‘list’ to use lists. ‘:null-object’ The value decides which Lisp object to use to represent the JSON keyword ‘null’. It defaults to the symbol ‘:null’. ‘:false-object’ The value decides which Lisp object to use to represent the JSON keyword ‘false’. It defaults to the symbol ‘:false’. *Note (elisp)Parsing JSON::. -- Function: json-parse-buffer &rest args This function reads the next JSON value from the current buffer, starting at point. It moves point to the position immediately after the value if contains a valid JSON object; otherwise it signals the ‘json-parse-error’ error and doesn’t move point. The arguments ARGS are interpreted as in ‘json-parse-string’. *Note (elisp)Parsing JSON::. -- Macro: ignore-errors body... This construct executes BODY, ignoring any errors that occur during its execution. If the execution is without error, ‘ignore-errors’ returns the value of the last form in BODY; otherwise, it returns ‘nil’. Here’s the example at the beginning of this subsection rewritten using ‘ignore-errors’: (ignore-errors (delete-file filename)) *Note (elisp)Handling Errors::. -- Macro: dolist-with-progress-reporter (var count [result]) reporter-or-message body... This is another convenience macro that works the same way as ‘dolist’ does, but also reports loop progress using the functions described above. As in ‘dotimes-with-progress-reporter’, ‘reporter-or-message’ can be a progress reporter or a string. You can rewrite the previous example with this macro as follows: (dolist-with-progress-reporter (k (number-sequence 0 500)) "Collecting some mana for Emacs..." (sit-for 0.01)) *Note (elisp)Progress::. -- Function: flatten-tree tree This function returns a “flattened” copy of TREE, that is, a list containing all the non-‘nil’ terminal nodes, or leaves, of the tree of cons cells rooted at TREE. Leaves in the returned list are in the same order as in TREE. (flatten-tree '(1 (2 . 3) nil (4 5 (6)) 7)) ⇒(1 2 3 4 5 6 7) *Note (elisp)Building Lists::. -- Function: xor condition1 condition2 This function returns the boolean exclusive-or of CONDITION1 and CONDITION2. That is, ‘xor’ returns ‘nil’ if either both arguments are ‘nil’, or both are non-‘nil’. Otherwise, it returns the value of that argument which is non-‘nil’. Note that in contrast to ‘or’, both arguments are always evaluated. *Note (elisp)Combining Conditions::. -- Variable: regexp-unmatchable This variable contains a regexp that is guaranteed not to match any string at all. It is particularly useful as default value for variables that may be set to a pattern that actually matches something. *Note (elisp)Regexp Functions:: -- Function: decoded-time-second time Return the SECONDS field of a ‘decoded-time’ record TIME. -- Function: decoded-time-minute time Return the MINUTE field of a ‘decoded-time’ record TIME. -- Function: decoded-time-hour time Return the HOUR field of a ‘decoded-time’ record TIME. -- Function: decoded-time-day time Return the DAY field of a ‘decoded-time’ record TIME. -- Function: decoded-time-month time Return the MONTH field of a ‘decoded-time’ record TIME. -- Function: decoded-time-year time Return the YEAR field of a ‘decoded-time’ record TIME. -- Function: decoded-time-weekday time Return the WEEKDAY field of a ‘decoded-time’ record TIME. -- Function: decoded-time-dst time Return the DST (daylight saving time indicator) field of a ‘decoded-time’ record TIME. -- Function: decoded-time-zone time Return the ZONE field of a ‘decoded-time’ record TIME. -- Function: package-get-version Return the version number of the package in which this is used. -- Function: time-equal-p t1 t2 This returns ‘t’ if the two time values T1 and T2 are equal. *Note (elisp)Time Calculations::. -- Function: date-days-in-month year month Return the number of days in MONTH in YEAR. For instance, February 2020 has 29 days. *Note (elisp)Time Calculations::. This function requires the ‘time-date’ feature to be loaded. -- User Option: exec-path 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’). *Note executable-find: (elisp)Locating Files, for the details of this search. 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. *Note (elisp)Subprocess Creation::. -- Function: provided-mode-derived-p mode &rest modes This function returns non-‘nil’ if MODE is derived from any of the major modes given by the symbols MODES. -- Function: derived-mode-p &rest modes This function returns non-‘nil’ if the current major mode is derived from any of the major modes given by the symbols MODES. *Note (elisp)Derived Modes::. 2.4.2 Prefixed Definitions -------------------------- These functions are prefixed with ‘compat’ prefix, and are only loaded when ‘compat-27’ is required: -- Function: compat-recenter &optional count redisplay This function scrolls the text in the selected window so that point is displayed at a specified vertical position within the window. It does not move point with respect to the text. *Note (elisp)Textual Scrolling::. This compatibility version adds support for the optional argument REDISPLAY. -- Function: compat-lookup-key keymap key &optional accept-defaults This function returns the definition of KEY in KEYMAP. If the string or vector KEY is not a valid key sequence according to the prefix keys specified in KEYMAP, it must be too long and have extra events at the end that do not fit into a single key sequence. Then the value is a number, the number of events at the front of KEY that compose a complete key. *Note (elisp)Low-Level Key Binding::. This compatibility version allows for KEYMAP to be a list of keymaps, instead of just a singular keymap. -- Macro: setq-local &rest pairs PAIRS is a list of variable and value pairs. This macro creates a buffer-local binding in the current buffer for each of the variables, and gives them a buffer-local value. It is equivalent to calling ‘make-local-variable’ followed by ‘setq’ for each of the variables. The variables should be unquoted symbols. (setq-local var1 "value1" var2 "value2") *Note (elisp)Creating Buffer-Local::. This compatibility version allows for more than one variable to be set at once, as can be done with ‘setq’. -- Function: compat-regexp-opt strings &optional paren 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 mode. *Note (elisp)Regexp Functions::. The compatibility version of this functions handles the case where STRINGS in an empty list. In that case, a regular expression is generated that never matches anything (see ‘regexp-unmatchable’). -- Function: compat-file-size-human-readable file-size &optional flavor space unit Return a string with a human readable representation of FILE-SIZE. The optional second argument FLAVOR controls the units and the display format. If FLAVOR is... • ‘si’, each kilobyte is 1000 bytes and the produced suffixes are ‘k’, ‘M’, ‘G’, ‘T’, etc. • ‘iec’, each kilobyte is 1024 bytes and the produced suffixes are ‘KiB’, ‘MiB’, ‘GiB’, ‘TiB’, etc. • ‘nil’ or omitted, each kilobyte is 1024 bytes and the produced suffixes are ‘k’, ‘M’, ‘G’, ‘T’, etc. The compatibility version handles the optional third (SPACE) and forth (UNIT) arguments. The argument SPACE can be a string that is placed between the number and the unit. The argument UNIT determines the unit to use. By default it will be an empty string, unless FLAVOR is ‘iec’, in which case it will be ‘B’. -- Function: compat-assoc-delete-all This function is like ‘assq-delete-all’ except that it accepts an optional argument TEST, a predicate function to compare the keys in ALIST. If omitted or ‘nil’, TEST defaults to ‘equal’. As ‘assq-delete-all’, this function often modifies the original list structure of ALIST. *Note (elisp)Association Lists::. This compatibility version handles the optional third (TESTFN) argument. -- Function: compat-executable-find program &optional remote This function searches for the executable file of the named PROGRAM and returns the absolute file name of the executable, including its file-name extensions, if any. It returns ‘nil’ if the file is not found. The function searches in all the directories in ‘exec-path’, and tries all the file-name extensions in ‘exec-suffixes’ (*note (elisp)Subprocess Creation::). If REMOTE is non-‘nil’, and ‘default-directory’ is a remote directory, PROGRAM is searched on the respective remote host. *Note (elisp)Locating Files::. This compatibility version adds support to handle the optional second (REMOTE) argument. -- Function: compat-dired-get-marked-files &optional localp arg filter distinguish-one-marked error Return a list of file names that are _marked_ in a Dired buffer. This compatibility version handles the optional fifth (ERROR) argument, which signals an error if the list of found files is empty. ‘error’ can be a string with the error message. 2.4.3 Missing Definitions ------------------------- Compat does not provide support for the following Lisp features implemented in 27.1: • Bigint support. • The function ‘time-convert’. • All ‘iso8601-*’ functions. • The macro ‘benchmark-progn’. • The function ‘read-char-from-minibuffer’. • The minor mode ‘reveal-mode’. • The macro ‘with-suppressed-warnings’. • Support for ‘condition-case’ to handle t. • The functions ‘major-mode-suspend’ and ‘major-mode-restore’. • The function ‘provided-mode-derived-p’. • The function ‘file-system-info’. • The more consistent treatment of NaN values. • The function ‘ring-resize’. • The function ‘group-name’. • Additional ‘format-spec’ modifiers. • Support for additional body forms for ‘define-globalized-minor-mode’. • The macro ‘with-connection-local-variables’ and related functionality.  File: compat.info, Node: Emacs 28.1, Prev: Emacs 27.1, Up: Support 2.5 Emacs 28.1 ============== 2.5.1 Unprefixed Definitions ---------------------------- The following functions and macros implemented in 28.1, and are provided by Compat by default: -- Function: string-search needle haystack &optional start-pos Return the position of the first instance of NEEDLE in HAYSTACK, both of which are strings. If START-POS is non-‘nil’, start searching from that position in NEEDLE. Return ‘nil’ if no match was found. This function only considers the characters in the strings when doing the comparison; text properties are ignored. Matching is always case-sensitive. -- Function: length= sequence length Return non-‘nil’ if the length of SEQUENCE is equal to LENGTH. -- Function: length< sequence length Return non-‘nil’ if SEQUENCE is shorter than LENGTH. This may be more efficient than computing the length of SEQUENCE if SEQUENCE is a long list. -- Function: length> sequence length Return non-‘nil’ if SEQUENCE is longer than LENGTH. -- Function: file-name-concat directory &rest components Concatenate COMPONENTS to DIRECTORY, inserting a slash before the components if DIRECTORY or the preceding component didn’t end with a slash. (file-name-concat "/tmp" "foo") ⇒ "/tmp/foo" A DIRECTORY or components that are ‘nil’ or the empty string are ignored—they are filtered out first and do not affect the results in any way. This is almost the same as using ‘concat’, but DIRNAME (and the non-final components) may or may not end with slash characters, and this function will not double those characters. -- Function: garbage-collect-maybe factor Suggest to run garbage collection, if _enough_ data has been allocated. This is determined by the positive numerical argument FACTOR, that would proportionally increase the likelihood of garbage collection taking place. This compatibility function does nothing and ignores any suggestion. -- Function: string-replace from-string to-string in-string This function replaces all occurrences of FROM-STRING with TO-STRING in IN-STRING and returns the result. It may return one of its arguments unchanged, a constant string or a new string. Case is significant, and text properties are ignored. -- Function: always &rest arguments This function ignores any ARGUMENTS and returns ‘t’. *Note (elisp)Calling Functions::. -- Function: insert-into-buffer to-buffer &optional start end This is like ‘insert-buffer-substring’, but works in the opposite direction: The text is copied from the current buffer into TO-BUFFER. The block of text is copied to the current point in TO-BUFFER, and point (in that buffer) is advanced to after the end of the copied text. Is ‘start’/‘end’ is ‘nil’, the entire text in the current buffer is copied over. *Note (elisp)Insertion::. -- Function: replace-string-in-region regexp replacement &optional start end This function replaces all the occurrences of REGEXP with REPLACEMENT in the region of buffer text between START and END; START defaults to position of point, and END defaults to the last accessible position of the buffer. The search for REGEXP is case-sensitive, and REPLACEMENT is inserted without changing its letter-case. The REPLACEMENT string can use the same special elements starting with ‘\’ as ‘replace-match’ does. The function returns the number of replaced occurrences, or ‘nil’ if REGEXP is not found. The function preserves the position of point. (replace-regexp-in-region "foo[ \t]+bar" "foobar") *Note (elisp)Search and Replace::. -- Function: replace-regexp-in-string string replacement &optional start end This function works similarly to ‘replace-regexp-in-region’, but searches for, and replaces, literal STRINGs instead of regular expressions. *Note (elisp)Search and Replace::. -- Function: buffer-local-boundp variable buffer This returns non-‘nil’ if there’s either a buffer-local binding of VARIABLE (a symbol) in buffer BUFFER, or VARIABLE has a global binding. *Note (elisp)Creating Buffer-Local::. -- Macro: with-existing-directory body... This macro ensures that ‘default-directory’ is bound to an existing directory before executing BODY. If ‘default-directory’ already exists, that’s preferred, and otherwise some other directory is used. This macro can be useful, for instance, when calling an external command that requires that it’s running in a directory that exists. The chosen directory is not guaranteed to be writable. *Note (elisp)Testing Accessibility::. -- Macro: dlet (bindings...) forms... This special form is like ‘let’, but it binds all variables dynamically. This is rarely useful—you usually want to bind normal variables lexically, and special variables (i.e., variables that are defined with ‘defvar’) dynamically, and this is what ‘let’ does. ‘dlet’ can be useful when interfacing with old code that assumes that certain variables are dynamically bound (*note (elisp)Dynamic Binding::), but it’s impractical to ‘defvar’ these variables. ‘dlet’ will temporarily make the bound variables special, execute the forms, and then make the variables non-special again. *Note (elisp)Local Variables::. -- Function: ensure-list object This function returns OBJECT as a list. If OBJECT is already a list, the function returns it; otherwise, the function returns a one-element list containing OBJECT. This is usually useful if you have a variable that may or may not be a list, and you can then say, for instance: (dolist (elem (ensure-list foo)) (princ elem)) *Note (elisp)Building Lists::. -- Function: string-clean-whitespace string Clean up the whitespace in STRING by collapsing stretches of whitespace to a single space character, as well as removing all whitespace from the start and the end of STRING. *Note (elisp)Creating Strings::. -- Function: string-fill string length Attempt to Word-wrap STRING so that no lines are longer than LENGTH. Filling is done on whitespace boundaries only. If there are individual words that are longer than LENGTH, these will not be shortened. *Note (elisp)Creating Strings::. -- Function: string-lines string &optional omit-nulls keep-newlines Split STRING into a list of strings on newline boundaries. If the optional argument OMIT-NULLS is non-‘nil’, remove empty lines from the results. If the optional argument KEEP-NEWLINES is non-‘nil’, don’t remove the trailing newlines from the result strings. *Note (elisp)Creating Strings::. -- Function: string-pad string length &optional padding start Pad STRING to be of the given LENGTH using PADDING as the padding character. PADDING defaults to the space character. If STRING is longer than LENGTH, no padding is done. If START is ‘nil’ or omitted, the padding is appended to the characters of STRING, and if it’s non-‘nil’, the padding is prepended to STRING’s characters. *Note (elisp)Creating Strings::. -- Function: string-chop-newline string Remove the final newline, if any, from STRING. *Note (elisp)Creating Strings::. -- Macro: named-let name bindings &rest body This special form is a looping construct inspired from the Scheme language. It is similar to ‘let’: It binds the variables in BINDINGS, and then evaluates BODY. However, ‘named-let’ also binds NAME to a local function whose formal arguments are the variables in BINDINGS and whose body is BODY. This allows BODY to call itself recursively by calling NAME, where the arguments passed to NAME are used as the new values of the bound variables in the recursive invocation. Recursive calls to NAME that occur in _tail positions_ in BODY are guaranteed to be optimized as _tail calls_, which means that they will not consume any additional stack space no matter how deeply the recursion runs. Such recursive calls will effectively jump to the top of the loop with new values for the variables. *Note (elisp)Local Variables::. -- Function: file-name-with-extension filename extension This function returns FILENAME with its extension set to EXTENSION. A single leading dot in the EXTENSION will be stripped if there is one. For example: (file-name-with-extension "file" "el") ⇒ "file.el" (file-name-with-extension "file" ".el") ⇒ "file.el" (file-name-with-extension "file.c" "el") ⇒ "file.el" Note that this function will error if FILENAME or EXTENSION are empty, or if the FILENAME is shaped like a directory (i.e., if ‘directory-name-p’ returns non-‘nil’). *Note File Name Components: (elisp)File Name Components. -- Function: directory-empty-p directory This utility function returns ‘t’ if given DIRECTORY is an accessible directory and it does not contain any files, i.e., is an empty directory. It will ignore ‘.’ and ‘..’ on systems that return them as files in a directory. Symbolic links to directories count as directories. See FILE-SYMLINK-P to distinguish symlinks. *Note (elisp)Contents of Directories::. -- Function: format-prompt prompt default &rest format-args Format PROMPT with default value DEFAULT according to the ‘minibuffer-default-prompt-format’ variable. ‘minibuffer-default-prompt-format’ is a format string (defaulting to ‘" (default %s)"’ that says how the “default” bit in prompts like ‘"Local filename (default somefile): "’ are to be formatted. To allow the users to customize how this is displayed, code that prompts the user for a value (and has a default) should look something along the lines of this code snippet: (read-file-name (format-prompt "Local filename" file) nil file) If FORMAT-ARGS is ‘nil’, PROMPT is used as a literal string. If FORMAT-ARGS is non-‘nil’, PROMPT is used as a format control string, and PROMPT and FORMAT-ARGS are passed to ‘format’ (*note (elisp)Formatting Strings::). ‘minibuffer-default-prompt-format’ can be ‘""’, in which case no default values are displayed. If DEFAULT is ‘nil’, there is no default value, and therefore no “default value” string is included in the result value. If DEFAULT is a non-‘nil’ list, the first element of the list is used in the prompt. *Note (elisp)Text from Minibuffer::. -- Function: thing-at-mouse event thing &optional no-properties Mouse-EVENT equivalent of ‘thing-at-point’. THING can be ‘symbol’, ‘list’, ‘sexp’, ‘filename’, ‘url’, ... among other things. When NO-PROPERTIES has a non-‘nil’ value, any text properties that might have been present in the buffer are stripped away. -- Function: macroexp-file-name Return the name of the file in which the code is currently being evaluated, or ‘nil’ if it cannot be determined. -- Macro: with-environment-variables variables body... This macro sets the environment variables according to VARIABLES temporarily when executing BODY. The previous values are restored when the form finishes. The argument VARIABLES should be a list of pairs of strings of the form ‘(VAR VALUE)’, where VAR is the name of the environment variable and VALUE is that variable’s value. (with-environment-variables (("LANG" "C") ("LANGUAGE" "en_US:en")) (call-process "ls" nil t)) *Note System Environment: (elisp)System Environment. -- Function: button-buttonize string callback &optional data help-echo Return a button with STRING as its label. When interacted on, the one-argument function in CALLBACK is called and DATA (or ‘nil’ is not present) will be passed as the argument. If non-‘nil’, the argument HELP-ECHO will be used to set the ‘help-echo’ text property. -- Function: make-directory-autoloads dir output-file Parse and search the directory DIR for autoload definitions, and write the processed results to the file OUTPUT-FILE. -- Function: color-values-from-color-spec spec Convert the textual color specification SPEC to a color triple ‘(RED GREEN blue)’. Each of RED, GREEN and ‘blue’ is a integer value between 0 and 65535. The specification SPEC can be one of the following • ‘#RGB’, where R, G and B are hex numbers of equal length, 1-4 digits each. • ‘rgb:R/G/B’, where R, G, and B are hex numbers, 1-4 digits each. • ‘rgbi:R/G/B’, where R, G and B are floating-point numbers in [0,1]. -- Function: file-modes-number-to-symbolic modes This function converts a numeric file mode specification in MODES into the equivalent symbolic form. *Note Changing Files: (elisp)Changing Files. -- Function: file-backup-file-names filename This function returns a list of all the backup file names for FILENAME, or ‘nil’ if there are none. The files are sorted by modification time, descending, so that the most recent files are first. *Note (elisp)Backup Names::. -- Function: make-lock-file-name filename Return a string containing a lock file name for FILENAME, obeying ‘lock-file-name-transforms’. -- Function: null-device Return the path to the null device (usually something like ‘/dev/null’) on the current system. -- Function: decoded-time-period time Interpret TIME as a period and return its length in seconds. For computational purposes, years are 365 days long and months are 30 days long. -- Function: subr-primitive-p object Return ‘t’ if OBJECT is a primitive, built-in function. On systems with native compilation ‘subrp’ does not distinguish between built-in functions and functions that have been compiled. If native compilation is not avaliable, this function behaves identically to ‘subrp’. -- Function: file-name-absolute-p filename This function returns ‘t’ if file FILENAME is an absolute file name, ‘nil’ otherwise. A file name is considered to be absolute if its first component is ‘~’, or is ‘~USER’ where USER is a valid login name. In the following examples, assume that there is a user named ‘rms’ but no user named ‘nosuchuser’. (file-name-absolute-p "~rms/foo") ⇒ t (file-name-absolute-p "~nosuchuser/foo") ⇒ nil (file-name-absolute-p "rms/foo") ⇒ nil (file-name-absolute-p "/user/rms/foo") ⇒ t *Note (elisp)Absolute and Relative File Names::. 2.5.2 Prefixed Definitions -------------------------- These functions are prefixed with ‘compat’ prefix, and are only loaded when ‘compat-28’ is required: -- Function: compat-unlock-buffer This function unlocks the file being visited in the current buffer, if the buffer is modified. If the buffer is not modified, then the file should not be locked, so this function does nothing. It also does nothing if the current buffer is not visiting a file, or is not locked. This function handles file system errors by calling ‘display-warning’ and otherwise ignores the error. *Note (elisp)File Locks::. This compatibility versions catches the ‘file-error’ condition, issuing a warning instead of propagating on the error. -- Function: compat-string-width string &optional from to This function returns the width in columns of the string STRING, if it were displayed in the current buffer and the selected window. Optional arguments FROM and TO specify the substring of STRING to consider, and are interpreted as in ‘substring’ (*note (elisp)Creating Strings::). The return value is an approximation: it only considers the values returned by ‘char-width’ for the constituent characters, always takes a tab character as taking ‘tab-width’ columns, ignores display properties and fonts, etc. *Note (elisp)Size of Displayed Text::. This compatibility version handles the optional arguments FROM and TO. -- Function: compat-json-serialize *Note Emacs 27.1::. This compatibility version handles primitive, top-level JSON values (numbers, strings, booleans). -- Function: compat-json-insert *Note Emacs 27.1::. This compatibility version handles primitive, top-level JSON values (numbers, strings, booleans). -- Function: compat-json-parse-string *Note Emacs 27.1::. This compatibility version handles primitive, top-level JSON values (numbers, strings, booleans). -- Function: compat-json-parse-buffer *Note Emacs 27.1::. This compatibility version handles primitive, top-level JSON values (numbers, strings, booleans). -- Function: compat-count-windows Return the number of live windows on the selected frame. The optional argument MINIBUF specifies whether the minibuffer window is included in the count. If ALL-FRAMES is non-‘nil’, count the windows in all frames instead just the selected frame. This compatibility version handles the optional argument ALL-FRAMES. 2.5.3 Missing Definitions ------------------------- Compat does not provide support for the following Lisp features implemented in 28.1: • Support for ‘interactive’ or ‘declare’ to list applicable modes. • Support for ‘:interactive’ argument to ‘define-minor-mode’ and ‘define-derived-mode’. • Support for ‘:predicate’ argument to ‘define-globalized-minor-mode’. • "Success handler" for ‘condition-case’. • The function ‘benchmark-call’. • Support for the ‘natnum’ defcustom type. • The function ‘macroexp-compiling-p’. • The function ‘macroexp-warn-and-return’. • Additional Edebug keywords. • Shorthand support. • The function ‘custom-add-choice’. • The function ‘decoded-time-period’. • The function ‘dom-print’. • The function ‘dom-remove-attribute’. • The function ‘dns-query-asynchronous’. • The function ‘get-locale-names’. • The function ‘json-avaliable-p’. • The function ‘mail-header-parse-addresses-lax’. • The function ‘mail-header-parse-address-lax’. • The function ‘make-separator-line’. • The function ‘num-processors’. • The function ‘object-intervals’. • The function ‘process-lines-ignore-status’. • The function ‘require-theme’. • The function ‘syntax-class-to-char’. • The function ‘path-separator’.  File: compat.info, Node: Development, Next: Function Index, Prev: Support, Up: Top 3 Development ************* Compat is developed on SourceHut (https://sr.ht/~pkal/compat). A restricted GitHub mirror (https://github.com/phikal/compat.el) is also maintained. Patches and comments can be sent to the development mailing list (https://lists.sr.ht/~pkal/compat-devel) (~pkal/compat-devel@lists.sr.ht <~pkal/compat-devel@lists.sr.ht>). Bug reports are best sent to the issue tracker (https://todo.sr.ht/~pkal/compat) (~pkal/compat@todo.sr.ht <~pkal/compat@todo.sr.ht>). The GitHub mirror can also be used to submit patches. These may include issues in the compatibility code, missing definitions or performance issues. Please note that as a GNU ELPA package, Compat requires contributors to have signed the FSF copyright assignment (https://www.gnu.org/software/emacs/manual/html_node/emacs/Copyright-Assignment.html), before any non-trivial contribution (roughly 15 lines of code) can be applied.  File: compat.info, Node: Function Index, Next: Variable Index, Prev: Development, Up: Top Appendix A Function Index ************************* [index] * Menu: * alist-get: Emacs 25.1. (line 50) * always: Emacs 28.1. (line 61) * and-let*: Emacs 26.1. (line 99) * bool-vector: Emacs 25.1. (line 166) * bool-vector-count-consecutive: Emacs 24.4. (line 118) * bool-vector-count-population: Emacs 24.4. (line 125) * bool-vector-exclusive-or: Emacs 24.4. (line 76) * bool-vector-intersection: Emacs 24.4. (line 90) * bool-vector-not: Emacs 24.4. (line 104) * bool-vector-set-difference: Emacs 24.4. (line 97) * bool-vector-subsetp: Emacs 24.4. (line 111) * bool-vector-union: Emacs 24.4. (line 83) * buffer-local-boundp: Emacs 28.1. (line 99) * button-buttonize: Emacs 28.1. (line 285) * color-values-from-color-spec: Emacs 28.1. (line 297) * compat-<: Emacs 24.4. (line 175) * compat-<=: Emacs 24.4. (line 185) * compat-=: Emacs 24.4. (line 170) * compat->: Emacs 24.4. (line 180) * compat->=: Emacs 24.4. (line 190) * compat-alist-get: Emacs 26.1. (line 284) * compat-assoc: Emacs 26.1. (line 256) * compat-assoc-delete-all: Emacs 27.1. (line 305) * compat-count-windows: Emacs 28.1. (line 422) * compat-dired-get-marked-files: Emacs 27.1. (line 333) * compat-executable-find: Emacs 27.1. (line 317) * compat-file-size-human-readable: Emacs 27.1. (line 285) * compat-json-insert: Emacs 28.1. (line 404) * compat-json-parse-buffer: Emacs 28.1. (line 416) * compat-json-parse-string: Emacs 28.1. (line 410) * compat-json-serialize: Emacs 28.1. (line 398) * compat-line-number-at-pos: Emacs 26.1. (line 270) * compat-lookup-key: Emacs 27.1. (line 245) * compat-recenter: Emacs 27.1. (line 235) * compat-regexp-opt: Emacs 27.1. (line 273) * compat-sort: Emacs 25.1. (line 178) * compat-split-string: Emacs 24.4. (line 199) * compat-string-trim: Emacs 26.1. (line 314) * compat-string-trim-left: Emacs 26.1. (line 298) * compat-string-trim-right: Emacs 26.1. (line 306) * compat-string-width: Emacs 28.1. (line 381) * compat-unlock-buffer: Emacs 28.1. (line 368) * completion-table-with-cache: Emacs 24.4. (line 130) * cXXXr: Emacs 26.1. (line 47) * cXXXXr: Emacs 26.1. (line 48) * date-days-in-month: Emacs 27.1. (line 193) * decoded-time-day: Emacs 27.1. (line 166) * decoded-time-dst: Emacs 27.1. (line 178) * decoded-time-hour: Emacs 27.1. (line 163) * decoded-time-minute: Emacs 27.1. (line 160) * decoded-time-month: Emacs 27.1. (line 169) * decoded-time-period: Emacs 28.1. (line 332) * decoded-time-second: Emacs 27.1. (line 157) * decoded-time-weekday: Emacs 27.1. (line 175) * decoded-time-year: Emacs 27.1. (line 172) * decoded-time-zone: Emacs 27.1. (line 182) * define-error: Emacs 24.4. (line 65) * delete-consecutive-dups: Emacs 24.4. (line 60) * derived-mode-p: Emacs 27.1. (line 223) * directory-empty-p: Emacs 28.1. (line 218) * directory-files-recursively: Emacs 25.1. (line 139) * directory-name-p: Emacs 25.1. (line 24) * dlet: Emacs 28.1. (line 117) * dolist-with-progress-reporter: Emacs 27.1. (line 116) * ensure-list: Emacs 28.1. (line 132) * face-spec-set: Emacs 24.4. (line 139) * file-attribute-access-time: Emacs 26.1. (line 201) * file-attribute-collect: Emacs 26.1. (line 238) * file-attribute-device-number: Emacs 26.1. (line 233) * file-attribute-group-id: Emacs 26.1. (line 196) * file-attribute-inode-number: Emacs 26.1. (line 228) * file-attribute-link-number: Emacs 26.1. (line 186) * file-attribute-modes: Emacs 26.1. (line 223) * file-attribute-modification-time: Emacs 26.1. (line 206) * file-attribute-size: Emacs 26.1. (line 218) * file-attribute-status-change-time: Emacs 26.1. (line 212) * file-attribute-type: Emacs 26.1. (line 181) * file-attribute-user-id: Emacs 26.1. (line 191) * file-backup-file-names: Emacs 28.1. (line 316) * file-local-name: Emacs 26.1. (line 108) * file-modes-number-to-symbolic: Emacs 28.1. (line 310) * file-name-absolute-p: Emacs 28.1. (line 344) * file-name-concat: Emacs 28.1. (line 31) * file-name-quote: Emacs 26.1. (line 133) * file-name-quoted-p: Emacs 26.1. (line 126) * file-name-with-extension: Emacs 28.1. (line 200) * flatten-tree: Emacs 27.1. (line 129) * format-message: Emacs 25.1. (line 12) * format-prompt: Emacs 28.1. (line 229) * func-arity: Emacs 26.1. (line 12) * garbage-collect-maybe: Emacs 28.1. (line 46) * gensym: Emacs 26.1. (line 51) * if-let: Emacs 25.1. (line 67) * if-let*: Emacs 26.1. (line 90) * ignore-errors: Emacs 27.1. (line 103) * image-property: Emacs 26.1. (line 175) * insert-into-buffer: Emacs 28.1. (line 66) * json-insert: Emacs 27.1. (line 57) * json-parse-buffer: Emacs 27.1. (line 94) * json-parse-string: Emacs 27.1. (line 64) * json-serialize: Emacs 27.1. (line 42) * length<: Emacs 28.1. (line 23) * length=: Emacs 28.1. (line 20) * length>: Emacs 28.1. (line 28) * macroexp-file-name: Emacs 28.1. (line 267) * macroexpand-1: Emacs 25.1. (line 132) * macrop: Emacs 24.4. (line 47) * make-directory-autoloads: Emacs 28.1. (line 293) * make-lock-file-name: Emacs 28.1. (line 324) * make-nearby-temp-file: Emacs 26.1. (line 61) * mapcan: Emacs 26.1. (line 34) * named-let: Emacs 28.1. (line 182) * null-device: Emacs 28.1. (line 328) * package-get-version: Emacs 27.1. (line 185) * proper-list-p: Emacs 27.1. (line 12) * provided-mode-derived-p: Emacs 27.1. (line 219) * read-multiple-choice: Emacs 26.1. (line 151) * replace-regexp-in-string: Emacs 28.1. (line 91) * replace-string-in-region: Emacs 28.1. (line 76) * setq-local: Emacs 27.1. (line 258) * special-form-p: Emacs 24.4. (line 41) * string-chop-newline: Emacs 28.1. (line 177) * string-clean-whitespace: Emacs 28.1. (line 145) * string-distance: Emacs 27.1. (line 22) * string-fill: Emacs 28.1. (line 152) * string-greaterp: Emacs 25.1. (line 32) * string-lines: Emacs 28.1. (line 160) * string-pad: Emacs 28.1. (line 168) * string-replace: Emacs 28.1. (line 55) * string-search: Emacs 28.1. (line 12) * string-suffix-p: Emacs 24.4. (line 53) * subr-primitive-p: Emacs 28.1. (line 337) * temporary-file-directory: Emacs 26.1. (line 78) * thing-at-mouse: Emacs 28.1. (line 260) * thread-first: Emacs 25.1. (line 90) * thread-last: Emacs 25.1. (line 111) * time-equal-p: Emacs 27.1. (line 188) * when-let: Emacs 25.1. (line 85) * when-let*: Emacs 26.1. (line 94) * with-environment-variables: Emacs 28.1. (line 271) * with-eval-after-load: Emacs 24.4. (line 12) * with-existing-directory: Emacs 28.1. (line 106) * with-file-modes: Emacs 25.1. (line 39) * xor: Emacs 27.1. (line 139)  File: compat.info, Node: Variable Index, Prev: Function Index, Up: Top Appendix B Variable Index ************************* [index] * Menu: * exec-path: Emacs 27.1. (line 200) * gensym-counter: Emacs 26.1. (line 58) * mounted-file-systems: Emacs 26.1. (line 74) * regexp-unmatchable: Emacs 27.1. (line 149)  Tag Table: Node: Top821 Node: Introduction2274 Node: Overview2433 Node: Usage3656 Node: Additional libraries4663 Node: Intentions5118 Node: Support6728 Node: Emacs 24.47310 Node: Emacs 25.117364 Node: Emacs 26.126321 Node: Emacs 27.140419 Node: Emacs 28.155775 Node: Development75469 Node: Function Index76484 Node: Variable Index87168  End Tag Table  Local Variables: coding: utf-8 End: