2つのウィンドウの位置を入れ替える


29

私のウィンドウの現在の構造は次のとおりです。

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

AとBの順序はまったく自然ではありません。Bが一番上にあれば良いでしょう。

しかし、私が行く場合<C-w>K、Bはすべてのウィンドウの一番上になりますが、これは私が望むものではありません。BをAの上に配置できますが、Aの上に既にある他のウィンドウの上には配置できません。

そして、2つのウィンドウが垂直に分割されている場合、それらを水平に分割するにはどうすればよいですか?


7
この投稿では、ウィンドウを回転させる方法について説明します。 これは、分割を垂直から水平に切り替えることです。
lcd047

@ lcd047これらは、このサイト外の質問です。ここに小さな答えを書いて、価値のあるリンクを含める価値がありますか?
ベルンハルト

1
@Bernhardこれはmetaの良い質問だと思います。
lcd047

1
@Bernhard はい。リンクだけでなく、完全な答えを書いてください。
ジル 'SO-悪であるのをやめる'

1
次に、あなたが何をしようとしているのか、そして私が指摘した2つの答えがなぜ問題に対処しないのかを説明してください。
lcd047

回答:


33

分割ウィンドウの2つの部分を入れ替えるには、次のようにします。 <C-w> <C-r>


私は間違っているかもしれませんが、あなたの解決策はウィンドウを回転させるので、2つ以上のスプリットでは、結果はOPが探していたものではありません。
statox

あなたは、絶対に正しい。OPはs.thを探していました。「分割ウィンドウの2つの部分を入れ替える」よりも複雑です。
モードを

実際、OPは2つの分割ウィンドウを交換するコマンドを探していますが、ソリューションは現在のすべての分割ウィンドウを回転させます。で述べたように:h CTRL-W_CTRL-RThe second window becomes the first one, the third one becomes the second one, etc.あなたは下の1の3つの分割、カーソルを持っているし、ヒットした場合このように<c-w><c-r>第三のウィンドウをOPが求めていたものではありません2つの他のものの上に次のようになりますHow can I put B above A, but not above any other window that is already above A?
statox

6

window位置を交換するための効果は、これら2つのウィンドウに表示されるバッファーを交換することと同じです。
たとえば、ウィンドウ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()
    これにより、事前に選択された2つのウィンドウのバッファーが交換され、元のウィンドウにカーソルが残ります。

どちらのウィンドウを操作するかをVimに指定するために必要なため、事前に交換する2つのウィンドウを選択することが重要です。


「ウィンドウ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

ウィンドウを交換したり、バッファを交換したりするもう1つの方法は、ファイル内の位置をマークし(大文字マークを使用)、選択したウィンドウでそれらのマークを開くことです。

たとえば、2つのファイルfile_Afile_Bがある場合

  • 私はfile_Aでウィンドウに行き、それをマークします:mA
  • file_Bを使用してウィンドウに移動し、マークします。mB
  • 次に、file_Aのマークをそのウィンドウにフェッチします。'A
  • 次に、最初のウィンドウに戻り、そこにあるfile_Bのマークを取得します'B

この方法の利点は、何らかの理由でペインを複数回分割し、12時と7時にペインを交換したい場合など、それらを交換する明確なロジックがない場合です。 tウィンドウを回転させるだけですが、バッファを簡単に交換できます。


0

次の機能を使用して、2つのウィンドウ間でバッファを交換できます。

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>

現在、ほとんどの場合、バッファの交換は技術的にはウィンドウの交換のように機能します。ウィンドウを手動で追跡しないため、どのウィンドウがどのバッファを保持しているかを追跡します。そのため、上記の機能はほとんどの状況で役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.