X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=lisp%2Fsubr.el;h=54cf7f15282559bf19b0bd97754596e9a6561281;hp=fd65346a58e6ece24aba0c17369c2734450e407d;hb=dbf2768f7b146e97e37a27316f70bb313f1acf15;hpb=59eec5f21669e81977b5b1fe9bf717cab49cf7fb diff --git a/lisp/subr.el b/lisp/subr.el index fd65346..54cf7f1 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -301,16 +301,24 @@ See also `add-hook', `add-local-hook', and `add-local-one-shot-hook'." (make-local-hook hook) (add-one-shot-hook hook function append t)) -(defun add-to-list (list-var element) +(defun add-to-list (list-var element &optional append) "Add to the value of LIST-VAR the element ELEMENT if it isn't there yet. The test for presence of ELEMENT is done with `equal'. +If ELEMENT is added, it is added at the beginning of the list, +unless the optional argument APPEND is non-nil, in which case +ELEMENT is added at the end. + If you want to use `add-to-list' on a variable that is not defined until a certain package is loaded, you should put the call to `add-to-list' into a hook function that will be run only after loading the package. `eval-after-load' provides one way to do this. In some cases other hooks, such as major mode hooks, can do the job." - (or (member element (symbol-value list-var)) - (set list-var (cons element (symbol-value list-var))))) + (if (member element (symbol-value list-var)) + (symbol-value list-var) + (set list-var + (if append + (append (symbol-value list-var) (list element)) + (cons element (symbol-value list-var)))))) ;; XEmacs additions ;; called by Fkill_buffer() @@ -359,7 +367,7 @@ function allows you to set the local value. NOTE: At some point, this will be moved into C and will be very fast." (with-current-buffer buffer (set sym val))) - + ;;;; String functions. ;; XEmacs @@ -380,12 +388,14 @@ Otherwise treat `\\' in NEWTEXT as special: (check-argument-type 'stringp str) (check-argument-type 'stringp newtext) (if (> (length str) 50) - (with-temp-buffer - (insert str) - (goto-char 1) + (let ((cfs case-fold-search)) + (with-temp-buffer + (setq case-fold-search cfs) + (insert str) + (goto-char 1) (while (re-search-forward regexp nil t) (replace-match newtext t literal)) - (buffer-string)) + (buffer-string))) (let ((start 0) newstr) (while (string-match regexp str start) (setq newstr (replace-match newtext t literal str) @@ -446,13 +456,13 @@ See also `with-temp-buffer'." (set-buffer ,buffer) ,@body)) -(defmacro with-temp-file (file &rest forms) - "Create a new buffer, evaluate FORMS there, and write the buffer to FILE. +(defmacro with-temp-file (filename &rest forms) + "Create a new buffer, evaluate FORMS there, and write the buffer to FILENAME. The value of the last form in FORMS is returned, like `progn'. See also `with-temp-buffer'." (let ((temp-file (make-symbol "temp-file")) (temp-buffer (make-symbol "temp-buffer"))) - `(let ((,temp-file ,file) + `(let ((,temp-file ,filename) (,temp-buffer (get-buffer-create (generate-new-buffer-name " *temp file*")))) (unwind-protect @@ -571,20 +581,20 @@ The original alist is not modified. See also `destructive-alist-to-plist'." ;; getf, remf in cl*.el. -(defmacro putf (plist prop val) - "Add property PROP to plist PLIST with value VAL. -Analogous to (setq PLIST (plist-put PLIST PROP VAL))." - `(setq ,plist (plist-put ,plist ,prop ,val))) +(defmacro putf (plist property value) + "Add property PROPERTY to plist PLIST with value VALUE. +Analogous to (setq PLIST (plist-put PLIST PROPERTY VALUE))." + `(setq ,plist (plist-put ,plist ,property ,value))) -(defmacro laxputf (lax-plist prop val) - "Add property PROP to lax plist LAX-PLIST with value VAL. -Analogous to (setq LAX-PLIST (lax-plist-put LAX-PLIST PROP VAL))." - `(setq ,lax-plist (lax-plist-put ,lax-plist ,prop ,val))) +(defmacro laxputf (lax-plist property value) + "Add property PROPERTY to lax plist LAX-PLIST with value VALUE. +Analogous to (setq LAX-PLIST (lax-plist-put LAX-PLIST PROPERTY VALUE))." + `(setq ,lax-plist (lax-plist-put ,lax-plist ,property ,value))) -(defmacro laxremf (lax-plist prop) - "Remove property PROP from lax plist LAX-PLIST. -Analogous to (setq LAX-PLIST (lax-plist-remprop LAX-PLIST PROP))." - `(setq ,lax-plist (lax-plist-remprop ,lax-plist ,prop))) +(defmacro laxremf (lax-plist property) + "Remove property PROPERTY from lax plist LAX-PLIST. +Analogous to (setq LAX-PLIST (lax-plist-remprop LAX-PLIST PROPERTY))." + `(setq ,lax-plist (lax-plist-remprop ,lax-plist ,property))) ;;; Error functions @@ -633,6 +643,9 @@ error malformed-property-list circular-list circular-property-list + invalid-regexp + specifier-syntax-error + invalid-argument wrong-type-argument @@ -640,28 +653,47 @@ error wrong-number-of-arguments invalid-function no-catch + undefined-keystroke-sequence + specifier-argument-error invalid-state void-function cyclic-function-indirection void-variable cyclic-variable-indirection + protected-field + invalid-byte-code invalid-operation invalid-change setting-constant + specifier-change-error editing-error beginning-of-buffer end-of-buffer buffer-read-only io-error + file-error + file-already-exists + file-locked + file-supersession end-of-file + coding-system-error + image-conversion-error + tooltalk-error arith-error range-error domain-error singularity-error overflow-error underflow-error + dialog-box-error + search-failed + selection-conversion-error + + unimplemented + + internal-error The five most common errors you will probably use or base your new errors off of are `syntax-error', `invalid-argument', `invalid-state', @@ -746,9 +778,9 @@ yourself.]" ;;;; Miscellanea. ;; This is now in C. -;(defun buffer-substring-no-properties (beg end) -; "Return the text from BEG to END, without text properties, as a string." -; (let ((string (buffer-substring beg end))) +;(defun buffer-substring-no-properties (start end) +; "Return the text from START to END, without text properties, as a string." +; (let ((string (buffer-substring start end))) ; (set-text-properties 0 (length string) nil string) ; string))