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

62

我已经知道如何使用 diffopt 变量来开始水平/垂直拆分的 diff 模式,但不知道如何在已经打开两个文件进行比较时在两者之间切换。

我尝试了在这篇旧帖子中找到的被接受的回答,但并没有成功。Ctrl+W命令对我无效。可能是因为我在Windows友好模式下运行gVim?


4
你用过哪些 ctrl+w 命令?你试过 ctrl+w J 吗? - Peter Rincker
请注意,我刚刚更新了上面曾经丢失的链接。那篇文章并没有提到您的建议。ctrl+w J将我的垂直分割改为了水平分割。现在我该如何将其改回来?如果您有完整的解决方案,请在下面发布答案!谢谢。 - drapkin11
1
@Peter,你带我找到了从Vim文档中的ctrl+w Jctrl+w H,这很管用。如果你愿意,可以在下面发布这个答案,否则我就得把这个评论作为我的采纳答案再发一遍了!再次感谢。 - drapkin11
1
@drapkin11:感谢提到diffopt,这正是我正在寻找的! - Flimm
3个回答

110
以下命令将把垂直分割改为水平分割: ctrl+w,然后shift+j 要改回垂直分割,请使用以下任一方式:
- ctrl+w,然后shift+h - 或者ctrl+w,然后shift+l 有关移动窗口的更多信息,请参阅:
:h window-moving
:h ctrl-w_J
:h ctrl-w_K
:h ctrl-w_H
:h ctrl-w_L

当你有一个三方差异时,这并不是很方便。 - Flimm
4
你执行哪个命令来获取三向差异比较?你尝试过在命令后面添加 :vert 吗?例如::vert diffsplit foo.c。也许尝试使用 :set diffopt+=vertical。如果你正在使用 Fugitive,则它将根据 'diffopt' 的值和/或屏幕大小来决定是进行水平还是垂直的差异比较分割。 - Peter Rincker
2
我正在使用Fugitive,我刚刚找到了问题帖子中提到的“diffopt”选项。这解决了我的问题。 - Flimm
只有一个提示:光标所在的文件决定了窗口的位置。从垂直到水平,活动文件将移至底部。从水平到垂直,活动文件将移至左侧。 - alejandro
2
对于读者:如果命令第一次无法运行,请确保您按下 Shift + j 以获取大写字母 J。因此,命令是 ctrl+w 然后是 shift+j - Pushpak Dagade

0

我可能有点晚了,但也许这是一个有趣的解决方案。@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>

很不幸,它目前仍然改变窗口的大小,而不保留其形状。我正在努力解决这个问题,但要实现这一点并不容易,因为我必须知道“伙伴”窗口的形状。


-1

你也可以使用 Ctrl+W + <箭头键> 来选择窗口。


这个对我有所帮助,尽管这个答案并不是我所问的问题。我想在垂直分割中切换文件。谢谢! - Taher Kawantwala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接