#endif
#include "window.h"
+Lisp_Object Qcoerce;
+
/* Indentation can insert tabs if this is non-zero;
otherwise always uses spaces */
int indent_tabs_mode;
+ displayed_glyphs->end_columns));
#else /* XEmacs */
#ifdef MULE
- col += XCHARSET_COLUMNS (CHAR_CHARSET (c));
+ col += CHAR_COLUMNS (c);
#else
col ++;
#endif /* MULE */
}
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 += CHAR_COLUMNS (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
\f
DEFUN ("indent-to", Findent_to, 1, 3, "NIndent to column: ", /*
Indent from point with tabs and spaces until COLUMN is reached.
-Optional second argument MIN says always do at least MIN spaces
- even if that goes past COLUMN; by default, MIN is zero.
+Optional second argument MINIMUM says always do at least MINIMUM spaces
+ even if that goes past COLUMN; by default, MINIMUM is zero.
If BUFFER is nil, the current buffer is assumed.
*/
- (col, minimum, buffer))
+ (column, minimum, buffer))
{
/* This function can GC */
int mincol;
int tab_width = XINT (buf->tab_width);
Bufpos opoint = 0;
- CHECK_INT (col);
+ CHECK_INT (column);
if (NILP (minimum))
minimum = Qzero;
else
fromcol = current_column (buf);
mincol = fromcol + XINT (minimum);
- if (mincol < XINT (col)) mincol = XINT (col);
+ if (mincol < XINT (column)) mincol = XINT (column);
if (fromcol == mincol)
return make_int (mincol);
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))
+ displayed_glyphs->end_columns));
#else /* XEmacs */
#ifdef MULE
- col += XCHARSET_COLUMNS (CHAR_CHARSET (c));
+ col += CHAR_COLUMNS (c);
#else
col ++;
#endif /* MULE */
}
/* 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);
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;
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],
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],
#endif
DEFSUBR (Fvertical_motion);
DEFSUBR (Fvertical_motion_pixels);
+
+ defsymbol (&Qcoerce, "coerce");
}
void