有人知道如何使用相同的键在 Vim 窗口以及 Tmux(或平铺 WM)窗格之间移动吗?
例如,当我使用组合键移动到 VIM 中的右侧窗格时,VIM 应该首先检测右侧是否真的有 VIM 窗格。如果没有,它应该调用 Tmux 命令移动到右侧的 tmux 窗格(如果右侧存在 tmux 窗格)。
如果您在 Tmux 窗格中向后移动,也会发生类似的事情。
我认为除了 Tmux 之外,您还可以将它与平铺窗口管理器一起使用。
更新:从 VIM 移出到 Tmux 窗格可以按如下方式完成:
function! WinMove(key)
let t:curwin = winnr()
exec "wincmd ".a:key
if (t:curwin == winnr()) "we haven't moved
if (match(a:key,'[h]')) "we're we going left
silent execute "!tmux select-pane -L &>/dev/null &" | redraw!
elseif (match(a:key,'[j]')) "we're we going down
silent execute "!tmux select-pane -D &>/dev/null &" | redraw!
elseif (match(a:key,'[k]')) "we're we going up
silent execute "!tmux select-pane -U &>/dev/null &" | redraw!
elseif (match(a:key,'[l]')) "we're we going right
silent execute "!tmux select-pane -R &>/dev/null &" | redraw!
endif
endif
endfunction
map <Esc><Up> <A-Up>
nmap <silent> <A-Right> :call WinMove('k')<CR>
map <Esc><Down> <A-Down>
nmap <silent> <A-Right> :call WinMove('j')<CR>
map <Esc><Left> <A-Left>
nmap <silent> <A-Right> :call WinMove('h')<CR>
map <Esc><Right> <A-Right>
nmap <silent> <A-Right> :call WinMove('l')<CR>
目前还不确定是否有可能搬回去,但我会调查一下。
答案1
Mislav Marohnic 和 thoughtbot 的 Chris Toomey 想出了一个解决方案这里。它使用Ctrl+h/j/k/l以您期望的方式在 Vim 和 tmux 中切换窗格;使用Ctrl+\切换到前一个窗格。
编辑:我之前建议过一些我从未真正尝试过的东西。如果你出于某种原因对此感兴趣,请查看此答案的编辑历史。