On Wed, Jan 2, 2013 at 6:31 PM, GM <[email protected]> wrote:
> Greetings vim-dev,
>
> I have a patch I would like to submit to fix a bug in vim.
>

[...]

Probably should have also submitted the patch as a text file...

Best regards,
Archer

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
--- a/src/search.c      Sun Dec 16 
+++ b/src/search.c      Wed Jan 02 
@@ -20,6 +20,7 @@
 static int check_prevcol __ARGS((char_u *linep, int col, int ch, int 
*prevcol));
 static int inmacro __ARGS((char_u *, char_u *));
 static int check_linecomment __ARGS((char_u *line));
+static int check_hashcomment __ARGS((char_u *line));
 static int cls __ARGS((void));
 static int skip_chars __ARGS((int, int));
 #ifdef FEAT_TEXTOBJ
@@ -1751,6 +1752,8 @@
     int                match_escaped = 0;      /* search for escaped match */
     int                dir;                    /* Direction to search */
     int                comment_col = MAXCOL;   /* start of / / comment */
+    int                hashcomment_col = MAXCOL;   /* start of # comment */
+    int     start_in_comment;   /* start position is in a comment */
 #ifdef FEAT_LISP
     int                lispcomm = FALSE;       /* inside of Lisp-style comment 
*/
     int                lisp = curbuf->b_p_lisp; /* engage Lisp-specific hacks 
;) */
@@ -2018,6 +2021,12 @@
 
     do_quotes = -1;
     start_in_quotes = MAYBE;
+    // If we start in a line comment or hash comment, then we know for a fact 
that we are in comments.
+    // Otherwise we don't know - we may or may not be in a block comment.
+    if( check_linecomment( linep ) < pos.col || check_hashcomment( linep ) < 
pos.col )
+        start_in_comment = TRUE;
+    else
+        start_in_comment = MAYBE;
     clearpos(&match_pos);
 
     /* backward search: Check if this line contains a single-line comment */
@@ -2249,6 +2258,48 @@
        if (start_in_quotes == MAYBE)
            start_in_quotes = FALSE;
 
+    /* 
+     * If we find the start of a block comment, set match_pos to
+     *     our position.  Clear match_pos if we find the end of
+     *     the block comment.
+     *
+     * Once we find the start or end of a block comment, we also 
+     *     know for a fact whether or not we started in a comment.
+     *     ( If we were not yet sure... )
+     */
+    if( backwards )
+    {
+        if( linep[pos.col] == '/' && linep[pos.col+1] == '*' )
+        {
+            clearpos(&match_pos);
+            if( start_in_comment == MAYBE )
+                start_in_comment = TRUE;
+        }
+        else if( linep[pos.col] == '*' && linep[pos.col+1] == '/' )
+        {
+            match_pos.lnum = pos.lnum;
+            match_pos.col = pos.col;
+            if( start_in_comment == MAYBE )
+                start_in_comment = FALSE;
+        }
+    }
+    else
+    {
+        if( linep[pos.col] == '/' && linep[pos.col+1] == '*' )
+        {
+            match_pos.lnum = pos.lnum;
+            match_pos.col = pos.col;
+            if( start_in_comment == MAYBE )
+                start_in_comment = FALSE;
+        }
+        else if( linep[pos.col] == '*' && linep[pos.col+1] == '/' )
+        {
+            clearpos(&match_pos);
+            if( start_in_comment == MAYBE )
+                start_in_comment = TRUE;
+        }
+    }
+
        /*
         * If 'smartmatch' is set:
         *   Things inside quotes are ignored by setting 'inquote'.  If we
@@ -2260,6 +2311,8 @@
         *   inquote if the number of quotes in a line is even, unless this
         *   line or the previous one ends in a '\'.  Complicated, isn't it?
         */
+    comment_col = check_linecomment( linep );
+    hashcomment_col = check_hashcomment( linep );
        switch (c = linep[pos.col])
        {
        case NUL:
@@ -2363,14 +2416,17 @@
                 * is what we expect. */
                if (cpo_bsl || (bslcnt & 1) == match_escaped)
                {
-                   if (c == initc)
-                       count++;
-                   else
-                   {
-                       if (count == 0)
-                           return &pos;
-                       count--;
-                   }
+            if( ( pos.col < comment_col && pos.col < hashcomment_col && 
match_pos.lnum == 0 && match_pos.col == 0 && start_in_comment != TRUE ) || ( 
start_in_comment == TRUE ) )
+            {
+                if (c == initc)
+                    count++;
+                else
+                {
+                    if (count == 0)
+                        return &pos;
+                    count--;
+                }
+            }
                }
            }
        }
@@ -2445,6 +2501,28 @@
 }
 
 /*
+ * Check if line[] contains a hash comment (a comment starting with #).
+ *    Example:
+ *       # This is a comment.
+ * Return MAXCOL if not, otherwise return the column.
+ * TODO: skip strings.
+ */
+    static int
+check_hashcomment(line)
+    char_u     *line;
+{
+    char_u  *p;
+
+    p = line;
+
+    p = vim_strchr( p, '#' );
+
+    if( p == NULL )
+       return MAXCOL;
+    return (int)(p - line);
+}
+
+/*
  * Move cursor briefly to character matching the one under the cursor.
  * Used for Insert mode and "r" command.
  * Show the match only if it is visible on the screen.

Raspunde prin e-mail lui