【问题标题】:How to make a shortcut for moving between Vim windows?如何制作在 Vim 窗口之间移动的快捷方式?
【发布时间】:2011-09-18 05:22:39
【问题描述】:

假设我有一个 Vim 选项卡,显示 9 个缓冲区(等距分隔,如 3×3 表)。

目前,要从左上角窗口到右下角窗口,我必须按 3, Ctrl+W, J,然后是 3Ctrl+WL。这很麻烦,我希望能够按 Ctrl+9 转到第 9 个窗口,然后按 Ctrl+3 转到第三个窗口等。

有什么简单的方法可以在 Vim 中映射这样的东西吗?

【问题讨论】:

    标签: vim window buffer


    【解决方案1】:

    有一个比使用鼠标或硬设置移动映射更简单的解决方案;如果窗口编号与您对 3x3 矩阵的想法不同,或者您决定使用少于 9 个窗口,它们将中断。方法如下:

    在您的.vimrc 中包含以下内容:

    let i = 1
    while i <= 9
        execute 'nnoremap <Leader>' . i . ' :' . i . 'wincmd w<CR>'
        let i = i + 1
    endwhile
    

    现在您只需按&lt;Leader&gt;&lt;number&gt; 即可转到您想要的窗口号。我不建议超过 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。这是我的样子:


    更新

    romainl 在 cmets 中询问我的状态栏,所以这里是:

    "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。但是,我将在此处留下链接和博客以表扬所有人。

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

    【讨论】:

    • @yoda,我知道我们不在 Arch 论坛的每月截图线程中,但是……您介意分享您的状态栏吗?
    • @yoda,以下进入第三屏nnoremap &lt;c-a&gt; :3wincmd w&lt;CR&gt; 但是, 不起作用nnoremap &lt;c-3&gt; :3wincmd w&lt;CR&gt; 所以由于某种原因,这些数字不起作用,任何线索如何解决这个问题?
    • @Kamilski81:我昨天确实使用了ctrl,但我也无法让它工作,这就是我使用&lt;Leader&gt; 提供解决方案的原因。我以为我在尝试使用ctrl 时犯了一些愚蠢的错误,但是由于您也遇到了错误,也许我会在空闲时间看看它。顺便说一句,我将我的&lt;Leader&gt; 设置为" "(或空格键),所以实际上点击空格和数字比 ctrl+number 更容易......
    【解决方案2】:

    更好、更一般的答案:

    使用countCtrl+wCtrl+w跳转到count窗口下方/右侧当前一个。

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

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

    (Ctrl-W t 映射总是转到最左上角的窗口,Ctrl-W b 映射总是在右下角)。

    或者,您可以映射每个数字以跳转到第 N 个窗口,因此 k6 将是 6 c-w c-w,而不是尝试像在屏幕上那样布置键。

    【讨论】:

      【解决方案3】:

      我更喜欢使用标准的 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
      

      如果您注意到前两张地图可以顺时针或逆时针跳跃,而不仅仅是向上或向下跳跃,这是一个技巧。

      你也可以直接用&lt;Number&gt;&lt;C-J&gt;切换到任意窗口,例如2&lt;C-J&gt;会转到第二个窗口。

      【讨论】:

        【解决方案4】:

        不完全是您要查找的内容,但如果您使用的是支持它的终端,则可以设置以下选项:

        :set mouse+=a
        :set ttymouse=xterm2
        

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

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

        【讨论】:

        • 我知道这对 Vim 文化来说是异端,但这确实是最好的方法。
        【解决方案5】:

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

        :buf sys
        

        去system.h,

        :buf Sing
        

        MyLargeNamedClassSingleton.cpp

        buf 会自动完成(如果配置了,可能是 menucompletion)所以你可以这样做

        :buf part<Tab>
        

        列出哪些文件可以匹配您键入的part。摆脱了到处导航缓冲区的麻烦。

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

        【讨论】:

          【解决方案6】:

          我喜欢用箭头键移动。
          我映射 ctr+direction 以移动到该方向的下一个窗口分区。

          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>
          

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

          【讨论】:

            猜你喜欢
            • 2015-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-24
            • 2014-05-06
            • 1970-01-01
            • 1970-01-01
            • 2016-04-16
            相关资源
            最近更新 更多