Навигация между окнами VIM альтернативным способом - PullRequest
30 голосов
/ 28 января 2012

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

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

Ответы [ 5 ]

42 голосов
/ 28 января 2012

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

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

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

18 голосов
/ 29 января 2012

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

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

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

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

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

4 голосов
/ 28 января 2012

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

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

nnoremap new_keybinding keystrokes

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

РЕДАКТИРОВАТЬ : Есть также команда nmap. Разница между ними заключается в том, что nmap позволяет перезаписывать текущие сочетания клавиш, а nnoremap - нет. Разница между ними объясняется в этом ответе .

Например, я вставил эти строки в .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 + W j , Ctrl + W k , Ctrl + W h , Ctrl + W l для навигации по окну при сохранении старых сочетаний клавиш.

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

1 голос
/ 21 сентября 2015

Благодаря этому ответу на сайте 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>')

Теперь вам просто нужно нажать Leader + k , чтобы войти в новый режим (Выможно изменить это с помощью строки submode#enter_with) и нажать Leader , чтобы выйти из нее.

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

С этими строками после входа в новый режим (с помощью Leader + k ) вы сможете перемещаться между окнами с помощью клавиш 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-клавиатуре, я не уверен) .

" 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

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

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

0 голосов
/ 21 сентября 2015

Вы можете создавать диагональные движения, продолжая <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 
...