X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/142e26a72e9b8bbbec23c6bf7234e9f2544b5f89..22bcf2046977620a7f37bbd4dff4be4a4fffc0ed:/lisp/skeleton.el diff --git a/lisp/skeleton.el b/lisp/skeleton.el index f6fb106926..946e0a4480 100644 --- a/lisp/skeleton.el +++ b/lisp/skeleton.el @@ -1,7 +1,6 @@ ;;; skeleton.el --- Lisp language extension for writing statement skeletons -*- coding: utf-8 -*- -;; Copyright (C) 1993, 1994, 1995, 1996, 2001, 2002, 2003, -;; 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 1993-1996, 2001-2011 Free Software Foundation, Inc. ;; Author: Daniel Pfeiffer ;; Maintainer: FSF @@ -108,7 +107,7 @@ The list describes the most recent skeleton insertion, and its elements are integer buffer positions in the reverse order of the insertion order.") ;; reduce the number of compiler warnings -(defvar skeleton) +(defvar skeleton-il) (defvar skeleton-modified) (defvar skeleton-point) (defvar skeleton-regions) @@ -299,7 +298,10 @@ automatically, and you are prompted to fill in the variable parts."))) (eolp (eolp))) ;; since Emacs doesn't show main window's cursor, do something noticeable (or eolp - (open-line 1)) + ;; We used open-line before, but that can do a lot more than we want, + ;; since it runs self-insert-command. E.g. it may remove spaces + ;; before point. + (save-excursion (insert "\n"))) (unwind-protect (setq prompt (if (stringp prompt) (read-string (format prompt skeleton-subprompt) @@ -317,25 +319,26 @@ automatically, and you are prompted to fill in the variable parts."))) (signal 'quit t) prompt)) -(defun skeleton-internal-list (skeleton &optional str recursive) - (let* ((start (save-excursion (beginning-of-line) (point))) +(defun skeleton-internal-list (skeleton-il &optional str recursive) + (let* ((start (line-beginning-position)) (column (current-column)) (line (buffer-substring start (line-end-position))) opoint) (or str - (setq str `(setq str (skeleton-read ',(car skeleton) nil ,recursive)))) - (when (and (eq (cadr skeleton) '\n) (not recursive) + (setq str `(setq str + (skeleton-read ',(car skeleton-il) nil ,recursive)))) + (when (and (eq (cadr skeleton-il) '\n) (not recursive) (save-excursion (skip-chars-backward " \t") (bolp))) - (setq skeleton (cons nil (cons '> (cddr skeleton))))) + (setq skeleton-il (cons nil (cons '> (cddr skeleton-il))))) (while (setq skeleton-modified (eq opoint (point)) opoint (point) - skeleton (cdr skeleton)) + skeleton-il (cdr skeleton-il)) (condition-case quit - (skeleton-internal-1 (car skeleton) nil recursive) + (skeleton-internal-1 (car skeleton-il) nil recursive) (quit (if (eq (cdr quit) 'recursive) (setq recursive 'quit - skeleton (memq 'resume: skeleton)) + skeleton-il (memq 'resume: skeleton-il)) ;; Remove the subskeleton as far as it has been shown ;; the subskeleton shouldn't have deleted outside current line. (end-of-line) @@ -343,7 +346,7 @@ automatically, and you are prompted to fill in the variable parts."))) (insert line) (move-to-column column) (if (cdr quit) - (setq skeleton () + (setq skeleton-il () recursive nil) (signal 'quit 'recursive))))))) ;; maybe continue loop or go on to next outer resume: section @@ -351,6 +354,16 @@ automatically, and you are prompted to fill in the variable parts."))) (signal 'quit 'recursive) recursive)) +(defun skeleton-newline () + (if (or (eq (point) skeleton-point) + (eq (point) (car skeleton-positions))) + ;; If point is recorded, avoid `newline' since it may do things like + ;; strip trailing spaces, and since recorded points are commonly placed + ;; right after a trailing space, calling `newline' can destroy the + ;; position and renders the recorded position incorrect. + (insert "\n") + (newline))) + (defun skeleton-internal-1 (element &optional literal recursive) (cond ((or (integerp element) (stringp element)) @@ -358,36 +371,36 @@ automatically, and you are prompted to fill in the variable parts."))) (< element 0)) (if skeleton-untabify (backward-delete-char-untabify (- element)) - (delete-backward-char (- element))) + (delete-char element)) (insert (if (not literal) (funcall skeleton-transformation-function element) element)))) ((or (eq element '\n) ; actually (eq '\n 'n) ;; The sequence `> \n' is handled specially so as to indent the first ;; line after inserting the newline (to get the proper indentation). - (and (eq element '>) (eq (nth 1 skeleton) '\n) (pop skeleton))) + (and (eq element '>) (eq (nth 1 skeleton-il) '\n) (pop skeleton-il))) (let ((pos (if (eq element '>) (point)))) (cond - ((and skeleton-regions (eq (nth 1 skeleton) '_)) + ((and skeleton-regions (eq (nth 1 skeleton-il) '_)) (or (eolp) (newline)) (if pos (save-excursion (goto-char pos) (indent-according-to-mode))) (indent-region (line-beginning-position) (car skeleton-regions) nil)) ;; \n as last element only inserts \n if not at eol. - ((and (null (cdr skeleton)) (not recursive) (eolp)) + ((and (null (cdr skeleton-il)) (not recursive) (eolp)) (if pos (indent-according-to-mode))) (skeleton-newline-indent-rigidly (let ((pt (point))) - (newline) + (skeleton-newline) (indent-to (save-excursion (goto-char pt) (if pos (indent-according-to-mode)) (current-indentation))))) (t (if pos (reindent-then-newline-and-indent) - (newline) + (skeleton-newline) (indent-according-to-mode)))))) ((eq element '>) - (if (and skeleton-regions (eq (nth 1 skeleton) '_)) + (if (and skeleton-regions (eq (nth 1 skeleton-il) '_)) (indent-region (line-beginning-position) (car skeleton-regions) nil) (indent-according-to-mode))) @@ -396,16 +409,16 @@ automatically, and you are prompted to fill in the variable parts."))) (progn (goto-char (pop skeleton-regions)) (and (<= (current-column) (current-indentation)) - (eq (nth 1 skeleton) '\n) + (eq (nth 1 skeleton-il) '\n) (end-of-line 0))) (or skeleton-point (setq skeleton-point (point))))) ((eq element '-) (setq skeleton-point (point))) ((eq element '&) - (when skeleton-modified (pop skeleton))) + (when skeleton-modified (pop skeleton-il))) ((eq element '|) - (unless skeleton-modified (pop skeleton))) + (unless skeleton-modified (pop skeleton-il))) ((eq element '@) (push (point) skeleton-positions)) ((eq 'quote (car-safe element)) @@ -470,7 +483,7 @@ This allows for context-sensitive checking whether pairing is appropriate.") (defvar skeleton-pair-alist () - "An override alist of pairing partners matched against `last-command-char'. + "An override alist of pairing partners matched against `last-command-event'. Each alist element, which looks like (ELEMENT ...), is passed to `skeleton-insert' with no interactor. Variable `str' does nothing. @@ -504,7 +517,7 @@ symmetrical ones, and the same character twice for the others." (or (eq last-command 'mouse-drag-region) (and transient-mark-mode mark-active)))) (skeleton-end-hook) - (char last-command-char) + (char last-command-event) (skeleton (or (assq char skeleton-pair-alist) (assq char skeleton-pair-default-alist) `(,char _ ,char)))) @@ -562,5 +575,4 @@ symmetrical ones, and the same character twice for the others." (provide 'skeleton) -;; arch-tag: ccad7bd5-eb5d-40de-9ded-900197215c3e ;;; skeleton.el ends here