我希望从最右边的窗口输入 Ctrl-Wk 可以聚焦 VIM 中最左边的窗口。显然,如果它能在各个方向上发挥作用,那就很方便了。
我的主要动机是与 NERDTree 一起使用。我通常有以下设置:
|----------|----------|-----------|
| | | |
| NERDTree | File1 | File2 |
| | | |
| |----------|-----------|
| | | |
| | File3 | File4 |
| | | |
|----------|----------|-----------|
如果我想在与
File4
相同的窗口中打开一个新文件,我目前必须输入 2Ctrl-Wj 并且使用 Ctrl-W 获得相同的结果将非常好k。
谢谢。
您必须使用包含此额外逻辑的您自己的映射来覆盖
$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>
一个人就能用
<C-w>w
和
<C-w>W
分别向右/向下和向左/向上循环浏览所有窗口。两个命令都会环绕,因此
<C-w>w
将在某个时刻位于左上角,而 <C-w>W
将在某个时刻位于右下角。
参见
:h window-move-cursor
。
或者简单地使用
<C-w>b
直接进入您的目标窗口。
如果您使用 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)