有没有办法让VIM中的窗口导航环绕

问题描述 投票:0回答:3

我希望从最右边的窗口输入 Ctrl-Wk 可以聚焦 VIM 中最左边的窗口。显然,如果它能在各个方向上发挥作用,那就很方便了。

我的主要动机是与 NERDTree 一起使用。我通常有以下设置:

|----------|----------|-----------|
|          |          |           |
| NERDTree |   File1  |   File2   |
|          |          |           |
|          |----------|-----------|
|          |          |           |
|          |   File3  |   File4   |
|          |          |           |
|----------|----------|-----------|

如果我想在与

File4
相同的窗口中打开一个新文件,我目前必须输入 2Ctrl-Wj 并且使用 Ctrl-W 获得相同的结果将非常好k

谢谢。

vim macvim nerdtree
3个回答
7
投票

您必须使用包含此额外逻辑的您自己的映射来覆盖

$HOME/.vimrc
中的默认命令。当正常移动不再改变窗口时(即我们已经在边界处),跳到另一边。

"
" Wrap window-move-cursor
"
function! s:GotoNextWindow( direction, count )
  let l:prevWinNr = winnr()
  execute a:count . 'wincmd' a:direction
  return winnr() != l:prevWinNr
endfunction

function! s:JumpWithWrap( direction, opposite )
  if ! s:GotoNextWindow(a:direction, v:count1)
    call s:GotoNextWindow(a:opposite, 999)
  endif
endfunction

nnoremap <silent> <C-w>h :<C-u>call <SID>JumpWithWrap('h', 'l')<CR>
nnoremap <silent> <C-w>j :<C-u>call <SID>JumpWithWrap('j', 'k')<CR>
nnoremap <silent> <C-w>k :<C-u>call <SID>JumpWithWrap('k', 'j')<CR>
nnoremap <silent> <C-w>l :<C-u>call <SID>JumpWithWrap('l', 'h')<CR>
nnoremap <silent> <C-w><Left> :<C-u>call <SID>JumpWithWrap('h', 'l')<CR>
nnoremap <silent> <C-w><Down> :<C-u>call <SID>JumpWithWrap('j', 'k')<CR>
nnoremap <silent> <C-w><Up> :<C-u>call <SID>JumpWithWrap('k', 'j')<CR>
nnoremap <silent> <C-w><Right> :<C-u>call <SID>JumpWithWrap('l', 'h')<CR>

4
投票

一个人就能用

<C-w>w

<C-w>W

分别向右/向下和向左/向上循环浏览所有窗口。两个命令都会环绕,因此

<C-w>w
将在某个时刻位于左上角,而
<C-w>W
将在某个时刻位于右下角。

参见

:h window-move-cursor

或者简单地使用

<C-w>b
直接进入您的目标窗口。


0
投票

如果您使用 Neovim,这是其他答案的 Lua 版本:

local function try_jump_window(direction, count)
  local prev_win_nr = vim.fn.winnr()
  vim.cmd(count .. "wincmd " .. direction)
  return vim.fn.winnr() ~= prev_win_nr
end

local function jump_window_with_wrap(direction, opposite)
  return function ()
    if not try_jump_window(direction, vim.v.count1) then
      try_jump_window(opposite, 999)
    end
  end
end
local opts = { silent = true, noremap = true }
vim.keymap.set("n", "<C-w><C-h>", jump_window_with_wrap("h", "l"), opts)
vim.keymap.set("n", "<C-w><C-l>", jump_window_with_wrap("l", "h"), opts)
vim.keymap.set("n", "<C-w><C-j>", jump_window_with_wrap("j", "k"), opts)
vim.keymap.set("n", "<C-w><C-k>", jump_window_with_wrap("k", "j"), opts)
© www.soinside.com 2019 - 2024. All rights reserved.