Mercurial > emacs
view lisp/emacs-lisp/eval-reg.el @ 10219:d97313bb6f39
(bibtex-string, bibtex-preamble): Use forward-line.
(sort-subr): Don't call autload for this--that's done in loaddefs.el.
(bibtex-mode): Add autoload cookie.
Changed keybinding for bibtex-print-help-message
(from \C-ch to \C-c?). Therefore, describe-mode is not longer on
\C-c?. Also, changed prefix \C-cn for bibtex-narrow functions to
\C-c\C-r.
(bibtex-string-files): Changed documentation.
(bibtex-mode-map): Inscriptions of menu bar changed from "Entry
Types" to "Entry-Types" and "Bibtex Edit" to "BibTeX-Edit".
(bibtex-string-files): Changed documentation.
(bibtex-mode): If environment variable BIBINPUTS isn't defined,
string files are searched in the current directory.
(bibtex-completion-candidates): Now buffer-local to allow
evaluation of different bibtex-string-files in different buffers.
(bibtex-autokey-edit-before-use, bibtex-clean-entry): New variable
that determines, if the user is allowed to edit auto-generated
reference keys before they are used.
(bibtex-generate-autokey, bibtex-clean-entry): New function to
generate an autokey if necessary.
(bibtex-autokey-names, bibtex-autokey-name-change-strings,
bibtex-autokey-name-length, bibtex-autokey-name-separator,
bibtex-autokey-year-length, bibtex-autokey-titlewords,
bibtex-autokey-title-terminators,
bibtex-autokey-titlewords-stretch,
bibtex-autokey-titleword-first-ignore,
bibtex-autokey-titleword-abbrevs,
bibtex-autokey-titleword-change-strings,
bibtex-autokey-titleword-length,
bibtex-autokey-titleword-separator,
bibtex-autokey-name-year-separator,
bibtex-autokey-year-title-separator): New variables related to
bibtex-generate-autokey.
(bibtex-find-entry-location): Optional second parameter maybedup
to tell it that entering a duplicate entry isn't to report by an
error but by the return value of the function (necessary for
bibtex-clean-entry to find the correct position of an entry with
an autogenerated key without disturbing the user with unwanted
messages).
(bibtex-help-message): New variable to avoid printing of help
messages in the echo area.
(assoc-of-regexp): New function to match an alist of regexps.
(bibtex-string-files, bibtex-completion-candidates, bibtex-mode):
New variables to allow bibtex-complete-string to work on strings
initialized from a variable and from @String definitions in a list
of files, too.
(bibtex-predefined-strings, bibtex-entry-field-alist): Changed to
user options.
(bibtex-mode): Changed doc string.
(many functions and variables): Changed documentation strings of
variables and functions to hold a complete sentence in the first
line.
(bibtex-print-help-message): Now line dependent and reports if it
is called outside a BibTeX field.
(validate-bibtex-buffer): Completely rewritten to validate, if
buffer is syntactically correct.
(find-bibtex-duplicates): Moved into validate-bibtex-buffer.
(ispell-abstract, bibtex-ispell-abstract, ispell-bibtex-entry,
bibtex-ispell-entry, beginning-of-bibtex-entry,
bibtex-beginning-of-entry, end-of-bibtex-entry,
bibtex-end-of-entry, hide-bibtex-entry-bodies,
bibtex-hide-entry-bodies, narrow-to-bibtex-entry,
bibtex-narrow-to-entry, sort-bibtex-entries, bibtex-sort-entries,
validate-bibtex-buffer, bibtex-validate-buffer,
find-bibtex-entry-location, bibtex-find-entry-location): All
interactive functions are renamed, so that any interface function
begins with "bibtex-". Mapping:
ispell-abstract --> bibtex-ispell-abstract
ispell-bibtex-entry --> bibtex-ispell-entry
beginning-of-bibtex-entry --> bibtex-beginning-of-entry
end-of-bibtex-entry --> bibtex-end-of-entry
hide-bibtex-entry-bodies --> bibtex-hide-entry-bodies
narrow-to-bibtex-entry --> bibtex-narrow-to-entry
sort-bibtex-entries --> bibtex-sort-entries
validate-bibtex-buffer --> bibtex-validate-buffer
find-bibtex-entry-location --> bibtex-find-entry-location
(bibtex-maintain-sorted-entries,
bibtex-sort-ignore-string-entries): Default is now t.
(bibtex-complete-string): String list is built from additional
string list bibtex-predefined-string and current strings in file.
(string-equalp): Deleted and substituted by string-equal.
(assoc-string-equalp): Renamed to assoc-ignore-case.
(bibtex-entry): Reference key can be entered with completion. All
reference keys that are defined in buffer and all labels that
appear in crossreference entries are object to completion.
(Entry types): Changed order of entries in menu "entry types".
(bibtex-entry-field-alist): Changed order of entries slightly to
be more conform with standard BibTeX style layouts.
(bibtex-mode-map): Uniform keybindings for \C-c\C-e prefix (often
used types on control keys, sometimes used types on normal keys,
rarely used types on shift keys, almost never used types on meta
keys).
(bibtex-mode-map): Function narrow-to-bibtex-entry and counterpart
widen and function hide-bibtex-entry-bodies and counterpart
show-all bounded to appropriate local keys.
(bibtex-abbrev-table): Deleted
(bibtex-current-entry-label, put-string-on-kill-ring): Deleted
(AUCTeX provides all the functionality needed for citation
completion).
(bibtex-enclosing-reference, bibtex-pop-previous, bibtex-pop-next,
bibtex-clean-entry): Hacked for speed (bibtex-pop-previous and
bibtex-pop-next were to slow for larger BibTeX files).
(bibtex-pop-previous, bibtex-pop-next): Delimiters from previous
or next entry are changed to actual delimters if necessary.
(bibtex-entry): Fixed bug (False entry wasn't reported in error
message if bibtex-entry was called with undefined reference name).
(bibtex-entry-field-alist, bibtex-entry, bibtex-make-field,
bibtex-next-field, bibtex-clean-entry): Every reference entry now
contains a comment in addition to the name of the reference. This
comment appears in the echo area if you start editing that field
(after calling bibtex-next-field).
(bibtex-include-OPTcrossref, bibtex-entry): Changed
bibtex-include-OPTcrossref from single boolean variable to hold a
list of reference names which should have a crossref field.
(bibtex-complete-word): New function, which completes word
fragment before point to the longest prefix of predefined strings
in the buffer in the same way that ispell-complete-word operates
for words found in the dictionary.
(bibtex-reference-head): Start of bibtex-reference-head changed
from "^[ \t]*\\(" to "^\\( \\|\t\\)*\\(" (bibtex-pop-previous and
bibtex-pop-next didn't work, probably due to a bug in
re-search-forward).
(several functions): Added support for {} as field delimiters
(better than '"' for accented characters.
(bibtex-clean-entry): If optional field crossref is empty or
missing, former optional fields (if bibtex-include-OPTcrossref was
t) are necessary again. bibtex-clean-entry complains if they are
empty but not if they are missing, so you can intenionally omit
them, e. g. for a pseudo @Journal entry (needed for
crossreferences) made out of an @article with missing non-optional
fields.
Menu bar entries aren't centered anymore.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 23 Dec 1994 04:18:29 +0000 |
parents | 13fc66bc7472 |
children | 97da4cb32d03 |
line wrap: on
line source
;;; eval-reg.el --- Redefine eval-region, and subrs that use it, in Lisp ;; Copyright (C) 1994 Daniel LaLiberte ;; Author: Daniel LaLiberte <liberte@cs.uiuc.edu> ;; Keywords: lisp ;; This file is part of GNU Emacs. ;; GNU Emacs 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 2, or (at your option) ;; any later version. ;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;;; Commentary: ;;; eval-region, eval-buffer, and eval-current-buffer are redefined in ;;; Lisp to allow customizations by Lisp code. eval-region calls ;;; `read', `eval', and `prin1', so Lisp replacements of these ;;; functions will affect eval-region and anything else that calls it. ;;; eval-buffer and eval-current-buffer are redefined in Lisp to call ;;; eval-region on the buffer. ;;; Because of dynamic binding, all local variables are protected from ;;; being seen by eval by giving them funky names. But variables in ;;; routines that call eval-region are similarly exposed. ;;; Perhaps this should be one of several files in an `elisp' package ;;; that replaces Emacs Lisp subroutines with Lisp versions of the ;;; same. ;;; Eval-region may be installed, after loading, by calling: ;;; (elisp-eval-region-install). Installation can be undone with: ;;; (elisp-eval-region-uninstall). '(defpackage "elisp-eval-region" (:nicknames "elisp") (:use "elisp") (:export elisp-eval-region-install elisp-eval-region-uninstall elisp-eval-region-level with-elisp-eval-region eval-region eval-buffer eval-current-buffer )) '(in-package elisp-eval-region) ;; Save standard versions. (if (not (fboundp 'original-eval-region)) (defalias 'original-eval-region (symbol-function 'eval-region))) (if (not (fboundp 'original-eval-buffer)) (defalias 'original-eval-buffer (if (fboundp 'eval-buffer) ;; only in Emacs 19 (symbol-function 'eval-buffer) 'undefined))) (if (not (fboundp 'original-eval-current-buffer)) (defalias 'original-eval-current-buffer (symbol-function 'eval-current-buffer))) (defvar elisp-eval-region-level 0 "If the value is 0, use the original version of `elisp-eval-region'. Callers of `elisp-eval-region' should increment `elisp-eval-region-level' while the Lisp version should be used. Installing `elisp-eval-region' increments it once, and uninstalling decrements it.") ;; Installing and uninstalling should always be used in pairs, ;; or just install once and never uninstall. (defun elisp-eval-region-install () (interactive) (defalias 'eval-region 'elisp-eval-region) (defalias 'eval-buffer 'elisp-eval-buffer) (defalias 'eval-current-buffer 'elisp-eval-current-buffer) (setq elisp-eval-region-level (1+ elisp-eval-region-level))) (defun elisp-eval-region-uninstall () (interactive) (if (> 1 elisp-eval-region-level) (setq elisp-eval-region-level (1- elisp-eval-region-level)) (setq elisp-eval-region-level 0) (defalias 'eval-region (symbol-function 'original-eval-region)) (defalias 'eval-buffer (symbol-function 'original-eval-buffer)) (defalias 'eval-current-buffer (symbol-function 'original-eval-current-buffer)) )) (put 'with-elisp-eval-region 'lisp-indent-function 1) (put 'with-elisp-eval-region 'lisp-indent-hook 1) (put 'with-elisp-eval-region 'edebug-form-spec t) (defmacro with-elisp-eval-region (flag &rest body) "If FLAG is nil, decrement `eval-region-level' while executing BODY. The effect of decrementing all the way to zero is that `eval-region' will use the original `eval-region', which may be the Emacs subr or some previous redefinition. Before calling this macro, this package should already have been installed, using `elisp-eval-region-install', which increments the count once. So if another package still requires the Lisp version of the code, the count will still be non-zero. The count is not bound locally by this macro, so changes by BODY to its value will not be lost." (` (let ((elisp-code (function (lambda () (,@ body))))) (if (not (, flag)) (unwind-protect (progn (setq elisp-eval-region-level (1- elisp-eval-region-level)) (funcall elisp-code)) (setq elisp-eval-region-level (1+ elisp-eval-region-level))) (funcall elisp-code))))) (defun elisp-eval-region (elisp-start elisp-end &optional elisp-output) "Execute the region as Lisp code. When called from programs, expects two arguments, giving starting and ending indices in the current buffer of the text to be executed. Programs can pass third argument PRINTFLAG which controls printing of output: nil means discard it; anything else is stream for print. This version, from `eval-reg.el', allows Lisp customization of read, eval, and the printer." ;; Because this doesnt narrow to the region, one other difference ;; concerns inserting whitespace after the expression being evaluated. (interactive "r") (if (= 0 elisp-eval-region-level) (original-eval-region elisp-start elisp-end elisp-output) (let ((elisp-pnt (point)) (elisp-buf (current-buffer));; Outside buffer (elisp-inside-buf (current-buffer));; Buffer current while evaling ;; Mark the end because it may move. (elisp-end-marker (set-marker (make-marker) elisp-end)) elisp-form elisp-val) (goto-char elisp-start) (elisp-skip-whitespace) (while (< (point) elisp-end-marker) (setq elisp-form (read elisp-buf)) (let ((elisp-current-buffer (current-buffer))) ;; Restore the inside current-buffer. (set-buffer elisp-inside-buf) (setq elisp-val (eval elisp-form)) ;; Remember current buffer for next time. (setq elisp-inside-buf (current-buffer)) ;; Should this be protected? (set-buffer elisp-current-buffer)) (if elisp-output (let ((standard-output (or elisp-output t))) (setq values (cons elisp-val values)) (if (eq standard-output t) (prin1 elisp-val) (princ "\n") (prin1 elisp-val) (princ "\n") ))) (goto-char (min (max elisp-end-marker (point)) (progn (elisp-skip-whitespace) (point)))) ) ; while (if elisp-output nil ;; like save-excursion recovery, but done only if no error occurs ;; but mark is not restored (set-buffer elisp-buf) (goto-char elisp-pnt)) nil))) (defun elisp-skip-whitespace () ;; Leave point before the next token, skipping white space and comments. (skip-chars-forward " \t\r\n\f") (while (= (following-char) ?\;) (skip-chars-forward "^\n\r") ; skip the comment (skip-chars-forward " \t\r\n\f"))) (defun elisp-eval-current-buffer (&optional elisp-output) "Execute the current buffer as Lisp code. Programs can pass argument PRINTFLAG which controls printing of output: nil means discard it; anything else is stream for print. This version calls `eval-region' on the whole buffer." ;; The standard eval-current-buffer doesn't use eval-region. (interactive) (eval-region (point-min) (point-max) elisp-output)) (defun elisp-eval-buffer (&optional elisp-bufname elisp-printflag) "Execute BUFFER as Lisp code. Use current buffer if BUFFER is nil. Programs can pass argument PRINTFLAG which controls printing of output: nil means discard it; anything else is stream for print. This version calls `eval-region' on the whole buffer." (interactive) (if (null elisp-bufname) (setq elisp-bufname (current-buffer))) (save-excursion (set-buffer (or (get-buffer elisp-bufname) (error "No such buffer: %s" elisp-bufname))) (eval-region (point-min) (point-max) elisp-printflag))) (provide 'eval-reg)