web-dev-qa-db-ja.com

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

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

118
mdrozdziel

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

  • Ctrl-W、 r (つまり、ホールド CTRL、 押す W、リリース CTRL、 押す r)-ウィンドウを回転します(最初のウィンドウが2番目のウィンドウになり、2番目のウィンドウが3番目のウィンドウになります)。

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

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

  • Ctrl-W、 Shift-K -このウィンドウを一番上に移動します

(および同様に Ctrl-W、 Shift-J そして Ctrl-W、 Shift-L)。見る:

:help window-moving

詳細については。

287
DrAl

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

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

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

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

  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
7
hcs42

私は 類似の質問 を尋ねました:arbitrarily意的に複雑なレイアウトを変更することなく、特にウィンドウを交換する方法が欲しかったです。最終的に、提案されたソリューションの1つからvimプラグインを作成しました。 WindowSwap.vim ;と呼ばれます。お好みのvimプラグインマネージャーでインストールし、旋回させます。

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

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

キーの組み合わせは、もちろん好みに合わせて構成可能です。

3
wes

私の意見では、 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現在のウィンドウを右端に移動
1
Aman Dogra

<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
Bohr