2012-12-12 74 views
8

我希望能够从最右边的窗口打字Ctrl-Wk将把最左边的窗口聚焦在VIM中。显然,这对于所有方向的工作都很方便。有没有一种方法在VIM中有窗口导航换行

我的主要动机是用于NERDTree。我通常有以下设置:

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

如果我想在同一个窗口中打开一个新的文件作为File4我现在必须键入 按Ctrl-WĴ,这将是相当不错的以达到与同样的效果Ctrl-Wk

谢谢。

+0

你一定要编写一些代码来完成它,并将其映射到所需的键组合。检查':h window-move-cursor';移动命令在那里列出。 – plesiv

+0

这是我的想法。不幸的是,我并不熟悉VIM脚本只是:) – Wes

回答

2

一个可以使用的

<C-w>w 

<C-w>W 

循环通过所有窗口向右/向下和向左分别/上。这两个命令都会环绕,所以<C-w>w将在某个点结束左上角,<C-w>W将在某个点结束右下角。

请参阅:h window-move-cursor

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

4

您必须覆盖$HOME/.vimrc中的默认命令,并使用包含此额外逻辑的自己的映射。当正常移动不再改变窗口(即我们已经在边界)时,跳转到另一边。

" 
" 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> 
+1

垃圾,由于某种原因跳过netrw – mcandre

相关问题