2012-01-28 34 views
27

我正在使用CtrlW在VIM拆分窗口之间导航。是否有任何不同的方式来做到这一点?因为它需要很多的按键以另一种方式在VIM窗口之间导航

举例来说,如果我有,比如说,5个分割窗口打开,想要导航到左上角窗口,按Ctrl W¯¯是非常不舒服。

回答

38

为什么不设置这样的东西?

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

更快...

+1

感谢。我意识到这个解决方案,但我正在寻找可以导航到特定窗口的东西。无论如何,如果没有替代方案,这应该是一个可以满足的解决方案。 – Adas 2012-01-28 18:08:16

+0

@Adas - 没有更好的办法,不是我所知道的。事情是,你不通过窗口导航(他们只是...观点)。你浏览缓冲区。所以,如果你有一个2x2的窗口配置,左上方的不一定是1,右上第二等等...... – Rook 2012-01-28 19:59:31

+2

我'nnoremap w',因为我从来没有使用在正常模式下回车键。然后在分裂中循环是毫不费力的。 – 2012-01-30 08:55:25

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 + K按Ctrl + HCtrl + L键代替Ctrl + W键ĴCtrl + W键ķCtrl + W键ħCtrl + W键升为窗口导航,同时保留老的键绑定。

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

+1

关于nmap/nnoremap - 不,这不是差异。您可以像覆盖其他任何地方一样覆盖nnoremap映射,区别在于nnoremap不是递归的。 – Rook 2012-01-28 17:47:56

18

您可以使用<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>w11<c-w>w更方便的方法去第一和最后一个窗口: <c-w>t去上面的窗口和<c-w>b去窗口底部

0

您可以通过在另一个方向上第二次继续<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 
+0

(^ M)具有特殊含义,并且在某些情况下可能会中断 – 2016-07-10 09:07:37

1

由于this answer在专用Vim的SE的现场,我想出了一种使用插件来创建一个专门的窗口管理子模式另一种选择。这意味着,通过组合键,我进入了一种新模式,其中一些键可以让我在窗口上执行不同的操作。

安装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>') 

现在,你只需要按下领袖 + ķ进入新的模式(你可以改变这与行submode#enter_with并按领导退出它。

" 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') 

有了这些行,您输入的新模式后(与领袖 + ķ你就可以用钥匙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之间的导航窗口。我认为创建一个子模式非常方便,但只有当子模式允许做更多的动作时才有意义。

相关问题