假设我有单个Vim选项卡显示9个缓冲区(同样分开,如表3x3)。目前,要从左上角窗口到右下角窗口,我必须按 3 , Ctrl + W , J ,然后 3 , Ctrl + W , L 。这很麻烦,我希望能够按 Ctrl + 9 转到第9个窗口并按 Ctrl + 3 转到第3个窗口,等等。有什么简单的方法可以在Vim中映射这样的东西吗?
答案 0 :(得分:26)
与使用鼠标或硬设置运动映射相比,有一个更简单的解决方案;如果窗口编号与3x3矩阵中的窗口编号不同,或者如果您决定使用少于9个窗口,它们将会中断。方法如下:
在.vimrc
中加入以下内容:
let i = 1
while i <= 9
execute 'nnoremap <Leader>' . i . ' :' . i . 'wincmd w<CR>'
let i = i + 1
endwhile
现在您可以按<Leader><number>
并转到所需的窗口编号。我不建议超越9,因为IMO,具有多个视口的实用程序遵循Rayleigh distribution,并且在一个窗口中有太多视口很快变得无用。
如果您在statusline
中显示了窗口编号,这将有助于您快速确定您所在的窗口以及您要去的窗口。为此,请使用此小功能并在statusline
中相应添加。
function! WindowNumber()
let str=tabpagewinnr(tabpagenr())
return str
endfunction
在statusline
:
set laststatus=2
set statusline=win:%{WindowNumber()}
请注意,上述行将替换您的statusline
。它仅用于说明目的,以显示如何调用该函数。您应该将它放在statusline
中您认为合适的地方。这就是我的样子:
romainl在评论中询问了我的状态行,所以这里是:
"statusline
hi StatusLine term=bold cterm=bold ctermfg=White ctermbg=235
hi StatusHostname term=bold cterm=bold ctermfg=107 ctermbg=235 guifg=#799d6a
hi StatusGitBranch term=bold cterm=bold ctermfg=215 ctermbg=235 guifg=#ffb964
function! MyGitBranchStyle()
let branch = GitBranch()
if branch == ''
let branchStyle = ''
else
let branchStyle = 'git:' . branch
end
return branchStyle
endfunction
function! WindowNumber()
let str=tabpagewinnr(tabpagenr())
return str
endfunction
set laststatus=2
set statusline=%#StatusLine#%F%h%m%r\ %h%w%y\ col:%c\ lin:%l\,%L\ buf:%n\ win:%{WindowNumber()}\ reg:%{v:register}\ %#StatusGitBranch#%{MyGitBranchStyle()}\ \%=%#StatusLine#%{strftime(\"%d/%m/%Y-%H:%M\")}\ %#StatusHostname#%{hostname()}
最后一行应该是一行(如果您的设置自动将其分成多行,请小心)。我知道有很多方法可以在每个步骤中使用增量字符串连接来组织它,但是我懒得改变它。 :) GitBranch()
功能(包含其他git功能)由git.vim plugin提供。如上所述here中有一个错误,我使用了fork with the bug fix。但是,我将这两个链接和博客留在这里,以表彰所有人。
另外,请注意我使用的是深色背景,因此如果您使用的是浅色方案(并且也符合您的喜好),您可能需要更改颜色。
答案 1 :(得分:8)
更好,更一般的回答:
使用计数 Ctrl + w Ctrl + w 跳转到 count 窗口下方/右侧目前的一个。
例如,如果您位于3x3网格的左上角并且想要跳到左下角,则使用7 Ctrl + w Ctrl + w
特定的3x3网格回答:
如果你总是使用3x3布局,你可以尝试这些映射到小键盘,它总是跳到左上角,然后从那里移动适当的数量,键盘上的键位置跳到窗口'相当于屏幕上的位置:
noremap <k7> 1<c-w><c-w>
noremap <k8> 2<c-w><c-w>
noremap <k9> 3<c-w><c-w>
noremap <k4> 4<c-w><c-w>
noremap <k5> 5<c-w><c-w>
noremap <k6> 6<c-w><c-w>
noremap <k1> 7<c-w><c-w>
noremap <k2> 8<c-w><c-w>
noremap <k3> <c-w>b
编辑:结果c-w c-w自动开始在左上角。在第一个映射中需要显式1,因为没有计数的c-w c-w在当前和先前选择的窗口之间切换。
( Ctrl-W t 映射始终转到最左上角的窗口, Ctrl-W b < / kbd>映射总是在最右下方。)
或者你可以映射每个数字以跳转到第N个窗口,所以k6将是6 c-w c-w,而不是试图在屏幕上布置键。
答案 2 :(得分:5)
我更喜欢使用标准的vim键(jkhl)。
noremap <C-J> <C-W>w
noremap <C-K> <C-W>W
noremap <C-L> <C-W>l
noremap <C-H> <C-W>h
如果您注意到前两个地图可以顺时针或反向跳跃,而不是仅仅向上或向下跳跃,那么就有一个技巧。
您还可以使用<Number><C-J>
直接切换到任意窗口,例如,2<C-J>
将转到第二个窗口。
答案 3 :(得分:3)
不完全符合您的要求,但如果您使用的是支持它的终端,则可以设置以下选项:
:set mouse+=a
:set ttymouse=xterm2
和在缓冲区上单击以切换到它。是的,用鼠标。
许多其他鼠标行为也有效 - 您可以单击以移动插入点,拖动以选择文本或调整分割大小,并使用滚轮。
答案 4 :(得分:1)
嗯......我很确定这不会保持窗口布局,但我使用
:buf sys
转到system.h,
:buf Sing
转到MyLargeNamedClassSingleton.cpp
buf
将执行自动填充功能(如果已配置,可能会执行menucompletion),以便您可以执行此操作
:buf part<Tab>
列出哪些文件可与您键入的part
匹配。从周围的导航缓冲区中击败垃圾。
但我明白,这当然不能回答你的具体问题:)
答案 5 :(得分:1)
我喜欢用箭头键移动。
我映射ctr +方向以移动到该方向的下一个窗口分区。
map <C-UP> <C-W><C-UP>
map <C-DOWN> <C-W><C-DOWN>
map <C-LEFT> <C-W><C-LEFT>
map <C-RIGHT> <C-W><C-RIGHT>
你不能直接从一个窗口跳到另一个窗口,但我发现它可以很容易地在窗口之间移动