假设我在vim中有一些任意的分割布局。
____________________
| one | two |
| | |
| |______|
| | three|
| | |
|___________|______|
有没有办法交换一个和两个,并保持相同的布局?在这个例子中很简单,但我正在寻找一个解决方案,将有助于更复杂的布局。
更新:
我想我应该说清楚点。我前面的例子是对实际用例的简化。有一个实际的例子:
我怎么能交换任何两个分割,保持相同的布局?
更新!3年多后……
我把sgriffin的解决方案放在一个Vim插件中,你可以轻松安装!用你最喜欢的插件管理器安装它,并尝试一下:WindowSwap.vim
有点晚了,但在寻找其他东西时看到了这个。我写了两个函数来标记一个窗口,然后在窗口之间交换缓冲区。这似乎就是你想要的。
只要把这些放在你的.vimrc中,然后映射你认为合适的函数:
function! MarkWindowSwap()
let g:markedWinNum = winnr()
endfunction
function! DoWindowSwap()
"Mark destination
let curNum = winnr()
let curBuf = bufnr( "%" )
exe g:markedWinNum . "wincmd w"
"Switch to source and shuffle dest->source
let markedBuf = bufnr( "%" )
"Hide and open so that we aren't prompted and keep history
exe 'hide buf' curBuf
"Switch to dest and shuffle source->dest
exe curNum . "wincmd w"
"Hide and open so that we aren't prompted and keep history
exe 'hide buf' markedBuf
endfunction
nmap <silent> <leader>mw :call MarkWindowSwap()<CR>
nmap <silent> <leader>pw :call DoWindowSwap()<CR>
要使用(假设您的mapleader设置为\),您将:
移动到窗口以标记交换通道
ctrl-w运动
类型\兆瓦
移动到要交换的窗口
\ pw型
瞧!交换缓冲区没有搞砸你的窗口布局!
同样基于sgriffin的解决方案,进入你想要交换的窗口,按CTRL-w m,进入你想要交换的窗口,再按CTRL-w m。
CTRL-w m是一个糟糕的记忆选择,所以如果有人想出一个更好的,请编辑这个。
此外,我想收到一个反馈从脚本又名“窗口标记。请重复目标”,然而作为一个vimscript新手,我不知道如何做到这一点。
尽管如此,这个剧本还是很不错的
" <CTRL>-w m : mark first window
" <CTRL>-w m : swap with that window
let s:markedWinNum = -1
function! MarkWindowSwap()
let s:markedWinNum = winnr()
endfunction
function! DoWindowSwap()
"Mark destination
let curNum = winnr()
let curBuf = bufnr( "%" )
exe s:markedWinNum . "wincmd w"
"Switch to source and shuffle dest->source
let markedBuf = bufnr( "%" )
"Hide and open so that we aren't prompted and keep history
exe 'hide buf' curBuf
"Switch to dest and shuffle source->dest
exe curNum . "wincmd w"
"Hide and open so that we aren't prompted and keep history
exe 'hide buf' markedBuf
endfunction
function! WindowSwapping()
if s:markedWinNum == -1
call MarkWindowSwap()
else
call DoWindowSwap()
let s:markedWinNum = -1
endif
endfunction
nnoremap <C-w>m :call WindowSwapping()<CR>