(mark_window_display_accurate_1): New function,
[bpt/emacs.git] / lisp / skeleton.el
index 7e29eb6..45a43eb 100644 (file)
@@ -60,11 +60,16 @@ We will probably delete this variable in a future Emacs version
 unless we get a substantial number of complaints about the auto-wrap
 feature.")
 
+(defvar skeleton-end-newline t
+  "If non-nil, make sure that the skeleton inserted ends with a newline.
+This just influences the way the default `skeleton-end-hook' behaves.")
+
 (defvar skeleton-end-hook
   (lambda ()
-    (or (eolp) (newline-and-indent)))
+    (or (eolp) (not skeleton-end-newline) (newline-and-indent)))
   "Hook called at end of skeleton but before going to point of interest.
-By default this moves out anything following to next line.
+By default this moves out anything following to next line,
+  unless `skeleton-end-newline' is set to nil.
 The variables `v1' and `v2' are still set when calling this.")
 
 
@@ -256,7 +261,7 @@ If ELEMENT is a string or a character it gets inserted (see also
 `skeleton-transformation').  Other possibilities are:
 
        \\n     go to next line and indent according to mode
-       _       interesting point, interregion here, point after termination
+       _       interesting point, interregion here
        >       indent line (or interregion if > _) according to major mode
        @       add position to `skeleton-positions'
        &       do next ELEMENT if previous moved point
@@ -265,6 +270,9 @@ If ELEMENT is a string or a character it gets inserted (see also
        resume: skipped, continue here if quit is signaled
        nil     skipped
 
+After termination, point will be positioned at the first occurrence
+of _ or @ or at the end of the inserted text.
+
 Further elements can be defined via `skeleton-further-elements'.  ELEMENT may
 itself be a SKELETON with an INTERACTOR.  The user is prompted repeatedly for
 different inputs.  The SKELETON is processed as often as the user enters a
@@ -375,6 +383,9 @@ automatically, and you are prompted to fill in the variable parts.")))
         opoint)
     (or str
        (setq str `(setq str (skeleton-read ',(car skeleton) nil ,recursive))))
+    (when (and (eq (car skeleton) '\n)
+              (save-excursion (beginning-of-line) (looking-at "[ \t]*$")))
+      (setq skeleton (cons '> (cdr skeleton))))
     (while (setq skeleton-modified (eq opoint (point))
                 opoint (point)
                 skeleton (cdr skeleton))
@@ -412,20 +423,18 @@ automatically, and you are prompted to fill in the variable parts.")))
                                      (funcall skeleton-transformation element)
                                    element))))
        ((eq element '\n)               ; actually (eq '\n 'n)
-        (if (and skeleton-regions
-                 (eq (nth 1 skeleton) '_))
-            (progn
-              (or (eolp)
-                  (newline))
-              (indent-region (point) (car skeleton-regions) nil))
-          (if skeleton-newline-indent-rigidly
-              (indent-to (prog1 (current-indentation)
-                           (newline)))
-            (newline)
-            (indent-according-to-mode))))
+        (cond
+         ((and skeleton-regions (eq (nth 1 skeleton) '_))
+          (or (eolp) (newline))
+          (indent-region (line-beginning-position)
+                         (car skeleton-regions) nil))
+         ;; \n as last element only inserts \n if not at eol.
+         ((and (null (cdr skeleton)) (eolp)) nil)
+         (skeleton-newline-indent-rigidly
+          (indent-to (prog1 (current-indentation) (newline))))
+         (t (newline) (indent-according-to-mode))))
        ((eq element '>)
-        (if (and skeleton-regions
-                 (eq (nth 1 skeleton) '_))
+        (if (and skeleton-regions (eq (nth 1 skeleton) '_))
             (indent-region (line-beginning-position)
                            (car skeleton-regions) nil)
           (indent-according-to-mode)))
@@ -440,13 +449,12 @@ automatically, and you are prompted to fill in the variable parts.")))
           (or skeleton-point
               (setq skeleton-point (point)))))
        ((eq element '&)
-        (if skeleton-modified
-            (setq skeleton (cdr skeleton))))
+        (when skeleton-modified (pop skeleton)))
        ((eq element '|)
-        (or skeleton-modified
-            (setq skeleton (cdr skeleton))))
+        (unless skeleton-modified (pop skeleton)))
        ((eq element '@)
-        (setq skeleton-positions (cons (point) skeleton-positions)))
+        (push (point) skeleton-positions)
+        (unless skeleton-point (setq skeleton-point (point))))
        ((eq 'quote (car-safe element))
         (eval (nth 1 element)))
        ((or (stringp (car-safe element))