]> git.eshelyaron.com Git - emacs.git/commitdiff
* src/syntax.c (find_defun_start): Use syntax-ppss
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 13 Dec 2017 04:03:00 +0000 (23:03 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 13 Dec 2017 04:03:00 +0000 (23:03 -0500)
(syms_of_syntax): New variable comment-use-syntax-ppss.

etc/NEWS
src/syntax.c

index 7376fc48b31c49405ac405e1994633e4f8d4936f..bec7753d192f55085e76f36ead3ba6588c6e0be1 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -164,6 +164,12 @@ generating warnings for a decade.
 \f
 * Lisp Changes in Emacs 27.1
 
+** Internal parsing commands now use syntax-ppss and disregard
+open-paren-in-column-0-is-defun-start.  This affects mostly things like
+forward-comment, scan-sexps, and forward-sexp when parsing backward.
+The new variable 'comment-use-syntax-ppss' can be set to nil to recover the old
+behavior if needed.
+
 ---
 ** The 'file-system-info' function is now available on all platforms.
 instead of just Microsoft platforms.  This fixes a 'get-free-disk-space'
index 80603b4f8b38bee0e5b0bc84e8179f2eab9660a5..91c46f7a738ae2208b1ab9db8c8b4e36bcd23931 100644 (file)
@@ -605,6 +605,26 @@ find_defun_start (ptrdiff_t pos, ptrdiff_t pos_byte)
       && MODIFF == find_start_modiff)
     return find_start_value;
 
+  if (!NILP (Vcomment_use_syntax_ppss))
+    {
+      EMACS_INT modiffs = CHARS_MODIFF;
+      Lisp_Object ppss = call1 (Qsyntax_ppss, make_number (pos));
+      if (modiffs != CHARS_MODIFF)
+       error ("syntax-ppss modified the buffer!");
+      TEMP_SET_PT_BOTH (opoint, opoint_byte);
+      Lisp_Object boc = Fnth (make_number (8), ppss);
+      if (NUMBERP (boc))
+        {
+          find_start_value = XINT (boc);
+          find_start_value_byte = CHAR_TO_BYTE (find_start_value);
+        }
+      else
+        {
+          find_start_value = pos;
+          find_start_value_byte = pos_byte;
+        }
+      goto found;
+    }
   if (!open_paren_in_column_0_is_defun_start)
     {
       find_start_value = BEGV;
@@ -874,6 +894,7 @@ back_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
        case Sopen:
          /* Assume a defun-start point is outside of strings.  */
          if (open_paren_in_column_0_is_defun_start
+              && NILP (Vcomment_use_syntax_ppss)
              && (from == stop
                  || (temp_byte = dec_bytepos (from_byte),
                      FETCH_CHAR (temp_byte) == '\n')))
@@ -3689,6 +3710,11 @@ void
 syms_of_syntax (void)
 {
   DEFSYM (Qsyntax_table_p, "syntax-table-p");
+  DEFSYM (Qsyntax_ppss, "syntax-ppss");
+  DEFVAR_LISP ("comment-use-syntax-ppss",
+              Vcomment_use_syntax_ppss,
+              doc: /* Non-nil means `forward-comment' can use `syntax-ppss' internally.  */);
+  Vcomment_use_syntax_ppss = Qt;
 
   staticpro (&Vsyntax_code_object);