以另一种方式在 VIM 窗口之间导航

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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) 有特殊含义,在某些情况下可能会中断

以上是关于以另一种方式在 VIM 窗口之间导航的主要内容,如果未能解决你的问题,请参考以下文章

在数组中的一个值之后,以另一种方式开始计算

以另一种方式提高动态 SQL 查询性能或过滤记录

NLP悦读 | 所有的失去,都会以另一种方式归来

华为颇无奈,三星依靠技术领先优势以另一种方式实现王者归来

以另一种形式将文本发送到文本框而不创建新窗口

iOS 嵌套UIScrollview的滑动冲突另一种解决方案