Как я могу работать с разделениями в Vim без Ctrl-W?

25

Мой терминал не позволяет мне печатать Ctrl+ W, потому что это ярлык для закрытия вкладки терминала.

Мне нравится работать со сплитами, но я не могу найти способ сделать это без использования C-W. Это заставило меня использовать вкладки, потому что я могу переключаться между ними gt, gTили #gtгде # это номер, но я считаю , это менее удобно , чем расколы , как я могу видеть только содержимое одного файла одновременно.

Я не могу использовать mouse=aлибо, так как мой терминал не поддерживает это.

Как я могу работать со сплитами в Vim без Ctrl+ Wкомбо?

Mateon1
источник
1
Используйте сопоставления, wincmd например, для сопоставления: :nmap wj :wincmd j<cr>оно действует так же, как CTRL-W j(перейти к окну ниже). :help wincmd
Алекс Кролл
@AlexKroll Почему бы тебе не опубликовать это как ответ? :-)
Мартин Турной
1
@Carpetsmoker Я думаю, это не полное покрытие для этой проблемы. CTRL-W jработает со счетчиками (перейти к n-му окну ниже от текущего) моего решения нет.
Алекс Кролл
2
Обычно я не ценю такой совет, но я бы искал другой терминал. <C-W>слишком полезный ярлык (не только во многих местах в Vim, но и в bash), чтобы его потерять. Мне было бы любопытно, какие другие привязки клавиш используются терминалом - <C-T>? По крайней мере, я бы посмотрел, можно ли их настраивать в терминале.
Tommcdo

Ответы:

24

Вы можете просто переназначить <C-w>на другую комбинацию, например:

:nnoremap <C-e> <C-w>

Теперь вы можете использовать, <C-e>и он будет действовать, как будто вы нажали <C-w>.

Это заменит <C-e>отображение по умолчанию (прокрутите вниз). Vim уже использует каждую клавишу на клавиатуре, и единственный способ предотвратить это - использовать клавишу-лидер, которая действует как «префикс»:

:nnoremap <Leader>w <C-w>

Если вы не переназначены <Leader>, теперь вы можете использовать \w(после друг друга). Я на самом деле предпочитаю это, так как мне не нравятся комбинации клавиш CTRL +.

Смотрите, что такое <Лидер>? и как я могу узнать, что для <Leader> установлено? И можно ли переназначить <Лидер>? ,

Мартин Турной
источник
Решает мою проблему. Добавил отображение в мой vimrc и немного протестировал без проблем.
Mateon1
13

Я на самом деле использую :wincmdчаще, чем Ctrl+, Wпотому что мне легче набирать сокращенное :winc.

Например, эквивалентом Ctrl+ W Lявляется :winc l.

user530873
источник
7

Я настроил следующие переотображения в моем .vimrc:

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

Теперь я могу использовать, Ctrl+hчтобы перейти к левому окну, Ctrl+lперейти к правому окну и т. Д. Похоже, что он логически согласуется с обычной навигацией Vim.

Yep_It's_Me
источник
4
Обратите внимание, что отображение Ctrl + h в терминале не всегда работает, так как это часто клавиша возврата. Смотрите этот ответ и этот вопрос .
Мартин Турной
Кроме того, вы можете использовать nnoremap <cr> <c-w>w, так как ключ возврата не используется в обычном режиме. Тогда легко перебрать разделение.
Надежда
5

Для работы с разбиениями я использую подрежим-плагин, который на самом деле довольно удобен: он позволяет вам создавать новый режим («режим», как в обычном режиме, визуальном режиме, режиме вставки и т. Д.), В котором вы определяете новые привязки клавиш ,

При этом вам больше не нужно использовать Ctrl+w, и, поскольку вы находитесь в новом режиме, все ключи могут свободно связываться: больше никаких проблем, таких как «Черт, я не могу найти комбинацию клавиш, которая является значением и еще не сопоставлена "

Вы можете установить плагин с любым обычным менеджером плагинов, и вот некоторые из моих настроек, чтобы дать вам некоторое вдохновение:


Я создал новый режим, который я вызывал, WindowsModeв котором я манипулирую своими разделениями:

call submode#enter_with('WindowsMode', 'n', '', '<Leader>k', ':echo "windows mode"<CR>')
call submode#leave_with('WindowsMode', 'n', '', '<Leader>')

Эти строки означают, что я вхожу в режим с помощью Leaderkи я выхожу из режима с помощью Leader: После того, как я нажму Leaderkвсе клавиши, которые я нажимаю, будет:

  • Ничего не делать, если я не определил для них отображение в этом режиме
  • Делайте то, что я решил отобразить их в этом режиме (см. Остальную часть ответа)
  • Вернуться в нормальный режим, если я нажму Leader

После того, как я в WindowsModeэтих строках сделаю hjklнавигацию по расщеплениям вродеCtrl+whjkl

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

Я использовал эти строки , чтобы разделить окна с /и !:

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

И qзакройте сплит:

call submode#map('WindowsMode', 'n', '', 'q', '<C-w>c')

Переместите разделы с помощью Ctrlhjkl:

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

Vim-submode позволяет делать много мощных вещей, смотрите документацию для более подробной информации.


РЕДАКТИРОВАТЬ Другой подход подрежима Window описан здесь . Я думаю, что метод, использованный автором, еще ближе к ответу на вопрос: здесь используется для создания нового режима, но все <c-w>somethingсопоставления доступны с теми же ключами в подрежиме:

" Go through every letter
for key in ['a','b','c','d','e','f','g','h','i','j','k','l','m',
\           'n','o','p','q','r','s','t','u','v','w','x','y','z']
  " maps lowercase, uppercase and <C-key>
  call submode#map('window', 'n', '', key, '<C-w>' . key)
  call submode#map('window', 'n', '', toupper(key), '<C-w>' . toupper(key))
  call submode#map('window', 'n', '', '<C-' . key . '>', '<C-w>' . '<C-'.key . '>')
endfor

" Go through symbols. Sadly, '|', not supported in submode plugin.
for key in ['=','_','+','-','<','>']
  call submode#map('window', 'n', '', key, '<C-w>' . key)
endfor

Таким образом , все отображения <c-w>lowerCaseKey, <c-w>upperCaseKey, <c-w><c-Key>и отображения <c-w>=_+-<>все они доступны в оконном режиме без префикса<c-w>

statox
источник