1. ホーム
  2. layout

[解決済み】vimで開いている2つのファイル(splits)の位置を入れ替えるには?

2022-03-26 20:13:51

質問

vimで任意に分割したレイアウトを用意したとします。

____________________
| one       | two  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

を入れ替える方法はありますか? onetwo と同じレイアウトを維持することができますか? この例では単純ですが、もっと複雑なレイアウトの場合に役立つ解決策を探しています。

UPDATEしてください。

もっとはっきりさせるべきですね。 私の前の例は、実際のユースケースを単純化したものでした。 実際のインスタンスで

同じレイアウトを維持したまま、これらの分割のうち任意の2つを入れ替えるにはどうしたらよいでしょうか。

更新しました 3年以上経って...

sgriffinの解決策を、簡単にインストールできるVimプラグインにしました! お気に入りのプラグインマネージャでインストールして、試してみてください。 ウィンドウズ・スワップ.vim

解決方法は?

ちょっと投稿が遅れましたが、他のものを探していてこれに出会いました。 私はしばらく前に、ウィンドウをマークし、ウィンドウ間のバッファを交換するための2つの関数を書きました。 これは、あなたが求めているもののように思えます。

これらを.vimrcに追加して、好きなように関数をマッピングしてください。

function! MarkWindowSwap()
    let g:markedWinNum = winnr()
endfunction

function! DoWindowSwap()
    "Mark destination
    let curNum = winnr()
    let curBuf = bufnr( "%" )
    exe g:markedWinNum . "wincmd w"
    "Switch to source and shuffle dest->source
    let markedBuf = bufnr( "%" )
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' curBuf
    "Switch to dest and shuffle source->dest
    exe curNum . "wincmd w"
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' markedBuf 
endfunction

nmap <silent> <leader>mw :call MarkWindowSwap()<CR>
nmap <silent> <leader>pw :call DoWindowSwap()<CR>

使用するには(mapleaderが "the \"に設定されていると仮定して)、次のようになります。

  1. スワップの対象となるウィンドウに移動します。 ctrl-wの移動
  2. タイプ \ʕ-̫͡-ʔ
  3. 入れ替えたいウィンドウに移動する
  4. タイプ \ʕ-ᴥ-ʔ

ほらね。 ウィンドウのレイアウトを崩すことなく、バッファを交換することができます。