1" Vim filetype plugin file 2" Language: man 3" Maintainer: SungHyun Nam <[email protected]> 4" Last Change: 2016 Jun 20 5 6" To make the ":Man" command available before editing a manual page, source 7" this script from your startup vimrc file. 8 9" If 'filetype' isn't "man", we must have been called to only define ":Man". 10if &filetype == "man" 11 12 " Only do this when not done yet for this buffer 13 if exists("b:did_ftplugin") 14 finish 15 endif 16 let b:did_ftplugin = 1 17 18 " Ensure Vim is not recursively invoked (man-db does this) 19 " when doing ctrl-[ on a man page reference. 20 if exists("$MANPAGER") 21 let $MANPAGER = "" 22 endif 23 24 " allow dot and dash in manual page name. 25 setlocal iskeyword+=\.,- 26 27 " Add mappings, unless the user didn't want this. 28 if !exists("no_plugin_maps") && !exists("no_man_maps") 29 if !hasmapto('<Plug>ManBS') 30 nmap <buffer> <LocalLeader>h <Plug>ManBS 31 endif 32 nnoremap <buffer> <Plug>ManBS :%s/.\b//g<CR>:setl nomod<CR>'' 33 34 nnoremap <buffer> <c-]> :call <SID>PreGetPage(v:count)<CR> 35 nnoremap <buffer> <c-t> :call <SID>PopPage()<CR> 36 nnoremap <buffer> <silent> q :q<CR> 37 endif 38 39 if exists('g:ft_man_folding_enable') && (g:ft_man_folding_enable == 1) 40 setlocal foldmethod=indent foldnestmax=1 foldenable 41 endif 42 43 let b:undo_ftplugin = "setlocal iskeyword<" 44 45endif 46 47if exists(":Man") != 2 48 com -nargs=+ Man call s:GetPage(<f-args>) 49 nmap <Leader>K :call <SID>PreGetPage(0)<CR> 50endif 51 52" Define functions only once. 53if !exists("s:man_tag_depth") 54 55let s:man_tag_depth = 0 56 57let s:man_sect_arg = "" 58let s:man_find_arg = "-w" 59try 60 if !has("win32") && $OSTYPE !~ 'cygwin\|linux' && system('uname -s') =~ "SunOS" && system('uname -r') =~ "^5" 61 let s:man_sect_arg = "-s" 62 let s:man_find_arg = "-l" 63 endif 64catch /E145:/ 65 " Ignore the error in restricted mode 66endtry 67 68func <SID>PreGetPage(cnt) 69 if a:cnt == 0 70 let old_isk = &iskeyword 71 if &ft == 'man' 72 setl iskeyword+=(,) 73 endif 74 let str = expand("<cword>") 75 let &l:iskeyword = old_isk 76 let page = substitute(str, '(*\(\k\+\).*', '\1', '') 77 let sect = substitute(str, '\(\k\+\)(\([^()]*\)).*', '\2', '') 78 if match(sect, '^[0-9 ]\+$') == -1 79 let sect = "" 80 endif 81 if sect == page 82 let sect = "" 83 endif 84 else 85 let sect = a:cnt 86 let page = expand("<cword>") 87 endif 88 call s:GetPage(sect, page) 89endfunc 90 91func <SID>GetCmdArg(sect, page) 92 if a:sect == '' 93 return a:page 94 endif 95 return s:man_sect_arg.' '.a:sect.' '.a:page 96endfunc 97 98func <SID>FindPage(sect, page) 99 let where = system("/usr/bin/man ".s:man_find_arg.' '.s:GetCmdArg(a:sect, a:page)) 100 if where !~ "^/" 101 if matchstr(where, " [^ ]*$") !~ "^ /" 102 return 0 103 endif 104 endif 105 return 1 106endfunc 107 108func <SID>GetPage(...) 109 if a:0 >= 2 110 let sect = a:1 111 let page = a:2 112 elseif a:0 >= 1 113 let sect = "" 114 let page = a:1 115 else 116 return 117 endif 118 119 " To support: nmap K :Man <cword> 120 if page == '<cword>' 121 let page = expand('<cword>') 122 endif 123 124 if sect != "" && s:FindPage(sect, page) == 0 125 let sect = "" 126 endif 127 if s:FindPage(sect, page) == 0 128 echo "\nCannot find a '".page."'." 129 return 130 endif 131 exec "let s:man_tag_buf_".s:man_tag_depth." = ".bufnr("%") 132 exec "let s:man_tag_lin_".s:man_tag_depth." = ".line(".") 133 exec "let s:man_tag_col_".s:man_tag_depth." = ".col(".") 134 let s:man_tag_depth = s:man_tag_depth + 1 135 136 " Use an existing "man" window if it exists, otherwise open a new one. 137 if &filetype != "man" 138 let thiswin = winnr() 139 exe "norm! \<C-W>b" 140 if winnr() > 1 141 exe "norm! " . thiswin . "\<C-W>w" 142 while 1 143 if &filetype == "man" 144 break 145 endif 146 exe "norm! \<C-W>w" 147 if thiswin == winnr() 148 break 149 endif 150 endwhile 151 endif 152 if &filetype != "man" 153 if exists("g:ft_man_open_mode") 154 if g:ft_man_open_mode == "vert" 155 vnew 156 elseif g:ft_man_open_mode == "tab" 157 tabnew 158 else 159 new 160 endif 161 else 162 new 163 endif 164 setl nonu fdc=0 165 endif 166 endif 167 silent exec "edit $HOME/".page.".".sect."~" 168 " Avoid warning for editing the dummy file twice 169 setl buftype=nofile noswapfile 170 171 setl ma nonu nornu nofen 172 silent exec "norm 1GdG" 173 let unsetwidth = 0 174 if empty($MANWIDTH) 175 let $MANWIDTH = winwidth(0) 176 let unsetwidth = 1 177 endif 178 silent exec "r!/usr/bin/man ".s:GetCmdArg(sect, page)." | col -b" 179 if unsetwidth 180 let $MANWIDTH = '' 181 endif 182 " Remove blank lines from top and bottom. 183 while getline(1) =~ '^\s*$' 184 silent keepj norm ggdd 185 endwhile 186 while getline('$') =~ '^\s*$' 187 silent keepj norm Gdd 188 endwhile 189 1 190 setl ft=man nomod 191 setl bufhidden=hide 192 setl nobuflisted 193 setl noma 194endfunc 195 196func <SID>PopPage() 197 if s:man_tag_depth > 0 198 let s:man_tag_depth = s:man_tag_depth - 1 199 exec "let s:man_tag_buf=s:man_tag_buf_".s:man_tag_depth 200 exec "let s:man_tag_lin=s:man_tag_lin_".s:man_tag_depth 201 exec "let s:man_tag_col=s:man_tag_col_".s:man_tag_depth 202 exec s:man_tag_buf."b" 203 exec s:man_tag_lin 204 exec "norm ".s:man_tag_col."|" 205 exec "unlet s:man_tag_buf_".s:man_tag_depth 206 exec "unlet s:man_tag_lin_".s:man_tag_depth 207 exec "unlet s:man_tag_col_".s:man_tag_depth 208 unlet s:man_tag_buf s:man_tag_lin s:man_tag_col 209 endif 210endfunc 211 212endif 213 214" vim: set sw=2 ts=8 noet: 215