allow to navigate seamlessly between vim and tmux splits using a consistent set of hotkeys

This commit is contained in:
Nachuan Tang
2023-02-23 01:17:56 -05:00
parent adef893ac9
commit f5e916e5ba
2 changed files with 72 additions and 40 deletions
+24 -4
View File
@@ -14,10 +14,10 @@ bind-key -r C-h resize-pane -L
bind-key -r C-l resize-pane -R bind-key -r C-l resize-pane -R
# vim-like pane switching # vim-like pane switching
bind-key -n C-k select-pane -U # bind-key -n C-k select-pane -U
bind-key -n C-j select-pane -D # bind-key -n C-j select-pane -D
bind-key -n C-h select-pane -L # bind-key -n C-h select-pane -L
bind-key -n C-l select-pane -R # bind-key -n C-l select-pane -R
# and now unbind keys # and now unbind keys
unbind Up unbind Up
@@ -29,3 +29,23 @@ unbind C-Up
unbind C-Down unbind C-Down
unbind C-Left unbind C-Left
unbind C-Right unbind C-Right
# Smart pane switching with awareness of Vim splits.
# See: https://github.com/christoomey/vim-tmux-navigator
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?)(diff)?$'"
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
bind-key -T copy-mode-vi 'C-h' select-pane -L
bind-key -T copy-mode-vi 'C-j' select-pane -D
bind-key -T copy-mode-vi 'C-k' select-pane -U
bind-key -T copy-mode-vi 'C-l' select-pane -R
bind-key -T copy-mode-vi 'C-\' select-pane -l
+48 -36
View File
@@ -49,6 +49,7 @@
Plug 'vim-scripts/restore_view.vim' Plug 'vim-scripts/restore_view.vim'
Plug 'mhinz/vim-startify' Plug 'mhinz/vim-startify'
Plug 'christoomey/vim-tmux-navigator'
if executable('fzf') if executable('fzf')
" fzf#install() makes sure that you have the latest binary, comment out because I don't want it to install binary for me " fzf#install() makes sure that you have the latest binary, comment out because I don't want it to install binary for me
Plug 'junegunn/fzf' ", { 'do': { -> fzf#install() } } Plug 'junegunn/fzf' ", { 'do': { -> fzf#install() } }
@@ -79,7 +80,7 @@
" The bottom buffer display " The bottom buffer display
Plug 'Donaldttt/vim-bufferline' Plug 'Donaldttt/vim-bufferline'
Plug 'ryanoasis/vim-devicons' Plug 'ryanoasis/vim-devicons'
Plug 'Yggdroot/indentLine' " Plug 'Yggdroot/indentLine'
endif endif
if executable('node') if executable('node')
@@ -134,6 +135,16 @@ endfunction
let g:indentLine_fileTypeExclude = ['startify'] let g:indentLine_fileTypeExclude = ['startify']
endif endif
" } " }
if HasPlug('vim-tmux-navigator')
let g:tmux_navigator_no_mappings = 1
noremap <silent> <c-h> :<C-U>TmuxNavigateLeft<cr>
noremap <silent> <c-j> :<C-U>TmuxNavigateDown<cr>
noremap <silent> <c-k> :<C-U>TmuxNavigateUp<cr>
noremap <silent> <c-l> :<C-U>TmuxNavigateRight<cr>
" noremap <silent> {Previous-Mapping} :<C-U>TmuxNavigatePrevious<cr>
endif
" mhinz/vim-startify { " mhinz/vim-startify {
if HasPlug("vim-startify") if HasPlug("vim-startify")
@@ -199,7 +210,7 @@ endfunction
" } " }
" easymotion/vim-easymotion { " easymotion/vim-easymotion {
if HasPlug("vim-easymotion")
" <Leader>f{char} to move to {char} " <Leader>f{char} to move to {char}
map <Leader>f <Plug>(easymotion-bd-f) map <Leader>f <Plug>(easymotion-bd-f)
nmap <Leader>f <Plug>(easymotion-overwin-f) nmap <Leader>f <Plug>(easymotion-overwin-f)
@@ -214,6 +225,7 @@ endfunction
" Move to word " Move to word
map <Leader>w <Plug>(easymotion-bd-w) map <Leader>w <Plug>(easymotion-bd-w)
nmap <Leader>w <Plug>(easymotion-overwin-w) nmap <Leader>w <Plug>(easymotion-overwin-w)
endif
" } " }
@@ -252,46 +264,46 @@ endfunction
" } " }
" NerdTree { " NerdTree {
if (g:vim_type == 'vim' || g:vim_version < 0.8) && HasPlug('nerdtree') if (g:vim_type == 'vim' || g:vim_version < 0.8) && HasPlug('nerdtree')
let g:NERDShutUp=1 let g:NERDShutUp=1
" work around for nerdtree bug: https://github.com/preservim/nerdtree/issues/1321 " work around for nerdtree bug: https://github.com/preservim/nerdtree/issues/1321
let g:NERDTreeMinimalMenu = v:true let g:NERDTreeMinimalMenu = v:true
let g:NERDTreeMinimalUI = v:true let g:NERDTreeMinimalUI = v:true
"nnoremap <C-e> :NERDTreeToggle<CR> "nnoremap <C-e> :NERDTreeToggle<CR>
function! NERDTreeFindToggle() function! NERDTreeFindToggle()
let my_filetype = &filetype let my_filetype = &filetype
let specical_fts = ['nerdtree', 'startify'] let specical_fts = ['nerdtree', 'startify']
if my_filetype == '' || index(specical_fts, my_filetype) >= 0 if my_filetype == '' || index(specical_fts, my_filetype) >= 0
:NERDTreeToggle :NERDTreeToggle
else else
:NERDTreeFind :NERDTreeFind
endif endif
endfunction endfunction
nnoremap <silent> <leader>e :call NERDTreeFindToggle()<CR> nnoremap <silent> <leader>e :call NERDTreeFindToggle()<CR>
"let NERDTreeShowBookmarks=1 "let NERDTreeShowBookmarks=1
"let NERDTreeIgnore=['\.py[cd]$', '\~$', '\.swo$', '\.swp$', '^\.git$', '^\.hg$', '^\.svn$', '\.bzr$'] "let NERDTreeIgnore=['\.py[cd]$', '\~$', '\.swo$', '\.swp$', '^\.git$', '^\.hg$', '^\.svn$', '\.bzr$']
let NERDTreeChDirMode = 0 let NERDTreeChDirMode = 0
let NERDTreeQuitOnOpen = 1 let NERDTreeQuitOnOpen = 1
let NERDTreeMouseMode = 2 let NERDTreeMouseMode = 2
let NERDTreeShowHidden = 1 let NERDTreeShowHidden = 1
let NERDTreeKeepTreeInNewTab = 1 let NERDTreeKeepTreeInNewTab = 1
" Exit Vim if NERDTree is the only window remaining in the only tab. " Exit Vim if NERDTree is the only window remaining in the only tab.
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
endif endif
" } " }
" nvim-tree.lua { " nvim-tree.lua {
if g:vim_type == 'nvim' && HasPlug("nvim-tree.lua") if g:vim_type == 'nvim' && HasPlug("nvim-tree.lua")
" Hide vim bottom statusline " Hide vim bottom statusline
" autocmd FileType NvimTree setlocal noshowmode noruler laststatus=0 noshowcmd " autocmd FileType NvimTree setlocal noshowmode noruler laststatus=0 noshowcmd
" set noshowmode noruler laststatus=0 noshowcmd " set noshowmode noruler laststatus=0 noshowcmd
" autocmd BufRead,BufNewFile NvimTree set laststatus=0 " This will work instead " autocmd BufRead,BufNewFile NvimTree set laststatus=0 " This will work instead
endif endif
" } " }
"if has('nvim') && str2float(g:nvim_version) >= 0.5 && HasPlug("lualine.nvim") "if has('nvim') && str2float(g:nvim_version) >= 0.5 && HasPlug("lualine.nvim")
@@ -591,7 +603,7 @@ endfunction
" vim theme " vim theme
if !has('nvim') && HasPlug("papercolor-theme") && HasPlug('papercolor-theme') if !has('nvim') && HasPlug("papercolor-theme") && HasPlug('papercolor-theme')
set t_Co=256 set t_Co=256
" improve coc color in this theme " improve coc color in this theme
let g:light_theme = 'PaperColor' let g:light_theme = 'PaperColor'
let g:dark_theme = 'PaperColor' let g:dark_theme = 'PaperColor'
@@ -679,7 +691,7 @@ endfunction
nnoremap <silent> <space>e :bnext<CR> nnoremap <silent> <space>e :bnext<CR>
" leader s change all occurence " leader s change all occurence
nnoremap <silent> <Leader>s :%s/\<<C-r><C-w>\>/ nnoremap <Leader>s :%s/\<<C-r><C-w>\>/
" leader num change tab " leader num change tab
" only for vim or nvim without lualine " only for vim or nvim without lualine