在Vim窗口之间移动的快捷方式

Kam*_*i81 16 vim buffer window

假设我有单个Vim选项卡显示9个缓冲区(同样分开,如表3x3).目前,从左上方窗口右下角一送,我必须按3,Ctrl+ W,J,然后3,Ctrl+ W,L.这是麻烦的,我想只能够按Ctrl+ 9转到第九窗口和Ctrl+ 3去第三窗口,等有没有简单的方法可以让我在地图Vim的这样呢?

abc*_*bcd 28

有一个比使用鼠标或硬盘运动映射更简单的解决方案; 如果窗口编号与3x3矩阵中的窗口编号不同,或者如果您决定使用少于9个窗口,它们将会中断.这是如何做:

包括以下内容.vimrc:

let i = 1
while i <= 9
    execute 'nnoremap <Leader>' . i . ' :' . i . 'wincmd w<CR>'
    let i = i + 1
endwhile
Run Code Online (Sandbox Code Playgroud)

现在,您只需按下<Leader><number>并转到所需的窗口编号即可.我不建议超越9,因为IMO,具有多个视口的实用程序遵循瑞利分布,并且在一个窗口中有太多视口很快变得无用.

如果您在窗口中显示了窗口编号,statusline将有助于您快速确定您所在的窗口以及要访问的窗口.要做到这一点,使用这个小功能,并相应地添加它statusline.

function! WindowNumber()
    let str=tabpagewinnr(tabpagenr())
    return str
endfunction
Run Code Online (Sandbox Code Playgroud)

在您的行动中看到它statusline:

set laststatus=2
set statusline=win:%{WindowNumber()}
Run Code Online (Sandbox Code Playgroud)

请注意,以上行将取代您的statusline.它仅用于说明目的,以显示如何调用该函数.你应该把它放在你认为合适的地方statusline.这是我的样子:

在此输入图像描述


编辑:

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()}
Run Code Online (Sandbox Code Playgroud)

最后一行应该是一行(如果您的设置自动将其分成多行,请小心).我知道有很多方法可以在每个步骤中使用增量字符串连接来组织它,但是我懒得改变它.:)该GitBranch()函数(具有其他git功能)由git.vim插件提供.还有如指出其中存在一个bug 在这里我用的是叉的bug修复.但是,我将这两个链接和博客留在这里,以表彰所有人.

此外,请注意我使用深色背景,因此如果您使用灯光方案(也适合您的口味),您可能需要改变一点颜色.


act*_*imp 8

更好,更一般的答案:

使用countCtrl+wCtrl+w跳转到当前计数窗口下方/右侧的计数窗口.

例如,如果您位于3x3网格的左上角并想要跳到左下角,则使用7 Ctrl+wCtrl+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
Run Code Online (Sandbox Code Playgroud)

编辑:结果cw cw自动开始在左上角.在第一个映射中需要显式1,因为cw cw没有计数在当前和先前选择的窗口之间切换.

(Ctrl-W t映射始终位于左上角的窗口,Ctrl-W b映射始终位于最右下方).

或者你可以映射每个数字以跳转到第N个窗口,所以k6将是6 cw cw,而不是试图在屏幕上布置键.


Boh*_*ohr 5

我更喜欢使用标准的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
Run Code Online (Sandbox Code Playgroud)

如果您注意到前两个地图可以顺时针或反向跳转,而不是仅仅向上或向下跳跃,那么就有一个技巧.

您也可以直接切换到任何窗口<Number><C-J>,例如,2<C-J>将转到第二个窗口.