Merge remote-tracking branch 'savannah/master' into HEAD
This commit is contained in:
commit
cf1e8e792f
100 changed files with 1798 additions and 807 deletions
|
@ -41,23 +41,23 @@
|
|||
;; Consider the following C structures:
|
||||
;;
|
||||
;; struct header {
|
||||
;; unsigned long dest_ip;
|
||||
;; unsigned long src_ip;
|
||||
;; unsigned short dest_port;
|
||||
;; unsigned short src_port;
|
||||
;; uint32_t dest_ip;
|
||||
;; uint32_t src_ip;
|
||||
;; uint16_t dest_port;
|
||||
;; uint16_t src_port;
|
||||
;; };
|
||||
;;
|
||||
;; struct data {
|
||||
;; unsigned char type;
|
||||
;; unsigned char opcode;
|
||||
;; unsigned long length; /* In little endian order */
|
||||
;; uint8_t type;
|
||||
;; uint8_t opcode;
|
||||
;; uint32_t length; /* In little endian order */
|
||||
;; unsigned char id[8]; /* nul-terminated string */
|
||||
;; unsigned char data[/* (length + 3) & ~3 */];
|
||||
;; };
|
||||
;;
|
||||
;; struct packet {
|
||||
;; struct header header;
|
||||
;; unsigned char items;
|
||||
;; uint8_t items;
|
||||
;; unsigned char filler[3];
|
||||
;; struct data item[/* items */];
|
||||
;; };
|
||||
|
@ -75,7 +75,7 @@
|
|||
;; (bindat-spec
|
||||
;; (type u8)
|
||||
;; (opcode u8)
|
||||
;; (length u16r) ;; little endian order
|
||||
;; (length u32r) ;; little endian order
|
||||
;; (id strz 8)
|
||||
;; (data vec (length))
|
||||
;; (align 4)))
|
||||
|
|
|
@ -1348,7 +1348,7 @@ Same format as `byte-optimize--lexvars', with shared structure and contents.")
|
|||
window-total-height window-total-width window-use-time window-vscroll
|
||||
window-width zerop))
|
||||
(side-effect-and-error-free-fns
|
||||
'(arrayp atom
|
||||
'(always arrayp atom
|
||||
bignump bobp bolp bool-vector-p
|
||||
buffer-end buffer-list buffer-size buffer-string bufferp
|
||||
car-safe case-table-p cdr-safe char-or-string-p characterp
|
||||
|
|
|
@ -159,9 +159,7 @@ The return value of this function is not used."
|
|||
(defalias 'byte-run--set-modes
|
||||
#'(lambda (f _args &rest val)
|
||||
(list 'function-put (list 'quote f)
|
||||
''completion-predicate
|
||||
`(lambda (_ b)
|
||||
(command-completion-with-modes-p ',val b)))))
|
||||
''command-modes (list 'quote val))))
|
||||
|
||||
;; Add any new entries to info node `(elisp)Declare Form'.
|
||||
(defvar defun-declarations-alist
|
||||
|
|
|
@ -2940,7 +2940,9 @@ If FORM is a lambda or a macro, byte-compile it as a function."
|
|||
((eq arg '&optional)
|
||||
(when (memq '&optional (cdr list))
|
||||
(error "Duplicate &optional")))
|
||||
((memq arg vars)
|
||||
((and (memq arg vars)
|
||||
;; Allow repetitions for unused args.
|
||||
(not (string-match "\\`_" (symbol-name arg))))
|
||||
(byte-compile-warn "repeated variable %s in lambda-list" arg))
|
||||
(t
|
||||
(push arg vars))))
|
||||
|
@ -3903,15 +3905,21 @@ discarding."
|
|||
(cl-assert (or (> (length env) 0)
|
||||
docstring-exp)) ;Otherwise, we don't need a closure.
|
||||
(cl-assert (byte-code-function-p fun))
|
||||
(byte-compile-form `(make-byte-code
|
||||
',(aref fun 0) ',(aref fun 1)
|
||||
(vconcat (vector . ,env) ',(aref fun 2))
|
||||
,@(let ((rest (nthcdr 3 (mapcar (lambda (x) `',x) fun))))
|
||||
(if docstring-exp
|
||||
`(,(car rest)
|
||||
,docstring-exp
|
||||
,@(cddr rest))
|
||||
rest)))))))
|
||||
(byte-compile-form
|
||||
;; Use symbols V0, V1 ... as placeholders for closure variables:
|
||||
;; they should be short (to save space in the .elc file), yet
|
||||
;; distinct when disassembled.
|
||||
(let* ((dummy-vars (mapcar (lambda (i) (intern (format "V%d" i)))
|
||||
(number-sequence 0 (1- (length env)))))
|
||||
(proto-fun
|
||||
(apply #'make-byte-code
|
||||
(aref fun 0) (aref fun 1)
|
||||
;; Prepend dummy cells to the constant vector,
|
||||
;; to get the indices right when disassembling.
|
||||
(vconcat dummy-vars (aref fun 2))
|
||||
(mapcar (lambda (i) (aref fun i))
|
||||
(number-sequence 3 (1- (length fun)))))))
|
||||
`(make-closure ,proto-fun ,@env))))))
|
||||
|
||||
(defun byte-compile-get-closed-var (form)
|
||||
"Byte-compile the special `internal-get-closed-var' form."
|
||||
|
|
|
@ -187,7 +187,7 @@ Make sure the width/height is correct."
|
|||
)
|
||||
"Class used to display an axis which represents different named items.")
|
||||
|
||||
(defclass chart-sequece ()
|
||||
(defclass chart-sequence ()
|
||||
((data :initarg :data
|
||||
:initform nil)
|
||||
(name :initarg :name
|
||||
|
@ -583,12 +583,12 @@ SORT-PRED if desired."
|
|||
))
|
||||
(iv (eq dir 'vertical)))
|
||||
(chart-add-sequence nc
|
||||
(make-instance 'chart-sequece
|
||||
(make-instance 'chart-sequence
|
||||
:data namelst
|
||||
:name nametitle)
|
||||
(if iv 'x-axis 'y-axis))
|
||||
(chart-add-sequence nc
|
||||
(make-instance 'chart-sequece
|
||||
(make-instance 'chart-sequence
|
||||
:data numlst
|
||||
:name numtitle)
|
||||
(if iv 'y-axis 'x-axis))
|
||||
|
|
|
@ -88,7 +88,6 @@ using, but only when you also use Edebug."
|
|||
;; because the byte compiler binds them; as a result, if edebug
|
||||
;; is first loaded for a require in a compilation, they will be left unbound.
|
||||
|
||||
;;;###autoload
|
||||
(defcustom edebug-all-defs nil
|
||||
"If non-nil, evaluating defining forms instruments for Edebug.
|
||||
This applies to `eval-defun', `eval-region', `eval-buffer', and
|
||||
|
@ -101,11 +100,6 @@ variable. You may wish to make it local to each buffer with
|
|||
`emacs-lisp-mode-hook'."
|
||||
:type 'boolean)
|
||||
|
||||
;; edebug-all-defs and edebug-all-forms need to be autoloaded
|
||||
;; because the byte compiler binds them; as a result, if edebug
|
||||
;; is first loaded for a require in a compilation, they will be left unbound.
|
||||
|
||||
;;;###autoload
|
||||
(defcustom edebug-all-forms nil
|
||||
"Non-nil means evaluation of all forms will instrument for Edebug.
|
||||
This doesn't apply to loading or evaluations in the minibuffer.
|
||||
|
@ -457,66 +451,24 @@ the option `edebug-all-forms'."
|
|||
|
||||
;; We should somehow arrange to be able to do this
|
||||
;; without actually replacing the eval-defun command.
|
||||
(defun edebug-eval-defun (edebug-it)
|
||||
"Evaluate the top-level form containing point, or after point.
|
||||
|
||||
If the current defun is actually a call to `defvar', then reset the
|
||||
variable using its initial value expression even if the variable
|
||||
already has some other value. (Normally `defvar' does not change the
|
||||
variable's value if it already has a value.) Treat `defcustom'
|
||||
similarly. Reinitialize the face according to `defface' specification.
|
||||
|
||||
With a prefix argument, instrument the code for Edebug.
|
||||
|
||||
Setting option `edebug-all-defs' to a non-nil value reverses the meaning
|
||||
(defun edebug--eval-defun (orig-fun edebug-it)
|
||||
"Setting option `edebug-all-defs' to a non-nil value reverses the meaning
|
||||
of the prefix argument. Code is then instrumented when this function is
|
||||
invoked without a prefix argument.
|
||||
|
||||
If acting on a `defun' for FUNCTION, and the function was instrumented,
|
||||
`Edebug: FUNCTION' is printed in the minibuffer. If not instrumented,
|
||||
just FUNCTION is printed.
|
||||
just FUNCTION is printed."
|
||||
(let* ((edebug-all-forms (not (eq (not edebug-it) (not edebug-all-defs))))
|
||||
(edebug-all-defs edebug-all-forms))
|
||||
(funcall orig-fun nil)))
|
||||
|
||||
If not acting on a `defun', the result of evaluation is displayed in
|
||||
the minibuffer."
|
||||
(defun edebug-eval-defun (edebug-it)
|
||||
(declare (obsolete "use eval-defun or edebug--eval-defun instead" "28.1"))
|
||||
(interactive "P")
|
||||
(let* ((edebugging (not (eq (not edebug-it) (not edebug-all-defs))))
|
||||
(edebug-result)
|
||||
(form
|
||||
(let ((edebug-all-forms edebugging)
|
||||
(edebug-all-defs (eq edebug-all-defs (not edebug-it))))
|
||||
(edebug-read-top-level-form))))
|
||||
;; This should be consistent with `eval-defun-1', but not the
|
||||
;; same, since that gets a macroexpanded form.
|
||||
(cond ((and (eq (car form) 'defvar)
|
||||
(cdr-safe (cdr-safe form)))
|
||||
;; Force variable to be bound.
|
||||
(makunbound (nth 1 form)))
|
||||
((and (eq (car form) 'defcustom)
|
||||
(default-boundp (nth 1 form)))
|
||||
;; Force variable to be bound.
|
||||
;; FIXME: Shouldn't this use the :setter or :initializer?
|
||||
(set-default (nth 1 form) (eval (nth 2 form) lexical-binding)))
|
||||
((eq (car form) 'defface)
|
||||
;; Reset the face.
|
||||
(setq face-new-frame-defaults
|
||||
(assq-delete-all (nth 1 form) face-new-frame-defaults))
|
||||
(put (nth 1 form) 'face-defface-spec nil)
|
||||
(put (nth 1 form) 'face-documentation (nth 3 form))
|
||||
;; See comments in `eval-defun-1' for purpose of code below
|
||||
(setq form (prog1 `(prog1 ,form
|
||||
(put ',(nth 1 form) 'saved-face
|
||||
',(get (nth 1 form) 'saved-face))
|
||||
(put ',(nth 1 form) 'customized-face
|
||||
,(nth 2 form)))
|
||||
(put (nth 1 form) 'saved-face nil)))))
|
||||
(setq edebug-result (eval (eval-sexp-add-defvars form) lexical-binding))
|
||||
(if (not edebugging)
|
||||
(prog1
|
||||
(prin1 edebug-result)
|
||||
(let ((str (eval-expression-print-format edebug-result)))
|
||||
(if str (princ str))))
|
||||
edebug-result)))
|
||||
|
||||
(if (advice-member-p #'edebug--eval-defun 'eval-defun)
|
||||
(eval-defun edebug-it)
|
||||
(edebug--eval-defun #'eval-defun edebug-it)))
|
||||
|
||||
;;;###autoload
|
||||
(defalias 'edebug-defun 'edebug-eval-top-level-form)
|
||||
|
@ -588,12 +540,12 @@ already is one.)"
|
|||
(defun edebug-install-read-eval-functions ()
|
||||
(interactive)
|
||||
(add-function :around load-read-function #'edebug--read)
|
||||
(advice-add 'eval-defun :override #'edebug-eval-defun))
|
||||
(advice-add 'eval-defun :around #'edebug--eval-defun))
|
||||
|
||||
(defun edebug-uninstall-read-eval-functions ()
|
||||
(interactive)
|
||||
(remove-function load-read-function #'edebug--read)
|
||||
(advice-remove 'eval-defun #'edebug-eval-defun))
|
||||
(advice-remove 'eval-defun #'edebug--eval-defun))
|
||||
|
||||
;;; Edebug internal data
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ If the value is a positive number, it is used to calculate a
|
|||
number of logical lines of documentation that ElDoc is allowed to
|
||||
put in the echo area. If a positive integer, the number is used
|
||||
directly, while a float specifies the number of lines as a
|
||||
proporting of the echo area frame's height.
|
||||
proportion of the echo area frame's height.
|
||||
|
||||
If value is the symbol `truncate-sym-name-if-fit' t, the part of
|
||||
the doc string that represents a symbol's name may be truncated
|
||||
|
@ -692,7 +692,7 @@ following values are allowed:
|
|||
|
||||
- `eldoc-documentation-compose-eagerly': calls all functions in
|
||||
the special hook and display as many of the resulting doc
|
||||
strings as possible, as soon as possibl. Preserving the
|
||||
strings as possible, as soon as possible. Preserving the
|
||||
relative order of doc strings;
|
||||
|
||||
- `eldoc-documentation-enthusiast': calls all functions in the
|
||||
|
|
|
@ -2830,6 +2830,7 @@ either a full name or nil, and EMAIL is a valid email address."
|
|||
Letters do not insert themselves; instead, they are commands.
|
||||
\\<package-menu-mode-map>
|
||||
\\{package-menu-mode-map}"
|
||||
:interactive nil
|
||||
(setq mode-line-process '((package--downloads-in-progress ":Loading")
|
||||
(package-menu--transaction-status
|
||||
package-menu--transaction-status)))
|
||||
|
@ -2952,7 +2953,7 @@ Installed obsolete packages are always displayed.")
|
|||
Also hide packages whose name matches a regexp in user option
|
||||
`package-hidden-regexps' (a list). To add regexps to this list,
|
||||
use `package-menu-hide-package'."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(setq package-menu--hide-packages
|
||||
(not package-menu--hide-packages))
|
||||
|
@ -3289,7 +3290,7 @@ To unhide a package, type
|
|||
|
||||
Type \\[package-menu-toggle-hiding] to toggle package hiding."
|
||||
(declare (interactive-only "change `package-hidden-regexps' instead."))
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(let* ((name (when (derived-mode-p 'package-menu-mode)
|
||||
(concat "\\`" (regexp-quote (symbol-name (package-desc-name
|
||||
|
@ -3313,7 +3314,7 @@ Type \\[package-menu-toggle-hiding] to toggle package hiding."
|
|||
(defun package-menu-describe-package (&optional button)
|
||||
"Describe the current package.
|
||||
If optional arg BUTTON is non-nil, describe its associated package."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(let ((pkg-desc (if button (button-get button 'package-desc)
|
||||
(tabulated-list-get-id))))
|
||||
(if pkg-desc
|
||||
|
@ -3323,7 +3324,7 @@ If optional arg BUTTON is non-nil, describe its associated package."
|
|||
;; fixme numeric argument
|
||||
(defun package-menu-mark-delete (&optional _num)
|
||||
"Mark a package for deletion and move to the next line."
|
||||
(interactive "p")
|
||||
(interactive "p" package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(if (member (package-menu-get-status)
|
||||
'("installed" "dependency" "obsolete" "unsigned"))
|
||||
|
@ -3332,7 +3333,7 @@ If optional arg BUTTON is non-nil, describe its associated package."
|
|||
|
||||
(defun package-menu-mark-install (&optional _num)
|
||||
"Mark a package for installation and move to the next line."
|
||||
(interactive "p")
|
||||
(interactive "p" package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(if (member (package-menu-get-status) '("available" "avail-obso" "new" "dependency"))
|
||||
(tabulated-list-put-tag "I" t)
|
||||
|
@ -3340,20 +3341,20 @@ If optional arg BUTTON is non-nil, describe its associated package."
|
|||
|
||||
(defun package-menu-mark-unmark (&optional _num)
|
||||
"Clear any marks on a package and move to the next line."
|
||||
(interactive "p")
|
||||
(interactive "p" package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(tabulated-list-put-tag " " t))
|
||||
|
||||
(defun package-menu-backup-unmark ()
|
||||
"Back up one line and clear any marks on that package."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(forward-line -1)
|
||||
(tabulated-list-put-tag " "))
|
||||
|
||||
(defun package-menu-mark-obsolete-for-deletion ()
|
||||
"Mark all obsolete packages for deletion."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
|
@ -3384,7 +3385,7 @@ If optional arg BUTTON is non-nil, describe its associated package."
|
|||
(defun package-menu-quick-help ()
|
||||
"Show short key binding help for `package-menu-mode'.
|
||||
The full list of keys can be viewed with \\[describe-mode]."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(message (mapconcat #'package--prettify-quick-help-key
|
||||
package--quick-help-keys "\n")))
|
||||
|
@ -3480,7 +3481,7 @@ call will upgrade the package.
|
|||
If there's an async refresh operation in progress, the flags will
|
||||
be placed as part of `package-menu--post-refresh' instead of
|
||||
immediately."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(if (not package--downloads-in-progress)
|
||||
(package-menu--mark-upgrades-1)
|
||||
|
@ -3574,7 +3575,7 @@ packages list, respectively."
|
|||
Packages marked for installation are downloaded and installed;
|
||||
packages marked for deletion are removed.
|
||||
Optional argument NOQUERY non-nil means do not ask the user to confirm."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(let (install-list delete-list cmd pkg-desc)
|
||||
(save-excursion
|
||||
|
@ -3819,7 +3820,8 @@ strings. If ARCHIVE is nil or the empty string, show all
|
|||
packages."
|
||||
(interactive (list (completing-read-multiple
|
||||
"Filter by archive (comma separated): "
|
||||
(mapcar #'car package-archives))))
|
||||
(mapcar #'car package-archives)))
|
||||
package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(let ((re (if (listp archive)
|
||||
(regexp-opt archive)
|
||||
|
@ -3840,7 +3842,8 @@ DESCRIPTION.
|
|||
When called interactively, prompt for DESCRIPTION.
|
||||
|
||||
If DESCRIPTION is nil or the empty string, show all packages."
|
||||
(interactive (list (read-regexp "Filter by description (regexp)")))
|
||||
(interactive (list (read-regexp "Filter by description (regexp)"))
|
||||
package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(if (or (not description) (string-empty-p description))
|
||||
(package-menu--generate t t)
|
||||
|
@ -3861,10 +3864,11 @@ strings. If KEYWORD is nil or the empty string, show all
|
|||
packages."
|
||||
(interactive (list (completing-read-multiple
|
||||
"Keywords (comma separated): "
|
||||
(package-all-keywords))))
|
||||
(package-all-keywords)))
|
||||
package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(when (stringp keyword)
|
||||
(setq keyword (list keyword)))
|
||||
(package--ensure-package-menu-mode)
|
||||
(if (not keyword)
|
||||
(package-menu--generate t t)
|
||||
(package-menu--filter-by (lambda (pkg-desc)
|
||||
|
@ -3883,7 +3887,8 @@ When called interactively, prompt for NAME-OR-DESCRIPTION.
|
|||
|
||||
If NAME-OR-DESCRIPTION is nil or the empty string, show all
|
||||
packages."
|
||||
(interactive (list (read-regexp "Filter by name or description (regexp)")))
|
||||
(interactive (list (read-regexp "Filter by name or description (regexp)"))
|
||||
package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(if (or (not name-or-description) (string-empty-p name-or-description))
|
||||
(package-menu--generate t t)
|
||||
|
@ -3902,7 +3907,8 @@ Display only packages with name that matches regexp NAME.
|
|||
When called interactively, prompt for NAME.
|
||||
|
||||
If NAME is nil or the empty string, show all packages."
|
||||
(interactive (list (read-regexp "Filter by name (regexp)")))
|
||||
(interactive (list (read-regexp "Filter by name (regexp)"))
|
||||
package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(if (or (not name) (string-empty-p name))
|
||||
(package-menu--generate t t)
|
||||
|
@ -3932,7 +3938,8 @@ packages."
|
|||
"incompat"
|
||||
"installed"
|
||||
"new"
|
||||
"unsigned"))))
|
||||
"unsigned")))
|
||||
package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(if (or (not status) (string-empty-p status))
|
||||
(package-menu--generate t t)
|
||||
|
@ -3967,7 +3974,9 @@ If VERSION is nil or the empty string, show all packages."
|
|||
('< "< less than")
|
||||
('> "> greater than"))
|
||||
"): "))
|
||||
choice))))
|
||||
choice)))
|
||||
package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(unless (equal predicate 'quit)
|
||||
(if (or (not version) (string-empty-p version))
|
||||
(package-menu--generate t t)
|
||||
|
@ -3985,7 +3994,7 @@ If VERSION is nil or the empty string, show all packages."
|
|||
(defun package-menu-filter-marked ()
|
||||
"Filter \"*Packages*\" buffer by non-empty upgrade mark.
|
||||
Unlike other filters, this leaves the marks intact."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(widen)
|
||||
(let (found-entries mark pkg-id entry marks)
|
||||
|
@ -4013,7 +4022,7 @@ Unlike other filters, this leaves the marks intact."
|
|||
|
||||
(defun package-menu-filter-upgradable ()
|
||||
"Filter \"*Packages*\" buffer to show only upgradable packages."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(let ((pkgs (mapcar #'car (package-menu--find-upgrades))))
|
||||
(package-menu--filter-by
|
||||
(lambda (pkg)
|
||||
|
@ -4022,7 +4031,7 @@ Unlike other filters, this leaves the marks intact."
|
|||
|
||||
(defun package-menu-clear-filter ()
|
||||
"Clear any filter currently applied to the \"*Packages*\" buffer."
|
||||
(interactive)
|
||||
(interactive nil package-menu-mode)
|
||||
(package--ensure-package-menu-mode)
|
||||
(package-menu--generate t t))
|
||||
|
||||
|
|
|
@ -642,7 +642,7 @@ MATCH is the pattern that needs to be matched, of the form:
|
|||
|
||||
(defun pcase--split-pred (vars upat pat)
|
||||
"Indicate the overlap or mutual-exclusion between UPAT and PAT.
|
||||
More specifically retuns a pair (A . B) where A indicates whether PAT
|
||||
More specifically returns a pair (A . B) where A indicates whether PAT
|
||||
can match when UPAT has matched, and B does the same for the case
|
||||
where UPAT failed to match.
|
||||
A and B can be one of:
|
||||
|
@ -784,7 +784,7 @@ Otherwise, it defers to REST which is a list of branches of the form
|
|||
\(ELSE-MATCH ELSE-CODE . ELSE-VARS)."
|
||||
;; Depending on the order in which we choose to check each of the MATCHES,
|
||||
;; the resulting tree may be smaller or bigger. So in general, we'd want
|
||||
;; to be careful to chose the "optimal" order. But predicate
|
||||
;; to be careful to choose the "optimal" order. But predicate
|
||||
;; patterns make this harder because they create dependencies
|
||||
;; between matches. So we don't bother trying to reorder anything.
|
||||
(cond
|
||||
|
|
|
@ -217,8 +217,7 @@ Except for Lisp syntax this is the same as `reb-regexp'.")
|
|||
|
||||
;; Define the local "\C-c" keymap
|
||||
(defvar reb-mode-map
|
||||
(let ((map (make-sparse-keymap))
|
||||
(menu-map (make-sparse-keymap)))
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map "\C-c\C-c" 'reb-toggle-case)
|
||||
(define-key map "\C-c\C-q" 'reb-quit)
|
||||
(define-key map "\C-c\C-w" 'reb-copy)
|
||||
|
@ -228,43 +227,37 @@ Except for Lisp syntax this is the same as `reb-regexp'.")
|
|||
(define-key map "\C-c\C-e" 'reb-enter-subexp-mode)
|
||||
(define-key map "\C-c\C-b" 'reb-change-target-buffer)
|
||||
(define-key map "\C-c\C-u" 'reb-force-update)
|
||||
(define-key map [menu-bar reb-mode] (cons "Re-Builder" menu-map))
|
||||
(define-key menu-map [rq]
|
||||
'(menu-item "Quit" reb-quit
|
||||
:help "Quit the RE Builder mode"))
|
||||
(define-key menu-map [div1] '(menu-item "--"))
|
||||
(define-key menu-map [rt]
|
||||
'(menu-item "Case sensitive" reb-toggle-case
|
||||
:button (:toggle . (with-current-buffer
|
||||
reb-target-buffer
|
||||
(null case-fold-search)))
|
||||
:help "Toggle case sensitivity of searches for RE Builder target buffer"))
|
||||
(define-key menu-map [rb]
|
||||
'(menu-item "Change target buffer..." reb-change-target-buffer
|
||||
:help "Change the target buffer and display it in the target window"))
|
||||
(define-key menu-map [rs]
|
||||
'(menu-item "Change syntax..." reb-change-syntax
|
||||
:help "Change the syntax used by the RE Builder"))
|
||||
(define-key menu-map [div2] '(menu-item "--"))
|
||||
(define-key menu-map [re]
|
||||
'(menu-item "Enter subexpression mode" reb-enter-subexp-mode
|
||||
:help "Enter the subexpression mode in the RE Builder"))
|
||||
(define-key menu-map [ru]
|
||||
'(menu-item "Force update" reb-force-update
|
||||
:help "Force an update in the RE Builder target window without a match limit"))
|
||||
(define-key menu-map [rn]
|
||||
'(menu-item "Go to next match" reb-next-match
|
||||
:help "Go to next match in the RE Builder target window"))
|
||||
(define-key menu-map [rp]
|
||||
'(menu-item "Go to previous match" reb-prev-match
|
||||
:help "Go to previous match in the RE Builder target window"))
|
||||
(define-key menu-map [div3] '(menu-item "--"))
|
||||
(define-key menu-map [rc]
|
||||
'(menu-item "Copy current RE" reb-copy
|
||||
:help "Copy current RE into the kill ring for later insertion"))
|
||||
map)
|
||||
"Keymap used by the RE Builder.")
|
||||
|
||||
(easy-menu-define reb-mode-menu reb-mode-map
|
||||
"Menu for the RE Builder."
|
||||
'("Re-Builder"
|
||||
["Copy current RE" reb-copy
|
||||
:help "Copy current RE into the kill ring for later insertion"]
|
||||
"---"
|
||||
["Go to previous match" reb-prev-match
|
||||
:help "Go to previous match in the RE Builder target window"]
|
||||
["Go to next match" reb-next-match
|
||||
:help "Go to next match in the RE Builder target window"]
|
||||
["Force update" reb-force-update
|
||||
:help "Force an update in the RE Builder target window without a match limit"]
|
||||
["Enter subexpression mode" reb-enter-subexp-mode
|
||||
:help "Enter the subexpression mode in the RE Builder"]
|
||||
"---"
|
||||
["Change syntax..." reb-change-syntax
|
||||
:help "Change the syntax used by the RE Builder"]
|
||||
["Change target buffer..." reb-change-target-buffer
|
||||
:help "Change the target buffer and display it in the target window"]
|
||||
["Case sensitive" reb-toggle-case
|
||||
:style toggle
|
||||
:selected (with-current-buffer reb-target-buffer
|
||||
(null case-fold-search))
|
||||
:help "Toggle case sensitivity of searches for RE Builder target buffer"]
|
||||
"---"
|
||||
["Quit" reb-quit
|
||||
:help "Quit the RE Builder mode"]))
|
||||
|
||||
(define-derived-mode reb-mode nil "RE Builder"
|
||||
"Major mode for interactively building Regular Expressions."
|
||||
(setq-local blink-matching-paren nil)
|
||||
|
@ -368,7 +361,6 @@ matching parts of the target buffer will be highlighted."
|
|||
(defun reb-change-target-buffer (buf)
|
||||
"Change the target buffer and display it in the target window."
|
||||
(interactive "bSet target buffer to: ")
|
||||
|
||||
(let ((buffer (get-buffer buf)))
|
||||
(if (not buffer)
|
||||
(error "No such buffer")
|
||||
|
@ -381,7 +373,6 @@ matching parts of the target buffer will be highlighted."
|
|||
(defun reb-force-update ()
|
||||
"Force an update in the RE Builder target window without a match limit."
|
||||
(interactive)
|
||||
|
||||
(let ((reb-auto-match-limit nil))
|
||||
(reb-update-overlays
|
||||
(if reb-subexp-mode reb-subexp-displayed nil))))
|
||||
|
@ -389,7 +380,6 @@ matching parts of the target buffer will be highlighted."
|
|||
(defun reb-quit ()
|
||||
"Quit the RE Builder mode."
|
||||
(interactive)
|
||||
|
||||
(setq reb-subexp-mode nil
|
||||
reb-subexp-displayed nil)
|
||||
(reb-delete-overlays)
|
||||
|
@ -399,7 +389,6 @@ matching parts of the target buffer will be highlighted."
|
|||
(defun reb-next-match ()
|
||||
"Go to next match in the RE Builder target window."
|
||||
(interactive)
|
||||
|
||||
(reb-assert-buffer-in-window)
|
||||
(with-selected-window reb-target-window
|
||||
(if (not (re-search-forward reb-regexp (point-max) t))
|
||||
|
@ -411,7 +400,6 @@ matching parts of the target buffer will be highlighted."
|
|||
(defun reb-prev-match ()
|
||||
"Go to previous match in the RE Builder target window."
|
||||
(interactive)
|
||||
|
||||
(reb-assert-buffer-in-window)
|
||||
(with-selected-window reb-target-window
|
||||
(let ((p (point)))
|
||||
|
@ -426,7 +414,6 @@ matching parts of the target buffer will be highlighted."
|
|||
(defun reb-toggle-case ()
|
||||
"Toggle case sensitivity of searches for RE Builder target buffer."
|
||||
(interactive)
|
||||
|
||||
(with-current-buffer reb-target-buffer
|
||||
(setq case-fold-search (not case-fold-search)))
|
||||
(reb-update-modestring)
|
||||
|
@ -435,7 +422,6 @@ matching parts of the target buffer will be highlighted."
|
|||
(defun reb-copy ()
|
||||
"Copy current RE into the kill ring for later insertion."
|
||||
(interactive)
|
||||
|
||||
(reb-update-regexp)
|
||||
(let ((re (with-output-to-string
|
||||
(print (reb-target-binding reb-regexp)))))
|
||||
|
@ -503,7 +489,6 @@ Optional argument SYNTAX must be specified if called non-interactively."
|
|||
(defun reb-do-update (&optional subexp)
|
||||
"Update matches in the RE Builder target window.
|
||||
If SUBEXP is non-nil mark only the corresponding sub-expressions."
|
||||
|
||||
(reb-assert-buffer-in-window)
|
||||
(reb-update-regexp)
|
||||
(reb-update-overlays subexp))
|
||||
|
@ -541,7 +526,6 @@ optional fourth argument FORCE is non-nil."
|
|||
|
||||
(defun reb-assert-buffer-in-window ()
|
||||
"Assert that `reb-target-buffer' is displayed in `reb-target-window'."
|
||||
|
||||
(if (not (eq reb-target-buffer (window-buffer reb-target-window)))
|
||||
(set-window-buffer reb-target-window reb-target-buffer)))
|
||||
|
||||
|
@ -560,7 +544,6 @@ optional fourth argument FORCE is non-nil."
|
|||
(defun reb-display-subexp (&optional subexp)
|
||||
"Highlight only subexpression SUBEXP in the RE Builder."
|
||||
(interactive)
|
||||
|
||||
(setq reb-subexp-displayed
|
||||
(or subexp (string-to-number (format "%c" last-command-event))))
|
||||
(reb-update-modestring)
|
||||
|
@ -568,7 +551,6 @@ optional fourth argument FORCE is non-nil."
|
|||
|
||||
(defun reb-kill-buffer ()
|
||||
"When the RE Builder buffer is killed make sure no overlays stay around."
|
||||
|
||||
(when (reb-mode-buffer-p)
|
||||
(reb-delete-overlays)))
|
||||
|
||||
|
@ -600,7 +582,6 @@ optional fourth argument FORCE is non-nil."
|
|||
|
||||
(defun reb-insert-regexp ()
|
||||
"Insert current RE."
|
||||
|
||||
(let ((re (or (reb-target-binding reb-regexp)
|
||||
(reb-empty-regexp))))
|
||||
(cond ((eq reb-re-syntax 'read)
|
||||
|
@ -636,7 +617,6 @@ Return t if the (cooked) expression changed."
|
|||
;; And now the real core of the whole thing
|
||||
(defun reb-count-subexps (re)
|
||||
"Return number of sub-expressions in the regexp RE."
|
||||
|
||||
(let ((i 0) (beg 0))
|
||||
(while (string-match "\\\\(" re beg)
|
||||
(setq i (1+ i)
|
||||
|
|
|
@ -890,7 +890,7 @@ Return (REGEXP . PRECEDENCE)."
|
|||
(* (or (seq "[:" (+ (any "a-z")) ":]")
|
||||
(not (any "]"))))
|
||||
"]")
|
||||
anything
|
||||
(not (any "*+?^$[\\"))
|
||||
(seq "\\"
|
||||
(or anything
|
||||
(seq (any "sScC_") anything)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue