The following Vim script (VimL) function can be used to make Vim open the documentation of the word under the cursor in a new tab for various languages and tools such as Vim help (:help), Python (Pydoc), Markdown (sdcv dictionary), man pages (Vim’s built-in ‘:Man’), and Ansible (ansible-doc).
The VimL function is also extensible, meaning that you can adapt it to work with any other documentation tool. By default, the key mapping upper-case “K” can be used to open the documentation for the word under the cursor in a new tab.
" Language: Vim script
" Author: James Cherti
" License: MIT
" Description: Vim: open help/documentation in a new tab
" (Vim script, Python, Markdown, man pages, Ansible...).
" Press upper-case K to open help for the word under the cursor.
" URL: https://www.jamescherti.com/vim-open-help-documentation-in-a-new-tab/
function! TabHelp(word) abort
let l:cmd = ''
let l:tabhelpprg = get(b:, 'tabhelpprg', '')
if l:tabhelpprg ==# ''
normal! K
return
endif
if l:tabhelpprg[0] ==# ':'
if stridx(l:tabhelpprg, '%s') ==# -1
execute l:tabhelpprg
else
execute printf(l:tabhelpprg, fnameescape(a:word))
endif
return
else
let l:cmd = 'silent read! '
if stridx(l:tabhelpprg, '%s') ==# -1
let l:cmd .= l:tabhelpprg
else
let l:cmd .= printf(l:tabhelpprg, shellescape(a:word))
endif
endif
execute 'silent tabnew help:' . fnameescape(a:word)
setlocal modifiable
silent normal! ggdG
silent normal! 1Gdd
if l:cmd !=# ''
execute l:cmd
endif
silent normal! gg0
setlocal nomodifiable
setlocal noswapfile
setlocal nowrap
setlocal nonumber
setlocal nomodified
setlocal buftype=nofile
setlocal bufhidden=delete
if exists('&relativenumber')
setlocal norelativenumber
endif
if exists('&signcolumn')
setlocal signcolumn=no
endif
setlocal nofoldenable
setlocal foldcolumn=0
endfunction
augroup TabHelp
autocmd!
autocmd FileType vim let b:tabhelpprg = ':tab help %s'
autocmd FileType sh,zsh,csh if ! exists(':Man') | runtime ftplugin/man.vim | endif | let b:tabhelpprg = ':tab Man %s'
autocmd FileType yaml.ansible if executable('ansible-doc') | let b:tabhelpprg = 'ansible-doc %s' | endif
autocmd FileType markdown if executable('sdcv') | let b:tabhelpprg = 'sdcv %s' | endif
autocmd FileType vim,sh,zsh,csh,yaml.ansible,markdown nnoremap <silent> <buffer> K :call TabHelp(expand('<cword>'))<CR>
augroup END
Code language: Vim Script (vim)