VIMを使用すると、常に複数のウィンドウが表示されます。時々、それらのウィンドウを場所ごとに交換する簡単な方法が欲しいです。これをもっと簡単にするプラグイン、マクロなどはありますか?ところで、私はMiniBufExplorerを使用しています。
ある程度の制御を可能にするいくつかの便利なコマンドが組み込まれていますが、包括的なものではありません。主なものは次のとおりです。
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
詳細については。
Vimウィンドウをコピーして貼り付けるために、vimrcで次のコードスニペットを作成して使用しています。
これにより、たとえば次のショートカットが定義されます。
<c-w>y
:「ウィンドウのヤンク」、つまり、現在のウィンドウのバッファの番号をグローバル変数に格納します。<c-w>pp
:「現在のウィンドウの代わりにウィンドウを置く」、つまり、以前に保存されたバッファ番号を読み取り、現在のウィンドウでそのバッファを開きます。また、現在のウィンドウにあったバッファの番号も保存します。「これらのウィンドウを適切な場所にスワップする」ということは、「ウィンドウBのウィンドウAのバッファを開き、ウィンドウの位置を変更せずにその逆」を意味する場合、次のキーボードシーケンスを使用してウィンドウをスワップできます。
<c-w>y
(バッファ番号をヤンク)<c-w>pp
(バッファの貼り付け)<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
私は 類似の質問 を尋ねました:arbitrarily意的に複雑なレイアウトを変更することなく、特にウィンドウを交換する方法が欲しかったです。最終的に、提案されたソリューションの1つからvimプラグインを作成しました。 WindowSwap.vim ;と呼ばれます。お好みのvimプラグインマネージャーでインストールし、旋回させます。
WindowSwap.vimを使用すると、単純に
<Leader>yw
ウィンドウをヤンクします。<Leader>pw
そのウィンドウを貼り付け、最初のウィンドウの位置と交換します。キーの組み合わせは、もちろん好みに合わせて構成可能です。
私の意見では、 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
現在のウィンドウを右端に移動<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>