X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=src%2Findent.c;h=8aebdbc705666c65f634de1e84b08a65ab299429;hp=5d97e4de5ee276e861fd8b312432c7cc3ad2fb2e;hb=716cfba952c1dc0d2cf5c968971f3780ba728a89;hpb=eea9306cd823bc2679588c209015eba3098be0ec diff --git a/src/indent.c b/src/indent.c index 5d97e4d..8aebdbc 100644 --- a/src/indent.c +++ b/src/indent.c @@ -40,6 +40,8 @@ Boston, MA 02111-1307, USA. */ #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 @@ column_at_point (struct buffer *buf, Bufpos init_pos, int cur_col) } 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 @@ 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 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 @@ Returns the actual column that it moved to. } /* 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 @@ vpix_motion (line_start_cache_dynarr *cache, int start, int end) 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; @@ -681,7 +732,7 @@ Lisp_Object vertical_motion_1 (Lisp_Object lines, Lisp_Object window, 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], @@ -856,7 +907,7 @@ that the motion should be as close as possible to PIXELS. 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 @@ syms_of_indent (void) #endif DEFSUBR (Fvertical_motion); DEFSUBR (Fvertical_motion_pixels); + + defsymbol (&Qcoerce, "coerce"); } void