home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / patches / 6.2.231 < prev    next >
Encoding:
Internet Message Format  |  2004-02-02  |  20.5 KB

  1. To: vim-dev@vim.org
  2. Subject: Patch 6.2.231
  3. Fcc: outbox
  4. From: Bram Moolenaar <Bram@moolenaar.net>
  5. Mime-Version: 1.0
  6. Content-Type: text/plain; charset=ISO-8859-1
  7. Content-Transfer-Encoding: 8bit
  8. ------------
  9.  
  10. Patch 6.2.231 (after 6.2.046)
  11. Problem:    Various problems when an error exception is raised from within a
  12.         builtin function.  When it is invoked while evaluating arguments
  13.         to a function following arguments are still evaluated.  When
  14.         invoked with a line range it will be called for remaining lines.
  15. Solution:   Update "force_abort" also after calling a builtin function, so
  16.         that aborting() always returns the correct value. (Servatius
  17.         Brandt)
  18. Files:        src/eval.c, src/ex_eval.c, src/proto/ex_eval.pro,
  19.         src/testdir/test49.ok, src/testdir/test49.vim
  20.  
  21.  
  22. *** ../vim-6.2.230/src/eval.c    Tue Feb  3 16:33:22 2004
  23. --- src/eval.c    Mon Feb  2 16:49:46 2004
  24. ***************
  25. *** 1334,1340 ****
  26.       if (doesrange || eap->skip)
  27.           break;
  28.       /* Stop when immediately aborting on error, or when an interrupt
  29. !      * occurred or an exception was thrown but not caught. */
  30.       if (aborting())
  31.           break;
  32.       }
  33. --- 1334,1342 ----
  34.       if (doesrange || eap->skip)
  35.           break;
  36.       /* Stop when immediately aborting on error, or when an interrupt
  37. !      * occurred or an exception was thrown but not caught.  get_func_var()
  38. !      * returned OK, so that the check for trailing characters below is
  39. !      * executed. */
  40.       if (aborting())
  41.           break;
  42.       }
  43. ***************
  44. *** 1345,1351 ****
  45. --- 1347,1356 ----
  46.       {
  47.       /* Check for trailing illegal characters and a following command. */
  48.       if (!ends_excmd(*arg))
  49. +     {
  50. +         emsg_severe = TRUE;
  51.           EMSG(_(e_trailing));
  52. +     }
  53.       else
  54.           eap->nextcmd = check_nextcmd(arg);
  55.       }
  56. ***************
  57. *** 3009,3022 ****
  58.       else
  59.       ret = FAIL;
  60.   
  61. !     if (!aborting())
  62. !     {
  63. !     if (ret == OK)
  64. !         ret = call_func(name, len, retvar, argcount, argvars,
  65.                       firstline, lastline, doesrange, evaluate);
  66. !     else
  67. !         EMSG2(_("E116: Invalid arguments for function %s"), name);
  68. !     }
  69.   
  70.       while (--argcount >= 0)
  71.       clear_var(&argvars[argcount]);
  72. --- 3014,3024 ----
  73.       else
  74.       ret = FAIL;
  75.   
  76. !     if (ret == OK)
  77. !     ret = call_func(name, len, retvar, argcount, argvars,
  78.                       firstline, lastline, doesrange, evaluate);
  79. !     else if (!aborting())
  80. !     EMSG2(_("E116: Invalid arguments for function %s"), name);
  81.   
  82.       while (--argcount >= 0)
  83.       clear_var(&argvars[argcount]);
  84. ***************
  85. *** 3183,3188 ****
  86. --- 3185,3201 ----
  87.           }
  88.           }
  89.       }
  90. +     /*
  91. +      * The function call (or "FuncUndefined" autocommand sequence) might
  92. +      * have been aborted by an error, an interrupt, or an explicitly thrown
  93. +      * exception that has not been caught so far.  This situation can be
  94. +      * tested for by calling aborting().  For an error in an internal
  95. +      * function or for the "E132" error in call_user_func(), however, the
  96. +      * throw point at which the "force_abort" flag (temporarily reset by
  97. +      * emsg()) is normally updated has not been reached yet. We need to
  98. +      * update that flag first to make aborting() reliable.
  99. +      */
  100. +     update_force_abort();
  101.       }
  102.       if (error == ERROR_NONE)
  103.       ret = OK;
  104. *** ../vim-6.2.230/src/ex_eval.c    Fri May 30 21:45:31 2003
  105. --- src/ex_eval.c    Mon Feb  2 22:04:59 2004
  106. ***************
  107. *** 72,81 ****
  108.   /*
  109.    * When several errors appear in a row, setting "force_abort" is delayed until
  110.    * the failing command returned.  "cause_abort" is set to TRUE meanwhile, in
  111. !  * order to indicate that situation.  This is useful for aborting expression
  112. !  * evaluation when a function call set "force_abort" without producing any
  113. !  * error messages, but giving all error messages on a parsing error during the
  114. !  * expression evaluation (even if a try conditional is active).
  115.    */
  116.   static int cause_abort = FALSE;
  117.   
  118. --- 72,82 ----
  119.   /*
  120.    * When several errors appear in a row, setting "force_abort" is delayed until
  121.    * the failing command returned.  "cause_abort" is set to TRUE meanwhile, in
  122. !  * order to indicate that situation.  This is useful when "force_abort" was set
  123. !  * during execution of a function call from an expression: the aborting of the
  124. !  * expression evaluation is done without producing any error messages, but all
  125. !  * error messages on parsing errors during the expression evaluation are given
  126. !  * (even if a try conditional is active).
  127.    */
  128.   static int cause_abort = FALSE;
  129.   
  130. ***************
  131. *** 85,92 ****
  132.    * to check whether an aborted function that does not handle a range itself
  133.    * should be called again for the next line in the range.  Also used for
  134.    * cancelling expression evaluation after a function call caused an immediate
  135. !  * abort.  Note that the first emsg() call temporarily resets force_abort until
  136. !  * the throw point for error messages has been reached.  That is, during
  137.    * cancellation of an expression evaluation after an aborting function call or
  138.    * due to a parsing error, aborting() always returns the same value.
  139.    */
  140. --- 86,93 ----
  141.    * to check whether an aborted function that does not handle a range itself
  142.    * should be called again for the next line in the range.  Also used for
  143.    * cancelling expression evaluation after a function call caused an immediate
  144. !  * abort.  Note that the first emsg() call temporarily resets "force_abort"
  145. !  * until the throw point for error messages has been reached.  That is, during
  146.    * cancellation of an expression evaluation after an aborting function call or
  147.    * due to a parsing error, aborting() always returns the same value.
  148.    */
  149. ***************
  150. *** 97,102 ****
  151. --- 98,116 ----
  152.   }
  153.   
  154.   /*
  155. +  * The value of "force_abort" is temporarily reset by the first emsg() call
  156. +  * during an expression evaluation, and "cause_abort" is used instead.  It might
  157. +  * be necessary to restore "force_abort" even before the throw point for the
  158. +  * error message has been reached.  update_force_abort() should be called then.
  159. +  */
  160. +     void
  161. + update_force_abort()
  162. + {
  163. +     if (cause_abort)
  164. +     force_abort = TRUE;
  165. + }
  166. + /*
  167.    * Return TRUE if a command with a subcommand resulting in "retcode" should
  168.    * abort the script processing.  Can be used to suppress an autocommand after
  169.    * execution of a failing subcommand as long as the error message has not been
  170. *** ../vim-6.2.230/src/proto/ex_eval.pro    Sun Jun  1 12:26:09 2003
  171. --- src/proto/ex_eval.pro    Mon Feb  2 16:05:23 2004
  172. ***************
  173. *** 1,5 ****
  174. --- 1,6 ----
  175.   /* ex_eval.c */
  176.   int aborting __ARGS((void));
  177. + void update_force_abort __ARGS((void));
  178.   int should_abort __ARGS((int retcode));
  179.   int aborted_in_try __ARGS((void));
  180.   int cause_errthrow __ARGS((char_u *msg, int severe, int *ignore));
  181. *** ../vim-6.2.230/src/testdir/test49.ok    Fri May 30 21:45:31 2003
  182. --- src/testdir/test49.ok    Mon Feb  2 16:05:23 2004
  183. ***************
  184. *** 73,90 ****
  185.   *** Test  71: OK (1789569365)
  186.   *** Test  72: OK (9032615)
  187.   *** Test  73: OK (224907669)
  188. ! *** Test  74: OK (1610087935)
  189. ! *** Test  75: OK (1388671)
  190. ! *** Test  76: OK (134217728)
  191. ! *** Test  77: OK (70288929)
  192. ! *** Test  78: OK (17895765)
  193. ! *** Test  79: OK (387)
  194. ! *** Test  80: OK (8454401)
  195. ! *** Test  81: OK (2835)
  196. ! *** Test  82: OK (934782101)
  197. ! *** Test  83: OK (198689)
  198. ! --- Test  84: All tests were run with throwing exceptions on error.
  199.             The $VIMNOERRTHROW control is not configured.
  200. ! --- Test  84: All tests were run with throwing exceptions on interrupt.
  201.             The $VIMNOINTTHROW control is not configured.
  202. ! *** Test  84: OK (50443995)
  203. --- 73,91 ----
  204.   *** Test  71: OK (1789569365)
  205.   *** Test  72: OK (9032615)
  206.   *** Test  73: OK (224907669)
  207. ! *** Test  74: OK (2000403408)
  208. ! *** Test  75: OK (1610087935)
  209. ! *** Test  76: OK (1388671)
  210. ! *** Test  77: OK (134217728)
  211. ! *** Test  78: OK (70288929)
  212. ! *** Test  79: OK (17895765)
  213. ! *** Test  80: OK (387)
  214. ! *** Test  81: OK (8454401)
  215. ! *** Test  82: OK (2835)
  216. ! *** Test  83: OK (934782101)
  217. ! *** Test  84: OK (198689)
  218. ! --- Test  85: All tests were run with throwing exceptions on error.
  219.             The $VIMNOERRTHROW control is not configured.
  220. ! --- Test  85: All tests were run with throwing exceptions on interrupt.
  221.             The $VIMNOINTTHROW control is not configured.
  222. ! *** Test  85: OK (50443995)
  223. *** ../vim-6.2.230/src/testdir/test49.vim    Sun Aug 10 22:31:29 2003
  224. --- src/testdir/test49.vim    Mon Feb  2 16:05:23 2004
  225. ***************
  226. *** 7567,7573 ****
  227.   
  228.   
  229.   "-------------------------------------------------------------------------------
  230. ! " Test 74:  Errors, interupts, :throw during expression evaluation        {{{1
  231.   "
  232.   "        When a function call made during expression evaluation is aborted
  233.   "        due to an error inside a :try/:endtry region or due to an interrupt
  234. --- 7567,7754 ----
  235.   
  236.   
  237.   "-------------------------------------------------------------------------------
  238. ! " Test 74:  Errors in builtin functions.                    {{{1
  239. ! "
  240. ! "        On an error in a builtin function called inside a :try/:endtry
  241. ! "        region, the evaluation of the expression calling that function and
  242. ! "        the command containing that expression are abandoned.  The error can
  243. ! "        be caught as an exception.
  244. ! "
  245. ! "        A simple :call of the builtin function is a trivial case.  If the
  246. ! "        builtin function is called in the argument list of another function,
  247. ! "        no further arguments are evaluated, and the other function is not
  248. ! "        executed.  If the builtin function is called from the argument of
  249. ! "        a :return command, the :return command is not executed.  If the
  250. ! "        builtin function is called from the argument of a :throw command,
  251. ! "        the :throw command is not executed.  The evaluation of the
  252. ! "        expression calling the builtin function is abandoned.
  253. ! "-------------------------------------------------------------------------------
  254. ! XpathINIT
  255. ! function! F1(arg1)
  256. !     Xpath 1                    " X: 0
  257. ! endfunction
  258. ! function! F2(arg1, arg2)
  259. !     Xpath 2                    " X: 0
  260. ! endfunction
  261. ! function! G()
  262. !     Xpath 4                    " X: 0
  263. ! endfunction
  264. ! function! H()
  265. !     Xpath 8                    " X: 0
  266. ! endfunction
  267. ! function! R()
  268. !     while 1
  269. !     try
  270. !         let caught = 0
  271. !         let v:errmsg = ""
  272. !         Xpath 16                " X: 16
  273. !         return append(1, "s")
  274. !     catch /E21/
  275. !         let caught = 1
  276. !     catch /.*/
  277. !         Xpath 32                " X: 0
  278. !     finally
  279. !         Xpath 64                " X: 64
  280. !         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
  281. !         Xpath 128            " X: 128
  282. !         endif
  283. !         break        " discard error for $VIMNOERRTHROW
  284. !     endtry
  285. !     endwhile
  286. !     Xpath 256                    " X: 256
  287. ! endfunction
  288. ! try
  289. !     set noma    " let append() fail with "E21"
  290. !     while 1
  291. !     try
  292. !         let caught = 0
  293. !         let v:errmsg = ""
  294. !         Xpath 512                " X: 512
  295. !         call append(1, "s")
  296. !     catch /E21/
  297. !         let caught = 1
  298. !     catch /.*/
  299. !         Xpath 1024                " X: 0
  300. !     finally
  301. !         Xpath 2048                " X: 2048
  302. !         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
  303. !         Xpath 4096            " X: 4096
  304. !         endif
  305. !         break        " discard error for $VIMNOERRTHROW
  306. !     endtry
  307. !     endwhile
  308. !     while 1
  309. !     try
  310. !         let caught = 0
  311. !         let v:errmsg = ""
  312. !         Xpath 8192                " X: 8192
  313. !         call F1('x' . append(1, "s"))
  314. !     catch /E21/
  315. !         let caught = 1
  316. !     catch /.*/
  317. !         Xpath 16384                " X: 0
  318. !     finally
  319. !         Xpath 32768                " X: 32768
  320. !         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
  321. !         Xpath 65536            " X: 65536
  322. !         endif
  323. !         break        " discard error for $VIMNOERRTHROW
  324. !     endtry
  325. !     endwhile
  326. !     while 1
  327. !     try
  328. !         let caught = 0
  329. !         let v:errmsg = ""
  330. !         Xpath 131072            " X: 131072
  331. !         call F2('x' . append(1, "s"), G())
  332. !     catch /E21/
  333. !         let caught = 1
  334. !     catch /.*/
  335. !         Xpath 262144            " X: 0
  336. !     finally
  337. !         Xpath 524288            " X: 524288
  338. !         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
  339. !         Xpath 1048576            " X: 1048576
  340. !         endif
  341. !         break        " discard error for $VIMNOERRTHROW
  342. !     endtry
  343. !     endwhile
  344. !     call R()
  345. !     while 1
  346. !     try
  347. !         let caught = 0
  348. !         let v:errmsg = ""
  349. !         Xpath 2097152            " X: 2097152
  350. !         throw "T" . append(1, "s")
  351. !     catch /E21/
  352. !         let caught = 1
  353. !     catch /^T.*/
  354. !         Xpath 4194304            " X: 0
  355. !     catch /.*/
  356. !         Xpath 8388608            " X: 0
  357. !     finally
  358. !         Xpath 16777216            " X: 16777216
  359. !         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
  360. !         Xpath 33554432            " X: 33554432
  361. !         endif
  362. !         break        " discard error for $VIMNOERRTHROW
  363. !     endtry
  364. !     endwhile
  365. !     while 1
  366. !     try
  367. !         let caught = 0
  368. !         let v:errmsg = ""
  369. !         Xpath 67108864            " X: 67108864
  370. !         let x = "a"
  371. !         let x = x . "b" . append(1, "s") . H()
  372. !     catch /E21/
  373. !         let caught = 1
  374. !     catch /.*/
  375. !         Xpath 134217728            " X: 0
  376. !     finally
  377. !         Xpath 268435456            " X: 268435456
  378. !         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
  379. !         Xpath 536870912            " X: 536870912
  380. !         endif
  381. !         if x == "a"
  382. !         Xpath 1073741824        " X: 1073741824
  383. !         endif
  384. !         break        " discard error for $VIMNOERRTHROW
  385. !     endtry
  386. !     endwhile
  387. ! catch /.*/
  388. !     " The Xpath command does not accept 2^31 (negative); add explicitly:
  389. !     let Xpath = Xpath + 2147483648        " X: 0
  390. !     Xout v:exception "in" v:throwpoint
  391. ! finally
  392. !     set ma&
  393. ! endtry
  394. ! unlet! caught x
  395. ! delfunction F1
  396. ! delfunction F2
  397. ! delfunction G
  398. ! delfunction H
  399. ! delfunction R
  400. ! Xcheck 2000403408
  401. ! "-------------------------------------------------------------------------------
  402. ! " Test 75:  Errors, interupts, :throw during expression evaluation        {{{1
  403.   "
  404.   "        When a function call made during expression evaluation is aborted
  405.   "        due to an error inside a :try/:endtry region or due to an interrupt
  406. ***************
  407. *** 7853,7859 ****
  408.   
  409.   
  410.   "-------------------------------------------------------------------------------
  411. ! " Test 75:  Errors, interupts, :throw in name{brace-expression}            {{{1
  412.   "
  413.   "        When a function call made during evaluation of an expression in
  414.   "        braces as part of a function name after ":function" is aborted due
  415. --- 8034,8040 ----
  416.   
  417.   
  418.   "-------------------------------------------------------------------------------
  419. ! " Test 76:  Errors, interupts, :throw in name{brace-expression}            {{{1
  420.   "
  421.   "        When a function call made during evaluation of an expression in
  422.   "        braces as part of a function name after ":function" is aborted due
  423. ***************
  424. *** 7983,7989 ****
  425.   
  426.   
  427.   "-------------------------------------------------------------------------------
  428. ! " Test 76:  Messages on parsing errors in expression evaluation            {{{1
  429.   "
  430.   "        When an expression evaluation detects a parsing error, an error
  431.   "        message is given and converted to an exception, and the expression
  432. --- 8164,8170 ----
  433.   
  434.   
  435.   "-------------------------------------------------------------------------------
  436. ! " Test 77:  Messages on parsing errors in expression evaluation            {{{1
  437.   "
  438.   "        When an expression evaluation detects a parsing error, an error
  439.   "        message is given and converted to an exception, and the expression
  440. ***************
  441. *** 8172,8178 ****
  442.   
  443.   
  444.   "-------------------------------------------------------------------------------
  445. ! " Test 77:  Throwing one of several errors for the same command            {{{1
  446.   "
  447.   "        When several errors appear in a row (for instance during expression
  448.   "        evaluation), the first as the most specific one is used when
  449. --- 8353,8359 ----
  450.   
  451.   
  452.   "-------------------------------------------------------------------------------
  453. ! " Test 78:  Throwing one of several errors for the same command            {{{1
  454.   "
  455.   "        When several errors appear in a row (for instance during expression
  456.   "        evaluation), the first as the most specific one is used when
  457. ***************
  458. *** 8367,8373 ****
  459.   
  460.   
  461.   "-------------------------------------------------------------------------------
  462. ! " Test 78:  Syntax error in expression for illegal :elseif            {{{1
  463.   "
  464.   "        If there is a syntax error in the expression after an illegal
  465.   "        :elseif, an error message is given (or an error exception thrown)
  466. --- 8548,8554 ----
  467.   
  468.   
  469.   "-------------------------------------------------------------------------------
  470. ! " Test 79:  Syntax error in expression for illegal :elseif            {{{1
  471.   "
  472.   "        If there is a syntax error in the expression after an illegal
  473.   "        :elseif, an error message is given (or an error exception thrown)
  474. ***************
  475. *** 8552,8558 ****
  476.   
  477.   
  478.   "-------------------------------------------------------------------------------
  479. ! " Test 79:  Discarding exceptions after an error or interrupt            {{{1
  480.   "
  481.   "        When an exception is thrown from inside a :try conditional without
  482.   "        :catch and :finally clauses and an error or interrupt occurs before
  483. --- 8733,8739 ----
  484.   
  485.   
  486.   "-------------------------------------------------------------------------------
  487. ! " Test 80:  Discarding exceptions after an error or interrupt            {{{1
  488.   "
  489.   "        When an exception is thrown from inside a :try conditional without
  490.   "        :catch and :finally clauses and an error or interrupt occurs before
  491. ***************
  492. *** 8598,8604 ****
  493.   
  494.   
  495.   "-------------------------------------------------------------------------------
  496. ! " Test 80:  Ignoring :catch clauses after an error or interrupt            {{{1
  497.   "
  498.   "        When an exception is thrown and an error or interrupt occurs before
  499.   "        the matching :catch clause is reached, the exception is discarded
  500. --- 8779,8785 ----
  501.   
  502.   
  503.   "-------------------------------------------------------------------------------
  504. ! " Test 81:  Ignoring :catch clauses after an error or interrupt            {{{1
  505.   "
  506.   "        When an exception is thrown and an error or interrupt occurs before
  507.   "        the matching :catch clause is reached, the exception is discarded
  508. ***************
  509. *** 8706,8712 ****
  510.   
  511.   
  512.   "-------------------------------------------------------------------------------
  513. ! " Test 81:  Executing :finally clauses after an error or interrupt        {{{1
  514.   "
  515.   "        When an exception is thrown and an error or interrupt occurs before
  516.   "        the :finally of the innermost :try is reached, the exception is
  517. --- 8887,8893 ----
  518.   
  519.   
  520.   "-------------------------------------------------------------------------------
  521. ! " Test 82:  Executing :finally clauses after an error or interrupt        {{{1
  522.   "
  523.   "        When an exception is thrown and an error or interrupt occurs before
  524.   "        the :finally of the innermost :try is reached, the exception is
  525. ***************
  526. *** 8756,8762 ****
  527.   
  528.   
  529.   "-------------------------------------------------------------------------------
  530. ! " Test 82:  Exceptions in autocommand sequences.                {{{1
  531.   "
  532.   "        When an exception occurs in a sequence of autocommands for
  533.   "        a specific event, the rest of the sequence is not executed.  The
  534. --- 8937,8943 ----
  535.   
  536.   
  537.   "-------------------------------------------------------------------------------
  538. ! " Test 83:  Exceptions in autocommand sequences.                {{{1
  539.   "
  540.   "        When an exception occurs in a sequence of autocommands for
  541.   "        a specific event, the rest of the sequence is not executed.  The
  542. ***************
  543. *** 8931,8937 ****
  544.   
  545.   
  546.   "-------------------------------------------------------------------------------
  547. ! " Test 83:  Error exceptions in autocommands for I/O command events        {{{1
  548.   "
  549.   "        When an I/O command is inside :try/:endtry, autocommands to be
  550.   "        executed after it should be skipped on an error (exception) in the
  551. --- 9112,9118 ----
  552.   
  553.   
  554.   "-------------------------------------------------------------------------------
  555. ! " Test 84:  Error exceptions in autocommands for I/O command events        {{{1
  556.   "
  557.   "        When an I/O command is inside :try/:endtry, autocommands to be
  558.   "        executed after it should be skipped on an error (exception) in the
  559. ***************
  560. *** 9178,9184 ****
  561.   
  562.   
  563.   "-------------------------------------------------------------------------------
  564. ! " Test 84:  $VIMNOERRTHROW and $VIMNOINTTHROW support                {{{1
  565.   "
  566.   "        It is possible to configure Vim for throwing exceptions on error
  567.   "        or interrupt, controlled by variables $VIMNOERRTHROW and
  568. --- 9359,9365 ----
  569.   
  570.   
  571.   "-------------------------------------------------------------------------------
  572. ! " Test 85:  $VIMNOERRTHROW and $VIMNOINTTHROW support                {{{1
  573.   "
  574.   "        It is possible to configure Vim for throwing exceptions on error
  575.   "        or interrupt, controlled by variables $VIMNOERRTHROW and
  576. *** ../vim-6.2.230/src/version.c    Tue Feb  3 16:55:34 2004
  577. --- src/version.c    Tue Feb  3 17:23:01 2004
  578. ***************
  579. *** 639,640 ****
  580. --- 639,642 ----
  581.   {   /* Add new patch number below this line */
  582. + /**/
  583. +     231,
  584.   /**/
  585.  
  586. -- 
  587. hundred-and-one symptoms of being an internet addict:
  588. 29. Your phone bill comes to your doorstep in a box.
  589.  
  590.  /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
  591. ///        Sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
  592. \\\              Project leader for A-A-P -- http://www.A-A-P.org        ///
  593.  \\\  Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html  ///
  594.