2011-03-14 60 views
3

有一些优秀的Vim插件用于通过键入部分名称来切换到特定的filebuffer。有谁知道这样的插件可以在打开的窗口之间快速切换吗?按名称切换到VIM窗口

例如,如果我有一个名为'a.txt'的文件在另一边,'b.txt'在另一个文件夹中,我想通过输入文件名来切换它们(或者只是'a'或'b'增量搜索)。这对于两个窗口来说可能不是很有用,但我通常最多打开5个窗口,所以使用正常的导航按钮在它们之间切换可能会很痛苦。

WinWalker似乎支持这种类型的功能,但包装在一个更大的窗口导航框架内。

+1

你真的看所有的窗口在同一时间?使用内置的':b部分文件名'可以让你远离,我更喜欢使用那个(实际上我使用标签大多),而不是有太多的窗口。有时它是应该适应我们的程序,有时它是我们对他们:) – 2011-03-14 22:11:29

+0

(不,我不知道你的问题的答案,只是想缩小一点) – 2011-03-14 22:11:47

+0

好吧,我经常打开两个文件同时,这些通常会分成两部分,这样我可以在处理另一部分时参考文件的某些部分。然后我有另一个窗口显示我的标签,然后是一个文件树。 – 2011-03-14 22:47:34

回答

1

我不知道如何切换到基于文件名的窗口,但我使用以下快捷方式在我的.vimrc中在窗口之间移动。

noremap <S-W> <C-w><Up> 
noremap <S-S> <C-w><Down> 
noremap <S-A> <C-w><Left> 
noremap <S-D> <C-w><Right> 

这些都很简单,我没有超过4个窗口打开,所以我从来没有超过2个窗口从任何窗口移动。另外,你不要必须键入文件名。

我使用标准的FPS移动键wasd在窗口间移动,因为它对我来说很直观,我不必将手指移动到方向键上 - 小指在班次上,其他三种在字母上。你可以改变他们,无论你是舒服(hjkl将是一个不错的替代)

我更喜欢使用Shift而不是Ctrl/Alt/Option/Cmd因为位置和大小的键盘之间的变化(例如,Fn是在MacBook Pro上的最左边,而Ctrl是完整的Mac键盘上最左边的),而且我在Linux上遇到了vim问题,但没有识别出Cmd密钥。

+4

因为'W','S','A不需要使用' ','D'应该可以正常工作。并且使用'nnoremap':1)在操作员挂起模式下你不需要这种行为,并且在视觉和选择模式下可能也不需要它; 2)你不知道op没有将''重新映射到窗口处理以外的东西。 – ZyX 2011-03-15 05:01:32

+0

没错。现在它的方式,你不需要''是窗口移动的默认值。如果OP重新映射了它,那么他/她应该相应地进行调整。 – abcd 2011-03-15 05:56:28

+0

M.但是如果你在'map'之前加上'nore',那么无论OP是否已经重映射,你都可以使用你的解决方案。而且建议调整是不好的:用这种方法你可能会得到相互依赖的地图,因此删除或更改其中一个地图会导致调试失败。 – ZyX 2011-03-15 16:47:28

0

我建议使用Command-T插件。它为当前文件夹(及其子文件夹)中的文件编制索引,并允许您键入文件名的一部分以将其打开。在我的.vimrc中,我还添加了这个链接:

nnoremap <S-F12> :CommandT<CR> 

这样我按下Shift-F12并输入文件名将其打开。

希望有所帮助。

+0

我链接到原始帖子中的CommandT。这绝对是非常有帮助的(也是使我想要这个功能的一部分),但是这是为了将文件加载到特定的缓冲区中,而不是改变到另一个现有的窗口。 – 2011-03-15 17:46:55

+0

是的,对,但与你有什么不同?我曾经在开始时就这么想,但是当我问自己时,通过缓冲区列表打开缓冲区和通过文件列表打开缓冲区有什么区别,它将打开缓冲区,因为缓冲区已打开?不要完美主义者:-) – Rafid 2011-03-17 05:06:09

0

这使用python api,所以你只能在vim中使用它,但我确定有人喜欢vim脚本可以很容易地转换它。

使用方法如下:

:WSeek win 
:WSeek READ 
:WSeek README 
:WSeek a. 
etc. 

没有自动完成我害怕。对不起〜

" Call using: 
" :source window-swap.vim or put in plugins dir 

function! WSeek(target) 
    if !has('python') 
    echo "Error: this plugin requires vim with +python" 
    finish 
    else 
python << EOF 

import vim 

target = vim.eval("a:target") 
found = False 
for i in range(0, len(vim.windows)): 
    vim.command(str(i+1) + "wincmd w") 
    bits = vim.current.buffer.name.split("/") 
    bits = bits[-1] 
    if (bits.startswith(target)): 
    found = True 
    break 

# Go back to the start on no match 
if not found: 
    vim.command("1wincmd w") 

EOF 
    endif 
endfunction 

command! -nargs=1 WSeek :call WSeek(<q-args>) 
+1

奇怪的命令:'vim.command(“exe 1。\”wincmd w \“”)''。在这里不需要做eval:'vim.command(“1wincmd w”)''。 – ZyX 2011-11-30 21:05:13

+0

同上:'vim.command(str(i + 1)。“wincmd w”)'。你实际上做了什么等于'执行“执行”。(i + 1)。“。\”wincmd w \“”'。看起来很奇怪,不是吗? – ZyX 2011-11-30 21:07:13

+0

^_ ^!哦,是的,好点。解决方案编辑,以反映@ZyX的迷人。 :) – Doug 2011-12-01 03:47:33

3

:b这是否愉快,如果你有:setswitchbuf+=useopen (在vimrc)。它支持文件名称completion,例如与Ctrl - D

通过MarcWeber等人从#vim

0

@Aaron托马的回答与switchbuf+=useopen我没有工作。实际上文档没有提及该设置是由:b命令支持的。

我用下面的代码片段:

let windowNr = bufwinnr(pattern) 
if windowNr > 0 
    execute windowNr 'wincmd w' 
endif 

See bufwinnr()