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