📄 usr_42.cnx
字号:
*usr_42.txt* For Vim version 6.3. 最近更新:2004年6月 VIM USER MANUAL - by Bram Moolenaar (译者:lang2 http://vimcdoc.sf.net) 添加新菜单现在你应该该已经了解到 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 命令行模式 :amenu 所有模式为了避免影响现存的菜单项,使用 ":noremenu", ":nnoremenu", "anoremenu" 等命令。使 用 :AMENU":amenu" 命令有些不同。它假定你给出的 {keys} 是被用在普通模式下的。当 Vim 在可视或插入模式下运行并执行这些菜单命令时,Vim 先回到普通模式。":amenu" 会替你插入 CTRL-C 或 CTRL-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> 是一个脚本标识。这使得该函数成为当前 Vim 脚本文件的本地函数。这是用来避免其他脚本定义相同名字的函数的麻烦。见 |<SID>|。默 菜 单Vim 象你键入 {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" 菜单下的为所有模式定义的各项。要只列出一个指定的为插入模式定义的菜单项: > :imenu Edit.Undo注意要使用准确的名字。大小写是有区别的。但是 '&' 可以被省略。 <Tab> 以及其后的提示也可以被省略。删 除 菜 单要删除一个菜单,使用 "unmenu" 命令加上和列出菜单名一样的参数。这样,":menu"变成 ":unmenu", ":nmenu" 变成 ":nunmenu", 已此类推。要删除为插入模式定义的"Tools.Make" 菜单项: > :iunmenu Tools.Make你也可以用菜单名来删除包括所有子项的整个菜单。例如: > :aunmenu Syntax这会删除 Syntax 菜单及其所有菜单项。==============================================================================*42.3* 杂项一可以利用 'guioptions' 选项来改变菜单的外观。缺省情况下所有的菜单都将被使用。你可以用下面的标志位来选择性去除菜单的某一部分。这些标志位的使用如下: > :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 and 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<CR>现在你需要创建图标。对于 MS-Windows 图标必须是名为 "Compile.bmp" 的位图格式文件。对于 Unix 系统必须是名为 "Compile.xpm" 的 XPM 格式文件。 大小必须是 18 X 18 个像素。对于 MS-Windows 来说也可以使用其它大小的图标,但可能看起来会比较难看。 把位图放到 'runtimepath' 其中一个目录下的 "bitmaps" 子目录内。例如:对于 Unix 系统可以使用 "~/.vim/bitmaps/Compile.xpm" 目录。你也可以为工具栏项定义一个工具提示。例如 "Open file"。 当鼠标移动到该工具栏项上并停留一会时,该提示会被自动显示。当图片的意图不是很明显时,这是很有用的。例如: > :tmenu ToolBar.Make Run make in the current directory< Note: 注意大小写的使用。"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 isnow dead, unfortunately. So now you might wonder what the meaning of deathis...生命的意义是什么? 宇宙以及一切的一切的意义又是什么?不幸的是,唯一了解这个问题的人,Douglas Adams 已经死了。所以你现在可能正在冥想死亡的意义是什么...==============================================================================下一章: |usr_43.txt| 使用文件类型Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -