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



我在我的' ~/.vimrc '(除其他外)中有这个:

set guioptions += M
set guioptions -= m

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

系统菜单提供了一个功能,这是我真正想要的:显示所有当前MacVim"窗口"的能力(在操作系统意义上,而不是在Vim意义上的"拆分")。例如,我可以这样做(也许在不同的shell中,在不同的时间):

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

这将导致3个独立的MacVim"窗口"。如果没有设置"set go=+M",我可以转到"Windows"菜单,看到列出的这三个实例,并可选择其中一个。

有没有办法在不启用系统菜单或至少其余部分的情况下做到这一点?

我的动机是这样的:过了一段时间,我倾向于在多个桌面空间中使用许多不同的MacVim"窗口"(我也倾向于使用许多桌面空间)。有时我试着打开,例如"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>

我映射了命令(' <D-> ')和元(' <M-> '),因为前者映射仅适用于相同桌面空间中的MacVim窗口。奇怪。部分解决方案,我(最终)找到我想要的窗口/实例,但在O(n)复杂性。如果是窗口列表,则为O(1)

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

:amenu Edit

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

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

  • windows列表无法通过:amenu
  • set guioptions+=M删除所有菜单,vim提供的菜单 cocoa提供的菜单。

还有另一种方式来看待你的问题:MacVim GUI窗口实际上是独立的Vim实例,它们都作为服务器运行(参见:help clientserver),你可以发出:

$ vim --serverlist

或:

:echo serverlist()

但是我不知道有什么高级的解决方案来管理独立的服务器,我有一种感觉,想出一个可靠的解决方案不会是微不足道的。

查看问题的另一种方法是选择性地unmap所有不需要的映射,而不干扰菜单。

所以,我的建议是找到另一个更专注的工作流程。

如果你经常使用mvim,但不想要那些菜单相关的映射,你也可以使用mvim -v并直接在你的终端中工作,这几乎肯定会解决你的映射问题你的"在几个实例中打开相同的文件"的问题。

最新更新