选择性地启用/复制系统菜单或以其他方式显示所有MacVim窗口实例

时间:2014-07-05 23:17:50

标签: vim macvim

我在我的~/.vimrc' (除其他外):

set guioptions += M
set guioptions -= m

禁用MacVim中的菜单。我发现遗漏了+=M'导致许多键被映射(菜单热键等)。

我真正想要的系统菜单提供了一个工具:能够显示所有当前的MacVim" windows" (在操作系统意义上,而不是Vim意义上的"分裂")。例如,我可以做这样的事情(可能在单独的shell中,在不同的时间):

$ mvim foo.txt
$ mvim bar.txt
$ mvim baz.txt

这将产生3个独立的MacVim" windows"。使用"设置go = + M"没有设置,我可以去" Windows"菜单并查看列出的这三个实例,并可选择选择其中一个。

有没有办法在不启用系统菜单的情况下执行此操作,或至少启用其余菜单?

我的动机是:经过一段时间后,我倾向于最终得到许多不同的MacVim" windows"跨多个桌面空间(我也倾向于使用大量的桌面空间)。有时我会尝试打开,例如" foo.txt",只是为了获得通知" foo.txt"已经开放了。打开它打开的窗口是一件麻烦事。是的,是的,我想我可以改变我处理这个问题的整个方式 - 将自己限制在一个MacVim窗口,遵守我不会立即处理等文件的规定等等。但是缺少这个,是吗?我可以做的其他事情?

如果有一个命令可以从shell或Vim中发出,我会很高兴,它列出了窗口并允许我激活我的一个选择。

修改

事实证明,MacVim有一个' :macaction selectNextWindow:'命令,至少允许我循环遍历各种实例:

nnoremap <silent> <M-`>   :macaction selectNextWindow:<CR>
nnoremap <silent> <D-`>   :macaction selectNextWindow:<CR>
nnoremap <silent> <M-S-`> :macaction selectPreviousWindow:<CR>
nnoremap <silent> <D-S-`> :macaction selectPreviousWindow:<CR>

我映射了命令(&#39; <D->&#39;)和meta(&#39; <M->&#39;),因为前一个映射仅适用于MacVim窗口相同的桌面空间。奇怪的。部分解决方案是我(最终)找到我想要的窗口/实例,但复杂度O(n)。窗口列表将使其成为O(1)

1 个答案:

答案 0 :(得分:0)

通常可以使用以下命令从命令行访问菜单:

:amenu Edit

但是将M添加到'guioptions'意味着没有任何菜单被加载,因此:amenu在您的情况下无用。

无论如何,该窗口列表功能由MacVim的Cocoa包装器提供:它是任何GUI应用程序在XCode中创建时免费获得的默认功能的一部分。然而,MacVim似乎没有将它暴露给Vim核心,所以你有点性交:

  • 无法通过:amenu
  • 获取Windows列表
  • set guioptions+=M摆脱所有菜单,Vim提供的菜单 Cocoa提供的菜单。

还有另一种方法来查看您的问题:MacVim GUI窗口实际上是单独的Vim实例,它们都作为服务器运行(请参阅:help clientserver),您可以发出:

$ vim --serverlist

或:

:echo serverlist()

但我不知道管理单独服务器的任何高级解决方案,我觉得提出一个可靠的解决方案并不是一件容易的事。

另一种查看问题的方法是有选择地unmap所有不需要的映射而不会弄乱菜单。

所以是的......我的建议是找到另一个更有针对性的工作流程。

如果您经常使用mvim但不想要这些与菜单相关的映射,那么您也可以使用mvim -v直接在您的终端中工作,几乎可以肯定地解决您的映射问题一次性打开“多个实例中打开的同一文件”。