#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 (struct 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
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;
if (NILP (window))
window = Fselected_window (Qnil);
- CHECK_WINDOW (window);
+ CHECK_LIVE_WINDOW (window);
CHECK_INT (lines);
selected = (EQ (window, Fselected_window (Qnil)));
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],
if (NILP (window))
window = Fselected_window (Qnil);
- CHECK_WINDOW (window);
+ CHECK_LIVE_WINDOW (window);
w = XWINDOW (window);
eobuf = BUF_ZV (XBUFFER (w->buffer));
if (NILP (window))
window = Fselected_window (Qnil);
- CHECK_WINDOW (window);
+ CHECK_LIVE_WINDOW (window);
CHECK_INT (pixels);
selected = (EQ (window, Fselected_window (Qnil)));
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