对于我来说,@Aaron Thoma的switchbuf+=useopen
设置无效。实际上,文档中没有提到该设置被:b
命令支持。
我使用了以下代码片段:
let windowNr = bufwinnr(pattern)
if windowNr > 0
execute windowNr 'wincmd w'
endif
在尝试实现同样的功能后,我想出了这个小函数。
function! ActivateWindowByName(name)
let l:bufid = bufnr(a:name)
let l:winids = win_findbuf(l:bufid)
call win_gotoid(l:winids[0])
endfunction
解释:
bufnr('substring-of-buffer-name')
返回缓冲区编号win_findbuf(buffer_number)
返回使用与buffer_number
标识的缓冲区的窗口ID列表(不同于缓冲区编号)win_gotoid(window_ID)
转到使用window_ID
标识的窗口,该窗口可以位于当前选项卡页之外bufnr
不能保证找到缓冲区,因此可能会返回-1
。 在这种情况下,win_findbuf
将找到一个空列表,并且[0]
将超出范围。
我不知道如何根据文件名切换到一个窗口,但我在我的.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
在窗口之间移动,因为它对我来说非常直观,我不必转换到箭头键 -- 小拇指在Shift键上,其他三个手指放在字母上。您可以根据自己的喜好更改它们(hjkl
是一个不错的选择)。
我更喜欢使用Shift
代替Ctrl/Alt/Option/Cmd
,因为键盘之间的位置和大小不同(例如,在Macbook Pro上,Fn
是最左边的键,而在全尺寸的Mac键盘上,Ctrl
是最左边的键),我在Linux上遇到了vim无法识别Cmd
键的问题。
<S-
,因为 W
、 S
、 A
、 D
应该完全可以胜任。并且请使用 nnoremap
:1) 你不需要在操作符待定模式下执行此行为,也可能不需要在可视和选择模式下执行;2) 你不知道操作员是否已经重新映射了 <C-w>
到其他窗口处理操作。 - ZyX<S-
。这只是我.vimrc
进化过程中的奇怪方式。我甚至不记得它们何时变成了大写字母。至于第二点,<C-w>
是窗口移动的默认方式。如果OP已经重新映射了它,那么他/她应该相应地进行调整。 - user616736map
之前添加nore
,那么您将使解决方案能够正常工作,无论OP是否重新映射它。建议调整是不好的:采用这种方法可能会导致相互依赖的映射,因此删除或更改其中一个映射将导致调试困难。 - ZyX这个使用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>)
vim.command("exe 1 . \"wincmd w\"")
。这里不需要在 eval 内部执行 eval,只需使用 vim.command("1wincmd w")
。 - ZyXvim.command(str(i+1)."wincmd w")
。你实际上做的与 execute "execute ".(i+1).".\"wincmd w\""
等效。看起来很奇怪,不是吗? - ZyX我建议使用Command-T插件。它可以索引当前文件夹(及其子文件夹)中的文件,并允许您键入文件名的一部分来打开它。在我的 .vimrc 文件中,我还添加了这个链接:
nnoremap <S-F12> :CommandT<CR>
这样我按Shift-F12键,然后输入文件名来打开它。
希望能有所帮助。
:b part-of-file-name
可以让你走得更远,我更喜欢使用它(实际上我主要使用标签页),而不是打开太多窗口。有时候程序应该适应我们,有时候我们应该适应它们 :) - Jonatan Littkenoremap <silent> ,h :wincmd h<CR>
,以及后面的3个设置。 - sidyll