Vim中的窗口导航环绕

mv1qrgav  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(171)

我想这样,从最右边的窗口键入Ctrl-Wk将集中在Vim最左边的窗口。显然,这将是方便的工作在各个方向。
我的主要动机是使用NERDTree。我通常有以下设置:

  1. |----------|----------|-----------|
  2. | | | |
  3. | NERDTree | File1 | File2 |
  4. | | | |
  5. | |----------|-----------|
  6. | | | |
  7. | | File3 | File4 |
  8. | | | |
  9. |----------|----------|-----------|

如果我想在与File4相同的窗口中打开一个新文件,我现在必须输入2Ctrl-Wj,用Ctrl-Wk实现同样的结果会很好。

snvhrwxg

snvhrwxg1#

您必须使用包含此额外逻辑的Map覆盖$HOME/.vimrc中的默认命令。当正常移动不再改变窗口时(即,我们已经在边界了),跳到另一边。

  1. "
  2. " Wrap window-move-cursor
  3. "
  4. function! s:GotoNextWindow( direction, count )
  5. let l:prevWinNr = winnr()
  6. execute a:count . 'wincmd' a:direction
  7. return winnr() != l:prevWinNr
  8. endfunction
  9. function! s:JumpWithWrap( direction, opposite )
  10. if ! s:GotoNextWindow(a:direction, v:count1)
  11. call s:GotoNextWindow(a:opposite, 999)
  12. endif
  13. endfunction
  14. nnoremap <silent> <C-w>h :<C-u>call <SID>JumpWithWrap('h', 'l')<CR>
  15. nnoremap <silent> <C-w>j :<C-u>call <SID>JumpWithWrap('j', 'k')<CR>
  16. nnoremap <silent> <C-w>k :<C-u>call <SID>JumpWithWrap('k', 'j')<CR>
  17. nnoremap <silent> <C-w>l :<C-u>call <SID>JumpWithWrap('l', 'h')<CR>
  18. nnoremap <silent> <C-w><Left> :<C-u>call <SID>JumpWithWrap('h', 'l')<CR>
  19. nnoremap <silent> <C-w><Down> :<C-u>call <SID>JumpWithWrap('j', 'k')<CR>
  20. nnoremap <silent> <C-w><Up> :<C-u>call <SID>JumpWithWrap('k', 'j')<CR>
  21. nnoremap <silent> <C-w><Right> :<C-u>call <SID>JumpWithWrap('l', 'h')<CR>
展开查看全部
k75qkfdt

k75qkfdt2#

人们可以使用

  1. <C-w>w

  1. <C-w>W

以分别向右/向下和向左/向上循环通过所有窗口。这两个命令都是环绕的,所以<C-w>w将在某个点结束于左上角,而<C-w>W将在某个点结束于右下角。
请参见:h window-move-cursor
或者简单地使用<C-w>b,它直接进入你的目标窗口。

nhaq1z21

nhaq1z213#

下面是other answer的Lua版本,如果你使用Neovim:

  1. local function try_jump_window(direction, count)
  2. local prev_win_nr = vim.fn.winnr()
  3. vim.cmd(count .. "wincmd " .. direction)
  4. return vim.fn.winnr() ~= prev_win_nr
  5. end
  6. local function jump_window_with_wrap(direction, opposite)
  7. return function ()
  8. if not try_jump_window(direction, vim.v.count1) then
  9. try_jump_window(opposite, 999)
  10. end
  11. end
  12. end
  13. local opts = { silent = true, noremap = true }
  14. vim.keymap.set("n", "<C-w><C-h>", jump_window_with_wrap("h", "l"), opts)
  15. vim.keymap.set("n", "<C-w><C-l>", jump_window_with_wrap("l", "h"), opts)
  16. vim.keymap.set("n", "<C-w><C-j>", jump_window_with_wrap("j", "k"), opts)
  17. vim.keymap.set("n", "<C-w><C-k>", jump_window_with_wrap("k", "j"), opts)
展开查看全部

相关问题