【发布时间】:2012-02-21 06:10:54
【问题描述】:
我正在使用 CtrlW 在 VIM 拆分窗口之间导航。是否有任何不同的方法可以做到这一点?
例如,如果我打开了 5 个拆分窗口并想要导航到左上角窗口,CtrlW 非常不舒服,因为它需要很多击键。
【问题讨论】:
我正在使用 CtrlW 在 VIM 拆分窗口之间导航。是否有任何不同的方法可以做到这一点?
例如,如果我打开了 5 个拆分窗口并想要导航到左上角窗口,CtrlW 非常不舒服,因为它需要很多击键。
【问题讨论】:
为什么不设置类似的东西?
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
更快...
【讨论】:
nnoremap <cr> <c-w>w,因为我从不在正常模式下使用返回键。然后可以毫不费力地循环拆分。
您可以使用<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 转到底部窗口。
【讨论】:
您可以在 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 了解更多信息。
【讨论】:
感谢 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 要求的在窗口之间导航。我认为创建子模式非常方便,但只有当子模式允许执行多个操作时才会感兴趣。
【讨论】:
您可以通过在另一个方向继续<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
【讨论】: