aboutsummaryrefslogtreecommitdiff
path: root/runtime/doc/gui.txt
blob: 399b33156ce77d021e44f003104e8963198542ea (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
*gui.txt*       Nvim


                  VIM REFERENCE MANUAL    by Bram Moolenaar


Nvim Graphical User Interface                           *gui* *GUI*

Any client that supports the Nvim |ui-protocol| can be used as a UI for Nvim.
And multiple UIs can connect to the same Nvim instance! The terms "UI" and
"GUI" are often used interchangeably because all Nvim UI clients have the same
potential capabilities; the "TUI" refers to a UI client that outputs to your
terminal, whereas a "GUI" outputs directly to the OS graphics system.

Except where noted, this document describes UI capabilities available to both
TUI and GUI (assuming the UI supports the given feature). See |TUI| for notes
specific to the terminal UI. Help tags with the "gui-" prefix refer to UI
features, whereas help tags with the "ui-" prefix refer to the |ui-protocol|.

                                      Type |gO| to see the table of contents.

==============================================================================
Third-party GUIs                                *third-party-guis* *vscode*

Nvim provides a builtin "terminal UI" (|TUI|), but also works with many
(third-party) GUIs which may provide a fresh look or extra features on top of
Nvim. For example, "vscode-neovim" essentially allows you to use VSCode as
a Nvim GUI.

- vscode-neovim (Nvim in VSCode!) https://github.com/vscode-neovim/vscode-neovim
- Firenvim (Nvim in your web browser!) https://github.com/glacambre/firenvim
- Neovide https://neovide.dev/
- Goneovim https://github.com/akiyosi/goneovim
- Nvy https://github.com/RMichelsen/Nvy
- Neovim-Qt (Qt5) https://github.com/equalsraf/neovim-qt
- VimR (macOS) https://github.com/qvacua/vimr
- Others https://github.com/neovim/neovim/wiki/Related-projects#gui

==============================================================================
Starting the GUI                                *gui-config* *gui-start*

                                *ginit.vim* *gui-init* *gvimrc* *$MYGVIMRC*
For GUI-specific configuration Nvim provides the |UIEnter| event.  This
happens after other |initialization|s, or whenever a UI attaches (multiple UIs
can connect to any Nvim instance).

Example: this sets "g:gui" to the value of the UI's "rgb" field:    >
        :autocmd UIEnter * let g:gui = filter(nvim_list_uis(),{k,v-> v.chan==v:event.chan})[0].rgb
<
								*ui-lifecycle*
Nvim's |clientserver| architecture allows you to |:restart|, |:detach| (Nvim
continues in the background), or |:connect| to another instance.

Use cases:
- keep the session running on remote machines after (unexpected) SSH disconnect
- open files in an existing session from your OS file explorer
- run Nvim as a background process (daemon/service), atttach/detach as needed

------------------------------------------------------------------------------
Stop or detach the current UI

                                                             *:detach* *E5768*
:[range]detach  Detaches the current UI. Other UIs (if any) remain attached,
                unless [range] was given. If [range] is "%", all UIs _except_
                the current UI are detached: >vim

                    :%detach

<                The server (typically `nvim --embed`) continues running as
                a background process. Use |:connect| or |--remote-ui| to
                reattach. Before detaching, you may want to note the server
                address:
                >vim
                    :echo v:servername
<
                Note: The server closes the UI RPC channel, so :detach works
                for any GUI/UI; but if the client isn't expecting this, it may
                (incorrectly) report an error.

                                                                    *:detach!*
:detach!        Sets the current UI as "detachable" without detaching it now:
                the UI stays attached, but if it later disconnects
                unexpectedly (e.g. host terminal closed, ssh disconnect,
                etc.), the server keeps running in the background.
                Use |:connect| or |--remote-ui| to reattach.

                Same as |nvim_chan_set()| `detach=true` on the UI channel.
                Preserved across |:restart|.

                If you always want Nvim to survive accidental disconnect, put
                this in your config: >vim

                    silent detach!
<

------------------------------------------------------------------------------
Restart Nvim

:restart[!] [+cmd] [command]			*:restart* *:restart!* *E5201*
                Restarts Nvim. Saves and restores the current session, unless
                [!] is given. Sets |v:exitreason|. See also |ZR|.

                1. Saves the current session (unless [!] was given).
                2. Stops Nvim using `:qall` (or |+cmd|, if given).
                3. Starts a new Nvim server using the same |v:argv| (except
                   `-- [file…]` files and `-S [file]`), and sets |v:startreason|.
                4. Restores the saved session (unless [!] was given).
                5. Attaches all UIs to the new Nvim server and runs `[command]`
                   on it.

                Example: discard changes and stop with `:qall!`, then restart: >
                    :restart +qall!
<                Example: restart and (manually) restore the session: >
                    :mksession! Session.vim | restart! source Session.vim
<                Example: restart and update plugins: >
                    :restart packupdate
<
                Note:
                • Only works if the UI and server are on the same system.
                • Windows limitation: during +cmd execution, |v:servername|
                  refers to a temporary address.
                • If no UI handles the "restart" event, this leaves a dangling
                  process.
                • To adjust what `:restart` restores, set 'sessionoptions'.

------------------------------------------------------------------------------
Connect UI to a different server

:connect {address}					*:connect*
                Attaches the UI to another Nvim instance: detaches from the
                current server, then attaches to {address}.

                Note: If the current UI hasn't implemented the "connect" UI
                event, this command is equivalent to |:detach|.

:connect! {address}
                Same as |:connect| but it also stops the detached server if
                no other UI is currently attached to it.

------------------------------------------------------------------------------
GUI commands

:winp[os]					*:winp* *:winpos* *E188*
                Display current position of the top left corner of the GUI vim
                window in pixels.  Does not work in all versions.
                Also see |getwinpos()|, |getwinposx()| and |getwinposy()|.

:winp[os] {X} {Y}                                                       *E466*
                Put the GUI vim window at the given {X} and {Y} coordinates.
                The coordinates should specify the position in pixels of the
                top left corner of the window.
                When the GUI window has not been opened yet, the values are
                remembered until the window is opened.  The position is
                adjusted to make the window fit on the screen (if possible).

:win[size] {width} {height}			*:wi* *:win* *:winsize* *E465*
                Set the window height to {width} by {height} characters.
                Obsolete, use ":set lines=11 columns=22".

==============================================================================
Using the mouse                                         *mouse-using*

                                        *mouse-mode-table* *mouse-overview*
Overview of what the mouse buttons do, when 'mousemodel' is "extend":

               *<S-LeftMouse>* *<A-RightMouse>* *<S-RightMouse>* *<RightDrag>*
                                                 *<RightRelease>* *<LeftDrag>*
Normal Mode:

  event		position cursor	selection	  change window	action ~
  <LeftMouse>		yes	end			yes
  <C-LeftMouse>		no	no change		no	toggle multicursor
  <S-LeftMouse>		yes	no change		yes	"*" (2)
  <LeftDrag>		yes	start or extend (1)	no
  <LeftRelease>		yes	start or extend (1)	no
  <MiddleMouse>		yes	if not active		no	put
  <MiddleMouse>		yes	if active		no	yank and put
  <RightMouse>		yes	start or extend		yes
  <A-RightMouse>	yes	start or extend blockw.	yes
  <S-RightMouse>	yes	no change		yes	"#" (2)
  <C-RightMouse>	no	no change		no	"CTRL-T"
  <RightDrag>		yes	extend			no
  <RightRelease>	yes	extend			no

Insert or Replace Mode:

  event		position cursor	selection	  change window	action ~
  <LeftMouse>		yes	(cannot be active)	yes
  <C-LeftMouse>		no	(cannot be active)	no	no-op
  <S-LeftMouse>		yes	(cannot be active)	yes	"CTRL-O*" (2)
  <LeftDrag>		yes	start or extend (1)	no	like CTRL-O (1)
  <LeftRelease>		yes	start or extend (1)	no	like CTRL-O (1)
  <MiddleMouse>		no	(cannot be active)	no	put register
  <RightMouse>		yes	start or extend		yes	like CTRL-O
  <A-RightMouse>	yes	start or extend blockw.	yes
  <S-RightMouse>	yes	(cannot be active)	yes	"CTRL-O#" (2)
  <C-RightMouse>	no	(cannot be active)	no	"CTRL-O CTRL-T"

In a help window:

  event		position cursor	selection	  change window	action ~
  <2-LeftMouse>		yes	(cannot be active)	no	"^]" (jump to help tag)

When 'mousemodel' is "popup", these are different:

                                                               *<A-LeftMouse>*
Normal Mode:

  event		position cursor	selection	  change window	action ~
  <S-LeftMouse>		yes	start or extend (1)	no
  <A-LeftMouse>		yes	start/extend blockw	no
  <RightMouse>		no	popup menu		no

Insert or Replace Mode:

  event		position cursor	selection	  change window	action ~
  <S-LeftMouse>		yes	start or extend (1)	no	like CTRL-O (1)
  <A-LeftMouse>		yes	start/extend blockw	no
  <RightMouse>		no	popup menu		no

(1) only if mouse pointer moved since press
(2) only if click is in same buffer

Clicking the left mouse button causes the cursor to be positioned.  If the
click is in another window that window is made the active window.  When
editing the command-line the cursor can only be positioned on the
command-line.  When in Insert mode Vim remains in Insert mode.  If 'scrolloff'
is set, and the cursor is positioned within 'scrolloff' lines from the window
border, the text is scrolled.

A selection can be started by pressing the left mouse button on the first
character, moving the mouse to the last character, then releasing the mouse
button.  You will not always see the selection until you release the button,
only in some versions (GUI, Win32) will the dragging be shown immediately.
Note that you can make the text scroll by moving the mouse at least one
character in the first/last line in the window when 'scrolloff' is non-zero.

In Normal, Visual and Select mode clicking the right mouse button causes the
Visual area to be extended.  When 'mousemodel' is "popup", the left button has
to be used while keeping the shift key pressed.  When clicking in a window
which is editing another buffer, the Visual or Select mode is stopped.

In Normal, Visual and Select mode clicking the right mouse button with the alt
key pressed causes the Visual area to become blockwise.  When 'mousemodel' is
"popup" the left button has to be used with the alt key.  Note that this won't
work on systems where the window manager consumes the mouse events when the
alt key is pressed (it may move the window).

                *double-click* *<2-LeftMouse>* *<3-LeftMouse>* *<4-LeftMouse>*
Double, triple and quadruple clicks are supported.  For selecting text, extra
clicks extend the selection:

	click		select ~
	double		word or % match
	triple		line
	quadruple	rectangular block

Exception: In a :help window, double-click jumps to help for the word that is
clicked on.

Double-click on a word selects that word.  'iskeyword' is used to specify
which characters are included in a word.  Double-click on a character that has
a match selects until that match (like using "v%").  If the match is an
#if/#else/#endif block, the selection becomes linewise. The time for
double-clicking can be set with the 'mousetime' option.

Example: configure double-click to jump to the tag under the cursor: >vim
        :map <2-LeftMouse> :exe "tag " .. expand("<cword>")<CR>

Dragging the mouse with a double-click (button-down, button-up, button-down
and then drag) will result in whole words to be selected.  This continues
until the button is released, at which point the selection is per character
again.

For scrolling with the mouse see |scroll-mouse-wheel|.

In Insert mode, when a selection is started, Vim goes into Normal mode
temporarily.  When Visual or Select mode ends, it returns to Insert mode.
This is like using CTRL-O in Insert mode.  Select mode is used when the
'selectmode' option contains "mouse".

                                                *X1Mouse* *X1Drag* *X1Release*
                                                *X2Mouse* *X2Drag* *X2Release*
                                              *<MiddleRelease>* *<MiddleDrag>*
Mouse clicks can be mapped using these |keycodes|:

  code			mouse button			normal action ~
  <LeftMouse>		left pressed			set cursor position
  <LeftDrag>		left moved while pressed	extend selection
  <LeftRelease>		left released			set selection end
  <MiddleMouse>		middle pressed			paste text at cursor position
  <MiddleDrag>		middle moved while pressed	-
  <MiddleRelease>	middle released			-
  <RightMouse>		right pressed			extend selection
  <RightDrag>		right moved while pressed	extend selection
  <RightRelease>	right released			set selection end
  <X1Mouse>		X1 button pressed		-
  <X1Drag>		X1 moved while pressed		-
  <X1Release>		X1 button release		-
  <X2Mouse>		X2 button pressed		-
  <X2Drag>		X2 moved while pressed		-
  <X2Release>		X2 button release		-

The X1 and X2 buttons refer to the extra buttons found on some mice (e.g. the
right thumb).

Examples: >vim
        :noremap <MiddleMouse> <LeftMouse><MiddleMouse>
Paste at the position of the middle mouse button click (otherwise the paste
would be done at the cursor position). >vim

        :noremap <LeftRelease> <LeftRelease>y
Immediately yank the selection, when using Visual mode.

Note the use of ":noremap" instead of "map" to avoid a recursive mapping.
>vim
        :map <X1Mouse> <C-O>
        :map <X2Mouse> <C-I>
Map the X1 and X2 buttons to go forwards and backwards in the jump list, see
|CTRL-O| and |CTRL-I|.

                                       *mouse-swap-buttons* *pi_swapmouse*
To swap the meaning of the left and right mouse buttons: >vim
        :noremap        <LeftMouse>     <RightMouse>
        :noremap        <LeftDrag>      <RightDrag>
        :noremap        <LeftRelease>   <RightRelease>
        :noremap        <RightMouse>    <LeftMouse>
        :noremap        <RightDrag>     <LeftDrag>
        :noremap        <RightRelease>  <LeftRelease>
        :noremap        g<LeftMouse>    <C-RightMouse>
        :noremap        g<RightMouse>   <C-LeftMouse>
        :noremap!       <LeftMouse>     <RightMouse>
        :noremap!       <LeftDrag>      <RightDrag>
        :noremap!       <LeftRelease>   <RightRelease>
        :noremap!       <RightMouse>    <LeftMouse>
        :noremap!       <RightDrag>     <LeftDrag>
        :noremap!       <RightRelease>  <LeftRelease>
<

The `swapmouse` plugin does exactly this. Use |pack-add| to load it: >vim
    :packadd! swapmouse
<

==============================================================================
Scrollbars                                              *gui-scrollbars*

There are vertical scrollbars and a horizontal scrollbar.  You may
configure which ones appear with the 'guioptions' option.

The interface looks like this (with `:set guioptions=mlrb`):
>
                       +------------------------------+
                       | File  Edit              Help | <- Menu bar (m)
                       +-+--------------------------+-+
                       |^|                          |^|
                       |#| Text area.               |#|
                       | |                          | |
                       |v|__________________________|v|
 Normal status line -> |-+ File.c              5,2  +-|
 between Vim windows   |^|""""""""""""""""""""""""""|^|
                       | |                          | |
                       | | Another file buffer.     | |
                       | |                          | |
                       |#|                          |#|
 Left scrollbar (l) -> |#|                          |#| <- Right
                       |#|                          |#|    scrollbar (r)
                       | |                          | |
                       |v|                          |v|
                       +-+--------------------------+-+
                       | |< ####                   >| | <- Bottom
                       +-+--------------------------+-+    scrollbar (b)
<
Any of the scrollbar or menu components may be turned off by not putting the
appropriate letter in the 'guioptions' string.  The bottom scrollbar is
only useful when 'nowrap' is set.


VERTICAL SCROLLBARS                                     *gui-vert-scroll*

Each Vim window has a scrollbar next to it which may be scrolled up and down
to move through the text in that buffer.  The size of the scrollbar-thumb
indicates the fraction of the buffer which can be seen in the window.
When the scrollbar is dragged all the way down, the last line of the file
will appear in the top of the window.

If a window is shrunk to zero height (by the growth of another window) its
scrollbar disappears.  It reappears when the window is restored.

If a window is vertically split, it will get a scrollbar when it is the
current window and when, taking the middle of the current window and drawing a
vertical line, this line goes through the window.
When there are scrollbars on both sides, and the middle of the current window
is on the left half, the right scrollbar column will contain scrollbars for
the rightmost windows.  The same happens on the other side.


HORIZONTAL SCROLLBARS                                   *gui-horiz-scroll*

The horizontal scrollbar (at the bottom of the Vim GUI) may be used to
scroll text sideways when the 'wrap' option is turned off.  The
scrollbar-thumb size is such that the text of the longest visible line may be
scrolled as far as possible left and right.  The cursor is moved when
necessary, it must remain on a visible character (unless 'virtualedit' is
set).

Computing the length of the longest visible line takes quite a bit of
computation, and it has to be done every time something changes.  If this
takes too much time or you don't like the cursor jumping to another line,
include the 'h' flag in 'guioptions'.  Then the scrolling is limited by the
text of the current cursor line.

==============================================================================
Drag and drop                                           *drag-n-drop*

You can drag and drop one or more files into the Vim window, where they will
be opened as if a |:drop| command was used.

If you hold down Shift while doing this, Vim changes to the first dropped
file's directory.  If you hold Ctrl Vim will always split a new window for the
file.  Otherwise it's only done if the current buffer has been changed.

You can also drop a directory on Vim.  This starts the explorer plugin for
that directory (assuming it was enabled, otherwise you'll get an error
message).  Keep Shift pressed to change to the directory instead.

If Vim happens to be editing a command line, the names of the dropped files
and directories will be inserted at the cursor.  This allows you to use these
names with any Ex command.  Special characters (space, tab, double quote and
"|"; backslash on non-MS-Windows systems) will be escaped.

==============================================================================
Menus                                                   *menus*

For an introduction see |usr_42.txt| in the user manual.


Using Menus                                             *using-menus*

Basically, menus can be used just like mappings.  You can define your own
menus, as many as you like.
Long-time Vim users won't use menus much.  But the power is in adding your own
menus and menu items.  They are most useful for things that you can't remember
what the key sequence was.

For creating menus in a different language, see |:menutrans|.

                                                        *menu.vim*
The default menus are read from the file "$VIMRUNTIME/menu.vim".  See
|$VIMRUNTIME| for where the path comes from.  You can set up your own menus.
Starting off with the default set is a good idea.  You can add more items, or,
if you don't like the defaults at all, start with removing all menus
|:unmenu-all|.  You can also avoid the default menus being loaded by adding
this line to your vimrc file (NOT your gvimrc file!): >
        :let did_install_default_menus = 1
If you also want to avoid the Syntax menu: >
        :let did_install_syntax_menu = 1
The first item in the Syntax menu can be used to show all available filetypes
in the menu (which can take a bit of time to load).  If you want to have all
filetypes already present at startup, add: >
        :let do_syntax_sel_menu = 1

Note that the menu.vim is sourced when `:syntax on` or `:filetype on` is
executed or after your .vimrc file is sourced.  This means that the 'encoding'
option and the language of messages (`:language messages`) must be set before
that (if you want to change them).

                                                        *console-menus*
Although this documentation is in the GUI section, you can actually use menus
in console mode too.  You will have to load |menu.vim| explicitly then, it is
not done by default.  You can use the |:emenu| command and command-line
completion with 'wildmenu' to access the menu entries almost like a real menu
system.  To do this, put these commands in your vimrc file: >
        :source $VIMRUNTIME/menu.vim
        :set wildmenu
        :set cpo-=<
        :set wcm=<C-Z>
        :map <F4> :emenu <C-Z>
Pressing <F4> will start the menu.  You can now use the cursor keys to select
a menu entry.  Hit <Enter> to execute it.  Hit <Esc> if you want to cancel.

Creating New Menus                                      *creating-menus*

                                *:me*  *:menu*  *:noreme*  *:noremenu*
                                *E330* *E327* *E331* *E336* *E333*
                                *E328* *E329* *E337* *E792* *E1310*
To create a new menu item, use the ":menu" commands.  They are mostly like
the ":map" set of commands (see |map-modes|), but the first argument is a menu
item name, given as a path of menus and submenus with a '.' between them,
e.g.: >

   :menu File.Save  :w<CR>
   :inoremenu File.Save  <C-O>:w<CR>
   :menu Edit.Big\ Changes.Delete\ All\ Spaces  :%s/[ ^I]//g<CR>

This last one will create a new item in the menu bar called "Edit", holding
the mouse button down on this will pop up a menu containing the item
"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-input|.

Special characters in a menu name:

                                                        *menu-shortcut*
- & The next character is the shortcut key.  Make sure each shortcut key is
  only used once in a (sub)menu.  If you want to insert a literal "&" in the
  menu name use "&&".
                                                        *menu-text*
- <Tab> Separates the menu name from right-aligned text.  This can be used to
  show the equivalent typed command.  The text "<Tab>" can be used here for
  convenience.  If you are using a real tab, don't forget to put a backslash
  before it!

Example: >

   :amenu &File.&Open<Tab>:e  :browse e<CR>

[typed literally]
With the shortcut "F" (while keeping the <Alt> key pressed), and then "O",
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.

                                        *:am*  *:amenu*  *:an*      *:anoremenu*
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>
    Insert          <C-\><C-O>
    Cmdline         <C-C>           <C-\><C-G>
    Op-pending      <C-C>           <C-\><C-G>
<
Example: >

    :amenu File.Next     :next^M

is equal to: >

    :nmenu File.Next     :next^M
    :vmenu File.Next     ^C:next^M^\^G
    :imenu File.Next     ^\^O:next^M
    :cmenu File.Next     ^C:next^M^\^G
    :omenu File.Next     ^C:next^M^\^G

Careful: In Insert mode this only works for a SINGLE Normal mode command,
because of the CTRL-O.  If you have two or more commands, you will need to use
the ":imenu" command.  For inserting text in any mode, you can use the
expression register: >

    :amenu Insert.foobar   "='foobar'<CR>P

The special text <Cmd> begins a "command menu", it executes the command
directly without changing modes.  Where you might use ":...<CR>" you can
instead use "<Cmd>...<CR>".  See |<Cmd>| for more info.  Example: >
    anoremenu File.Next <Cmd>next<CR>

Note that <Esc> in Cmdline mode executes the command, like in a mapping.  This
is Vi compatible.  Use CTRL-C to quit Cmdline mode.

                *:nme* *:nmenu*  *:nnoreme* *:nnoremenu* *:nunme* *:nunmenu*
Menu commands starting with "n" work in Normal mode. |mapmode-n|

                *:ome* *:omenu*  *:onoreme* *:onoremenu* *:ounme* *:ounmenu*
Menu commands starting with "o" work in Operator-pending mode. |mapmode-o|

                *:vme* *:vmenu*  *:vnoreme* *:vnoremenu* *:vunme* *:vunmenu*
Menu commands starting with "v" work in Visual mode. |mapmode-v|

                *:xme* *:xmenu*  *:xnoreme* *:xnoremenu* *:xunme* *:xunmenu*
Menu commands starting with "x" work in Visual and Select mode. |mapmode-x|

                *:sme* *:smenu*  *:snoreme* *:snoremenu* *:sunme* *:sunmenu*
Menu commands starting with "s" work in Select mode. |mapmode-s|

                *:ime* *:imenu*  *:inoreme* *:inoremenu* *:iunme* *:iunmenu*
Menu commands starting with "i" work in Insert mode. |mapmode-i|

                *:cme* *:cmenu*  *:cnoreme* *:cnoremenu* *:cunme* *:cunmenu*
Menu commands starting with "c" work in Cmdline mode. |mapmode-c|

                *:tlm* *:tlmenu* *:tln*     *:tlnoremenu* *:tlu*   *:tlunmenu*
Menu commands starting with "tl" work in Terminal mode. |mapmode-t|

                                                *:menu-<silent>* *:menu-silent*
To define a menu which will not be echoed on the command line, add
"<silent>" as the first argument.  Example: >
        :menu <silent> Settings.Ignore\ case  :set ic<CR>
The ":set ic" will not be echoed when using this menu.  Messages from the
executed command are still given though.  To shut them up too, add a ":silent"
in the executed command: >
        :menu <silent> Search.Header :exe ":silent normal /Header\r"<CR>
"<silent>" may also appear just after "<script>".

                                                *:menu-<script>* *:menu-script*
The "to" part of the m