交换两个窗口的位置


29

说以下是我的窗口的当前结构:

+ ----- + ----------------------------
| |
| A |
| |
+ ----- +
| |
| B |

A和B的顺序不是很自然。如果B在最上面,那会更好。

但是,如果我走了<C-w>K,B将是所有窗口的最顶端,这不是我想要的。如何将B置于A之上,但不能置于A之上的任何其他窗口之上?

如果将两个窗口垂直拆分,如何将它们更改为水平拆分?


7
这篇文章解释了如何旋转窗口。 是关于将分割从垂直切换为水平。
lcd047

@ lcd047这些是本网站之外的问题。值得在这里写下一个小答案并包括链接(这些链接很有价值)吗?
Bernhard 2015年

1
@Bernhard我想这对meta是个好问题。
lcd047

1
@Bernhard 是的。确保写下完整的答案,而不仅仅是链接。
吉尔(Gilles)'所以

1
然后请说明您要执行的操作,以及为什么我指出的两个答案没有解决问题。
lcd047

Answers:


33

要交换拆分窗口的两个部分,只需执行以下操作: <C-w> <C-r>


我可能是错的,但是您的解决方案会旋转窗口,因此如果拆分超过2个,结果将不是OP所要的。
statox

你是绝对正确的。OP正在寻找s.th。比“交换拆分窗口的两个部分”更为复杂。
Modes17年

实际上,OP正在寻找交换两个拆分窗口的命令,但是您的解决方案会旋转所有当前拆分窗口。正如指出:h CTRL-W_CTRL-RThe second window becomes the first one, the third one becomes the second one, etc.因此,如果你有3次分裂,光标在底部一个,打<c-w><c-r>第三窗口将在2名其他的是不顶什么用OP要求:How can I put B above A, but not above any other window that is already above A?
statox

6

为了交换window头寸,效果等同于交换这两个窗口显示的缓冲区。
例如,如果窗口A具有缓冲区2,窗口B具有缓冲区8,则需要转到窗口A,选择缓冲区8,然后到窗口B,选择缓冲区2。

这个想法启发了我编写脚本-并且它已经在我自己的工具箱中

功能码:

function! WinBufSwap()
  let thiswin = winnr()
  let thisbuf = bufnr("%")
  let lastwin = winnr("#")
  let lastbuf = winbufnr(lastwin)

  exec  lastwin . " wincmd w" ."|".
      \ "buffer ". thisbuf ."|".
      \ thiswin ." wincmd w" ."|".
      \ "buffer ". lastbuf
endfunction

command! Wswap :call WinBufSwap()
map <Leader>bs <C-c>:call WinBufSwap()<CR>
  1. 选择窗口A
  2. 选择窗口B
  3. :call WinBufSwap()
    这将交换两个预选窗口中的缓冲区,将光标保留在原始窗口中。

提前选择两个需要交换的窗口是关键细节,因为这需要为Vim指定要使用的窗口。


精确地说,当您说“选择窗口A,然后选择B”时,是指“先关注A,然后关注B,以标记最后看到的缓冲区和窗口的顺序,以正确交换?还是”选择”是“专注于”以外的意思吗?
padawin

确实是这样:我将“选择”用作“关注”。
Cometsong

6
CTRL-W x与窗口N交换当前窗口
                   (默认值:下一个窗口)

index.txt第2.2节“窗口命令”)

如果A是当前窗口,则下一个窗口将是B,因此您只需要 <C-w> x

如果B是当前窗口(下面还有更多窗口),那么您首先必须转到A,然后交换: <C-w> k <C-w> x


4

交换窗口或交换缓冲区的另一种方法是在文件中标记位置(使用大写标记),然后在您选择的窗口中打开这些标记。

例如,如果我有两个文件,file_Afile_B

  • 我将使用file_A进入窗口并对其进行标记:mA
  • 转到带有file_B的窗口并标记它:mB
  • 然后将file_A的标记提取到该窗口中:'A
  • 然后返回第一个窗口并在其中获取file_B的标记:'B

此方法的优点是,如果由于某种原因您多次拆分窗格,并且没有明确的逻辑来交换它们,例如,如果您想在12点和7点交换窗格,则可以只需旋转窗口即可,但您可以轻松地交换缓冲区。


0

您可以使用以下功能在两个窗口之间交换缓冲区:

function! SwitchWindow(count) abort
    let l:current_buf = winbufnr(0)
    exe "buffer" . winbufnr(a:count)
    exe a:count . "wincmd w"
    exe "buffer" . l:current_buf
    wincmd p
endfunction
nnoremap <C-w>x :<C-u>call SwitchWindow(v:count1)<CR>

现在,在大多数情况下,交换缓冲区在技术上就像交换窗口一样。因为您没有手动跟踪窗口,所以要跟踪哪个窗口正在保存哪个缓冲区。因此,以上功能将在大多数情况下为您提供帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.