#include "lisp.h"
#include "buffer.h"
-#include "commands.h"
-#include "insdel.h"
#include "syntax.h"
/* Here is a comment from Ken'ichi HANDA <handa@etl.go.jp>
two such characters. */
/* Mule 2.4 doesn't seem to have Sextword - I'm removing it -- mrb */
+/* Recovered by tomo */
Lisp_Object Qsyntax_table_p;
\f
-static int
-word_constituent_p (struct buffer *buf, Bufpos pos,
- struct Lisp_Char_Table *tab)
-{
- enum syntaxcode code = SYNTAX_UNSAFE (tab, BUF_FETCH_CHAR (buf, pos));
- return ((words_include_escapes &&
- (code == Sescape || code == Scharquote))
- || (code == Sword));
-}
+#ifdef MULE
+/* Return 1 if there is a word boundary between two word-constituent
+ characters C1 and C2 if they appear in this order, else return 0.
+ There is no word boundary between two word-constituent ASCII
+ characters. */
+#define WORD_BOUNDARY_P(c1, c2) \
+ (!(CHAR_ASCII_P (c1) && CHAR_ASCII_P (c2)) \
+ && word_boundary_p (c1, c2))
+
+extern int word_boundary_p (Emchar c1, Emchar c2);
+#endif
/* Return the position across COUNT words from FROM.
If that many words cannot be found before the end of the buffer, return 0.
{
Bufpos limit = count > 0 ? BUF_ZV (buf) : BUF_BEGV (buf);
struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+ Emchar ch0, ch1;
+ enum syntaxcode code;
+
+ /* #### is it really worth it to hand expand both cases? JV */
while (count > 0)
{
QUIT;
{
if (from == limit)
return 0;
- if (word_constituent_p (buf, from, mirrortab))
+
+ ch0 = BUF_FETCH_CHAR (buf, from);
+ code = SYNTAX_UNSAFE (mirrortab, ch0);
+
+ if (words_include_escapes
+ && (code == Sescape || code == Scharquote))
+ break;
+ if (code == Sword)
break;
+
from++;
}
QUIT;
- while ((from != limit) && word_constituent_p (buf, from, mirrortab))
+ while (from != limit)
{
+ ch1 = BUF_FETCH_CHAR (buf, from);
+ code = SYNTAX_UNSAFE (mirrortab, ch1);
+ if (!(words_include_escapes
+ && (code == Sescape || code == Scharquote)))
+ if (code != Sword
+#ifdef MULE
+ || WORD_BOUNDARY_P (ch0, ch1)
+#endif
+ )
+ break;
+#ifdef MULE
+ ch0 = ch1;
+#endif
from++;
}
count--;
{
if (from == limit)
return 0;
- if (word_constituent_p (buf, from - 1, mirrortab))
+
+ ch1 = BUF_FETCH_CHAR (buf, from - 1);
+ code = SYNTAX_UNSAFE (mirrortab, ch1);
+ if (words_include_escapes
+ && (code == Sescape || code == Scharquote))
+ break;
+ if (code == Sword)
break;
+
from--;
}
QUIT;
- while ((from != limit) && word_constituent_p (buf, from - 1, mirrortab))
+ while (from != limit)
{
+ ch0 = BUF_FETCH_CHAR (buf, from - 1);
+ code = SYNTAX_UNSAFE (mirrortab, ch0);
+ if (!(words_include_escapes
+ && (code == Sescape || code == Scharquote)))
+ if (code != Sword
+#ifdef MULE
+ || WORD_BOUNDARY_P (ch0, ch1)
+#endif
+ )
+ break;
+#ifdef MULE
+ ch1 = ch0;
+#endif
from--;
}
count++;
}
DEFUN ("forward-word", Fforward_word, 1, 2, "_p", /*
-Move point forward ARG words (backward if ARG is negative).
+Move point forward COUNT words (backward if COUNT is negative).
Normally returns t.
If an edge of the buffer is reached, point is left there
and nil is returned.
+
+Optional argument BUFFER defaults to the current buffer.
*/
(count, buffer))
{
Bufpos stop;
Emchar c;
enum syntaxcode code;
- int count;
+ EMACS_INT count;
struct buffer *buf = decode_buffer (buffer, 0);
struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
if (SYNTAX_PREFIX_UNSAFE (mirrortab, c))
continue;
- switch (((quoted) ? Sword : code))
+ switch (quoted ? Sword : code)
{
case Sword:
case Ssymbol:
DEFVAR_BOOL ("parse-sexp-ignore-comments", &parse_sexp_ignore_comments /*
Non-nil means `forward-sexp', etc., should treat comments as whitespace.
*/ );
+ parse_sexp_ignore_comments = 0;
- words_include_escapes = 0;
DEFVAR_BOOL ("words-include-escapes", &words_include_escapes /*
Non-nil means `forward-word', etc., should treat escape chars part of words.
*/ );
+ words_include_escapes = 0;
no_quit_in_re_search = 0;
}
+static void
+define_standard_syntax (CONST char *p, enum syntaxcode syn)
+{
+ for (; *p; p++)
+ Fput_char_table (make_char (*p), make_int (syn), Vstandard_syntax_table);
+}
+
void
complex_vars_of_syntax (void)
{
+ Emchar i;
+ CONST char *p;
/* Set this now, so first buffer creation can refer to it. */
/* Make it nil before calling copy-syntax-table
so that copy-syntax-table will know not to try to copy from garbage */
Vstandard_syntax_table = Fcopy_syntax_table (Qnil);
staticpro (&Vstandard_syntax_table);
- Vsyntax_designator_chars_string = make_pure_string (syntax_code_spec,
- Smax, Qnil, 1);
+ Vsyntax_designator_chars_string = make_string_nocopy (syntax_code_spec,
+ Smax);
staticpro (&Vsyntax_designator_chars_string);
- fill_char_table (XCHAR_TABLE (Vstandard_syntax_table),
- make_int (Spunct));
+ fill_char_table (XCHAR_TABLE (Vstandard_syntax_table), make_int (Spunct));
- {
- Emchar i;
-
- for (i = 0; i <= 32; i++)
- Fput_char_table (make_char (i), make_int ((int) Swhitespace),
- Vstandard_syntax_table);
- for (i = 127; i <= 159; i++)
- Fput_char_table (make_char (i), make_int ((int) Swhitespace),
- Vstandard_syntax_table);
-
- for (i = 'a'; i <= 'z'; i++)
- Fput_char_table (make_char (i), make_int ((int) Sword),
- Vstandard_syntax_table);
- for (i = 'A'; i <= 'Z'; i++)
- Fput_char_table (make_char (i), make_int ((int) Sword),
- Vstandard_syntax_table);
- for (i = '0'; i <= '9'; i++)
- Fput_char_table (make_char (i), make_int ((int) Sword),
- Vstandard_syntax_table);
- Fput_char_table (make_char ('$'), make_int ((int) Sword),
+ for (i = 0; i <= 32; i++) /* Control 0 plus SPACE */
+ Fput_char_table (make_char (i), make_int (Swhitespace),
Vstandard_syntax_table);
- Fput_char_table (make_char ('%'), make_int ((int) Sword),
+ for (i = 127; i <= 159; i++) /* DEL plus Control 1 */
+ Fput_char_table (make_char (i), make_int (Swhitespace),
Vstandard_syntax_table);
+ define_standard_syntax ("abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789"
+ "$%", Sword);
+ define_standard_syntax ("\"", Sstring);
+ define_standard_syntax ("\\", Sescape);
+ define_standard_syntax ("_-+*/&|<>=", Ssymbol);
+ define_standard_syntax (".,;:?!#@~^'`", Spunct);
+
+ for (p = "()[]{}"; *p; p+=2)
{
- Fput_char_table (make_char ('('), Fcons (make_int ((int) Sopen),
- make_char (')')),
- Vstandard_syntax_table);
- Fput_char_table (make_char (')'), Fcons (make_int ((int) Sclose),
- make_char ('(')),
- Vstandard_syntax_table);
- Fput_char_table (make_char ('['), Fcons (make_int ((int) Sopen),
- make_char (']')),
- Vstandard_syntax_table);
- Fput_char_table (make_char (']'), Fcons (make_int ((int) Sclose),
- make_char ('[')),
- Vstandard_syntax_table);
- Fput_char_table (make_char ('{'), Fcons (make_int ((int) Sopen),
- make_char ('}')),
+ Fput_char_table (make_char (p[0]),
+ Fcons (make_int (Sopen), make_char (p[1])),
Vstandard_syntax_table);
- Fput_char_table (make_char ('}'), Fcons (make_int ((int) Sclose),
- make_char ('{')),
+ Fput_char_table (make_char (p[1]),
+ Fcons (make_int (Sclose), make_char (p[0])),
Vstandard_syntax_table);
}
-
- Fput_char_table (make_char ('"'), make_int ((int) Sstring),
- Vstandard_syntax_table);
- Fput_char_table (make_char ('\\'), make_int ((int) Sescape),
- Vstandard_syntax_table);
-
- {
- CONST char *p;
- for (p = "_-+*/&|<>="; *p; p++)
- Fput_char_table (make_char (*p), make_int ((int) Ssymbol),
- Vstandard_syntax_table);
-
- for (p = ".,;:?!#@~^'`"; *p; p++)
- Fput_char_table (make_char (*p), make_int ((int) Spunct),
- Vstandard_syntax_table);
- }
- }
}