So this is the first commit where we are starting to migrate from tmux. Right now I'm not sure how this will go, every other attempt has not lasted very long. This does support all the features I am using in tmux though. TBH most of the stuff in the tmux.conf wezterm does by default. For example, the pain numbers start at 1 not 0. This implements a fork of tmux navigation, the plugin I have been using in vim since like.... day one.
112 lines
3.5 KiB
VimL
112 lines
3.5 KiB
VimL
" Maps <C-h/j/k/l> to switch vim splits in the given direction. If there are
|
|
" no more windows in that direction, forwards the operation to wezterm.
|
|
" Additionally, <C-\> toggles between last active vim splits/wezterm panes.
|
|
|
|
if exists("g:loaded_wezterm_navigator") || &cp || v:version < 700
|
|
finish
|
|
endif
|
|
let g:loaded_wezterm_navigator = 1
|
|
|
|
function! s:DirectionToKey(direction)
|
|
if a:direction ==# 'Up'
|
|
return 'k'
|
|
elseif a:direction ==# 'Down'
|
|
return 'j'
|
|
elseif a:direction ==# 'Left'
|
|
return 'h'
|
|
elseif a:direction ==# 'Right'
|
|
return 'l'
|
|
else
|
|
return 'p'
|
|
endif
|
|
endfunction
|
|
|
|
function! s:VimNavigate(direction)
|
|
try
|
|
execute 'wincmd ' . s:DirectionToKey(a:direction)
|
|
catch
|
|
echohl ErrorMsg | echo 'E11: Invalid in command-line window; <CR> executes, CTRL-C quits: wincmd k' | echohl None
|
|
endtry
|
|
endfunction
|
|
|
|
if !get(g:, 'wezterm_navigator_no_mappings', 0)
|
|
nnoremap <silent> <c-h> :<C-U>WestermNavigateLeft<cr>
|
|
nnoremap <silent> <c-j> :<C-U>WestermNavigateDown<cr>
|
|
nnoremap <silent> <c-k> :<C-U>WestermNavigateUp<cr>
|
|
nnoremap <silent> <c-l> :<C-U>WestermNavigateRight<cr>
|
|
nnoremap <silent> <c-\> :<C-U>WestermNavigatePrevious<cr>
|
|
endif
|
|
|
|
if empty($WEZTERM_PANE)
|
|
command! WestermNavigateLeft call s:VimNavigate('h')
|
|
command! WestermNavigateDown call s:VimNavigate('j')
|
|
command! WestermNavigateUp call s:VimNavigate('k')
|
|
command! WestermNavigateRight call s:VimNavigate('l')
|
|
command! WestermNavigatePrevious call s:VimNavigate('p')
|
|
finish
|
|
endif
|
|
|
|
command! WestermNavigateLeft call s:WeztermAwareNavigate('Left')
|
|
command! WestermNavigateDown call s:WeztermAwareNavigate('Down')
|
|
command! WestermNavigateUp call s:WeztermAwareNavigate('Up')
|
|
command! WestermNavigateRight call s:WeztermAwareNavigate('Right')
|
|
command! WestermNavigatePrevious call s:WeztermAwareNavigate('Prev')
|
|
|
|
let s:pane_position_from_direction = {'h': 'left', 'j': 'bottom', 'k': 'top', 'l': 'right'}
|
|
|
|
function! s:weztermOrTmateExecutable()
|
|
return "wezterm"
|
|
endfunction
|
|
|
|
function! s:weztermSocket()
|
|
" The socket path is the first value in the comma-separated list of $wezterm.
|
|
return split($wezterm, ',')[0]
|
|
endfunction
|
|
|
|
let s:wezterm_is_last_pane = 0
|
|
augroup wezterm_navigator
|
|
au!
|
|
autocmd WinEnter * let s:wezterm_is_last_pane = 0
|
|
augroup END
|
|
|
|
function! s:NeedsVitalityRedraw()
|
|
return exists('g:loaded_vitality') && v:version < 704 && !has("patch481")
|
|
endfunction
|
|
|
|
function! s:ShouldForwardNavigationBackToWezterm(wezterm_last_pane, at_tab_page_edge)
|
|
endfunction
|
|
|
|
function! s:ShouldForwardNavigationBackToWezterm(wezterm_last_pane, at_tab_page_edge)
|
|
return a:wezterm_last_pane || a:at_tab_page_edge
|
|
endfunction
|
|
|
|
function! s:WeztermCommand(args)
|
|
let cmd = 'wezterm cli ' . a:args
|
|
let l:x=&shellcmdflag
|
|
let retval=system(cmd)
|
|
let &shellcmdflag=l:x
|
|
return retval
|
|
endfunction
|
|
|
|
function! s:WeztermAwareNavigate(direction)
|
|
let nr = winnr()
|
|
let wezterm_last_pane = (a:direction == 'p' && s:wezterm_is_last_pane)
|
|
if !wezterm_last_pane
|
|
call s:VimNavigate(a:direction)
|
|
endif
|
|
let at_tab_page_edge = (nr == winnr())
|
|
" Forward the switch panes command to wezterm if:
|
|
" a) we're toggling between the last wezterm pane;
|
|
" b) we tried switching windows in vim but it didn't have effect.
|
|
if s:ShouldForwardNavigationBackToWezterm(wezterm_last_pane, at_tab_page_edge)
|
|
let args = 'activate-pane-direction ' . shellescape(a:direction)
|
|
|
|
silent call s:WeztermCommand(args)
|
|
if s:NeedsVitalityRedraw()
|
|
redraw!
|
|
endif
|
|
let s:wezterm_is_last_pane = 1
|
|
else
|
|
let s:wezterm_is_last_pane = 0
|
|
endif
|
|
endfunction
|