如何在VIM中的windows之间交换文件?
当我使用VIM时,我总是可以看到多个窗口。有时我想有一个简单的方法,在某些地方交换这些窗口。是否有任何插件、宏等使这更容易?顺便说一句,我使用MiniBufExplorer。内置了一些有用的命令,可以为您提供一定程度的控制,但并不全面。主要有:如何在VIM中的windows之间交换文件?,vim,editing,Vim,Editing,当我使用VIM时,我总是可以看到多个窗口。有时我想有一个简单的方法,在某些地方交换这些窗口。是否有任何插件、宏等使这更容易?顺便说一句,我使用MiniBufExplorer。内置了一些有用的命令,可以为您提供一定程度的控制,但并不全面。主要有: Ctrl-W,r(即按住Ctrl键,按W键,松开Ctrl键,按r键)-旋转窗口(第一个窗口变为第二个窗口,第二个窗口变为第三个窗口,以此类推) Ctrl-W,x-将当前窗口与下一个窗口交换 Ctrl-W,Shift-H-将此窗口移到最左侧 Ctrl-W
- Ctrl-W,r(即按住Ctrl键,按W键,松开Ctrl键,按r键)-旋转窗口(第一个窗口变为第二个窗口,第二个窗口变为第三个窗口,以此类推)
- Ctrl-W,x-将当前窗口与下一个窗口交换
- Ctrl-W,Shift-H-将此窗口移到最左侧
- Ctrl-W,Shift-K-将此窗口移到顶部
更多信息。我在vimrc中编写并使用了以下代码片段 复制粘贴我的Vim窗口 例如,这定义了以下快捷方式:
:“猛拉窗口”,即将缓冲区的编号存储在 全局变量中的当前窗口y
:“将窗口放在当前窗口的位置”,即它读取 以前存储的缓冲区编号,并在当前窗口中打开该缓冲区。 它还存储用于当前缓存的缓冲区编号 窗户pp
y
(拖动缓冲区编号)pp
(粘贴缓冲区)pp
(再次粘贴缓冲区)if version >= 700
function! HOpen(dir,what_to_open)
let [type,name] = a:what_to_open
if a:dir=='left' || a:dir=='right'
vsplit
elseif a:dir=='up' || a:dir=='down'
split
end
if a:dir=='down' || a:dir=='right'
exec "normal! \<c-w>\<c-w>"
end
if type=='buffer'
exec 'buffer '.name
else
exec 'edit '.name
end
endfunction
function! HYankWindow()
let g:window = winnr()
let g:buffer = bufnr('%')
let g:bufhidden = &bufhidden
endfunction
function! HDeleteWindow()
call HYankWindow()
set bufhidden=hide
close
endfunction
function! HPasteWindow(direction)
let old_buffer = bufnr('%')
call HOpen(a:direction,['buffer',g:buffer])
let g:buffer = old_buffer
let &bufhidden = g:bufhidden
endfunction
noremap <c-w>d :call HDeleteWindow()<cr>
noremap <c-w>y :call HYankWindow()<cr>
noremap <c-w>p<up> :call HPasteWindow('up')<cr>
noremap <c-w>p<down> :call HPasteWindow('down')<cr>
noremap <c-w>p<left> :call HPasteWindow('left')<cr>
noremap <c-w>p<right> :call HPasteWindow('right')<cr>
noremap <c-w>pk :call HPasteWindow('up')<cr>
noremap <c-w>pj :call HPasteWindow('down')<cr>
noremap <c-w>ph :call HPasteWindow('left')<cr>
noremap <c-w>pl :call HPasteWindow('right')<cr>
noremap <c-w>pp :call HPasteWindow('here')<cr>
noremap <c-w>P :call HPasteWindow('here')<cr>
endif
如果版本>=700
功能!霍本(董事,什么是公开的)
让[type,name]=a:打开什么
如果a:dir=='left'| | a:dir=='right'
vsplit
如果a:dir==“向上”| a:dir==“向下”
分裂
结束
如果a:dir=='down'| a:dir=='right'
执行“正常!”
结束
如果类型=='buffer'
执行“缓冲区”。名称
其他的
exec“编辑”。名称
结束
端功能
功能!HYankWindow()
设g:window=winnr()
设g:buffer=bufnr(“%”)
设g:bufhidden=&bufhidden
端功能
功能!HDeleteWindow()
调用HYankWindow()
设置bufhidden=hide
关闭
端功能
功能!HPASTE窗口(方向)
让old_buffer=bufnr(“%”)
调用HOpen(a:direction,['buffer',g:buffer])
设g:buffer=old\u buffer
let&bufhidden=g:bufhidden
端功能
noremap d:调用HDeleteWindow()
noremap y:调用HYankWindow()
noremap:调用HPASTEVOWN('up'))
noremap:调用HPasteWindow('down')
noremap:调用HPasteWindow('左')
noremap:调用HPasteWindow('右')
noremap pk:调用HPASTEVOWN('向上')
noremap pj:调用HPASTEVOWN('down')
noremap ph:调用HPASTEVOON('左')
noremap pl:调用HPasteWindow('右')
noremap pp:调用HPasteWindow('here')
noremap:调用HPasteWindow('here')
恩迪夫
由于r
或x
有一个限制,当垂直和水平窗口拆分混合时,您不能旋转或交换窗口。而H
可能会使窗口布局发生超出预期的变化,尤其是当您有许多窗口时
因此,您可以做一些工作来满足窗口/缓冲区切换的特殊需要。下面是一个用左上角窗口切换当前窗口的示例(通常我使其垂直最大化):
函数!SwitchMainWindow()
设l:current_buf=winbufnr(0)
exe“缓冲区”。温布夫纳(1)
1wincmd w
exe“缓冲区”。l:目前的情况
端功能
nnoremap:调用SwitchMainWindow()
大约在同一时间,我问了一个问题:我想要一种在不改变任意复杂布局的情况下专门交换窗口的方法。我最终用建议的解决方案之一制作了一个vim插件。它叫,;使用您首选的vim插件管理器安装它,并尝试一下
使用WindowSwap.vim,您只需
yw
拖动窗口李>
pw
粘贴该窗口,将其与
第一个
在打开的窗口之间循环ctrl-w
将窗口聚焦到左侧ctrl-w h
将窗口聚焦到下方ctrl-w j
将窗口向上聚焦ctrl-w k
将窗口聚焦到右侧ctrl-w l
旋转所有窗口ctrl-w r
与相邻窗口交换当前窗口ctrl-w x
将当前窗口移到最左侧ctrl-w H
将当前窗口移动到底部ctrl-w J
将当前窗口移到顶部ctrl-w K
将当前窗口移到最右侧ctrl-w L
if version >= 700
function! HOpen(dir,what_to_open)
let [type,name] = a:what_to_open
if a:dir=='left' || a:dir=='right'
vsplit
elseif a:dir=='up' || a:dir=='down'
split
end
if a:dir=='down' || a:dir=='right'
exec "normal! \<c-w>\<c-w>"
end
if type=='buffer'
exec 'buffer '.name
else
exec 'edit '.name
end
endfunction
function! HYankWindow()
let g:window = winnr()
let g:buffer = bufnr('%')
let g:bufhidden = &bufhidden
endfunction
function! HDeleteWindow()
call HYankWindow()
set bufhidden=hide
close
endfunction
function! HPasteWindow(direction)
let old_buffer = bufnr('%')
call HOpen(a:direction,['buffer',g:buffer])
let g:buffer = old_buffer
let &bufhidden = g:bufhidden
endfunction
noremap <c-w>d :call HDeleteWindow()<cr>
noremap <c-w>y :call HYankWindow()<cr>
noremap <c-w>p<up> :call HPasteWindow('up')<cr>
noremap <c-w>p<down> :call HPasteWindow('down')<cr>
noremap <c-w>p<left> :call HPasteWindow('left')<cr>
noremap <c-w>p<right> :call HPasteWindow('right')<cr>
noremap <c-w>pk :call HPasteWindow('up')<cr>
noremap <c-w>pj :call HPasteWindow('down')<cr>
noremap <c-w>ph :call HPasteWindow('left')<cr>
noremap <c-w>pl :call HPasteWindow('right')<cr>
noremap <c-w>pp :call HPasteWindow('here')<cr>
noremap <c-w>P :call HPasteWindow('here')<cr>
endif
function! SwitchMainWindow()
let l:current_buf = winbufnr(0)
exe "buffer" . winbufnr(1)
1wincmd w
exe "buffer" . l:current_buf
endfunction
nnoremap <c-w><c-e> :call SwitchMainWindow()<cr>