diff src/indent.c @ 398:74fd4e045ea6 r21-2-29

Import from CVS: tag r21-2-29
author cvs
date Mon, 13 Aug 2007 11:13:30 +0200
parents cc15677e0335
children 697ef44129c6
line wrap: on
line diff
--- a/src/indent.c	Mon Aug 13 11:12:06 2007 +0200
+++ b/src/indent.c	Mon Aug 13 11:13:30 2007 +0200
@@ -40,6 +40,8 @@
 #endif
 #include "window.h"
 
+Lisp_Object Qcoerce;
+
 /* Indentation can insert tabs if this is non-zero;
    otherwise always uses spaces */
 int indent_tabs_mode;
@@ -193,6 +195,53 @@
 }
 
 int
+string_column_at_point (Lisp_String* s, Bufpos init_pos, int tab_width)
+{
+  int col;
+  int tab_seen;
+  int post_tab;
+  Bufpos pos = init_pos;
+  Emchar c;
+
+  if (tab_width <= 0 || tab_width > 1000) tab_width = 8;
+  col = tab_seen = post_tab = 0;
+
+  while (1)
+    {
+      if (pos <= 0)
+	break;
+
+      pos--;
+      c = string_char (s, pos);
+      if (c == '\t')
+	{
+	  if (tab_seen)
+	    col = ((col + tab_width) / tab_width) * tab_width;
+
+	  post_tab += col;
+	  col = 0;
+	  tab_seen = 1;
+	}
+      else if (c == '\n')
+	break;
+      else
+#ifdef MULE
+	  col += XCHARSET_COLUMNS (CHAR_CHARSET (c));
+#else
+	  col ++;
+#endif /* MULE */
+    }
+
+  if (tab_seen)
+    {
+      col = ((col + tab_width) / tab_width) * tab_width;
+      col += post_tab;
+    }
+
+  return col;
+}
+
+int
 current_column (struct buffer *buf)
 {
   if (buf == last_known_column_buffer
@@ -342,9 +391,11 @@
 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 the line
-is too short to reach column COLUMN then add spaces/tabs to get there,
-and if COLUMN is in the middle of a tab character, change it to spaces.
+A value of 'coerce for the second (optional) argument FORCE means if
+COLUMN is in the middle of a tab character, change it to spaces.
+Any other non-nil value means the same, plus if the line is too short to
+reach column COLUMN, then add spaces/tabs to get there.
+
 Returns the actual column that it moved to.
 */
        (column, force, buffer))
@@ -428,7 +479,7 @@
     }
 
   /* If line ends prematurely, add space to the end.  */
-  if (col < goal && !NILP (force))
+  if (col < goal && !NILP (force) && !EQ (force, Qcoerce))
     {
       col = goal;
       Findent_to (make_int (col), Qzero, buffer);
@@ -541,7 +592,7 @@
   assert (start <= end);
   assert (start >= 0);
   assert (end < Dynarr_length (cache));
-  
+
   vpix = 0;
   for (i = start; i <= end; i++)
     vpix += Dynarr_atp (cache, i)->height;
@@ -665,7 +716,7 @@
   if (NILP (window))
     window = Fselected_window (Qnil);
 
-  CHECK_WINDOW (window);
+  CHECK_LIVE_WINDOW (window);
   CHECK_INT (lines);
 
   selected = (EQ (window, Fselected_window (Qnil)));
@@ -681,7 +732,7 @@
   bufpos = vmotion_1 (w, orig, XINT (lines), vpos, vpix);
 
   /* Note that the buffer's point is set, not the window's point. */
-  if (selected) 
+  if (selected)
     BUF_SET_PT (XBUFFER (w->buffer), bufpos);
   else
     set_marker_restricted (w->pointm[CURRENT_DISP],
@@ -739,7 +790,7 @@
   if (NILP (window))
     window = Fselected_window (Qnil);
 
-  CHECK_WINDOW (window);
+  CHECK_LIVE_WINDOW (window);
   w = XWINDOW (window);
 
   eobuf = BUF_ZV (XBUFFER (w->buffer));
@@ -842,7 +893,7 @@
   if (NILP (window))
     window = Fselected_window (Qnil);
 
-  CHECK_WINDOW (window);
+  CHECK_LIVE_WINDOW (window);
   CHECK_INT (pixels);
 
   selected = (EQ (window, Fselected_window (Qnil)));
@@ -856,7 +907,7 @@
 
   bufpos = vmotion_pixels (window, orig, XINT (pixels), howto, &motion);
 
-  if (selected) 
+  if (selected)
     BUF_SET_PT (XBUFFER (w->buffer), bufpos);
   else
     set_marker_restricted (w->pointm[CURRENT_DISP],
@@ -879,6 +930,8 @@
 #endif
   DEFSUBR (Fvertical_motion);
   DEFSUBR (Fvertical_motion_pixels);
+
+  defsymbol (&Qcoerce, "coerce");
 }
 
 void