Usr_42

Nvim :help 页面,生成源代码,使用 tree-sitter-vimdoc 解析器。


VIM 用户手册 - 作者 Bram Moolenaar
添加新的菜单
到目前为止,您已经知道 Vim 非常灵活。这包括 GUI 中使用的菜单。您可以定义自己的菜单条目,使某些命令更容易访问。这仅适用于喜欢使用鼠标的用户。
42.1 简介 42.2 菜单命令 42.3 各种 42.4 工具栏和弹出菜单
下一章:usr_43.txt 使用文件类型 上一章:usr_41.txt 编写 Vim 脚本 目录:usr_toc.txt

简介

Vim 使用的菜单定义在文件 "$VIMRUNTIME/menu.vim" 中。如果您想编写自己的菜单,您可能首先需要查看该文件。要定义菜单项,请使用 ":menu" 命令。该命令的基本形式如下
:menu {menu-item} {keys}
{menu-item} 描述了在菜单的何处放置该项。一个典型的 {menu-item} 是 "File.Save",它表示 "File" 菜单下的 "Save" 项。用点号分隔名称。示例
:menu File.Save  :update<CR>
":update" 命令在文件被修改时写入文件。您可以添加另一个级别:"Edit.Settings.Shiftwidth" 定义了 "Edit" 菜单下的 "Settings" 子菜单,其中包含 "Shiftwidth" 项。您可以使用更深的级别。不要过度使用它,因为您需要移动鼠标才能使用此类项。":menu" 命令与 ":map" 命令非常相似:左侧指定如何触发该项,右侧定义要执行的字符。{keys} 是字符,它们的用法与您键入它们的方式相同。因此在插入模式下,当 {keys} 是纯文本时,该文本将被插入。

加速键

符号 "&" 用于表示加速键。例如,您可以使用 Alt-F 选择 "File",然后使用 S 选择 "Save"。('winaltkeys' 选项可能会禁用此功能!)。因此,{menu-item} 看起来像 "&File.&Save"。加速键字符将在菜单中带下划线。您必须确保每个键在每个菜单中仅使用一次。否则,您将不知道这两个键中的哪个将被实际使用。Vim 不会为此发出警告。

优先级

File.Save 菜单项的实际定义如下
:menu 10.340 &File.&Save<Tab>:w  :confirm w<CR>
数字 10.340 称为优先级数字。编辑器使用它来决定菜单项的放置位置。第一个数字 (10) 表示菜单栏上的位置。数字越低,菜单的位置越靠左,数字越高,菜单的位置越靠右。这些是标准菜单使用的优先级
10 20 40 50 60 70 9999
+------------------------------------------------------------+ | 文件 编辑 工具 语法 缓冲区 窗口 帮助 | +------------------------------------------------------------+
请注意,"帮助" 菜单被赋予了一个非常高的数字,以便它出现在最右侧。第二个数字 (340) 决定了项目在下拉菜单中的位置。数字越低,位置越靠上,数字越高,位置越靠下。这些是 "文件" 菜单中的优先级
            +-----------------+
10.310        |Open...          |
10.320        |Split-Open...          |
10.325        |New                  |
10.330        |Close                  |
10.335        |---------------- |
10.340        |Save                  |
10.350        |Save As...          |
10.400        |---------------- |
10.410        |Split Diff with  |
10.420        |Split Patched By |
10.500        |---------------- |
10.510        |Print                  |
10.600        |---------------- |
10.610        |Save-Exit          |
10.620        |Exit                  |
            +-----------------+
请注意,数字之间有间隙。如果您真的想插入自己的项目(通常最好保留标准菜单,并为自己的项目添加新菜单),您可以在这里插入自己的项目。当您创建子菜单时,可以在优先级中添加另一个 ".number"。因此,{menu-item} 中的每个名称都有自己的优先级数字。

特殊字符

此示例中的 {menu-item} 是 "&File.&Save<Tab>:w"。这指出了一个重要的一点:{menu-item} 必须是一个单词。如果您想在名称中添加点号、空格或制表符,可以使用 <> 符号(例如,<Space><Tab>),或者使用反斜杠 (\) 进行转义。
:menu 10.305 &File.&Do\ It\.\.\. :exit<CR>
在此示例中,菜单项 "Do It..." 的名称包含一个空格,并且命令是 ":exit<CR>"。
菜单名称中的 <Tab> 字符用于分隔定义菜单名称的部分和提供用户提示的部分。<Tab> 后面的部分在菜单中右对齐显示。在 File.Save 菜单中,使用的名称是 "&File.&Save<Tab>:w"。因此,菜单名称是 "File.Save",提示是 ":w"。

分隔符

用于将相关菜单项分组在一起的分隔线可以通过使用以 "-" 开头和结尾的名称来定义。例如 "-sep-"。当使用多个分隔符时,名称必须不同。否则,名称无关紧要。分隔符的命令永远不会被执行,但您必须无论如何定义一个。单个冒号就可以了。示例
:amenu 20.510 Edit.-sep3- :

42.2 菜单命令

您可以定义仅在某些模式下存在的菜单项。这就像 ":map" 命令的变体一样
:menu Normal, Visual and Operator-pending mode :nmenu Normal mode :vmenu Visual mode :omenu Operator-pending mode :menu! Insert and Command-line mode :imenu Insert mode :cmenu Command-line mode :tlmenu Terminal mode :amenu All modes (except for Terminal mode)
为了避免菜单项的命令被映射,请使用 ":noremenu"、":nnoremenu"、":anoremenu" 等命令。
使用 :AMENU
":amenu" 命令有点不同。它假设您提供的 {keys} 将在正常模式下执行。当 Vim 在 Visual 或 Insert 模式下使用菜单时,Vim 首先必须返回到正常模式。":amenu" 会为您插入 CTRL-CCTRL-O。例如,如果您使用此命令
:amenu  90.100 Mine.Find\ Word  *
那么生成的菜单命令将是
正常模式:* Visual 模式:CTRL-C * Operator-pending 模式:CTRL-C * 插入模式:CTRL-O * 命令行模式:CTRL-C *
在命令行模式下,CTRL-C 将放弃到目前为止键入的命令。在 Visual 和 Operator-pending 模式下,CTRL-C 将停止该模式。Insert 模式下的 CTRL-O 将执行该命令,然后返回到 Insert 模式。CTRL-O 只对一个命令有效。如果您需要使用两个或多个命令,请将它们放在一个函数中并调用该函数。示例
:amenu  Mine.Next\ File  :call <SID>NextFile()<CR>
:function <SID>NextFile()
:  next
:  1/^Code
:endfunction
此菜单条目使用 ":next" 进入参数列表中的下一个文件。然后它搜索以 "Code" 开头的行。函数名前面的 <SID> 是脚本 ID。这使函数对当前 Vim 脚本文件局部。这避免了在另一个脚本文件中定义了相同名称的函数时出现问题。参见 <SID>.

静默菜单

菜单执行 {keys},就像您键入它们一样。对于 ":" 命令,这意味着您将看到该命令在命令行上回显。如果这是一个长命令,将出现 hit-Enter 提示。这可能会非常烦人!为了避免这种情况,请使菜单静默。这是通过 <silent> 参数完成的。例如,以前面示例中的 NextFile() 调用为例。当您使用此菜单时,您将在命令行上看到以下内容
:call <SNR>34_NextFile()
为了避免命令行上出现此文本,请将 "<silent>" 插入为第一个参数
:amenu <silent> Mine.Next\ File :call <SID>NextFile()<CR>
不要过分使用 "<silent>"。对于短命令,它是不需要的。如果您为其他人创建菜单,能够看到执行的命令将为他们提供一个关于他们可以键入什么内容的提示,而不是使用鼠标。

列出菜单

当菜单命令在没有 {keys} 部分的情况下使用时,它将列出已定义的菜单。您可以指定 {menu-item} 或其一部分,以列出特定菜单。示例
:amenu
这将列出所有菜单。这是一个很长的列表!最好指定菜单的名称以获得更短的列表
:amenu Edit
这将仅列出所有模式下的 "Edit" 菜单项。要仅列出 Insert 模式下的一个特定菜单项
:imenu Edit.Undo
请注意,您必须键入完全正确的名称。这里区分大小写。但是,加速键的 '&' 可以省略。<Tab> 以及它后面的内容也可以省略。

删除菜单

要删除菜单,使用与列出相同的命令,但将 "menu" 更改为 "unmenu"。因此,":menu" 变为 ":unmenu",":nmenu" 变为 ":nunmenu" 等。要删除 Insert 模式下的 "Tools.Make" 项
:iunmenu Tools.Make
您可以通过使用菜单名称来删除整个菜单及其所有项。示例
:aunmenu Syntax
这将删除 "Syntax" 菜单及其中的所有项。

42.3 各种

您可以使用 'guioptions' 中的标志更改菜单的外观。在默认值中,它们都包含在内,除了 "M"。您可以使用类似以下的命令删除标志
:set guioptions-=m
m 删除后,将不显示菜单栏。
M 添加后,将不会加载默认菜单。
g 删除后,非活动菜单项不会变灰,而是完全删除。(并非所有系统都支持。)
有关翻译菜单项,请参见 :menutrans.
由于必须使用鼠标选择菜单项,因此建议使用 ":browse" 命令来选择文件。以及 ":confirm" 来获取对话框,而不是错误消息,例如,当当前缓冲区包含更改时。这两者可以结合使用
:amenu File.Open  :browse confirm edit<CR>
":browse" 会弹出一个文件浏览器,用于选择要编辑的文件。":confirm" 会在当前缓冲区包含更改时弹出一个对话框。然后,您可以选择保存更改、丢弃更改或取消命令。对于更复杂的项,可以使用 confirm() 和 inputdialog() 函数。默认菜单中包含一些示例。

42.4 工具栏和弹出菜单

有两个特殊菜单:ToolBar 和 PopUp。以这些名称开头的项不会出现在正常的菜单栏中。

工具栏

工具栏仅在 'guioptions' 选项中包含 "T" 标志时才会出现。工具栏使用图标而不是文本来表示命令。例如,名为 "ToolBar.New" 的 {menu-item} 会导致 "New" 图标出现在工具栏上。Vim 编辑器有 28 个内置图标。您可以在此处找到一个表格:builtin-tools。大多数图标用于默认工具栏。您可以重新定义这些项的功能(在设置默认菜单后)。您可以为工具栏项添加另一个位图。或者定义一个使用位图的新工具栏项。例如,定义一个使用以下内容的新工具栏项
:tmenu ToolBar.Compile  Compile the current file
:amenu ToolBar.Compile  :!cc %:S -o %:r:S<CR>
现在您需要创建图标。对于 MS-Windows,它必须是位图格式,名称为 "Compile.bmp"。对于 Unix,使用 XPM 格式,文件名是 "Compile.xpm"。大小必须为 18x18 像素。在 MS-Windows 上,也可以使用其他大小,但看起来会很丑。将位图放在 'runtimepath' 中的某个目录下的 "bitmaps" 目录中。例如,对于 Unix, "~/.config/nvim/bitmaps/Compile.xpm"。
您可以为工具栏中的项定义工具提示。工具提示是简短的文本,用于解释工具栏项的功能。例如,"打开文件"。当鼠标指针停留在该项上,并且一段时间没有移动时,它会显示。如果图片的含义不太明显,这将非常有用。示例
:tmenu ToolBar.Make  Run make in the current directory
注意:请注意使用的字母大小写。 "Toolbar" 和 "toolbar" 与 "ToolBar" 不同!
要删除工具提示,请使用 :tunmenu 命令。
可以使用 'toolbar' 选项显示文本而不是位图,或者同时显示文本和位图。大多数人只使用位图,因为文本占用空间很大。

弹出菜单

弹出菜单会出现在鼠标指针的位置。在 MS-Windows 上,您可以通过单击鼠标右键激活它。然后,您可以使用鼠标左键选择一个项目。在 Unix 上,弹出菜单是通过按下并按住鼠标右键来使用的。只有当 'mousemodel' 设置为“popup”或“popup_setpos”时,弹出菜单才会出现。两者之间的区别是,“popup_setpos”会将光标移动到鼠标指针位置。单击选择区域内部时,选择区域将保持不变。如果存在选择区域,但您单击了选择区域外部,则会删除选择区域。每种模式都有一个单独的弹出菜单。因此,与常规菜单不同,不会出现灰色项目。
生命的意义、宇宙和一切是什么? 42 道格拉斯·亚当斯是唯一一个真正知道这个问题的人,不幸的是,他去世了。所以你现在可能想知道死亡的意义是什么......
下一章:usr_43.txt 使用文件类型
版权:请参见 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主要
命令索引
快速参考