usr_42

usr_42.txt 适用于 Vim 9.0 版本。 最近更新: 2020年1月 VIM 用户手册 - by Bram Moolenaar 译者: lang2 添加新菜单 现在你应该已经了解到 Vim 是非常灵活的。这也包括在 GUI 中使用的菜单。你可以定义 你自己的菜单项来更方便的使用一些命令。这是为那些鼠标爱好者准备的。 42.1 简介 42.2 菜单命令 42.3 杂项 42.4 工具栏和弹出菜单 下一章: usr_43.txt 使用文件类型 前一章: usr_41.txt 编写 Vim 脚本 目录: usr_toc.txt

42.1 简介

Vim 使用的菜单是定义在 "$VIMRUNTIME/menu.vim" 文件里的。如果你想编写自己的菜 单,你可以先看看那个文件。 使用 ":menu" 可以定义一个菜单项。这个命令的基本格式如下: :menu {menu-item} {keys} {menu-item} 告诉 Vim 把菜单项放在哪。"File.Save" 是一个典型的例子。它表示 "File" 菜单下的 "Save" 菜单项。那个点被用来分隔菜单的名字。例: :menu File.Save :update<CR> ":update" 命令在文件被修改时写入文件。 你可以再加一层: "Edit.Settings.Shiftwidth" 在 "Edit" 菜单下定义一个 "Settings" 子菜单,然后在其下定义一个菜单项 "Shiftwidth"。你还可以再加更深的 层。但别用太多,那样要找到一个菜单层就需要太多的鼠标动作。 ":menu" 命令和 :map 命令很像: 左边指定了该菜单项如何被触发,右边定义它将执 行的字符串。{keys} 只是一串字符,Vim 会像你键入它们一样使用该字符串。因此在插 入模式下,当 {keys} 不包括特殊字符时,Vim 会插入那些字符。 菜 单 快 捷 键 & 字符可以被用来指示一个菜单快捷键。例如,你可以使用 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 叫优先级数。Vim 用它来决定把该菜单放在哪里。第一个数 (10) 表示该菜 单在菜单栏上的位置。优先级数较小的菜单会被放在左边,大数字对应的菜单会被放在右 边。下面是标准菜单的优先级: 10 20 40 50 60 70 9999 +------------------------------------------------------------+ | File Edit Tools Syntax Buffers Window Help | +------------------------------------------------------------+ Help 菜单被指定了一个很大的值,这样它就会被放置在最右边。 第二个数字 (340) 决定菜单项在下拉菜单中的位置。较小的数字在上边,大的在下 边。下面是 File 菜单的优先级: +-----------------+ 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 | +-----------------+ 注意这些数值不是连续的。那些没有被使用的值可以被用来插入你自己定义的项。(通常 情况下,最好不要改动那些标准菜单。如果需要,你可以创建新的菜单)。 当创建子菜单时,你可以加入另一级数字。这样每一个菜单项都有其优先级数。 特 殊 字 符 这里用的 {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 普通、可视和操作符等待模式 :nmenu 普通模式 :vmenu 可视模式 :omenu 操作符等待模式 :menu! 插入和命令行模式 :imenu 插入模式 :cmenu 命令行模式 :tlmenu 终端模式 :amenu 所有模式 (除了终端模式外) 为了避免菜单项执行的命令被重映射,使用 ":noremenu"、":nnoremenu"、"anoremenu" 等形式。 使 用 :AMENU ":amenu" 命令有些不同。它假定你给出的 {keys} 是被用在普通模式下的。当 Vim 在可 视或插入模式下运行并执行这些菜单命令时,Vim 先回到普通模式。":amenu" 会替你插 入 CTRL-CCTRL-O。例如,如果你使用这个命令: :amenu 90.100 Mine.Find\ Word * 你得到的菜单命令将会是: Normal mode: * Visual mode: CTRL-C * Operator-pending mode: CTRL-C * Insert mode: CTRL-O * Command-line mode: CTRL-C * 在命令行模式下 CTRL-C 会清除已键入的命令。在可视和操作符等待模式下 CTRL-C 会终 止该模式。在插入模式下 CTRL-O 会执行该命令然后回到插入模式。 CTRL-O 只能用来执行一个命令。如果你要执行多于两个命令,你可以把它们定义成一 个函数然后在菜单定义中调用该函数。例如: :amenu Mine.Next\ File :call <SID>NextFile()<CR> :function <SID>NextFile() : next : 1/^Code :endfunction 这个菜单项用 ":next" 命令移动到参数列表中的下一个文件,然后查找其中以 "Code" 开始的行。 函数名前的 <SID> 是一个脚本 ID。这使得该函数成为当前 Vim 脚本文件的局部函 数。这是用来避免在其他脚本定义了相同名字的函数的麻烦。见 <SID> 。 默 菜 单 Vim 像你键入 {keys} 一样执行菜单命令。对于 ":" 命令这就意味着你将在命令行上看 到该命令及其输出。如果命令很长的话,那个令人讨厌的 hit-Enter 提示就会出现。 为了避免这种情况,让那个菜单保持缄默。用 <silent> 参数就可以了。拿前面例子 中的 NextFile() 调用来说,当你使用该菜单时,你将在命令行上看到: :call <SNR>34_NextFile() 为了避免这些文本被显示,你可以用 "<silent>" 作为第一个参数: :amenu <silent> Mine.Next\ File :call <SID>NextFile()<CR> 别滥用 "<silent>"。对于短的命令来说是不需要的。如果你定义一个菜单给其他人使 用,让他看到被执行的命令会提示他如何只用键盘来执行这些操作而无需大费周章使用鼠 标。 菜 单 列 表 当执行 menu 命令时不带 {keys} 部分,列出已经定义的菜单。你可以给出 {menu-item} 或其中的一部分,来列出指定的菜单。例如: :amenu 这将列出所有菜单。太长了!最好指定菜单名来减短一些: :amenu Edit 这只列出 "Edit" 菜单下的为所有模式定义的各项。要只列出一个为插入模式定义的菜单 项: :imenu Edit.Undo 注意要使用准确的名字。大小写是有区别的。但是 '&' 可以被省略。<Tab> 以及其后的 提示也可以被省略。 删 除 菜 单 要删除一个菜单,使用 "unmenu" 命令加上和列出菜单名的命令一样的参数。这样, ":menu" 变成 ":unmenu",":nmenu" 变成 ":nunmenu",依此类推。要删除为插入模式定 义的 "Tools.Make" 菜单项: :iunmenu Tools.Make 你也可以用菜单名来删除包括所有子项的整个菜单。例如: :aunmenu Syntax 这会删除 Syntax 菜单及其所有菜单项。

42.3 杂项

你可以利用 'guioptions' 选项来改变菜单的外观。缺省情况下除了 "M" 以外,所有的 标志位都将被使用。你可以用下面的标志位来选择性去除菜单的某一部分。这些标志位的 使用如下: :set guioptions-=m m 当该位被清除时整个菜单都会消失。 M 加入该位时,缺省菜单不会被加载。 g 当该位被清除时那些无效菜单会完全消失而不是仅仅被染灰 (并非所有的系统都有效。) t 当该位被清除时不使用可撕下菜单功能。 一个菜单顶部的那个用点组成的行不是分隔符。当你选中该行时,该菜单会被 "撕下"。 它显示在单独的窗口里,亦称撕下菜单。当你经常使用同一菜单的时候,这是非常方便 的。 要翻译菜单项,见 :menutrans 。 既然选择菜单项需要使用鼠标,最好在菜单项里使用 ":browse" 命令来选择文件;使用 ":confirm" 来获得一个对话框。这两个也可以联起来用: :amenu File.Open :browse confirm edit<CR> ":browse" 弹出一个文件浏览器用来选择文件。":confirm" 在当前文件改动后会自动弹 出一个确认的对话框。你可以选择保存或放弃改动,或者取消命令。 对于更复杂的菜单项,可以使用 confirm() 和 inputdialog() 函数。系统缺省的菜 单包含若干实例。

42.4 工具栏和弹出菜单

Vim 中有两个特殊的菜单: ToolBar (工具栏) 和 PopUp (弹出菜单)。以这两个名字开始 的菜单不会出现在一般的菜单栏里。 工 具 栏 只有当 'guioptions' 选项中包括 "T" 标志位时,工具栏才会出现。 工具栏使用图标来表示一个命令,而不是文字。例如,名为 "ToolBar.New" 的 {menu-item} 会在工具栏里显示一个 "New" 图标。 Vim 有 28 个内置的图标。这里可以找到一个列表: builtin-tools 。大多数是用在 缺省的工具栏里的。你可以重新定义这些工具栏项所执行的操作。(在缺省菜单被设定之 后)。 你可以为工具栏项添加另外的位图,或者定义新的工具栏项。例如: :tmenu ToolBar.Compile Compile the current file :amenu ToolBar.Compile :!cc % -o %:r:S<CR> 现在你需要创建图标。对于 MS-Windows 图标必须是名为 "Compile.bmp" 的位图格式文 件。对于 Unix 系统必须是名为 "Compile.xpm" 的 XPM 格式文件。大小必须是 18 X 18 个像素。对于 MS-Windows 来说也可以使用其它大小的图标,但可能看起来会比较难看。 把位图放到 'runtimepath' 其中一个目录下的 "bitmaps" 子目录内。例如: 对于 Unix 系统可以使用 "~/.vim/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" 会将光标移动到鼠标指针所在处。当鼠标在一 个选择区内时,选中的区域不受影响。当鼠标点击在选中区域外时,该选中的区域会被删 除。 对于每一个运行模式分别有一个独立的弹出菜单。所以永远不会有一般菜单中的灰色 菜单项。 What is the meaning of life, the universe and everything? 42 Douglas Adams, the only person who knew what this question really was about is now dead, unfortunately. So now you might wonder what the meaning of death is... 生命的意义是什么?宇宙以及一切的一切的意义又是什么? 不幸的是,唯一了解这个问题的人,Douglas Adams 已经死了。所以你现在可能正在冥想 死亡的意义是什么... (译者注: Douglas Adams 写的科幻小说里,超级电脑对这个问题的回答是: 42。)

下一章: usr_43.txt 使用文件类型 版权: 参见 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl: