9

我想要它,以便Ctrl-Wk从最右边的窗口输入将聚焦在 VIM 中最左边的窗口。显然,它可以方便地在各个方向工作。

我的主要动机是与 NERDTree 一起使用。我通常有以下设置:

|----------|----------|-----------|
|          |          |           |
| NERDTree |   File1  |   File2   |
|          |          |           |
|          |----------|-----------|
|          |          |           |
|          |   File3  |   File4   |
|          |          |           |
|----------|----------|-----------|

如果我想在File4当前必须键入的同一窗口中打开一个新文件,2Ctrl-Wj并且使用Ctrl-Wk.

谢谢。

4

2 回答 2

6

You'd have to override the default commands in your $HOME/.vimrc with your own mappings that include this extra logic. When the normal move doesn't change the window any more (i.e. we're at the border already), jump to the other side.

"
" Wrap window-move-cursor
"
function! s:GotoNextWindow( direction, count )
  let l:prevWinNr = winnr()
  execute a:count . 'wincmd' a:direction
  return winnr() != l:prevWinNr
endfunction

function! s:JumpWithWrap( direction, opposite )
  if ! s:GotoNextWindow(a:direction, v:count1)
    call s:GotoNextWindow(a:opposite, 999)
  endif
endfunction

nnoremap <silent> <C-w>h :<C-u>call <SID>JumpWithWrap('h', 'l')<CR>
nnoremap <silent> <C-w>j :<C-u>call <SID>JumpWithWrap('j', 'k')<CR>
nnoremap <silent> <C-w>k :<C-u>call <SID>JumpWithWrap('k', 'j')<CR>
nnoremap <silent> <C-w>l :<C-u>call <SID>JumpWithWrap('l', 'h')<CR>
nnoremap <silent> <C-w><Left> :<C-u>call <SID>JumpWithWrap('h', 'l')<CR>
nnoremap <silent> <C-w><Down> :<C-u>call <SID>JumpWithWrap('j', 'k')<CR>
nnoremap <silent> <C-w><Up> :<C-u>call <SID>JumpWithWrap('k', 'j')<CR>
nnoremap <silent> <C-w><Right> :<C-u>call <SID>JumpWithWrap('l', 'h')<CR>
于 2012-12-13T08:02:47.630 回答
3

一个可以使用

<C-w>w

<C-w>W

分别向右/向下和向左/向上循环浏览所有窗口。两个命令都会环绕,所以<C-w>w会在某个时候出现在左上角,在某个时候<C-w>W会出现在右下角。

:h window-move-cursor

或者简单地使用<C-w>bwhich 直接进入您的目标窗口。

于 2012-12-12T21:42:19.693 回答