Patch 8.1.0487
Problem:    No menus specifically for the terminal window.
Solution:   Add :tlmenu. (Yee Cheng Chin, closes #3439) Add a menu test.
Files:      runtime/delmenu.vim, runtime/doc/autocmd.txt, runtime/doc/gui.txt,
            runtime/doc/index.txt, runtime/doc/terminal.txt,
            runtime/doc/usr_42.txt, runtime/menu.vim, src/ex_cmdidxs.h,
            src/ex_cmds.h, src/ex_docmd.c, src/menu.c, src/proto/menu.pro,
            src/popupmnu.c, src/structs.h, src/testdir/test_menu.vim


*** ../vim-8.1.0486/runtime/delmenu.vim 2010-05-15 13:03:31.000000000 +0200
--- runtime/delmenu.vim 2018-10-19 18:35:52.654453150 +0200
***************
*** 5,10 ****
--- 5,11 ----
  " Last Change:        2001 May 27
  
  aunmenu *
+ tlunmenu *
  
  silent! unlet did_install_default_menus
  silent! unlet did_install_syntax_menu
*** ../vim-8.1.0486/runtime/doc/autocmd.txt     2018-09-16 15:47:45.629425398 
+0200
--- runtime/doc/autocmd.txt     2018-10-19 18:35:52.654453150 +0200
***************
*** 831,843 ****
                                right mouse button).  Useful for adjusting the
                                menu for what is under the cursor or mouse
                                pointer.
!                               The pattern is matched against a single
!                               character representing the mode:
                                        n       Normal
                                        v       Visual
                                        o       Operator-pending
                                        i       Insert
                                        c       Command line
                                                        *OptionSet*
  OptionSet                     After setting an option.  The pattern is
                                matched against the long option name.
--- 835,848 ----
                                right mouse button).  Useful for adjusting the
                                menu for what is under the cursor or mouse
                                pointer.
!                               The pattern is matched against one or two
!                               characters representing the mode:
                                        n       Normal
                                        v       Visual
                                        o       Operator-pending
                                        i       Insert
                                        c       Command line
+                                       tl      Terminal
                                                        *OptionSet*
  OptionSet                     After setting an option.  The pattern is
                                matched against the long option name.
*** ../vim-8.1.0486/runtime/doc/gui.txt 2018-05-17 13:41:40.000000000 +0200
--- runtime/doc/gui.txt 2018-10-19 19:21:48.080078320 +0200
***************
*** 547,561 ****
  
  5.2 Creating New Menus                                        *creating-menus*
  
!                               *:me*  *:menu*  *:noreme*  *:noremenu*
!                               *:am*  *:amenu* *:an*      *:anoremenu*
!                               *:nme* *:nmenu* *:nnoreme* *:nnoremenu*
!                               *:ome* *:omenu* *:onoreme* *:onoremenu*
!                               *:vme* *:vmenu* *:vnoreme* *:vnoremenu*
!                               *:xme* *:xmenu* *:xnoreme* *:xnoremenu*
!                               *:sme* *:smenu* *:snoreme* *:snoremenu*
!                               *:ime* *:imenu* *:inoreme* *:inoremenu*
!                               *:cme* *:cmenu* *:cnoreme* *:cnoremenu*
                                *E330* *E327* *E331* *E336* *E333*
                                *E328* *E329* *E337* *E792*
  To create a new menu item, use the ":menu" commands.  They are mostly like
--- 547,562 ----
  
  5.2 Creating New Menus                                        *creating-menus*
  
!                               *:me*  *:menu*   *:noreme*  *:noremenu*
!                               *:am*  *:amenu*  *:an*      *:anoremenu*
!                               *:nme* *:nmenu*  *:nnoreme* *:nnoremenu*
!                               *:ome* *:omenu*  *:onoreme* *:onoremenu*
!                               *:vme* *:vmenu*  *:vnoreme* *:vnoremenu*
!                               *:xme* *:xmenu*  *:xnoreme* *:xnoremenu*
!                               *:sme* *:smenu*  *:snoreme* *:snoremenu*
!                               *:ime* *:imenu*  *:inoreme* *:inoremenu*
!                               *:cme* *:cmenu*  *:cnoreme* *:cnoremenu*
!                               *:tlm* *:tlmenu* *:tln*     *:tlnoremenu*
                                *E330* *E327* *E331* *E336* *E333*
                                *E328* *E329* *E337* *E792*
  To create a new menu item, use the ":menu" commands.  They are mostly like
***************
*** 571,576 ****
--- 572,581 ----
  "Big Changes", which is a sub-menu containing the item "Delete All Spaces",
  which when selected, performs the operation.
  
+ To create a menu for terminal mode, use |:tlmenu| instead of |:tmenu| unlike
+ key mapping (|:tmap|). This is because |:tmenu| is already used for defining
+ tooltips for menus. See |terminal-typing|.
+ 
  Special characters in a menu name:
  
        &       The next character is the shortcut key.  Make sure each
***************
*** 589,597 ****
  this menu can be used.  The second part is shown as "Open     :e".  The ":e"
  is right aligned, and the "O" is underlined, to indicate it is the shortcut.
  
! The ":amenu" command can be used to define menu entries for all modes at once.
! To make the command work correctly, a character is automatically inserted for
! some modes:
        mode            inserted        appended        ~
        Normal          nothing         nothing
        Visual          <C-C>           <C-\><C-G>
--- 594,602 ----
  this menu can be used.  The second part is shown as "Open     :e".  The ":e"
  is right aligned, and the "O" is underlined, to indicate it is the shortcut.
  
! The ":amenu" command can be used to define menu entries for all modes at once,
! except for Terminal mode.  To make the command work correctly, a character is
! automatically inserted for some modes:
        mode            inserted        appended        ~
        Normal          nothing         nothing
        Visual          <C-C>           <C-\><C-G>
***************
*** 865,870 ****
--- 870,885 ----
                                insert-mode menu Eg: >
        :emenu File.Exit
  
+ :[range]em[enu] {mode} {menu} Like above, but execute the menu for {mode}:
+                                   'n': |:nmenu|  Normal mode
+                                   'v': |:vmenu|  Visual mode
+                                   's': |:smenu|  Select mode
+                                   'o': |:omenu|  Operator-pending mode
+                                   't': |:tlmenu| Terminal mode
+                                   'i': |:imenu|  Insert mode
+                                   'c': |:cmenu|  Cmdline mode
+                               
+ 
  If the console-mode vim has been compiled with WANT_MENU defined, you can
  use :emenu to access useful menu items you may have got used to from GUI
  mode.  See 'wildmenu' for an option that works well with this.  See
***************
*** 885,890 ****
--- 900,906 ----
                                                *:sunme* *:sunmenu*
                                                *:iunme* *:iunmenu*
                                                *:cunme* *:cunmenu*
+                                               *:tlu*   *:tlunmenu*
  To delete a menu item or a whole submenu, use the unmenu commands, which are
  analogous to the unmap commands.  Eg: >
      :unmenu! Edit.Paste
***************
*** 951,956 ****
--- 967,974 ----
  :tu[nmenu] {menupath}         Remove a tip for a menu or tool.
                                {only in X11 and Win32 GUI}
  
+ Note: To create menus for terminal mode, use |:tlmenu| instead.
+ 
  When a tip is defined for a menu item, it appears in the command-line area
  when the mouse is over that item, much like a standard Windows menu hint in
  the status bar.  (Except when Vim is in Command-line mode, when of course
***************
*** 999,1005 ****
                                pointer instead of the cursor.
                                In the terminal this is the last known
                                position, which is usually at the last click
!                               or release (mouse movement is irrelevalt).
  
  Example: >
        :popup File
--- 1017,1023 ----
                                pointer instead of the cursor.
                                In the terminal this is the last known
                                position, which is usually at the last click
!                               or release (mouse movement is irrelevant).
  
  Example: >
        :popup File
***************
*** 1075,1078 ****
  For the Win32 GUI the external commands are executed in a separate window.
  See |gui-shell-win32|.
  
!  vim:tw=78:sw=4:ts=8:ft=help:norl:
--- 1093,1096 ----
  For the Win32 GUI the external commands are executed in a separate window.
  See |gui-shell-win32|.
  
!  vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
*** ../vim-8.1.0486/runtime/doc/index.txt       2018-05-17 13:41:41.000000000 
+0200
--- runtime/doc/index.txt       2018-10-19 18:35:52.654453150 +0200
***************
*** 1583,1588 ****
--- 1583,1591 ----
  |:tjump|      :tj[ump]        like ":tselect", but jump directly when there
                                is only one match
  |:tlast|      :tl[ast]        jump to last matching tag
+ |:tlmenu|     :tlm[enu]       add menu for Terminal-Job mode
+ |:tlnoremenu| :tln[oremenu]   like ":noremenu" but for Terminal-Job mode
+ |:tlunmenu|   :tlu[nmenu]     remove menu for Terminal-Job mode
  |:tmapclear|  :tmapc[lear]    remove all mappings for Terminal-Job mode
  |:tmap|               :tma[p]         like ":map" but for Terminal-Job mode
  |:tmenu|      :tm[enu]        define menu tooltip
***************
*** 1657,1660 ****
  |:~|          :~              repeat last ":substitute"
  
  
!  vim:tw=78:ts=8:ft=help:norl:
--- 1660,1663 ----
  |:~|          :~              repeat last ":substitute"
  
  
!  vim:tw=78:ts=8:noet:ft=help:norl:
*** ../vim-8.1.0486/runtime/doc/terminal.txt    2018-06-19 16:59:31.333713053 
+0200
--- runtime/doc/terminal.txt    2018-10-19 18:35:52.658453120 +0200
***************
*** 114,119 ****
--- 114,122 ----
     tnoremap <Esc> <C-W>N
     set notimeout ttimeout timeoutlen=100
  
+ You can also create menus similar to terminal mode mappings, but you have to
+ use |:tlmenu| instead of |:tmenu|.
+ 
  <                                                     *options-in-terminal*
  After opening the terminal window and setting 'buftype' to "terminal" the
  TerminalOpen autocommand event is triggered.  This makes it possible to set
***************
*** 228,233 ****
--- 231,240 ----
  
                        If you want to use more options use the |term_start()|
                        function.
+                       If you want to split the window vertically, use: >
+                               :vertical terminal
+ <                     Or short: >
+                               :vert ter
  
  When the buffer associated with the terminal is forcibly unloaded or wiped out
  the job is killed, similar to calling `job_stop(job, "kill")` .
***************
*** 523,531 ****
  
  Functions ~
  
! term_sendkeys()               send keystrokes to a terminal (not subject to 
tmap)
! term_wait()           wait for screen to be updated
! term_scrape()         inspect terminal screen
  
  
  ==============================================================================
--- 530,538 ----
  
  Functions ~
  
! |term_sendkeys()|     send keystrokes to a terminal (not subject to tmap)
! |term_wait()|         wait for screen to be updated
! |term_scrape()|               inspect terminal screen
  
  
  ==============================================================================
***************
*** 552,558 ****
    characters.  This makes sure the dump is always this size.  The function
    RunVimInTerminal() takes care of this.  Pass it the arguments for the Vim
    command.
! - Send any commands to Vim using term_sendkeys().  For example: >
        call term_sendkeys(buf, ":echo &lines &columns\<CR>")
  - Check that the screen is now in the expected state, using
    VerifyScreenDump().  This expects the reference screen dump to be in the
--- 559,565 ----
    characters.  This makes sure the dump is always this size.  The function
    RunVimInTerminal() takes care of this.  Pass it the arguments for the Vim
    command.
! - Send any commands to Vim using |term_sendkeys()|.  For example: >
        call term_sendkeys(buf, ":echo &lines &columns\<CR>")
  - Check that the screen is now in the expected state, using
    VerifyScreenDump().  This expects the reference screen dump to be in the
***************
*** 580,592 ****
                                                        *terminal-screendump*
  
  To create the screen dump, run Vim (or any other program) in a terminal and
! make it show the desired state.  Then use the term_dumpwrite() function to
  create a screen dump file.  For example: >
        :call term_dumpwrite(77, "mysyntax.dump")
  
  Here "77" is the buffer number of the terminal.  Use `:ls!` to see it.
  
! You can view the screen dump with term_dumpload(): >
        :call term_dumpload("mysyntax.dump")
  
  To verify that Vim still shows exactly the same screen, run Vim again with
--- 587,599 ----
                                                        *terminal-screendump*
  
  To create the screen dump, run Vim (or any other program) in a terminal and
! make it show the desired state.  Then use the |term_dumpwrite()| function to
  create a screen dump file.  For example: >
        :call term_dumpwrite(77, "mysyntax.dump")
  
  Here "77" is the buffer number of the terminal.  Use `:ls!` to see it.
  
! You can view the screen dump with |term_dumpload()|: >
        :call term_dumpload("mysyntax.dump")
  
  To verify that Vim still shows exactly the same screen, run Vim again with
***************
*** 594,600 ****
  again, using a different file name: >
        :call term_dumpwrite(88, "test.dump")
  
! To assert that the files are exactly the same use assert_equalfile(): >
        call assert_equalfile("mysyntax.dump", "test.dump")
  
  If there are differences then v:errors will contain the error message.
--- 601,607 ----
  again, using a different file name: >
        :call term_dumpwrite(88, "test.dump")
  
! To assert that the files are exactly the same use |assert_equalfile()|: >
        call assert_equalfile("mysyntax.dump", "test.dump")
  
  If there are differences then v:errors will contain the error message.
***************
*** 603,610 ****
  Comparing screen dumps ~
                                                *terminal-diffscreendump*
  
! assert_equalfile() does not make it easy to see what is different.
! To spot the problem use term_dumpdiff(): >
        call term_dumpdiff("mysyntax.dump", "test.dump")
  
  This will open a window consisting of three parts:
--- 610,617 ----
  Comparing screen dumps ~
                                                *terminal-diffscreendump*
  
! |assert_equalfile()| does not make it easy to see what is different.
! To spot the problem use |term_dumpdiff()|: >
        call term_dumpdiff("mysyntax.dump", "test.dump")
  
  This will open a window consisting of three parts:
***************
*** 613,619 ****
  3.  The contents of the second dump
  
  You can usually see what differs in the second part.  Use the 'ruler' to
! relate it to the position in the first or second dump.
  
  Alternatively, press "s" to swap the first and second dump. Do this several
  times so that you can spot the difference in the context of the text.
--- 620,637 ----
  3.  The contents of the second dump
  
  You can usually see what differs in the second part.  Use the 'ruler' to
! relate it to the position in the first or second dump.  Letters indicate the
! kind of difference:
!       X       different character
!       >       cursor in first but not in second
!       <       cursor in second but not in first
!       w       character width differs (single vs double width)
!       f       foreground color differs
!       b       background color differs
!       a       attribute differs (bold, underline, reverse, etc.)
!       ?       character missing in both
!       +       character missing in first
!       -       character missing in second
  
  Alternatively, press "s" to swap the first and second dump. Do this several
  times so that you can spot the difference in the context of the text.
***************
*** 635,641 ****
  Load the plugin with this command: >
        packadd termdebug
  <                                                     *:Termdebug*
! To start debugging use `:Termdebug` or `:TermdebugCommand`` followed by the
  command name, for example: >
        :Termdebug vim
  
--- 653,659 ----
  Load the plugin with this command: >
        packadd termdebug
  <                                                     *:Termdebug*
! To start debugging use `:Termdebug` or `:TermdebugCommand` followed by the
  command name, for example: >
        :Termdebug vim
  
***************
*** 900,906 ****
  To change the width of the Vim window when debugging starts, and use a
  vertical split: >
    let g:termdebug_wide = 163
! This will set &columns to 163 when :Termdebug is used.  The value is restored
  when quitting the debugger.
  If g:termdebug_wide is set and &columns is already larger than
  g:termdebug_wide then a vertical split will be used without changing &columns.
--- 918,924 ----
  To change the width of the Vim window when debugging starts, and use a
  vertical split: >
    let g:termdebug_wide = 163
! This will set &columns to 163 when `:Termdebug` is used.  The value is 
restored
  when quitting the debugger.
  If g:termdebug_wide is set and &columns is already larger than
  g:termdebug_wide then a vertical split will be used without changing &columns.
***************
*** 909,912 ****
  
  
  
!  vim:tw=78:ts=8:ft=help:norl:
--- 927,930 ----
  
  
  
!  vim:tw=78:ts=8:noet:ft=help:norl:
*** ../vim-8.1.0486/runtime/doc/usr_42.txt      2018-05-17 13:42:03.000000000 
+0200
--- runtime/doc/usr_42.txt      2018-10-19 18:35:52.658453120 +0200
***************
*** 150,156 ****
        :menu!          Insert and Command-line mode
        :imenu          Insert mode
        :cmenu          Command-line mode
!       :amenu          All modes
  
  To avoid that the commands of a menu item are being mapped, use the command
  ":noremenu", ":nnoremenu", ":anoremenu", etc.
--- 150,157 ----
        :menu!          Insert and Command-line mode
        :imenu          Insert mode
        :cmenu          Command-line mode
!       :tlmenu         Terminal mode
!       :amenu          All modes (except for Terminal mode)
  
  To avoid that the commands of a menu item are being mapped, use the command
  ":noremenu", ":nnoremenu", ":anoremenu", etc.
***************
*** 362,365 ****
  
  Next chapter: |usr_43.txt|  Using filetypes
  
! Copyright: see |manual-copyright|  vim:tw=78:ts=8:ft=help:norl:
--- 363,366 ----
  
  Next chapter: |usr_43.txt|  Using filetypes
  
! Copyright: see |manual-copyright|  vim:tw=78:ts=8:noet:ft=help:norl:
*** ../vim-8.1.0486/runtime/menu.vim    2018-07-23 05:09:05.593235641 +0200
--- runtime/menu.vim    2018-10-19 22:31:52.955188961 +0200
***************
*** 160,165 ****
--- 160,168 ----
  cnoremenu 20.350 &Edit.&Copy<Tab>"+y          <C-Y>
  nnoremenu 20.360 &Edit.&Paste<Tab>"+gP                "+gP
  cnoremenu      &Edit.&Paste<Tab>"+gP          <C-R>+
+ if exists(':tlmenu')
+   tlnoremenu   &Edit.&Paste<Tab>"+gP          <C-W>"+
+ endif
  exe 'vnoremenu <script> &Edit.&Paste<Tab>"+gP ' . paste#paste_cmd['v']
  exe 'inoremenu <script> &Edit.&Paste<Tab>"+gP ' . paste#paste_cmd['i']
  nnoremenu 20.370 &Edit.Put\ &Before<Tab>[p    [p
***************
*** 356,361 ****
--- 359,366 ----
    let s:did_setup_color_schemes = 1
  
    let n = globpath(&runtimepath, "colors/*.vim", 1, 1)
+   let n += globpath(&runtimepath, "pack/*/start/*/colors/*.vim", 1, 1)
+   let n += globpath(&runtimepath, "pack/*/opt/*/colors/*.vim", 1, 1)
  
    " Ignore case for VMS and windows, sort on name
    let names = sort(map(n, 'substitute(v:val, 
"\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 1)
*** ../vim-8.1.0486/src/ex_cmdidxs.h    2017-09-18 22:06:03.000000000 +0200
--- src/ex_cmdidxs.h    2018-10-19 18:35:52.658453120 +0200
***************
*** 25,36 ****
    /* r */ 351,
    /* s */ 370,
    /* t */ 437,
!   /* u */ 477,
!   /* v */ 488,
!   /* w */ 506,
!   /* x */ 521,
!   /* y */ 530,
!   /* z */ 531
  };
  
  /*
--- 25,36 ----
    /* r */ 351,
    /* s */ 370,
    /* t */ 437,
!   /* u */ 480,
!   /* v */ 491,
!   /* w */ 509,
!   /* x */ 524,
!   /* y */ 533,
!   /* z */ 534
  };
  
  /*
***************
*** 60,66 ****
    /* q */ {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
    /* r */ {  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0, 13, 18,  0,  0,  0,  0 },
    /* s */ {  2,  6, 15,  0, 18, 22,  0, 24, 25,  0,  0, 28, 30, 34, 38, 40,  
0, 48,  0, 49,  0, 61, 62,  0, 63,  0 },
!   /* t */ {  2,  0, 19,  0, 22, 24,  0, 25,  0, 26,  0, 27, 28, 31, 33, 34,  
0, 35, 37,  0, 38,  0,  0,  0,  0,  0 },
    /* u */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
    /* v */ {  0,  0,  0,  0,  1,  0,  0,  0,  4,  0,  0,  0,  9, 12,  0,  0,  
0,  0, 15,  0, 16,  0,  0,  0,  0,  0 },
    /* w */ {  2,  0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  0,  0,  8,  0,  9, 
10,  0, 12,  0, 13, 14,  0,  0,  0,  0 },
--- 60,66 ----
    /* q */ {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
    /* r */ {  0,  0,  0,  0,  0,  0,  0,  0, 11,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0, 13, 18,  0,  0,  0,  0 },
    /* s */ {  2,  6, 15,  0, 18, 22,  0, 24, 25,  0,  0, 28, 30, 34, 38, 40,  
0, 48,  0, 49,  0, 61, 62,  0, 63,  0 },
!   /* t */ {  2,  0, 19,  0, 22, 24,  0, 25,  0, 26,  0, 27, 31, 34, 36, 37,  
0, 38, 40,  0, 41,  0,  0,  0,  0,  0 },
    /* u */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
    /* v */ {  0,  0,  0,  0,  1,  0,  0,  0,  4,  0,  0,  0,  9, 12,  0,  0,  
0,  0, 15,  0, 16,  0,  0,  0,  0,  0 },
    /* w */ {  2,  0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  0,  0,  8,  0,  9, 
10,  0, 12,  0, 13, 14,  0,  0,  0,  0 },
***************
*** 69,72 ****
    /* z */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }
  };
  
! static const int command_count = 544;
--- 69,72 ----
    /* z */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }
  };
  
! static const int command_count = 547;
*** ../vim-8.1.0486/src/ex_cmds.h       2018-08-14 13:38:12.744559267 +0200
--- src/ex_cmds.h       2018-10-19 18:35:52.658453120 +0200
***************
*** 20,28 ****
   * 1. Add an entry in the table below.  Keep it sorted on the shortest
   *    version of the command name that works.  If it doesn't start with a
   *    lower case letter, add it at the end.
!  * 2. Add a "case: CMD_xxx" in the big switch in ex_docmd.c.
!  * 3. Add an entry in the index for Ex commands at ":help ex-cmd-index".
!  * 4. Add documentation in ../doc/xxx.txt.  Add a tag for both the short and
   *    long name of the command.
   */
  
--- 20,29 ----
   * 1. Add an entry in the table below.  Keep it sorted on the shortest
   *    version of the command name that works.  If it doesn't start with a
   *    lower case letter, add it at the end.
!  * 2. Run "make cmdidxs" to re-generate ex_cmdidxs.h.
!  * 3. Add a "case: CMD_xxx" in the big switch in ex_docmd.c.
!  * 4. Add an entry in the index for Ex commands at ":help ex-cmd-index".
!  * 5. Add documentation in ../doc/xxx.txt.  Add a tag for both the short and
   *    long name of the command.
   */
  
***************
*** 176,182 ****
                        BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR,
                        ADDR_BUFFERS),
  EX(CMD_behave,                "behave",       ex_behave,
!                       NEEDARG|WORD1|TRLBAR|CMDWIN,
                        ADDR_LINES),
  EX(CMD_belowright,    "belowright",   ex_wrongmodifier,
                        NEEDARG|EXTRA|NOTRLCOM,
--- 177,183 ----
                        BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR,
                        ADDR_BUFFERS),
  EX(CMD_behave,                "behave",       ex_behave,
!                       BANG|NEEDARG|WORD1|TRLBAR|CMDWIN,
                        ADDR_LINES),
  EX(CMD_belowright,    "belowright",   ex_wrongmodifier,
                        NEEDARG|EXTRA|NOTRLCOM,
***************
*** 1498,1503 ****
--- 1499,1513 ----
  EX(CMD_tlast,         "tlast",        ex_tag,
                        BANG|TRLBAR,
                        ADDR_LINES),
+ EX(CMD_tlmenu,                "tlmenu",       ex_menu,
+                       
RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+                       ADDR_LINES),
+ EX(CMD_tlnoremenu,    "tlnoremenu",   ex_menu,
+                       
RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+                       ADDR_LINES),
+ EX(CMD_tlunmenu,      "tlunmenu",     ex_menu,
+                       
RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+                       ADDR_LINES),
  EX(CMD_tmenu,         "tmenu",        ex_menu,
                        
RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
                        ADDR_LINES),
*** ../vim-8.1.0486/src/ex_docmd.c      2018-10-02 16:23:55.323037143 +0200
--- src/ex_docmd.c      2018-10-19 18:35:52.658453120 +0200
***************
*** 4283,4288 ****
--- 4283,4289 ----
        case CMD_omenu:     case CMD_onoremenu:     case CMD_ounmenu:
        case CMD_imenu:     case CMD_inoremenu:     case CMD_iunmenu:
        case CMD_cmenu:     case CMD_cnoremenu:     case CMD_cunmenu:
+       case CMD_tlmenu:    case CMD_tlnoremenu:    case CMD_tlunmenu:
        case CMD_tmenu:                             case CMD_tunmenu:
        case CMD_popup:     case CMD_tearoff:       case CMD_emenu:
            return set_context_in_menu_cmd(xp, cmd, arg, forceit);
*** ../vim-8.1.0486/src/menu.c  2018-09-10 21:04:09.872392623 +0200
--- src/menu.c  2018-10-19 19:18:38.677792759 +0200
***************
*** 58,64 ****
  static char_u *menu_translate_tab_and_shift(char_u *arg_start);
  
  /* The character for each menu mode */
! static char_u menu_mode_chars[] = {'n', 'v', 's', 'o', 'i', 'c', 't'};
  
  static char_u e_notsubmenu[] = N_("E327: Part of menu-item path is not 
sub-menu");
  static char_u e_othermode[] = N_("E328: Menu only exists in another mode");
--- 58,64 ----
  static char_u *menu_translate_tab_and_shift(char_u *arg_start);
  
  /* The character for each menu mode */
! static char *menu_mode_chars[] = {"n", "v", "s", "o", "i", "c", "tl", "t"};
  
  static char_u e_notsubmenu[] = N_("E327: Part of menu-item path is not 
sub-menu");
  static char_u e_othermode[] = N_("E328: Menu only exists in another mode");
***************
*** 1196,1202 ****
                    return;
                for (i = 0; i < depth + 2; i++)
                    MSG_PUTS("  ");
!               msg_putchar(menu_mode_chars[bit]);
                if (menu->noremap[bit] == REMAP_NONE)
                    msg_putchar('*');
                else if (menu->noremap[bit] == REMAP_SCRIPT)
--- 1196,1202 ----
                    return;
                for (i = 0; i < depth + 2; i++)
                    MSG_PUTS("  ");
!               msg_puts((char_u*)menu_mode_chars[bit]);
                if (menu->noremap[bit] == REMAP_NONE)
                    msg_putchar('*');
                else if (menu->noremap[bit] == REMAP_SCRIPT)
***************
*** 1645,1650 ****
--- 1645,1656 ----
            modes = MENU_INSERT_MODE;
            break;
        case 't':
+           if (*cmd == 'l')            /* tlmenu, tlunmenu, tlnoremenu */
+           {
+               modes = MENU_TERMINAL_MODE;
+               ++cmd;
+               break;
+           }
            modes = MENU_TIP_MODE;      /* tmenu */
            break;
        case 'c':                       /* cmenu */
***************
*** 1687,1698 ****
  {
      char_u    *p;
      int               len = (int)STRLEN(name);
  
!     p = vim_strnsave(name, len + 1);
      if (p != NULL)
      {
!       mch_memmove(p + 6, p + 5, (size_t)(len - 4));
!       p[5] = menu_mode_chars[idx];
      }
      return p;
  }
--- 1693,1710 ----
  {
      char_u    *p;
      int               len = (int)STRLEN(name);
+     char      *mode_chars = menu_mode_chars[idx];
+     int               mode_chars_len = (int)strlen(mode_chars);
+     int               i;
  
!     p = vim_strnsave(name, len + mode_chars_len);
      if (p != NULL)
      {
!       mch_memmove(p + 5 + mode_chars_len, p + 5, (size_t)(len - 4));
!       for (i = 0; i < mode_chars_len; ++i)
!       {
!           p[5 + i] = menu_mode_chars[idx][i];
!       }
      }
      return p;
  }
***************
*** 1712,1717 ****
--- 1724,1733 ----
        idx = MENU_INDEX_INSERT;
      else if (state & CMDLINE)
        idx = MENU_INDEX_CMDLINE;
+ #ifdef FEAT_TERMINAL
+     else if (term_use_loop())
+       idx = MENU_INDEX_TERMINAL;
+ #endif
      else if (VIsual_active)
      {
        if (VIsual_select)
***************
*** 1872,1877 ****
--- 1888,1899 ----
      static int
  get_menu_mode(void)
  {
+ #ifdef FEAT_TERMINAL
+     if (term_use_loop())
+     {
+       return MENU_INDEX_TERMINAL;
+     }
+ #endif
      if (VIsual_active)
      {
        if (VIsual_select)
***************
*** 1910,1932 ****
  show_popupmenu(void)
  {
      vimmenu_T *menu;
!     int               mode;
  
!     mode = get_menu_mode();
!     if (mode == MENU_INDEX_INVALID)
        return;
!     mode = menu_mode_chars[mode];
  
!     {
!       char_u      ename[2];
! 
!       ename[0] = mode;
!       ename[1] = NUL;
!       apply_autocmds(EVENT_MENUPOPUP, ename, NULL, FALSE, curbuf);
!     }
  
      for (menu = root_menu; menu != NULL; menu = menu->next)
!       if (STRNCMP("PopUp", menu->name, 5) == 0 && menu->name[5] == mode)
            break;
  
      /* Only show a popup when it is defined and has entries */
--- 1932,1951 ----
  show_popupmenu(void)
  {
      vimmenu_T *menu;
!     int               menu_mode;
!     char*     mode;
!     int               mode_len;
  
!     menu_mode = get_menu_mode();
!     if (menu_mode == MENU_INDEX_INVALID)
        return;
!     mode = menu_mode_chars[menu_mode];
!     mode_len = (int)strlen(mode);
  
!     apply_autocmds(EVENT_MENUPOPUP, (char_u*)mode, NULL, FALSE, curbuf);
  
      for (menu = root_menu; menu != NULL; menu = menu->next)
!       if (STRNCMP("PopUp", menu->name, 5) == 0 && STRNCMP(menu->name + 5, 
mode, mode_len) == 0)
            break;
  
      /* Only show a popup when it is defined and has entries */
***************
*** 2249,2330 ****
  /*
   * Execute "menu".  Use by ":emenu" and the window toolbar.
   * "eap" is NULL for the window toolbar.
   */
      void
! execute_menu(exarg_T *eap, vimmenu_T *menu)
  {
!     char_u    *mode;
!     int               idx = -1;
  
!     /* Use the Insert mode entry when returning to Insert mode. */
!     if (restart_edit
  #ifdef FEAT_EVAL
!           && !current_sctx.sc_sid
  #endif
!           )
!     {
!       mode = (char_u *)"Insert";
!       idx = MENU_INDEX_INSERT;
!     }
!     else if (VIsual_active)
!     {
!       mode = (char_u *)"Visual";
!       idx = MENU_INDEX_VISUAL;
!     }
!     else if (eap != NULL && eap->addr_count)
!     {
!       pos_T   tpos;
! 
!       mode = (char_u *)"Visual";
!       idx = MENU_INDEX_VISUAL;
! 
!       /* GEDDES: This is not perfect - but it is a
!        * quick way of detecting whether we are doing this from a
!        * selection - see if the range matches up with the visual
!        * select start and end.  */
!       if ((curbuf->b_visual.vi_start.lnum == eap->line1)
!               && (curbuf->b_visual.vi_end.lnum) == eap->line2)
!       {
!           /* Set it up for visual mode - equivalent to gv.  */
!           VIsual_mode = curbuf->b_visual.vi_mode;
!           tpos = curbuf->b_visual.vi_end;
!           curwin->w_cursor = curbuf->b_visual.vi_start;
!           curwin->w_curswant = curbuf->b_visual.vi_curswant;
        }
!       else
        {
!           /* Set it up for line-wise visual mode */
!           VIsual_mode = 'V';
!           curwin->w_cursor.lnum = eap->line1;
!           curwin->w_cursor.col = 1;
!           tpos.lnum = eap->line2;
!           tpos.col = MAXCOL;
! #ifdef FEAT_VIRTUALEDIT
!           tpos.coladd = 0;
  #endif
        }
  
!       /* Activate visual mode */
!       VIsual_active = TRUE;
!       VIsual_reselect = TRUE;
!       check_cursor();
!       VIsual = curwin->w_cursor;
!       curwin->w_cursor = tpos;
  
!       check_cursor();
  
!       /* Adjust the cursor to make sure it is in the correct pos
!        * for exclusive mode */
!       if (*p_sel == 'e' && gchar_cursor() != NUL)
!           ++curwin->w_cursor.col;
      }
  
      /* For the WinBar menu always use the Normal mode menu. */
      if (idx == -1 || eap == NULL)
-     {
-       mode = (char_u *)"Normal";
        idx = MENU_INDEX_NORMAL;
-     }
  
      if (idx != MENU_INDEX_INVALID && menu->strings[idx] != NULL)
      {
--- 2268,2353 ----
  /*
   * Execute "menu".  Use by ":emenu" and the window toolbar.
   * "eap" is NULL for the window toolbar.
+  * "mode_idx" specifies a MENU_INDEX_ value, use -1 to depend on the current
+  * state.
   */
      void
! execute_menu(exarg_T *eap, vimmenu_T *menu, int mode_idx)
  {
!     int               idx = mode_idx;
  
!     if (idx < 0)
!     {
!       /* Use the Insert mode entry when returning to Insert mode. */
!       if (restart_edit
  #ifdef FEAT_EVAL
!               && !current_sctx.sc_sid
  #endif
!               )
!       {
!           idx = MENU_INDEX_INSERT;
        }
! #ifdef FEAT_TERMINAL
!       else if (term_use_loop())
        {
!           idx = MENU_INDEX_TERMINAL;
!       }
  #endif
+       else if (VIsual_active)
+       {
+           idx = MENU_INDEX_VISUAL;
        }
+       else if (eap != NULL && eap->addr_count)
+       {
+           pos_T       tpos;
  
!           idx = MENU_INDEX_VISUAL;
  
!           /* GEDDES: This is not perfect - but it is a
!            * quick way of detecting whether we are doing this from a
!            * selection - see if the range matches up with the visual
!            * select start and end.  */
!           if ((curbuf->b_visual.vi_start.lnum == eap->line1)
!                   && (curbuf->b_visual.vi_end.lnum) == eap->line2)
!           {
!               /* Set it up for visual mode - equivalent to gv.  */
!               VIsual_mode = curbuf->b_visual.vi_mode;
!               tpos = curbuf->b_visual.vi_end;
!               curwin->w_cursor = curbuf->b_visual.vi_start;
!               curwin->w_curswant = curbuf->b_visual.vi_curswant;
!           }
!           else
!           {
!               /* Set it up for line-wise visual mode */
!               VIsual_mode = 'V';
!               curwin->w_cursor.lnum = eap->line1;
!               curwin->w_cursor.col = 1;
!               tpos.lnum = eap->line2;
!               tpos.col = MAXCOL;
! #ifdef FEAT_VIRTUALEDIT
!               tpos.coladd = 0;
! #endif
!           }
  
!           /* Activate visual mode */
!           VIsual_active = TRUE;
!           VIsual_reselect = TRUE;
!           check_cursor();
!           VIsual = curwin->w_cursor;
!           curwin->w_cursor = tpos;
! 
!           check_cursor();
! 
!           /* Adjust the cursor to make sure it is in the correct pos
!            * for exclusive mode */
!           if (*p_sel == 'e' && gchar_cursor() != NUL)
!               ++curwin->w_cursor.col;
!       }
      }
  
      /* For the WinBar menu always use the Normal mode menu. */
      if (idx == -1 || eap == NULL)
        idx = MENU_INDEX_NORMAL;
  
      if (idx != MENU_INDEX_INVALID && menu->strings[idx] != NULL)
      {
***************
*** 2351,2357 ****
--- 2374,2408 ----
                                                     TRUE, menu->silent[idx]);
      }
      else if (eap != NULL)
+     {
+       char_u  *mode;
+ 
+       switch (idx)
+       {
+           case MENU_INDEX_VISUAL:
+               mode = (char_u *)"Visual";
+               break;
+           case MENU_INDEX_SELECT:
+               mode = (char_u *)"Select";
+               break;
+           case MENU_INDEX_OP_PENDING:
+               mode = (char_u *)"Op-pending";
+               break;
+           case MENU_INDEX_TERMINAL:
+               mode = (char_u *)"Terminal";
+               break;
+           case MENU_INDEX_INSERT:
+               mode = (char_u *)"Insert";
+               break;
+           case MENU_INDEX_CMDLINE:
+               mode = (char_u *)"Cmdline";
+               break;
+           // case MENU_INDEX_TIP: cannot happen
+           default:
+               mode = (char_u *)"Normal";
+       }
        EMSG2(_("E335: Menu not defined for %s mode"), mode);
+     }
  }
  
  /*
***************
*** 2364,2372 ****
      vimmenu_T *menu;
      char_u    *name;
      char_u    *saved_name;
      char_u    *p;
  
!     saved_name = vim_strsave(eap->arg);
      if (saved_name == NULL)
        return;
  
--- 2415,2443 ----
      vimmenu_T *menu;
      char_u    *name;
      char_u    *saved_name;
+     char_u    *arg = eap->arg;
      char_u    *p;
+     int               gave_emsg = FALSE;
+     int               mode_idx = -1;
+ 
+     if (arg[0] && VIM_ISWHITE(arg[1]))
+     {
+       switch (arg[0])
+       {
+           case 'n': mode_idx = MENU_INDEX_NORMAL; break;
+           case 'v': mode_idx = MENU_INDEX_VISUAL; break;
+           case 's': mode_idx = MENU_INDEX_SELECT; break;
+           case 'o': mode_idx = MENU_INDEX_OP_PENDING; break;
+           case 't': mode_idx = MENU_INDEX_TERMINAL; break;
+           case 'i': mode_idx = MENU_INDEX_INSERT; break;
+           case 'c': mode_idx = MENU_INDEX_CMDLINE; break;
+           default: EMSG2(_(e_invarg2), arg);
+                    return;
+       }
+       arg = skipwhite(arg + 2);
+     }
  
!     saved_name = vim_strsave(arg);
      if (saved_name == NULL)
        return;
  
***************
*** 2384,2389 ****
--- 2455,2461 ----
                if (*p == NUL && menu->children != NULL)
                {
                    EMSG(_("E333: Menu path must lead to a menu item"));
+                   gave_emsg = TRUE;
                    menu = NULL;
                }
                else if (*p != NUL && menu->children == NULL)
***************
*** 2403,2414 ****
      vim_free(saved_name);
      if (menu == NULL)
      {
!       EMSG2(_("E334: Menu not found: %s"), eap->arg);
        return;
      }
  
!     /* Found the menu, so execute. */
!     execute_menu(eap, menu);
  }
  
  /*
--- 2475,2487 ----
      vim_free(saved_name);
      if (menu == NULL)
      {
!       if (!gave_emsg)
!           EMSG2(_("E334: Menu not found: %s"), arg);
        return;
      }
  
!     // Found the menu, so execute.
!     execute_menu(eap, menu, mode_idx);
  }
  
  /*
***************
*** 2445,2451 ****
                check_cursor();
            }
  
!           execute_menu(NULL, item->wb_menu);
  
            if (save_curwin != NULL)
            {
--- 2518,2524 ----
                check_cursor();
            }
  
!           execute_menu(NULL, item->wb_menu, -1);
  
            if (save_curwin != NULL)
            {
*** ../vim-8.1.0486/src/proto/menu.pro  2018-05-17 13:52:44.000000000 +0200
--- src/proto/menu.pro  2018-10-19 19:18:21.773946949 +0200
***************
*** 19,25 ****
  void gui_update_menus(int modes);
  int gui_is_menu_shortcut(int key);
  void gui_mch_toggle_tearoffs(int enable);
! void execute_menu(exarg_T *eap, vimmenu_T *menu);
  void ex_emenu(exarg_T *eap);
  void winbar_click(win_T *wp, int col);
  vimmenu_T *gui_find_menu(char_u *path_name);
--- 19,25 ----
  void gui_update_menus(int modes);
  int gui_is_menu_shortcut(int key);
  void gui_mch_toggle_tearoffs(int enable);
! void execute_menu(exarg_T *eap, vimmenu_T *menu, int mode_idx);
  void ex_emenu(exarg_T *eap);
  void winbar_click(win_T *wp, int col);
  vimmenu_T *gui_find_menu(char_u *path_name);
*** ../vim-8.1.0486/src/popupmnu.c      2018-09-09 15:27:54.808344790 +0200
--- src/popupmnu.c      2018-10-19 19:06:36.212711840 +0200
***************
*** 1176,1182 ****
        if ((mp->modes & mp->enabled & mode) && idx++ == pum_selected)
        {
            vim_memset(&ea, 0, sizeof(ea));
!           execute_menu(&ea, mp);
            break;
        }
  }
--- 1176,1182 ----
        if ((mp->modes & mp->enabled & mode) && idx++ == pum_selected)
        {
            vim_memset(&ea, 0, sizeof(ea));
!           execute_menu(&ea, mp, -1);
            break;
        }
  }
*** ../vim-8.1.0486/src/structs.h       2018-10-14 22:38:06.161665231 +0200
--- src/structs.h       2018-10-19 18:35:52.662453090 +0200
***************
*** 3101,3108 ****
  #define MENU_INDEX_OP_PENDING 3
  #define MENU_INDEX_INSERT     4
  #define MENU_INDEX_CMDLINE    5
! #define MENU_INDEX_TIP                6
! #define MENU_MODES            7
  
  /* Menu modes */
  #define MENU_NORMAL_MODE      (1 << MENU_INDEX_NORMAL)
--- 3101,3109 ----
  #define MENU_INDEX_OP_PENDING 3
  #define MENU_INDEX_INSERT     4
  #define MENU_INDEX_CMDLINE    5
! #define MENU_INDEX_TERMINAL   6
! #define MENU_INDEX_TIP                7
! #define MENU_MODES            8
  
  /* Menu modes */
  #define MENU_NORMAL_MODE      (1 << MENU_INDEX_NORMAL)
***************
*** 3111,3116 ****
--- 3112,3118 ----
  #define MENU_OP_PENDING_MODE  (1 << MENU_INDEX_OP_PENDING)
  #define MENU_INSERT_MODE      (1 << MENU_INDEX_INSERT)
  #define MENU_CMDLINE_MODE     (1 << MENU_INDEX_CMDLINE)
+ #define MENU_TERMINAL_MODE    (1 << MENU_INDEX_TERMINAL)
  #define MENU_TIP_MODE         (1 << MENU_INDEX_TIP)
  #define MENU_ALL_MODES                ((1 << MENU_INDEX_TIP) - 1)
  /*note MENU_INDEX_TIP is not a 'real' mode*/
*** ../vim-8.1.0486/src/testdir/test_menu.vim   2017-03-18 20:09:29.000000000 
+0100
--- src/testdir/test_menu.vim   2018-10-19 22:19:19.563500587 +0200
***************
*** 30,32 ****
--- 30,66 ----
  
    source $VIMRUNTIME/delmenu.vim
  endfunc
+ 
+ func Test_menu_commands()
+   nmenu 2 Test.FooBar :let g:did_menu = 'normal'<CR>
+   vmenu 2 Test.FooBar :let g:did_menu = 'visual'<CR>
+   smenu 2 Test.FooBar :let g:did_menu = 'select'<CR>
+   omenu 2 Test.FooBar :let g:did_menu = 'op-pending'<CR>
+   tlmenu 2 Test.FooBar :let g:did_menu = 'terminal'<CR>
+   imenu 2 Test.FooBar :let g:did_menu = 'insert'<CR>
+   cmenu 2 Test.FooBar :let g:did_menu = 'cmdline'<CR>
+   emenu n Test.FooBar
+   call assert_equal('normal', g:did_menu)
+   emenu v Test.FooBar
+   call assert_equal('visual', g:did_menu)
+   emenu s Test.FooBar
+   call assert_equal('select', g:did_menu)
+   emenu o Test.FooBar
+   call assert_equal('op-pending', g:did_menu)
+   emenu t Test.FooBar
+   call assert_equal('terminal', g:did_menu)
+   emenu i Test.FooBar
+   call assert_equal('insert', g:did_menu)
+   emenu c Test.FooBar
+   call assert_equal('cmdline', g:did_menu)
+ 
+   aunmenu Test.FooBar
+   tlunmenu Test.FooBar
+   call assert_fails('emenu n Test.FooBar', 'E334:')
+ 
+   nmenu 2 Test.FooBar.Child :let g:did_menu = 'foobar'<CR>
+   call assert_fails('emenu n Test.FooBar', 'E333:')
+   nunmenu Test.FooBar.Child
+ 
+   unlet g:did_menu
+ endfun
*** ../vim-8.1.0486/src/version.c       2018-10-19 17:35:58.081200733 +0200
--- src/version.c       2018-10-19 18:36:44.394062760 +0200
***************
*** 794,795 ****
--- 794,797 ----
  {   /* Add new patch number below this line */
+ /**/
+     487,
  /**/

-- 
"Women marry men hoping they will change. Men marry women hoping
they will not. So each is inevitably disappointed."
 - Einstein

 /// Bram Moolenaar -- b...@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    ///

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui