commit b53dd484290baa805602ffec78d9659094db314d
parent 4617576c2005d07ce6cd7c52b9c5a966ca9485f6
Author: Ivan Tishchenko <ivan.tishchenko@dsr-company.com>
Date: Wed, 6 May 2015 17:27:25 +0400
Merge remote-tracking branch 'upstream/dev' into upstream/tags
Conflicts:
doc/vimwiki.txt
Diffstat:
5 files changed, 121 insertions(+), 88 deletions(-)
diff --git 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
@@ -590,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
diff --git 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
@@ -769,7 +769,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.
@@ -790,6 +790,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
@@ -840,11 +847,6 @@ as a wiki page.
To scan the page for new or changed definitions for reference-links, simply
re-open the page ":e<CR>".
-Typing wikilinks can be simplified by using Vim's omni completion (see
-|compl-omni|) like so: >
- [[ind<C-X><C-O>
-which opens up a popup menu with all the wiki files starting with "ind".
-
------------------------------------------------------------------------------
5.3. Headers *vimwiki-syntax-headers*
@@ -1128,24 +1130,25 @@ 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,
-all other links are opened with the system command. To customize this
-behavior, see |VimwikiLinkHandler|.
+While "wikiX", "diary" and schemeless links are automatically opened in Vim,
+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:~
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:~
@@ -1156,32 +1159,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:~
-
-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.
+External files:~
-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]]
-Schemeless:~
-
-Schemeless URLs, which are the default, are treated internally as "wiki#:"
-URLs in all respects except when converted to Html.
+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 links convert to plain relative path URLs, nearly verbatim: >
- relpath/wikipage.html
+Schemeless:~
-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
@@ -1202,7 +1200,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}}
@@ -2291,17 +2289,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. 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.
-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
@@ -2314,35 +2312,56 @@ 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*
+
+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
+<a href="../document.pdf">. 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*
@@ -2360,13 +2379,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
@@ -2694,7 +2712,10 @@ Vim plugins: http://www.vim.org/scripts/script.php?script_id=2226
???~
* Support for tags.
- * Spport for |g:vimwiki_auto_chdir| option.
+ * 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|
* remove the now useless %toc placeholder
diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim
@@ -94,7 +94,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)
diff --git 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 "}}}