VIMでウィンドウ間でファイルを交換する方法は?


123

VIMを使用しているときは、常に複数のウィンドウが表示されています。時々私は簡単な方法で、それらのウィンドウを場所で入れ替えたいと思います。これをより簡単にするためのプラグイン、マクロなどはありますか?ところで、私はMiniBufExplorerを使用しています。


2
「ウィンドウの位置を入れ替える」とは、「ウィンドウAにあるバッファーをウィンドウBで開く、またはその逆で、ウィンドウの位置を変更せずに開く」という意味ですか?
hcs42

1
はい、これはまさに私が欲しいものです。
mdrozdziel 2010

回答:


304

いくつかの便利なコマンドが組み込まれており、ある程度の制御が可能ですが、包括的ではありません。主なものは次のとおりです。

  • Ctrl- Wr(つまりCTRL、押したままW、離したCTRL、押したr)-ウィンドウを回転させます(最初のウィンドウが2番目のウィンドウになり、2番目のウィンドウが3番目のウィンドウになる、など)。

  • Ctrl- Wx-現在のウ​​ィンドウを次のウィンドウと交換する

  • Ctrl- WShift-- Hこのウィンドウを左端に移動します

  • Ctrl- WShift-- Kこのウィンドウを一番上に移動

(同様にCtrl- WShift- JおよびCtrl- WShift- も同様L)。見る:

:help window-moving

詳細については。


16
これは「ベストアンサー」、つまりカスタムVimscriptではなくネイティブ機能である必要があります。
David Rivers

1
完全にではありません。組み込みのウ​​ィンドウ管理を使用して、ウィンドウを破棄して再作成しないと実行できない多くの使用例があります。バッファ交換スクリプトはこれらの使用例を可能にします。
bobpaul 2010年

ctl-wも機能することに注意してください。ctl-Wは、一部の端末エミュレーターでウィンドウを閉じます。
datakid

7

私はVimウィンドウをコピーして貼り付けるために、次のコードスニペットをvimrcで作成して使用しています。

これにより、たとえば次のショートカットが定義されます。

  • <c-w>y:「ウィンドウをヤンクする」、つまり、現在のウィンドウ内のバッファの数をグローバル変数に格納します。
  • <c-w>pp:「ウィンドウを現在のウィンドウの代わりに配置する」、つまり、以前に保存されたバッファ番号を読み取り、そのバッファを現在のウィンドウで開きます。また、現在のウィンドウにあったバッファの数も格納します。

「これらのウィンドウを所定の場所でスワップする」というのは、「ウィンドウAのバッファーをウィンドウBで、またはその逆で、ウィンドウの位置を変更せずに開く」という意味の場合、次のキーボードシーケンスを使用してウィンドウをスワップできます。

  1. ウィンドウAを選択します(マウスまたはキーボードコマンドを使用)
  2. 押す<c-w>y(バッファ番号をヤンクする)
  3. ウィンドウBを選択
  4. 押す<c-w>pp(バッファを貼り付ける)
  5. ウィンドウAを選択
  6. 押す<c-w>pp(バッファを再度貼り付ける)

Vim 7.0以降でのみ機能します。

if version >= 700
function! HOpen(dir,what_to_open)

    let [type,name] = a:what_to_open

    if a:dir=='left' || a:dir=='right'
        vsplit
    elseif a:dir=='up' || a:dir=='down'
        split
    end

    if a:dir=='down' || a:dir=='right'
        exec "normal! \<c-w>\<c-w>"
    end

    if type=='buffer'
        exec 'buffer '.name
    else
        exec 'edit '.name
    end
endfunction

function! HYankWindow()
    let g:window = winnr()
    let g:buffer = bufnr('%')
    let g:bufhidden = &bufhidden
endfunction

function! HDeleteWindow()
    call HYankWindow()
    set bufhidden=hide
    close
endfunction

function! HPasteWindow(direction)
    let old_buffer = bufnr('%')
    call HOpen(a:direction,['buffer',g:buffer])
    let g:buffer = old_buffer
    let &bufhidden = g:bufhidden
endfunction

noremap <c-w>d :call HDeleteWindow()<cr>
noremap <c-w>y :call HYankWindow()<cr>
noremap <c-w>p<up> :call HPasteWindow('up')<cr>
noremap <c-w>p<down> :call HPasteWindow('down')<cr>
noremap <c-w>p<left> :call HPasteWindow('left')<cr>
noremap <c-w>p<right> :call HPasteWindow('right')<cr>
noremap <c-w>pk :call HPasteWindow('up')<cr>
noremap <c-w>pj :call HPasteWindow('down')<cr>
noremap <c-w>ph :call HPasteWindow('left')<cr>
noremap <c-w>pl :call HPasteWindow('right')<cr>
noremap <c-w>pp :call HPasteWindow('here')<cr>
noremap <c-w>P :call HPasteWindow('here')<cr>

endif

4

私は同じ時期に同じような質問をしました。私は、任意に複雑なレイアウトを変更することなく、具体的にウィンドウを交換する方法を望んでいました。提案されたソリューションの1つからvimプラグインを作成することになりました。これはWindowSwap.vimと呼ばれます。お好みのvimプラグインマネージャーを使用してインストールし、試してみてください。

WindowSwap.vimを使用すると、簡単に

  1. <Leader>yw ウィンドウをヤンクします。
  2. カーソルを別のウィンドウに移動します。
  3. <Leader>pw そのウィンドウを貼り付けるには、最初のウィンドウの位置と入れ替えます。

キーの組み合わせはもちろん、好みに合わせて設定できます。


1

<c-w>rまたは<c-w>x垂直方向と水平方向のウィンドウの分割が混在しているときに回転または交換ウィンドウができないという制限があります。また<c-w>H、特に多くのウィンドウがある場合は、ウィンドウレイアウトが予想外に変更される可能性があります。

したがって、ウィンドウ/バッファ切り替えの特定のニーズを満たすために、いくつかの作業を行うことができます。現在のウィンドウを左上のウィンドウに切り替える例を示します(通常、垂直方向に最大化します):

function! SwitchMainWindow()
  let l:current_buf = winbufnr(0)
  exe "buffer" . winbufnr(1)
  1wincmd w
  exe "buffer" . l:current_buf
endfunction
nnoremap <c-w><c-e> :call SwitchMainWindow()<cr>

1

私の意見では、http://vimcasts.org/episodes/working-with-windows/がこの質問に対する完全な回答です。簡単に言えば:

  • ctrl-w w 開いているウィンドウを切り替える
  • ctrl-w h ウィンドウを左にフォーカスする
  • ctrl-w j ウィンドウを下にフォーカス
  • ctrl-w k ウィンドウを上にフォーカス
  • ctrl-w l ウィンドウを右にフォーカス
  • ctrl-w r すべてのウィンドウを回転させる
  • ctrl-w x 現在のウィンドウを隣人と交換する
  • ctrl-w H 現在のウィンドウを左端に移動
  • ctrl-w J 現在のウィンドウを下に移動
  • ctrl-w K 現在のウィンドウを上に移動
  • ctrl-w L 現在のウィンドウを右端に移動

3
投稿に新しい有用な情報をもたらさない回答を追加する理由は何ですか?これは6年前に完全に回答されました。vimcastの広告キャンペーンを行っていますか?
mdrozdziel

@mdrozdziel OPの9年後、この回答に感謝します。私が欲しかった情報だけで最も簡潔な答え。
roro
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.