![有人知道如何使用相同的键在 Vim 窗口以及 Tmux(或平铺 WM)窗格之间移动吗?](https://linux22.com/image/1327024/%E6%9C%89%E4%BA%BA%E7%9F%A5%E9%81%93%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E9%94%AE%E5%9C%A8%20Vim%20%E7%AA%97%E5%8F%A3%E4%BB%A5%E5%8F%8A%20Tmux%EF%BC%88%E6%88%96%E5%B9%B3%E9%93%BA%20WM%EF%BC%89%E7%AA%97%E6%A0%BC%E4%B9%8B%E9%97%B4%E7%A7%BB%E5%8A%A8%E5%90%97%EF%BC%9F.png)
有人知道如何使用相同的键在 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+\切换到前一个窗格。
编辑:我之前建议过一些我从未真正尝试过的东西。如果你出于某种原因对此感兴趣,请查看此答案的编辑历史。