From 77607f635ab30822336a82c0e3293b7302173612 Mon Sep 17 00:00:00 2001 From: EinfachToll Date: Wed, 29 Apr 2015 14:59:10 +0200 Subject: [PATCH 1/4] slightly change the semantics of file: and local: scheme --- autoload/vimwiki/base.vim | 15 ++--- autoload/vimwiki/html.vim | 23 +++++--- doc/vimwiki.txt | 115 ++++++++++++++++++-------------------- plugin/vimwiki.vim | 8 ++- 4 files changed, 83 insertions(+), 78 deletions(-) diff --git a/autoload/vimwiki/base.vim b/autoload/vimwiki/base.vim index 1b7a337..deb0e9c 100644 --- a/autoload/vimwiki/base.vim +++ b/autoload/vimwiki/base.vim @@ -270,7 +270,6 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{ \ 'scheme': '', \ 'filename': '', \ 'anchor': '', - \ 'relative': 0, \ } @@ -303,12 +302,14 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{ " check if absolute or relative path if is_wiki_link && link_text[0] == '/' - let link_text = link_text[1:] - let link_infos.relative = 0 + if link_text != '/' + let link_text = link_text[1:] + endif + let is_relative = 0 elseif !is_wiki_link && vimwiki#path#is_absolute(link_text) - let link_infos.relative = 0 + let is_relative = 0 else - let link_infos.relative = 1 + let is_relative = 1 let root_dir = fnamemodify(source_file, ':p:h') . '/' endif @@ -321,7 +322,7 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{ return link_infos endif - if !link_infos.relative || link_infos.index != source_wiki + if !is_relative || link_infos.index != source_wiki let root_dir = VimwikiGet('path', link_infos.index) endif @@ -345,7 +346,7 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{ \ link_text . \ VimwikiGet('ext', link_infos.index) elseif (link_infos.scheme ==# 'file' || link_infos.scheme ==# 'local') - \ && link_infos.relative + \ && is_relative let link_infos.filename = simplify(root_dir . link_text) else " absolute file link " collapse repeated leading "/"'s within a link diff --git a/autoload/vimwiki/html.vim b/autoload/vimwiki/html.vim index bc35dfc..60f77f9 100644 --- a/autoload/vimwiki/html.vim +++ b/autoload/vimwiki/html.vim @@ -380,12 +380,16 @@ function! s:tag_wikiincl(value) "{{{ echom string(link_infos) endif - let url = link_infos.filename - - " strip the .html extension when we have wiki links, so that the user can - " simply write {{image.png}} to include an image from the wiki directory - if link_infos.scheme =~# '\mwiki\d\+\|diary' - let url = fnamemodify(url, ':r') + if link_infos.scheme =~# '\mlocal\|wiki\d\+\|diary' + let url = vimwiki#path#relpath(fnamemodify(s:current_html_file, ':h'), + \ link_infos.filename) + " strip the .html extension when we have wiki links, so that the user can + " simply write {{image.png}} to include an image from the wiki directory + if link_infos.scheme =~# '\mwiki\d\+\|diary' + let url = fnamemodify(url, ':r') + endif + else + let url = link_infos.filename endif let url = escape(url, '#') @@ -412,16 +416,17 @@ function! s:tag_wikilink(value) "{{{ if line == '' let link_infos = vimwiki#base#resolve_link(url, s:current_wiki_file) - if link_infos.scheme ==# 'file' || link_infos.scheme ==# 'local' + if link_infos.scheme ==# 'file' " external file links are always absolute let html_link = link_infos.filename + elseif link_infos.scheme ==# 'local' + let html_link = vimwiki#path#relpath(fnamemodify(s:current_html_file, + \ ':h'), link_infos.filename) else " wiki links are always relative to the current file - echom link_infos.filename fnamemodify(s:current_wiki_file, ':h') fnamemodify(link_infos.filename, ':r') let html_link = vimwiki#path#relpath( \ fnamemodify(s:current_wiki_file, ':h'), \ fnamemodify(link_infos.filename, ':r')) - echom html_link if html_link !~ '\m/$' let html_link .= '.html' endif diff --git a/doc/vimwiki.txt b/doc/vimwiki.txt index 0c7f2d3..2e40b71 100644 --- a/doc/vimwiki.txt +++ b/doc/vimwiki.txt @@ -755,7 +755,7 @@ To jump from that file back to the index file, use this link: > [[../index]] or: > [[/index]] -The latter works, because wiki links starting with "/" are considered to be +The latter works because wiki links starting with "/" are considered to be absolute to the wiki root directory, that is, the link [[/index]] always opens the file /path/to/your/wiki/index.wiki, no matter in which subdirectory you are currently in. @@ -776,6 +776,13 @@ Raw URLs are also supported: > mailto:habamax@gmail.com ftp://vim.org +External files~ + +You can open arbitrary files like this: > + [[file:/important/documents/document.pdf]] + +See |vimwiki-syntax-schemes|. + Anchors~ A URL can be followed by a '#' and the name of an anchor. When opening a @@ -826,11 +833,6 @@ as a wiki page. To scan the page for new or changed definitions for reference-links, simply re-open the page ":e". -Typing wikilinks can be simplified by using Vim's omni completion (see -|compl-omni|) like so: > - [[ind -which opens up a popup menu with all the wiki files starting with "ind". - ------------------------------------------------------------------------------ 5.3. Headers *vimwiki-syntax-headers* @@ -1114,24 +1116,24 @@ E.g.: > ------------------------------------------------------------------------------ 5.12. Schemes *vimwiki-syntax-schemes* -In addition to standard web schemes (e.g. `http:`, `https:`, `ftp:`, etc.) a -number of special schemes are supported: "wiki#:", "local:", "diary:", -"file:", and schemeless. +In addition to standard web schemes (e.g. "http:", "https:", "ftp:", etc.) a +number of special schemes are supported: "wikiX:", "diary:", "file:", "local:" +and schemeless. -While "wiki:#", "diary" and schemeless links are automatically opened in Vi, +While "wikiX", "diary" and schemeless links are automatically opened in Vim, all other links are opened with the system command. To customize this behavior, see |VimwikiLinkHandler|. Interwiki:~ If you maintain more than one wiki, you can create interwiki links between them -by adding a numbered prefix "wiki#:" in front of a link: > - [[wiki#:This is a link]] +by adding a numbered prefix "wikiX:" in front of a link: > + [[wiki1:This is a link]] or: > - [[wiki#:This is a link source|Description of the link]] + [[wiki1:This is a link source|Description of the link]] -The number "#", in the range 0..N-1, identifies the destination wiki in -|g:vimwiki_list|. +The number behind "wiki" is in the range 0..N-1 and identifies the destination +wiki in |g:vimwiki_list|. Diary:~ @@ -1142,32 +1144,27 @@ This scheme precludes explicit inclusion of |vimwiki-option-diary_rel_path|, and is most useful on subwiki pages to avoid links such as: > [[../../diary/2012-03-05]] -Local:~ +External files:~ -A local resource that is not a wiki page may be specified with a path relative -to the current page: > - [[local:../assets/data.csv|data (CSV)]] - -When followed or converted to HTML, extensions of local-scheme links are not -modified. - -File:~ - -The file scheme allows you to directly link to arbitray resources using -absolute paths and extensions: > - [[file:///home/somebody/a/b/c/music.mp3]] +The file and local schemes allow you to directly link to arbitray resources +using absolute or relative paths with extension: > + [[file:/home/somebody/a/b/c/music.mp3]] [[file:C:/Users/somebody/d/e/f/music.mp3]] + [[file:~/a/b/c/music.mp3]] + [[file:../assets/data.csv|data (CSV)]] + [[local:C:/Users/somebody/d/e/f/music.mp3]] + +In Vim, "file:" and "local:" behave the same, i.e. you can use them with both +relative and absolute links. When converted to HTML, however, "file:" links +will become absolute links, while "local:" links become relative to the HTML +output directory. The latter can be useful if you copy your HTML files to +another computer. +To customize the HTML conversion of links, see |VimwikiLinkConverter|. Schemeless:~ -Schemeless URLs, which are the default, are treated internally as "wiki#:" -URLs in all respects except when converted to Html. - -Schemeless links convert to plain relative path URLs, nearly verbatim: > - relpath/wikipage.html - -The "wiki#:", "local:", and "diary:" schemes use absolute paths as URLs: > - file:///abs_path_to_html#/relpath/wikipage.html +Schemeless URLs, which are the default, are treated internally as "wikiX:" +URLs in all respects, where X is the number of the current wiki. When |vimwiki-option-maxhi| equals 1, a distinct highlighting style is used to identify schemeless links whose targets are not found. All other links appear @@ -1188,7 +1185,7 @@ relative, and need not end with an extension. The primary purpose for wiki-include links is to include images. Transclude from a local URL: > - {{local:../../images/vimwiki_logo.png}} + {{file:../../images/vimwiki_logo.png}} or from a universal URL: > {{http://vimwiki.googlecode.com/hg/images/vimwiki_logo.png}} @@ -2228,9 +2225,9 @@ wiki-include link or a weblink, is first passed to |VimwikiLinkHandler| to see if it can be handled. The return value 1/0 indicates success. If the link is not handled successfully, the behavior of Vimwiki depends on -the scheme. Wiki:, diary: or schemeless links are opened in Vim. All others, -including local: and file: schemes, are opened with a system default handler; -i.e. Linux (!xdg-open), Mac (!open), and Windows (!start). +the scheme. "wiki:", "diary:" or schemeless links are opened in Vim. "file:" +and "local:" links are opened with a system default handler; i.e. Linux +(!xdg-open), Mac (!open), and Windows (!start). You can redefine |VimwikiLinkHandler| function to do something else: > @@ -2245,34 +2242,31 @@ You can redefine |VimwikiLinkHandler| function to do something else: > return 0 endfunction -A second example handles two new schemes, 'vlocal:' and 'vfile:', which behave -similar to 'local:' and 'file:' schemes, but are always opened with Vim: > +A second example handles a new scheme, 'vfile:', which behaves similar to +'file:', but the files are always opened with Vim: > - function! VimwikiLinkHandler(link) "{{{ Use Vim to open links with the - " 'vlocal:' or 'vfile:' schemes. E.g.: - " 1) [[vfile:///~/Code/PythonProject/abc123.py]], and - " 2) [[vlocal:./|Wiki Home]] + function! VimwikiLinkHandler(link) + " Use Vim to open external files with the 'vfile:' scheme. E.g.: + " 1) [[vfile:~/Code/PythonProject/abc123.py]] + " 2) [[vfile:./|Wiki Home]] let link = a:link - if link =~ "vlocal:" || link =~ "vfile:" + if link =~ "vfile:" let link = link[1:] else return 0 endif - let [idx, scheme, path, subdir, lnk, ext, url, anchor] = - \ vimwiki#base#resolve_scheme(link, 0) - if g:vimwiki_debug - echom 'LinkHandler: idx='.idx.', scheme=[v]'.scheme.', path='.path. - \ ', subdir='.subdir.', lnk='.lnk.', ext='.ext.', url='.url. - \ ', anchor='.anchor - endif - if url == '' && anchor == '' + let link_infos = vimwiki#base#resolve_link(link) + if link_infos.filename == '' echom 'Vimwiki Error: Unable to resolve link!' return 0 else - call vimwiki#base#edit_file('tabnew', url, anchor, [], 0) + exe 'tabnew ' . fnameescape(link_infos.filename) return 1 endif - endfunction " }}} + endfunction + +------------------------------------------------------------------------------ +*VimwikiLinkConverter* ------------------------------------------------------------------------------ @@ -2291,13 +2285,12 @@ cannot otherwise convert the link. A customized handler might look like this: > " complete URL let url_0 = matchstr(str, g:vimwiki_rxWikiInclMatchUrl) " URL parts - let [scheme, path, subdir, lnk, ext, url, anchor] = - \ vimwiki#base#resolve_scheme(url_0, VimwikiGet('ext')) + let link_infos = vimwiki#base#resolve_link(url_0) let arg1 = matchstr(str, VimwikiWikiInclMatchArg(1)) let arg2 = matchstr(str, VimwikiWikiInclMatchArg(2)) if arg1 =~ '#' - return url.'#'.arg2 + return link_infos.filename.'#'.arg2 endif " Return the empty string when unable to process link @@ -2624,7 +2617,7 @@ Vim plugins: http://www.vim.org/scripts/script.php?script_id=2226 ???~ - * Spport for |g:vimwiki_auto_chdir| option. + * Support for |g:vimwiki_auto_chdir| option. * Support for anchors, see |vimwiki-anchors| * in this context, add support for TOC, see |vimwiki-toc| * remove the now useless %toc placeholder diff --git a/plugin/vimwiki.vim b/plugin/vimwiki.vim index 09dc6ef..584f026 100644 --- a/plugin/vimwiki.vim +++ b/plugin/vimwiki.vim @@ -365,9 +365,15 @@ if !exists("*VimwikiLinkHandler") "{{{ endfunction endif "}}} +if !exists("*VimwikiLinkConverter") "{{{ + function VimwikiLinkConverter(url, source, target) + " Return the empty string when unable to process link + return '' + endfunction +endif "}}} + if !exists("*VimwikiWikiIncludeHandler") "{{{ function! VimwikiWikiIncludeHandler(value) "{{{ - " Return the empty string when unable to process link return '' endfunction "}}} endif "}}} From 41b40374f9682b02a3b1c8faced48bf2beeee15d Mon Sep 17 00:00:00 2001 From: EinfachToll Date: Thu, 30 Apr 2015 13:50:58 +0200 Subject: [PATCH 2/4] Finish doc for absolute/relative link stuff --- doc/vimwiki.txt | 52 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/doc/vimwiki.txt b/doc/vimwiki.txt index 2e40b71..f27d3cd 100644 --- a/doc/vimwiki.txt +++ b/doc/vimwiki.txt @@ -1121,8 +1121,9 @@ number of special schemes are supported: "wikiX:", "diary:", "file:", "local:" and schemeless. While "wikiX", "diary" and schemeless links are automatically opened in Vim, -all other links are opened with the system command. To customize this -behavior, see |VimwikiLinkHandler|. +all other links are opened with the system command, i.e. !xdg-open (Linux), +!open (Mac), or !start (Windows). To customize this behavior, see +|VimwikiLinkHandler|. Interwiki:~ @@ -2219,17 +2220,17 @@ Default: 1 ------------------------------------------------------------------------------ *VimwikiLinkHandler* -A customizable link handler, |VimwikiLinkHandler|, can be defined to override -Vimwiki's opening of links. Each recognized link, whether it is a wikilink, -wiki-include link or a weblink, is first passed to |VimwikiLinkHandler| to see -if it can be handled. The return value 1/0 indicates success. +A customizable link handler can be defined to override Vimwiki's opening of +links. Each recognized link, whether it is a wikilink, wiki-include link or a +weblink, is first passed to |VimwikiLinkHandler| to see if it can be handled. +The return value 1 indicates success. If the link is not handled successfully, the behavior of Vimwiki depends on the scheme. "wiki:", "diary:" or schemeless links are opened in Vim. "file:" -and "local:" links are opened with a system default handler; i.e. Linux -(!xdg-open), Mac (!open), and Windows (!start). +and "local:" links are opened with a system default handler. -You can redefine |VimwikiLinkHandler| function to do something else: > +You can redefine the VimwikiLinkHandler function in your .vimrc to do +something else: > function! VimwikiLinkHandler(link) try @@ -2242,15 +2243,15 @@ You can redefine |VimwikiLinkHandler| function to do something else: > return 0 endfunction -A second example handles a new scheme, 'vfile:', which behaves similar to -'file:', but the files are always opened with Vim: > +A second example handles a new scheme, "vfile:", which behaves similar to +"file:", but the files are always opened with Vim: > function! VimwikiLinkHandler(link) " Use Vim to open external files with the 'vfile:' scheme. E.g.: " 1) [[vfile:~/Code/PythonProject/abc123.py]] " 2) [[vfile:./|Wiki Home]] let link = a:link - if link =~ "vfile:" + if link =~# '^vfile:' let link = link[1:] else return 0 @@ -2268,6 +2269,30 @@ A second example handles a new scheme, 'vfile:', which behaves similar to ------------------------------------------------------------------------------ *VimwikiLinkConverter* +This function can be overridden in your .vimrc to specify what a link looks +like when converted to HTML. It should return the HTML link if successful or +an empty string '' otherwise. + +This example changes how relative links to external files using the "local:" +scheme look like in HTML. Per default, they would become links relative to +the HTML output directory. This function converts them to links relative to +the wiki file, i.e. a link [[local:../document.pdf]] becomes +. Also, this function will copy document.pdf to the +right place. > + + fu! VimwikiLinkConverter(link, source_wiki_file, target_html_file) + if a:link =~# '^local:' + let link_infos = vimwiki#base#resolve_link(a:link) + let html_link = vimwiki#path#relpath( + \ fnamemodify(a:source_wiki_file, ':h'), link_infos.filename) + let relative_link = + \ fnamemodify(a:target_html_file, ':h') . '/' . html_link + call system('cp ' . fnameescape(link_infos.filename) . + \ ' ' . fnameescape(relative_link)) + return html_link + endif + return '' + endfu ------------------------------------------------------------------------------ *VimwikiWikiIncludeHandler* @@ -2617,6 +2642,9 @@ Vim plugins: http://www.vim.org/scripts/script.php?script_id=2226 ???~ + * Support for wiki links absolute to the wiki root + * The "file:" and "local:" schemes semantic changed slightly + * Added the |VimwikiLinkConverter| function * Support for |g:vimwiki_auto_chdir| option. * Support for anchors, see |vimwiki-anchors| * in this context, add support for TOC, see |vimwiki-toc| From baf3be038ac38bcbcfb130b6eb09774bc25981f1 Mon Sep 17 00:00:00 2001 From: EinfachToll Date: Thu, 30 Apr 2015 13:52:33 +0200 Subject: [PATCH 3/4] Fix wrong highlight of directories when maxhi is set --- autoload/vimwiki/base.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autoload/vimwiki/base.vim b/autoload/vimwiki/base.vim index deb0e9c..cd5b99b 100644 --- a/autoload/vimwiki/base.vim +++ b/autoload/vimwiki/base.vim @@ -591,10 +591,10 @@ function! vimwiki#base#get_wiki_directories(wiki_nr) endif let result = ['./'] for wikidir in dirs - let wikidir_relative = vimwiki#path#relpath(cwd, wikidir).'/' + let wikidir_relative = vimwiki#path#relpath(cwd, wikidir) call add(result, wikidir_relative) if a:wiki_nr == g:vimwiki_current_idx - let wikidir_absolute = '/'.vimwiki#path#relpath(root_dir, wikidir).'/' + let wikidir_absolute = '/'.vimwiki#path#relpath(root_dir, wikidir) call add(result, wikidir_absolute) endif endfor From b5da4ffc8ae01747336cc938f85d4a1c63b71304 Mon Sep 17 00:00:00 2001 From: EinfachToll Date: Thu, 30 Apr 2015 13:53:25 +0200 Subject: [PATCH 4/4] auto complete absolute wiki links --- ftplugin/vimwiki.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim index be37263..ea7616e 100644 --- a/ftplugin/vimwiki.vim +++ b/ftplugin/vimwiki.vim @@ -70,7 +70,7 @@ function! Complete_wikifiles(findstart, base) let scheme = '' endif - let links = vimwiki#base#get_wikilinks(wikinumber, 0) + let links = vimwiki#base#get_wikilinks(wikinumber, 1) let result = [] for wikifile in links if wikifile =~ '^'.vimwiki#u#escape(prefix)