commit 77607f635ab30822336a82c0e3293b7302173612
parent 99494655c2c2f36223055f4ec5fa12c5b8a03f18
Author: EinfachToll <istjanichtzufassen@googlemail.com>
Date: Wed, 29 Apr 2015 14:59:10 +0200
slightly change the semantics of file: and local: scheme
Diffstat:
4 files changed, 83 insertions(+), 78 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
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
@@ -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<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*
@@ -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:~
-
-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
@@ -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
@@ -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 "}}}