# HG changeset patch # User vimboss # Date 1105220739 0 # Node ID 014ba200db86945994a3bfd39920ff1b2d7f88da # Parent 8173ec1e9f1f746657dd598b6e876b11c99e1049 updated for version 7.0035 diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -14,8 +14,8 @@ last chapter below. 1. Variables |variables| 1.1 Variable types - 1.2 Function reference |Funcref| - 1.3 List |List| + 1.2 Function references |Funcref| + 1.3 Lists |List| 1.4 More about variables |more-variables| 2. Expression syntax |expression-syntax| 3. Internal variable |internal-variables| @@ -80,11 +80,11 @@ You will get an error if you try to chan to |:unlet| it first to avoid this error. String and Number are considered equivalent though. > :let l = "string" - :let l = 44 + :let l = 44 " changes type from String to Number :let l = [1, 2, 3] " error! -1.2 Function reference ~ +1.2 Function references ~ *Funcref* *E695* *E703* A Funcref variable is obtained with the |function()| function. It can be used in an expression to invoke the function it refers to by using it in the place @@ -97,8 +97,8 @@ of a function name, before the parenthes A Funcref variable must start with a capital, "s:", "w:" or "b:". You cannot have both a Funcref variable and a function with the same name. -Note that a Funcref cannot be used with |:call|, because its argument is not -an expression. +Note that a Funcref cannot be used with the |:call| command, because its +argument is not an expression. The name of the referenced function can be obtained with |string()|. > :echo "The function is " . string(Myfunc) @@ -108,7 +108,7 @@ arguments: > :let r = call(Myfunc, mylist) -1.3 List ~ +1.3 Lists ~ *List* *E686* A List is an ordered sequence of items. An item can be of any type. Items can be accessed by their index number. Items can be added and removed at any @@ -136,7 +136,7 @@ after the List. Indexes are zero-based, :let item = mylist[0] " get the first item: 1 :let item = mylist[2] " get the third item: 3 -When the item is a list again this can be repeated: > +When the resulting item is a list this can be repeated: > :let item = nestlist[0][1] " get the first list, second item: 12 < A negative index is counted from the end. Index -1 refers to the last item in @@ -144,7 +144,7 @@ the List, -2 to the last but one item, e :let last = mylist[-1] " get the last item: "four" To avoid an error for an invalid index use the |get()| function. When an item -is not available it returns zero, unless you specify a default value: > +is not available it returns zero or the default value you specify: > :echo get(mylist, idx) :echo get(mylist, idx, "NONE") @@ -185,7 +185,7 @@ change "bb": > Making a copy of a list is done with the |copy()| function. Using [:] also works, as explained above. This creates a shallow copy of the list: Changing -a list in the list will also change the copied list: > +a list item in the list will also change the item in the copied list: > :let aa = [[1, 'a'], 2, 3] :let bb = copy(aa) :let aa = aa + [4] @@ -195,12 +195,18 @@ a list in the list will also change the :echo bb [[1, aaa], 2, 3] -To make a completely independent list use |deepcopy()|. This also copies the -values in the list, recursively. +To make a completely independent list use |deepcopy()|. This also makes a +copy of the values in the list, recursively. The operator "is" can be used to check if two variables refer to the same list. "isnot" does the opposite. In contrast "==" compares if two lists have -the same value. +the same value. > + :let alist = [1, 2, 3] + :let blist = [1, 2, 3] + :echo alist is blist + 0 + :echo alist == blist + 1 List unpack ~ @@ -225,10 +231,14 @@ empty list then. List modification ~ *list-modification* -To change a specific item of a list use |:let|: > +To change a specific item of a list use |:let| this way: > :let list[4] = "four" :let listlist[0][3] = item +To change part of a list you can specify the first and last item to be +modified. The value must mach the range of replaced items: > + :let list[3:5] = [3, 4, 5] + Adding and removing items from a list is done with functions. Here are a few examples: > :call insert(list, 'a') " prepend item 'a' @@ -239,10 +249,15 @@ examples: > :let i = remove(list, 3) " remove item 3 :let l = remove(list, 3, -1) " remove items 3 to last item +Changing the oder of items in a list: > + :call sort(list) " sort a list alphabetically + :call reverse(list) " reverse the order of items + For loop ~ -The |:for| loop executes commands for each item in a list. Example: > +The |:for| loop executes commands for each item in a list. A variable is set +to each item in the list in sequence. Example: > :for i in mylist : call Doit(i) :endfor @@ -256,8 +271,8 @@ This works like: > :endwhile Note that all items in the list should be of the same type, otherwise this -results in an error. To avoid this |:unlet| the variable at the end of the -loop. +results in an error |E706|. To avoid this |:unlet| the variable at the end of +the loop. Just like the |:let| command, |:for| also accepts a list of variables. This requires the argument to be a list of lists. > @@ -280,11 +295,13 @@ It is also possible to put remaining ite List functions ~ Functions that are useful with a List: > - :let r = call(funcname, list) " invoke a function with argument list + :let r = call(funcname, list) " call a function with an argument list :if empty(list) " check if list is empty :let l = len(list) " number of items in a list - :let xs = count(list, 'x') " count occurrences of a value - :let i = index(list, 'x') " find a value + :let big = max(list) " maximum value in a list + :let small = min(list) " minumum value in a list + :let xs = count(list, 'x') " count nr of times 'x' appears in list + :let i = index(list, 'x') " index of first 'x' in list :let lines = getline(1, 10) " get ten text lines from buffer :call append('$', lines) " append text lines in buffer :let list = str2list("a b c") " create list from items in a string @@ -737,9 +754,10 @@ cannot start with a digit. It's also po |curly-braces-names|. An internal variable is created with the ":let" command |:let|. -An internal variable is destroyed with the ":unlet" command |:unlet|. -Using a name that isn't an internal variable, or an internal variable that has -been destroyed, results in an error. +An internal variable is explicitly destroyed with the ":unlet" command +|:unlet|. +Using a name that is not an internal variable or refers to a variable that has +been destroyed results in an error. There are several name spaces for variables. Which one is to be used is specified by what is prepended: @@ -1208,6 +1226,8 @@ matchend( {expr}, {pat}[, {start}[, {cou Number position where {pat} ends in {expr} matchstr( {expr}, {pat}[, {start}[, {count}]]) String {count}'th match of {pat} in {expr} +max({list}) Number maximum value of items in {list} +min({list}) Number minumum value of items in {list} mode() String current editing mode nextnonblank( {lnum}) Number line nr of non-blank line >= {lnum} nr2char( {expr}) String single char with ASCII value {expr} @@ -2346,6 +2366,7 @@ index({list}, {expr} [, {ic}]) *index -1 is returned when {expr} is not found in {list}. Example: > :let idx = index(words, "the") + :if index(numbers, 123) >= 0 input({prompt} [, {text}]) *input()* @@ -2646,6 +2667,18 @@ matchstr({expr}, {pat}[, {start}[, {coun :echo matchstr("testing", "ing", 5) < result is "". + *max()* +max({list}) Return the maximum value of all items in {list}. + If {list} is not a list or one of the items in {list} cannot + be used as a Number this results in an error. + An empty List results in zero. + + *min()* +min({list}) Return the minumum value of all items in {list}. + If {list} is not a list or one of the items in {list} cannot + be used as a Number this results in an error. + An empty List results in zero. + *mode()* mode() Return a string that indicates the current mode: n Normal @@ -2789,7 +2822,7 @@ repeat({expr}, {count}) *repeat()* result. Example: > :let seperator = repeat('-', 80) < When {count} is zero or negative the result is empty. - When {expr} is a list the result is {expr} concatenated + When {expr} is a List the result is {expr} concatenated {count} times. Example: > :let longlist = repeat(['a', 'b'], 3) < Results in ['a', 'b', 'a', 'b', 'a', 'b']. @@ -3297,10 +3330,17 @@ tr({src}, {fromstr}, {tostr}) *tr()* echo tr("", "<>", "{}") < returns "{blob}" -type({expr}) *type()* - The result is a Number: - 0 if {expr} has the type Number - 1 if {expr} has the type String + *type()* +type({expr}) The result is a Number, depending on the type of {expr}: + Number: 0 + String: 1 + Funcref: 2 + List: 3 + To avoid the magic numbers it can be used this way: > + :if type(myvar) == type(0) + :if type(myvar) == type("") + :if type(myvar) == type(function("tr")) + :if type(myvar) == type([]) virtcol({expr}) *virtcol()* The result is a Number, which is the screen column of the file @@ -3841,6 +3881,15 @@ 7. Commands *expression-commands* the index can be repeated. This cannot be used to add an item to a list. +:let {var-name}[{idx1}:{idx2}] = {expr1} *E708* *E709* *E710* *E711* + Set a sequence of items in a List to the result of the + expression {expr1}, which must be a list with the + correct number of items. + {idx1} can be omitted, zero is used instead. + {idx2} can be omitted, meaning the end of the list. + When the selected range of items is partly past the + end of the list, items will be added. + :let ${env-name} = {expr1} *:let-environment* *:let-$* Set environment variable {env-name} to the result of the expression {expr1}. The type is always String. @@ -3985,7 +4034,9 @@ 7. Commands *expression-commands* :for item in mylist :call remove(mylist, 0) :endfor -< Note that the type of each list item should be +< Note that reordering the list (e.g., with sort() or + reverse()) may have unexpected effects. + Note that the type of each list item should be identical to avoid errors for the type of {var} changing. Unlet the variable at the end of the loop to allow multiple item types. diff --git a/src/gui.c b/src/gui.c --- a/src/gui.c +++ b/src/gui.c @@ -4201,22 +4201,22 @@ gui_mouse_correct() win_T *wp = NULL; need_mouse_correct = FALSE; - if (gui.in_use && p_mousef) + + if (!(gui.in_use && p_mousef)) + return; + + gui_mch_getmouse(&x, &y); + /* Don't move the mouse when it's left or right of the Vim window */ + if (x < 0 || x > Columns * gui.char_width) + return; + if (y >= 0) + wp = xy2win(x, y); + if (wp != curwin && wp != NULL) /* If in other than current window */ { - x = gui_mch_get_mouse_x(); - /* Don't move the mouse when it's left or right of the Vim window */ - if (x < 0 || x > Columns * gui.char_width) - return; - y = gui_mch_get_mouse_y(); - if (y >= 0) - wp = xy2win(x, y); - if (wp != curwin && wp != NULL) /* If in other than current window */ - { - validate_cline_row(); - gui_mch_setmouse((int)W_ENDCOL(curwin) * gui.char_width - 3, - (W_WINROW(curwin) + curwin->w_wrow) * gui.char_height + validate_cline_row(); + gui_mch_setmouse((int)W_ENDCOL(curwin) * gui.char_width - 3, + (W_WINROW(curwin) + curwin->w_wrow) * gui.char_height + (gui.char_height) / 2); - } } } diff --git a/src/gui_kde_x11.cc b/src/gui_kde_x11.cc --- a/src/gui_kde_x11.cc +++ b/src/gui_kde_x11.cc @@ -1303,19 +1303,13 @@ gui_mch_get_rgb(guicolor_T pixel)//{{{ }//}}} /* - * Get current y mouse coordinate in text window. - * Return -1 when unknown. + * Get current mouse coordinates in text window. */ - int -gui_mch_get_mouse_x(void)//{{{ + void +gui_mch_getmouse(int *x, int *y)//{{{ { - return vmw->mapFromGlobal(QCursor::pos()).x(); -}//}}} - - int -gui_mch_get_mouse_y(void)//{{{ -{ - return vmw->mapFromGlobal(QCursor::pos()).y(); + *x = vmw->mapFromGlobal(QCursor::pos()).x(); + *y = vmw->mapFromGlobal(QCursor::pos()).y(); }//}}} void diff --git a/src/gui_mac.c b/src/gui_mac.c --- a/src/gui_mac.c +++ b/src/gui_mac.c @@ -5672,27 +5672,16 @@ display_errors() #endif /* - * Get current y mouse coordinate in text window. - * Return -1 when unknown. + * Get current mouse coordinates in text window. */ - int -gui_mch_get_mouse_x() +void gui_mch_getmouse(int *x, int *y) { Point where; GetMouse(&where); - return (where.h); -} - - int -gui_mch_get_mouse_y() -{ - Point where; - - GetMouse(&where); - - return (where.v); + *x = where.h; + *y = where.v; } void diff --git a/src/gui_photon.c b/src/gui_photon.c --- a/src/gui_photon.c +++ b/src/gui_photon.c @@ -1896,29 +1896,18 @@ gui_mch_mousehide(int hide) } int -gui_mch_get_mouse_x(void) +gui_mch_getmouse(int *x, int *y) { PhCursorInfo_t info; - short x, y; + short ix, iy; /* FIXME: does this return the correct position, * with respect to the border? */ PhQueryCursor( PhInputGroup( NULL ), &info ); - PtGetAbsPosition( gui.vimTextArea , &x, &y ); - - return( info.pos.x - x ); -} - - int -gui_mch_get_mouse_y(void) -{ - PhCursorInfo_t info; - short x, y; - - PhQueryCursor( PhInputGroup( NULL ), &info ); - PtGetAbsPosition( gui.vimTextArea , &x, &y ); - /* TODO: Add border offset? */ - return( info.pos.y - y ); + PtGetAbsPosition( gui.vimTextArea , &ix, &iy ); + + *x = info.pos.x - ix; + *y = info.pos.y - iy; } void diff --git a/src/gui_riscos.c b/src/gui_riscos.c --- a/src/gui_riscos.c +++ b/src/gui_riscos.c @@ -3014,40 +3014,26 @@ gui_mch_set_scrollbar_colors(scrollbar_T } /* - * Get current x mouse coordinate in text window. + * Get current mouse coordinates in text window. * Note: (0,0) is the bottom left corner, positive y is UP. - * Return -1 when unknown. */ - int -gui_mch_get_mouse_x() + void +gui_mch_getmouse(x, y) + int *x; + int *y; { int left; + int top; int block[10]; block[0] = gui.window_handle; swi(Wimp_GetWindowState, 0, block); left = block[1]; - - swi(Wimp_GetPointerInfo, 0, block); - return block[0] - left; -} - -/* - * Get current y mouse coordinate in text window. - * Return -1 when unknown. - */ - int -gui_mch_get_mouse_y() -{ - int top; - int block[10]; - - block[0] = gui.window_handle; - swi(Wimp_GetWindowState, 0, block); top = block[4]; swi(Wimp_GetPointerInfo, 0, block); - return top - block[1]; + *x = block[0] - left; + *y = top - block[1]; } /* MouseTo(x, y) */ diff --git a/src/gui_w32.c b/src/gui_w32.c --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -3184,6 +3184,8 @@ gui_mch_tearoff( int nameLen; int padding0, padding1, padding2 = 0; int sepPadding=0; + int x; + int y; #ifdef USE_SYSMENU_FONT LOGFONT lfSysmenu; int use_lfSysmenu = FALSE; @@ -3304,12 +3306,13 @@ gui_mch_tearoff( *p++ = HIWORD(lExtendedStyle); pnumitems = p; /* save where the number of items must be stored */ *p++ = 0; // NumberOfItems(will change later) + gui_mch_getmouse(&x, &y); if (initX == 0xffffL) - *p++ = PixelToDialogX(gui_mch_get_mouse_x()); // x + *p++ = PixelToDialogX(x); // x else *p++ = PixelToDialogX(initX); // x if (initY == 0xffffL) - *p++ = PixelToDialogY(gui_mch_get_mouse_y()); // y + *p++ = PixelToDialogY(y); // y else *p++ = PixelToDialogY(initY); // y *p++ = PixelToDialogX(dlgwidth); // cx diff --git a/src/gui_w48.c b/src/gui_w48.c --- a/src/gui_w48.c +++ b/src/gui_w48.c @@ -2411,33 +2411,18 @@ gui_mch_destroy_scrollbar(scrollbar_T *s #endif /* - * Get current x mouse coordinate in text window. - * Return -1 when unknown. + * Get current mouse coordinates in text window. */ - int -gui_mch_get_mouse_x(void) + void +gui_mch_get_mouse_(int *x, int *y) { RECT rct; POINT mp; (void)GetWindowRect(s_textArea, &rct); (void)GetCursorPos((LPPOINT)&mp); - return (int)(mp.x - rct.left); -} - -/* - * Get current y mouse coordinate in text window. - * Return -1 when unknown. - */ - int -gui_mch_get_mouse_y(void) -{ - RECT rct; - POINT mp; - - (void)GetWindowRect(s_textArea, &rct); - (void)GetCursorPos((LPPOINT)&mp); - return (int)(mp.y - rct.top); + *x = (int)(mp.x - rct.left); + *y = (int)(mp.y - rct.top); } /* diff --git a/src/misc2.c b/src/misc2.c --- a/src/misc2.c +++ b/src/misc2.c @@ -3026,7 +3026,9 @@ get_shape_idx(mouse) if (mouse && (State == HITRETURN || State == ASKMORE)) { # ifdef FEAT_GUI - if (Y_2_ROW(gui_mch_get_mouse_y()) == Rows - 1) + int x, y; + gui_mch_getmouse(&x, &y); + if (Y_2_ROW(y) == Rows - 1) return SHAPE_IDX_MOREL; # endif return SHAPE_IDX_MORE; diff --git a/src/proto/gui_gtk_x11.pro b/src/proto/gui_gtk_x11.pro --- a/src/proto/gui_gtk_x11.pro +++ b/src/proto/gui_gtk_x11.pro @@ -57,8 +57,7 @@ void gui_mch_menu_hidden __ARGS((vimmenu void gui_mch_draw_menubar __ARGS((void)); void gui_mch_enable_scrollbar __ARGS((scrollbar_T *sb, int flag)); long_u gui_mch_get_rgb __ARGS((guicolor_T pixel)); -int gui_mch_get_mouse_x __ARGS((void)); -int gui_mch_get_mouse_y __ARGS((void)); +void gui_mch_getmouse __ARGS((int *x, int *y)); void gui_mch_setmouse __ARGS((int x, int y)); void gui_mch_mousehide __ARGS((int hide)); void mch_set_mouse_shape __ARGS((int shape)); diff --git a/src/proto/gui_kde_x11.pro b/src/proto/gui_kde_x11.pro --- a/src/proto/gui_kde_x11.pro +++ b/src/proto/gui_kde_x11.pro @@ -52,8 +52,7 @@ void gui_mch_menu_hidden __ARGS((vimmenu void gui_mch_draw_menubar __ARGS((void)); void gui_mch_enable_scrollbar __ARGS((scrollbar_T *sb, int flag)); long_u gui_mch_get_rgb __ARGS((guicolor_T pixel)); -int gui_mch_get_mouse_x __ARGS((void)); -int gui_mch_get_mouse_y __ARGS((void)); +void gui_mch_getmouse __ARGS((int *x, int *y)); void gui_mch_setmouse __ARGS((int x, int y)); void gui_mch_mousehide __ARGS((int hide)); void mch_set_mouse_shape __ARGS((int shape)); diff --git a/src/proto/gui_mac.pro b/src/proto/gui_mac.pro --- a/src/proto/gui_mac.pro +++ b/src/proto/gui_mac.pro @@ -17,8 +17,7 @@ short gui_mch_get_mac_menu_item_index __ void gui_mch_set_blinking __ARGS((long wait, long on, long off)); void gui_mch_stop_blink __ARGS((void)); void gui_mch_start_blink __ARGS((void)); -int gui_mch_get_mouse_x __ARGS((void)); -int gui_mch_get_mouse_y __ARGS((void)); +void gui_mch_getmouse __ARGS((int *x, int *y)); void gui_mch_setmouse __ARGS((int x, int y)); void gui_mch_prepare __ARGS((int *argc, char **argv)); int gui_mch_init_check __ARGS((void)); diff --git a/src/proto/gui_photon.pro b/src/proto/gui_photon.pro --- a/src/proto/gui_photon.pro +++ b/src/proto/gui_photon.pro @@ -23,8 +23,7 @@ void gui_mch_enable_scrollbar __ARGS((sc void gui_mch_destroy_scrollbar __ARGS((scrollbar_T *sb)); void mch_set_mouse_shape __ARGS((int shape)); void gui_mch_mousehide __ARGS((int hide)); -int gui_mch_get_mouse_x __ARGS((void)); -int gui_mch_get_mouse_y __ARGS((void)); +void gui_mch_getmouse __ARGS((int *x, int *y)); void gui_mch_setmouse __ARGS((int x, int y)); long_u gui_mch_get_rgb __ARGS((guicolor_T pixel)); void gui_mch_new_colors __ARGS((void)); diff --git a/src/proto/gui_w16.pro b/src/proto/gui_w16.pro --- a/src/proto/gui_w16.pro +++ b/src/proto/gui_w16.pro @@ -39,8 +39,7 @@ void gui_mch_find_dialog __ARGS((exarg_T void gui_mch_replace_dialog __ARGS((exarg_T *eap)); void gui_mch_mousehide __ARGS((int hide)); void gui_mch_destroy_scrollbar __ARGS((scrollbar_T *sb)); -int gui_mch_get_mouse_x __ARGS((void)); -int gui_mch_get_mouse_y __ARGS((void)); +void gui_mch_getmouse __ARGS((int *x, int *y)); void gui_mch_setmouse __ARGS((int x, int y)); void gui_mch_get_screen_dimensions __ARGS((int *screen_w, int *screen_h)); void gui_mch_flash __ARGS((int msec)); diff --git a/src/proto/gui_w32.pro b/src/proto/gui_w32.pro --- a/src/proto/gui_w32.pro +++ b/src/proto/gui_w32.pro @@ -39,8 +39,7 @@ void gui_mch_find_dialog __ARGS((exarg_T void gui_mch_replace_dialog __ARGS((exarg_T *eap)); void gui_mch_mousehide __ARGS((int hide)); void gui_mch_destroy_scrollbar __ARGS((scrollbar_T *sb)); -int gui_mch_get_mouse_x __ARGS((void)); -int gui_mch_get_mouse_y __ARGS((void)); +void gui_mch_getmouse __ARGS((int *x, int *y)); void gui_mch_setmouse __ARGS((int x, int y)); void gui_mch_get_screen_dimensions __ARGS((int *screen_w, int *screen_h)); void gui_mch_flash __ARGS((int msec));