annotate src/indent.c @ 4413:5a00cec8e9b0

(fill-region-as-paragraph): When we take one word after the fill column, don't stop at period with just one space. When checking whether at beginning of line, if no fill prefix, ignore intervening whitespace.
author Richard M. Stallman <rms@gnu.org>
date Mon, 02 Aug 1993 05:55:56 +0000
parents edffa4f0c5d9
children 1fc792473491
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* Indentation functions.
2961
e94a593c3952 Updated copyright years.
Jim Blandy <jimb@redhat.com>
parents: 2325
diff changeset
2 Copyright (C) 1985, 1986, 1987, 1988, 1993 Free Software Foundation, Inc.
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4 This file is part of GNU Emacs.
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 the Free Software Foundation; either version 1, or (at your option)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 any later version.
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 GNU General Public License for more details.
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21 #include "config.h"
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22 #include "lisp.h"
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23 #include "buffer.h"
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24 #include "indent.h"
764
bb24f1180bb6 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 617
diff changeset
25 #include "frame.h"
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 #include "window.h"
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 #include "termchar.h"
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28 #include "termopts.h"
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29 #include "disptab.h"
4385
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
30 #include "intervals.h"
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 /* Indentation can insert tabs if this is non-zero;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 otherwise always uses spaces */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 int indent_tabs_mode;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36 #define min(a, b) ((a) < (b) ? (a) : (b))
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37 #define max(a, b) ((a) > (b) ? (a) : (b))
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39 #define CR 015
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 /* These three values memoize the current column to avoid recalculation */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 /* Some things in set last_known_column_point to -1
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43 to mark the memoized value as invalid */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 /* Last value returned by current_column */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45 int last_known_column;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 /* Value of point when current_column was called */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47 int last_known_column_point;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48 /* Value of MODIFF when current_column was called */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49 int last_known_column_modified;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
50
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51 /* Get the display table to use for the current buffer. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53 struct Lisp_Vector *
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 buffer_display_table ()
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 Lisp_Object thisbuf;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
58 thisbuf = current_buffer->display_table;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59 if (XTYPE (thisbuf) == Lisp_Vector
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60 && XVECTOR (thisbuf)->size == DISP_TABLE_SIZE)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 return XVECTOR (thisbuf);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62 if (XTYPE (Vstandard_display_table) == Lisp_Vector
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 && XVECTOR (Vstandard_display_table)->size == DISP_TABLE_SIZE)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64 return XVECTOR (Vstandard_display_table);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65 return 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
68 DEFUN ("current-column", Fcurrent_column, Scurrent_column, 0, 0, 0,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69 "Return the horizontal position of point. Beginning of line is column 0.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70 This is calculated by adding together the widths of all the displayed\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 representations of the character between the start of the previous line\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 and point. (eg control characters will have a width of 2 or 4, tabs\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73 will have a variable width)\n\
764
bb24f1180bb6 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 617
diff changeset
74 Ignores finite width of frame, which means that this function may return\n\
bb24f1180bb6 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 617
diff changeset
75 values greater than (frame-width).\n\
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 Whether the line is visible (if `selective-display' is t) has no effect;\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 however, ^M is treated as end of line when `selective-display' is t.")
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78 ()
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80 Lisp_Object temp;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 XFASTINT (temp) = current_column ();
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 return temp;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84
327
554b1810e969 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 165
diff changeset
85 /* Cancel any recorded value of the horizontal position. */
554b1810e969 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 165
diff changeset
86
554b1810e969 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 165
diff changeset
87 invalidate_current_column ()
554b1810e969 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 165
diff changeset
88 {
554b1810e969 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 165
diff changeset
89 last_known_column_point = 0;
554b1810e969 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 165
diff changeset
90 }
554b1810e969 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 165
diff changeset
91
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92 int
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93 current_column ()
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
94 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
95 register int col;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
96 register unsigned char *ptr, *stop;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97 register int tab_seen;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
98 int post_tab;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
99 register int c;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100 register int tab_width = XINT (current_buffer->tab_width);
488
4fddd0f0fc33 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 327
diff changeset
101 int ctl_arrow = !NILP (current_buffer->ctl_arrow);
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 register struct Lisp_Vector *dp = buffer_display_table ();
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
103 int stopchar;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105 if (point == last_known_column_point
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106 && MODIFF == last_known_column_modified)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
107 return last_known_column;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
109 /* Make a pointer for decrementing through the chars before point. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
110 ptr = &FETCH_CHAR (point - 1) + 1;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 /* Make a pointer to where consecutive chars leave off,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112 going backwards from point. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 if (point == BEGV)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 stop = ptr;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115 else if (point <= GPT || BEGV > GPT)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116 stop = BEGV_ADDR;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117 else
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
118 stop = GAP_END_ADDR;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119
2325
7b5299f3a8fc (current_column, Findent_to, position_indentation):
Richard M. Stallman <rms@gnu.org>
parents: 2017
diff changeset
120 if (tab_width <= 0 || tab_width > 1000) tab_width = 8;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122 col = 0, tab_seen = 0, post_tab = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
123
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
124 while (1)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 if (ptr == stop)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 /* We stopped either for the beginning of the buffer
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 or for the gap. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130 if (ptr == BEGV_ADDR)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131 break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132 /* It was the gap. Jump back over it. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
133 stop = BEGV_ADDR;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134 ptr = GPT_ADDR;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 /* Check whether that brings us to beginning of buffer. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136 if (BEGV >= GPT) break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139 c = *--ptr;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 if (c >= 040 && c < 0177
2017
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
141 && (dp == 0 || XTYPE (DISP_CHAR_VECTOR (dp, c)) != Lisp_Vector))
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 col++;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
145 else if (c == '\n')
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146 break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 else if (c == '\r' && EQ (current_buffer->selective_display, Qt))
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148 break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
149 else if (c == '\t')
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
150 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
151 if (tab_seen)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
152 col = ((col + tab_width) / tab_width) * tab_width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
153
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
154 post_tab += col;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155 col = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156 tab_seen = 1;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157 }
2017
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
158 else if (dp != 0 && XTYPE (DISP_CHAR_VECTOR (dp, c)) == Lisp_Vector)
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
159 col += XVECTOR (DISP_CHAR_VECTOR (dp, c))->size;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160 else
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 col += (ctl_arrow && c < 0200) ? 2 : 4;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 if (tab_seen)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166 col = ((col + tab_width) / tab_width) * tab_width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167 col += post_tab;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
169
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170 last_known_column = col;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 last_known_column_point = point;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 last_known_column_modified = MODIFF;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 return col;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178 DEFUN ("indent-to", Findent_to, Sindent_to, 1, 2, "NIndent to column: ",
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 "Indent from point with tabs and spaces until COLUMN is reached.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180 Optional second argument MIN says always do at least MIN spaces\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181 even if that goes past COLUMN; by default, MIN is zero.")
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182 (col, minimum)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183 Lisp_Object col, minimum;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185 int mincol;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186 register int fromcol;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 register int tab_width = XINT (current_buffer->tab_width);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 CHECK_NUMBER (col, 0);
488
4fddd0f0fc33 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 327
diff changeset
190 if (NILP (minimum))
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191 XFASTINT (minimum) = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192 CHECK_NUMBER (minimum, 1);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
194 fromcol = current_column ();
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195 mincol = fromcol + XINT (minimum);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196 if (mincol < XINT (col)) mincol = XINT (col);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198 if (fromcol == mincol)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 return make_number (mincol);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
200
2325
7b5299f3a8fc (current_column, Findent_to, position_indentation):
Richard M. Stallman <rms@gnu.org>
parents: 2017
diff changeset
201 if (tab_width <= 0 || tab_width > 1000) tab_width = 8;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203 if (indent_tabs_mode)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
204 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205 Lisp_Object n;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206 XFASTINT (n) = mincol / tab_width - fromcol / tab_width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
207 if (XFASTINT (n) != 0)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 Finsert_char (make_number ('\t'), n);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 fromcol = (mincol / tab_width) * tab_width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
214
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
215 XFASTINT (col) = mincol - fromcol;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216 Finsert_char (make_number (' '), col);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218 last_known_column = mincol;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219 last_known_column_point = point;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220 last_known_column_modified = MODIFF;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222 XSETINT (col, mincol);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
223 return col;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
224 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226 DEFUN ("current-indentation", Fcurrent_indentation, Scurrent_indentation,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
227 0, 0, 0,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228 "Return the indentation of the current line.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 This is the horizontal position of the character\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230 following any initial whitespace.")
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231 ()
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233 Lisp_Object val;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235 XFASTINT (val) = position_indentation (find_next_newline (point, -1));
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236 return val;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 position_indentation (pos)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240 register int pos;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242 register int column = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243 register int tab_width = XINT (current_buffer->tab_width);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
244 register unsigned char *p;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
245 register unsigned char *stop;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
246
2325
7b5299f3a8fc (current_column, Findent_to, position_indentation):
Richard M. Stallman <rms@gnu.org>
parents: 2017
diff changeset
247 if (tab_width <= 0 || tab_width > 1000) tab_width = 8;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
249 stop = &FETCH_CHAR (BUFFER_CEILING_OF (pos)) + 1;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250 p = &FETCH_CHAR (pos);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251 while (1)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
252 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253 while (p == stop)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255 if (pos == ZV)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256 return column;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 pos += p - &FETCH_CHAR (pos);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258 p = &FETCH_CHAR (pos);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259 stop = &FETCH_CHAR (BUFFER_CEILING_OF (pos)) + 1;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 switch (*p++)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263 case ' ':
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264 column++;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266 case '\t':
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
267 column += tab_width - column % tab_width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268 break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 default:
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270 return column;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
272 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
273 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
274
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
275 DEFUN ("move-to-column", Fmove_to_column, Smove_to_column, 1, 2, 0,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
276 "Move point to column COLUMN in the current line.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
277 The column of a character is calculated by adding together the widths\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
278 as displayed of the previous characters in the line.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
279 This function ignores line-continuation;\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
280 there is no upper limit on the column number a character can have\n\
1208
fa662930e654 * indent.c (Fmove_to_column): Pass the right number of arguments
Jim Blandy <jimb@redhat.com>
parents: 764
diff changeset
281 and horizontal scrolling has no effect.\n\
fa662930e654 * indent.c (Fmove_to_column): Pass the right number of arguments
Jim Blandy <jimb@redhat.com>
parents: 764
diff changeset
282 \n\
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
283 If specified column is within a character, point goes after that character.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284 If it's past end of line, point goes to end of line.\n\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285 A non-nil second (optional) argument FORCE means, if the line\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286 is too short to reach column COLUMN then add spaces/tabs to get there,\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287 and if COLUMN is in the middle of a tab character, change it to spaces.")
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 (column, force)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 Lisp_Object column, force;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291 register int pos;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292 register int col = current_column ();
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293 register int goal;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294 register int end;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
295 register int tab_width = XINT (current_buffer->tab_width);
488
4fddd0f0fc33 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 327
diff changeset
296 register int ctl_arrow = !NILP (current_buffer->ctl_arrow);
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
297 register struct Lisp_Vector *dp = buffer_display_table ();
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
298
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 Lisp_Object val;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
300 int prev_col;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301 int c;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302
2325
7b5299f3a8fc (current_column, Findent_to, position_indentation):
Richard M. Stallman <rms@gnu.org>
parents: 2017
diff changeset
303 if (tab_width <= 0 || tab_width > 1000) tab_width = 8;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
304 CHECK_NATNUM (column, 0);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
305 goal = XINT (column);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
306
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
307 retry:
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
308 pos = point;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309 end = ZV;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311 /* If we're starting past the desired column,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 back up to beginning of line and scan from there. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
313 if (col > goal)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
315 pos = find_next_newline (pos, -1);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
316 col = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 while (col < goal && pos < end)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
320 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
321 c = FETCH_CHAR (pos);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
322 if (c == '\n')
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
323 break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
324 if (c == '\r' && EQ (current_buffer->selective_display, Qt))
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
325 break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
326 pos++;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
327 if (c == '\t')
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
328 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
329 prev_col = col;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
330 col += tab_width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
331 col = col / tab_width * tab_width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
332 }
2017
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
333 else if (dp != 0 && XTYPE (DISP_CHAR_VECTOR (dp, c)) == Lisp_Vector)
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
334 col += XVECTOR (DISP_CHAR_VECTOR (dp, c))->size;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
335 else if (ctl_arrow && (c < 040 || c == 0177))
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
336 col++;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
337 else if (c < 040 || c >= 0177)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
338 col += 3;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
339 else
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
340 col++;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
341 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
342
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
343 SET_PT (pos);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
344
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
345 /* If a tab char made us overshoot, change it to spaces
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
346 and scan through it again. */
488
4fddd0f0fc33 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 327
diff changeset
347 if (!NILP (force) && col > goal && c == '\t' && prev_col < goal)
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
348 {
573
f0ffd1764382 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 543
diff changeset
349 int old_point;
f0ffd1764382 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 543
diff changeset
350
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
351 del_range (point - 1, point);
573
f0ffd1764382 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 543
diff changeset
352 Findent_to (make_number (goal), Qnil);
f0ffd1764382 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 543
diff changeset
353 old_point = point;
f0ffd1764382 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 543
diff changeset
354 Findent_to (make_number (col), Qnil);
f0ffd1764382 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 543
diff changeset
355 SET_PT (old_point);
4385
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
356 /* Set the last_known... vars consistently. */
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
357 col = goal;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
358 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
359
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
360 /* If line ends prematurely, add space to the end. */
488
4fddd0f0fc33 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 327
diff changeset
361 if (col < goal && !NILP (force))
1208
fa662930e654 * indent.c (Fmove_to_column): Pass the right number of arguments
Jim Blandy <jimb@redhat.com>
parents: 764
diff changeset
362 Findent_to (make_number (col = goal), Qnil);
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
363
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
364 last_known_column = col;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
365 last_known_column_point = point;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
366 last_known_column_modified = MODIFF;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
367
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
368 XFASTINT (val) = col;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369 return val;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
370 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372 struct position val_compute_motion;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374 /* Scan the current buffer forward from offset FROM, pretending that
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375 this is at line FROMVPOS, column FROMHPOS, until reaching buffer
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
376 offset TO or line TOVPOS, column TOHPOS (whichever comes first),
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
377 and return the ending buffer position and screen location.
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
378
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
379 WIDTH is the number of columns available to display text;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
380 compute_motion uses this to handle continuation lines and such.
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
381 HSCROLL is the number of columns not being displayed at the left
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
382 margin; this is usually taken from a window's hscroll member.
543
937bccff8155 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 526
diff changeset
383 TAB_OFFSET is the number of columns of the first tab that aren't
937bccff8155 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 526
diff changeset
384 being displayed, perhaps because of a continuation line or
937bccff8155 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 526
diff changeset
385 something.
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
386
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
387 compute_motion returns a pointer to a struct position. The bufpos
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
388 member gives the buffer position at the end of the scan, and hpos
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
389 and vpos give its cartesian location. I'm not clear on what the
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
390 other members are.
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
391
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
392 For example, to find the buffer position of column COL of line LINE
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
393 of a certain window, pass the window's starting location as FROM
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
394 and the window's upper-left coordinates as FROMVPOS and FROMHPOS.
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
395 Pass the buffer's ZV as TO, to limit the scan to the end of the
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
396 visible section of the buffer, and pass LINE and COL as TOVPOS and
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
397 TOHPOS.
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
398
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
399 When displaying in window w, a typical formula for WIDTH is:
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
400
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
401 window_width - 1
1994
73ce9dd21093 Use the term `scroll bar', instead of `scrollbar'.
Jim Blandy <jimb@redhat.com>
parents: 1777
diff changeset
402 - (has_vertical_scroll_bars
73ce9dd21093 Use the term `scroll bar', instead of `scrollbar'.
Jim Blandy <jimb@redhat.com>
parents: 1777
diff changeset
403 ? VERTICAL_SCROLL_BAR_WIDTH
1777
4edfaa19c7a7 * window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents: 1208
diff changeset
404 : (window_width + window_left != frame_width))
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
405
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
406 where
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
407 window_width is XFASTINT (w->width),
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
408 window_left is XFASTINT (w->left),
1994
73ce9dd21093 Use the term `scroll bar', instead of `scrollbar'.
Jim Blandy <jimb@redhat.com>
parents: 1777
diff changeset
409 has_vertical_scroll_bars is
73ce9dd21093 Use the term `scroll bar', instead of `scrollbar'.
Jim Blandy <jimb@redhat.com>
parents: 1777
diff changeset
410 FRAME_HAS_VERTICAL_SCROLL_BARS (XFRAME (WINDOW_FRAME (window)))
1777
4edfaa19c7a7 * window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents: 1208
diff changeset
411 and frame_width = FRAME_WIDTH (XFRAME (window->frame))
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
412
1777
4edfaa19c7a7 * window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents: 1208
diff changeset
413 Or,
4edfaa19c7a7 * window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents: 1208
diff changeset
414 window_internal_width (w) - 1
4edfaa19c7a7 * window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents: 1208
diff changeset
415
4edfaa19c7a7 * window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents: 1208
diff changeset
416 The `-1' accounts for the continuation-line backslashes; the rest
4edfaa19c7a7 * window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents: 1208
diff changeset
417 accounts for window borders if the window is split vertically, and
1994
73ce9dd21093 Use the term `scroll bar', instead of `scrollbar'.
Jim Blandy <jimb@redhat.com>
parents: 1777
diff changeset
418 the scroll bars if the frame supports them. */
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
419
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
420 struct position *
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
421 compute_motion (from, fromvpos, fromhpos, to, tovpos, tohpos, width, hscroll, tab_offset)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
422 int from, fromvpos, fromhpos, to, tovpos, tohpos;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
423 register int width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
424 int hscroll, tab_offset;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
425 {
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
426 register int hpos = fromhpos;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
427 register int vpos = fromvpos;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
428
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
429 register int pos;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
430 register int c;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
431 register int tab_width = XFASTINT (current_buffer->tab_width);
488
4fddd0f0fc33 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 327
diff changeset
432 register int ctl_arrow = !NILP (current_buffer->ctl_arrow);
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
433 register struct Lisp_Vector *dp = buffer_display_table ();
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
434 int selective
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
435 = XTYPE (current_buffer->selective_display) == Lisp_Int
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
436 ? XINT (current_buffer->selective_display)
488
4fddd0f0fc33 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 327
diff changeset
437 : !NILP (current_buffer->selective_display) ? -1 : 0;
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
438 int prev_vpos, prev_hpos;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
439 int selective_rlen
2017
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
440 = (selective && dp && XTYPE (DISP_INVIS_VECTOR (dp)) == Lisp_Vector
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
441 ? XVECTOR (DISP_INVIS_VECTOR (dp))->size : 0);
4385
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
442 #ifdef USE_TEXT_PROPERTIES
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
443 /* The next location where the `invisible' property changes */
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
444 int next_invisible = from;
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
445 Lisp_Object prop, position;
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
446 #endif
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
447
2325
7b5299f3a8fc (current_column, Findent_to, position_indentation):
Richard M. Stallman <rms@gnu.org>
parents: 2017
diff changeset
448 if (tab_width <= 0 || tab_width > 1000) tab_width = 8;
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
449 for (pos = from; pos < to; pos++)
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
450 {
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
451 /* Stop if past the target screen position. */
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
452 if (vpos > tovpos
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
453 || (vpos == tovpos && hpos >= tohpos))
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
454 break;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
455
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
456 prev_vpos = vpos;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
457 prev_hpos = hpos;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
458
4385
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
459 #ifdef USE_TEXT_PROPERTIES
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
460 /* if the `invisible' property is set, we can skip to
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
461 the next property change */
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
462 while (pos == next_invisible && pos < to)
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
463 {
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
464 XFASTINT (position) = pos;
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
465 prop = Fget_text_property (position,
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
466 Qinvisible,
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
467 Fcurrent_buffer ());
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
468 {
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
469 Lisp_Object end;
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
470
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
471 end = Fnext_single_property_change (position,
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
472 Qinvisible,
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
473 Fcurrent_buffer ());
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
474 if (INTEGERP (end))
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
475 next_invisible = XINT (end);
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
476 else
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
477 next_invisible = to;
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
478 if (! NILP (prop))
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
479 pos = next_invisible;
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
480 }
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
481 }
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
482 if (pos >= to)
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
483 break;
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
484 #endif
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
485 c = FETCH_CHAR (pos);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
486 if (c >= 040 && c < 0177
2017
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
487 && (dp == 0 || XTYPE (DISP_CHAR_VECTOR (dp, c)) != Lisp_Vector))
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
488 hpos++;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
489 else if (c == '\t')
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
490 {
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
491 hpos += tab_width - ((hpos + tab_offset + hscroll - (hscroll > 0)
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
492 /* Add tab_width here to make sure positive.
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
493 hpos can be negative after continuation
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
494 but can't be less than -tab_width. */
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
495 + tab_width)
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
496 % tab_width);
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
497 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
498 else if (c == '\n')
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
499 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
500 if (selective > 0 && position_indentation (pos + 1) >= selective)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
501 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
502 /* Skip any number of invisible lines all at once */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
503 do
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
504 {
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
505 while (++pos < to && FETCH_CHAR (pos) != '\n');
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
506 }
614
0085dcbad4bd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 573
diff changeset
507 while (pos < to && position_indentation (pos + 1) >= selective);
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
508 pos--;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
509 /* Allow for the " ..." that is displayed for them. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
510 if (selective_rlen)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
511 {
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
512 hpos += selective_rlen;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
513 if (hpos >= width)
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
514 hpos = width;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
515 }
614
0085dcbad4bd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 573
diff changeset
516 /* We have skipped the invis text, but not the newline after. */
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
517 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
518 else
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
519 {
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
520 /* A visible line. */
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
521 vpos++;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
522 hpos = 0;
617
cde1f15848c6 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 614
diff changeset
523 hpos -= hscroll;
cde1f15848c6 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 614
diff changeset
524 if (hscroll > 0) hpos++; /* Count the ! on column 0 */
cde1f15848c6 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 614
diff changeset
525 tab_offset = 0;
cde1f15848c6 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 614
diff changeset
526 }
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
527 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
528 else if (c == CR && selective < 0)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
529 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
530 /* In selective display mode,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
531 everything from a ^M to the end of the line is invisible */
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
532 while (pos < to && FETCH_CHAR (pos) != '\n') pos++;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
533 /* Stop *before* the real newline. */
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
534 pos--;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
535 /* Allow for the " ..." that is displayed for them. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
536 if (selective_rlen)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
537 {
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
538 hpos += selective_rlen;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
539 if (hpos >= width)
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
540 hpos = width;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
541 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
542 }
2017
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
543 else if (dp != 0 && XTYPE (DISP_CHAR_VECTOR (dp, c)) == Lisp_Vector)
ffa43acb7de7 (current_column, Fmove_to_column, compute_motion):
Richard M. Stallman <rms@gnu.org>
parents: 1994
diff changeset
544 hpos += XVECTOR (DISP_CHAR_VECTOR (dp, c))->size;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
545 else
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
546 hpos += (ctl_arrow && c < 0200) ? 2 : 4;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
547
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
548 /* Handle right margin. */
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
549 if (hpos >= width
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
550 && (hpos > width
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
551 || (pos < ZV - 1
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
552 && FETCH_CHAR (pos + 1) != '\n')))
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
553 {
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
554 if (vpos > tovpos
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
555 || (vpos == tovpos && hpos >= tohpos))
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
556 break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
557 if (hscroll
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
558 || (truncate_partial_width_windows
764
bb24f1180bb6 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 617
diff changeset
559 && width + 1 < FRAME_WIDTH (selected_frame))
488
4fddd0f0fc33 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 327
diff changeset
560 || !NILP (current_buffer->truncate_lines))
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
561 {
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
562 /* Truncating: skip to newline. */
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
563 while (pos < to && FETCH_CHAR (pos) != '\n') pos++;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
564 pos--;
614
0085dcbad4bd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 573
diff changeset
565 hpos = width;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
566 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
567 else
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
568 {
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
569 /* Continuing. */
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
570 vpos++;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
571 hpos -= width;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
572 tab_offset += width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
573 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
574
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
575 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
576 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
577
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
578 val_compute_motion.bufpos = pos;
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
579 val_compute_motion.hpos = hpos;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
580 val_compute_motion.vpos = vpos;
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
581 val_compute_motion.prevhpos = prev_hpos;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
582
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
583 /* Nonzero if have just continued a line */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
584 val_compute_motion.contin
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
585 = (pos != from
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
586 && (val_compute_motion.vpos != prev_vpos)
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
587 && c != '\n');
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
588
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
589 return &val_compute_motion;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
590 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
591
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
592
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
593 /* Return the column of position POS in window W's buffer,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
594 rounded down to a multiple of the internal width of W.
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
595 This is the amount of indentation of position POS
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
596 that is not visible in its horizontal position in the window. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
597
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
598 int
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
599 pos_tab_offset (w, pos)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
600 struct window *w;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
601 register int pos;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
602 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
603 int opoint = point;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
604 int col;
1777
4edfaa19c7a7 * window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents: 1208
diff changeset
605 int width = window_internal_width (w) - 1;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
606
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
607 if (pos == BEGV || FETCH_CHAR (pos - 1) == '\n')
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
608 return 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
609 SET_PT (pos);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
610 col = current_column ();
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
611 SET_PT (opoint);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
612 return col - (col % width);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
613 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
614
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
615 /* start_hpos is the hpos of the first character of the buffer:
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
616 zero except for the minibuffer window,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
617 where it is the width of the prompt. */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
618
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
619 struct position val_vmotion;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
620
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
621 struct position *
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
622 vmotion (from, vtarget, width, hscroll, window)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
623 register int from, vtarget, width;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
624 int hscroll;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
625 Lisp_Object window;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
626 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
627 struct position pos;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
628 /* vpos is cumulative vertical position, changed as from is changed */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
629 register int vpos = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
630 register int prevline;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
631 register int first;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
632 int lmargin = hscroll > 0 ? 1 - hscroll : 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
633 int selective
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
634 = XTYPE (current_buffer->selective_display) == Lisp_Int
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
635 ? XINT (current_buffer->selective_display)
488
4fddd0f0fc33 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 327
diff changeset
636 : !NILP (current_buffer->selective_display) ? -1 : 0;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
637 int start_hpos = (EQ (window, minibuf_window) ? minibuf_prompt_width : 0);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
638
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
639 retry:
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
640 if (vtarget > vpos)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
641 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
642 /* Moving downward is simple, but must calculate from beg of line
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
643 to determine hpos of starting point */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
644 if (from > BEGV && FETCH_CHAR (from - 1) != '\n')
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
645 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
646 prevline = find_next_newline (from, -1);
4385
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
647 while (prevline > BEGV
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
648 && ((selective > 0
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
649 && position_indentation (prevline) >= selective)
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
650 #ifdef USE_TEXT_PROPERTIES
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
651 /* watch out for newlines with `invisible' property */
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
652 || ! NILP (Fget_text_property (XFASTINT (prevline),
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
653 Qinvisible,
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
654 Fcurrent_buffer ()))
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
655 #endif
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
656 ))
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
657 prevline = find_next_newline (prevline - 1, -1);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
658 pos = *compute_motion (prevline, 0,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
659 lmargin + (prevline == 1 ? start_hpos : 0),
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
660 from, 1 << (INTBITS - 2), 0,
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
661 width, hscroll, 0);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
662 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
663 else
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
664 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
665 pos.hpos = lmargin + (from == 1 ? start_hpos : 0);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
666 pos.vpos = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
667 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
668 return compute_motion (from, vpos, pos.hpos,
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
669 ZV, vtarget, - (1 << (INTBITS - 2)),
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
670 width, hscroll, pos.vpos * width);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
671 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
672
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
673 /* To move upward, go a line at a time until
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
674 we have gone at least far enough */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
675
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
676 first = 1;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
677
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
678 while ((vpos > vtarget || first) && from > BEGV)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
679 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
680 prevline = from;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
681 while (1)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
682 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
683 prevline = find_next_newline (prevline - 1, -1);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
684 if (prevline == BEGV
4385
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
685 || ((selective <= 0
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
686 || position_indentation (prevline) < selective)
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
687 #ifdef USE_TEXT_PROPERTIES
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
688 /* watch out for newlines with `invisible' property */
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
689 && NILP (Fget_text_property (XFASTINT (prevline),
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
690 Qinvisible,
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
691 Fcurrent_buffer ()))
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
692 #endif
edffa4f0c5d9 (compute_motion): Compute correctly for invisible text.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
693 ))
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
694 break;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
695 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
696 pos = *compute_motion (prevline, 0,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
697 lmargin + (prevline == 1 ? start_hpos : 0),
526
a41500eed1c5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 488
diff changeset
698 from, 1 << (INTBITS - 2), 0,
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
699 width, hscroll, 0);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
700 vpos -= pos.vpos;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
701 first = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
702 from = prevline;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
703 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
704
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
705 /* If we made exactly the desired vertical distance,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
706 or if we hit beginning of buffer,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
707 return point found */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
708 if (vpos >= vtarget)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
709 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
710 val_vmotion.bufpos = from;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
711 val_vmotion.vpos = vpos;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
712 val_vmotion.hpos = lmargin;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
713 val_vmotion.contin = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
714 val_vmotion.prevhpos = 0;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
715 return &val_vmotion;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
716 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
717
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
718 /* Otherwise find the correct spot by moving down */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
719 goto retry;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
720 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
721
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
722 DEFUN ("vertical-motion", Fvertical_motion, Svertical_motion, 1, 1, 0,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
723 "Move to start of screen line LINES lines down.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
724 If LINES is negative, this is moving up.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
725 Sets point to position found; this may be start of line\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
726 or just the start of a continuation line.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
727 Returns number of lines moved; may be closer to zero than LINES\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
728 if beginning or end of buffer was reached.")
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
729 (lines)
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
730 Lisp_Object lines;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
731 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
732 struct position pos;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
733 register struct window *w = XWINDOW (selected_window);
1777
4edfaa19c7a7 * window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents: 1208
diff changeset
734 int width = window_internal_width (w) - 1;
165
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
735
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
736 CHECK_NUMBER (lines, 0);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
737
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
738 pos = *vmotion (point, XINT (lines), width,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
739 /* Not XFASTINT since perhaps could be negative */
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
740 XINT (w->hscroll), selected_window);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
741
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
742 SET_PT (pos.bufpos);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
743 return make_number (pos.vpos);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
744 }
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
745
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
746 syms_of_indent ()
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
747 {
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
748 DEFVAR_BOOL ("indent-tabs-mode", &indent_tabs_mode,
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
749 "*Indentation can insert tabs if this is non-nil.\n\
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
750 Setting this variable automatically makes it local to the current buffer.");
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
751 indent_tabs_mode = 1;
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
752
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
753 defsubr (&Scurrent_indentation);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
754 defsubr (&Sindent_to);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
755 defsubr (&Scurrent_column);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
756 defsubr (&Smove_to_column);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
757 defsubr (&Svertical_motion);
ee44492a4419 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
758 }