2012-01-28 2 views
27

Я использую CtrlW для перехода между разделенными окнами VIM. Существуют ли разные способы сделать это?Перемещение между окнами VIM альтернативным способом

Например, если у меня есть, скажем, 5 сплит окна открыты и хотите перейти в верхнем левом углу окна, CtrlW очень неудобно, так как требует много нажатий клавиш.

ответ

38

Почему бы не настроить что-нибудь подобное?

nnoremap <C-h> <C-w>h 
nnoremap <C-j> <C-w>j 
nnoremap <C-k> <C-w>k 
nnoremap <C-l> <C-w>l 

Гораздо быстрее ...

+1

Спасибо. Я знаю об этом решении, но я искал что-то, что позволило бы перейти к определенному окну. В любом случае это должно быть выполнимым решением в случае отсутствия альтернатив. – Adas

+0

@Adas - Нет лучшего способа, но я не знаю. Дело в том, что вы не перемещаетесь по окнам (они просто ... точки обзора). Вы перемещаетесь по буферам. Поэтому, если у вас есть конфигурация окна 2x2, верхний левый не обязательно будет первым, верхним справа вторым и т. Д. – Rook

+2

У меня есть 'nnoremap w', так как я никогда не использую ключ возврата в нормальном режиме. Тогда без усилий можно пройти через расщепления. –

3

Вы можете использовать команду nnoremap в вашем vimrc использовать пользовательские сочетания клавиш.

Синтаксис nnoremap это:

nnoremap new_keybinding keystrokes 

Команда nnoremap присваивает новый данное сочетание клавиш, что, когда вы нажимаете ее в обычном режиме, последовательность нажатий клавиш, которые были назначены на эту команду вторит в Vim ,

EDIT: есть также команда nmap. Разница между двумя заключается в том, что nmap позволяет перезаписать текущие привязки клавиш, а nnoremap - нет. Разница между ними объясняется в this answer.

Например, я поставил эти строки в моем .vimrc:

"Better window navigation 
nnoremap <C-j> <C-w>j 
nnoremap <C-k> <C-w>k 
nnoremap <C-h> <C-w>h 
nnoremap <C-l> <C-w>l 

Это позволяет мне использовать Ctrl + J, Ctrl + K, Ctrl + H, Ctrl + L вместо Ctrl + WJ, Ctrl + Wк , Ctrl + Wч, Ctrl + Wл для окна навигации, сохраняя при этом старые сочетания клавиш.

Вы также можете найти :help key-mappings для получения дополнительной информации.

+1

Что касается nmap/nnoremap - нет, это не разница. Вы можете переписать свои сопоставления nnoremap так же, как и любые другие. Разница в том, что nnoremap не является рекурсивным. – Rook

18

Вы можете использовать <number><c-w>w для перехода к определенному окну. So 1<c-w>w переходит в первое окно (верхний левый угол) 11<c-w>w переходит в последнее окно (здесь я предполагаю, что у вас меньше 11 расколов).

Я также считаю, что следующие сопоставления удобны и имеют их в моем.vimrc

nnoremap <tab> <c-w> 
nnoremap <tab><tab> <c-w><c-w> 

, который я использую для оконных строчек (по какой-то причине, если я не определяю второе отображение если вкладку я ударил два раз, я получаю сообщение «нет идентификатора под курсором)

Reading страница справки для CTRL-W, есть даже более удобный способ, чем 1<c-w>w и 11<c-w>w, чтобы перейти к первому и последнему окну:. <c-w>t идет в верхней части окна и <c-w>b идет в нижней части окна

0

Вы можете создавать диагональные движения, продолжая <C-w> второй раз в другом направлении.

"move from bottom left to top right diagonally 
    "Mnemonic: keyboard finger movement from j to i 
    nnoremap <C-i> <C-w>l<C-w>k 

    "move from top right to bottom left diagonally 
    "Mnemonic: keyboard finger movement from j to n 
    nnoremap <C-n> <C-w>h<C-w>j 

    "move from top left to bottom right diagonally 
    "Mnemonic: keyboard finger movement from j to m 
    nnoremap <C-m> <C-w>l<C-w>j 

    "move from bottom right to top left diagonally 
    "Mnemonic: keyboard finger movement from j to y 
    nnoremap <C-y> <C-w>h<C-w>k 
+0

(^ M) имеет особое значение и может сломаться в некоторых ситуациях –

1

Благодаря this answer на сайте SE посвященного Vim, я подошел к другой альтернативе, которая использует плагин для создания подрежима, посвященный управлению окон. Это означает, что с помощью комбинации клавиш я вхожу в новый режим, в котором некоторые клавиши позволят мне делать разные действия в окнах.

После установки vim-submode давайте добавим несколько строк в наш vimrc настроить новый режим:

" Create a submode to handle windows 
" The submode is entered whith <Leader>k and exited with <Leader> 
call submode#enter_with('WindowsMode', 'n', '', '<Leader>k', ':echo "windows mode"<CR>') 
call submode#leave_with('WindowsMode', 'n', '', '<Leader>') 

Теперь вам нужно просто нажать Лидер + к, чтобы войти в новый режим (Вы можете изменить это с линией submode#enter_with) и нажмите Лидер, чтобы выйти из него.

" Change of windows with hjkl 
call submode#map('WindowsMode', 'n', '', 'j', '<C-w>j') 
call submode#map('WindowsMode', 'n', '', 'k', '<C-w>k') 
call submode#map('WindowsMode', 'n', '', 'h', '<C-w>h') 
call submode#map('WindowsMode', 'n', '', 'l', '<C-w>l') 

С этими линиями, после того, как вы вошли в новом режиме Лидером + к) вы будете иметь возможность перемещаться между вашими окнами с ключами hjkl, как если бы вы использовали <c-w>hjlk в нормальный режим.

" Resize windows with <C-yuio> (interesting on azerty keyboards) 
call submode#map('WindowsMode', 'n', '', 'u', '<C-w>-') 
call submode#map('WindowsMode', 'n', '', 'i', '<C-w>+') 
call submode#map('WindowsMode', 'n', '', 'y', '<C-w><') 
call submode#map('WindowsMode', 'n', '', 'o', '<C-w>>') 

Некоторые еще несколько строк, чтобы изменение размеров окна с yuio(я выбираю эти ключи, потому что на Azerty клавиатуре они только на строке над hjkl и довольно удобны в использовании, может быть, это было бы более полезно изменить это на клавиатуре qwerty, Im не уверен).

" Move windows with <C-hjkl> 
call submode#map('WindowsMode', 'n', '', '<C-j>', '<C-w>J') 
call submode#map('WindowsMode', 'n', '', '<C-k>', '<C-w>K') 
call submode#map('WindowsMode', 'n', '', '<C-h>', '<C-w>H') 
call submode#map('WindowsMode', 'n', '', '<C-l>', '<C-w>L') 

Давайте переместим окна с <C-hjkl>.

" close a window with q 
call submode#map('WindowsMode', 'n', '', 'q', '<C-w>c') 

" split windows with/and ! 
call submode#map('WindowsMode', 'n', '', '/', '<C-w>s') 
call submode#map('WindowsMode', 'n', '', '!', '<C-w>v') 

И еще несколько отображений, чтобы закрыть окно и создать новые расщепления.

let g:submode_keep_leaving_key = 1 
let g:submode_timeout = 0 

Наконец, эти опции позволяют удерживать клавишу нажатой, и она повторит свое действие.

Примечание Я знаю, что этот ответ описывает больше, чем просто перемещение между окнами по мере того, как спрашивал ОП.Я думаю, что создание подкатегории довольно удобно, но это только интерес, если подкод позволяет делать не только одно действие.

Смежные вопросы