dotfiles/plugin/utl_scm.vim

716 lines
28 KiB
VimL

" ------------------------------------------------------------------------------
" File: plugin/utl_scm.vim -- callbacks implementing the different
" schemes
" Part of the Utl plugin, see ./utl.vim
" Author: Stefan Bittner <stb@bf-consulting.de>
" Licence: This program is free software; you can redistribute it and/or
" modify it under the terms of the GNU General Public License.
" See http://www.gnu.org/copyleft/gpl.txt
" Version: utl 3.0a
" ------------------------------------------------------------------------------
" In this file some scheme specific retrieval functions are defined.
" For each scheme one function named Utl_AddrScheme_xxx() is needed.
"
" - If a scheme (i.e. functions) is missing, the caller Utl_processUrl()
" will notice it and show an appropriate message to the user.
"
" - You can define your own functions:
" How to write a Utl_AddrScheme_xxx function (id=implscmfunc)
" ------------------------------------------
" To implement a specific scheme (e.g. `file', `http') you have to write
" write a handler function named `Utl_AddrScheme_<scheme>' which obeys the
" following rules:
"
" - It takes three arguments:
"
" 1. Arg: Absolute URI
" (See <URL:vimhelp:utl-uri-relabs> to get an absolute URI explained). The
" given `auri' will not have a fragment (without #... at the end).
"
" 2. Arg: Fragment
" Where the value will be '<undef>' if there is no fragment. In most cases a
" handler will not actually deal with the fragment but leaves that job for
" standard fragment processing in Utl by returning a non empty list (see
" next). Examples for fragment processing handlers are
" Utl_AddressScheme_http and Utl_AddressScheme_foot.
"
" 3. Arg: display Mode (dispMode)
" Most handlers will ignore this argument. Exception for instance handlers
" which actually display the retrieved or determined file like
" Utl_AddressScheme_foot. If your function is smart it might, if applicable,
" support the special dispMode values copyFileName (see examples in this file).
"
"
" - It then does what ever it wants.
" But what it normally wants is: retrieve, load, query, address the resource
" identified by `auri'.
" - It Returns a list with 0 (empty list), 1 or 2 elements. [id=scm_ret_list]
" (See vimhelp:List if you don't know what a list is in Vim)
"
" * Empty list means: no subsequent processing by Utl.vim
" Examples where this makes sense:
" ° If the retrieve was not successful, or
" ° if handler already cared for displaying the file (e.g. URL
" delegated to external handler)
"
" * 1st list element = file name (called localPath) provided means:
" a) Utl.vim will delegate localPath to the appropriate file type handler
" or display it the file in Vim-Window.
" It also possible, that the localPath is already displayed in this case
" (Utl.vim will check if the localPath corresponds to a buffer name.)
" Note : It is even possible that localPath does not correspond to
" an existing file or to a file at all. Executing a http URL with
" netrw is an example for this, see: ../plugin/utl_rc.vim#http_netrw.
" Netrw uses the URL as buffer name.
" c) Fragment will be processed (if any).
"
" Details :
" ° File name should be a pathname to (an existing) local file or directory.
" Note : the
" ° File name's path separator should be slash (not backslash).
" ° It does not hurt if file is already displayed (an example for this is
" vimhelp scheme).
"
" * 2nd list element = fragment Mode (fragMode). Allowed values:
" `abs', 'rel'. Defaults to `abs' if no 2nd list element.
" `abs': Fragment will be addressed to beginning of file.
" `rel': Fragment will be addressed relative to current cursor position
" (example: Vimhelp scheme).
"
" Specification of 'scheme handler variable interface' (id=spec_ihsv)
" ----------------------------------------------------
"
" - Variable naming: utl_cfg_hdl_scm_<scheme>
"
" - Variables executed by :exe (see <vimhelp::exe>).
" This implies that the variable has to a valid ex command. (to execute more
" than one line of ex commands a function can be called).
"
" - Should handle the actual link, e.g. download the file.
" But it can do whatever it wants :-)
"
" - Input data: scheme specific conversion specifiers should appear in the
" variable. They will be replaced by Utl.vim when executing an URL, e.g %u
" will be replaced by the actual URL. The available conversion specifiers are
" defined at <url:../plugin/utl_rc.vim#r=utl_cfg_hdl_scm_http> for http etc.
"
" - Output data: an optional global list, which is the same as that of the
" handler itself, see <url:../plugin/utl_scm.vim#r=scm_ret_list>. Since the
" variable's value can be any ex command (and, for instance, not always a
" function) a global variable is used:
" g:utl_hdl_scm_ret_list
" This variable will be initialized to an empty list [] by Utl.vim before
" executing the contents of the variable.
"
" - Exception handling: Normally nothing needs to be done in the variable code.
" Utl.vim checks for v:shell_error and v:errmsg after execution. There are
" situation where setting v:errmsg makes sense. The variable might want to
" issue the error message (Utl.vim does not).
"
if exists("loaded_utl_scm") || &cp || v:version < 700
finish
endif
let loaded_utl_scm = 1
let s:save_cpo = &cpo
set cpo&vim
let g:utl__file_scm = expand("<sfile>")
let s:utl_esccmdspecial = '%#' " keep equal to utl.vim#__esc
"-------------------------------------------------------------------------------
" Addresses/retrieves a local file.
"
" - If `auri' gives a query, then the file is executed (it should be an
" executable program) with the query expression passed as arguments
" arguments. The program's output is written to a (tempname constructed)
" result file.
"
" - else, the local file itself is the result file and is returned.
"
fu! Utl_AddressScheme_file(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_file",1,1)
" authority: can be a
" - windows drive, e.g. `c:'
" - server name - interpret URL as a network share
let authority = UtlUri_authority(a:auri)
let path = ''
if authority =~? '^[a-z]:$'
if has("win32") || has("win16") || has("win64") || has("dos32") || has("dos16")
call Utl_trace("- Am under Windows. Server part denotes a Windows drive: `".authority."'")
let path = authority
endif
elseif authority != '<undef>' && authority != ''
if has("win32") || has("win16") || has("win64") || has("dos32") || has("dos16")
call Utl_trace("- Am under Windows. Server part specified: `".authority."',")
call Utl_trace(" will convert to UNC path //server/sharefolder/path.")
let path = '//' . authority
elseif has("unix")
call Utl_trace("- Am under Unix. Server part specified: `".authority."',")
call Utl_trace(" will convert to server:/path")
" don't know if this really makes sense. See <http://en.wikipedia.org/wiki/Path_%28computing%29>
let path = authority . ':'
endif
endif
let path = path . UtlUri_unescape(UtlUri_path(a:auri))
call Utl_trace("- local path constructed from URL: `".path."'")
" Support of tilde ~ notation.
if stridx(path, "~") != -1
let tildeuser = expand( substitute(path, '\(.*\)\(\~[^/]*\)\(.*\)', '\2', "") )
let path = tildeuser . substitute(path, '\(.*\)\(\~[^/]*\)\(.*\)', '\3', "")
call Utl_trace("- found a ~ (tilde) character in path, expand to $HOME in local path:")
let path = Utl_utilBack2FwdSlashes( path )
call Utl_trace(" ".path."'")
endif
if a:dispMode =~ '^copyFileName'
call Utl_trace("- mode is `copyFileName to clipboard': so quit after filename is known now")
call Utl_trace("- end execution of Utl_AddressScheme_file",1,-1)
return [path]
endif
" If Query defined, then execute the Path (id=filequery)
let query = UtlUri_query(a:auri)
if query != '<undef>' " (N.B. empty query is not undef)
call Utl_trace("- URL contains query expression (".query.") - so try to execute path")
" (Should make functions Query_form(), Query_keywords())
if match(query, '&') != -1 " id=query_form
" (application/x-www-form-urlencoded query to be implemented
" e.g. `?foo=bar&otto=karl')
let v:errmsg = 'form encoded query to be implemented'
echohl ErrorMsg | echo v:errmsg | echohl None
elseif match(query, '+') != -1 " id=query_keywords
let query = substitute(query, '+', ' ', 'g')
endif
let query = UtlUri_unescape(query)
" (Whitespace in keywords should now be escaped before handing off to shell)
let cacheFile = ''
" If redirection char '>' at the end:
" Supply a temp file for redirection and execute the program
" synchronously to wait for its output
if strlen(query)!=0 && stridx(query, '>') == strlen(query)-1
call Utl_trace("- query with > character at end: assume output to a temp file and use it as local path")
let cacheFile = Utl_utilBack2FwdSlashes( tempname() )
let cmd = "!".path." ".query." ".cacheFile
call Utl_trace("- trying to execute command `".cmd."'")
exe cmd
" else start it detached
else
if has("win32") || has("win16") || has("win64") || has("dos32") || has("dos16")
let cmd = "!start ".path." ".query
else
let cmd = "!".path." ".query.'&'
endif
call Utl_trace("- trying to execute command `".cmd."'")
exe cmd
endif
if v:shell_error
let v:errmsg = 'Shell Error from execute searchable Resource'
echohl ErrorMsg | echo v:errmsg | echohl None
if cacheFile != ''
call delete(cacheFile)
endif
call Utl_trace("- end execution of Utl_AddressScheme_file",1,-1)
return []
endif
call Utl_trace("- end execution of Utl_AddressScheme_file",1,-1)
if cacheFile == ''
return []
else
return [cacheFile]
endif
endif
call Utl_trace("- end execution of Utl_AddressScheme_file",1,-1)
return [path]
endfu
"-------------------------------------------------------------------------------
"
fu! Utl_AddressScheme_ftp(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_ftp",1,1)
call Utl_trace("- delegating to http scheme handler")
let ret = Utl_AddressScheme_http(a:auri, a:fragment, a:dispMode)
call Utl_trace("- end execution of Utl_AddressScheme_ftp",1,-1)
return ret
endfu
"-------------------------------------------------------------------------------
"
fu! Utl_AddressScheme_https(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_https",1,1)
call Utl_trace("- delegating to http scheme handler")
let ret = Utl_AddressScheme_http(a:auri, a:fragment, a:dispMode)
call Utl_trace("- end execution of Utl_AddressScheme_https",1,-1)
return ret
endfu
"-------------------------------------------------------------------------------
"
fu! Utl_AddressScheme_http(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_http",1,1)
if a:dispMode =~ '^copyFileName'
echohl ErrorMsg | echo "function `copyFileName to clipboard' not possible for scheme `http:'" | echohl None
call Utl_trace("- end execution of Utl_AddressScheme_http",1,-1)
return []
endif
if ! exists('g:utl_cfg_hdl_scm_http') " Entering setup
call Utl_trace("- Vim variable g:utl_cfg_hdl_scm_http does not exist")
echohl WarningMsg
call input("No scheme handler variable g:utl_cfg_hdl_scm_http defined yet. Entering Setup now. <RETURN>")
echohl None
Utl openLink config:#r=utl_cfg_hdl_scm_http split " (recursion, setup)
call Utl_trace("- end execution of Utl_AddressScheme_http",1,-1)
return []
endif
call Utl_trace("- Vim variable g:utl_cfg_hdl_scm_http exists, value=`".g:utl_cfg_hdl_scm_http."'")
let convSpecDict= { 'u': a:auri, 'f': a:fragment, 'd': a:dispMode }
let [errmsg,cmd] = Utl_utilExpandConvSpec(g:utl_cfg_hdl_scm_http, convSpecDict)
if errmsg != ""
echohl ErrorMsg
echo "The content of your Vim variable `".g:utl_cfg_hdl_scm_http."' is invalid and has to be fixed!"
echo "Reason: `".errmsg."'"
echohl None
call Utl_trace("- end execution of Utl_AddressScheme_http",1,-1)
return []
endif
call Utl_trace("- Escape cmdline-special characters (".s:utl_esccmdspecial.") before execution")
" see <URL:vimhelp:cmdline-special>).
let cmd = escape( cmd, s:utl_esccmdspecial)
let g:utl__hdl_scm_ret_list=[]
let v:errmsg = ""
call Utl_trace("- trying to execute command: `".cmd."'")
exe cmd
if v:shell_error || v:errmsg!=""
call Utl_trace("- execution of scm handler returned with v:shell_error or v:errmsg set")
call Utl_trace(" v:shell_error=`".v:shell_error."'")
call Utl_trace(" v:errmsg=`".v:errmsg."'")
call Utl_trace("- end execution of Utl_AddressScheme_http (not successful)",1,-1)
return []
endif
call Utl_trace("- end execution of Utl_AddressScheme_http (successful)",1,-1)
return g:utl__hdl_scm_ret_list
endfu
"-------------------------------------------------------------------------------
" Retrieve file via scp.
"
fu! Utl_AddressScheme_scp(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_scp",1,1)
if a:dispMode =~ '^copyFileName'
echohl ErrorMsg | echo "function `copyFileName name to clipboard' not possible for scheme `scp:'" | echohl None
call Utl_trace("- end execution of Utl_AddressScheme_scp",1,-1)
return []
endif
if ! exists('g:utl_cfg_hdl_scm_scp') " Entering setup
call Utl_trace("- Vim variable g:utl_cfg_hdl_scm_scp does not exist")
echohl WarningMsg
call input("No scheme handler variable g:utl_cfg_hdl_scm_scp defined yet. Entering Setup now. <RETURN>")
echohl None
Utl openLink config:#r=utl_cfg_hdl_scm_scp split " (recursion, setup)
call Utl_trace("- end execution of Utl_AddressScheme_scp",1,-1)
return []
endif
call Utl_trace("- Vim variable g:utl_cfg_hdl_scm_scp exists, value=`".g:utl_cfg_hdl_scm_scp."'")
let convSpecDict= { 'u': a:auri, 'f': a:fragment, 'd': a:dispMode }
let [errmsg,cmd] = Utl_utilExpandConvSpec(g:utl_cfg_hdl_scm_scp, convSpecDict)
if errmsg != ""
echohl ErrorMsg
echo "The content of your Vim variable `".g:utl_cfg_hdl_scm_scp."' is invalid and has to be fixed!"
echo "Reason: `".errmsg."'"
echohl None
call Utl_trace("- end execution of Utl_AddressScheme_scp",1,-1)
return []
endif
call Utl_trace("- Escape cmdline-special characters (".s:utl_esccmdspecial.") before execution")
" see <URL:vimhelp:cmdline-special>).
let cmd = escape( cmd, s:utl_esccmdspecial)
let g:utl__hdl_scm_ret_list=[]
let v:errmsg = ""
call Utl_trace("- trying to execute command: `".cmd."'")
exe cmd
if v:shell_error || v:errmsg!=""
call Utl_trace("- execution of scm handler returned with v:shell_error or v:errmsg set")
call Utl_trace("- end execution of Utl_AddressScheme_scp (not successful)",1,-1)
return []
endif
call Utl_trace("- end execution of Utl_AddressScheme_scp",1,-1)
return g:utl__hdl_scm_ret_list
endfu
"-------------------------------------------------------------------------------
" The mailto scheme.
" It was mainly implemented to serve as a demo. To show that a resource
" needs not to be a file or document.
"
" Returns empty list. But you could create one perhaps containing
" the return receipt, e.g. 'mail sent succesfully'.
"
fu! Utl_AddressScheme_mailto(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_mailto",1,1)
if a:dispMode =~ '^copyFileName'
echohl ErrorMsg | echo "function `copyFileName name to clipboard' not possible for scheme `http:'" | echohl None
call Utl_trace("- end execution of Utl_AddressScheme_http",1,-1)
return []
endif
if ! exists('g:utl_cfg_hdl_scm_mailto') " Entering setup
call Utl_trace("- Vim variable g:utl_cfg_hdl_scm_mailto does not exist")
echohl WarningMsg
call input("No scheme handler variable g:utl_cfg_hdl_scm_mailto defined yet. Entering Setup now. <RETURN>")
echohl None
Utl openLink config:#r=utl_cfg_hdl_scm_mailto split " (recursion, setup)
call Utl_trace("- end execution of Utl_AddressScheme_mailto",1,-1)
return []
endif
call Utl_trace("- Vim variable g:utl_cfg_hdl_scm_mailto exists, value=`".g:utl_cfg_hdl_scm_mailto."'")
let convSpecDict= { 'u': UtlUri_build_2(a:auri,a:fragment) }
let [errmsg,cmd] = Utl_utilExpandConvSpec(g:utl_cfg_hdl_scm_mailto, convSpecDict)
if errmsg != ""
echohl ErrorMsg
echo "The content of your Vim variable `".g:utl_cfg_hdl_scm_mailto."' is invalid and has to be fixed!"
echo "Reason: `".errmsg."'"
echohl None
call Utl_trace("- end execution of Utl_AddressScheme_mailto",1,-1)
return []
endif
call Utl_trace("- Escape cmdline-special characters (".s:utl_esccmdspecial.") before execution")
let cmd = escape( cmd, s:utl_esccmdspecial)
let g:utl__hdl_scm_ret_list=[]
let v:errmsg = ""
call Utl_trace("- trying to execute command: `".cmd."'")
exe cmd
if v:shell_error || v:errmsg!=""
call Utl_trace("- execution of scm handler returned with v:shell_error or v:errmsg set")
call Utl_trace("- end execution of Utl_AddressScheme_mailto (not successful)",1,-1)
return []
endif
call Utl_trace("- end execution of Utl_AddressScheme_mailto",1,-1)
return g:utl__hdl_scm_ret_list
endfu
"-------------------------------------------------------------------------------
" Scheme for accessing Unix Man Pages.
" Useful for commenting program sources.
"
" Example: /* "See <URL:man:fopen#r+> for the r+ argument" */
"
" Possible enhancement: Support sections, i.e. <URL:man:fopen(3)#r+>
"
fu! Utl_AddressScheme_man(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_man",1,1)
if a:dispMode =~ '^copyFileName'
echohl ErrorMsg | echo "function `copyFileName name to clipboard' not possible for scheme `man:'" | echohl None
call Utl_trace("- end execution of Utl_AddressScheme_man",1,-1)
return []
endif
exe "Man " . UtlUri_unescape( UtlUri_opaque(a:auri) )
if v:errmsg =~ '^Sorry, no man entry for'
return []
endif
call Utl_trace("- end execution of Utl_AddressScheme_man",1,-1)
return [Utl_utilBack2FwdSlashes( expand("%:p") ), 'rel']
endfu
"-------------------------------------------------------------------------------
" Scheme for footnotes. Normally by heuristic URL like [1], which is
" transformed into foot:1 before calling this handler. Given
" foot:1 as reference, a referent is searched beginning from
" the end of the current file. The referent can look like:
" [1] or
" [1]:
" where only whitespace can appear in front in the same line. If the reference
" has a fragment, e.g. [1]#string or even an empty fragment, e.g. [1]#
" the value of the footnote is tried to derefence, i.e. automatic forwarding.
"
fu! Utl_AddressScheme_foot(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_foot",1,1)
if a:dispMode =~ '^copyFileName'
echohl ErrorMsg | echo "function `copyFileName name to clipboard' not possible for scheme `foot:'" | echohl None
call Utl_trace("- end execution of Utl_AddressScheme_foot",1,-1)
return []
endif
let opaque = UtlUri_unescape( UtlUri_opaque(a:auri) )
let reftPat = '\c\m^\s*\(\['.opaque.'\]:\?\)'
call Utl_trace("- searching for referent pattern `".reftPat."' bottom up until current line...",0)
let refcLine = line('.') | let refcCol = col('.')
call cursor( line('$'), col('$') )
let reftLine = search(reftPat, 'Wb', refcLine+1)
if reftLine==0
call Utl_trace("not found")
endif
if reftLine==0
call Utl_trace("- now searching for referent pattern `".reftPat."' top down until current line...",0)
call cursor(1, 1)
" (avoid stopline==0, this is special somehow. With -1 instead,
" stopping works in the case of reference in line 1)
let reftLine = search(reftPat, 'Wc', refcLine==1 ? -1 : refcLine-1 )
if reftLine==0
call Utl_trace("not found. Giving up")
call cursor(refcLine, refcCol)
endif
endif
if reftLine==0
let v:errmsg = "Reference has not target in current buffer. Provide another line starting with `[".opaque."]' or `".opaque.".' !"
echohl ErrorMsg | echo v:errmsg | echohl None
return []
endif
call Utl_trace("found, in line `".reftLine."'")
" Feature automatic forwarding
if a:fragment != '<undef>'
call Utl_trace("- fragment is defined, so try dereferencing foonote's content")
call Utl_trace(" by trying to position one character past referent")
" This should exactly fail in case there is no one additional non white character
let l=search(reftPat.'.', 'ce', reftLine)
if l == 0
let v:errmsg = "Cannot dereference footnote: Empty footnote"
echohl ErrorMsg | echo v:errmsg | echohl None
return []
elseif l != reftLine
let v:errmsg = "Cannot dereference footnote: Internal Error: line number mismatch"
echohl ErrorMsg | echo v:errmsg | echohl None
return []
endif
call Utl_trace("- fine, footnote not empty and cursor positioned to start of its")
call Utl_trace(" content (column ".col('.').") and try to get URL from under the cursor")
let uriRef = Utl_getUrlUnderCursor()
if uriRef == ''
let v:errmsg = "Cannot not dereference footnote: No URL under cursor"
echohl ErrorMsg | echo v:errmsg | echohl None
return []
endif
call Utl_trace("- combine URL / URL-reference under cursor with fragment of [] reference")
let uri = UriRef_getUri(uriRef)
let fragmentOfReferent = UriRef_getFragment(uriRef)
if fragmentOfReferent != '<undef>'
call Utl_trace("- discard non empty fragment `".fragmentOfReferent."' of referent")
endif
call Utl('openLink', UtlUri_build_2(uri, a:fragment), a:dispMode)
endif
call Utl_trace("- end execution of Utl_AddressScheme_foot",1,-1)
return []
endif
call Utl_trace("- end execution of Utl_AddressScheme_foot",1,-1)
return [Utl_utilBack2FwdSlashes( expand("%:p") )]
endfu
"-------------------------------------------------------------------------------
" A scheme for quickly going to the setup file utl_rc.vim, e.g.
" :Gu config:
"
fu! Utl_AddressScheme_config(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_config",1,1)
let path = g:utl__file_rc
call Utl_trace("- set local path to equal utl variable g:utl__file_scm: `".path."'")
call Utl_trace("- end execution of Utl_AddressScheme_config",1,-1)
return [ Utl_utilBack2FwdSlashes(path) ]
endfu
"id=vimscript-------------------------------------------------------------------
" A non standard scheme for executing vim commands
" <URL:vimscript:set ts=4>
"
fu! Utl_AddressScheme_vimscript(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_vimscript",1,1)
if a:dispMode =~ '^copyFileName'
echohl ErrorMsg | echo "function `copyFileName name to clipboard' not possible for scheme `vimscript:'" | echohl None
call Utl_trace("- end execution of Utl_AddressScheme_vimscript",1,-1)
return []
endif
let exCmd = UtlUri_unescape( UtlUri_opaque(a:auri) )
call Utl_trace("- executing Vim Ex-command: `:".exCmd."'\n") " CR054_extra_nl
"echo " DBG utl_opt_verbose=`".g:utl_opt_verbose."'"
exe exCmd
"echo " DBG (after) utl_opt_verbose=`".g:utl_opt_verbose."'"
call Utl_trace("- end execution of Utl_AddressScheme_vimscript (successful)",1,-1)
return []
endfu
fu! Utl_AddressScheme_vimtip(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_vimtip",1,1)
let url = "http://vim.sf.net/tips/tip.php?tip_id=". UtlUri_unescape( UtlUri_opaque(a:auri) )
call Utl_trace("- delegating to http scheme handler with URL `".url."'")
let ret = Utl_AddressScheme_http(url, a:fragment, a:dispMode)
call Utl_trace("- end execution of Utl_AddressScheme_vimtip",1,-1)
return ret
endfu
"-------------------------------------------------------------------------------
" A non standard scheme for getting Vim help
"
fu! Utl_AddressScheme_vimhelp(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_vimhelp",1,1)
if a:dispMode =~ '^copyFileName'
echohl ErrorMsg | echo "function `copyFileName name to clipboard' not possible for scheme `vimhelp:'" | echohl None
call Utl_trace("- end execution of Utl_AddressScheme_vimhelp",1,-1)
return []
endif
let exCmd = "help ".UtlUri_unescape( UtlUri_opaque(a:auri) )
call Utl_trace("- executing Vim Ex-command: `:".exCmd."'\n") " CR054_extra_nl
exe exCmd
if v:errmsg =~ '^Sorry, no help for'
call Utl_trace("- end execution of Utl_AddressScheme_vimhelp",1,-1)
return []
endif
call Utl_trace("- end execution of Utl_AddressScheme_vimhelp (successful)",1,-1)
return [ Utl_utilBack2FwdSlashes( expand("%:p") ), 'rel' ]
endfu
"-------------------------------------------------------------------------------
" The mail-scheme.
" This is not an official scheme in the internet. I invented it to directly
" access individual Mails from a mail client.
"
" Synopsis :
" mail://<box-path>?query
"
" where query = [date=]<date>[&from=<from>][&subject=<subject>]
"
" Examples :
" <url:mail:///Inbox?24.07.2007 13:23>
" <url:mail://archive/Inbox?24.07.2007 13:23>
"
fu! Utl_AddressScheme_mail(auri, fragment, dispMode)
call Utl_trace("- start execution of Utl_AddressScheme_mail",1,1)
if a:dispMode =~ '^copyFileName'
echohl ErrorMsg | echo "function `copyFileName name to clipboard' not possible for scheme `mail:'" | echohl None
call Utl_trace("- end execution of Utl_AddressScheme_mail",1,-1)
return []
endif
if ! exists('g:utl_cfg_hdl_scm_mail') " Entering setup
call Utl_trace("- Vim variable g:utl_cfg_hdl_scm_mail does not exist")
echohl WarningMsg
call input("No scheme handler variable g:utl_cfg_hdl_scm_mail defined yet. Entering Setup now. <RETURN>")
echohl None
Utl openLink config:#r=utl_cfg_hdl_scm_mail split
call Utl_trace("- end execution of Utl_AddressScheme_mail",1,-1)
return []
endif
call Utl_trace("- Vim variable g:utl_cfg_hdl_scm_mail exists, value=`".g:utl_cfg_hdl_scm_mail."'")
let authority = UtlUri_unescape( UtlUri_authority(a:auri) )
let path = UtlUri_unescape( UtlUri_path(a:auri) )
let query = UtlUri_unescape( UtlUri_query(a:auri) )
call Utl_trace("- URL path components: authority=`".authority."', path=`".path."'" )
" Parse query expression
if query == '<undef>' || query == ""
let v:errmsg = 'Query expression missing'
echohl ErrorMsg | echo v:errmsg | echohl None
return []
endif
let q_from = ''
let q_subject = ''
let q_date = ''
while 1
let pos = stridx(query, '&')
if pos == -1
let entry = query
else
let entry = strpart(query, 0, pos)
let query = strpart(query, pos+1)
endif
if entry =~ '^from='
let q_from = substitute(entry, '.*=', '', '')
elseif entry =~ '^subject='
let q_subject = substitute(entry, '.*=', '', '')
elseif entry =~ '^date='
let q_date = substitute(entry, '.*=', '', '')
else
let q_date = entry
endif
if pos == -1
break
endif
endwhile
call Utl_trace("- URL query attributes: date=`".q_date."', subject=`".q_subject."', from=`".q_from."'" )
let convSpecDict= { 'a': authority, 'p': path, 'd': q_date, 'f': q_from, 's': q_subject }
let [errmsg,cmd] = Utl_utilExpandConvSpec(g:utl_cfg_hdl_scm_mail, convSpecDict)
if errmsg != ""
echohl ErrorMsg
echo "The content of your Vim variable g:utl_cfg_hdl_scm_mail=".g:utl_cfg_hdl_scm_mail."' is invalid and has to be fixed!"
echo "Reason: `".errmsg."'"
echohl None
call Utl_trace("- end execution of Utl_AddressScheme_mail (not successful)",1,-1)
return []
endif
call Utl_trace("- Escape cmdline-special characters (".s:utl_esccmdspecial.") before execution")
let cmd = escape( cmd, s:utl_esccmdspecial)
let g:utl__hdl_scm_ret_list=[]
let v:errmsg = ""
call Utl_trace("- trying to execute command `".cmd."'")
exe cmd
if v:shell_error || v:errmsg!=""
call Utl_trace("- execution of scm handler returned with v:shell_error or v:errmsg set")
call Utl_trace("- end execution of Utl_AddressScheme_mail (not successful)",1,-1)
return []
endif
call Utl_trace("- end execution of Utl_AddressScheme_mail (successful)",1,-1)
return g:utl__hdl_scm_ret_list
endfu
let &cpo = s:save_cpo