如何编写Vim脚本循环跳转至指定文件类型的窗口?
问题
在Vim实例中存在多窗口,部分为插件窗口(如NvimTree、undotree、vista),其余为实际编辑缓冲区窗口(如C/C++/Python等类型)。希望定义键映射,自动跳转至实际编辑缓冲区窗口后再执行命令,避免直接在插件窗口操作。当前键映射仅能在当前窗口为NvimTree或undotree时跳转一次,无法循环跳转至符合要求的窗口,请问如何编写Vim脚本实现循环跳转,直到窗口为非黑名单文件类型?
解决方案
1. 实现循环跳转函数
先定义插件窗口的文件类型黑名单,再编写一个循环检查并跳转的函数:
" 定义插件窗口的文件类型黑名单,可根据需求添加或修改 let g:plugin_window_blacklist = ['NvimTree', 'undotree', 'vista'] " 循环跳转至非插件编辑窗口的函数 function! JumpToEditWindow() let initial_win = win_getid() let current_win = initial_win while 1 " 切换到下一个窗口 wincmd w current_win = win_getid() " 检查当前窗口的缓冲区类型是否不在黑名单内 if index(g:plugin_window_blacklist, &filetype) == -1 break endif " 若回到初始窗口,说明所有窗口都是插件窗口,终止循环 if current_win == initial_win break endif endwhile endfunction
2. 绑定带跳转的键映射
将需要执行的命令和跳转函数结合,比如绑定快捷键先跳转再执行保存、关闭缓冲区等操作:
" 示例1:先跳转至编辑窗口再执行保存 nnoremap <Leader>w :call JumpToEditWindow()<CR>:w<CR> " 示例2:先跳转至编辑窗口再关闭当前缓冲区 nnoremap <Leader>bd :call JumpToEditWindow()<CR>:bd<CR> " 可根据自身需求,替换后面的命令实现不同功能
逻辑说明
- 用
win_getid()记录初始窗口ID,防止在全是插件窗口的场景下陷入无限循环 - 通过
wincmd w逐个遍历窗口,每次检查当前窗口的&filetype是否在黑名单中 - 找到第一个非插件窗口后立即停止循环,后续绑定的命令会自动在该窗口执行
内容的提问来源于stack exchange,提问作者linrongbin
相关产品推荐
相关产品推荐

