如何在 vimdiff 中的垂直分割和水平分割之间切换?

Posted

技术标签:

【中文标题】如何在 vimdiff 中的垂直分割和水平分割之间切换?【英文标题】:How do I toggle between a Vertical and a Horizontal split in vimdiff? 【发布时间】:2011-08-06 16:01:19 【问题描述】:

I already know 如何使用diffopt 变量启动具有水平/垂直拆分的差异模式,但当我已经打开两个文件进行比较时,不知道如何在两者之间切换。

我尝试了在this older post 中找到的已接受答案,但无济于事。 Ctrl+W 命令对我不起作用。也许是因为我在 Windows 友好模式下运行 gVim?

【问题讨论】:

您使用了哪些ctrl+w 命令?你试过ctrl+w J吗? 请注意,我刚刚更新了上面之前丢失的链接。那篇文章没有提到你的建议。 ctrl+w J 将我的垂直拆分更改为水平拆分。现在我该如何改回来?如果您有完整的解决方案,请在下面发布答案!谢谢。 @Peter,你把我从the Vim doc. 带到了ctrl+w Jctrl+w H,这样就可以了。请随时在下面发布此答案,否则我将不得不将此评论重新发布为我接受的答案!再次感谢。 @drapkin11:感谢提到diffopt,这正是我要找的! 【参考方案1】:

以下命令会将垂直分割变为水平分割:

ctrl+w 然后J

要改回垂直拆分,请使用:

ctrl+w Hctrl+w L

有关移动窗口的更多信息:

:h window-moving
:h ctrl-w_J
:h ctrl-w_K
:h ctrl-w_H
:h ctrl-w_L

【讨论】:

当你有一个三向差异时,这不是那么方便。 @Flimm 你正在执行什么命令来获得 3 路差异?您是否尝试将:vert 添加到命令中。例如:vert diffsplit foo.c。也许试试:set diffopt+=vertical。如果您使用的是 fugitive,那么它将根据 'diffopt' 的值和/或您的屏幕尺寸是否足够大来确定进行水平或垂直差异分割。 我使用的是 Fugitive,我刚刚发现问题帖子中提到的 diffopt 选项。这解决了我的问题。 只有一个提示:光标所在的文件决定了窗口的位置。从垂直到水平,活动文件将移至底部。从水平到垂直,活动文件将向左移动 致读者:如果该命令在第一次运行时对您不起作用,请确保您按Shift + j 获取J。所以命令是ctrl+w 然后是shift+j【参考方案2】:

我来晚了,但也许这是一个有趣的解决方案。 @PeterRincker 的解决方案仅在您只打开几个没有内部窗口的窗口时才有效。 我在我喜欢与你分享的运行时配置中发现了这个(有用的)功能。它旨在映射为键绑定,并让用户将当前拆分切换到指定的拆分。标记它不会在垂直和水平之间切换,但用户会告诉他他喜欢哪个(当前也可以是活动的,如果这种情况没有意义的话。) Vim 窗口树总是有两个窗口作为“伙伴”。调整窗口大小时也可以观察到这种影响。我想说的是:触发函数,如果适用于当前活动窗口及其“伙伴”窗口。

" Switch to a vertical or horizontal split between two windows.
" Switching to currently used split results into the equal split.
" This is between the current window and the one window which is focused, when close the active window.
" This function does not adjust the windows height after the switch, cause this can't work correctly.
" 
" Arguments:
"   horizontal - Boolean to differ between both layouts.
"
function! s:switch_window_split(horizontal) abort
  let l:bufnr = bufnr('%')  " Get current buffer number to restore it in the new window.
  if a:horizontal | let l:vert = '' | else | let l:vert = 'vert ' | endif

  " Close current window and open new split with the cached buffer number.
  wincmd c
  execute l:vert . 'sbuffer ' . l:bufnr
endfunction

" Switch split layout.
nnoremap <leader>wS :<C-u>call <SID>switch_window_split(v:true)<CR>
nnoremap <leader>wV :<C-u>call <SID>switch_window_split(v:false)<CR>

不幸的是,它目前仍在更改窗口的大小,并且不会保持原来的形状。我正在努力,但实现起来并不容易,因为我必须知道“伙伴”窗口的形状。

【讨论】:

【参考方案3】:

您也可以通过ctrl-w + &lt;arrow key&gt; 来选择窗口。

【讨论】:

以上是关于如何在 vimdiff 中的垂直分割和水平分割之间切换?的主要内容,如果未能解决你的问题,请参考以下文章

zbb20180919 db 数据库的水平分割和垂直分割

OpenCV 实现图片的水平投影与垂直投影,并进行行分割

数据库水平拆分

在 Ace Editor 中禁用水平分割

完全居中分割(水平和垂直对齐)

如何在曲线框html和css中添加垂直线分割和图例?