Ярлык для перехода между окнами Vim

Скажем, у меня есть одна вкладка Vim, отображающая 9 буферов (одинаково разделенных, например, таблица 3x3). В настоящее время, чтобы попасть из верхнего левого окна в нижний правый, мне нужно нажать 3, Ctrl + W, J, а затем 3, Ctrl + W, L. Это громоздко, и я хотел бы просто нажать Ctrl + 9, чтобы перейти к девятому окну и Ctrl + 3, чтобы перейти в 3-е окно и т.д. Есть ли какой-либо простой способ сопоставьте что-то подобное в Vim?

Ответы

Ответ 1

Там гораздо более простое решение, чем использование мышечных или жестких сопоставлений движения; они будут разбиты, если нумерация окон отличается от того, что вы имеете в виду для матрицы 3x3, или если вы решили работать с менее чем 9 окнами. Вот как:

Включите следующее в .vimrc:

let i = 1
while i <= 9
    execute 'nnoremap <Leader>' . i . ' :' . i . 'wincmd w<CR>'
    let i = i + 1
endwhile

Теперь вы можете просто нажать <Leader><number> и перейти к нужному номеру окна. Я бы не рекомендовал выходить за пределы 9, потому что IMO, использование нескольких видовых экранов следует дистрибутив Рэлея и быстро становится бесполезным со слишком большим количеством видовых экранов в одном окне.

Будет полезно, если у вас есть номер окна, отображаемый в вашем statusline, чтобы помочь вам быстро выяснить, в каком окне вы находитесь и в каком окне вы хотите перейти. Для этого используйте эту небольшую функцию и добавьте ее соответственно в statusline.

function! WindowNumber()
    let str=tabpagewinnr(tabpagenr())
    return str
endfunction

Посмотрите его в действии в statusline:

set laststatus=2
set statusline=win:%{WindowNumber()}

Обратите внимание, что приведенная выше строка заменит ваш statusline. Это просто предназначено для иллюстрации, чтобы показать, как вызвать функцию. Вы должны поместить его там, где вы считаете нужным в своем statusline. Вот как выглядит мое:

enter image description here


EDIT:

romainl попросил мою строку статуса в комментариях, так вот вот:

"statusline
hi StatusLine term=bold cterm=bold ctermfg=White ctermbg=235
hi StatusHostname term=bold cterm=bold ctermfg=107 ctermbg=235 guifg=#799d6a
hi StatusGitBranch term=bold cterm=bold ctermfg=215 ctermbg=235 guifg=#ffb964

function! MyGitBranchStyle()
    let branch = GitBranch()
    if branch == ''
        let branchStyle = ''
    else
        let branchStyle = 'git:' . branch
    end
    return branchStyle
endfunction

function! WindowNumber()
    let str=tabpagewinnr(tabpagenr())
    return str
endfunction

set laststatus=2
set statusline=%#StatusLine#%F%h%m%r\ %h%w%y\ col:%c\ lin:%l\,%L\ buf:%n\ win:%{WindowNumber()}\ reg:%{v:register}\ %#StatusGitBranch#%{MyGitBranchStyle()}\ \%=%#StatusLine#%{strftime(\"%d/%m/%Y-%H:%M\")}\ %#StatusHostname#%{hostname()}

Последняя строка должна быть одной строкой (будьте осторожны, если ваша установка автоматически разбивает ее на несколько строк). Я знаю, что есть способы держать его организованным с добавочными строковыми объединениями на каждом шаге, но я слишком ленив, чтобы изменить его.:) Функция GitBranch() (с другими возможностями git) предоставляется git.vim plugin. В нем есть ошибка, как указано здесь, и я использую fork with исправление ошибки. Тем не менее, я оставляю ссылки и блог здесь, чтобы отдать должное всем.

Также обратите внимание, что я использую тёмный фон, поэтому вам придется немного менять цвета, если вы используете световую схему (а также в соответствии с вашими вкусами).

Ответ 2

Лучше, более общий ответ:

Используйте count Ctrl+w Ctrl+w, чтобы перейти к окну счетчика ниже/справа от текущего.

Например, если вы находитесь в левом верхнем углу сетки 3x3 и хотите перейти в нижнее левое, вы должны использовать 7 Ctrl+w Ctrl+w.

Конкретный ответ сетки 3x3:

Если вы всегда используете макет 3x3, вы можете попробовать эти сопоставления для numpad, которые всегда переходят в верхний левый угол, а затем перемещают соответствующую сумму оттуда, причем позиция клавиш на клавиатуре перепрыгивает в окно с помощью ' эквивалентную "позицию на экране:

noremap <k7> 1<c-w><c-w>
noremap <k8> 2<c-w><c-w>
noremap <k9> 3<c-w><c-w>
noremap <k4> 4<c-w><c-w>
noremap <k5> 5<c-w><c-w>
noremap <k6> 6<c-w><c-w>
noremap <k1> 7<c-w><c-w>
noremap <k2> 8<c-w><c-w>
noremap <k3> <c-w>b

Отредактировано: получается c-w c-w автоматически переходит в левый верхний угол. Явный 1 требуется в первом сопоставлении, так как c-w c-w без подсчета счетчика между текущим и ранее выбранным окном.

(Отображение Ctrl-W t всегда относится к самому верхнему окну, отображение Ctrl-W b всегда идет в нижнем правом углу).

В качестве альтернативы вы можете сопоставить каждое число, чтобы перейти к N-ому окну, поэтому k6 будет иметь 6 c-w c-w, вместо того, чтобы пытаться выложить ключи как на экране.

Ответ 3

Я предпочитаю использовать стандартные ключи vim (jkhl).

noremap <C-J> <C-W>w
noremap <C-K> <C-W>W
noremap <C-L> <C-W>l
noremap <C-H> <C-W>h

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

И вы также можете переключиться в любое окно с помощью <Number><C-J>, например, 2<C-J> перейдет во второе окно.

Ответ 4

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

:set mouse+=a
:set ttymouse=xterm2

и нажмите на буфер, чтобы переключиться на него. Да, с помощью мыши.

Также работает куча других действий с мышью - вы можете щелкнуть, чтобы переместить точку вставки, перетащить, чтобы выбрать текст или изменить размер разделов, и использовать колесо прокрутки.

Ответ 5

Ermmm... Я уверен, что это не будет поддерживать макет окна как есть, но я использую

:buf sys

чтобы перейти к system.h,

:buf Sing

чтобы перейти к MyLargeNamedClassSingleton.cpp

buf выполнит автозаполнение (возможно, если он сконфигурирован в меню), чтобы вы могли сделать

:buf part<Tab>

чтобы указать, какие файлы могут соответствовать введенному part. Избавляет дерьмо из навигационных буферов.

Но я понимаю, это, конечно, не отвечает на ваш конкретный вопрос:)

Ответ 6

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

map <C-UP> <C-W><C-UP>
map <C-DOWN> <C-W><C-DOWN>
map <C-LEFT> <C-W><C-LEFT>
map <C-RIGHT> <C-W><C-RIGHT>

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