"*Replacement for %s in prompts of recursive subskeletons.")
-(defvar skeleton-abbrev-cleanup nil
- "Variable used to delete the character that led to abbrev expansion.")
-
-
(defvar skeleton-debug nil
"*If non-nil `define-skeleton' will override previous definition.")
(defvar skeleton-point)
(defvar skeleton-regions)
+(def-edebug-spec skeleton-edebug-spec
+ ([&or null stringp (stringp &rest stringp) [[¬ atom] def-form]]
+ &rest &or "n" "_" "-" ">" "@" "&" "!" "resume:"
+ ("quote" def-form) skeleton-edebug-spec def-form))
;;;###autoload
(defmacro define-skeleton (command documentation &rest skeleton)
"Define a user-configurable COMMAND that enters a statement skeleton.
DOCUMENTATION is that of the command.
SKELETON is as defined under `skeleton-insert'."
+ (declare (debug (&define name stringp skeleton-edebug-spec)))
(if skeleton-debug
(set command skeleton))
`(progn
(and skeleton-autowrap
(or (eq last-command 'mouse-drag-region)
(and transient-mark-mode mark-active))
- -1))
+ ;; Deactivate the mark, in case one of the
+ ;; elements of the skeleton is sensitive
+ ;; to such situations (e.g. it is itself a
+ ;; skeleton).
+ (progn (deactivate-mark)
+ -1)))
(if (stringp str)
str))
;; Return non-nil to tell expand-abbrev that expansion has happened.
;; Otherwise the no-self-insert is ignored.
t)
-;; This command isn't meant to be called, only its aliases with meaningful
-;; names are.
-;;;###autoload
-(defun skeleton-proxy (&optional str arg)
- "Insert skeleton defined by variable of same name (see `skeleton-insert').
-Prefix ARG allows wrapping around words or regions (see `skeleton-insert').
-If no ARG was given, but the region is visible, ARG defaults to -1 depending
-on `skeleton-autowrap'. An ARG of M-0 will prevent this just for once.
-This command can also be an abbrev expansion (3rd and 4th columns in
-\\[edit-abbrevs] buffer: \"\" command-name).
-
-When called as a function, optional first argument STR may also be a string
-which will be the value of `str' whereas the skeleton's interactor is then
-ignored."
- (interactive "*P\nP")
- (let ((function (nth 1 (backtrace-frame 1))))
- (if (eq function 'nth) ; uncompiled Lisp function
- (setq function (nth 1 (backtrace-frame 5)))
- (if (eq function 'byte-code) ; tracing byte-compiled function
- (setq function (nth 1 (backtrace-frame 2)))))
- (if (not (setq function (funcall skeleton-filter (symbol-value function))))
- (if (memq this-command '(self-insert-command
- skeleton-pair-insert-maybe
- expand-abbrev))
- (setq buffer-undo-list (primitive-undo 1 buffer-undo-list)))
- (skeleton-insert function
- (if (setq skeleton-abbrev-cleanup
- (or (eq this-command 'self-insert-command)
- (eq this-command
- 'skeleton-pair-insert-maybe)))
- ()
- ;; Pretend C-x a e passed its prefix arg to us
- (if (or arg current-prefix-arg)
- (prefix-numeric-value (or arg
- current-prefix-arg))
- (and skeleton-autowrap
- (or (eq last-command 'mouse-drag-region)
- (and transient-mark-mode mark-active))
- -1)))
- (if (stringp str)
- str))
- (and skeleton-abbrev-cleanup
- (setq skeleton-abbrev-cleanup (point))
- (add-hook 'post-command-hook 'skeleton-abbrev-cleanup nil t)))))
-
-
-(defun skeleton-abbrev-cleanup (&rest list)
- "Value for `post-command-hook' to remove char that expanded abbrev."
- (if (integerp skeleton-abbrev-cleanup)
- (progn
- (delete-region skeleton-abbrev-cleanup (point))
- (setq skeleton-abbrev-cleanup)
- (remove-hook 'post-command-hook 'skeleton-abbrev-cleanup t))))
-
-
;;;###autoload
(defun skeleton-insert (skeleton &optional regions str)
"Insert the complex statement skeleton SKELETON describes very concisely.
(push (point) skeleton-positions))
((eq 'quote (car-safe element))
(eval (nth 1 element)))
- ((or (stringp (car-safe element))
- (consp (car-safe element)))
+ ((and (consp element)
+ (or (stringp (car element)) (listp (car element))))
+ ;; Don't forget: `symbolp' is also true for nil.
(if (symbolp (car-safe (car element)))
- (while (skeleton-internal-list element nil t))
+ (while (and (skeleton-internal-list element nil t)
+ ;; If the interactor is nil, don't infinite loop.
+ (car element)))
(setq literal (car element))
(while literal
(skeleton-internal-list element (car literal))
Elements might be (?` ?` _ \"''\"), (?\\( ? _ \" )\") or (?{ \\n > _ \\n ?} >).")
+(defvar skeleton-pair-default-alist '((?( _ ?)) (?\))
+ (?[ _ ?]) (?\])
+ (?{ _ ?}) (?\})
+ (?< _ ?>) (?\>)
+ (?« _ ?») (?\»)
+ (?` _ ?')))
;;;###autoload
(defun skeleton-pair-insert-maybe (arg)
the defaults are used. These are (), [], {}, <> and `' for the
symmetrical ones, and the same character twice for the others."
(interactive "*P")
- (let ((mark (and skeleton-autowrap
- (or (eq last-command 'mouse-drag-region)
- (and transient-mark-mode mark-active))))
- (skeleton-end-hook))
- (if (or arg
- (not skeleton-pair)
- (memq (char-syntax (preceding-char)) '(?\\ ?/))
- (and (not mark)
- (or overwrite-mode
- (if (not skeleton-pair-on-word) (looking-at "\\w"))
- (funcall skeleton-pair-filter))))
- (self-insert-command (prefix-numeric-value arg))
- (setq last-command-char (logand last-command-char 255))
- (or skeleton-abbrev-cleanup
- (skeleton-insert
- (cons nil (or (assq last-command-char skeleton-pair-alist)
- (assq last-command-char '((?( _ ?))
- (?[ _ ?])
- (?{ _ ?})
- (?< _ ?>)
- (?` _ ?')))
- `(,last-command-char _ ,last-command-char)))
- (if mark -1))))))
+ (if (or arg (not skeleton-pair))
+ (self-insert-command (prefix-numeric-value arg))
+ (let* ((mark (and skeleton-autowrap
+ (or (eq last-command 'mouse-drag-region)
+ (and transient-mark-mode mark-active))))
+ (skeleton-end-hook)
+ (char last-command-char)
+ (skeleton (or (assq char skeleton-pair-alist)
+ (assq char skeleton-pair-default-alist)
+ `(,char _ ,char))))
+ (if (or (memq (char-syntax (preceding-char)) '(?\\ ?/))
+ (and (not mark)
+ (or overwrite-mode
+ (if (not skeleton-pair-on-word) (looking-at "\\w"))
+ (funcall skeleton-pair-filter))))
+ (self-insert-command (prefix-numeric-value arg))
+ (skeleton-insert (cons nil skeleton) (if mark -1))))))
\f
;; A more serious example can be found in sh-script.el
(provide 'skeleton)
+;;; arch-tag: ccad7bd5-eb5d-40de-9ded-900197215c3e
;;; skeleton.el ends here