假设我在vim中有一些任意的拆分布局 .
____________________
| one | two |
| | |
| |______|
| | three|
| | |
|___________|______|
有没有办法交换 one
和 two
并保持相同的布局?它's simple in this example, but I'正在寻找一种有助于实现更复杂布局的解决方案 .
更新:
我想我应该更清楚 . 我之前的例子是对实际用例的简化 . 使用实际实例:
我怎么能交换任何两个分裂,保持相同的布局?
更新! 3年后......
我把sgriffin的解决方案放在你可以轻松安装的Vim插件中!用您喜欢的插件管理器安装它并尝试一下:WindowSwap.vim
12 回答
这个帖子有点晚了,但却发现了其他的东西 . 我写了两个函数,一段时间后标记一个窗口,然后在窗口之间交换缓冲区 . 这似乎是你要求的 .
只需在你的.vimrc中拍打它们,然后按照你认为合适的方式映射函数:
要使用(假设你的mapleader设置为\),你会:
移动到窗口以通过ctrl-w移动标记交换
键入\ mw
移动到要交换的窗口
键入\ pw
瞧!交换缓冲区而不会搞砸窗口布局!
我有一个sgriffin解决方案稍微增强的版本,你可以不使用两个命令交换窗口,但使用直观的HJKL命令 .
所以这是如何:
尝试在正常节点中使用大写HJKL移动窗口,这真的很酷:)
真的很酷,但我对映射的建议是使用^ W ^ J而不是J(因为所有的HJKL已经有意义),而且我还会拉入新缓冲区,因为当你想要在你周围交换时可能不想继续编辑你已经在的缓冲区 . 开始:
在@sgriffin _486654上构建 heavily 更接近你所要求的东西:
如果行为与您的期望不符,请告诉我 .
同样基于sgriffin的解决方案,转到要交换的窗口,按
CTRL-w m
,转到要交换的窗口,然后再次按CTRL-w m
.CTRL-w m
是一个糟糕的助记符选择,所以如果有人想出更好的,你可以编辑它 .此外,我想收到脚本的反馈,即“标记窗口 . 请重复目标”,但是作为vimscript noob,我不知道该怎么做 .
总而言之,脚本运行良好
您还可以使用像X-monad这样的平铺窗口管理器
类似于mark-window-then-swap-buffer方法,但也让你重用上次交换 .
Randy's正确的是
CTRL-W x
在同一列/行中没有't want to swap windows that aren't .我发现
CTRL-W HJKL
键在操作窗口时最有用 . 它们会强制您当前窗口离开当前位置并告诉它占据您按下的键方向指示的整个边缘 . 有关详细信息,请参阅:help window-moving .对于上面的示例,如果您从窗口“one”开始,这可以满足您的需求:
为方便起见,您可以将所需的序列分配给键映射(请参阅:help mapping) .
所有上述答案都很棒,遗憾的是这些解决方案与QuickFix或LocationList窗口结合使用效果不佳(我在尝试使用Ale错误消息缓冲区时遇到此问题) .
解决方案
因此,在进行交换之前,我添加了一行额外的代码来关闭所有这些窗口 .
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
总代码看起来像;
交换功能的积分为Brandon Orther
为什么需要它
如果没有首先删除所有QuickFix(QF)和LocationList(LL)窗口,交换功能无法正常工作的原因是因为如果QF / LL的父缓冲区被隐藏了(并且在窗口中没有显示),则QF / LL窗口耦合到它被删除 . 这本身不是问题,但是当窗口隐藏时,所有窗口编号都被重新分配并且交换被搞砸了,因为第一个标记窗口的保存数量确实(可能)不再存在 .
这样做:
第一个窗口标记
第二个窗口标记
第一个缓冲开关,窗口1填充窗口3的缓冲区 . 因此,QF窗口被删除,因为它不再具有父窗口 . 这会重新排列窗口编号 . 请注意,curNum(第二个选定窗口的编号)指向不再存在的窗口 .
因此,当切换第二个缓冲区时,它会尝试选择curNum窗口,该窗口不再存在 . 因此它创建它并切换缓冲区,导致一个不需要的窗口仍然打开 .
看看
:h ctrl-w_ctrl-x
和/或:h ctrl-w_ctrl-r
. 这些命令允许您在当前布局中交换或旋转窗口 .编辑:实际上,这不会在这种情况下起作用,因为它只是将交换当前列或行 . 您可以转到每个窗口并选择目标缓冲区,但这非常详细 .
从这开始:
使'three'成为活动窗口,然后发出命令ctrl w J.这会移动当前窗口以填充屏幕底部,让您:
现在将'one'或'two'设为活动窗口,然后发出命令ctrl w r . 这'rotates'当前行中的窗口,让您:
现在将'two'设为活动窗口,并发出命令ctrl w H.这会移动当前窗口以填充屏幕左侧,让您:
正如你所看到的,manouevre有点混乱 . 有3个窗口,它有点像那些'平铺游戏'谜题之一 . 如果你有4个或更多的窗户,我不建议尝试这个 - 你最好关闭它们然后再在期望的位置打开它们 .
我做了一个演示how to work with split windows in Vim的截屏视频 .
如果函数由于某种原因不可用,则以下方法可能很方便(例如,它不是你的vim) .
使用
:buffers
命令查找打开缓冲区的id,导航到所需的窗口并使用:b 5
之类的命令打开缓冲区(在这种情况下缓冲区编号为5) . 重复两次,交换窗口内容 .I "invented"这个方法经过多次尝试记忆
ctrl-w-something
序列,即使是非常简单的布局,如原始问题中的一两三 .