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

时间:2011-06-19 16:45:36

标签: vim window buffer

假设我有单个Vim选项卡显示9个缓冲区(同样分开,如表3x3)。目前,要从左上角窗口到右下角窗口,我必须按 3 Ctrl + W J ,然后 3 Ctrl + W L 。这很麻烦,我希望能够按 Ctrl + 9 转到第9个窗口并按 Ctrl + 3 转到第3个窗口,等等。有什么简单的方法可以在Vim中映射这样的东西吗?

6 个答案:

答案 0 :(得分:26)

与使用鼠标或硬设置运动映射相比,有一个更简单的解决方案;如果窗口编号与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,具有多个视口的实用程序遵循Rayleigh distribution,并且在一个窗口中有太多视口很快变得无用。

如果您在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


编辑:

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提供。如上所述here中有一个错误,我使用了fork with the bug fix。但是,我将这两个链接和博客留在这里,以表彰所有人。

另外,请注意我使用的是深色背景,因此如果您使用的是浅色方案(并且也符合您的喜好),您可能需要更改颜色。

答案 1 :(得分:8)

更好,更一般的回答:

使用计数 Ctrl + w Ctrl + w 跳转到 count 窗口下方/右侧目前的一个。

例如,如果您位于3x3网格的左上角并且想要跳到左下角,则使用7 Ctrl + w Ctrl + 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

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

Ctrl-W t 映射始终转到最左上角的窗口, Ctrl-W b < / kbd>映射总是在最右下方。)

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

答案 2 :(得分: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

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

您还可以使用<Number><C-J>直接切换到任意窗口,例如,2<C-J>将转到第二个窗口。

答案 3 :(得分:3)

不完全符合您的要求,但如果您使用的是支持它的终端,则可以设置以下选项:

:set mouse+=a
:set ttymouse=xterm2

在缓冲区上单击以切换到它。是的,用鼠标。

许多其他鼠标行为也有效 - 您可以单击以移动插入点,拖动以选择文本或调整分割大小,并使用滚轮。

答案 4 :(得分:1)

嗯......我很确定这不会保持窗口布局,但我使用

:buf sys

转到system.h,

:buf Sing

转到MyLargeNamedClassSingleton.cpp

buf将执行自动填充功能(如果已配置,可能会执行menucompletion),以便您可以执行此操作

:buf part<Tab>

列出哪些文件可与您键入的part匹配。从周围的导航缓冲区中击败垃圾。

但我明白,这当然不能回答你的具体问题:)

答案 5 :(得分:1)

我喜欢用箭头键移动。
我映射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>

你不能直接从一个窗口跳到另一个窗口,但我发现它可以很容易地在窗口之间移动