]> code.delx.au - gnu-emacs/blobdiff - src/indent.c
Merge from emacs--devo--0
[gnu-emacs] / src / indent.c
index efe10bc3f781d4661ed2415772317d087e660782..c4ed2b94854a6c621fc6cece58622531c9aac6f9 100644 (file)
@@ -1,12 +1,12 @@
 /* Indentation functions.
    Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995, 1998, 2000, 2001,
-                 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+                 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -737,7 +737,9 @@ string_display_width (string, beg, end)
 DEFUN ("indent-to", Findent_to, Sindent_to, 1, 2, "NIndent to column: ",
        doc: /* Indent from point with tabs and spaces until COLUMN is reached.
 Optional second argument MINIMUM says always do at least MINIMUM spaces
-even if that goes past COLUMN; by default, MINIMUM is zero.  */)
+even if that goes past COLUMN; by default, MINIMUM is zero.
+
+The return value is COLUMN.  */)
      (column, minimum)
      Lisp_Object column, minimum;
 {
@@ -911,6 +913,7 @@ indented_beyond_p (pos, pos_byte, column)
 \f
 DEFUN ("move-to-column", Fmove_to_column, Smove_to_column, 1, 2, "p",
        doc: /* Move point to column COLUMN in the current line.
+Interactively, COLUMN is the value of prefix numeric argument.
 The column of a character is calculated by adding together the widths
 as displayed of the previous characters in the line.
 This function ignores line-continuation;
@@ -920,10 +923,10 @@ and horizontal scrolling has no effect.
 If specified column is within a character, point goes after that character.
 If it's past end of line, point goes to end of line.
 
-A non-nil second (optional) argument FORCE means,
-if COLUMN is in the middle of a tab character, change it to spaces.
-In addition, if FORCE is t, and the line is too short
-to reach column COLUMN, add spaces/tabs to get there.
+Optional second argument FORCE non-nil means if COLUMN is in the
+middle of a tab character, change it to spaces.
+In addition, if FORCE is t, and the line is too short to reach
+COLUMN, add spaces/tabs to get there.
 
 The return value is the current column.  */)
      (column, force)
@@ -950,7 +953,6 @@ The return value is the current column.  */)
   pos = PT;
   pos_byte = PT_BYTE;
   end = ZV;
-  next_boundary = pos;
 
   /* If we're starting past the desired column,
      back up to beginning of line and scan from there.  */
@@ -962,6 +964,8 @@ The return value is the current column.  */)
       col = 0;
     }
 
+  next_boundary = pos;
+
   while (pos < end)
     {
       while (pos == next_boundary)
@@ -2076,7 +2080,7 @@ whether or not it is currently displayed in some window.  */)
     {
       int it_start;
       int oselective;
-      int it_overshoot_expected_p;
+      int it_overshoot_expected;
 
       SET_TEXT_POS (pt, PT, PT_BYTE);
       start_display (&it, w, pt);
@@ -2090,10 +2094,10 @@ whether or not it is currently displayed in some window.  */)
       it_start = IT_CHARPOS (it);
 
       /* We expect the call to move_it_to, further down, to overshoot
-        if the starting point is on an image, stretch glyph, or Lisp
-        string.  We won't need to backtrack in this situation, except
-        for one corner case: when the Lisp string contains a
-        newline.  */
+        if the starting point is on an image, stretch glyph,
+        composition, or Lisp string.  We won't need to backtrack in
+        this situation, except for one corner case: when the Lisp
+        string contains a newline.  */
       if (it.method == GET_FROM_STRING)
        {
          const char *s = SDATA (it.string);
@@ -2102,11 +2106,16 @@ whether or not it is currently displayed in some window.  */)
          while (s < e && *s != '\n')
            ++s;
 
-         it_overshoot_expected_p = (s == e);
+         /* If there is no newline in the string, we need to check
+            whether there is a newline immediately after the string
+            in move_it_to below.  This may happen if there is an
+            overlay with an after-string just before the newline.  */
+         it_overshoot_expected = (s == e) ? -1 : 0;
        }
       else
-       it_overshoot_expected_p = (it.method == GET_FROM_IMAGE
-                                  || it.method == GET_FROM_STRETCH);
+       it_overshoot_expected = (it.method == GET_FROM_IMAGE
+                                || it.method == GET_FROM_STRETCH
+                                || it.method == GET_FROM_COMPOSITION);
 
       reseat_at_previous_visible_line_start (&it);
       it.current_x = it.hpos = 0;
@@ -2120,7 +2129,10 @@ whether or not it is currently displayed in some window.  */)
         truncate-lines is on and PT is beyond right margin.
         Don't go back if the overshoot is expected (see above).  */
       if (IT_CHARPOS (it) > it_start && XINT (lines) > 0
-         && !it_overshoot_expected_p)
+         && (!it_overshoot_expected
+             || (it_overshoot_expected < 0
+                 && it.method == GET_FROM_BUFFER
+                 && it.c == '\n')))
        move_it_by_lines (&it, -1, 0);
 
       it.vpos = 0;