X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=poe-18.el;h=d765d8325f6e4625b5cda07689fecfe9426647b7;hb=fcd8e41edad4c4bc4df9c8ed25e83ed8eeb46e40;hp=d722ed2e660c50bf987598e8b748e2e1a3806431;hpb=42e5612b0e66dac01e8a4b7e3afea1aac830cf06;p=elisp%2Fapel.git diff --git a/poe-18.el b/poe-18.el index d722ed2..d765d83 100644 --- a/poe-18.el +++ b/poe-18.el @@ -1,8 +1,11 @@ ;;; poe-18.el --- poe API implementation for Emacs 18.* ;; Copyright (C) 1995,1996,1997,1998,1999 Free Software Foundation, Inc. +;; Copyright (C) 1999 Yuuichi Teranishi ;; Author: MORIOKA Tomohiko +;; Shuhei KOBAYASHI +;; Yuuichi Teranishi ;; Keywords: emulation, compatibility ;; This file is part of APEL (A Portable Emacs Library). @@ -18,174 +21,547 @@ ;; 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 +;; along with this program; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. +;;; Commentary: + +;; Note to APEL developers and APEL programmers: +;; +;; If old (v18) compiler is used, top-level macros are expanded at +;; *load-time*, not compile-time. Therefore, +;; +;; (1) Definitions with `*-maybe' won't be compiled. +;; +;; (2) you cannot use macros defined with `defmacro-maybe' within function +;; definitions in the same file. +;; (`defmacro-maybe' is evaluated at load-time, therefore byte-compiler +;; treats such use of macros as (unknown) functions and compiles them +;; into function calls, which will cause errors at run-time.) +;; +;; (3) `eval-when-compile' and `eval-and-compile' are evaluated at +;; load-time if used at top-level. + ;;; Code: -(defvar-maybe data-directory exec-directory) +(require 'pym) -;;; @ for EMACS 18.55 +;;; @ Compilation. ;;; -(defvar-maybe buffer-undo-list nil) +(defun defalias (sym newdef) + "Set SYMBOL's function definition to NEWVAL, and return NEWVAL. +Associates the function with the current load file, if any." + (fset sym newdef)) + +(defun byte-code-function-p (object) + "Return t if OBJECT is a byte-compiled function object." + (and (consp object) (consp (cdr object)) + (let ((rest (cdr (cdr object))) + elt) + (if (stringp (car rest)) + (setq rest (cdr rest))) + (catch 'tag + (while rest + (setq elt (car rest)) + (if (and (consp elt) + (eq (car elt) 'byte-code)) + (throw 'tag t)) + (setq rest (cdr rest))))))) + +;; (symbol-plist 'cyclic-function-indirection) +(put 'cyclic-function-indirection + 'error-conditions + '(cyclic-function-indirection error)) +(put 'cyclic-function-indirection + 'error-message + "Symbol's chain of function indirections contains a loop") + +;; The following function definition is a direct translation of its +;; C definition in emacs-20.4/src/data.c. +(defun indirect-function (object) + "Return the function at the end of OBJECT's function chain. +If OBJECT is a symbol, follow all function indirections and return the final +function binding. +If OBJECT is not a symbol, just return it. +Signal a void-function error if the final symbol is unbound. +Signal a cyclic-function-indirection error if there is a loop in the +function chain of symbols." + (let* ((hare object) + (tortoise hare)) + (catch 'found + (while t + (or (symbolp hare) (throw 'found hare)) + (or (fboundp hare) (signal 'void-function (cons object nil))) + (setq hare (symbol-function hare)) + (or (symbolp hare) (throw 'found hare)) + (or (fboundp hare) (signal 'void-function (cons object nil))) + (setq hare (symbol-function hare)) + + (setq tortoise (symbol-function tortoise)) + + (if (eq hare tortoise) + (signal 'cyclic-function-indirection (cons object nil))))) + hare)) + +;;; Emulate all functions and macros of emacs-20.3/lisp/byte-run.el. +;;; (note: jwz's original compiler and XEmacs compiler have some more +;;; macros; they are "nuked" by rms in FSF version.) + +;; Use `*-maybe' here because new byte-compiler may be installed. +(put 'inline 'lisp-indent-hook 0) +(defmacro-maybe inline (&rest body) + "Eval BODY forms sequentially and return value of last one. + +This emulating macro does not support function inlining because old \(v18\) +compiler does not support inlining feature." + (cons 'progn body)) +(put 'defsubst 'lisp-indent-hook 'defun) +(put 'defsubst 'edebug-form-spec 'defun) +(defmacro-maybe defsubst (name arglist &rest body) + "Define an inline function. The syntax is just like that of `defun'. -;;; @ Lisp Language -;;; +This emulating macro does not support function inlining because old \(v18\) +compiler does not support inlining feature." + (cons 'defun (cons name (cons arglist body)))) -;;; @@ list -;;; +(defun-maybe make-obsolete (fn new) + "Make the byte-compiler warn that FUNCTION is obsolete. +The warning will say that NEW should be used instead. +If NEW is a string, that is the `use instead' message. -(defun delete (elt list) - "Delete by side effect any occurrences of ELT as a member of LIST. -The modified LIST is returned. Comparison is done with `equal'. -If the first member of LIST is ELT, deleting it is not a side effect; -it is simply using a different list. -Therefore, write `(setq foo (delete element foo))' -to be sure of changing the value of `foo'. -\[poe-18.el; EMACS 19 emulating function]" - (if (equal elt (car list)) - (cdr list) - (let ((rest list) - (rrest (cdr list)) - ) - (while (and rrest (not (equal elt (car rrest)))) - (setq rest rrest - rrest (cdr rrest)) - ) - (rplacd rest (cdr rrest)) - list))) +This emulating function does nothing because old \(v18\) compiler does not +support this feature." + (interactive "aMake function obsolete: \nxObsoletion replacement: ") + fn) + +(defun-maybe make-obsolete-variable (var new) + "Make the byte-compiler warn that VARIABLE is obsolete, +and NEW should be used instead. If NEW is a string, then that is the +`use instead' message. + +This emulating function does nothing because old \(v18\) compiler does not +support this feature." + (interactive "vMake variable obsolete: \nxObsoletion replacement: ") + var) + +(put 'dont-compile 'lisp-indent-hook 0) +(defmacro-maybe dont-compile (&rest body) + "Like `progn', but the body always runs interpreted \(not compiled\). +If you think you need this, you're probably making a mistake somewhere." + (list 'eval (list 'quote (if (cdr body) (cons 'progn body) (car body))))) + +(put 'eval-when-compile 'lisp-indent-hook 0) +(defmacro-maybe eval-when-compile (&rest body) + "Like progn, but evaluates the body at compile-time. + +This emulating macro does not do compile-time evaluation at all because +of the limitation of old \(v18\) compiler." + (cons 'progn body)) + +(put 'eval-and-compile 'lisp-indent-hook 0) +(defmacro-maybe eval-and-compile (&rest body) + "Like progn, but evaluates the body at compile-time as well as at load-time. + +This emulating macro does not do compile-time evaluation at all because +of the limitation of old \(v18\) compiler." + (cons 'progn body)) + + +;;; @ C primitives emulation. +;;; (defun member (elt list) "Return non-nil if ELT is an element of LIST. Comparison done with EQUAL. -The value is actually the tail of LIST whose car is ELT. -\[poe-18.el; EMACS 19 emulating function]" +The value is actually the tail of LIST whose car is ELT." (while (and list (not (equal elt (car list)))) (setq list (cdr list))) list) +(defun delete (elt list) + "Delete by side effect any occurrences of ELT as a member of LIST. +The modified LIST is returned. Comparison is done with `equal'. +If the first member of LIST is ELT, deleting it is not a side effect; +it is simply using a different list. +Therefore, write `(setq foo (delete element foo))' +to be sure of changing the value of `foo'." + (if list + (if (equal elt (car list)) + (cdr list) + (let ((rest list) + (rrest (cdr list))) + (while (and rrest (not (equal elt (car rrest)))) + (setq rest rrest + rrest (cdr rrest))) + (setcdr rest (cdr rrest)) + list)))) + +(defun default-boundp (symbol) + "Return t if SYMBOL has a non-void default value. +This is the value that is seen in buffers that do not have their own values +for this variable." + (condition-case error + (progn + (default-value symbol) + t) + (void-variable nil))) + +;;; @@ current-time. +;;; -;;; @@ environment variable +(defvar current-time-world-timezones + '(("PST" . -800)("PDT" . -700)("MST" . -700) + ("MDT" . -600)("CST" . -600)("CDT" . -500) + ("EST" . -500)("EDT" . -400)("AST" . -400) + ("NST" . -330)("UT" . +000)("GMT" . +000) + ("BST" . +100)("MET" . +100)("EET" . +200) + ("JST" . +900)("GMT+1" . +100)("GMT+2" . +200) + ("GMT+3" . +300)("GMT+4" . +400)("GMT+5" . +500) + ("GMT+6" . +600)("GMT+7" . +700)("GMT+8" . +800) + ("GMT+9" . +900)("GMT+10" . +1000)("GMT+11" . +1100) + ("GMT+12" . +1200)("GMT+13" . +1300)("GMT-1" . -100) + ("GMT-2" . -200)("GMT-3" . -300)("GMT-4" . -400) + ("GMT-5" . -500)("GMT-6" . -600)("GMT-7" . -700) + ("GMT-8" . -800)("GMT-9" . -900)("GMT-10" . -1000) + ("GMT-11" . -1100) ("GMT-12" . -1200)) + "Time differentials of timezone from GMT in +-HHMM form. +Used in `current-time-zone' (Emacs 19 emulating function in poe-18.el).") + +(defvar current-time-local-timezone nil + "*Local timezone name. +Used in `current-time-zone' (Emacs 19 emulating function in poe-18.el).") + +(defun current-time-zone (&optional specified-time) + "Return the offset and name for the local time zone. +This returns a list of the form (OFFSET NAME). +OFFSET is an integer number of seconds ahead of UTC (east of Greenwich). + A negative value means west of Greenwich. +NAME is a string giving the name of the time zone. +Optional argument SPECIFIED-TIME is ignored in this implementation. +Some operating systems cannot provide all this information to Emacs; +in this case, `current-time-zone' returns a list containing nil for +the data it can't find." + (let ((local-timezone + (or current-time-local-timezone + (setq current-time-local-timezone + (with-temp-buffer + (call-process "date" nil (current-buffer) t) + (goto-char (point-min)) + (if (looking-at + "^.*\\([A-Z][A-Z][A-Z]\\([^ \n\t]*\\)\\).*$") + (buffer-substring (match-beginning 1) + (match-end 1))))))) + timezone abszone seconds) + (setq timezone + (or (cdr (assoc (upcase local-timezone) + current-time-world-timezones)) + ;; "+900" style or nil. + local-timezone)) + (when timezone + (if (stringp timezone) + (setq timezone (string-to-int timezone))) + ;; Taking account of minute in timezone. + ;; HHMM -> MM + (setq abszone (abs timezone)) + (setq seconds (* 60 (+ (* 60 (/ abszone 100)) (% abszone 100)))) + (list (if (< timezone 0) (- seconds) seconds) + local-timezone)))) + +(or (fboundp 'si:current-time-string) + (fset 'si:current-time-string (symbol-function 'current-time-string))) +(defun current-time-string (&optional specified-time) + "Return the current time, as a human-readable string. +Programs can use this function to decode a time, +since the number of columns in each field is fixed. +The format is `Sun Sep 16 01:03:52 1973'. +If an argument SPECIFIED-TIME is given, it specifies a time to format +instead of the current time. The argument should have the form: + (HIGH . LOW) +or the form: + (HIGH LOW . IGNORED). +Thus, you can use times obtained from `current-time' +and from `file-attributes'." + (if (null specified-time) + (si:current-time-string) + (or (consp specified-time) + (error "Wrong type argument %s" specified-time)) + (let ((high (car specified-time)) + (low (cdr specified-time)) + (offset (or (car (current-time-zone)) 0)) + (mdays '(31 28 31 30 31 30 31 31 30 31 30 31)) + (mnames '("Jan" "Feb" "Mar" "Apr" "May" "Jun" + "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")) + (wnames '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat")) + days dd yyyy lyear mm HH MM SS) + (if (consp low) + (setq low (car low))) + (or (integerp high) + (error "Wrong type argument %s" high)) + (or (integerp low) + (error "Wrong type argument %s" low)) + (setq low (+ low offset)) + (while (> low 65535) + (setq high (1+ high) + low (- low 65536))) + (setq yyyy 1970) + (while (or (> high 481) + (and (= high 481) + (>= low 13184))) + (if (and (> high 0) + (< low 13184)) + (setq high (1- high) + low (+ 65536 low))) + (setq high (- high 481) + low (- low 13184)) + (if (and (zerop (% yyyy 4)) + (or (not (zerop (% yyyy 100))) + (zerop (% yyyy 400)))) + (progn + (if (and (> high 0) + (< low 20864)) + (setq high (1- high) + low (+ 65536 low))) + (setq high (- high 1) + low (- low 20864)))) + (setq yyyy (1+ yyyy))) + (setq dd 1) + (while (or (> high 1) + (and (= high 1) + (>= low 20864))) + (if (and (> high 0) + (< low 20864)) + (setq high (1- high) + low (+ 65536 low))) + (setq high (- high 1) + low (- low 20864) + dd (1+ dd))) + (setq days dd) + (if (= high 1) + (setq low (+ 65536 low))) + (setq mm 0) + (setq lyear (and (zerop (% yyyy 4)) + (or (not (zerop (% yyyy 100))) + (zerop (% yyyy 400))))) + (while (> (- dd (nth mm mdays)) 0) + (if (and (= mm 1) lyear) + (setq dd (- dd 29)) + (setq dd (- dd (nth mm mdays)))) + (setq mm (1+ mm))) + (setq HH (/ low 3600) + low (% low 3600) + MM (/ low 60) + SS (% low 60)) + (format "%s %s %2d %02d:%02d:%02d %4d" + (nth (% (+ days + (- (+ (* (1- yyyy) 365) (/ (1- yyyy) 400) + (/ (1- yyyy) 4)) (/ (1- yyyy) 100))) 7) + wnames) + (nth mm mnames) + dd HH MM SS yyyy)))) + +(defun current-time () + "Return the current time, as the number of seconds since 1970-01-01 00:00:00. +The time is returned as a list of three integers. The first has the +most significant 16 bits of the seconds, while the second has the +least significant 16 bits. The third integer gives the microsecond +count. + +The microsecond count is zero on systems that do not provide +resolution finer than a second." + (let* ((str (current-time-string)) + (yyyy (string-to-int (substring str 20 24))) + (mm (length (member (substring str 4 7) + '("Dec" "Nov" "Oct" "Sep" "Aug" "Jul" + "Jun" "May" "Apr" "Mar" "Feb" "Jan")))) + (dd (string-to-int (substring str 8 10))) + (HH (string-to-int (substring str 11 13))) + (MM (string-to-int (substring str 14 16))) + (SS (string-to-int (substring str 17 19))) + (offset (or (car (current-time-zone)) 0)) + dn ct1 ct2 i1 i2 + year uru) + (setq ct1 0 ct2 0 i1 0 i2 0) + (setq year (- yyyy 1970)) + (while (> year 0) + (setq year (1- year) + ct1 (+ ct1 481) + ct2 (+ ct2 13184)) + (while (> ct2 65535) + (setq ct1 (1+ ct1) + ct2 (- ct2 65536)))) + (setq uru (- (+ (- (/ yyyy 4) (/ yyyy 100)) + (/ yyyy 400)) 477)) + (while (> uru 0) + (setq uru (1- uru) + i1 (1+ i1) + i2 (+ i2 20864)) + (if (> i2 65535) + (setq i1 (1+ i1) + i2 (- i2 65536)))) + (setq ct1 (+ ct1 i1) + ct2 (+ ct2 i2)) + (while (> ct2 65535) + (setq ct1 (1+ ct1) + ct2 (- ct2 65536))) + (setq dn (+ dd (* 31 (1- mm)))) + (if (> mm 2) + (setq dn (+ (- dn (/ (+ 23 (* 4 mm)) 10)) + (if (and (zerop (% yyyy 4)) + (or (not (zerop (% yyyy 100))) + (zerop (% yyyy 400)))) + 1 0)))) + (setq dn (1- dn) + i1 0 + i2 0) + (while (> dn 0) + (setq dn (1- dn) + i1 (1+ i1) + i2 (+ i2 20864)) + (if (> i2 65535) + (setq i1 (1+ i1) + i2 (- i2 65536)))) + (setq ct1 (+ (+ (+ ct1 i1) (/ ct2 65536)) + (/ (+ (* HH 3600) (* MM 60) SS) + 65536)) + ct2 (+ (+ i2 (% ct2 65536)) + (% (+ (* HH 3600) (* MM 60) SS) + 65536))) + (while (< (- ct2 offset) 0) + (setq ct1 (1- ct1) + ct2 (+ ct2 65536))) + (setq ct2 (- ct2 offset)) + (while (> ct2 65535) + (setq ct1 (1+ ct1) + ct2 (- ct2 65536))) + (list ct1 ct2 0))) + +;;; @@ Floating point numbers. ;;; -(autoload 'setenv "env" - "Set the value of the environment variable named VARIABLE to VALUE. -VARIABLE should be a string. VALUE is optional; if not provided or is -`nil', the environment variable VARIABLE will be removed. -This function works by modifying `process-environment'." - t) +(defalias 'numberp 'integerp) + +(defun abs (arg) + "Return the absolute value of ARG." + (if (< arg 0) (- arg) arg)) -;;; @@ function +;;; @ Basic lisp subroutines. ;;; -(defun defalias (sym newdef) - "Set SYMBOL's function definition to NEWVAL, and return NEWVAL. -Associates the function with the current load file, if any. -\[poe-18.el; EMACS 19 emulating function]" - (fset sym newdef) - ) +(defmacro lambda (&rest cdr) + "Return a lambda expression. +A call of the form (lambda ARGS DOCSTRING INTERACTIVE BODY) is +self-quoting; the result of evaluating the lambda expression is the +expression itself. The lambda expression may then be treated as a +function, i.e., stored as the function value of a symbol, passed to +funcall or mapcar, etc. + +ARGS should take the same form as an argument list for a `defun'. +DOCSTRING is an optional documentation string. + If present, it should describe how to call the function. + But documentation strings are usually not useful in nameless functions. +INTERACTIVE should be a call to the function `interactive', which see. +It may also be omitted. +BODY should be a list of lisp expressions." + ;; Note that this definition should not use backquotes; subr.el should not + ;; depend on backquote.el. + (list 'function (cons 'lambda cdr))) +(defun force-mode-line-update (&optional all) + "Force the mode-line of the current buffer to be redisplayed. +With optional non-nil ALL, force redisplay of all mode-lines." + (if all (save-excursion (set-buffer (other-buffer)))) + (set-buffer-modified-p (buffer-modified-p))) -;;; @ Compilation Features +;; (defalias 'save-match-data 'store-match-data) + + +;;; @ Basic editing commands. ;;; -(defmacro-maybe eval-when-compile (&rest body) - "Like `progn', but evaluates the body at compile time. -The result of the body appears to the compiler as a quoted constant." - ;; Not necessary because we have it in b-c-initial-macro-environment - ;; (list 'quote (eval (cons 'progn body))) - (cons 'progn body)) +;; 18.55 does not have this variable. +(defvar buffer-undo-list nil) -(defmacro-maybe eval-and-compile (&rest body) - "Like `progn', but evaluates the body at compile time and at load time." - ;; Remember, it's magic. - (cons 'progn body)) +(defalias 'buffer-disable-undo 'buffer-flush-undo) -(defun byte-code-function-p (exp) - "T if OBJECT is a byte-compiled function object. -\[poe-18.el; EMACS 19 emulating function]" - (and (consp exp) - (let* ((rest (cdr (cdr exp))) elt) - (if (stringp (car rest)) - (setq rest (cdr rest)) - ) - (catch 'tag - (while rest - (setq elt (car rest)) - (if (and (consp elt)(eq (car elt) 'byte-code)) - (throw 'tag t) - ) - (setq rest (cdr rest)) - )) - ))) +(defun generate-new-buffer-name (name &optional ignore) + "Return a string that is the name of no existing buffer based on NAME. +If there is no live buffer named NAME, then return NAME. +Otherwise modify name by appending `', incrementing NUMBER +until an unused name is found, and then return that name. +Optional second argument IGNORE specifies a name that is okay to use +\(if it is in the sequence to be tried\) +even if a buffer with that name exists." + (if (get-buffer name) + (let ((n 2) new) + (while (get-buffer (setq new (format "%s<%d>" name n))) + (setq n (1+ n))) + new) + name)) -(defun-maybe make-obsolete (fn new) - "Make the byte-compiler warn that FUNCTION is obsolete. -The warning will say that NEW should be used instead. -If NEW is a string, that is the `use instead' message." - (interactive "aMake function obsolete: \nxObsoletion replacement: ") - (let ((handler (get fn 'byte-compile))) - (if (eq 'byte-compile-obsolete handler) - (setcar (get fn 'byte-obsolete-info) new) - (put fn 'byte-obsolete-info (cons new handler)) - (put fn 'byte-compile 'byte-compile-obsolete))) - fn) +(or (fboundp 'si:mark) + (fset 'si:mark (symbol-function 'mark))) +(defun mark (&optional force) + (si:mark)) -;;; @ text property +;;; @@ Environment variables. ;;; -(defun set-text-properties (start end properties &optional object)) - -(defun remove-text-properties (start end properties &optional object)) +(autoload 'setenv "env" + "Set the value of the environment variable named VARIABLE to VALUE. +VARIABLE should be a string. VALUE is optional; if not provided or is +`nil', the environment variable VARIABLE will be removed. +This function works by modifying `process-environment'." + t) -;;; @ file +;;; @ File input and output commands. ;;; +(defvar data-directory exec-directory) + +;; In 18.55, `call-process' does not return exit status. +(defun file-executable-p (filename) + "Return t if FILENAME can be executed by you. +For a directory, this means you can access files in that directory." + (if (file-exists-p filename) + (let ((process (start-process "test" nil "test" "-x" filename))) + (while (eq 'run (process-status process))) + (zerop (process-exit-status process))))) + (defun make-directory-internal (dirname) - "Create a directory. One argument, a file name string. -\[poe-18.el; EMACS 19 emulating function]" + "Create a directory. One argument, a file name string." (let ((dir (expand-file-name dirname))) (if (file-exists-p dir) - (error "Creating directory: %s is already exist" dir) + (error "Creating directory: %s is already exist" dir) (call-process "mkdir" nil nil nil dir)))) (defun make-directory (dir &optional parents) "Create the directory DIR and any nonexistent parent dirs. The second (optional) argument PARENTS says whether -to create parent directories if they don't exist. -\[poe-18.el; EMACS 19 emulating function]" +to create parent directories if they don't exist." (let ((len (length dir)) (p 0) p1 path) (catch 'tag (while (and (< p len) (string-match "[^/]*/?" dir p)) (setq p1 (match-end 0)) (if (= p1 len) - (throw 'tag nil) - ) + (throw 'tag nil)) (setq path (substring dir 0 p1)) (if (not (file-directory-p path)) (cond ((file-exists-p path) - (error "Creating directory: %s is not directory" path) - ) + (error "Creating directory: %s is not directory" path)) ((null parents) - (error "Creating directory: %s is not exist" path) - ) + (error "Creating directory: %s is not exist" path)) (t - (make-directory-internal path) - )) - ) - (setq p p1) - )) - (make-directory-internal dir) - )) - -;; Imported from files.el of EMACS 19.33. + (make-directory-internal path)))) + (setq p p1))) + (make-directory-internal dir))) + (defun parse-colon-path (cd-path) "Explode a colon-separated list of paths into a string list." (and cd-path @@ -195,14 +571,13 @@ to create parent directories if they don't exist. (setq cd-list (nconc cd-list (list (if (= cd-start cd-colon) - nil + nil (substitute-in-file-name (file-name-as-directory (substring cd-path cd-start cd-colon))))))) (setq cd-start (+ cd-colon 1))) cd-list))) -;; Imported from files.el of EMACS 19.33. (defun file-relative-name (filename &optional directory) "Convert FILENAME to be relative to DIRECTORY (default: default-directory)." (setq filename (expand-file-name filename) @@ -222,122 +597,105 @@ There are three optional arguments: If FULL is non-nil, return absolute file names. Otherwise return names that are relative to the specified directory. If MATCH is non-nil, mention only file names that match the regexp MATCH. -If NOSORT is dummy for compatibility. -\[poe-18.el; EMACS 19 emulating function]" - (si:directory-files directory full match) - ) +If NOSORT is dummy for compatibility." + (si:directory-files directory full match)) - -;;; @ Display Features -;;; -;;; Imported from Emacs 19.30. -(defun force-mode-line-update (&optional all) - "Force the mode-line of the current buffer to be redisplayed. -With optional non-nil ALL, force redisplay of all mode-lines. -\[poe-18.el; Emacs 19 emulating function]" - (if all (save-excursion (set-buffer (other-buffer)))) - (set-buffer-modified-p (buffer-modified-p))) - - -;;; @ overlay +;;; @ Text property. ;;; -(cond ((boundp 'NEMACS) - (defvar emu:available-face-attribute-alist - '( - ;;(bold . inversed-region) - (italic . underlined-region) - (underline . underlined-region) - )) - - ;; by YAMATE Keiichirou 1994/10/28 - (defun attribute-add-narrow-attribute (attr from to) - (or (consp (symbol-value attr)) - (set attr (list 1))) - (let* ((attr-value (symbol-value attr)) - (len (car attr-value)) - (posfrom 1) - posto) - (while (and (< posfrom len) - (> from (nth posfrom attr-value))) - (setq posfrom (1+ posfrom))) - (setq posto posfrom) - (while (and (< posto len) - (> to (nth posto attr-value))) - (setq posto (1+ posto))) - (if (= posto posfrom) - (if (= (% posto 2) 1) - (if (and (< to len) - (= to (nth posto attr-value))) - (set-marker (nth posto attr-value) from) - (setcdr (nthcdr (1- posfrom) attr-value) - (cons (set-marker-type (set-marker (make-marker) - from) - 'point-type) - (cons (set-marker-type - (set-marker (make-marker) - to) - nil) - (nthcdr posto attr-value)))) - (setcar attr-value (+ len 2)))) - (if (= (% posfrom 2) 0) - (setq posfrom (1- posfrom)) - (set-marker (nth posfrom attr-value) from)) - (if (= (% posto 2) 0) - nil - (setq posto (1- posto)) - (set-marker (nth posto attr-value) to)) - (setcdr (nthcdr posfrom attr-value) - (nthcdr posto attr-value))))) - - (defalias 'make-overlay 'cons) - - (defun overlay-put (overlay prop value) - (let ((ret (and (eq prop 'face) - (assq value emu:available-face-attribute-alist) - ))) - (if ret - (attribute-add-narrow-attribute (cdr ret) - (car overlay)(cdr overlay)) - ))) - ) - (t - (defun make-overlay (beg end &optional buffer type)) - (defun overlay-put (overlay prop value)) - )) - -(defun overlay-buffer (overlay)) +;; In Emacs 20.4, these functions are defined in src/textprop.c. +(defun text-properties-at (position &optional object)) +(defun get-text-property (position prop &optional object)) +(defun get-char-property (position prop &optional object)) +(defun next-property-change (position &optional object limit)) +(defun next-single-property-change (position prop &optional object limit)) +(defun previous-property-change (position &optional object limit)) +(defun previous-single-property-change (position prop &optional object limit)) +(defun add-text-properties (start end properties &optional object)) +(defun put-text-properties (start end property &optional object)) +(defun set-text-properties (start end properties &optional object)) +(defun remove-text-properties (start end properties &optional object)) +(defun text-property-any (start end property value &optional object)) +(defun text-property-not-all (start end property value &optional object)) +;; the following two functions are new in v20. +(defun next-char-property-change (position &optional object)) +(defun previous-char-property-change (position &optional object)) +;; the following two functions are obsolete. +;; (defun erase-text-properties (start end &optional object) +;; (defun copy-text-properties (start end src pos dest &optional prop) -;;; @ buffer +;;; @ Overlay. ;;; -(defun-maybe generate-new-buffer-name (name &optional ignore) - "Return a string that is the name of no existing buffer based on NAME. -If there is no live buffer named NAME, then return NAME. -Otherwise modify name by appending `', incrementing NUMBER -until an unused name is found, and then return that name. -Optional second argument IGNORE specifies a name that is okay to use -\(if it is in the sequence to be tried) -even if a buffer with that name exists." - (if (get-buffer name) - (let ((n 2) new) - (while (get-buffer (setq new (format "%s<%d>" name n))) - (setq n (1+ n))) - new) - name)) +(cond + ((boundp 'NEMACS) + (defvar emu:available-face-attribute-alist + '( + ;;(bold . inversed-region) + (italic . underlined-region) + (underline . underlined-region))) + + ;; by YAMATE Keiichirou 1994/10/28 + (defun attribute-add-narrow-attribute (attr from to) + (or (consp (symbol-value attr)) + (set attr (list 1))) + (let* ((attr-value (symbol-value attr)) + (len (car attr-value)) + (posfrom 1) + posto) + (while (and (< posfrom len) + (> from (nth posfrom attr-value))) + (setq posfrom (1+ posfrom))) + (setq posto posfrom) + (while (and (< posto len) + (> to (nth posto attr-value))) + (setq posto (1+ posto))) + (if (= posto posfrom) + (if (= (% posto 2) 1) + (if (and (< to len) + (= to (nth posto attr-value))) + (set-marker (nth posto attr-value) from) + (setcdr (nthcdr (1- posfrom) attr-value) + (cons (set-marker-type (set-marker (make-marker) + from) + 'point-type) + (cons (set-marker-type + (set-marker (make-marker) + to) + nil) + (nthcdr posto attr-value)))) + (setcar attr-value (+ len 2)))) + (if (= (% posfrom 2) 0) + (setq posfrom (1- posfrom)) + (set-marker (nth posfrom attr-value) from)) + (if (= (% posto 2) 0) + nil + (setq posto (1- posto)) + (set-marker (nth posto attr-value) to)) + (setcdr (nthcdr posfrom attr-value) + (nthcdr posto attr-value))))) + + (defalias 'make-overlay 'cons) + + (defun overlay-put (overlay prop value) + (let ((ret (and (eq prop 'face) + (assq value emu:available-face-attribute-alist)))) + (if ret + (attribute-add-narrow-attribute (cdr ret) + (car overlay)(cdr overlay)))))) + (t + (defun make-overlay (beg end &optional buffer type)) + (defun overlay-put (overlay prop value)))) -(or (fboundp 'si:mark) - (fset 'si:mark (symbol-function 'mark))) -(defun mark (&optional force) - (si:mark) - ) +(defun overlay-buffer (overlay)) -;;; @ end +;;; @ End. ;;; -(provide 'poe-18) +(require 'product) +(product-provide (provide 'poe-18) (require 'apel-ver)) ;;; poe-18.el ends here