Vim窗口重复调整大小

时间:2014-12-03 06:58:03

标签: vim split resize pane

我在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配置,以便有人可以使用它来查看我的意思。

2 个答案:

答案 0 :(得分:4)

我已经使自己成为一个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'),第二个参数是拆分边框应移动多少。

答案 1 :(得分:0)

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

至少对于曾经是默认行为的tinykeymap,当按 Ctrl + + 时它会切换到tmux行为(这就是我的原因,我最后卸载了那个插件)