Patch 8.0.0431
Problem:    'cinoptions' cannot set indent for extern block.
Solution:   Add the "E" flag in 'cinoptions'. (Hirohito Higashi)
Files:      runtime/doc/indent.txt, src/misc1.c, src/structs.h,
            src/testdir/test_cindent.vim


*** ../vim-8.0.0430/runtime/doc/indent.txt      2016-09-12 12:45:26.000000000 
+0200
--- runtime/doc/indent.txt      2017-03-08 21:34:43.061320700 +0100
***************
*** 325,330 ****
--- 325,345 ----
                      void function();       void function();
                  }                          }
  <
+                                                       *cino-E*
+       EN    Indent inside C++ linkage specifications (extern "C" or
+             extern "C++") N characters extra compared to a normal block.
+             (default 0).
+ 
+               cino=                      cino=E-s >
+                 extern "C" {               extern "C" {
+                     void function();       void function();
+                 }                          }
+ 
+                 extern "C"                 extern "C"
+                 {                          {
+                     void function();       void function();
+                 }                          }
+ <
                                                        *cino-p*
        pN    Parameter declarations for K&R-style function declarations will
              be indented N characters from the margin.  (default
***************
*** 554,560 ****
  
  
  The defaults, spelled out in full, are:
!       cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,ps,ts,is,+s,
                        c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0
  
  Vim puts a line in column 1 if:
--- 569,575 ----
  
  
  The defaults, spelled out in full, are:
!       cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,E0,ps,ts,is,+s,
                        c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0
  
  Vim puts a line in column 1 if:
*** ../vim-8.0.0430/src/misc1.c 2017-03-05 19:43:44.545127347 +0100
--- src/misc1.c 2017-03-08 21:34:43.065320672 +0100
***************
*** 5810,5815 ****
--- 5810,5863 ----
  }
  
  /*
+  * Recognize a `extern "C"` or `extern "C++"` linkage specifications.
+  */
+     static int
+ cin_is_cpp_extern_c(char_u *s)
+ {
+     char_u    *p;
+     int               has_string_literal = FALSE;
+ 
+     s = cin_skipcomment(s);
+     if (STRNCMP(s, "extern", 6) == 0 && (s[6] == NUL || !vim_iswordc(s[6])))
+     {
+       p = cin_skipcomment(skipwhite(s + 6));
+       while (*p != NUL)
+       {
+           if (vim_iswhite(*p))
+           {
+               p = cin_skipcomment(skipwhite(p));
+           }
+           else if (*p == '{')
+           {
+               break;
+           }
+           else if (p[0] == '"' && p[1] == 'C' && p[2] == '"')
+           {
+               if (has_string_literal)
+                   return FALSE;
+               has_string_literal = TRUE;
+               p += 3;
+           }
+           else if (p[0] == '"' && p[1] == 'C' && p[2] == '+' && p[3] == '+'
+                   && p[4] == '"')
+           {
+               if (has_string_literal)
+                   return FALSE;
+               has_string_literal = TRUE;
+               p += 5;
+           }
+           else
+           {
+               return FALSE;
+           }
+       }
+       return has_string_literal ? TRUE : FALSE;
+     }
+     return FALSE;
+ }
+ 
+ /*
   * Return a pointer to the first non-empty non-comment character after a ':'.
   * Return NULL if not found.
   *      case 234:    a = b;
***************
*** 6652,6657 ****
--- 6700,6706 ----
  {
      char_u    *line;
      char_u    *p;
+     char_u    *new_p;
  
      p = line = ml_get(trypos->lnum);
      while (*p && (colnr_T)(p - line) < trypos->col)
***************
*** 6660,6667 ****
            p = cin_skipcomment(p);
        else
        {
!           p = skip_string(p);
!           ++p;
        }
      }
      return (int)(p - line);
--- 6709,6719 ----
            p = cin_skipcomment(p);
        else
        {
!           new_p = skip_string(p);
!           if (new_p == p)
!               ++p;
!           else
!               p = new_p;
        }
      }
      return (int)(p - line);
***************
*** 6977,6982 ****
--- 7029,7037 ----
      /* indentation for # comments */
      buf->b_ind_hash_comment = 0;
  
+     /* Handle C++ extern "C" or "C++" */
+     buf->b_ind_cpp_extern_c = 0;
+ 
      for (p = buf->b_p_cino; *p; )
      {
        l = p++;
***************
*** 7051,7056 ****
--- 7106,7112 ----
            case '#': buf->b_ind_hash_comment = n; break;
            case 'N': buf->b_ind_cpp_namespace = n; break;
            case 'k': buf->b_ind_if_for_while = n; break;
+           case 'E': buf->b_ind_cpp_extern_c = n; break;
        }
        if (*p == ',')
            ++p;
***************
*** 7764,7769 ****
--- 7820,7827 ----
                    l = skipwhite(ml_get_curline());
                    if (cin_is_cpp_namespace(l))
                        amount += curbuf->b_ind_cpp_namespace;
+                   else if (cin_is_cpp_extern_c(l))
+                       amount += curbuf->b_ind_cpp_extern_c;
                }
                else
                {
***************
*** 7990,7995 ****
--- 8048,8059 ----
                                                            - added_to_amount;
                                break;
                            }
+                           else if (cin_is_cpp_extern_c(l))
+                           {
+                               amount += curbuf->b_ind_cpp_extern_c
+                                                           - added_to_amount;
+                               break;
+                           }
  
                            if (cin_nocode(l))
                                continue;
*** ../vim-8.0.0430/src/structs.h       2017-03-05 17:43:10.624245543 +0100
--- src/structs.h       2017-03-08 21:34:43.069320646 +0100
***************
*** 2236,2241 ****
--- 2236,2242 ----
      int               b_ind_hash_comment;
      int               b_ind_cpp_namespace;
      int               b_ind_if_for_while;
+     int               b_ind_cpp_extern_c;
  #endif
  
      linenr_T  b_no_eol_lnum;  /* non-zero lnum when last line of next binary
*** ../vim-8.0.0430/src/testdir/test_cindent.vim        2017-03-05 
19:43:44.549127317 +0100
--- src/testdir/test_cindent.vim        2017-03-08 21:55:12.984178666 +0100
***************
*** 14,16 ****
--- 14,76 ----
    call assert_equal(["#include <iostream>", "#include"], getline(1,2))
    bwipe!
  endfunc
+ 
+ func Test_cino_extern_c()
+   " Test for cino-E
+ 
+   let without_ind = [
+         \ '#ifdef __cplusplus',
+         \ 'extern "C" {',
+         \ '#endif',
+         \ 'int func_a(void);',
+         \ '#ifdef __cplusplus',
+         \ '}',
+         \ '#endif'
+         \ ]
+ 
+   let with_ind = [
+         \ '#ifdef __cplusplus',
+         \ 'extern "C" {',
+         \ '#endif',
+         \ "\tint func_a(void);",
+         \ '#ifdef __cplusplus',
+         \ '}',
+         \ '#endif'
+         \ ]
+   new
+   setlocal cindent cinoptions=E0
+   call setline(1, without_ind)
+   call feedkeys("gg=G", 'tx')
+   call assert_equal(with_ind, getline(1, '$'))
+ 
+   setlocal cinoptions=E-s
+   call setline(1, with_ind)
+   call feedkeys("gg=G", 'tx')
+   call assert_equal(without_ind, getline(1, '$'))
+ 
+   setlocal cinoptions=Es
+   let tests = [
+         \ ['recognized', ['extern "C" {'], "\t\t;"],
+         \ ['recognized', ['extern "C++" {'], "\t\t;"],
+         \ ['recognized', ['extern /* com */ "C"{'], "\t\t;"],
+         \ ['recognized', ['extern"C"{'], "\t\t;"],
+         \ ['recognized', ['extern "C"', '{'], "\t\t;"],
+         \ ['not recognized', ['extern {'], "\t;"],
+         \ ['not recognized', ['extern /*"C"*/{'], "\t;"],
+         \ ['not recognized', ['extern "C" //{'], ";"],
+         \ ['not recognized', ['extern "C" /*{*/'], ";"],
+         \ ]
+ 
+   for pair in tests
+     let lines = pair[1]
+     call setline(1, lines)
+     call feedkeys(len(lines) . "Go;", 'tx')
+     call assert_equal(pair[2], getline(len(lines) + 1), 'Failed for "' . 
string(lines) . '"')
+   endfor
+ 
+ 
+ 
+   bwipe!
+ endfunc
+ 
+ " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.0.0430/src/version.c       2017-03-08 00:01:31.489347798 +0100
--- src/version.c       2017-03-08 21:37:32.088116586 +0100
***************
*** 766,767 ****
--- 766,769 ----
  {   /* Add new patch number below this line */
+ /**/
+     431,
  /**/

-- 
>From "know your smileys":
 y:-)   Bad toupee

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
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

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui