个性化你的Vim -- 加入你自己的菜单和工具按钮

Hacking Vim 中文翻译 by Alec [email protected]

[GVim]7+ 加入你自己的菜单和工具按钮

如果你用的是GVim, 你可以做一个非常方便的菜单, 用来存放最经常用到的功能. 你也许不会总是从菜单调用那些功能, 但是如果你忘记了怎么用, 你总是可以从菜单中找到. 如果你需要更快的调动这个功能, 你甚至可以把它加到工具条上.

在这个方案中, 我们看看在GVim中怎么制做菜单以及怎样把按钮放到工具条的.

添加一个菜单


制做一个菜单就是说, 把你想要执行的命令当作每一个菜单项放在里面. 只要你遵守了正确的命名, 你就会看到一个包含着你想要的功能的非常好小菜单.

咱们从一个简单的小例子开始吧. 假设你想要制作一个类似于缓冲区菜单(buffers), 用来进行标签(tab)操作的自定义菜单.



你需要的命令是:
:menu menupath command


这个命令非常像那个map命令, 不过不是把命令和功能键绑定, 而是把命令放到菜单里.

这个命令有两个参数. 第一个这个功能需要放入的菜单的真实路径, 第二次是功能的命令. 比如, 一个Tabs菜单中的叫Next的菜单项, 命令就是这样的:

:menu Tabs.Next <ESC>:tabnext<cr>


这样你就有了一个叫Tabs的菜单和一个叫Next的菜单项. Next菜单项做的就是执行下面这人命令:

:tabnext


这条命令代替键盘先按下ESC键进入普通模式, 然后再按回车<cr>去真实的执行这条命令. 如果你没有加入<Esc>那么这条命令就不会工作. 另一种解决方法就是根据当前的模式设置不同的菜单项.  因为Vim有一系列:menu命令的替代品:

:nmenu - 普通模式
:imenu - 插入模式. 在前面会加上了^O.
:vmenu - 可视模式(Visual). 前面会加上^C 并且^\^G附加在后面.
:cmenu - 命令模式. 前面会加上^C并且^\^G附加在后面.
:omenu - 等特操作符模式(OP-pending模式).前面加上^C并且^\^G附加在后面.

附加的部分(^O 和 ^C)就是进入普通模式.

^O(Ctrl-O)是用于插入模式, 因为它会在执行完命令后返回插入模式.

^\^G(Ctrl-\ Ctrl-G)是解决在全局插入模式设置为true时的情况, 当设为true时, Vim会把插入模式当作默认的模式, 即Vim变成无模式. 附加^\^G时, Vim就会在执行回命令时一定返回插入模式, 而其他的附加情况就会回到原来的模式.

除了为单独的模式设置同样的菜单项外, 你也可以换成下面的命令:

:amenu menu-path command

根据当前的模式, 这个命令前后会附加上正确的东西.


我们再来看新的Tabs菜单, 并且加上一个新的菜单项和功能. 通过下面的命令, 它看起来会更像Buffers菜单.

:amenu Tabs.&Delete :confirm tabclose<cr>
:amenu Tabs.&Alternate            :confirm tabn #<cr>
:amenu <silent> Tabs.&Next        :tabnext<cr>
:amenu <silent>Tabs.&Previous     :tabprevious<cr>

细心读者会发现在我们命令中多了些东西.

第一个就是在最后两个命令的<silent>标签. 加上了这个标签, 我们可以避免命令在执行的过程中显示在命令缓冲区. 这是个比较好的功能, 在菜单路径中加上&更是一个强大的功能. 在菜单路径的最后一部分的某个字母前加上&, 就可以为这一个菜单项增加一个键盘快捷键(keyboard shortcut). 这个使我们能更快速地转到(navigate)那个菜单项并且执行它.



假设我们到通过执行菜单Tabs->Next来转到下一个标签; 现在我们可以简单地按下Alt-t n即可. Alt-t打开了Tabs, n去执行了Next项 - 因为&在Next中N的前面. 如果其它的菜单项使用了同样字母作为快捷键, 你可以重复地按Alt键来来回选择它们.

如果你想在你的菜单中加上一条分隔线, 可以使用SEP作为菜单项, : (冒号)作为命令, 即 :amenu Tabs.-SEP- :

我们做的那个菜单可以是保存在当前的会话(session)中, 所以如有你想要让每次使用GVim都会有这个菜单, 只需要在vimrc文件中把它加上(把上次的命令加上, 不包含前面的:).

所以现在我们有一个像缓冲区菜单(Buffer)一样的Tabs菜单了. 但是它不能像Buffers菜单中可以列出所有可用的buffer. 其实buffer是可以对用户隐藏的, 这两个菜单也没什么不同, 都没有将内容列出来, 但是tab(标签)是不能对用户隐藏的. 用户总能从标签栏中知道共有多少个标签, 以及标签的名字.

一个用户菜单可以做很多很趣的事情. 如果你要用很多种不同类型的文件, 你甚至可以每种文件类型对应不同的菜单, 或者对应同一个菜单的不同的子菜单.

子菜单可以通过菜单路径的命名常规来创建. 所以如果你想要有这样的菜单 Tabs >Navigation >Next, 你可以简单地把Next菜单项加到这样的菜单路径中Tabs.Navigation.&Next

你可能感兴趣的:(C++,c,C#,vim,Gmail)