Ярлык для перемещения между окнами Vim - PullRequest
16 голосов
/ 19 июня 2011

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

Ответы [ 6 ]

26 голосов
/ 19 июня 2011

Существует гораздо более простое решение, чем использование мыши или жестко настроенных отображений движения; они сломаются, если нумерация окон отличается от того, что вы имеете в виду для матрицы 3х3, или если вы решите работать с менее чем 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 . В нем есть ошибка, как отмечено здесь , и я использую вилку с исправлением ошибки . Однако я оставляю здесь обе ссылки и блог, чтобы отдать должное всем.

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

8 голосов
/ 19 июня 2011

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

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

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

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

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

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

Отредактировано: оказывается, что cw cw переходит кверхний левый в начале автоматически.В первом отображении требуется явное значение 1, поскольку cw cw без счетчика переключается между текущим и ранее выбранным окном.

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

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

5 голосов
/ 11 января 2013

Я предпочитаю использовать стандартные клавиши 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> перейдет во 2-е окно.

3 голосов
/ 19 июня 2011

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

:set mouse+=a
:set ttymouse=xterm2

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

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

1 голос
/ 20 июня 2011

Мне нравится перемещаться с помощью клавиш со стрелками.
Я отображаю направление 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>

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

1 голос
/ 19 июня 2011

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

:buf sys

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

:buf Sing

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

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

:buf part<Tab>

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

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

...