diff --git a/autoload/manpageview.vim b/autoload/manpageview.vim new file mode 100644 index 0000000..560cd76 --- /dev/null +++ b/autoload/manpageview.vim @@ -0,0 +1,1216 @@ +" manpagevim : extra commands for manual-handling +" Author: Charles E. Campbell, Jr. +" Date: Aug 06, 2012 +" Version: 25a ASTRO-ONLY +" +" Please read :help manpageview for usage, options, etc +" +" GetLatestVimScripts: 489 1 :AutoInstall: manpageview.vim + +" --------------------------------------------------------------------- +" Load Once: {{{1 +if &cp || exists("g:loaded_manpageview") + finish +endif +let g:loaded_manpageview = "v25a" +if v:version < 702 + echohl WarningMsg + echo "***warning*** this version of manpageview needs vim 7.2 or later" + echohl Normal + finish +endif +let s:keepcpo= &cpo +set cpo&vim +"DechoTabOn + +" --------------------------------------------------------------------- +" Set up default manual-window opening option: {{{1 +if !exists("g:manpageview_winopen") + let g:manpageview_winopen= "hsplit" +elseif g:manpageview_winopen == "only" && !has("mksession") + echomsg "***g:manpageview_winopen<".g:manpageview_winopen."> not supported w/o +mksession" + let g:manpageview_winopen= "hsplit" +endif + +" --------------------------------------------------------------------- +" Sanity Check: {{{1 +if !exists("*shellescape") + fun! manpageview#ManPageView(viamap,bknum,...) range + echohl ERROR + echo "You need to upgrade your vim to v7.1 or later (manpageview uses the shellescape() function)" + endfun + finish +endif + +" --------------------------------------------------------------------- +" Default Variable Values: {{{1 +if !exists("g:manpageview_iconv") + if executable("iconv") + let s:iconv= "iconv -c" + else + let s:iconv= "" + endif +else + let s:iconv= g:manpageview_iconv +endif +if s:iconv != "" + let s:iconv= "| ".s:iconv +endif +if !exists("g:manpageview_pgm") && executable("man") + let g:manpageview_pgm= "man" +endif +if !exists("g:manpageview_multimanpage") + let g:manpageview_multimanpage= 1 +endif +if !exists("g:manpageview_options") + let g:manpageview_options= "" +endif +if !exists("g:manpageview_pgm_i") && executable("info") +" DechoWF "installed info help support via manpageview" + let g:manpageview_pgm_i = "info" + let g:manpageview_options_i = "--output=-" + let g:manpageview_syntax_i = "info" + let g:manpageview_K_i = "ManPageInfo(0)" + let g:manpageview_init_i = "call ManPageInfoInit()" + + let s:linkpat1 = '\*[Nn]ote \([^():]*\)\(::\|$\)' " note + let s:linkpat2 = '^\* [^:]*: \(([^)]*)\)' " filename + let s:linkpat3 = '^\* \([^:]*\)::' " menu + let s:linkpat4 = '^\* [^:]*:\s*\([^.]*\)\.$' " index +endif +if !exists("g:manpageview_pgm_pl") && executable("perldoc") +" DechoWF "installed perl help support via manpageview" + let g:manpageview_pgm_pl = "perldoc" + let g:manpageview_options_pl = ";-f;-q" +endif +if !exists("g:manpageview_pgm_php") && (executable("links") || executable("elinks")) +" DechoWF "installed php help support via manpageview" + let g:manpageview_pgm_php = (executable("links")? "links" : "elinks")." -dump http://www.php.net/" + let g:manpageview_syntax_php = "manphp" + let g:manpageview_nospace_php = 1 + let g:manpageview_K_php = "manpageview#ManPagePhp()" +endif +if !exists("g:manpageview_pgm_gl") && (executable("links") || executable("elinks")) + let g:manpageview_pgm_gl = (executable("links")? "links" : "elinks")." -dump http://www.opengl.org/sdk/docs/man/xhtml/" + let g:manpageview_syntax_gl = "mangl" + let g:manpageview_nospace_gl = 1 + let g:manpageview_K_gl = "manpageview#ManPagePhp()" + let g:manpageview_sfx_gl = ".xml" +endif +if !exists("g:manpageview_pgm_py") && executable("pydoc") +" DechoWF "installed python help support via manpageview" + let g:manpageview_pgm_py = "pydoc" + let g:manpageview_K_py = "manpageview#ManPagePython()" +endif +if exists("g:manpageview_hypertext_tex") && !exists("g:manpageview_pgm_tex") && (executable("links") || executable("elinks")) +" DechoWF "installed tex help support via manpageview" + let g:manpageview_pgm_tex = (executable("links")? "links" : "elinks")." ".g:manpageview_hypertext_tex + let g:manpageview_lookup_tex = "manpageview#ManPageTexLookup" + let g:manpageview_K_tex = "manpageview#ManPageTex()" +endif +if has("win32") && !exists("g:manpageview_rsh") +" DechoWF "installed rsh help support via manpageview" + let g:manpageview_rsh= "rsh" +endif + +" ===================================================================== +" Functions: {{{1 + +" --------------------------------------------------------------------- +" manpageview#ManPageView: view a manual-page, accepts three formats: {{{2 +" :call manpageview#ManPageView(viamap,"topic") +" :call manpageview#ManPageView(viamap,booknumber,"topic") +" :call manpageview#ManPageView(viamap,"topic(booknumber)") +" +" viamap=0: called via a command +" viamap=1: called via a map +" bknum : if non-zero, then its the book number of the manpage (default=1) +" if zero, but viamap==1, then use lastline-firstline+1 +fun! manpageview#ManPageView(viamap,bknum,...) range +" call Dfunc("manpageview#ManPageView(viamap=".a:viamap." bknum=".a:bknum.") a:0=".a:0. " version=".g:loaded_manpageview) + set lz + let manpageview_fname = expand("%") + let bknum = a:bknum + call s:MPVSaveSettings() +" if exists("g:manpageview_winopen")|call Decho("g:manpageview_winopen<".g:manpageview_winopen.">")|endif + + " fix topic {{{3 + if a:0 > 0 +" DechoWF "(fix topic) case a:0 > 0: (a:1<".a:1.">)" + if &ft != "info" + if a:0 == 2 && bknum > 0 + let bknum = bknum.a:1 + let topic = a:2 + else + let topic= substitute(a:1,'[^-a-zA-Z.0-9_:].*$','','') +" DechoWF "a:1<".a:1."> topic<".topic."> (after fix)" + endif + else + let topic= a:1 + endif + if topic =~ '($' + let topic= substitute(topic,'($','','') + endif +" DechoWF "topic<".topic."> bknum=".bknum." (after fix topic)" + endif + + if !exists("topic") || topic == "" + echohl WarningMsg + echo "***warning*** missing topic" + echohl None + sleep 2 +" call Dret("manpageview#ManPageView : missing topic") + return + endif + + " interpret the input arguments - set up manpagetopic and manpagebook {{{3 + if a:0 > 0 && strpart(topic,0,1) == '"' +" DechoWF "(interpret input arguments) topic<".topic.">" + " merge quoted arguments: Man "some topic here" +" DechoWF '(merge quoted args) case a:0='.a:0." strpart(".topic.",0,1)<".strpart(topic,0,1) + let manpagetopic = strpart(topic,1) + if manpagetopic =~ '($' + let manpagetopic= substitute(manpagetopic,'($','','') + endif +" DechoWF "manpagetopic<".manpagetopic.">" + if bknum != "" + let manpagebook= string(bknum) + else + let manpagebook= "" + endif +" DechoWF "manpagebook<".manpagebook.">" + let i= 2 + while i <= a:0 + let manpagetopic= manpagetopic.' '.a:{i} + if a:{i} =~ '"$' + break + endif + let i= i + 1 + endwhile + let manpagetopic= strpart(manpagetopic,0,strlen(manpagetopic)-1) +" DechoWF "merged quoted arguments<".manpagetopic.">" + + elseif a:0 == 0 +" DechoWF 'case a:0==0' + if exists("g:ManCurPosn") && has("mksession") +" DechoWF "(ManPageView) a:0=".a:0." g:ManCurPosn exists" + call s:ManRestorePosn() + else + echomsg "***usage*** :Man topic -or- :Man topic nmbr" +" DechoWF "(ManPageView) a:0=".a:0." g:ManCurPosn doesn't exist" + endif + call s:MPVRestoreSettings() +" call Dret("manpageview#ManPageView") + return + + elseif a:0 == 1 + " ManPageView("topic") -or- ManPageView("topic(booknumber)") +" DechoWF "case a:0==1 (topic -or- topic(booknumber))" +" DechoWF "(ManPageView) a:0=".a:0." topic<".topic.">" + if a:1 =~ "(" + " ManPageView("topic(booknumber)") +" DechoWF "a:1<".a:1."> has parenthesis: ft<".&ft."> (may be topic(booknumber) )" + let a1 = substitute(a:1,'[-+*/;,.:]\+$','','e') +" DechoWF "has parenthesis: a:1<".a:1."> a1<".a1.">" + if &ft == 'sh' +" DechoWF "case ft=".&ft.": has parenthesis: but ft isn't " + let manpagetopic = substitute(a:1,'(.*$','','') + let manpagebook = "" + elseif &ft != 'man' +" DechoWF "case ft=".&ft.": has parenthesis: but ft isn't " + let manpagetopic = substitute(a:1,'(.*$','','') + if a:viamap == 0 + " called via a command + let manpagebook = substitute(a1,'^.*(\([^)]\+\))\=.*$','\1','e') + else + " called via a map + let manpagebook = "3" +" DechoWF "(ManPageView) case ft=".&ft.": setting manpagebook to ".manpagebook + endif + elseif a1 =~ '[,"]' +" DechoWF "case ft=".&ft." and a1=".a1.": has parenthesis: a:1 matches [,"]' + let manpagetopic= substitute(a1,'[(,"].*$','','e') + else +" DechoWF "case ft=".&ft." and a1=".a1.": has parenthesis: a:1 does not match [,"]' + let manpagetopic= substitute(a1,'^\(.*\)(\d\w*),\=.*$','\1','e') + let manpagebook = substitute(a1,'^.*(\(\d\w*\)),\=.*$','\1','e') + endif + if manpagetopic =~ '($' +" DechoWF 'has parenthesis: manpagetopic<'.a:1.'> matches "($"' + let manpagetopic= substitute(manpagetopic,'($','','') + endif + if manpagebook =~ '($' +" DechoWF 'has parenthesis: manpagebook<'.manpagebook.'> matches "($"' + let manpagebook= "" + endif + if manpagebook =~ '\d\+\a\+' + let manpagebook= substitute(manpagebook,'\a\+','','') + endif + + else + " ManPageView(booknumber,"topic") +" DechoWF '(ManPageView(booknumber,"topic")) case a:0='.a:0 + let manpagetopic= topic + if a:viamap == 1 && a:lastline > a:firstline + let manpagebook= string(a:lastline - a:firstline + 1) + elseif a:bknum > 0 + let manpagebook= string(a:bknum) + else + let manpagebook= "" + endif + endif + + else + " 3 abc -or- abc 3 +" DechoWF "(3 abc -or- abc 3) case a:0=".a:0 + if topic =~ '^\d\+' +" DechoWF "case 1: topic =~ ^\d\+" + let manpagebook = topic + let manpagetopic= a:2 + elseif a:2 =~ '^\d\+$' +" DechoWF "case 2: topic =~ \d\+$" + let manpagebook = a:2 + let manpagetopic= topic + elseif topic == "-k" +" DechoWF "case 3: topic == -k" +" DechoWF "user requested man -k" + let manpagetopic = a:2 + let manpagebook = "-k" + elseif bknum != "" +" DechoWF 'case 4: bknum != ""' + let manpagetopic = topic + let manpagebook = bknum + else + " default: topic book +" DechoWF "default case: topic book" + let manpagebook = a:2 + let manpagetopic= topic + endif + endif +" DechoWF "manpagetopic<".manpagetopic.">" +" DechoWF "manpagebook <".manpagebook.">" + + " for the benefit of associated routines (such as InfoIndexLink()) {{{3 + let s:manpagetopic = manpagetopic + let s:manpagebook = manpagebook + + " default program g:manpageview_pgm=="man" may be overridden {{{3 + " if an extension is matched + if exists("g:manpageview_pgm") + let pgm = g:manpageview_pgm + else + let pgm = "" + endif + let ext = "" + if manpagetopic =~ '\.' + let ext = substitute(manpagetopic,'^.*\.','','e') + endif + if exists("g:manpageview_pgm_gl") && manpagetopic =~ '^gl' + let ext = "gl" + endif + + " infer the appropriate extension based on the filetype {{{3 + if ext == "" +" DechoWF "attempt to infer on filetype<".&ft.">" + + " filetype: vim + if &ft == "vim" + if g:manpageview_winopen == "only" + " OMan + exe "help ".fnameescape(manpagetopic) + only + elseif g:manpageview_winopen == "vsplit" + " VMan + exe "vert help ".fnameescape(manpagetopic) + elseif g:manpageview_winopen == "vsplit=" + " VEMan + exe "vert help ".fnameescape(manpagetopic) + wincmd = + elseif g:manpageview_winopen == "hsplit=" + " HEMan + exe "help ".fnameescape(manpagetopic) + wincmd = + elseif g:manpageview_winopen == "tab" + " TMan + tabnew + exe "help ".fnameescape(manpagetopic) + only + else + " Man + exe "help ".fnameescape(manpagetopic) + endif +" call Dret("manpageview#ManPageView") + return + + " filetype: perl + elseif &ft == "perl" || &ft == "perldoc" + let ext = "pl" + + " filetype: php + elseif &ft == "php" || &ft == "manphp" + let ext = "php" + + " filetype: python + elseif &ft == "python" || &ft == "pydoc" + let ext = "py" + + " filetype: tex + elseif &ft == "tex" + let ext= "tex" + endif + + endif +" DechoWF "ext<".ext.">" + + " elide extension from manpagetopic {{{3 + if exists("g:manpageview_pgm_{ext}") + let pgm = g:manpageview_pgm_{ext} + let manpagetopic = substitute(manpagetopic,'.'.ext.'$','','') + endif + let nospace= exists("g:manpageview_nospace_{ext}")? g:manpageview_nospace_{ext} : 0 +" DechoWF "pgm<".pgm."> manpagetopic<".manpagetopic."> (after elision of extension)" + + " special exceptions: + if ext =~ 'man' + " for man: allow ".man" extension to mean we want regular manpages even while in a supported filetype + let pgm = ext + let manpagetopic = substitute(manpagetopic,'.'.ext.'$','','') + let ext = "" + elseif a:viamap == 0 && ext == "i" + " special exception for info {{{3 + let s:manpageview_pfx_i = "(".manpagetopic.")" + let manpagetopic = "Top" +" DechoWF "top-level info: manpagetopic<".manpagetopic.">" + endif + + if exists("s:manpageview_pfx_{ext}") && s:manpageview_pfx_{ext} != "" + let manpagetopic= s:manpageview_pfx_{ext}.manpagetopic + elseif exists("g:manpageview_pfx_{ext}") && g:manpageview_pfx_{ext} != "" + " prepend any extension-specified prefix to manpagetopic + let manpagetopic= g:manpageview_pfx_{ext}.manpagetopic + endif + + if exists("g:manpageview_sfx_{ext}") && g:manpageview_sfx_{ext} != "" + " append any extension-specified suffix to manpagetopic + let manpagetopic= manpagetopic.g:manpageview_sfx_{ext} + endif + + if exists("g:manpageview_K_{ext}") && g:manpageview_K_{ext} != "" + " override usual K map +" DechoWF "change K map to call ".g:manpageview_K_{ext} + exe "nmap K :call ".g:manpageview_K_{ext}."\" + endif + + if exists("g:manpageview_syntax_{ext}") && g:manpageview_syntax_{ext} != "" + " allow special-suffix extensions to optionally control syntax highlighting + let manpageview_syntax= g:manpageview_syntax_{ext} + else + let manpageview_syntax= "man" + endif + + " support for searching for options from conf pages {{{3 + if manpagebook == "" && manpageview_fname =~ '\.conf$' + let manpagesrch = '^\s\+'.manpagetopic + let manpagetopic= manpageview_fname + endif +" DechoWF "manpagebook<".manpagebook."> manpagetopic<".manpagetopic.">" + + " it was reported to me that some systems change display sizes when a {{{3 + " filtering command is used such as :r! . I record the height&width + " here and restore it afterwards. To make use of it, put + " let g:manpageview_dispresize= 1 + " into your <.vimrc> + let dwidth = &cwh + let dheight = &co +" DechoWF "dwidth=".dwidth." dheight=".dheight + + " Set up the window for the manpage display (only hsplit split etc) {{{3 +" DechoWF "set up window for manpage display (g:manpageview_winopen<".g:manpageview_winopen."> ft<".&ft."> manpageview_syntax<".manpageview_syntax.">)" + if g:manpageview_winopen == "only" + " OMan +" DechoWF "only mode" + silent! windo w + if !exists("g:ManCurPosn") && has("mksession") + call s:ManSavePosn() + endif + " Record current file/position/screen-position + if &ft != manpageview_syntax + silent! only! + endif + enew! + + elseif g:manpageview_winopen == "hsplit" + " HMan +" DechoWF "hsplit mode" + if &ft != manpageview_syntax + wincmd s + enew! + wincmd _ + 3wincmd - + else + enew! + endif + + elseif g:manpageview_winopen == "hsplit=" + " HEMan +" DechoWF "hsplit= mode" + if &ft != manpageview_syntax + wincmd s + endif + enew! + + elseif g:manpageview_winopen == "vsplit" + " VMan +" DechoWF "vsplit mode" + if &ft != manpageview_syntax + wincmd v + enew! + wincmd | + 20wincmd < + else + enew! + endif + + elseif g:manpageview_winopen == "vsplit=" + " VEMan +" DechoWF "vsplit= mode" + if &ft != "man" + wincmd v + endif + enew! + + elseif g:manpageview_winopen == "tab" + " TMan +" DechoWF "tab mode" + if &ft != "man" + tabnew + endif + + elseif g:manpageview_winopen == "reuse" + " RMan +" DechoWF "reuse mode" + " determine if a Manpageview window already exists + let g:manpageview_manwin= -1 + exe "windo if &ft == '".fnameescape(manpageview_syntax)."'|let g:manpageview_manwin= winnr()|endif" + if g:manpageview_manwin != -1 + " found a pre-existing Manpageview window, re-using it + exe fnameescape(g:manpageview_manwin)."wincmd w" + enew! + elseif &l:mod == 1 + " file has been modified, would be lost if we re-used window. Use hsplit instead. + wincmd s + enew! + wincmd _ + 3wincmd - + elseif &ft != manpageview_syntax + " re-using current window (but hiding it first) + setlocal bh=hide + enew! + else + enew! + endif + else + echohl ErrorMsg + echo "***sorry*** g:manpageview_winopen<".g:manpageview_winopen."> not supported" + echohl None + sleep 2 + call s:MPVRestoreSettings() +" call Dret("manpageview#ManPageView : manpageview_winopen<".g:manpageview_winopen."> not supported") + return + endif + + " let manpages format themselves to specified window width + " this setting probably only affects the linux "man" command. + let $MANWIDTH= winwidth(0) + + " add some maps for multiple manpage handling {{{3 + " (some manpages on some systems have multiple NAME... topics provided on a single manpage) + " The code here has PageUp/Down typically do a ctrl-f, ctrl-b; however, if there are multiple + " topics on the manpage, then PageUp/Down will go to the previous/succeeding topic, instead. + if g:manpageview_multimanpage + let swp = SaveWinPosn(0) + let nameline1 = search("^NAME$",'Ww') + let nameline2 = search("^NAME$",'Ww') + sil! call RestoreWinPosn(swp) + if nameline1 != nameline2 && nameline1 >= 1 && nameline2 >= 1 +" DechoWF "mapping PageUp/Down to go to preceding/succeeding multimanpage-topic" + nno