Ответ 1
Почему бы не настроить что-то подобное?
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
Гораздо быстрее...
Я использую Ctrl W для перемещения между разделенными окнами VIM. Существуют ли разные способы сделать это?
Например, если у меня есть, скажем, 5 разделенных окон, и вы хотите перейти в окно верхнего левого угла, Ctrl W очень неудобно, так как для этого требуется много нажатий клавиш.
Почему бы не настроить что-то подобное?
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
Гораздо быстрее...
Вы можете использовать <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>
который я использую для строчки окна (по какой-то причине, если я не определяю второе отображение если я дважды ударил вкладку, я получаю сообщение "no identifier под курсором"
Чтение страницы справки для CTRL-W, есть даже более удобный способ, чем
1<c-w>w
и 11<c-w>w
, чтобы перейти в первое и последнее окно:
<c-w>t
идет в верхнее окно и <c-w>b
переходит в нижнее окно.
Вы можете использовать команду nnoremap
в вашем vimrc для использования пользовательских привязок клавиш.
Синтаксис nnoremap
таков:
nnoremap new_keybinding keystrokes
Команда nnoremap назначает новую привязку клавиш, которая при нажатии на нее в нормальном режиме последовательность нажатий клавиш, которые были назначены этой команде, отображается в Vim.
EDIT. Также существует команда 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
для получения дополнительной информации.
Вы можете создавать диагональные движения, продолжая <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
Благодаря этому ответу на веб-сайте SE, посвященном Vim, я подошел к другой альтернативе, которая использует плагин для создания подпрограммы, посвященной управлению Windows. Это означает, что с помощью комбинации клавиш я ввожу новый режим, в котором некоторые клавиши позволят мне делать разные действия в окнах.
После установки 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
(я выбираю эти клавиши, потому что на азерной клавиатуре они находятся только над строкой над 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
Наконец, эти опции позволяют удерживать клавишу нажатой, и она будет повторять ее действие.
Примечание. Я знаю, что этот ответ описывает не просто навигацию между окнами, как спрашивал OP. Я думаю, что создание подкатегории довольно удобно, но интересно, только если подкод позволяет делать не только одно действие.