vimwiki

Personal wiki for vim
git clone https://github.com/vimwiki/vimwiki.git
Log | Files | Refs | README | LICENSE

commit b99a3dc988dfae985617d9785de577f9d97e2e5f
parent 8a0433dec5cdce5abf70a985c96f477440f8ff7a
Author: Ivan Tishchenko <ivan.tishchenko@dsr-company.con>
Date:   Sat, 10 Jan 2015 01:44:25 +0300

Convert file format to CTAGS. Update docs

Diffstat:
Mautoload/vimwiki/base.vim | 63+++++++++++++++++++++++++++++++++++++++++++++++++++------------
Mdoc/vimwiki.txt | 10+++++++++-
Mftplugin/vimwiki.vim | 2++
3 files changed, 62 insertions(+), 13 deletions(-)

diff --git a/autoload/vimwiki/base.vim b/autoload/vimwiki/base.vim @@ -1937,8 +1937,15 @@ let s:TAGS_METADATA_FILE_NAME = '.tags' " entry := { 'tagname':..., 'pagename':..., 'lineno':..., 'link':... } " Tags metadata in-file format: -" * entry per line, -" * entry fields go in the same order as defined above, separated with TAB (\t) +" +" Is based on CTags format (see |tags-file-format|). +" +" {tagaddress} is set to lineno. We'll let vim search by exact line number; we +" can afford that, we assume metadata file is always updated before use. +" +" Pagename and link are not saved in standard ctags fields, so we'll add +" an optional field, "vimwiki:". In this field, we encode tab-separated values +" of missing parameters -- "pagename" and "link". " vimwiki#base#update_tags " Update tags metadata. @@ -2046,22 +2053,46 @@ endfunction " }}} " vimwiki#base#load_tags_metadata " Loads tags metadata from file, returns a dictionary -function! vimwiki#base#load_tags_metadata() "{{{ +function! vimwiki#base#load_tags_metadata() abort "{{{ let metadata_path = VimwikiGet('path') . '/' . s:TAGS_METADATA_FILE_NAME if !filereadable(metadata_path) return [] endif let metadata = [] for line in readfile(metadata_path) - let fields = split(line, '\t') - if len(fields) != 4 + if line =~ '^!_TAG_FILE_' + continue + endif + let parts = matchlist(line, '^\(.\{-}\);"\(.*\)$') + if parts[0] == '' || parts[1] == '' || parts[2] == '' throw 'VimwikiTags1: Metadata file corrupted' endif + let std_fields = split(parts[1], '\t') + if len(std_fields) != 3 + throw 'VimwikiTags2: Metadata file corrupted' + endif + let vw_part = parts[2] + if vw_part[0] != "\t" + throw 'VimwikiTags3: Metadata file corrupted' + endif + let vw_fields = split(vw_part[1:], "\t") + if len(vw_fields) != 1 || vw_fields[0] !~ '^vimwiki:' + throw 'VimwikiTags4: Metadata file corrupted' + endif + let vw_data = substitute(vw_fields[0], '^vimwiki:', '', '') + let vw_data = substitute(vw_data, '\\n', "\n", 'g') + let vw_data = substitute(vw_data, '\\r', "\r", 'g') + let vw_data = substitute(vw_data, '\\t', "\t", 'g') + let vw_data = substitute(vw_data, '\\\\', "\\", 'g') + let vw_fields = split(vw_data, "\t") + if len(vw_fields) != 2 + throw 'VimwikiTags5: Metadata file corrupted' + endif let entry = {} - let entry.tagname = fields[0] - let entry.pagename = fields[1] - let entry.lineno = fields[2] - let entry.link = fields[3] + let entry.tagname = std_fields[0] + let entry.pagename = vw_fields[0] + let entry.lineno = std_fields[2] + let entry.link = vw_fields[1] call add(metadata, entry) endfor return metadata @@ -2088,13 +2119,21 @@ function! vimwiki#base#write_tags_metadata(metadata) "{{{ let metadata_path = VimwikiGet('path') . '/' . s:TAGS_METADATA_FILE_NAME let entries = [] for entry in a:metadata + let entry_data = entry.pagename . "\t" . entry.link + let entry_data = substitute(entry_data, "\\", '\\\\', 'g') + let entry_data = substitute(entry_data, "\t", '\\t', 'g') + let entry_data = substitute(entry_data, "\r", '\\r', 'g') + let entry_data = substitute(entry_data, "\n", '\\n', 'g') call add(entries, \ entry.tagname . "\t" - \ . entry.pagename . "\t" - \ . entry.lineno . "\t" - \ . entry.link + \ . entry.pagename . VimwikiGet('ext') . "\t" + \ . entry.lineno + \ . ';"' + \ . "\t" . "vimwiki:" . entry_data \) endfor + call sort(entries) + call insert(entries, "!_TAG_FILE_SORTED\t1\t{anything}") call writefile(entries, metadata_path) endfunction " }}} diff --git a/doc/vimwiki.txt b/doc/vimwiki.txt @@ -1251,9 +1251,17 @@ which opens up a popup menu with all tags defined in the wiki starting with Note that tag search/jump/completion commands need certain metadata saved in the wiki folder. This metadata can be manually updated by running -|:VimwikiGenerateTags|. There is an option |vimwiki-option-auto_tags|, when +|:VimwikiRebuildTags|. There is an option |vimwiki-option-auto_tags|, when enabled, tags metadata will be auto-updated on each page save. +Once tags metadata has been built, one can use Vim's built-in tag search +functionality (see |tagsrch.txt|). + +Tags-related commands and options: + * |:VimwikiRebuildTags| + * |:VimwikiGenerateTags| + * |:VimwikiSearchTags| + * |vimwiki-option-auto_tags| ============================================================================== diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim @@ -32,6 +32,8 @@ execute 'setlocal suffixesadd='.VimwikiGet('ext') setlocal isfname-=[,] " gf}}} +setlocal tags+=./.tags + " MISC }}} " COMPLETION {{{