以另一种方式在 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 <cr> <c-w>w
,因为我从不在正常模式下使用返回键。然后可以毫不费力地循环拆分。
@PrinceGoulash - 除非你有 4 次分裂,否则你必须击中 3 次,依此类推......但还好
这有点老了,但对于任何最终来到这里的人来说,值得一试minibufexpl.vim。在“标签”中轻松编辑多个文件【参考方案2】:
您可以使用<number><c-w>w
切换到特定窗口。
所以1<c-w>w
进入第一个窗口(左上角)
11<c-w>w
移动到最后一个窗口(这里我假设您的拆分少于 11 个)。
我还发现以下映射很方便,并将它们放在我的 .vimrc 中
nnoremap <tab> <c-w>
nnoremap <tab><tab> <c-w><c-w>
我用于窗口拼接 (由于某种原因,如果我没有定义第二个映射 如果我两次点击标签,我会收到一条消息“光标下没有标识符)
阅读 CTRL-W 的帮助页面,还有比这更方便的方法
1<c-w>w
和 11<c-w>w
转到第一个和最后一个窗口:
<c-w>t
转到顶部窗口,<c-w>b
转到底部窗口。
【讨论】:
【参考方案3】:您可以在 vimrc 中使用 nnoremap
命令来使用自定义键绑定。
nnoremap
的语法是这样的:
nnoremap new_keybinding keystrokes
nnoremap 命令分配一个新的键绑定,当您在正常模式下按下它时,分配给该命令的击键序列将回显到 Vim。
编辑:还有nmap
命令。 两者的区别在于
它们之间的区别在this answer 中进行了解释。nmap
允许覆盖你当前的键绑定,而nnoremap
不允许。
例如,我将这些行放在我的.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+j、Ctrl+k、Ctrl+h、Ctrl+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
键,就像您在正常模式下使用 <c-w>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')
让我们用<C-hjkl>
移动窗口。
" 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】:您可以通过在另一个方向继续<C-w>
来创建对角线移动。
"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
【讨论】:
以上是关于以另一种方式在 VIM 窗口之间导航的主要内容,如果未能解决你的问题,请参考以下文章