| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.597 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.597 |
| Problem: 'clipboard' "autoselect" only applies to the * register. (Sergey |
| Vakulenko) |
| Solution: Make 'autoselect' work for the + register. (Christian Brabant) |
| Add the "autoselectplus" option in 'clipboard' and the "P" flag in |
| 'guioptions'. |
| Files: runtime/doc/options.txt, src/normal.c, src/ops.c, src/screen.c, |
| src/ui.c, src/globals.h, src/proto/ui.pro, src/option.h, src/gui.c |
| |
| |
| |
| |
| |
| *** 1437,1442 **** |
| --- 1452,1458 ---- |
| This option is a list of comma separated names. |
| These names are recognized: |
| |
| + *clipboard-unnamed* |
| unnamed When included, Vim will use the clipboard register '*' |
| for all yank, delete, change and put operations which |
| would normally go to the unnamed register. When a |
| |
| *** 1446,1460 **** |
| explicitly accessed using the "* notation. Also see |
| |gui-clipboard|. |
| |
| unnamedplus A variant of "unnamed" flag which uses the clipboard |
| register '+' (|quoteplus|) instead of register '*' for |
| all operations except yank. Yank shall copy the text |
| into register '+' and also into '*' when "unnamed" is |
| included. |
| ! Only available with the |+x11| feature. |
| Availability can be checked with: > |
| if has('unnamedplus') |
| < |
| autoselect Works like the 'a' flag in 'guioptions': If present, |
| then whenever Visual mode is started, or the Visual |
| area extended, Vim tries to become the owner of the |
| --- 1462,1478 ---- |
| explicitly accessed using the "* notation. Also see |
| |gui-clipboard|. |
| |
| + *clipboard-unnamedplus* |
| unnamedplus A variant of "unnamed" flag which uses the clipboard |
| register '+' (|quoteplus|) instead of register '*' for |
| all operations except yank. Yank shall copy the text |
| into register '+' and also into '*' when "unnamed" is |
| included. |
| ! Only available with the |+X11| feature. |
| Availability can be checked with: > |
| if has('unnamedplus') |
| < |
| + *clipboard-autoselect* |
| autoselect Works like the 'a' flag in 'guioptions': If present, |
| then whenever Visual mode is started, or the Visual |
| area extended, Vim tries to become the owner of the |
| |
| *** 1466,1474 **** |
| --- 1484,1499 ---- |
| "autoselect" flag is used. |
| Also applies to the modeless selection. |
| |
| + *clipboard-autoselectplus* |
| + autoselectplus Like "autoselect" but using the + register instead of |
| + the * register. Compare to the 'P' flag in |
| + 'guioptions'. |
| + |
| + *clipboard-autoselectml* |
| autoselectml Like "autoselect", but for the modeless selection |
| only. Compare to the 'A' flag in 'guioptions'. |
| |
| + *clipboard-html* |
| html When the clipboard contains HTML, use this when |
| pasting. When putting text on the clipboard, mark it |
| as HTML. This works to copy rendered HTML from |
| |
| *** 1479,1484 **** |
| --- 1504,1510 ---- |
| Only supported for GTK version 2 and later. |
| Only available with the |+multi_byte| feature. |
| |
| + *clipboard-exclude* |
| exclude:{pattern} |
| Defines a pattern that is matched against the name of |
| the terminal 'term'. If there is a match, no |
| |
| *** 3547,3552 **** |
| --- 3600,3608 ---- |
| windowing system's global selection unless explicitly told to |
| by a yank or delete operation for the "* register. |
| The same applies to the modeless selection. |
| + *'go-P'* |
| + 'P' Like autoselect but using the "+ register instead of the "* |
| + register. |
| *'go-A'* |
| 'A' Autoselect for the modeless selection. Like 'a', but only |
| applies to the modeless selection. |
| |
| |
| |
| *** 1451,1457 **** |
| * This could call do_pending_operator() recursively, but that's OK |
| * because gui_yank will be TRUE for the nested call. |
| */ |
| ! if (clip_star.available |
| && oap->op_type != OP_NOP |
| && !gui_yank |
| # ifdef FEAT_VISUAL |
| --- 1451,1457 ---- |
| * This could call do_pending_operator() recursively, but that's OK |
| * because gui_yank will be TRUE for the nested call. |
| */ |
| ! if ((clip_star.available || clip_plus.available) |
| && oap->op_type != OP_NOP |
| && !gui_yank |
| # ifdef FEAT_VISUAL |
| |
| |
| |
| *** 962,969 **** |
| * selection too. */ |
| if (name == '*' && clip_star.available) |
| { |
| ! if (clip_isautosel()) |
| ! clip_update_selection(); |
| may_get_selection(name); |
| } |
| #endif |
| --- 962,975 ---- |
| * selection too. */ |
| if (name == '*' && clip_star.available) |
| { |
| ! if (clip_isautosel_star()) |
| ! clip_update_selection(&clip_star); |
| ! may_get_selection(name); |
| ! } |
| ! if (name == '+' && clip_plus.available) |
| ! { |
| ! if (clip_isautosel_plus()) |
| ! clip_update_selection(&clip_plus); |
| may_get_selection(name); |
| } |
| #endif |
| |
| *** 3190,3196 **** |
| |
| clip_own_selection(&clip_plus); |
| clip_gen_set_selection(&clip_plus); |
| ! if (!clip_isautosel() && !did_star && curr == &(y_regs[PLUS_REGISTER])) |
| { |
| copy_yank_reg(&(y_regs[STAR_REGISTER])); |
| clip_own_selection(&clip_star); |
| --- 3196,3203 ---- |
| |
| clip_own_selection(&clip_plus); |
| clip_gen_set_selection(&clip_plus); |
| ! if (!clip_isautosel_star() && !did_star |
| ! && curr == &(y_regs[PLUS_REGISTER])) |
| { |
| copy_yank_reg(&(y_regs[STAR_REGISTER])); |
| clip_own_selection(&clip_star); |
| |
| |
| |
| *** 519,526 **** |
| # endif |
| # ifdef FEAT_CLIPBOARD |
| /* When Visual area changed, may have to update selection. */ |
| ! if (clip_star.available && clip_isautosel()) |
| ! clip_update_selection(); |
| # endif |
| #ifdef FEAT_GUI |
| /* Remove the cursor before starting to do anything, because |
| --- 519,528 ---- |
| # endif |
| # ifdef FEAT_CLIPBOARD |
| /* When Visual area changed, may have to update selection. */ |
| ! if (clip_star.available && clip_isautosel_star()) |
| ! clip_update_selection(&clip_star); |
| ! if (clip_plus.available && clip_isautosel_plus()) |
| ! clip_update_selection(&clip_plus); |
| # endif |
| #ifdef FEAT_GUI |
| /* Remove the cursor before starting to do anything, because |
| |
| *** 814,821 **** |
| |
| #ifdef FEAT_CLIPBOARD |
| /* When Visual area changed, may have to update selection. */ |
| ! if (clip_star.available && clip_isautosel()) |
| ! clip_update_selection(); |
| #endif |
| |
| win_update(wp); |
| --- 816,825 ---- |
| |
| #ifdef FEAT_CLIPBOARD |
| /* When Visual area changed, may have to update selection. */ |
| ! if (clip_star.available && clip_isautosel_star()) |
| ! clip_update_selection(&clip_star); |
| ! if (clip_plus.available && clip_isautosel_plus()) |
| ! clip_update_selection(&clip_plus); |
| #endif |
| |
| win_update(wp); |
| |
| *** 3000,3006 **** |
| area_highlighting = TRUE; |
| attr = hl_attr(HLF_V); |
| #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11) |
| ! if (clip_star.available && !clip_star.owned && clip_isautosel()) |
| attr = hl_attr(HLF_VNC); |
| #endif |
| } |
| --- 3004,3013 ---- |
| area_highlighting = TRUE; |
| attr = hl_attr(HLF_V); |
| #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11) |
| ! if ((clip_star.available && !clip_star.owned |
| ! && clip_isautosel_star()) |
| ! || (clip_plus.available && !clip_plus.owned |
| ! && clip_isautosel_plus())) |
| attr = hl_attr(HLF_VNC); |
| #endif |
| } |
| |
| *** 9060,9066 **** |
| || (wp != NULL && wp->w_width != Columns) |
| # endif |
| ) |
| ! clip_clear_selection(); |
| else |
| clip_scroll_selection(-line_count); |
| #endif |
| --- 9067,9073 ---- |
| || (wp != NULL && wp->w_width != Columns) |
| # endif |
| ) |
| ! clip_clear_selection(&clip_star); |
| else |
| clip_scroll_selection(-line_count); |
| #endif |
| |
| *** 9281,9287 **** |
| || (wp != NULL && wp->w_width != Columns) |
| # endif |
| ) |
| ! clip_clear_selection(); |
| else |
| clip_scroll_selection(line_count); |
| #endif |
| --- 9288,9294 ---- |
| || (wp != NULL && wp->w_width != Columns) |
| # endif |
| ) |
| ! clip_clear_selection(&clip_star); |
| else |
| clip_scroll_selection(line_count); |
| #endif |
| |
| |
| |
| *** 381,386 **** |
| --- 381,388 ---- |
| |
| #if defined(FEAT_CLIPBOARD) || defined(PROTO) |
| |
| + static void clip_copy_selection __ARGS((VimClipboard *clip)); |
| + |
| /* |
| * Selection stuff using Visual mode, for cutting and pasting text to other |
| * windows. |
| |
| *** 423,431 **** |
| * this is called whenever VIsual mode is ended. |
| */ |
| void |
| ! clip_update_selection() |
| { |
| ! pos_T start, end; |
| |
| /* If visual mode is only due to a redo command ("."), then ignore it */ |
| if (!redo_VIsual_busy && VIsual_active && (State & NORMAL)) |
| --- 425,434 ---- |
| * this is called whenever VIsual mode is ended. |
| */ |
| void |
| ! clip_update_selection(clip) |
| ! VimClipboard *clip; |
| { |
| ! pos_T start, end; |
| |
| /* If visual mode is only due to a redo command ("."), then ignore it */ |
| if (!redo_VIsual_busy && VIsual_active && (State & NORMAL)) |
| |
| *** 444,460 **** |
| start = curwin->w_cursor; |
| end = VIsual; |
| } |
| ! if (!equalpos(clip_star.start, start) |
| ! || !equalpos(clip_star.end, end) |
| ! || clip_star.vmode != VIsual_mode) |
| { |
| ! clip_clear_selection(); |
| ! clip_star.start = start; |
| ! clip_star.end = end; |
| ! clip_star.vmode = VIsual_mode; |
| ! clip_free_selection(&clip_star); |
| ! clip_own_selection(&clip_star); |
| ! clip_gen_set_selection(&clip_star); |
| } |
| } |
| } |
| --- 447,463 ---- |
| start = curwin->w_cursor; |
| end = VIsual; |
| } |
| ! if (!equalpos(clip->start, start) |
| ! || !equalpos(clip->end, end) |
| ! || clip->vmode != VIsual_mode) |
| { |
| ! clip_clear_selection(clip); |
| ! clip->start = start; |
| ! clip->end = end; |
| ! clip->vmode = VIsual_mode; |
| ! clip_free_selection(clip); |
| ! clip_own_selection(clip); |
| ! clip_gen_set_selection(clip); |
| } |
| } |
| } |
| |
| *** 475,481 **** |
| int was_owned = cbd->owned; |
| |
| cbd->owned = (clip_gen_own_selection(cbd) == OK); |
| ! if (!was_owned && cbd == &clip_star) |
| { |
| /* May have to show a different kind of highlighting for the |
| * selected area. There is no specific redraw command for this, |
| --- 478,484 ---- |
| int was_owned = cbd->owned; |
| |
| cbd->owned = (clip_gen_own_selection(cbd) == OK); |
| ! if (!was_owned && (cbd == &clip_star || cbd == &clip_plus)) |
| { |
| /* May have to show a different kind of highlighting for the |
| * selected area. There is no specific redraw command for this, |
| |
| *** 483,489 **** |
| if (cbd->owned |
| && (get_real_state() == VISUAL |
| || get_real_state() == SELECTMODE) |
| ! && clip_isautosel() |
| && hl_attr(HLF_V) != hl_attr(HLF_VNC)) |
| redraw_curbuf_later(INVERTED_ALL); |
| } |
| --- 486,493 ---- |
| if (cbd->owned |
| && (get_real_state() == VISUAL |
| || get_real_state() == SELECTMODE) |
| ! && (cbd == &clip_star ? clip_isautosel_star() |
| ! : clip_isautosel_plus()) |
| && hl_attr(HLF_V) != hl_attr(HLF_VNC)) |
| redraw_curbuf_later(INVERTED_ALL); |
| } |
| |
| *** 502,513 **** |
| #ifdef FEAT_X11 |
| int was_owned = cbd->owned; |
| #endif |
| ! int visual_selection = (cbd == &clip_star); |
| |
| clip_free_selection(cbd); |
| cbd->owned = FALSE; |
| if (visual_selection) |
| ! clip_clear_selection(); |
| clip_gen_lose_selection(cbd); |
| #ifdef FEAT_X11 |
| if (visual_selection) |
| --- 506,520 ---- |
| #ifdef FEAT_X11 |
| int was_owned = cbd->owned; |
| #endif |
| ! int visual_selection = FALSE; |
| ! |
| ! if (cbd == &clip_star || cbd == &clip_plus) |
| ! visual_selection = TRUE; |
| |
| clip_free_selection(cbd); |
| cbd->owned = FALSE; |
| if (visual_selection) |
| ! clip_clear_selection(cbd); |
| clip_gen_lose_selection(cbd); |
| #ifdef FEAT_X11 |
| if (visual_selection) |
| |
| *** 518,524 **** |
| if (was_owned |
| && (get_real_state() == VISUAL |
| || get_real_state() == SELECTMODE) |
| ! && clip_isautosel() |
| && hl_attr(HLF_V) != hl_attr(HLF_VNC)) |
| { |
| update_curbuf(INVERTED_ALL); |
| --- 525,532 ---- |
| if (was_owned |
| && (get_real_state() == VISUAL |
| || get_real_state() == SELECTMODE) |
| ! && (cbd == &clip_star ? |
| ! clip_isautosel_star() : clip_isautosel_plus()) |
| && hl_attr(HLF_V) != hl_attr(HLF_VNC)) |
| { |
| update_curbuf(INVERTED_ALL); |
| |
| *** 534,551 **** |
| #endif |
| } |
| |
| ! void |
| ! clip_copy_selection() |
| ! { |
| ! if (VIsual_active && (State & NORMAL) && clip_star.available) |
| ! { |
| ! if (clip_isautosel()) |
| ! clip_update_selection(); |
| ! clip_free_selection(&clip_star); |
| ! clip_own_selection(&clip_star); |
| ! if (clip_star.owned) |
| ! clip_get_selection(&clip_star); |
| ! clip_gen_set_selection(&clip_star); |
| } |
| } |
| |
| --- 542,559 ---- |
| #endif |
| } |
| |
| ! static void |
| ! clip_copy_selection(clip) |
| ! VimClipboard *clip; |
| ! { |
| ! if (VIsual_active && (State & NORMAL) && clip->available) |
| ! { |
| ! clip_update_selection(clip); |
| ! clip_free_selection(clip); |
| ! clip_own_selection(clip); |
| ! if (clip->owned) |
| ! clip_get_selection(clip); |
| ! clip_gen_set_selection(clip); |
| } |
| } |
| |
| |
| *** 555,575 **** |
| void |
| clip_auto_select() |
| { |
| ! if (clip_isautosel()) |
| ! clip_copy_selection(); |
| } |
| |
| /* |
| ! * Return TRUE if automatic selection of Visual area is desired. |
| */ |
| int |
| ! clip_isautosel() |
| { |
| return ( |
| #ifdef FEAT_GUI |
| gui.in_use ? (vim_strchr(p_go, GO_ASEL) != NULL) : |
| #endif |
| ! clip_autoselect); |
| } |
| |
| |
| --- 563,600 ---- |
| void |
| clip_auto_select() |
| { |
| ! if (clip_isautosel_star()) |
| ! clip_copy_selection(&clip_star); |
| ! if (clip_isautosel_plus()) |
| ! clip_copy_selection(&clip_plus); |
| } |
| |
| /* |
| ! * Return TRUE if automatic selection of Visual area is desired for the * |
| ! * register. |
| */ |
| int |
| ! clip_isautosel_star() |
| { |
| return ( |
| #ifdef FEAT_GUI |
| gui.in_use ? (vim_strchr(p_go, GO_ASEL) != NULL) : |
| #endif |
| ! clip_autoselect_star); |
| ! } |
| ! |
| ! /* |
| ! * Return TRUE if automatic selection of Visual area is desired for the + |
| ! * register. |
| ! */ |
| ! int |
| ! clip_isautosel_plus() |
| ! { |
| ! return ( |
| ! #ifdef FEAT_GUI |
| ! gui.in_use ? (vim_strchr(p_go, GO_ASELPLUS) != NULL) : |
| ! #endif |
| ! clip_autoselect_plus); |
| } |
| |
| |
| |
| *** 657,663 **** |
| VimClipboard *cb = &clip_star; |
| |
| if (cb->state == SELECT_DONE) |
| ! clip_clear_selection(); |
| |
| row = check_row(row); |
| col = check_col(col); |
| --- 682,688 ---- |
| VimClipboard *cb = &clip_star; |
| |
| if (cb->state == SELECT_DONE) |
| ! clip_clear_selection(cb); |
| |
| row = check_row(row); |
| col = check_col(col); |
| |
| *** 749,755 **** |
| printf("Selection ended: (%u,%u) to (%u,%u)\n", cb->start.lnum, |
| cb->start.col, cb->end.lnum, cb->end.col); |
| #endif |
| ! if (clip_isautosel() |
| || ( |
| #ifdef FEAT_GUI |
| gui.in_use ? (vim_strchr(p_go, GO_ASELML) != NULL) : |
| --- 774,780 ---- |
| printf("Selection ended: (%u,%u) to (%u,%u)\n", cb->start.lnum, |
| cb->start.col, cb->end.lnum, cb->end.col); |
| #endif |
| ! if (clip_isautosel_star() |
| || ( |
| #ifdef FEAT_GUI |
| gui.in_use ? (vim_strchr(p_go, GO_ASELML) != NULL) : |
| |
| *** 932,947 **** |
| * Called from outside to clear selected region from the display |
| */ |
| void |
| ! clip_clear_selection() |
| { |
| - VimClipboard *cb = &clip_star; |
| |
| ! if (cb->state == SELECT_CLEARED) |
| return; |
| |
| ! clip_invert_area((int)cb->start.lnum, cb->start.col, (int)cb->end.lnum, |
| ! cb->end.col, CLIP_CLEAR); |
| ! cb->state = SELECT_CLEARED; |
| } |
| |
| /* |
| --- 957,972 ---- |
| * Called from outside to clear selected region from the display |
| */ |
| void |
| ! clip_clear_selection(cbd) |
| ! VimClipboard *cbd; |
| { |
| |
| ! if (cbd->state == SELECT_CLEARED) |
| return; |
| |
| ! clip_invert_area((int)cbd->start.lnum, cbd->start.col, (int)cbd->end.lnum, |
| ! cbd->end.col, CLIP_CLEAR); |
| ! cbd->state = SELECT_CLEARED; |
| } |
| |
| /* |
| |
| *** 954,960 **** |
| if (clip_star.state == SELECT_DONE |
| && row2 >= clip_star.start.lnum |
| && row1 <= clip_star.end.lnum) |
| ! clip_clear_selection(); |
| } |
| |
| /* |
| --- 979,985 ---- |
| if (clip_star.state == SELECT_DONE |
| && row2 >= clip_star.start.lnum |
| && row1 <= clip_star.end.lnum) |
| ! clip_clear_selection(&clip_star); |
| } |
| |
| /* |
| |
| |
| |
| *** 517,523 **** |
| # define CLIP_UNNAMED_PLUS 2 |
| EXTERN int clip_unnamed INIT(= 0); /* above two values or'ed */ |
| |
| ! EXTERN int clip_autoselect INIT(= FALSE); |
| EXTERN int clip_autoselectml INIT(= FALSE); |
| EXTERN int clip_html INIT(= FALSE); |
| EXTERN regprog_T *clip_exclude_prog INIT(= NULL); |
| --- 517,524 ---- |
| # define CLIP_UNNAMED_PLUS 2 |
| EXTERN int clip_unnamed INIT(= 0); /* above two values or'ed */ |
| |
| ! EXTERN int clip_autoselect_star INIT(= FALSE); |
| ! EXTERN int clip_autoselect_plus INIT(= FALSE); |
| EXTERN int clip_autoselectml INIT(= FALSE); |
| EXTERN int clip_html INIT(= FALSE); |
| EXTERN regprog_T *clip_exclude_prog INIT(= NULL); |
| |
| |
| |
| *** 11,27 **** |
| void ui_new_shellsize __ARGS((void)); |
| void ui_breakcheck __ARGS((void)); |
| void clip_init __ARGS((int can_use)); |
| ! void clip_update_selection __ARGS((void)); |
| void clip_own_selection __ARGS((VimClipboard *cbd)); |
| void clip_lose_selection __ARGS((VimClipboard *cbd)); |
| - void clip_copy_selection __ARGS((void)); |
| void clip_auto_select __ARGS((void)); |
| ! int clip_isautosel __ARGS((void)); |
| void clip_modeless __ARGS((int button, int is_click, int is_drag)); |
| void clip_start_selection __ARGS((int col, int row, int repeated_click)); |
| void clip_process_selection __ARGS((int button, int col, int row, int_u repeated_click)); |
| void clip_may_redraw_selection __ARGS((int row, int col, int len)); |
| ! void clip_clear_selection __ARGS((void)); |
| void clip_may_clear_selection __ARGS((int row1, int row2)); |
| void clip_scroll_selection __ARGS((int rows)); |
| void clip_copy_modeless_selection __ARGS((int both)); |
| --- 11,27 ---- |
| void ui_new_shellsize __ARGS((void)); |
| void ui_breakcheck __ARGS((void)); |
| void clip_init __ARGS((int can_use)); |
| ! void clip_update_selection __ARGS((VimClipboard *clip)); |
| void clip_own_selection __ARGS((VimClipboard *cbd)); |
| void clip_lose_selection __ARGS((VimClipboard *cbd)); |
| void clip_auto_select __ARGS((void)); |
| ! int clip_isautosel_star __ARGS((void)); |
| ! int clip_isautosel_plus __ARGS((void)); |
| void clip_modeless __ARGS((int button, int is_click, int is_drag)); |
| void clip_start_selection __ARGS((int col, int row, int repeated_click)); |
| void clip_process_selection __ARGS((int button, int col, int row, int_u repeated_click)); |
| void clip_may_redraw_selection __ARGS((int row, int col, int len)); |
| ! void clip_clear_selection __ARGS((VimClipboard *cbd)); |
| void clip_may_clear_selection __ARGS((int row1, int row2)); |
| void clip_scroll_selection __ARGS((int rows)); |
| void clip_copy_modeless_selection __ARGS((int both)); |
| |
| |
| |
| *** 229,234 **** |
| --- 229,235 ---- |
| #define GO_MENUS 'm' /* use menu bar */ |
| #define GO_NOSYSMENU 'M' /* don't source system menu */ |
| #define GO_POINTER 'p' /* pointer enter/leave callbacks */ |
| + #define GO_ASELPLUS 'P' /* autoselectPlus */ |
| #define GO_RIGHT 'r' /* use right scrollbar */ |
| #define GO_VRIGHT 'R' /* right scrollbar with vert split */ |
| #define GO_TEAROFF 't' /* add tear-off menu items */ |
| |
| |
| |
| *** 3154,3160 **** |
| } |
| |
| if (clip_star.state != SELECT_CLEARED && !did_clip) |
| ! clip_clear_selection(); |
| #endif |
| |
| /* Don't put events in the input queue now. */ |
| --- 3154,3160 ---- |
| } |
| |
| if (clip_star.state != SELECT_CLEARED && !did_clip) |
| ! clip_clear_selection(&clip_star); |
| #endif |
| |
| /* Don't put events in the input queue now. */ |
| |
| |
| |
| *** 716,717 **** |
| --- 716,719 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 597, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 106. When told to "go to your room" you inform your parents that you |
| can't...because you were kicked out and banned. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 /// |