没有Ctrl-W的情况下如何在Vim中使用拆分?


24

我的终端不允许我输入Ctrl+ W,因为这是关闭终端标签的快捷方式。

我喜欢使用拆分,但是如果不使用,我将找不到任何方法C-W。这迫使我使用的标签,因为我可以在它们之间进行切换使用gtgT#gt其中#是一个数字,但我觉得这不是分裂不太方便,我只能看到一个文件的内容在同一时间。

我无法使用mouse=a任何一个,因为我的终端不支持该功能。

在没有Ctrl+ W组合的情况下,如何在Vim中使用拆分?


1
使用映射到wincmd 例如,您可以映射: :nmap wj :wincmd j<cr>它的行为与CTRL-W j(移至下面的窗口)相同。 :help wincmd
Alex Kroll

@AlexKroll为什么不将其发布为答案?:-)
Martin Tournoij 2015年

1
@Carpetsmoker我认为这个问题还不够全面。CTRL-W j我的解决方案不能与计数器一起使用(从当前位置转到下面的第n个窗口)。
Alex Kroll 2015年

2
我通常不喜欢这样的建议,但是我会寻找另一个终端。<C-W>快捷键(不仅在Vim的许多地方,而且在bash中)都非常有用,以致无法使用。我很好奇终端还会使用其他的键绑定<C-T>吗?至少,我会研究这些是否在终端中可配置。
tommcdo

Answers:


23

您可以重新映射<C-w>到另一个组合,例如:

:nnoremap <C-e> <C-w>

现在<C-e>,您可以使用,就像按了一样<C-w>

这将覆盖默认<C-e>映射(向下滚动)。Vim已经使用了键盘上的每个键,防止这种情况的唯一方法是使用引导键,该引导键的作用类似于“前缀”:

:nnoremap <Leader>w <C-w>

除非您已重新映射<Leader>,否则现在可以使用\w(彼此之间)。我实际上更喜欢这种方式,因为我不喜欢CTRL +组合键。

请参阅什么是<Leader>?以及 如何找出<Leader>设置为什么?是否可以重新映射<Leader>?


解决我的问题。将映射添加到我的vimrc,并进行了一些测试,没有任何问题。
Mateon1 2015年

13

实际上,我使用的:wincmd次数比Ctrl+多,W因为我发现键入缩写词更容易:winc

例如,相当于Ctrl+ W L:winc l


7

我在我的体内设置了以下重新映射.vimrc

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

现在,我可以使用Ctrl+h移至左侧窗口,Ctrl+l移至右侧窗口,等等。这似乎在逻辑上与Vim的常规导航相吻合。


4
请注意,在终端中映射Ctrl + h并不总是有效,因为这通常是退格键。看到这个答案这个问题
马丁·图尔诺伊

同样,您可以使用nnoremap <cr> <c-w>w,因为在正常模式下返回键使用很少。这样就可以轻松地循环进行拆分。
希望

5

为了处理拆分,我使用了实际上非常方便的submode-plugin:它允许您创建新的模式(如正常模式,可视模式,插入模式等的“模式”),在其中定义新的键绑定。

这样一来,您就不必再使用Ctrl+w了,因为您处于新模式,所以所有键都可以自由绑定:不再出现诸如“该死,我找不到代表其含义并且尚未映射的键组合之类的问题。 ”

您可以使用任何常规的插件管理器来安装插件,以下是我的一些配置,以给您一些启发:


我创建了一个新的模式,我WindowsMode在该模式下操作拆分:

call submode#enter_with('WindowsMode', 'n', '', '<Leader>k', ':echo "windows mode"<CR>')
call submode#leave_with('WindowsMode', 'n', '', '<Leader>')

这些行表示我使用进入模式,使用Leaderk退出模式Leader:按下Leaderk所有键后,我将执行以下操作:

  • 如果我没有在此模式下为其定义映射,则不执行任何操作
  • 做我决定以这种方式映射它们的操作(请参阅其余答案)
  • 如果我击中,请返回正常模式 Leader

一旦进入WindowsMode这些行,就可以hjkl像这样浏览拆分Ctrl+whjkl

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

我用这些行用/和分割了窗口!

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

q关闭拆分:

call submode#map('WindowsMode', 'n', '', 'q', '<C-w>c')

使用以下方法移动拆分Ctrlhjkl

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

Vim-submode可以做很多强大的事情,有关更多详细信息,请参见文档


编辑此处介绍Window子模式的另一种方法。我认为作者使用的方法更接近于回答这个问题:这里是用来创建新模式的,但是所有<c-w>something映射都可以在子模式下使用相同的键来使用:

" Go through every letter
for key in ['a','b','c','d','e','f','g','h','i','j','k','l','m',
\           'n','o','p','q','r','s','t','u','v','w','x','y','z']
  " maps lowercase, uppercase and <C-key>
  call submode#map('window', 'n', '', key, '<C-w>' . key)
  call submode#map('window', 'n', '', toupper(key), '<C-w>' . toupper(key))
  call submode#map('window', 'n', '', '<C-' . key . '>', '<C-w>' . '<C-'.key . '>')
endfor

" Go through symbols. Sadly, '|', not supported in submode plugin.
for key in ['=','_','+','-','<','>']
  call submode#map('window', 'n', '', key, '<C-w>' . key)
endfor

这样,所有的映射<c-w>lowerCaseKey<c-w>upperCaseKey<c-w><c-Key>和映射<c-w>=_+-<>都在窗口模式下访问,而没有前缀<c-w>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.