Подтвердить что ты не робот

Переход между окнами VIM альтернативным способом

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

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

4b9b3361

Ответ 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

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

Ответ 2

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

Ответ 3

Вы можете использовать команду 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 для получения дополнительной информации.

Ответ 4

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

Ответ 5

Благодаря этому ответу на веб-сайте 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. Я думаю, что создание подкатегории довольно удобно, но интересно, только если подкод позволяет делать не только одно действие.