【问题标题】:Navigating between VIM windows in an alternative way以另一种方式在 VIM 窗口之间导航
【发布时间】:2012-02-21 06:10:54
【问题描述】:

我正在使用 CtrlW 在 VIM 拆分窗口之间导航。是否有任何不同的方法可以做到这一点?

例如,如果我打开了 5 个拆分窗口并想要导航到左上角窗口,CtrlW 非常不舒服,因为它需要很多击键。

【问题讨论】:

    标签: vim keyboard-shortcuts


    【解决方案1】:

    为什么不设置类似的东西?

    nnoremap <C-h> <C-w>h
    nnoremap <C-j> <C-w>j
    nnoremap <C-k> <C-w>k
    nnoremap <C-l> <C-w>l
    

    更快...

    【讨论】:

    • 谢谢。我知道这个解决方案,但我正在寻找可以导航到特定窗口的东西。无论如何,如果没有替代方案存在,这应该是一个令人满意的解决方案。
    • @Adas - 没有更好的方法,我不知道。问题是,您不会通过窗口导航(它们只是......视点)。您在缓冲区中导航。所以如果你有一个 2x2 的窗口配置,左上角不一定是第一个,右上角是第二个等等......
    • 我有nnoremap &lt;cr&gt; &lt;c-w&gt;w,因为我从不在正常模式下使用返回键。然后可以毫不费力地循环拆分。
    • @PrinceGoulash - 除非你有 4 次分裂,否则你必须击中 3 次,依此类推......但还好
    • 这有点老了,但对于任何最终来到这里的人来说,值得一试minibufexpl.vim。在“标签”中轻松编辑多个文件
    【解决方案2】:

    您可以使用&lt;number&gt;&lt;c-w&gt;w 切换到特定窗口。 所以1&lt;c-w&gt;w 进入第一个窗口(左上角) 11&lt;c-w&gt;w 移动到最后一个窗口(这里我假设您的拆分少于 11 个)。

    我还发现以下映射很方便,并将它们放在我的 .vimrc 中

    nnoremap <tab> <c-w>
    nnoremap <tab><tab> <c-w><c-w>
    

    我用于窗口拼接 (由于某种原因,如果我没有定义第二个映射 如果我两次点击标签,我会收到一条消息“光标下没有标识符)

    阅读 CTRL-W 的帮助页面,还有比这更方便的方法 1&lt;c-w&gt;w11&lt;c-w&gt;w 转到第一个和最后一个窗口: &lt;c-w&gt;t 转到顶部窗口,&lt;c-w&gt;b 转到底部窗口。

    【讨论】:

      【解决方案3】:

      您可以在 vimrc 中使用 nnoremap 命令来使用自定义键绑定。

      nnoremap 的语法是这样的:

      nnoremap new_keybinding keystrokes
      

      nnoremap 命令分配一个新的键绑定,当您在正常模式下按下它时,分配给该命令的击键序列将回显到 Vim。

      编辑:还有nmap 命令。 两者的区别在于nmap 允许覆盖你当前的键绑定,而nnoremap 不允许。 它们之间的区别在this answer 中进行了解释。

      例如,我将这些行放在我的.vimrc

      "Better window navigation
      nnoremap <C-j> <C-w>j
      nnoremap <C-k> <C-w>k
      nnoremap <C-h> <C-w>h
      nnoremap <C-l> <C-w>l
      

      这允许我使用 Ctrl+jCtrl+kCtrl+hCtrl+l 代替 Ctrl+W j, Ctrl+W k, Ctrl+W h, Ctrl+W l 用于窗口导航,同时保留旧的键绑定。

      您也可以查找:help key-mappings 了解更多信息。

      【讨论】:

      • 关于 nmap/nnoremap - 不,这不是区别。您可以像其他任何映射一样覆盖您的 nnoremap 映射,不同之处在于 nnoremap 不是递归的。
      【解决方案4】:

      感谢 SE 网站上专门用于 Vim 的 this answer,我想出了另一个替代方案,它使用插件创建专用于 Windows 管理的子模式。这意味着通过组合键,我进入了一种新模式,其中一些键允许我在窗口上执行不同的操作。

      安装vim-submode 后,让我们在vimrc 中添加一些行来配置新模式:

      " Create a submode to handle windows
      " The submode is entered whith <Leader>k and exited with <Leader>
      call submode#enter_with('WindowsMode', 'n', '', '<Leader>k', ':echo "windows mode"<CR>')
      call submode#leave_with('WindowsMode', 'n', '', '<Leader>')
      

      现在你只需要按Leader+k进入新模式(你可以用submode#enter_with行改变这个)并按Leader退出。

      " Change of windows with hjkl
      call submode#map('WindowsMode', 'n', '', 'j', '<C-w>j')
      call submode#map('WindowsMode', 'n', '', 'k', '<C-w>k')
      call submode#map('WindowsMode', 'n', '', 'h', '<C-w>h')
      call submode#map('WindowsMode', 'n', '', 'l', '<C-w>l')
      

      通过这些行,在您进入新模式后(使用 Leader+k 您将能够在窗口之间移动使用 hjkl 键,就像您在正常模式下使用 &lt;c-w&gt;hjlk 一样。

      " Resize windows with <C-yuio> (interesting on azerty keyboards)
      call submode#map('WindowsMode', 'n', '', 'u', '<C-w>-')
      call submode#map('WindowsMode', 'n', '', 'i', '<C-w>+')
      call submode#map('WindowsMode', 'n', '', 'y', '<C-w><')
      call submode#map('WindowsMode', 'n', '', 'o', '<C-w>>')
      

      多几行允许使用yuio 调整窗口大小 (我选择这些键是因为在 azerty 键盘上它们就在hjkl 的行上并且使用起来非常方便,也许它在 qwerty 键盘上更改它会更有用,我不确定)

      " Move windows with <C-hjkl>
      call submode#map('WindowsMode', 'n', '', '<C-j>', '<C-w>J')
      call submode#map('WindowsMode', 'n', '', '<C-k>', '<C-w>K')
      call submode#map('WindowsMode', 'n', '', '<C-h>', '<C-w>H')
      call submode#map('WindowsMode', 'n', '', '<C-l>', '<C-w>L')
      

      让我们用&lt;C-hjkl&gt;移动窗口。

      " close a window with q
      call submode#map('WindowsMode', 'n', '', 'q', '<C-w>c')
      
      " split windows with / and !
      call submode#map('WindowsMode', 'n', '', '/', '<C-w>s')
      call submode#map('WindowsMode', 'n', '', '!', '<C-w>v')
      

      还有一些用于关闭窗口并创建新拆分的映射。

      let g:submode_keep_leaving_key = 1
      let g:submode_timeout = 0
      

      最后,这些选项允许按住一个键,它会重复它的动作。

      注意我知道这个答案描述的不仅仅是 OP 要求的在窗口之间导航。我认为创建子模式非常方便,但只有当子模式允许执行多个操作时才会感兴趣。

      【讨论】:

        【解决方案5】:

        您可以通过在另一个方向继续&lt;C-w&gt; 来创建对角线移动。

          "move from bottom left to top right diagonally
          "Mnemonic: keyboard finger movement from j to i
          nnoremap <C-i> <C-w>l<C-w>k 
        
          "move from top right to bottom left diagonally
          "Mnemonic: keyboard finger movement from j to n
          nnoremap <C-n> <C-w>h<C-w>j 
        
          "move from  top left to bottom right diagonally
          "Mnemonic: keyboard finger movement from j to m
          nnoremap <C-m> <C-w>l<C-w>j
        
          "move from bottom right to top left diagonally
          "Mnemonic: keyboard finger movement from j to y
          nnoremap <C-y> <C-w>h<C-w>k 
        

        【讨论】:

        • (^M) 有特殊含义,在某些情况下可能会中断
        猜你喜欢
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-18
        • 2011-03-09
        相关资源
        最近更新 更多