commit 41ddc28c9e9147870ac28d6764f4a0c9e816cc26
parent fcd908791b82de98bb0b70e4e5b22748a5b6aa96
Author: EinfachToll <istjanichtzufassen@googlemail.com>
Date: Thu, 14 Aug 2014 13:08:24 +0200
Don't interpret autocomplete start string as regexp
Diffstat:
2 files changed, 64 insertions(+), 57 deletions(-)
diff --git a/autoload/vimwiki/base.vim b/autoload/vimwiki/base.vim
@@ -420,6 +420,7 @@ function! vimwiki#base#resolve_scheme(lnk, as_html) " {{{ Resolve scheme
let path = VimwikiGet('path')
let ext = VimwikiGet('ext')
endif
+ let idx = g:vimwiki_current_idx
let subdir = VimwikiGet('diary_rel_path')
elseif scheme =~ 'local'
" revisiting the 'lcd'-bug ...
@@ -674,6 +675,65 @@ function! vimwiki#base#get_links(pat) "{{{ return string-list for files
return globlinks
endfunction "}}}
+function! vimwiki#base#get_anchors(filename, syntax) "{{{
+ if !filereadable(a:filename)
+ return []
+ endif
+
+ let rxheader = g:vimwiki_{a:syntax}_header_search
+ let rxbold = g:vimwiki_{a:syntax}_bold_search
+
+ let anchor_level = ['', '', '', '', '', '', '']
+ let anchors = []
+ for line in readfile(a:filename)
+
+ " collect headers
+ let h_match = matchlist(line, rxheader)
+ if !empty(h_match)
+ let header = vimwiki#u#trim(h_match[2])
+ let level = len(h_match[1])
+ let anchor_level[level-1] = header
+ for l in range(level, 6)
+ let anchor_level[l] = ''
+ endfor
+ call add(anchors, header)
+ let complete_anchor = ''
+ for l in range(level-1)
+ if anchor_level[l] != ''
+ let complete_anchor .= anchor_level[l].'#'
+ endif
+ endfor
+ let complete_anchor .= header
+ call add(anchors, complete_anchor)
+ endif
+
+ " collect bold text (there can be several in one line)
+ let bold_count = 0
+ let bold_end = 0
+ while 1
+ let bold_text = matchstr(line, rxbold, bold_end, bold_count)
+ let bold_end = matchend(line, rxbold, bold_end, bold_count) + 1
+ if bold_text == ""
+ break
+ endif
+ call add(anchors, bold_text)
+ let anchor_level[6] = bold_text
+ let complete_anchor = ''
+ for l in range(6)
+ if anchor_level[l] != ''
+ let complete_anchor .= anchor_level[l].'#'
+ endif
+ endfor
+ let complete_anchor .= bold_text
+ call add(anchors, complete_anchor)
+ let bold_count += 1
+ endwhile
+
+ endfor
+
+ return anchors
+endfunction "}}}
+
" s:jump_to_anchor
function! s:jump_to_anchor(anchor) "{{{
let oldpos = getpos('.')
diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim
@@ -90,7 +90,7 @@ function! Complete_wikifiles(findstart, base)
" get the filename relative to the wiki path:
let subdir_filename = substitute(fnamemodify(wikifile, ':p:r'),
\ '\V'.fnamemodify(directory, ':p'), '', '')
- if subdir_filename =~ '^'.prefix
+ if subdir_filename =~ '^'.vimwiki#u#escape(prefix)
call add(result, scheme . subdir_filename)
endif
endfor
@@ -103,70 +103,17 @@ function! Complete_wikifiles(findstart, base)
let link_infos = vimwiki#base#resolve_scheme(segments[0].'#', 0)
let wikifile = link_infos[6]
let syntax = VimwikiGet('syntax', link_infos[0])
- let rxheader = g:vimwiki_{syntax}_header_search
- let rxbold = g:vimwiki_{syntax}_bold_search
- if !filereadable(wikifile)
- return []
- endif
- let filecontent = readfile(wikifile)
- let anchor_level = ['', '', '', '', '', '', '']
- let anchors = []
-
- for line in filecontent
-
- " collect headers
- let h_match = matchlist(line, rxheader)
- if !empty(h_match)
- let header = vimwiki#u#trim(h_match[2])
- let level = len(h_match[1])
- let anchor_level[level-1] = header
- for l in range(level, 6)
- let anchor_level[l] = ''
- endfor
- call add(anchors, header)
- let complete_anchor = ''
- for l in range(level-1)
- if anchor_level[l] != ''
- let complete_anchor .= anchor_level[l].'#'
- endif
- endfor
- let complete_anchor .= header
- call add(anchors, complete_anchor)
- endif
-
- " collect bold text (there can be several in one line)
- let bold_count = 0
- let bold_end = 0
- while 1
- let bold_text = matchstr(line, rxbold, bold_end, bold_count)
- let bold_end = matchend(line, rxbold, bold_end, bold_count) + 1
- if bold_text == ""
- break
- endif
- let anchor_level[6] = bold_text
- call add(anchors, bold_text)
- let complete_anchor = ''
- for l in range(6)
- if anchor_level[l] != ''
- let complete_anchor .= anchor_level[l].'#'
- endif
- endfor
- let complete_anchor .= bold_text
- call add(anchors, complete_anchor)
- let bold_count += 1
- endwhile
-
- endfor
+ let anchors = vimwiki#base#get_anchors(wikifile, syntax)
let filtered_anchors = []
let given_anchor = join(segments[1:], '#')
for anchor in anchors
- if anchor =~# '^'.given_anchor
+ if anchor =~# '^'.vimwiki#u#escape(given_anchor)
call add(filtered_anchors, segments[0].'#'.anchor)
endif
endfor
-
return filtered_anchors
+
endif
endif
endfunction