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

如何在vimdiff中在垂直拆分和水平拆分之间切换?,vim,windows-xp,split,vimdiff,Vim,Windows Xp,Split,Vimdiff,如何使用diffopt变量启动具有水平/垂直拆分的diff模式,但当我已经打开两个文件进行比较时,如何在两者之间切换 我尝试了在中找到的公认答案,但没有用。Ctrl+W命令对我不起作用。可能是因为我正在Windows友好模式下运行gVim?以下命令将垂直拆分更改为水平拆分: ctrl+w然后是J 要更改回垂直拆分,请使用以下任一选项: ctrl+w H或ctrl+w L 有关移动窗口的详细信息: :h window-moving :h ctrl-w_J :h ctrl-w_K :h ctrl-w

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


我尝试了在中找到的公认答案,但没有用。Ctrl+W命令对我不起作用。可能是因为我正在Windows友好模式下运行gVim?

以下命令将垂直拆分更改为水平拆分:

ctrl+w然后是J

要更改回垂直拆分,请使用以下任一选项:

ctrl+w H或ctrl+w L

有关移动窗口的详细信息:

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

您也可以按ctrl-w键选择窗口。

我迟到了,但这可能是一个有趣的解决方案。@PeterRincker的解决方案仅适用于只有几个窗口打开而没有内部窗口的情况。
我在我的运行时配置中发现了这个(有用的)函数,我想与大家分享。它被映射为keybinding,并允许用户将当前分割切换到指定的分割。请注意,它不会在垂直和水平之间切换,但用户会告诉他喜欢哪一个(如果这个场景没有意义,也可能是当前活动的)。Vim窗口树始终有两个窗口作为“合作伙伴”。在调整窗口大小时,也可以观察到这种效果。我想说的是:如果该函数适用于当前活动窗口及其“合作伙伴”窗口,则触发该函数

“切换到两个窗口之间的垂直或水平分割。
“切换到当前使用的分割结果到相等分割。
“当关闭活动窗口时,这在当前窗口和聚焦的一个窗口之间。
“此功能不会在开关后调整车窗高度,因为此功能无法正常工作。
" 
“论点:
“水平-两种布局之间的布尔值不同。
"
功能!s:开关\窗口\拆分(水平)中止
让l:bufnr=bufnr(“%”)获取当前缓冲区编号,以便在新窗口中还原它。
如果a:horizontal |让l:vert=''|否则|让l:vert='vert'| endif
“关闭当前窗口,并使用缓存的缓冲区编号打开新拆分。
wincmd c
执行l:vert斯布弗'。l:bufnr
端功能
“切换拆分布局。
nnoremap wS:call switch\u window\u split(v:true)
nnoremap wV:呼叫开关\窗口\拆分(v:假)

不幸的是,它目前仍然会改变窗口的大小,并且不会保持原来的形状。我正在处理它,但实现起来并不容易,因为我必须知道“搭档”的形状“窗口。

您使用了哪些
ctrl+w
命令?您是否尝试了
ctrl+WJ
?请注意,我刚刚更新了上面以前丢失的链接。那篇帖子没有提到你的建议
ctrl+wj
将我的垂直拆分更改为水平拆分。现在我怎么把它换回来?如果你有完整的解决方案,请在下面发布答案!谢谢。@Peter,你让我从中找到了
ctrl+WJ
ctrl+WH
,这样就可以了。请随意在下面贴出这个答案,否则我将不得不把这个评论作为我接受的答案重新发布!再次感谢。@drapkin11:谢谢你提到的
diffopt
,这正是我想要的!当你有一个三向差异时,这并不方便。@Flimm你执行什么命令来获得一个三向差异?您是否尝试将
:vert
添加到命令中。e、 g.
:vert diffsplit foo.c
。也许可以试试
:设置diffopt+=vertical
。如果您使用的是Squisite,那么它将根据
'diffopt'
的值和/或您的屏幕大小足够大,决定进行水平或垂直的差异拆分。我使用的是Squisite,我刚刚找到了问题帖子中提到的
diffopt
选项。这就解决了我的问题。只有一个提示:光标所在的文件决定了窗口的去向。从垂直到水平,活动文件将位于底部。从水平方向到垂直方向,活动文件将转到左侧供读卡器使用:如果命令在第一次执行时对您不起作用,请确保按
Shift+j
以获取
j
。因此,命令是
ctrl+w
,然后是
shift+j
" 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>