2012-12-12 7 views
8

ich es möchte, so dass die Eingabe eines Ctrl-Wk von rechts den meisten Fenstern der am weitesten links stehenden Fenster in VIM konzentrieren. Offensichtlich wäre es praktisch, wenn dies in alle Richtungen funktioniert.Gibt es eine Möglichkeit Fenster Navigation Wrap um sie zu haben in VIM

Meine Hauptmotivation ist für den Einsatz mit NERDTree. Ich habe in der Regel die folgende Einstellung:

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

Wenn ich eine neue Datei im gleichen Fenster geöffnet werden soll, wie File4 ich zur Zeit Ctrl-Wj eingeben muß, und es wäre ganz nett um das gleiche Ergebnis zu erreichen mit Ctrl-Wk.

Danke.

+0

Sie werden sicherlich etwas Code schreiben müssen, um das zu erreichen, und es der gewünschten Tastenkombination zuordnen. Überprüfen Sie ': h window-move-cursor'; Bewegungsbefehle sind dort aufgelistet. – plesiv

+0

Das war mein Gedanke. Leider bin ich mit vim scripting noch nicht so vertraut :) – Wes

Antwort

2

Man kann

<C-w>w 

und

<C-w>W 

, um durch alle Fenster nach rechts/unten und links/oben bzw. verwenden. Beide Befehle wrap around, so <C-w>w wird irgendwann oben links oben enden und <C-w>W wird an einem bestimmten Punkt unten rechts enden.

Siehe :h window-move-cursor.

Oder verwenden Sie einfach <C-w>b, die direkt zu Ihrem Zielfenster geht.

4

Sie müssten die Standardbefehle in Ihrem $HOME/.vimrc mit Ihren eigenen Zuordnungen überschreiben, die diese zusätzliche Logik enthalten. Wenn die normale Bewegung das Fenster nicht mehr ändert (d. H. Wir sind bereits am Rand), springen Sie auf die andere Seite.

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

Mist, das überspringt aus irgendeinem Grund netrw – mcandre