我在我的' ~/.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
并直接在你的终端中工作,这几乎肯定会解决你的映射问题和你的"在几个实例中打开相同的文件"的问题。