Vim窗口重复调整大小

5

我在 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 键。它还允许我指定要增加的边框(左、右等)。

然而,我希望在 vim 中也能实现相同的功能,但是 vim 似乎没有边框的上下文:

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

然而,这只适用于左侧窗格,因为在右侧窗格上,我希望它的大小减小5。此外,这不允许我重复执行它。(我希望按一次键,然后每次需要“L”时都可以使用它。)
我想知道是否有人找到了解决方法。
注意:我放置了tmux配置文件,以便有人可以尝试并理解我的意思。

1
submode插件也许可以满足您的“重复键”需求(免责声明:我不使用此插件,也不担保其稳定性)。由于我不了解您所说的“边界上下文”问题,因此在此不做评论。 - Amadan
请注意,这里有一个vi.stackexchange.com - martijnn2008
2个回答

5
我已经制作了一个 Vim 脚本,使其缩放行为类似于 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)<CR>

您可以使用 TmuxResize 函数将其他键映射到它上面。 第一个参数是方向('h''j''k''l'),第二个参数是拆分边框应该移动多少。

这个问题为什么没有更多的赞?谢谢你,伙计...你帮了我很多。 - smohamed
这太棒了!你考虑过将它转化为一个正式的插件吗? - jqno
1
不,但我认为那是个好主意。我会尽力而为! - Limeth

0

有一些插件可以做到这一点。例如tinymodesubmodetinykeymap

至少对于tinykeymap来说,它曾经是默认行为,当按下Ctrl++时,它会切换到tmux的行为(这也是我最终卸载该插件的原因)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接