Изменение размера окна Vim

У меня есть привязки клавиш в tmux, которым мне очень нравится управлять разделенными панелями:

bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

Это позволяет мне ударить L wit несколько Ls подряд. Это также позволяет мне сказать границу (слева, справа и т.д.), Которую я хочу увеличить.

Я хотел бы иметь то же самое в vim, однако, vim, похоже, не имеет контекста границы:

"attempt 1
nnoremap <leader>L :vertical resize +5<cr><leader>
"attempt 2
nnoremap <leader>L :vertical resize +5</leader></leader></cr></leader>

Тем не менее, это работает только в том случае, если в левой панели больше, чем когда на правой панели, я бы хотел, чтобы это уменьшало размер на 5. Кроме того, это не позволяет мне делать это повторно. (Я хотел бы нажать клавишу один раз, а затем столько раз, сколько мне нужно "L".

Мне было интересно, нашел ли кто-нибудь способ сделать это.

Примечание. Я поместил конфигурацию tmux, чтобы кто-то мог сыграть с ней, чтобы точно увидеть, что я имел в виду.

2 ответа

Я сделал себе vim script, чтобы изменить размер, похожий на поведение Tmux. Возможно, это то, что вы ищете.

" Tmux-like window resizing
function! IsEdgeWindowSelected(direction)
 let l:curwindow = winnr()
 exec "wincmd ".a:direction
 let l:result = l:curwindow == winnr()
 if (!l:result)
 " Go back to the previous window
 exec l:curwindow."wincmd w"
 endif
 return l:result
endfunction
function! GetAction(direction)
 let l:keys = ['h', 'j', 'k', 'l']
 let l:actions = ['vertical resize -', 'resize +', 'resize -', 'vertical resize +']
 return get(l:actions, index(l:keys, a:direction))
endfunction
function! GetOpposite(direction)
 let l:keys = ['h', 'j', 'k', 'l']
 let l:opposites = ['l', 'k', 'j', 'h']
 return get(l:opposites, index(l:keys, a:direction))
endfunction
function! TmuxResize(direction, amount)
 " v >
 if (a:direction == 'j' || a:direction == 'l')
 if IsEdgeWindowSelected(a:direction)
 let l:opposite = GetOpposite(a:direction)
 let l:curwindow = winnr()
 exec 'wincmd '.l:opposite
 let l:action = GetAction(a:direction)
 exec l:action.a:amount
 exec l:curwindow.'wincmd w'
 return
 endif
 " < ^
 elseif (a:direction == 'h' || a:direction == 'k')
 let l:opposite = GetOpposite(a:direction)
 if IsEdgeWindowSelected(l:opposite)
 let l:curwindow = winnr()
 exec 'wincmd '.a:direction
 let l:action = GetAction(a:direction)
 exec l:action.a:amount
 exec l:curwindow.'wincmd w'
 return
 endif
 endif
 let l:action = GetAction(a:direction)
 exec l:action.a:amount
endfunction
" Map to buttons
nnoremap <m-h> :call TmuxResize('h', 1)<cr>
nnoremap <m-j> :call TmuxResize('j', 1)<cr>
nnoremap <m-k> :call TmuxResize('k', 1)<cr>
nnoremap <m-l> :call TmuxResize('l', 1)</m-l></cr></m-k></cr></m-j></cr></m-h>

Вы можете использовать функцию TmuxResize для сопоставления с ней других клавиш. Первым аргументом является направление ('h', 'j', 'k' или 'l'), второй аргумент заключается в том, насколько перемещается разделительная рамка.


Есть некоторые плагины, которые это делают. Например tinymode, подменю и tinykeymap

По крайней мере, для tinykeymap, который использовался для поведения по умолчанию, он переключился бы на поведение tmux при нажатии Ctrl + + (и именно по этой причине я, наконец, удалил этот плагин)

licensed under cc by-sa 3.0 with attribution.