--- /dev/null
+" adapted from https://www.reddit.com/r/vim/comments/op677w/making_neovim_terminal_behave_like_vim_terminal/h642b6b/
+
+function! s:TermEnter(_)
+ if getbufvar(bufnr(), 'term_insert', 0)
+ startinsert
+ call setbufvar(bufnr(), 'term_insert', 0)
+ endif
+endfunction
+
+function! <SID>TermExec(cmd)
+ let b:term_insert = 1
+ execute a:cmd
+endfunction
+
+if !has('nvim')
+ command! -nargs=* T terminal <args>
+ command! -nargs=* VT vertical terminal <args>
+else
+ command! -nargs=* T split | terminal <args>
+ command! -nargs=* VT vsplit | terminal <args>
+
+ tnoremap <silent> <C-W>. <C-W>
+ tnoremap <silent> <C-W><C-.> <C-W>
+ tnoremap <silent> <C-W>\ <C-\>
+ tnoremap <silent> <C-W><C-\> <C-\>
+ tnoremap <silent> <C-W>N <C-\><C-N>
+ tnoremap <silent> <C-W> <C-\><C-N>:call <SID>TermExec('call feedkeys(":")')<CR>
+ tnoremap <silent> <C-W><C-W> <cmd>call <SID>TermExec('wincmd w')<CR>
+ tnoremap <silent> <C-W>W <cmd>call <SID>TermExec('wincmd W')<CR>
+ tnoremap <silent> <C-L> <cmd>call <SID>TermExec('wincmd w')<CR>
+ tnoremap <silent> <C-H> <cmd>call <SID>TermExec('wincmd W')<CR>
+ tnoremap <silent> <C-W>h <cmd>call <SID>TermExec('wincmd h')<CR>
+ tnoremap <silent> <C-W>j <cmd>call <SID>TermExec('wincmd j')<CR>
+ tnoremap <silent> <C-W>k <cmd>call <SID>TermExec('wincmd k')<CR>
+ tnoremap <silent> <C-W>l <cmd>call <SID>TermExec('wincmd l')<CR>
+ tnoremap <silent> <C-W><C-H> <cmd>call <SID>TermExec('wincmd h')<CR>
+ tnoremap <silent> <C-W><C-J> <cmd>call <SID>TermExec('wincmd j')<CR>
+ tnoremap <silent> <C-W><C-K> <cmd>call <SID>TermExec('wincmd k')<CR>
+ tnoremap <silent> <C-W><C-L> <cmd>call <SID>TermExec('wincmd l')<CR>
+ tnoremap <silent> <C-W>gt <cmd>call <SID>TermExec('tabn')<CR>
+ tnoremap <silent> <C-W>gT <cmd>call <SID>TermExec('tabp')<CR>
+endif
+
+augroup terminal
+ au!
+ if !has('nvim')
+ autocmd TerminalOpen * if &buftype == 'terminal' | setlocal bufhidden=hide | endif
+ else
+ autocmd TermOpen * startinsert
+ autocmd TermOpen * if &buftype == 'terminal' | setlocal bufhidden=hide | endif
+ autocmd CmdlineLeave,WinEnter,BufWinEnter * call timer_start(0, function('s:TermEnter'), {})
+ endif
+augroup END