From b0542a72c25dbc7797c5eb3c05b090c1d4dad565 Mon Sep 17 00:00:00 2001
From: Anthony Perkins
Date: Wed, 22 Jun 2022 14:49:50 +0000
Subject: [PATCH] Removed vimwiki, fixed URL, removed windows.reg
---
.../start/vimwiki/.github/issue_template.md | 7 -
.../vimwiki/.github/pull_request_template.md | 9 -
pack/acp/start/vimwiki/.gitignore | 24 -
pack/acp/start/vimwiki/.travis.yml | 27 -
pack/acp/start/vimwiki/CONTRIBUTING.md | 72 -
pack/acp/start/vimwiki/DesignNotes.md | 186 -
pack/acp/start/vimwiki/Dockerfile | 23 -
pack/acp/start/vimwiki/LICENSE.md | 22 -
pack/acp/start/vimwiki/README-cn.md | 161 -
pack/acp/start/vimwiki/README.md | 283 -
.../start/vimwiki/autoload/vimwiki/base.vim | 2395 ----
.../autoload/vimwiki/customwiki2html.sh | 62 -
.../vimwiki/autoload/vimwiki/default.tpl | 12 -
.../start/vimwiki/autoload/vimwiki/diary.vim | 436 -
.../start/vimwiki/autoload/vimwiki/html.vim | 1744 ---
.../start/vimwiki/autoload/vimwiki/lst.vim | 1713 ---
.../autoload/vimwiki/markdown_base.vim | 162 -
.../start/vimwiki/autoload/vimwiki/path.vim | 210 -
.../start/vimwiki/autoload/vimwiki/style.css | 187 -
.../start/vimwiki/autoload/vimwiki/tags.vim | 405 -
.../start/vimwiki/autoload/vimwiki/tbl.vim | 861 --
pack/acp/start/vimwiki/autoload/vimwiki/u.vim | 157 -
.../start/vimwiki/autoload/vimwiki/vars.vim | 984 --
pack/acp/start/vimwiki/doc/entries.png | Bin 341380 -> 0 bytes
pack/acp/start/vimwiki/doc/lists.png | Bin 430499 -> 0 bytes
pack/acp/start/vimwiki/doc/screenshot_1.png | Bin 29362 -> 0 bytes
pack/acp/start/vimwiki/doc/screenshot_2.png | Bin 49959 -> 0 bytes
pack/acp/start/vimwiki/doc/splash.png | Bin 9699 -> 0 bytes
pack/acp/start/vimwiki/doc/todos.png | Bin 369021 -> 0 bytes
pack/acp/start/vimwiki/doc/vimwiki.txt | 3988 ------
pack/acp/start/vimwiki/doc/wiki.png | Bin 476675 -> 0 bytes
pack/acp/start/vimwiki/ftplugin/vimwiki.vim | 701 -
pack/acp/start/vimwiki/plugin/vimwiki.vim | 469 -
pack/acp/start/vimwiki/syntax/vimwiki.vim | 490 -
.../start/vimwiki/syntax/vimwiki_default.vim | 110 -
.../start/vimwiki/syntax/vimwiki_markdown.vim | 104 -
.../syntax/vimwiki_markdown_custom.vim | 206 -
.../start/vimwiki/syntax/vimwiki_media.vim | 85 -
pack/acp/start/vimwiki/test/README.md | 75 -
.../vimwiki/test/command_generate_links.vader | 103 -
.../vimwiki/test/command_generate_tags.vader | 96 -
.../acp/start/vimwiki/test/command_goto.vader | 64 -
.../vimwiki/test/command_rename_link.vader | 189 -
pack/acp/start/vimwiki/test/command_toc.vader | 149 -
.../vimwiki/test/convert_default_html.vader | 59 -
.../vimwiki/test/independent_runs/map.vader | 461 -
.../test/independent_runs/search.vader | 66 -
.../vimwiki/test/independent_runs/vader_setup | 1 -
.../test/independent_runs/vader_teardown | 1 -
.../start/vimwiki/test/link_creation.vader | 125 -
.../link_markdown_multiple_per_file.vader | 225 -
.../vimwiki/test/list_VimwikiReturn.vader | 282 -
pack/acp/start/vimwiki/test/list_margin.vader | 108 -
pack/acp/start/vimwiki/test/list_update.vader | 191 -
.../start/vimwiki/test/resources/delay.wiki | 10923 ----------------
.../test/resources/testmarkdown/buzz_bozz.md | 3 -
.../test/resources/testmarkdown/index.md | 59 -
.../resources/testwiki space/buzz bozz.wiki | 3 -
.../test/resources/testwiki space/index.wiki | 30 -
.../test/resources/testwiki/buzz_bozz.wiki | 3 -
.../test/resources/testwiki/index.wiki | 35 -
pack/acp/start/vimwiki/test/run_tests.sh | 248 -
pack/acp/start/vimwiki/test/syntax.vader | 318 -
.../start/vimwiki/test/table_autoformat.vader | 157 -
.../start/vimwiki/test/tabnext_delay.vader | 32 -
.../test/vader_includes/vader_setup.vader | 89 -
.../test/vader_includes/vader_teardown.vader | 6 -
pack/acp/start/vimwiki/test/vimrc | 67 -
plugins.md | 1 -
vimrc | 5 +-
windows.reg | 48 -
71 files changed, 3 insertions(+), 30514 deletions(-)
delete mode 100644 pack/acp/start/vimwiki/.github/issue_template.md
delete mode 100644 pack/acp/start/vimwiki/.github/pull_request_template.md
delete mode 100644 pack/acp/start/vimwiki/.gitignore
delete mode 100644 pack/acp/start/vimwiki/.travis.yml
delete mode 100644 pack/acp/start/vimwiki/CONTRIBUTING.md
delete mode 100644 pack/acp/start/vimwiki/DesignNotes.md
delete mode 100644 pack/acp/start/vimwiki/Dockerfile
delete mode 100644 pack/acp/start/vimwiki/LICENSE.md
delete mode 100644 pack/acp/start/vimwiki/README-cn.md
delete mode 100644 pack/acp/start/vimwiki/README.md
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/base.vim
delete mode 100755 pack/acp/start/vimwiki/autoload/vimwiki/customwiki2html.sh
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/default.tpl
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/diary.vim
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/html.vim
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/lst.vim
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/markdown_base.vim
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/path.vim
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/style.css
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/tags.vim
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/tbl.vim
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/u.vim
delete mode 100644 pack/acp/start/vimwiki/autoload/vimwiki/vars.vim
delete mode 100644 pack/acp/start/vimwiki/doc/entries.png
delete mode 100644 pack/acp/start/vimwiki/doc/lists.png
delete mode 100644 pack/acp/start/vimwiki/doc/screenshot_1.png
delete mode 100644 pack/acp/start/vimwiki/doc/screenshot_2.png
delete mode 100644 pack/acp/start/vimwiki/doc/splash.png
delete mode 100644 pack/acp/start/vimwiki/doc/todos.png
delete mode 100644 pack/acp/start/vimwiki/doc/vimwiki.txt
delete mode 100644 pack/acp/start/vimwiki/doc/wiki.png
delete mode 100644 pack/acp/start/vimwiki/ftplugin/vimwiki.vim
delete mode 100644 pack/acp/start/vimwiki/plugin/vimwiki.vim
delete mode 100644 pack/acp/start/vimwiki/syntax/vimwiki.vim
delete mode 100644 pack/acp/start/vimwiki/syntax/vimwiki_default.vim
delete mode 100644 pack/acp/start/vimwiki/syntax/vimwiki_markdown.vim
delete mode 100644 pack/acp/start/vimwiki/syntax/vimwiki_markdown_custom.vim
delete mode 100644 pack/acp/start/vimwiki/syntax/vimwiki_media.vim
delete mode 100644 pack/acp/start/vimwiki/test/README.md
delete mode 100644 pack/acp/start/vimwiki/test/command_generate_links.vader
delete mode 100644 pack/acp/start/vimwiki/test/command_generate_tags.vader
delete mode 100644 pack/acp/start/vimwiki/test/command_goto.vader
delete mode 100644 pack/acp/start/vimwiki/test/command_rename_link.vader
delete mode 100644 pack/acp/start/vimwiki/test/command_toc.vader
delete mode 100644 pack/acp/start/vimwiki/test/convert_default_html.vader
delete mode 100644 pack/acp/start/vimwiki/test/independent_runs/map.vader
delete mode 100644 pack/acp/start/vimwiki/test/independent_runs/search.vader
delete mode 120000 pack/acp/start/vimwiki/test/independent_runs/vader_setup
delete mode 120000 pack/acp/start/vimwiki/test/independent_runs/vader_teardown
delete mode 100644 pack/acp/start/vimwiki/test/link_creation.vader
delete mode 100644 pack/acp/start/vimwiki/test/link_markdown_multiple_per_file.vader
delete mode 100644 pack/acp/start/vimwiki/test/list_VimwikiReturn.vader
delete mode 100644 pack/acp/start/vimwiki/test/list_margin.vader
delete mode 100644 pack/acp/start/vimwiki/test/list_update.vader
delete mode 100755 pack/acp/start/vimwiki/test/resources/delay.wiki
delete mode 100644 pack/acp/start/vimwiki/test/resources/testmarkdown/buzz_bozz.md
delete mode 100644 pack/acp/start/vimwiki/test/resources/testmarkdown/index.md
delete mode 100644 pack/acp/start/vimwiki/test/resources/testwiki space/buzz bozz.wiki
delete mode 100644 pack/acp/start/vimwiki/test/resources/testwiki space/index.wiki
delete mode 100644 pack/acp/start/vimwiki/test/resources/testwiki/buzz_bozz.wiki
delete mode 100644 pack/acp/start/vimwiki/test/resources/testwiki/index.wiki
delete mode 100755 pack/acp/start/vimwiki/test/run_tests.sh
delete mode 100644 pack/acp/start/vimwiki/test/syntax.vader
delete mode 100644 pack/acp/start/vimwiki/test/table_autoformat.vader
delete mode 100644 pack/acp/start/vimwiki/test/tabnext_delay.vader
delete mode 100644 pack/acp/start/vimwiki/test/vader_includes/vader_setup.vader
delete mode 100644 pack/acp/start/vimwiki/test/vader_includes/vader_teardown.vader
delete mode 100644 pack/acp/start/vimwiki/test/vimrc
delete mode 100644 windows.reg
diff --git a/pack/acp/start/vimwiki/.github/issue_template.md b/pack/acp/start/vimwiki/.github/issue_template.md
deleted file mode 100644
index d8cc987..0000000
--- a/pack/acp/start/vimwiki/.github/issue_template.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Prior to submitting a new issue make sure to complete these steps:
-
-- [ ] Checkout the `dev` branch and confirm the issue is present there as well.
- The `dev` branch contains fixes that may not have been merged to `master` yet.
-- [ ] Post the syntax you are using (default/mediawiki/markdown) **and** your vimwiki settings from your `.vimrc`
-- [ ] Provide a detailed description of the problem including **steps to reproduce the issue**.
-- [ ] Include the output of `:VimwikiShowVersion`.
diff --git a/pack/acp/start/vimwiki/.github/pull_request_template.md b/pack/acp/start/vimwiki/.github/pull_request_template.md
deleted file mode 100644
index 9b797b8..0000000
--- a/pack/acp/start/vimwiki/.github/pull_request_template.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Steps for submitting a pull request:
-
-- [ ] **ALL** pull requests should be made against the `dev` branch!
-- [ ] Take a look at [CONTRIBUTING.MD](https://github.com/vimwiki/vimwiki/blob/dev/CONTRIBUTING.md)
-- [ ] Reference any related issues.
-- [ ] Provide a description of the proposed changes.
-- [ ] PRs must pass Vint tests and add new Vader tests as applicable.
-- [ ] Make sure to update the documentation in `doc/vimwiki.txt` if applicable,
- including the Changelog and Contributors sections.
diff --git a/pack/acp/start/vimwiki/.gitignore b/pack/acp/start/vimwiki/.gitignore
deleted file mode 100644
index 3929660..0000000
--- a/pack/acp/start/vimwiki/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Local stuff
-# This section is devoted to this project
-##############################
-doc/tags
-.tags
-
-# Vim stuff
-##############################
-*.s[a-w][a-z]
-*.un~
-Session.vim
-.netrwhist
-*~
-
-# OS generated files
-##############################
-.DS_Store
-.DS_Store?
-._*
-.Spotlight-V100
-.Trashes
-ehthumbs.db
-Thumbs.db
-vimtest
diff --git a/pack/acp/start/vimwiki/.travis.yml b/pack/acp/start/vimwiki/.travis.yml
deleted file mode 100644
index cc519c7..0000000
--- a/pack/acp/start/vimwiki/.travis.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-# No language: we download vim and compile it oursselves
-language: generic
-
-cache:
- # Enable cache folder
- bundler: true
- directories:
- - $HOME/docker_images
-
-before_cache:
- # Save tagged docker images. Info at https://github.com/travis-ci/travis-ci/issues/5358#issuecomment-248915326
- - >
- mkdir -p $HOME/docker_images && docker images -a --filter='dangling=false' --format '{{.Repository}}:{{.Tag}} {{.ID}}'
- | xargs -n 2 -t sh -c 'test -e $HOME/docker_images/$1.tar.gz || docker save $0 | gzip -2 > $HOME/docker_images/$1.tar.gz'
-
-before_install:
- # Install docker
- - n_image=$(ls -1 $HOME/docker_images/*.tar.gz | wc -l)
- - if (( $n_image )); then ls $HOME/docker_images/*.tar.gz | xargs -I {file} sh -c "zcat {file} | docker load";
- else docker build --tag vimwiki .;
- fi
-
-script:
- # Run All tests
- - pushd test
- - bash run_tests.sh
- - popd
diff --git a/pack/acp/start/vimwiki/CONTRIBUTING.md b/pack/acp/start/vimwiki/CONTRIBUTING.md
deleted file mode 100644
index 8d3e53b..0000000
--- a/pack/acp/start/vimwiki/CONTRIBUTING.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# Contributing to Vimwiki
-
-# Filing a bug
-
-Before filing a bug or starting to write a patch, check the latest development version from
-https://github.com/vimwiki/vimwiki/tree/dev to see if your problem is already fixed.
-
-Issues can be filed at https://github.com/vimwiki/vimwiki/issues/ .
-
-# Creating a pull request
-
-If you want to provide a pull request on GitHub, please start from the `dev` branch, not from the
-`master` branch. (Caution, GitHub shows `master` as the default branch from which to start a PR.)
-
-Make sure to update `doc/vimwiki.txt` with the following information:
-
-1. Update the changelog to include information on the new feature the PR introduces or the bug it
- is fixing.
-2. Add a help section to describe any new features or options.
-3. If you are a first time contributor add your name to the list of contributors.
-
-**Testing:** Vimwiki uses [vader](https://github.com/junegunn/vader.vim) for unit tests and
-[vint](https://github.com/Kuniwak/vint) for linting. Any new PRs must add new tests and pass all
-linter checks. See the [test README](test/README.md) for more info.
-
-- In addition to the included tests, there are more example wikis that can be used for testing
- [here](https://github.com/vimwiki/testwikis).
-
-# More info and advice for (aspiring) core developers
-
-- Before implementing a non-trivial feature, think twice what it means for the user. We should
- always try to keep backward compatibility. If you are not sure, discuss it on GitHub.
-- Also, when thinking about adding a new feature, it should be something which fits into the
- overall design of Vimwiki and which a significant portion of the users may like. Keep in mind
- that everybody has their own way to use Vimwiki.
-- Keep the coding style consistent.
-- Test your changes. Keep in mind that Vim has a ton of options and the users tons of different
- setups. Take a little time to think about under which circumstances your changes could break.
-
-## Git branching model
-
-- There are two branches with eternal lifetime:
- 1. `dev`: This is where the main development happens. Tasks which are done in one or only a few
- commits go here directly. Always try to keep this branch in a working state, that is, if the
- task you work on requires multiple commits, make sure intermediate commits don't make
- Vimwiki unusable (or at least push these commits at one go).
- 2. `master`: This branch is for released states only. Whenever a reasonable set of changes has
- piled up in the `dev` branch, a [release is done](#preparing-a-release). After a release,
- `dev` has been merged into `master` and `master` got exactly one additional commit in which
- the version number in `plugin/vimwiki.vim` is updated. Apart from these commits and the
- merge commit from `dev`, nothing happens on `master`. Never should `master` merge into
- `dev`. When the users ask, we should recommend this branch for them to use.
-- Larger changes which require multiple commits are done in feature branches. They are based on
- `dev` and merge into `dev` when the work is done.
-
-## Preparing a release
-
-1. `git checkout dev`
-2. Update the changelog in the doc, nicely grouped, with a new version number and release date.
-3. Update the list of contributors.
-4. Update the version number at the top of the doc file.
-5. If necessary, update the Readme and the home page.
-6. `git checkout master && git merge dev`
-7. Update the version number at the top of plugin/vimwiki.vim.
-8. Set a tag with the version number in Git: `git tag vX.Y`
-9. `git push --tags`
-10. In GitHub, go to _Releases_ -> _Draft a new release_ -> choose the tag, convert the changelog
- from the doc to markdown and post it there. Make plans to build an automatic converter and
- immediately forget this plan.
-11. Tell the world.
-
-
diff --git a/pack/acp/start/vimwiki/DesignNotes.md b/pack/acp/start/vimwiki/DesignNotes.md
deleted file mode 100644
index 5e7f957..0000000
--- a/pack/acp/start/vimwiki/DesignNotes.md
+++ /dev/null
@@ -1,186 +0,0 @@
-# Design Notes
-
-This file is meant to document design decisions and algorithms inside vimwiki
-which are too large for code comments, and not necessarily interesting to
-users. Please create a new section to document each behavior.
-
-## Formatting tables
-
-In vimwiki, formatting tables occurs dynamically, when navigating between cells
-and adding new rows in a table in the Insert mode, or statically, when pressing
-`gqq` or `gqw` (which are mappings for commands `VimwikiTableAlignQ` and
-`VimwikiTableAlignW` respectively) in the Normal mode. It also triggers when
-leaving Insert mode, provided variable `g:vimwiki_table_auto_fmt` is set. In
-this section, the original and the newer optimized algorithms of table
-formatting will be described and compared.
-
-### The older table formatting algorithm and why this is not optimal
-
-Let's consider a simple example. Open a new file, say _tmp.wiki_, and create a
-new table with command `VimwikiTable`. This should create a blank table.
-
-```
-| | | | | |
-|---|---|---|---|---|
-| | | | | |
-```
-
-Let's put the cursor in the first header column of the table, enter the Insert
-mode and type a name, say _Col1_. Then press _Tab_: the cursor will move to the
-second column of the header and the table will get aligned (in the context of
-the table formatting story, words _aligned_ and _formatted_ are considered as
-synonyms). Now the table looks as in the following snippet.
-
-```
-| Col1 | | | | |
-|------|---|---|---|---|
-| | | | | |
-```
-
-Then, when moving cursor to the first data row (i.e. to the third line of the
-table below the separator line) and typing anything here and there while
-navigating using _Tab_ or _Enter_ (pressing this creates a new row below the
-current row), the table shall keep formatting. Below is a result of such a
-random edit.
-
-```
-| Col1 | | | | |
-|------|-------|---|-------|----------|
-| | Data1 | | Data2 | |
-| | | | | New data |
-```
-
-The lowest row gets aligned when leaving the Insert mode. Let's copy _Data1_
-(using `viwy` or another keystroke) and paste it (using `p`) in the second data
-row of the first column. Now the table looks mis-aligned (as we did not enter
-the Insert mode).
-
-```
-| Col1 | | | | |
-|------|-------|---|-------|----------|
-| | Data1 | | Data2 | |
-| Data1 | | | | New data |
-```
-
-This is not a big problem though, because we can put the cursor at _any_ place
-in the table and press `gqq`: the table will get aligned.
-
-```
-| Col1 | | | | |
-|-------|-------|---|-------|----------|
-| | Data1 | | Data2 | |
-| Data1 | | | | New data |
-```
-
-Now let's make real problems! Move the cursor to the lowest row and copy it
-with `yy`. Then 500-fold paste it with `500p`. Now the table very long. Move
-the cursor to the lowest row (by pressing `G`), enter the Insert mode, and try
-a new random editing session by typing anything in cells with _Tab_ and _Enter_
-navigation interleaves. The editing got painfully slow, did not?
-
-The reason of the slowing down is the older table formatting algorithm. Every
-time _Tab_ or _Enter_ get pressed down, all rows in the table get visited to
-calculate a new alignment. Moreover, by design it may happen even more than
-once per one press!
-
-```vim
-function! s:kbd_create_new_row(cols, goto_first)
- let cmd = "\o".s:create_empty_row(a:cols)
- let cmd .= "\:call vimwiki#tbl#format(line('.'))\"
- let cmd .= "\0"
- if a:goto_first
- let cmd .= ":call search('\\(".s:rxSep()."\\)\\zs', 'c', line('.'))\"
- else
- let cmd .= (col('.')-1)."l"
- let cmd .= ":call search('\\(".s:rxSep()."\\)\\zs', 'bc', line('.'))\"
- endif
- let cmd .= "a"
-
- return cmd
-endfunction
-```
-
-Function `s:kbd_create_new_row()` is called when _Tab_ or _Enter_ get pressed.
-Formatting of the whole table happens in function `vimwiki#tbl#format()`. But
-remember that leaving the Insert mode triggers re-formatting of a table when
-variable `g:vimwiki_table_auto_fmt` is set. This means that formatting of the
-whole table is called on all those multiple interleaves between the Insert and
-the Normal mode in `s:kbd_create_new_row` (notice `\`, `o`, etc.).
-
-### The newer table formating algorithm
-
-The newer algorithm was introduced to struggle against performance issues when
-formatting large tables.
-
-Let's take the table from the previous example in an intermediate state.
-
-```
-| Col1 | | | | |
-|------|-------|---|-------|----------|
-| | Data1 | | Data2 | |
-| Data1 | | | | New data |
-```
-
-Then move the cursor to the first data row, copy it with `yy`, go down to the
-mis-aligned line, and press `5p`. Now we have a slightly bigger mis-aligned
-table.
-
-```
-| Col1 | | | | |
-|------|-------|---|-------|----------|
-| | Data1 | | Data2 | |
-| Data1 | | | | New data |
-| | Data1 | | Data2 | |
-| | Data1 | | Data2 | |
-| | Data1 | | Data2 | |
-| | Data1 | | Data2 | |
-| | Data1 | | Data2 | |
-```
-
-Go down to the lowest, the 7th, data row and press `gq1`. Nothing happened.
-Let's go to the second or the third data row and press `gq1` once again. Now
-the table gets aligned. Let's undo formatting with `u`, go to the fourth row,
-and press `gq1`. Now the table should look like in the following snippet.
-
-```
-| Col1 | | | | |
-|------|-------|---|-------|----------|
-| | Data1 | | Data2 | |
-| Data1 | | | | New data |
-| | Data1 | | Data2 | |
-| | Data1 | | Data2 | |
-| | Data1 | | Data2 | |
-| | Data1 | | Data2 | |
-| | Data1 | | Data2 | |
-```
-
-What a peculiar command! Does using it make any sense? Not much, honestly.
-Except it shows how the newer optimized table formatting algorithm works in the
-Insert mode.
-
-Indeed, the newer table formatting algorithm introduces a _viewport_ on a table.
-Now, when pressing _Tab_ or _Enter_ in the Insert mode, only a small part of
-rows are checked for possible formatting: two rows above the current line and
-the current line itself (the latter gets preliminary shrunk with function
-`s:fmt_row()`). If all three lines in the viewport are of the same length, then
-nothing happens (case 1 in the example). If the second or the shrunk current
-line is longer then the topmost line in the viewport, then the algorithm falls
-back to the older formatting algorithm and the whole table gets aligned
-(case 2). If the topmost line in the viewport is longer than the second
-and the shrunk current line, then the two lowest lines get aligned according to
-the topmost line (case 3).
-
-Performance of the newer formatting algorithm should not depend on the height
-of the table. The newer algorithm should also be consistent with respect to
-user editing experience. Indeed, as soon as a table should normally be edited
-row by row from the top to the bottom, dynamic formatting should be both fast
-(watching only three rows in a table, re-formatting only when the shrunk
-current row gets longer than any of the two rows above) and eager (a table
-should look formatted on every press on _Tab_ and _Enter_). However, the newer
-algorithm differs from the older algorithm when starting editing a mis-aligned
-table in an area where mis-aligned rows do not get into the viewport: in this
-case the newer algorithm will format the table partly (in the rows of the
-viewport) until one of the being edited cells grows in length to a value big
-enough to trigger the older algorithm and the whole table gets aligned. When
-partial formatting is not desirable, the whole table can be formatted by
-pressing `gqq` in the Normal mode.
diff --git a/pack/acp/start/vimwiki/Dockerfile b/pack/acp/start/vimwiki/Dockerfile
deleted file mode 100644
index b6ffdd0..0000000
--- a/pack/acp/start/vimwiki/Dockerfile
+++ /dev/null
@@ -1,23 +0,0 @@
-FROM testbed/vim:17
-
-# add packages
-RUN apk --no-cache add bash=~5.0
-RUN apk --no-cache add git=~2.22
-RUN apk --no-cache add python3=~3.7
-
-# get vint for linting
-RUN pip3 install vim-vint==0.3.21
-
-# get vader for unit tests
-RUN git clone -n https://github.com/junegunn/vader.vim /vader
-WORKDIR /vader
-RUN git checkout de8a976f1eae2c2b680604205c3e8b5c8882493c
-
-# build vim and neovim versions we want to test
-# TODO uncomment nvim tag
-WORKDIR /
-RUN install_vim -tag v7.3.429 -name vim_7.3.429 -build \
- -tag v7.4.1099 -name vim_7.4.1099 -build \
- -tag v7.4.1546 -name vim_7.4.1546 -build \
- -tag v8.0.0027 -name vim_8.0.0027 -build \
- -tag v8.1.0519 -name vim_8.1.0519 -build \
diff --git a/pack/acp/start/vimwiki/LICENSE.md b/pack/acp/start/vimwiki/LICENSE.md
deleted file mode 100644
index cdf8546..0000000
--- a/pack/acp/start/vimwiki/LICENSE.md
+++ /dev/null
@@ -1,22 +0,0 @@
-MIT License
-
-Copyright (c) 2008-2010 Maxim Kim
- 2013-2017 Daniel Schemala
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/pack/acp/start/vimwiki/README-cn.md b/pack/acp/start/vimwiki/README-cn.md
deleted file mode 100644
index 5d1a064..0000000
--- a/pack/acp/start/vimwiki/README-cn.md
+++ /dev/null
@@ -1,161 +0,0 @@
-VimWiki —— Vim 个人 Wiki 插件
-==============================================================================
-
-[English](README.md)
-
-![screenshot1](doc/screenshot_1.png)
-![screenshot2](doc/screenshot_2.png) *
-
-介绍
-------------------------------------------------------------------------------
-
-Vimwiki 是 Vim 中的个人 Wiki —— 一组链接起来的、有独特语法高亮的文本文件。
-
-通过 Vimwiki,你可以:
-
- * 组织笔记和想法
- * 管理待办事项
- * 编写文档
- * 坚持写日记
- * 将这一切导出成 HTML 网页
-
-马上开始!按下 `ww`(通常是 `\ww`)进入作为目录页的 wiki 文件,这个文件默认存放在 `~/vimwiki/index.wiki`。
-
-在该文件中输入以下示例:
-
- = 我的个人知识库 =
- * 任务列表 -- _昨天_ 就该完成的事!!!
- * Gutenberg 计划 -- 好书给我力量。
- * 草稿 -- 临时记录一些东西。
-
-把光标移到 `任务` 二字上,按 Enter(回车)创建链接。按下后,`任务`二字会变成 `[[任务]]` —— 这是一个 Vimwiki 链接。再次按 Enter 即可进入这个链接(打开新的 wiki 文件)。编辑这个新文件,保存,然后按 Backspace(退格)就能回到目录页。
-
-如果 Vimwiki 链接长度不止一个单词(指的是英文单词),只需在 Visual 模式选择这段文本后按 Enter 即可。用上面的 `Gutenberg 计划` 试试吧。最终结果是这样:
-
- = 我的个人知识库 =
- * [[任务列表]] -- _昨天_ 就该完成的事!!!
- * [[Gutenberg 计划]] -- 好书给我力量。
- * 草稿 -- 临时记录一些东西。
-
-
-基本标记
-------------------------------------------------------------------------------
-
- = 一级标题 =
- == 二级标题 ==
- === 三级标题 ===
-
-
- *bold* -- 粗体文本
- _italic_ -- 斜体文本
- (应用于句中的汉字文本时,必须在标记前后加空格,例如:一段 *中文* 文本)
-
- [[wiki link]] -- wiki 链接
- [[wiki link|description]] -- 带有描述文本的 wiki 链接
-
-
-列表:
-
- * bullet list item 1(无编号列表)
- - bullet list item 2
- - bullet list item 3
- * bullet list item 4
- * bullet list item 5
- * bullet list item 6
- * bullet list item 7
- - bullet list item 8
- - bullet list item 9
-
- 1. numbered list item 1(有编号列表)
- 2. numbered list item 2
- a) numbered list item 3
- b) numbered list item 4
-
-
-更多格式说明,请阅 `:h vimwiki-syntax`
-
-
-键位绑定
-------------------------------------------------------------------------------
-
-normal 模式:
-
- * `ww` -- 打开默认的 wiki 目录文件
- * `wt` -- 在新标签(Tab)中打开 wiki 目录文件
- * `ws` -- 在多个 wiki 中选择并打开该 wiki 的目录文件
- * `wd` -- 删除当前 wiki 文件
- * `wr` -- 重命名当前 wiki 文件
- * `` -- 创建或打开 wiki 链接
- * `` -- 先上下分屏再打开 wiki 链接(若非链接则先创建)
- * `` -- 先左右分屏再打开 wiki 链接(若非链接则先创建)
- * `` -- 返回之前浏览的 wiki 文件
- * `` -- 跳到本文件中下一个 wiki 链接
- * `` -- 跳到本文件中上一个 wiki 链接
-
-更多快捷键说明,请阅 `:h vimwiki-mappings`
-
-
-命令
-------------------------------------------------------------------------------
-
- * `:Vimwiki2HTML` -- 将当前 wiki 文件转换成 HTML 网页
- * `:VimwikiAll2HTML` -- 把所有 wiki 文件转换成 HTML 网页
- * `:help vimwiki-commands` -- 显示全部命令
-
-
-安装
-==============================================================================
-
-准备工作
-------------------------------------------------------------------------------
-
-确保在 `vimrc` 中加入了以下设置:
-
- set nocompatible
- filetype plugin on
- syntax on
-
-没有这些设置,Vimwiki 将无法正常工作。
-
-通过 [Vim packages](http://vimhelp.appspot.com/repeat.txt.html#packages) 安装(Vim 7.4.1528 后)
-------------------------------------------------------------------------------
-
- git clone https://github.com/vimwiki/vimwiki.git ~/.vim/pack/plugins/start/vimwiki
-
-通过 [Pathogen](http://www.vim.org/scripts/script.php?script_id=2332) 安装
-------------------------------------------------------------------------------
-
- cd ~/.vim
- mkdir bundle
- cd bundle
- git clone https://github.com/vimwiki/vimwiki.git
-
-通过 [Vim-Plug](https://github.com/junegunn/vim-plug) 安装
-------------------------------------------------------------------------------
-
-在 `vimrc` 中加入以下插件设置:
-
- Plug 'vimwiki/vimwiki'
-
-然后运行 `:PlugInstall`。
-
-通过 [Vundle](https://github.com/VundleVim/Vundle.vim) 安装
-------------------------------------------------------------------------------
-
-在 `vimrc` 中加入 `Plugin 'vimwiki/vimwiki'`,然后执行:
-
- vim +PluginInstall +qall
-
-或者下载 [zip 压缩包](https://github.com/vimwiki/vimwiki/archive/master.zip)然后解压到 `~/.vim/bundle/` 目录下。
-
-安装后,启动 Vim 并执行 `:Helptags` 以及 `:help vimwiki`,检查安装是否成功。
-
-
-获取帮助
-==============================================================================
-
-遇到问题?在 Freenode 的 IRC 频道 `#vimwiki`([网页聊天](https://webchat.freenode.net/?channels=#vimwiki))提问,或者发送问题到[邮件列表](https://groups.google.com/forum/#!forum/vimwiki)上吧。
-
-
-----
-\* 前面截图中用的是 [solarized 配色方案](https://github.com/altercation/vim-colors-solarized)以及 [lightline](https://github.com/itchyny/lightline.vim) 插件。
diff --git a/pack/acp/start/vimwiki/README.md b/pack/acp/start/vimwiki/README.md
deleted file mode 100644
index d53526c..0000000
--- a/pack/acp/start/vimwiki/README.md
+++ /dev/null
@@ -1,283 +0,0 @@
-![VimWiki: A Personal Wiki For Vim](doc/splash.png)
-
-[中文](README-cn.md)
-
-- [Intro](#intro)
-- [Screenshots](#screenshots)
-- [Installation](#installation)
- - [Prerequisites](#prerequisites)
- - [VIM Packages](#installation-using-vim-packages-since-vim-741528)
- - [Pathogen](#installation-using-pathogen)
- - [Vim-Plug](#installation-using-vim-plug)
- - [Vundle](#installation-using-vundle)
-- [Basic Markup](#basic-markup)
- - [Lists](#lists)
-- [Key Bindings](#key-bindings)
-- [Commands](#commands)
-- [Changing Wiki Syntax](#changing-wiki-syntax)
-- [Getting Help](#getting-help)
-- [Helping VimWiki](#helping-vimwiki)
-- [Wiki](https://github.com/vimwiki/vimwiki/wiki)
-- [License](#license)
-
-----
-
-## Introduction
-
-VimWiki is a personal wiki for Vim -- a number of linked text files that have
-their own syntax highlighting. See the [VimWiki Wiki](https://vimwiki.github.io/vimwikiwiki/)
-for an example website built with VimWiki!
-
-For the latest features and fixes checkout the [dev branch](https://github.com/vimwiki/vimwiki/tree/dev).
-If you are interested in contributing see [this section](#helping-vimwiki).
-
-With VimWiki, you can:
-
-- Organize notes and ideas
-- Manage to-do lists
-- Write documentation
-- Maintain a diary
-- Export everything to HTML
-
-To do a quick start, press `ww` (default is `\ww`) to go to your index
-wiki file. By default, it is located in `~/vimwiki/index.wiki`. See `:h vimwiki_list`
-for registering a different path/wiki.
-
-Feed it with the following example:
-
-```text
-= My knowledge base =
- * Tasks -- things to be done _yesterday_!!!
- * Project Gutenberg -- good books are power.
- * Scratchpad -- various temporary stuff.
-```
-
-Place your cursor on `Tasks` and press Enter to create a link. Once pressed,
-`Tasks` will become `[[Tasks]]` -- a VimWiki link. Press Enter again to
-open it. Edit the file, save it, and then press Backspace to jump back to your
-index.
-
-A VimWiki link can be constructed from more than one word. Just visually
-select the words to be linked and press Enter. Try it, with `Project Gutenberg`.
-The result should look something like:
-
-```text
-= My knowledge base =
- * [[Tasks]] -- things to be done _yesterday_!!!
- * [[Project Gutenberg]] -- good books are power.
- * Scratchpad -- various temporary stuff.
-```
-
-## Screenshots
-
-![Lists View](doc/lists.png)
-![Entries View](doc/entries.png)
-![Todos View](doc/todos.png)
-![Wiki View](doc/wiki.png)
-
-## Installation
-
-VimWiki has been tested on **Vim >= 7.3**. It will likely work on older
-versions but will not be officially supported.
-
-### Prerequisites
-
-Make sure you have these settings in your vimrc file:
-
-```vim
-set nocompatible
-filetype plugin on
-syntax on
-```
-
-Without them, VimWiki will not work properly.
-
-#### Installation using [Vim packages](http://vimhelp.appspot.com/repeat.txt.html#packages) (since Vim 7.4.1528)
-
-```sh
-
-git clone https://github.com/vimwiki/vimwiki.git ~/.vim/pack/plugins/start/vimwiki
-
-# to generate documentation i.e. ':h vimwiki'
-vim -c 'helptags ~/.vim/pack/plugins/start/vimwiki/doc' -c quit
-
-```
-
-Notes:
-
-- See `:h helptags` for issues with installing the documentation.
-- For general information on vim packages see `:h packages`.
-
-#### Installation using [Pathogen](https://github.com/tpope/vim-pathogen)
-
-```sh
-
-cd ~/.vim
-mkdir bundle
-cd bundle
-git clone https://github.com/vimwiki/vimwiki.git
-
-```
-
-#### Installation using [Vim-Plug](https://github.com/junegunn/vim-plug)
-
-Add the following to the plugin-configuration in your vimrc:
-
-```vim
-
-Plug 'vimwiki/vimwiki'
-
-```
-
-Then run `:PlugInstall`.
-
-#### Installation using [Vundle](https://github.com/VundleVim/Vundle.vim)
-
-Add `Plugin 'vimwiki/vimwiki'` to your vimrc file and run:
-
-```sh
-
-vim +PluginInstall +qall
-
-```
-
-#### Manual Install
-
-Download the [zip archive](https://github.com/vimwiki/vimwiki/archive/master.zip)
-and extract it in `~/.vim/bundle/`
-
-Then launch Vim, run `:Helptags` and then `:help vimwiki` to verify it was
-installed.
-
-## Basic Markup
-
-```text
-= Header1 =
-== Header2 ==
-=== Header3 ===
-
-
-*bold* -- bold text
-_italic_ -- italic text
-
-[[wiki link]] -- wiki link
-[[wiki link|description]] -- wiki link with description
-```
-
-### Lists
-
-```text
-* bullet list item 1
- - bullet list item 2
- - bullet list item 3
- * bullet list item 4
- * bullet list item 5
-* bullet list item 6
-* bullet list item 7
- - bullet list item 8
- - bullet list item 9
-
-1. numbered list item 1
-2. numbered list item 2
- a) numbered list item 3
- b) numbered list item 4
-```
-
-For other syntax elements, see `:h vimwiki-syntax`
-
-## Key bindings
-
-### Normal mode
-
-**Note:** your terminal may prevent capturing some of the default bindings
-listed below. See `:h vimwiki-local-mappings` for suggestions for alternative
-bindings if you encounter a problem.
-
-#### Basic key bindings
-
-- `ww` -- Open default wiki index file.
-- `wt` -- Open default wiki index file in a new tab.
-- `ws` -- Select and open wiki index file.
-- `wd` -- Delete wiki file you are in.
-- `wr` -- Rename wiki file you are in.
-- `` -- Follow/Create wiki link.
-- `` -- Split and follow/create wiki link.
-- `` -- Vertical split and follow/create wiki link.
-- `` -- Go back to parent(previous) wiki link.
-- `` -- Find next wiki link.
-- `` -- Find previous wiki link.
-
-#### Advanced key bindings
-
-Refer to the complete documentation at `:h vimwiki-mappings` to see many
-more bindings.
-
-## Commands
-
-- `:Vimwiki2HTML` -- Convert current wiki link to HTML.
-- `:VimwikiAll2HTML` -- Convert all your wiki links to HTML.
-- `:help vimwiki-commands` -- List all commands.
-- `:help vimwiki` -- General vimwiki help docs.
-
-## Changing Wiki Syntax
-
-VimWiki currently ships with 3 syntaxes: VimWiki (default), Markdown
-(markdown), and MediaWiki (media).
-
-**NOTE:** Only the default syntax ships with a built-in HTML converter. For
-Markdown or MediaWiki see `:h vimwiki-option-custom_wiki2html`. Some examples
-and 3rd party tools are available [here](https://vimwiki.github.io/vimwikiwiki/Related%20Tools.html#Related%20Tools-External%20Tools).
-
-If you would prefer to use either Markdown or MediaWiki syntaxes, set the
-following option in your `.vimrc`:
-
-```vim
-
-let g:vimwiki_list = [{'path': '~/vimwiki/',
- \ 'syntax': 'markdown', 'ext': '.md'}]
-
-```
-
-## Getting help
-
-[GitHub issues](https://github.com/vimwiki/vimwiki/issues) are the primary
-method for raising bug reports or feature requests.
-
-Additional resources include the IRC channel [#vimwiki](https://webchat.freenode.net/?channels=#vimwiki) on Freenode
-([webchat](https://webchat.freenode.net/?channels=#vimwiki), also synced to Matrix/Riot: `#freenode_#vimwiki:matrix.org` and [Telegram](https://t.me/joinchat/JqBaKBfWs04qNVrp5oWcMg))
-or post to the [mailing list](https://groups.google.com/forum/#!forum/vimwiki).
-
-## Helping VimWiki
-
-VimWiki has a lot of users but only very few recurring developers or people
-helping the community. Your help is therefore appreciated. Everyone can help!
-See [#625](https://github.com/vimwiki/vimwiki/issues/625) for information on how you can help.
-
-Also, take a look at [CONTRIBUTING.md](https://github.com/vimwiki/vimwiki/blob/master/CONTRIBUTING.md).
-
-----
-
-## License
-
-MIT License
-
-Copyright (c) 2008-2010 Maxim Kim
- 2013-2017 Daniel Schemala
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/pack/acp/start/vimwiki/autoload/vimwiki/base.vim b/pack/acp/start/vimwiki/autoload/vimwiki/base.vim
deleted file mode 100644
index 4a13da8..0000000
--- a/pack/acp/start/vimwiki/autoload/vimwiki/base.vim
+++ /dev/null
@@ -1,2395 +0,0 @@
-" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
-" Vimwiki autoload plugin file
-" Desc: Basic functionality
-" Home: https://github.com/vimwiki/vimwiki/
-
-if exists('g:loaded_vimwiki_auto') || &compatible
- finish
-endif
-let g:loaded_vimwiki_auto = 1
-
-
-let g:vimwiki_max_scan_for_caption = 5
-
-
-function! s:safesubstitute(text, search, replace, mode) abort
- " Substitute regexp but do not interpret replace
- let escaped = escape(a:replace, '\&')
- return substitute(a:text, a:search, escaped, a:mode)
-endfunction
-
-
-function! s:vimwiki_get_known_syntaxes() abort
- " Getting all syntaxes that different wikis could have
- let syntaxes = {}
- let syntaxes['default'] = 1
- for wiki_nr in range(vimwiki#vars#number_of_wikis())
- let wiki_syntax = vimwiki#vars#get_wikilocal('syntax', wiki_nr)
- let syntaxes[wiki_syntax] = 1
- endfor
- " also consider the syntaxes from g:vimwiki_ext2syntax
- for syn in values(vimwiki#vars#get_global('ext2syntax'))
- let syntaxes[syn] = 1
- endfor
- return keys(syntaxes)
-endfunction
-
-
-function! vimwiki#base#file_pattern(files) abort
- " Get search regex from glob()
- " string. Aim to support *all* special characters, forcing the user to choose
- " names that are compatible with any external restrictions that they
- " encounter (e.g. filesystem, wiki conventions, other syntaxes, ...).
- " See: https://github.com/vimwiki-backup/vimwiki/issues/316
- " Change / to [/\\] to allow "Windows paths"
- return '\V\%('.join(a:files, '\|').'\)\m'
-endfunction
-
-
-"FIXME TODO slow and faulty
-function! vimwiki#base#subdir(path, filename) abort
- let path = a:path
- " ensure that we are not fooled by a symbolic link
- "FIXME if we are not "fooled", we end up in a completely different wiki?
- if a:filename !~# '^scp:'
- let filename = resolve(a:filename)
- else
- let filename = a:filename
- endif
- let idx = 0
- "FIXME this can terminate in the middle of a path component!
- while path[idx] ==? filename[idx]
- let idx = idx + 1
- endwhile
-
- let p = split(strpart(filename, idx), '[/\\]')
- let res = join(p[:-2], '/')
- if len(res) > 0
- let res = res.'/'
- endif
- return res
-endfunction
-
-
-function! vimwiki#base#current_subdir() abort
- return vimwiki#base#subdir(vimwiki#vars#get_wikilocal('path'), expand('%:p'))
-endfunction
-
-
-function! vimwiki#base#invsubdir(subdir) abort
- return substitute(a:subdir, '[^/\.]\+/', '../', 'g')
-endfunction
-
-
-" Returns: the number of the wiki a file belongs to or -1 if it doesn't belong
-" to any registered wiki.
-" The path can be the full path or just the directory of the file
-function! vimwiki#base#find_wiki(path) abort
- let bestmatch = -1
- let bestlen = 0
- let path = vimwiki#path#path_norm(vimwiki#path#chomp_slash(a:path))
- for idx in range(vimwiki#vars#number_of_wikis())
- let idx_path = expand(vimwiki#vars#get_wikilocal('path', idx))
- let idx_path = vimwiki#path#path_norm(vimwiki#path#chomp_slash(idx_path))
- let common_pfx = vimwiki#path#path_common_pfx(idx_path, path)
- if vimwiki#path#is_equal(common_pfx, idx_path)
- if len(common_pfx) > bestlen
- let bestlen = len(common_pfx)
- let bestmatch = idx
- endif
- endif
- endfor
-
- return bestmatch
-endfunction
-
-
-" helper: check if a link is a well formed wiki link
-function! s:is_wiki_link(link_infos) abort
- return a:link_infos.scheme =~# '\mwiki\d\+' || a:link_infos.scheme ==# 'diary'
-endfunction
-
-
-" THE central function of Vimwiki. Extract infos about the target from a link.
-" If the second parameter is present, which should be an absolute file path, it
-" is assumed that the link appears in that file. Without it, the current file
-" is used.
-function! vimwiki#base#resolve_link(link_text, ...) abort
- if a:0
- let source_wiki = vimwiki#base#find_wiki(a:1)
- let source_file = a:1
- else
- let source_wiki = vimwiki#vars#get_bufferlocal('wiki_nr')
- let source_file = vimwiki#path#current_wiki_file()
- endif
-
- " get rid of '\' in escaped characters in []() style markdown links
- " other style links don't allow '\'
- let link_text = substitute(a:link_text, '\(\\\)\(\W\)\@=', '', 'g')
-
- let link_infos = {
- \ 'index': -1,
- \ 'scheme': '',
- \ 'filename': '',
- \ 'anchor': '',
- \ }
-
- if link_text ==? ''
- return link_infos
- endif
-
- let scheme = matchstr(link_text, '^\zs'.vimwiki#vars#get_global('rxSchemes').'\ze:')
- if scheme ==? ''
- " interwiki link scheme is default
- let link_infos.scheme = 'wiki'.source_wiki
- else
- let link_infos.scheme = scheme
-
- if link_infos.scheme !~# '\mwiki\d\+\|diary\|local\|file'
- let link_infos.filename = link_text " unknown scheme, may be a weblink
- return link_infos
- endif
-
- let link_text = matchstr(link_text, '^'.vimwiki#vars#get_global('rxSchemes').':\zs.*\ze')
- endif
-
- let is_wiki_link = s:is_wiki_link(link_infos)
-
- " extract anchor
- if is_wiki_link
- let split_lnk = split(link_text, '#', 1)
- let link_text = split_lnk[0]
- if len(split_lnk) > 1 && split_lnk[-1] !=? ''
- let link_infos.anchor = join(split_lnk[1:], '#')
- endif
- if link_text ==? '' " because the link was of the form '#anchor'
- let expected_ext = vimwiki#u#escape(vimwiki#vars#get_wikilocal('ext')).'$'
- if source_file =~# expected_ext
- " Source file has expected extension. Remove it, it will be added later on
- let ext_len = strlen(vimwiki#vars#get_wikilocal('ext'))
- let link_text = fnamemodify(source_file, ':p:t')[:-ext_len-1]
- endif
-
- endif
- endif
-
- " check if absolute or relative path
- if is_wiki_link && link_text[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 is_relative = 0
- else
- let is_relative = 1
- let root_dir = fnamemodify(source_file, ':p:h') . '/'
- endif
-
-
- " extract the other items depending on the scheme
- if link_infos.scheme =~# '\mwiki\d\+'
-
- " interwiki link named wiki 'wn.name:link' format
- let wnmatch = matchlist(link_text, '\m^wn\.\([a-zA-Z0-9\-_ ]\+\):\(.*\)')
- if len(wnmatch) >= 2 && wnmatch[1] !=? '' && wnmatch[2] !=? ''
- let wname = wnmatch[1]
- for idx in range(vimwiki#vars#number_of_wikis())
- if vimwiki#vars#get_wikilocal('name', idx) ==# wname
- " name matches!
- let link_infos.index = idx
- let link_text = wnmatch[2]
- break
- endif
- endfor
- if link_text !=# wnmatch[2]
- " error: invalid wiki name
- let link_infos.index = -2
- let link_infos.filename = ''
- " use scheme field to return invalid wiki name
- let link_infos.scheme = wname
- return link_infos
- endif
- else
- " interwiki link numbered wiki format
- let link_infos.index = eval(matchstr(link_infos.scheme, '\D\+\zs\d\+\ze'))
- if link_infos.index < 0 || link_infos.index >= vimwiki#vars#number_of_wikis()
- let link_infos.index = -1
- let link_infos.filename = ''
- return link_infos
- endif
- endif
-
- if !is_relative || link_infos.index != source_wiki
- let root_dir = vimwiki#vars#get_wikilocal('path', link_infos.index)
- endif
-
- let link_infos.filename = root_dir . link_text
-
- if vimwiki#path#is_link_to_dir(link_text)
- if vimwiki#vars#get_global('dir_link') !=? ''
- let link_infos.filename .= vimwiki#vars#get_global('dir_link') .
- \ vimwiki#vars#get_wikilocal('ext', link_infos.index)
- endif
- else
- let ext = fnamemodify(link_text, ':e')
- if ext ==? '' " append ext iff one not already present
- let link_infos.filename .= vimwiki#vars#get_wikilocal('ext', link_infos.index)
- endif
- endif
-
- elseif link_infos.scheme ==# 'diary'
- let link_infos.index = source_wiki
-
- let link_infos.filename =
- \ vimwiki#vars#get_wikilocal('path', link_infos.index) .
- \ vimwiki#vars#get_wikilocal('diary_rel_path', link_infos.index) .
- \ link_text .
- \ vimwiki#vars#get_wikilocal('ext', link_infos.index)
- elseif (link_infos.scheme ==# 'file' || link_infos.scheme ==# 'local') && is_relative
- let link_infos.filename = simplify(root_dir . link_text)
- else " absolute file link
- " collapse repeated leading "/"'s within a link
- let link_text = substitute(link_text, '\m^/\+', '/', '')
- " expand ~/
- let link_text = fnamemodify(link_text, ':p')
- let link_infos.filename = simplify(link_text)
- endif
-
- let link_infos.filename = vimwiki#path#normalize(link_infos.filename)
- return link_infos
-endfunction
-
-
-function! vimwiki#base#system_open_link(url) abort
- " handlers
- function! s:win32_handler(url) abort
- "Disable shellslash for cmd and command.com, but enable for all other shells
- "See Issue #560
- if (&shell =~? 'cmd') || (&shell =~? 'command.com')
-
- if exists('+shellslash')
- let old_ssl = &shellslash
- set noshellslash
- let url = shellescape(a:url, 1)
- let &shellslash = old_ssl
- else
- let url = shellescape(a:url, 1)
- endif
- execute 'silent ! start "Title" /B ' . url
-
- else
-
- if exists('+shellslash')
- let old_ssl = &shellslash
- set shellslash
- let url = shellescape(a:url, 1)
- let &shellslash = old_ssl
- else
- let url = shellescape(a:url, 1)
- endif
- execute 'silent ! start ' . url
-
- endif
- endfunction
- function! s:macunix_handler(url) abort
- call system('open ' . shellescape(a:url).' &')
- endfunction
- function! s:linux_handler(url) abort
- call system('xdg-open ' . shellescape(a:url).' &')
- endfunction
- try
- if vimwiki#u#is_windows()
- call s:win32_handler(a:url)
- return
- elseif vimwiki#u#is_macos()
- call s:macunix_handler(a:url)
- return
- else
- call s:linux_handler(a:url)
- return
- endif
- endtry
- echomsg 'Vimwiki Error: Default Vimwiki link handler was unable to open the HTML file!'
-endfunction
-
-
-function! vimwiki#base#open_link(cmd, link, ...) abort
- let link_infos = {}
- if a:0
- let link_infos = vimwiki#base#resolve_link(a:link, a:1)
- else
- let link_infos = vimwiki#base#resolve_link(a:link)
- endif
-
- if link_infos.filename ==? ''
- if link_infos.index == -1
- echomsg 'Vimwiki Error: No registered wiki ''' . link_infos.scheme . '''.'
- elseif link_infos.index == -2
- " scheme field stores wiki name for this error case
- echom 'Vimwiki Error: No wiki found with name "' . link_infos.scheme . '"'
- else
- echomsg 'Vimwiki Error: Unable to resolve link!'
- endif
- return
- endif
-
- let is_wiki_link = s:is_wiki_link(link_infos)
-
- let vimwiki_prev_link = []
- " update previous link for wiki pages
- if is_wiki_link
- if a:0
- let vimwiki_prev_link = [a:1, []]
- elseif vimwiki#u#ft_is_vw()
- let vimwiki_prev_link = [vimwiki#path#current_wiki_file(), getpos('.')]
- endif
- endif
-
- " open/edit
- if is_wiki_link
- call vimwiki#base#edit_file(a:cmd, link_infos.filename, link_infos.anchor,
- \ vimwiki_prev_link, is_wiki_link)
- else
- call vimwiki#base#system_open_link(link_infos.filename)
- endif
-endfunction
-
-
-function! vimwiki#base#get_globlinks_escaped(...) abort
- let s_arg_lead = a:0 > 0 ? a:1 : ''
- " only get links from the current dir
- " change to the directory of the current file
- let orig_pwd = getcwd()
- lcd! %:h
- " all path are relative to the current file's location
- let globlinks = glob('**/*'.vimwiki#vars#get_wikilocal('ext'), 1)."\n"
- " remove extensions
- let globlinks = substitute(globlinks, '\'.vimwiki#vars#get_wikilocal('ext').'\ze\n', '', 'g')
- " restore the original working directory
- exe 'lcd! '.orig_pwd
- " convert to a List
- let lst = split(globlinks, '\n')
- " Filter files whose path matches the user's argument leader
- " " use smart case matching
- let r_arg = substitute(s_arg_lead, '\u', '[\0\l\0]', 'g')
- call filter(lst, '-1 != match(v:val, r_arg)')
- " Apply fnameescape() to each item
- call map(lst, 'fnameescape(v:val)')
- " Return list (for customlist completion)
- return lst
-endfunction
-
-
-" Optional pattern argument
-function! vimwiki#base#generate_links(create, ...) abort
- " Get pattern if present
- " Globlal to script to be passed to closure
- if a:0
- let s:pattern = a:1
- else
- let s:pattern = ''
- endif
-
- " Define link generator closure
- let GeneratorLinks = copy(l:)
- function! GeneratorLinks.f() abort
- let lines = []
-
- let links = vimwiki#base#get_wikilinks(vimwiki#vars#get_bufferlocal('wiki_nr'), 0, s:pattern)
- call sort(links)
-
- let bullet = repeat(' ', vimwiki#lst#get_list_margin()) . vimwiki#lst#default_symbol().' '
- let l:diary_file_paths = vimwiki#diary#get_diary_files()
-
- for link in links
- let link_infos = vimwiki#base#resolve_link(link)
- if !vimwiki#base#is_diary_file(link_infos.filename, copy(l:diary_file_paths))
- if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
- let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink1Template')
- else
- let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1')
- endif
-
- let link_caption = vimwiki#base#read_caption(link_infos.filename)
- if link_caption ==? '' " default to link if caption not found
- let link_caption = link
- endif
-
- let entry = s:safesubstitute(link_tpl, '__LinkUrl__', link, '')
- let entry = s:safesubstitute(entry, '__LinkDescription__', link_caption, '')
- call add(lines, bullet. entry)
- endif
- endfor
-
- return lines
- endfunction
-
- let links_rx = '\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxListBullet').'\)'
-
- call vimwiki#base#update_listing_in_buffer(
- \ GeneratorLinks,
- \ vimwiki#vars#get_global('links_header'),
- \ links_rx,
- \ line('$')+1,
- \ vimwiki#vars#get_global('links_header_level'),
- \ a:create)
-endfunction
-
-
-function! vimwiki#base#goto(...) abort
- let key = a:0 > 0 ? a:1 : input('Enter name: ')
- let anchor = a:0 > 1 ? a:2 : ''
-
- " Save current file pos
- let vimwiki_prev_link = [vimwiki#path#current_wiki_file(), getpos('.')]
-
- call vimwiki#base#edit_file(':e',
- \ vimwiki#vars#get_wikilocal('path') . key . vimwiki#vars#get_wikilocal('ext'),
- \ anchor,
- \ vimwiki_prev_link,
- \ vimwiki#u#ft_is_vw())
-endfunction
-
-
-function! vimwiki#base#backlinks() abort
- let current_filename = expand('%:p')
- let locations = []
- for idx in range(vimwiki#vars#number_of_wikis())
- let syntax = vimwiki#vars#get_wikilocal('syntax', idx)
- let wikifiles = vimwiki#base#find_files(idx, 0)
- for source_file in wikifiles
- let links = s:get_links(source_file, idx)
- for [target_file, _, lnum, col] in links
- if vimwiki#u#is_windows()
- " TODO this is a temporary fix - see issue #478
- let target_file = substitute(target_file, '/', '\', 'g')
- let current_filename = substitute(current_filename, '/', '\', 'g')
- endif
- " don't include links from the current file to itself
- if vimwiki#path#is_equal(target_file, current_filename) &&
- \ !vimwiki#path#is_equal(target_file, source_file)
- call add(locations, {'filename':source_file, 'lnum':lnum, 'col':col})
- endif
- endfor
- endfor
- endfor
-
- if empty(locations)
- echomsg 'Vimwiki: No other file links to this file'
- else
- call setloclist(0, locations, 'r')
- lopen
- endif
-endfunction
-
-
-" Returns: a list containing all files of the given wiki as absolute file path.
-" If the given wiki number is negative, the diary of the current wiki is used
-" If the second argument is not zero, only directories are found
-" If third argument: pattern to search for
-function! vimwiki#base#find_files(wiki_nr, directories_only, ...) abort
- let wiki_nr = a:wiki_nr
- if wiki_nr >= 0
- let root_directory = vimwiki#vars#get_wikilocal('path', wiki_nr)
- else
- let root_directory = vimwiki#vars#get_wikilocal('path') .
- \ vimwiki#vars#get_wikilocal('diary_rel_path')
- let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr')
- endif
- if a:directories_only
- let ext = '/'
- else
- let ext = vimwiki#vars#get_wikilocal('ext', wiki_nr)
- endif
- " If pattern is given, use it
- " if current wiki is temporary -- was added by an arbitrary wiki file then do
- " not search wiki files in subdirectories. Or it would hang the system if
- " wiki file was created in $HOME or C:/ dirs.
- if a:0 && a:1 !=# ''
- let pattern = a:1
- elseif vimwiki#vars#get_wikilocal('is_temporary_wiki', wiki_nr)
- let pattern = '*'.ext
- else
- let pattern = '**/*'.ext
- endif
- let files = split(globpath(root_directory, pattern), '\n')
-
- " filter excluded files before returning
- for pattern in vimwiki#vars#get_wikilocal('exclude_files')
- let efiles = split(globpath(root_directory, pattern), '\n')
- let files = filter(files, 'index(efiles, v:val) == -1')
- endfor
-
- return files
-endfunction
-
-
-" Returns: a list containing the links to get from the current file to all wiki
-" files in the given wiki.
-" If the given wiki number is negative, the diary of the current wiki is used.
-" If also_absolute_links is nonzero, also return links of the form /file
-" If pattern is not '', only filepaths matching pattern will be considered
-function! vimwiki#base#get_wikilinks(wiki_nr, also_absolute_links, pattern) abort
- let files = vimwiki#base#find_files(a:wiki_nr, 0, a:pattern)
- if a:wiki_nr == vimwiki#vars#get_bufferlocal('wiki_nr')
- let cwd = vimwiki#path#wikify_path(expand('%:p:h'))
- elseif a:wiki_nr < 0
- let cwd = vimwiki#vars#get_wikilocal('path') . vimwiki#vars#get_wikilocal('diary_rel_path')
- else
- let cwd = vimwiki#vars#get_wikilocal('path', a:wiki_nr)
- endif
- let result = []
- for wikifile in files
- let wikifile = fnamemodify(wikifile, ':r') " strip extension
- if vimwiki#u#is_windows()
- " TODO temporary fix see #478
- let wikifile = substitute(wikifile , '/', '\', 'g')
- endif
- let wikifile = vimwiki#path#relpath(cwd, wikifile)
- call add(result, wikifile)
- endfor
- if a:also_absolute_links
- for wikifile in files
- if a:wiki_nr == vimwiki#vars#get_bufferlocal('wiki_nr')
- let cwd = vimwiki#vars#get_wikilocal('path')
- elseif a:wiki_nr < 0
- let cwd = vimwiki#vars#get_wikilocal('path') . vimwiki#vars#get_wikilocal('diary_rel_path')
- endif
- let wikifile = fnamemodify(wikifile, ':r') " strip extension
- if vimwiki#u#is_windows()
- " TODO temporary fix see #478
- let wikifile = substitute(wikifile , '/', '\', 'g')
- endif
- let wikifile = '/'.vimwiki#path#relpath(cwd, wikifile)
- call add(result, wikifile)
- endfor
- endif
- return result
-endfunction
-
-
-" Returns: a list containing the links to all directories from the current file
-function! vimwiki#base#get_wiki_directories(wiki_nr) abort
- let dirs = vimwiki#base#find_files(a:wiki_nr, 1)
- if a:wiki_nr == vimwiki#vars#get_bufferlocal('wiki_nr')
- let cwd = vimwiki#path#wikify_path(expand('%:p:h'))
- let root_dir = vimwiki#vars#get_wikilocal('path')
- else
- let cwd = vimwiki#vars#get_wikilocal('path', a:wiki_nr)
- endif
- let result = ['./']
- for wikidir in dirs
- let wikidir_relative = vimwiki#path#relpath(cwd, wikidir)
- call add(result, wikidir_relative)
- if a:wiki_nr == vimwiki#vars#get_bufferlocal('wiki_nr')
- let wikidir_absolute = '/'.vimwiki#path#relpath(root_dir, wikidir)
- call add(result, wikidir_absolute)
- endif
- endfor
- return result
-endfunction
-
-
-function! vimwiki#base#get_anchors(filename, syntax) abort
- if !filereadable(a:filename)
- return []
- endif
-
- let rxheader = vimwiki#vars#get_syntaxlocal('header_search', a:syntax)
- let rxbold = vimwiki#vars#get_syntaxlocal('bold_search', a:syntax)
- let rxtag = vimwiki#vars#get_syntaxlocal('tag_search', a:syntax)
-
- let anchor_level = ['', '', '', '', '', '', '']
- let anchors = []
- let current_complete_anchor = ''
- 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])
- call add(anchors, header)
- let anchor_level[level-1] = header
- for l in range(level, 6)
- let anchor_level[l] = ''
- endfor
- if level == 1
- let current_complete_anchor = header
- else
- let current_complete_anchor = ''
- for l in range(level-1)
- if anchor_level[l] !=? ''
- let current_complete_anchor .= anchor_level[l].'#'
- endif
- endfor
- let current_complete_anchor .= header
- call add(anchors, current_complete_anchor)
- endif
- endif
-
- " collect bold text (there can be several in one line)
- let bold_count = 1
- while 1
- let bold_text = matchstr(line, rxbold, 0, bold_count)
- if bold_text ==? ''
- break
- endif
- call add(anchors, bold_text)
- if current_complete_anchor !=? ''
- call add(anchors, current_complete_anchor.'#'.bold_text)
- endif
- let bold_count += 1
- endwhile
-
- " collect tags text (there can be several in one line)
- let tag_count = 1
- while 1
- let tag_group_text = matchstr(line, rxtag, 0, tag_count)
- if tag_group_text ==? ''
- break
- endif
- for tag_text in split(tag_group_text, ':')
- call add(anchors, tag_text)
- if current_complete_anchor !=? ''
- call add(anchors, current_complete_anchor.'#'.tag_text)
- endif
- endfor
- let tag_count += 1
- endwhile
-
- endfor
-
- return anchors
-endfunction
-
-
-function! s:jump_to_anchor(anchor) abort
- let oldpos = getpos('.')
- call cursor(1, 1)
-
- let anchor = vimwiki#u#escape(a:anchor)
-
- let segments = split(anchor, '#', 0)
-
- for segment in segments
-
- let anchor_header = s:safesubstitute(
- \ vimwiki#vars#get_syntaxlocal('header_match'),
- \ '__Header__', segment, '')
- let anchor_bold = s:safesubstitute(
- \ vimwiki#vars#get_syntaxlocal('bold_match'),
- \ '__Text__', segment, '')
- let anchor_tag = s:safesubstitute(
- \ vimwiki#vars#get_syntaxlocal('tag_match'),
- \ '__Tag__', segment, '')
-
- if !search(anchor_tag, 'Wc') && !search(anchor_header, 'Wc') && !search(anchor_bold, 'Wc')
- call setpos('.', oldpos)
- break
- endif
- let oldpos = getpos('.')
- endfor
-endfunction
-
-
-" Params: full path to a wiki file and its wiki number
-" Returns: a list of all links inside the wiki file
-" Every list item has the form
-" [target file, anchor, line number of the link in source file, column number]
-function! s:get_links(wikifile, idx) abort
- if !filereadable(a:wikifile)
- return []
- endif
-
- let syntax = vimwiki#vars#get_wikilocal('syntax', a:idx)
- if syntax ==# 'markdown'
- let rx_link = vimwiki#vars#get_syntaxlocal('rxWeblink1MatchUrl', syntax)
- else
- let rx_link = vimwiki#vars#get_syntaxlocal('wikilink', syntax)
- endif
-
- let links = []
- let lnum = 0
-
- for line in readfile(a:wikifile)
- let lnum += 1
-
- let link_count = 1
- while 1
- let col = match(line, rx_link, 0, link_count)+1
- let link_text = matchstr(line, rx_link, 0, link_count)
- if link_text ==? ''
- break
- endif
- let link_count += 1
- let target = vimwiki#base#resolve_link(link_text, a:wikifile)
- if target.filename !=? '' && target.scheme =~# '\mwiki\d\+\|diary\|file\|local'
- call add(links, [target.filename, target.anchor, lnum, col])
- endif
- endwhile
- endfor
-
- return links
-endfunction
-
-
-function! vimwiki#base#check_links() abort
- let anchors_of_files = {}
- let links_of_files = {}
- let errors = []
- for idx in range(vimwiki#vars#number_of_wikis())
- let syntax = vimwiki#vars#get_wikilocal('syntax', idx)
- let wikifiles = vimwiki#base#find_files(idx, 0)
- for wikifile in wikifiles
- let links_of_files[wikifile] = s:get_links(wikifile, idx)
- let anchors_of_files[wikifile] = vimwiki#base#get_anchors(wikifile, syntax)
- endfor
- endfor
-
- for wikifile in keys(links_of_files)
- for [target_file, target_anchor, lnum, col] in links_of_files[wikifile]
- if target_file ==? '' && target_anchor ==? ''
- call add(errors, {'filename':wikifile, 'lnum':lnum, 'col':col,
- \ 'text': 'numbered scheme refers to a non-existent wiki'})
- elseif has_key(anchors_of_files, target_file)
- if target_anchor !=? '' && index(anchors_of_files[target_file], target_anchor) < 0
- call add(errors, {'filename':wikifile, 'lnum':lnum, 'col':col,
- \'text': 'there is no such anchor: '.target_anchor})
- endif
- else
- if target_file =~? '\m/$' " maybe it's a link to a directory
- if !isdirectory(target_file)
- call add(errors, {'filename':wikifile, 'lnum':lnum, 'col':col,
- \'text': 'there is no such directory: '.target_file})
- endif
- else " maybe it's a non-wiki file
- if filereadable(target_file)
- let anchors_of_files[target_file] = []
- else
- call add(errors, {'filename':wikifile, 'lnum':lnum, 'col':col,
- \'text': 'there is no such file: '.target_file})
- endif
- endif
- endif
- endfor
- endfor
-
-
- " Check which wiki files are reachable from at least one of the index files.
- " First, all index files are marked as reachable. Then, pick a reachable file
- " and mark all files to which it links as reachable, too. Repeat until the
- " links of all reachable files have been checked.
-
- " Map every wiki file to a number. 0 means not reachable from any index file,
- " 1 means reachable, but the outgoing links are not checked yet, 2 means
- " reachable and done.
- let reachable_wikifiles = {}
-
- " first, all files are considered not reachable
- for wikifile in keys(links_of_files)
- let reachable_wikifiles[wikifile] = 0
- endfor
-
- " mark every index file as reachable
- for idx in range(vimwiki#vars#number_of_wikis())
- let index_file = vimwiki#vars#get_wikilocal('path', idx) .
- \ vimwiki#vars#get_wikilocal('index', idx) . vimwiki#vars#get_wikilocal('ext', idx)
- if filereadable(index_file)
- let reachable_wikifiles[index_file] = 1
- endif
- endfor
-
- while 1
- let next_unvisited_wikifile = ''
- for wf in keys(reachable_wikifiles)
- if reachable_wikifiles[wf] == 1
- let next_unvisited_wikifile = wf
- let reachable_wikifiles[wf] = 2
- break
- endif
- endfor
- if next_unvisited_wikifile ==? ''
- break
- endif
- for [target_file, target_anchor, lnum, col] in links_of_files[next_unvisited_wikifile]
- if has_key(reachable_wikifiles, target_file) && reachable_wikifiles[target_file] == 0
- let reachable_wikifiles[target_file] = 1
- endif
- endfor
- endwhile
-
- for wf in keys(reachable_wikifiles)
- if reachable_wikifiles[wf] == 0
- call add(errors, {'text':wf.' is not reachable from the index file'})
- endif
- endfor
-
- if empty(errors)
- echomsg 'Vimwiki: All links are OK'
- else
- call setqflist(errors, 'r')
- copen
- endif
-endfunction
-
-
-function! vimwiki#base#edit_file(command, filename, anchor, ...) abort
- let fname = escape(a:filename, '% *|#`')
- let dir = fnamemodify(a:filename, ':p:h')
-
- let ok = vimwiki#path#mkdir(dir, 1)
-
- if !ok
- echomsg ' '
- echomsg 'Vimwiki Error: Unable to edit file in non-existent directory: '.dir
- return
- endif
-
- " Check if the file we want to open is already the current file
- " which happens if we jump to an achor in the current file.
- " This hack is necessary because apparently Vim messes up the result of
- " getpos() directly after this command. Strange.
- if !(a:command ==# ':e ' && vimwiki#path#is_equal(a:filename, expand('%:p')))
- try
- execute a:command fname
- catch /E37:/
- echomsg 'Vimwiki: Can''t leave the current buffer, because it is modified. Hint: Take a look at'
- \ ''':h g:vimwiki_autowriteall'' to see how to save automatically.'
- return
- catch /E325:/
- echom 'Vimwiki: Vim couldn''t open the file, probably because a swapfile already exists. See :h E325.'
- return
- endtry
-
- " If the opened file was not already loaded by Vim, an autocommand is
- " triggered at this point
-
- " Make sure no other plugin takes ownership over the new file. Vimwiki
- " rules them all! Well, except for directories, which may be opened with
- " Netrw
- if !vimwiki#u#ft_is_vw() && fname !~? '\m/$'
- call vimwiki#u#ft_set()
- endif
- endif
- if a:anchor !=? ''
- call s:jump_to_anchor(a:anchor)
- endif
-
- " save previous link
- " a:1 -- previous vimwiki link to save
- " a:2 -- should we update previous link
- if a:0 && a:2 && len(a:1) > 0
- let prev_links = vimwiki#vars#get_bufferlocal('prev_links')
- call insert(prev_links, a:1)
- call vimwiki#vars#set_bufferlocal('prev_links', prev_links)
- endif
-endfunction
-
-
-function! vimwiki#base#search_word(wikiRx, cmd) abort
- let match_line = search(a:wikiRx, 's'.a:cmd)
- if match_line == 0
- echomsg 'Vimwiki: Wiki link not found'
- endif
-endfunction
-
-
-" Returns part of the line that matches wikiRX at cursor
-function! vimwiki#base#matchstr_at_cursor(wikiRX) abort
- let col = col('.') - 1
- let line = getline('.')
- let ebeg = -1
- let cont = match(line, a:wikiRX, 0)
- while (ebeg >= 0 || (0 <= cont) && (cont <= col))
- let contn = matchend(line, a:wikiRX, cont)
- if (cont <= col) && (col < contn)
- let ebeg = match(line, a:wikiRX, cont)
- let elen = contn - ebeg
- break
- else
- let cont = match(line, a:wikiRX, contn)
- endif
- endwh
- if ebeg >= 0
- return strpart(line, ebeg, elen)
- else
- return ''
- endif
-endfunction
-
-
-function! vimwiki#base#replacestr_at_cursor(wikiRX, sub) abort
- let col = col('.') - 1
- let line = getline('.')
- let ebeg = -1
- let cont = match(line, a:wikiRX, 0)
- while (ebeg >= 0 || (0 <= cont) && (cont <= col))
- let contn = matchend(line, a:wikiRX, cont)
- if (cont <= col) && (col < contn)
- let ebeg = match(line, a:wikiRX, cont)
- let elen = contn - ebeg
- break
- else
- let cont = match(line, a:wikiRX, contn)
- endif
- endwh
- if ebeg >= 0
- " TODO: There might be problems with Unicode chars...
- let newline = strpart(line, 0, ebeg).a:sub.strpart(line, ebeg+elen)
- call setline(line('.'), newline)
- endif
-endfunction
-
-
-function! s:print_wiki_list() abort
- " find the max name length for prettier formatting
- let max_len = 0
- for idx in range(vimwiki#vars#number_of_wikis())
- let wname = vimwiki#vars#get_wikilocal('name', idx)
- if len(wname) > max_len
- let max_len = len(wname)
- endif
- endfor
-
- " print each wiki, active wiki highlighted and marked with '*'
- for idx in range(vimwiki#vars#number_of_wikis())
- if idx == vimwiki#vars#get_bufferlocal('wiki_nr')
- let sep = '*'
- echohl PmenuSel
- else
- let sep = ' '
- echohl None
- endif
- let wname = vimwiki#vars#get_wikilocal('name', idx)
- let wpath = vimwiki#vars#get_wikilocal('path', idx)
- if wname ==? ''
- let wname = '----'
- if max_len < 4
- let max_len = 4
- endif
- endif
- let wname = '"' . wname . '"'
- echo printf('%2d %s %-*s %s', idx+1, sep, max_len+2, wname, wpath)
- endfor
- echohl None
-endfunction
-
-
-" Update link: in fname.ext
-" Param: fname: the source file where to change links
-" Param: old: url regex of old path relative to wiki root
-" Param: new: url string of new path
-function! s:update_wiki_link(fname, old, new) abort
- echo 'Updating links in '.a:fname
- let has_updates = 0
- let dest = []
- for line in readfile(a:fname)
- if !has_updates && match(line, a:old) != -1
- let has_updates = 1
- endif
- " XXX: any other characters to escape!?
- call add(dest, substitute(line, a:old, escape(a:new, '&'), 'g'))
- endfor
- " add exception handling...
- if has_updates
- call rename(a:fname, a:fname.'#vimwiki_upd#')
- call writefile(dest, a:fname)
- call delete(a:fname.'#vimwiki_upd#')
- endif
-endfunction
-
-
-" Update link for all files in dir
-" Param: old_url, new_url: path of the old, new url relative to ...
-" Param: dir: directory of the files, relative to wiki_root
-function! s:update_wiki_links(wiki_nr, dir, old_url, new_url) abort
- " Get list of wiki files
- let wiki_root = vimwiki#vars#get_wikilocal('path', a:wiki_nr)
- let fsources = vimwiki#base#find_files(a:wiki_nr, 0)
-
- " Shorten dirname
- let dir_rel_root = vimwiki#path#relpath(wiki_root, a:dir)
-
- " Cache relative url, because they are often the same, like `../dir1/vim-vimwiki.md`
- let cache_dict = {}
-
- " Regex from path
- function! s:compute_old_url_r(wiki_nr, dir_rel_fsource, old_url) abort
- " Old url
- let old_url_r = a:dir_rel_fsource . a:old_url
- " Add potential ./
- let old_url_r = '\%(\.[/\\]\)\?' . old_url_r
- " Compute old url regex with filename between \zs and \ze
- let old_url_r = vimwiki#base#apply_template(
- \ vimwiki#vars#get_syntaxlocal('WikiLinkMatchUrlTemplate',
- \ vimwiki#vars#get_wikilocal('syntax', a:wiki_nr)), old_url_r, '', '')
-
- return old_url_r
- endfunction
-
- " For each wikifile
- for fsource in fsources
- " Shorten fname directory
- let fsource_rel_root = vimwiki#path#relpath(wiki_root, fsource)
- let fsource_rel_root = fnamemodify(fsource_rel_root, ':h')
-
- " Compute old_url relative to fname
- let dir_rel_fsource = vimwiki#path#relpath(fsource_rel_root, dir_rel_root)
- " TODO get relpath coherent (and remove next 2 stuff)
- " Remove the trailing ./
- if dir_rel_fsource =~# '.[/\\]$'
- let dir_rel_fsource = dir_rel_fsource[:-3]
- endif
- " Append a / if needed
- if !empty(dir_rel_fsource) && dir_rel_fsource !~# '[/\\]$'
- let dir_rel_fsource .= '/'
- endif
-
- " New url
- let new_url = dir_rel_fsource . a:new_url
-
- " Old url
- " Avoid E713
- let key = empty(dir_rel_fsource) ? 'NaF' : dir_rel_fsource
- if index(keys(cache_dict), key) == -1
- let cache_dict[key] = s:compute_old_url_r(
- \ a:wiki_nr, dir_rel_fsource, a:old_url)
- endif
- let old_url_r = cache_dict[key]
-
- " Update url in source file
- call s:update_wiki_link(fsource, old_url_r, new_url)
- endfor
-endfunction
-
-
-function! s:tail_name(fname) abort
- let result = substitute(a:fname, ':', '__colon__', 'g')
- let result = fnamemodify(result, ':t:r')
- let result = substitute(result, '__colon__', ':', 'g')
- return result
-endfunction
-
-
-function! s:get_wiki_buffers() abort
- let blist = []
- let bcount = 1
- while bcount<=bufnr('$')
- if bufexists(bcount)
- let bname = fnamemodify(bufname(bcount), ':p')
- " this may find buffers that are not part of the current wiki, but that
- " doesn't hurt
- if bname =~# vimwiki#vars#get_wikilocal('ext').'$'
- let bitem = [bname, vimwiki#vars#get_bufferlocal('prev_links', bcount)]
- call add(blist, bitem)
- endif
- endif
- let bcount = bcount + 1
- endwhile
- return blist
-endfunction
-
-
-function! s:open_wiki_buffer(item) abort
- call vimwiki#base#edit_file(':e', a:item[0], '')
- if !empty(a:item[1])
- call vimwiki#vars#set_bufferlocal('prev_links', a:item[1], a:item[0])
- endif
-endfunction
-
-
-function! vimwiki#base#nested_syntax(filetype, start, end, textSnipHl) abort
-" From http://vim.wikia.com/wiki/VimTip857
- let ft=toupper(a:filetype)
- let group='textGroup'.ft
- if exists('b:current_syntax')
- let s:current_syntax=b:current_syntax
- " Remove current syntax definition, as some syntax files (e.g. cpp.vim)
- " do nothing if b:current_syntax is defined.
- unlet b:current_syntax
- endif
-
- " Some syntax files set up iskeyword which might scratch vimwiki a bit.
- " Let us save and restore it later.
- " let b:skip_set_iskeyword = 1
- let is_keyword = &iskeyword
-
- " Check for the existence of syntax files in the runtime path before
- " attempting to include them.
- " https://vi.stackexchange.com/a/10354
- " Previously, this used a try/catch block to intercept any errors thrown
- " when attempting to include files. The error(s) interferred with running
- " with Vader tests (specifically, testing VimwikiSearch).
- if !empty(globpath(&runtimepath, 'syntax/'.a:filetype.'.vim'))
- execute 'syntax include @'.group.' syntax/'.a:filetype.'.vim'
- endif
- if !empty(globpath(&runtimepath, 'after/syntax/'.a:filetype.'.vim'))
- execute 'syntax include @'.group.' after/syntax/'.a:filetype.'.vim'
- endif
-
- let &iskeyword = is_keyword
-
- if exists('s:current_syntax')
- let b:current_syntax=s:current_syntax
- else
- unlet b:current_syntax
- endif
-
- " Fix issue #236: tell Vimwiki to think in maths when encountering maths
- " blocks like {{$ }}$. Here, we don't want the tex highlight group, but the
- " group for tex math.
- if a:textSnipHl ==# 'VimwikiMath'
- let group='texMathZoneGroup'
- endif
-
- let concealpre = vimwiki#vars#get_global('conceal_pre') ? ' concealends' : ''
- execute 'syntax region textSnip'.ft.
- \ ' matchgroup='.a:textSnipHl.
- \ ' start="'.a:start.'" end="'.a:end.'"'.
- \ ' contains=@'.group.' keepend'.concealpre
-
- " A workaround to Issue 115: Nested Perl syntax highlighting differs from
- " regular one.
- " Perl syntax file has perlFunctionName which is usually has no effect due to
- " 'contained' flag. Now we have 'syntax include' that makes all the groups
- " included as 'contained' into specific group.
- " Here perlFunctionName (with quite an angry regexp "\h\w*[^:]") clashes with
- " the rest syntax rules as now it has effect being really 'contained'.
- " Clear it!
- if ft =~? 'perl'
- syntax clear perlFunctionName
- endif
-endfunction
-
-
-" creates or updates auto-generated listings in a wiki file, like TOC, diary
-" links, tags list etc.
-" - the listing consists of a header and a list of strings provided by a funcref
-" - a:content_regex is used to determine how long a potentially existing list is
-" - a:default_lnum is the line number where the new listing should be placed if
-" it's not already present
-" - if a:create is true, it will be created if it doesn't exist, otherwise it
-" will only be updated if it already exists
-function! vimwiki#base#update_listing_in_buffer(Generator, start_header,
- \ content_regex, default_lnum, header_level, create) abort
- " Vim behaves strangely when files change while in diff mode
- if &diff || &readonly
- return
- endif
-
- " check if the listing is already there
- let already_there = 0
-
- let header_level = 'rxH' . a:header_level . '_Template'
- let header_rx = '\m^\s*'.substitute(vimwiki#vars#get_syntaxlocal(header_level),
- \ '__Header__', a:start_header, '') .'\s*$'
-
- let start_lnum = 1
- while start_lnum <= line('$')
- if getline(start_lnum) =~# header_rx
- let already_there = 1
- break
- endif
- let start_lnum += 1
- endwhile
-
- if !already_there && !a:create
- return
- endif
-
- let winview_save = winsaveview()
- let cursor_line = winview_save.lnum
- let is_cursor_after_listing = 0
-
- let is_fold_closed = 1
-
- let lines_diff = 0
-
- if already_there
- let is_fold_closed = ( foldclosed(start_lnum) > -1 )
- " delete the old listing
- let whitespaces_in_first_line = matchstr(getline(start_lnum), '\m^\s*')
- let end_lnum = start_lnum + 1
- while end_lnum <= line('$') && getline(end_lnum) =~# a:content_regex
- let end_lnum += 1
- endwhile
- let is_cursor_after_listing = ( cursor_line >= end_lnum )
- " We'll be removing a range. But, apparently, if folds are enabled, Vim
- " won't let you remove a range that overlaps with closed fold -- the entire
- " fold gets deleted. So we temporarily disable folds, and then reenable
- " them right back.
- let foldenable_save = &l:foldenable
- setlocal nofoldenable
- silent exe 'keepjumps ' . start_lnum.','.string(end_lnum - 1).'delete _'
- let &l:foldenable = foldenable_save
- let lines_diff = 0 - (end_lnum - start_lnum)
- else
- let start_lnum = a:default_lnum
- let is_cursor_after_listing = ( cursor_line > a:default_lnum )
- let whitespaces_in_first_line = ''
- " append newline if not replacing first line
- if start_lnum > 1
- keepjumps call append(start_lnum -1, '')
- let start_lnum += 1
- endif
- endif
-
- let start_of_listing = start_lnum
-
- " write new listing
- let new_header = whitespaces_in_first_line
- \ . s:safesubstitute(vimwiki#vars#get_syntaxlocal(header_level),
- \ '__Header__', a:start_header, '')
- keepjumps call append(start_lnum - 1, new_header)
- let start_lnum += 1
- let lines_diff += 1
- if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
- for _ in range(vimwiki#vars#get_global('markdown_header_style'))
- keepjumps call append(start_lnum - 1, '')
- let start_lnum += 1
- let lines_diff += 1
- endfor
- endif
- for string in a:Generator.f()
- keepjumps call append(start_lnum - 1, string)
- let start_lnum += 1
- let lines_diff += 1
- endfor
-
- " remove empty line if end of file, otherwise append if needed
- if start_lnum == line('$')
- silent exe 'keepjumps ' . start_lnum.'delete _'
- elseif start_lnum < line('$') && getline(start_lnum) !~# '\m^\s*$'
- keepjumps call append(start_lnum - 1, '')
- let lines_diff += 1
- endif
-
- " Open fold, if needed
- if !is_fold_closed && ( foldclosed(start_of_listing) > -1 )
- exe start_of_listing
- norm! zo
- endif
-
- if is_cursor_after_listing
- let winview_save.lnum += lines_diff
- endif
- call winrestview(winview_save)
-endfunction
-
-function! vimwiki#base#find_next_task() abort
- let taskRegex = vimwiki#vars#get_syntaxlocal('rxListItemWithoutCB')
- \ . '\+\(\[ \]\s\+\)\zs'
- call vimwiki#base#search_word(taskRegex, '')
-endfunction
-
-function! vimwiki#base#find_next_link() abort
- call vimwiki#base#search_word(vimwiki#vars#get_syntaxlocal('rxAnyLink'), '')
-endfunction
-
-
-function! vimwiki#base#find_prev_link() abort
- "Jump 2 times if the cursor is in the middle of a link
- if synIDattr(synID(line('.'), col('.'), 0), 'name') =~# 'VimwikiLink.*' &&
- \ synIDattr(synID(line('.'), col('.')-1, 0), 'name') =~# 'VimwikiLink.*'
- call vimwiki#base#search_word(vimwiki#vars#get_syntaxlocal('rxAnyLink'), 'b')
- endif
- call vimwiki#base#search_word(vimwiki#vars#get_syntaxlocal('rxAnyLink'), 'b')
-endfunction
-
-
-function! vimwiki#base#follow_link(split, ...) abort
- let reuse_other_split_window = a:0 >= 1 ? a:1 : 0
- let move_cursor_to_new_window = a:0 >= 2 ? a:2 : 1
-
- " Parse link at cursor and pass to VimwikiLinkHandler, or failing that, the
- " default open_link handler
-
- " try WikiLink
- let lnk = matchstr(vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink')),
- \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'))
- " try WikiIncl
- if lnk ==? ''
- let lnk = matchstr(vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWikiIncl')),
- \ vimwiki#vars#get_global('rxWikiInclMatchUrl'))
- endif
- " try Weblink
- if lnk ==? ''
- let lnk = matchstr(vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink')),
- \ vimwiki#vars#get_syntaxlocal('rxWeblinkMatchUrl'))
- endif
-
- if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
- " markdown image ![]()
- if lnk ==# ''
- let lnk = matchstr(vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxImage')),
- \ vimwiki#vars#get_syntaxlocal('rxWeblinkMatchUrl'))
- if lnk !=# ''
- if lnk !~# '\%(\%('.vimwiki#vars#get_global('web_schemes1').'\):\%(\/\/\)\?\)\S\{-1,}'
- " prepend file: scheme so link is opened by sytem handler if it isn't a web url
- let lnk = 'file:'.lnk
- endif
- endif
- endif
- endif
-
- if lnk !=? '' " cursor is indeed on a link
- let processed_by_user_defined_handler = VimwikiLinkHandler(lnk)
- if processed_by_user_defined_handler
- return
- endif
-
- if a:split ==# 'hsplit'
- let cmd = ':split '
- elseif a:split ==# 'vsplit'
- let cmd = ':vsplit '
- elseif a:split ==# 'tab'
- let cmd = ':tabnew '
- else
- let cmd = ':e '
- endif
-
- " if we want to and can reuse a split window, jump to that window and open
- " the new file there
- if (a:split ==# 'hsplit' || a:split ==# 'vsplit') && reuse_other_split_window
- let previous_window_nr = winnr('#')
- if previous_window_nr > 0 && previous_window_nr != winnr()
- execute previous_window_nr . 'wincmd w'
- let cmd = ':e'
- endif
- endif
-
-
- if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
- let processed_by_markdown_reflink = vimwiki#markdown_base#open_reflink(lnk)
- if processed_by_markdown_reflink
- return
- endif
-
- " remove the extension from the filename if exists, because non-vimwiki
- " markdown files usually include the extension in links
- let lnk = substitute(lnk, '\'.vimwiki#vars#get_wikilocal('ext').'$', '', '')
- endif
-
- let current_tab_page = tabpagenr()
-
- call vimwiki#base#open_link(cmd, lnk)
-
- if !move_cursor_to_new_window
- if (a:split ==# 'hsplit' || a:split ==# 'vsplit')
- execute 'wincmd p'
- elseif a:split ==# 'tab'
- execute 'tabnext ' . current_tab_page
- endif
- endif
-
- else " cursor is not on a link
- if a:0 >= 3
- execute 'normal! '.a:3
- elseif vimwiki#vars#get_global('create_link')
- call vimwiki#base#normalize_link(0)
- endif
- endif
-endfunction
-
-
-function! vimwiki#base#go_back_link() abort
- " try pop previous link from buffer list
- let prev_links = vimwiki#vars#get_bufferlocal('prev_links')
- if !empty(prev_links)
- let prev_link = remove(prev_links, 0)
- call vimwiki#vars#set_bufferlocal('prev_links', prev_links)
- else
- let prev_link = []
- endif
-
- if !empty(prev_link)
- " go back to saved wiki link
- call vimwiki#base#edit_file(':e ', prev_link[0], '')
- call setpos('.', prev_link[1])
- else
- " maybe we came here by jumping to a tag -> pop from the tag stack
- silent! pop!
- endif
-endfunction
-
-
-function! vimwiki#base#goto_index(wnum, ...) abort
-
- " if wnum = 0 the current wiki is used
- if a:wnum == 0
- let idx = vimwiki#vars#get_bufferlocal('wiki_nr')
- if idx < 0 " not in a wiki
- let idx = 0
- endif
- else
- let idx = a:wnum - 1 " convert to 0 based counting
- endif
-
- if a:wnum > vimwiki#vars#number_of_wikis()
- echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in your Vimwiki settings!'
- return
- endif
-
- if a:0
- if a:1 == 1
- let cmd = 'tabedit'
- elseif a:1 == 2
- let cmd = 'split'
- elseif a:1 == 3
- let cmd = 'vsplit'
- endif
- else
- let cmd = 'edit'
- endif
-
- let index_file = vimwiki#vars#get_wikilocal('path', idx).
- \ vimwiki#vars#get_wikilocal('index', idx).
- \ vimwiki#vars#get_wikilocal('ext', idx)
-
- call vimwiki#base#edit_file(cmd, index_file, '')
-endfunction
-
-
-function! vimwiki#base#delete_link() abort
- " Delete wiki file you are in from filesystem
- let val = input('Delete "'.expand('%').'" [y]es/[N]o? ')
- if val !~? '^y'
- return
- endif
- let fname = expand('%:p')
- try
- call delete(fname)
- catch /.*/
- echomsg 'Vimwiki Error: Cannot delete "'.expand('%:t:r').'"!'
- return
- endtry
-
- call vimwiki#base#go_back_link()
- execute 'bdelete! '.escape(fname, ' ')
-
- " reread buffer => deleted wiki link should appear as non-existent
- if expand('%:p') !=? ''
- execute 'e'
- endif
-endfunction
-
-
-" Rename current file, update all links to it
-function! vimwiki#base#rename_link() abort
- " Get filename relative to wiki root
- let subdir = vimwiki#vars#get_bufferlocal('subdir')
- let old_fname = subdir.expand('%:t')
-
- " Get current path
- let old_dir = expand('%:p:h')
-
- " there is no file (new one maybe)
- if glob(expand('%:p')) ==? ''
- echomsg 'Vimwiki Error: Cannot rename "'.expand('%:p').
- \'". It does not exist! (New file? Save it before renaming.)'
- return
- endif
-
- let val = input('Rename "'.expand('%:t:r').'" [y]es/[N]o? ')
- if val !~? '^y'
- return
- endif
-
- let new_link = input('Enter new name: ')
-
- if new_link =~# '[/\\]'
- echomsg 'Vimwiki Error: Cannot rename to a filename with path!'
- return
- endif
-
- if substitute(new_link, '\s', '', 'g') ==? ''
- echomsg 'Vimwiki Error: Cannot rename to an empty filename!'
- return
- endif
-
- let url = matchstr(new_link, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'))
- if url !=? ''
- let new_link = url
- endif
-
- let new_link = subdir.new_link
- let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr')
- let new_fname = vimwiki#vars#get_wikilocal('path') . new_link . vimwiki#vars#get_wikilocal('ext')
-
- " do not rename if file with such name exists
- let fname = glob(new_fname)
- if fname !=? ''
- echomsg 'Vimwiki Error: Cannot rename to "'.new_fname.'". File with that name exist!'
- return
- endif
- " rename wiki link file
- try
- echomsg 'Vimwiki: Renaming '.vimwiki#vars#get_wikilocal('path').old_fname.' to '.new_fname
- let res = rename(expand('%:p'), expand(new_fname))
- if res != 0
- throw 'Cannot rename!'
- end
- catch /.*/
- echomsg 'Vimwiki Error: Cannot rename "'.expand('%:t:r').'" to "'.new_fname.'"'
- return
- endtry
-
- let &buftype='nofile'
-
- let cur_buffer = [expand('%:p'), vimwiki#vars#get_bufferlocal('prev_links')]
-
- let blist = s:get_wiki_buffers()
-
- " save wiki buffers
- for bitem in blist
- execute ':b '.escape(bitem[0], ' ')
- execute ':update'
- endfor
-
- execute ':b '.escape(cur_buffer[0], ' ')
-
- " remove wiki buffers
- for bitem in blist
- execute 'bwipeout '.escape(bitem[0], ' ')
- endfor
-
- let setting_more = &more
- setlocal nomore
-
- " update links
- call s:update_wiki_links(wiki_nr, old_dir, s:tail_name(old_fname), s:tail_name(new_fname))
-
- " restore wiki buffers
- for bitem in blist
- if !vimwiki#path#is_equal(bitem[0], cur_buffer[0])
- call s:open_wiki_buffer(bitem)
- endif
- endfor
-
- call s:open_wiki_buffer([new_fname, cur_buffer[1]])
- " execute 'bwipeout '.escape(cur_buffer[0], ' ')
-
- echomsg 'Vimwiki: '.old_fname.' is renamed to '.new_fname
-
- let &more = setting_more
-endfunction
-
-
-function! vimwiki#base#ui_select() abort
- call s:print_wiki_list()
- let idx = input('Select Wiki by number and press (empty cancels): ')
- if idx ==# ''
- return
- elseif idx !~# '\m[0-9]\+'
- echo "\n"
- echom 'Invalid wiki selection.'
- return
- endif
- call vimwiki#base#goto_index(idx)
-endfunction
-
-
-function! vimwiki#base#TO_header(inner, including_subheaders, count) abort
- let headers = s:collect_headers()
- if empty(headers)
- return
- endif
-
- let current_line = line('.')
-
- let current_header_index = s:current_header(headers, current_line)
-
- if current_header_index < 0
- return
- endif
-
- " from which to which header
- if !a:including_subheaders && a:count <= 1
- let first_line = headers[current_header_index][0]
- let last_line = current_header_index == len(headers)-1 ? line('$') :
- \ headers[current_header_index + 1][0] - 1
- else
- let first_header_index = current_header_index
- for _ in range(a:count - 1)
- let parent = s:get_another_header(headers, first_header_index, -1, '<')
- if parent < 0
- break
- else
- let first_header_index = parent
- endif
- endfor
-
- let next_sibling_or_higher = s:get_another_header(headers, first_header_index, +1, '<=')
-
- let first_line = headers[first_header_index][0]
- let last_line =
- \ next_sibling_or_higher >= 0 ? headers[next_sibling_or_higher][0] - 1 : line('$')
- endif
-
- if a:inner
- let first_line += 1
- let last_line = prevnonblank(last_line)
- endif
-
- if first_line > last_line
- " this can happen e.g. when doing vih on a header with another header in the very next line
- return
- endif
-
- call cursor(first_line, 1)
- normal! V
- call cursor(last_line, 1)
-endfunction
-
-
-function! vimwiki#base#TO_table_cell(inner, visual) abort
- if col('.') == col('$')-1
- return
- endif
-
- if a:visual
- normal! `>
- let sel_end = getpos('.')
- normal! `<
- let sel_start = getpos('.')
-
- let firsttime = sel_start == sel_end
-
- if firsttime
- if !search('|\|\(-+-\)', 'cb', line('.'))
- return
- endif
- if getline('.')[virtcol('.')] ==# '+'
- normal! l
- endif
- if a:inner
- normal! 2l
- endif
- let sel_start = getpos('.')
- endif
-
- normal! `>
- call search('|\|\(-+-\)', '', line('.'))
- if getline('.')[virtcol('.')] ==# '+'
- normal! l
- endif
- if a:inner
- if firsttime || abs(sel_end[2] - getpos('.')[2]) != 2
- normal! 2h
- endif
- endif
- let sel_end = getpos('.')
-
- call setpos('.', sel_start)
- exe "normal! \"
- call setpos('.', sel_end)
-
- " XXX: WORKAROUND.
- " if blockwise selection is ended at | character then pressing j to extend
- " selection further fails. But if we shake the cursor left and right then
- " it works.
- normal! hl
- else
- if !search('|\|\(-+-\)', 'cb', line('.'))
- return
- endif
- if a:inner
- normal! 2l
- endif
- normal! v
- call search('|\|\(-+-\)', '', line('.'))
- if !a:inner && getline('.')[virtcol('.')-1] ==# '|'
- normal! h
- elseif a:inner
- normal! 2h
- endif
- endif
-endfunction
-
-
-function! vimwiki#base#TO_table_col(inner, visual) abort
- let t_rows = vimwiki#tbl#get_rows(line('.'))
- if empty(t_rows)
- return
- endif
-
- " TODO: refactor it!
- if a:visual
- normal! `>
- let sel_end = getpos('.')
- normal! `<
- let sel_start = getpos('.')
-
- let firsttime = sel_start == sel_end
-
- if firsttime
- " place cursor to the top row of the table
- call vimwiki#u#cursor(t_rows[0][0], virtcol('.'))
- " do not accept the match at cursor position if cursor is next to column
- " separator of the table separator (^ is a cursor):
- " |-----^-+-------|
- " | bla | bla |
- " |-------+-------|
- " or it will select wrong column.
- if strpart(getline('.'), virtcol('.')-1) =~# '^-+'
- let s_flag = 'b'
- else
- let s_flag = 'cb'
- endif
- " search the column separator backwards
- if !search('|\|\(-+-\)', s_flag, line('.'))
- return
- endif
- " -+- column separator is matched --> move cursor to the + sign
- if getline('.')[virtcol('.')] ==# '+'
- normal! l
- endif
- " inner selection --> reduce selection
- if a:inner
- normal! 2l
- endif
- let sel_start = getpos('.')
- endif
-
- normal! `>
- if !firsttime && getline('.')[virtcol('.')] ==# '|'
- normal! l
- elseif a:inner && getline('.')[virtcol('.')+1] =~# '[|+]'
- normal! 2l
- endif
- " search for the next column separator
- call search('|\|\(-+-\)', '', line('.'))
- " Outer selection selects a column without border on the right. So we move
- " our cursor left if the previous search finds | border, not -+-.
- if getline('.')[virtcol('.')] !=# '+'
- normal! h
- endif
- if a:inner
- " reduce selection a bit more if inner.
- normal! h
- endif
- " expand selection to the bottom line of the table
- call vimwiki#u#cursor(t_rows[-1][0], virtcol('.'))
- let sel_end = getpos('.')
-
- call setpos('.', sel_start)
- exe "normal! \"
- call setpos('.', sel_end)
-
- else
- " place cursor to the top row of the table
- call vimwiki#u#cursor(t_rows[0][0], virtcol('.'))
- " do not accept the match at cursor position if cursor is next to column
- " separator of the table separator (^ is a cursor):
- " |-----^-+-------|
- " | bla | bla |
- " |-------+-------|
- " or it will select wrong column.
- if strpart(getline('.'), virtcol('.')-1) =~# '^-+'
- let s_flag = 'b'
- else
- let s_flag = 'cb'
- endif
- " search the column separator backwards
- if !search('|\|\(-+-\)', s_flag, line('.'))
- return
- endif
- " -+- column separator is matched --> move cursor to the + sign
- if getline('.')[virtcol('.')] ==# '+'
- normal! l
- endif
- " inner selection --> reduce selection
- if a:inner
- normal! 2l
- endif
-
- exe "normal! \"
-
- " search for the next column separator
- call search('|\|\(-+-\)', '', line('.'))
- " Outer selection selects a column without border on the right. So we move
- " our cursor left if the previous search finds | border, not -+-.
- if getline('.')[virtcol('.')] !=# '+'
- normal! h
- endif
- " reduce selection a bit more if inner.
- if a:inner
- normal! h
- endif
- " expand selection to the bottom line of the table
- call vimwiki#u#cursor(t_rows[-1][0], virtcol('.'))
- endif
-endfunction
-
-
-function! vimwiki#base#AddHeaderLevel(...) abort
- if a:1 > 1
- call vimwiki#base#AddHeaderLevel(a:1 - 1)
- endif
- let lnum = line('.')
- let line = getline(lnum)
- let rxHdr = vimwiki#vars#get_syntaxlocal('rxH')
- if line =~# '^\s*$'
- return
- endif
-
- if line =~# vimwiki#vars#get_syntaxlocal('rxHeader')
- let level = vimwiki#u#count_first_sym(line)
- if level < 6
- if vimwiki#vars#get_syntaxlocal('symH')
- let line = substitute(line, '\('.rxHdr.'\+\).\+\1', rxHdr.'&'.rxHdr, '')
- else
- let line = substitute(line, '\('.rxHdr.'\+\).\+', rxHdr.'&', '')
- endif
- call setline(lnum, line)
- endif
- else
- let line = substitute(line, '^\s*', '&'.rxHdr.' ', '')
- if vimwiki#vars#get_syntaxlocal('symH')
- let line = substitute(line, '\s*$', ' '.rxHdr.'&', '')
- endif
- call setline(lnum, line)
- endif
-endfunction
-
-
-function! vimwiki#base#RemoveHeaderLevel(...) abort
- if a:1 > 1
- call vimwiki#base#RemoveHeaderLevel(a:1 - 1)
- endif
- let lnum = line('.')
- let line = getline(lnum)
- let rxHdr = vimwiki#vars#get_syntaxlocal('rxH')
- if line =~# '^\s*$'
- return
- endif
-
- if line =~# vimwiki#vars#get_syntaxlocal('rxHeader')
- let level = vimwiki#u#count_first_sym(line)
- let old = repeat(rxHdr, level)
- let new = repeat(rxHdr, level - 1)
-
- let chomp = line =~# rxHdr.'\s'
-
- if vimwiki#vars#get_syntaxlocal('symH')
- let line = substitute(line, old, new, 'g')
- else
- let line = substitute(line, old, new, '')
- endif
-
- if level == 1 && chomp
- let line = substitute(line, '^\s', '', 'g')
- let line = substitute(line, '\s$', '', 'g')
- endif
-
- let line = substitute(line, '\s*$', '', '')
-
- call setline(lnum, line)
- endif
-endfunction
-
-
-
-" Returns all the headers in the current buffer as a list of the form
-" [[line_number, header_level, header_text], [...], [...], ...]
-function! s:collect_headers() abort
- let is_inside_pre_or_math = 0 " 1: inside pre, 2: inside math, 0: outside
- let headers = []
- for lnum in range(1, line('$'))
- let line_content = getline(lnum)
- if (is_inside_pre_or_math == 1 && line_content =~# vimwiki#vars#get_syntaxlocal('rxPreEnd')) ||
- \ (is_inside_pre_or_math == 2 && line_content =~# vimwiki#vars#get_syntaxlocal('rxMathEnd'))
- let is_inside_pre_or_math = 0
- continue
- endif
- if is_inside_pre_or_math > 0
- continue
- endif
- if line_content =~# vimwiki#vars#get_syntaxlocal('rxPreStart')
- let is_inside_pre_or_math = 1
- continue
- endif
- if line_content =~# vimwiki#vars#get_syntaxlocal('rxMathStart')
- let is_inside_pre_or_math = 2
- continue
- endif
- if line_content !~# vimwiki#vars#get_syntaxlocal('rxHeader')
- continue
- endif
- if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
- if stridx(line_content, vimwiki#vars#get_syntaxlocal('rxH')) > 0
- continue " markdown headers must start in the first column
- endif
- endif
- let header_level = vimwiki#u#count_first_sym(line_content)
- let header_text =
- \ vimwiki#u#trim(matchstr(line_content, vimwiki#vars#get_syntaxlocal('rxHeader')))
- call add(headers, [lnum, header_level, header_text])
- endfor
-
- return headers
-endfunction
-
-
-function! s:current_header(headers, line_number) abort
- if empty(a:headers)
- return -1
- endif
-
- if a:line_number >= a:headers[-1][0]
- return len(a:headers) - 1
- endif
-
- let current_header_index = -1
- while a:headers[current_header_index+1][0] <= a:line_number
- let current_header_index += 1
- endwhile
- return current_header_index
-endfunction
-
-
-function! s:get_another_header(headers, current_index, direction, operation) abort
- if empty(a:headers) || a:current_index < 0
- return -1
- endif
- let current_level = a:headers[a:current_index][1]
- let index = a:current_index + a:direction
-
- while 1
- if index < 0 || index >= len(a:headers)
- return -1
- endif
- if eval('a:headers[index][1] ' . a:operation . ' current_level')
- return index
- endif
- let index += a:direction
- endwhile
-endfunction
-
-
-function! vimwiki#base#goto_parent_header() abort
- let headers = s:collect_headers()
- let current_header_index = s:current_header(headers, line('.'))
- let parent_header = s:get_another_header(headers, current_header_index, -1, '<')
- if parent_header >= 0
- call cursor(headers[parent_header][0], 1)
- else
- echo 'Vimwiki: no parent header found'
- endif
-endfunction
-
-
-function! vimwiki#base#goto_next_header() abort
- let headers = s:collect_headers()
- let current_header_index = s:current_header(headers, line('.'))
- if current_header_index >= 0 && current_header_index < len(headers) - 1
- call cursor(headers[current_header_index + 1][0], 1)
- elseif current_header_index < 0 && !empty(headers) " we're above the first header
- call cursor(headers[0][0], 1)
- else
- echo 'Vimwiki: no next header found'
- endif
-endfunction
-
-
-function! vimwiki#base#goto_prev_header() abort
- let headers = s:collect_headers()
- let current_header_index = s:current_header(headers, line('.'))
- " if the cursor already was on a header, jump to the previous one
- if current_header_index >= 1 && headers[current_header_index][0] == line('.')
- let current_header_index -= 1
- endif
- if current_header_index >= 0
- call cursor(headers[current_header_index][0], 1)
- else
- echo 'Vimwiki: no previous header found'
- endif
-endfunction
-
-
-function! vimwiki#base#goto_sibling(direction) abort
- let headers = s:collect_headers()
- let current_header_index = s:current_header(headers, line('.'))
- let next_potential_sibling =
- \ s:get_another_header(headers, current_header_index, a:direction, '<=')
- if next_potential_sibling >= 0 && headers[next_potential_sibling][1] ==
- \ headers[current_header_index][1]
- call cursor(headers[next_potential_sibling][0], 1)
- else
- echo 'Vimwiki: no sibling header found'
- endif
-endfunction
-
-
-" a:create == 1: creates or updates TOC in current file
-" a:create == 0: update if TOC exists
-function! vimwiki#base#table_of_contents(create) abort
- let headers = s:collect_headers()
- let toc_header_text = vimwiki#vars#get_global('toc_header')
-
- if !a:create
- " Do nothing if there is no TOC to update. (This is a small performance optimization -- if
- " auto_toc == 1, but the current buffer has no TOC but is long, saving the buffer could
- " otherwise take a few seconds for nothing.)
- let toc_already_present = 0
- for entry in headers
- if entry[2] ==# toc_header_text
- let toc_already_present = 1
- break
- endif
- endfor
- if !toc_already_present
- return
- endif
- endif
-
- " use a dictionary function for closure like capability
- " copy all local variables into dict (add a: if arguments are needed)
- let GeneratorTOC = copy(l:)
- function! GeneratorTOC.f() abort
- let numbering = vimwiki#vars#get_global('html_header_numbering')
- let headers_levels = [['', 0], ['', 0], ['', 0], ['', 0], ['', 0], ['', 0]]
- let complete_header_infos = []
- for header in self.headers
- let h_text = header[2]
- let h_level = header[1]
- " don't include the TOC's header itself
- if h_text ==# self.toc_header_text
- continue
- endif
- let headers_levels[h_level-1] = [h_text, headers_levels[h_level-1][1]+1]
- for idx in range(h_level, 5) | let headers_levels[idx] = ['', 0] | endfor
-
- let h_complete_id = ''
- if vimwiki#vars#get_global('toc_link_format') == 0
- for l in range(h_level-1)
- if headers_levels[l][0] !=? ''
- let h_complete_id .= headers_levels[l][0].'#'
- endif
- endfor
- endif
- let h_complete_id .= headers_levels[h_level-1][0]
-
- call add(complete_header_infos, [h_level, h_complete_id, h_text])
- endfor
-
- let lines = []
- let startindent = repeat(' ', vimwiki#lst#get_list_margin())
- let indentstring = repeat(' ', vimwiki#u#sw())
- let bullet = vimwiki#lst#default_symbol().' '
- for [lvl, link, desc] in complete_header_infos
- if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
- let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink2Template')
- elseif vimwiki#vars#get_global('toc_link_format') == 0
- let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate2')
- else
- let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1')
- endif
- let link = s:safesubstitute(link_tpl, '__LinkUrl__',
- \ '#'.link, '')
- let link = s:safesubstitute(link, '__LinkDescription__', desc, '')
- call add(lines, startindent.repeat(indentstring, lvl-1).bullet.link)
- endfor
-
- return lines
- endfunction
-
- let links_rx = '\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxListBullet').'\)'
-
- call vimwiki#base#update_listing_in_buffer(
- \ GeneratorTOC,
- \ toc_header_text,
- \ links_rx,
- \ 1,
- \ vimwiki#vars#get_global('toc_header_level'),
- \ a:create)
-endfunction
-
-
-" Construct a regular expression matching from template (with special
-" characters properly escaped), by substituting rxUrl for __LinkUrl__, rxDesc
-" for __LinkDescription__, and rxStyle for __LinkStyle__. The three
-" arguments rxUrl, rxDesc, and rxStyle are copied verbatim, without any
-" special character escapes or substitutions.
-function! vimwiki#base#apply_template(template, rxUrl, rxDesc, rxStyle) abort
- let lnk = a:template
- if a:rxUrl !=? ''
- let lnk = s:safesubstitute(lnk, '__LinkUrl__', a:rxUrl, 'g')
- endif
- if a:rxDesc !=? ''
- let lnk = s:safesubstitute(lnk, '__LinkDescription__', a:rxDesc, 'g')
- endif
- if a:rxStyle !=? ''
- let lnk = s:safesubstitute(lnk, '__LinkStyle__', a:rxStyle, 'g')
- endif
- return lnk
-endfunction
-
-
-function! s:clean_url(url) abort
- " don't use an extension as part of the description
- let url = substitute(a:url, '\'.vimwiki#vars#get_wikilocal('ext').'$', '', '')
- " remove protocol and tld
- let url = substitute(url, '^\a\+\d*:', '', '')
- " remove absolute path prefix
- let url = substitute(url, '^//', '', '')
- let url = substitute(url, '^\([^/]\+\)\.\a\{2,4}/', '\1/', '')
- let url_l = split(url, '/\|=\|-\|&\|?\|\.')
- " case only a '-'
- if url_l == []
- return ''
- endif
- let url_l = filter(url_l, 'v:val !=# ""')
- if url_l[0] ==# 'www'
- let url_l = url_l[1:]
- endif
- if url_l[-1] =~# '^\(htm\|html\|php\)$'
- let url_l = url_l[0:-2]
- endif
- " remove words with black listed codepoints
- " TODO mutualize blacklist in a variable
- let url_l = filter(url_l, 'v:val !~? "[!\"$%&''()*+,:;<=>?\[\]\\^`{}]"')
- " remove words consisting of only hexadecimal digits
- let url_l = filter(url_l, 'v:val !~? "^\\x\\{4,}$" || v:val !~? "\\d"')
- return join(url_l, ' ')
-endfunction
-
-" An optional second argument allows you to pass in a list of diary files rather
-" than generating a list on each call to the function.
-function! vimwiki#base#is_diary_file(filename, ...) abort
- let l:diary_file_paths = a:0 > 0 ? a:1 : vimwiki#diary#get_diary_files()
- let l:normalised_file_paths =
- \ map(l:diary_file_paths, 'vimwiki#path#normalize(v:val)')
- let l:matching_files =
- \ filter(l:normalised_file_paths, 'v:val =~# a:filename')
- return len(l:matching_files) > 0 " filename is a diary file if match is found
-endfunction
-
-
-function! vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template) abort
- let url = matchstr(a:str, a:rxUrl)
- if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown' && vimwiki#vars#get_global('markdown_link_ext')
- " strip the extension if it exists so it doesn't get added multiple times
- let url = substitute(url, '\'.vimwiki#vars#get_wikilocal('ext').'$', '', '')
- endif
- let descr = matchstr(a:str, a:rxDesc)
- " Try to clean, do not work if bad link
- if descr ==# ''
- let descr = s:clean_url(url)
- if descr ==# '' | return url | endif
- endif
- let lnk = s:safesubstitute(a:template, '__LinkDescription__', descr, '')
- let lnk = s:safesubstitute(lnk, '__LinkUrl__', url, '')
- return lnk
-endfunction
-
-
-function! vimwiki#base#normalize_imagelink_helper(str, rxUrl, rxDesc, rxStyle, template) abort
- let lnk = vimwiki#base#normalize_link_helper(a:str, a:rxUrl, a:rxDesc, a:template)
- let style = matchstr(a:str, a:rxStyle)
- let lnk = s:safesubstitute(lnk, '__LinkStyle__', style, '')
- return lnk
-endfunction
-
-function! vimwiki#base#normalize_link_in_diary(lnk) abort
- let sc = vimwiki#vars#get_wikilocal('links_space_char')
- let link = a:lnk . vimwiki#vars#get_wikilocal('ext')
- let link_wiki = substitute(vimwiki#vars#get_wikilocal('path') . '/' . link, '\s', sc, 'g')
- let link_diary = substitute(vimwiki#vars#get_wikilocal('path') . '/'
- \ . vimwiki#vars#get_wikilocal('diary_rel_path') . '/' . link, '\s', sc, 'g')
- let link_exists_in_diary = filereadable(link_diary)
- let link_exists_in_wiki = filereadable(link_wiki)
- let link_is_date = a:lnk =~# '\d\d\d\d-\d\d-\d\d'
-
- if link_is_date
- let str = a:lnk
- let rxUrl = vimwiki#vars#get_global('rxWord')
- let rxDesc = '\d\d\d\d-\d\d-\d\d'
- let template = vimwiki#vars#get_global('WikiLinkTemplate1')
- elseif link_exists_in_wiki
- let depth = len(split(vimwiki#vars#get_wikilocal('diary_rel_path'), '/'))
- let str = repeat('../', depth) . a:lnk
- let rxUrl = '.*'
- let rxDesc = '[^/]*$'
- let template = vimwiki#vars#get_global('WikiLinkTemplate2')
- else
- let str = a:lnk
- let rxUrl = '.*'
- let rxDesc = ''
- let template = vimwiki#vars#get_global('WikiLinkTemplate1')
- endif
-
- if vimwiki#vars#get_wikilocal('syntax') ==? 'markdown'
- let template = vimwiki#vars#get_syntaxlocal('Weblink1Template')
- endif
-
- return vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template)
-endfunction
-
-
-function! s:normalize_link_syntax_n() abort
-
- " try WikiLink
- let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink'))
- if !empty(lnk)
- let sub = vimwiki#base#normalize_link_helper(lnk,
- \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'),
- \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'),
- \ vimwiki#vars#get_global('WikiLinkTemplate2'))
- call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink'), sub)
- return
- endif
-
- " try WikiIncl
- let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWikiIncl'))
- if !empty(lnk)
- " NO-OP !!
- return
- endif
-
- " try Weblink
- let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink'))
- if !empty(lnk)
- let sub = vimwiki#base#normalize_link_helper(lnk,
- \ lnk, '', vimwiki#vars#get_global('WikiLinkTemplate2'))
- call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink'), sub)
- return
- endif
-
- " try Word (any characters except separators)
- " rxWord is less permissive than rxWikiLinkUrl which is used in
- " normalize_link_syntax_v
- let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWord'))
- if !empty(lnk)
- if vimwiki#base#is_diary_file(expand('%:p'))
- let sub = vimwiki#base#normalize_link_in_diary(lnk)
- else
- let sub = s:safesubstitute(
- \ vimwiki#vars#get_global('WikiLinkTemplate1'), '__LinkUrl__', lnk, '')
- endif
- call vimwiki#base#replacestr_at_cursor('\V'.lnk, sub)
- return
- endif
-
-endfunction
-
-
-function! s:normalize_link_syntax_v() abort
- let sel_save = &selection
- let &selection = 'old'
- let default_register_save = @"
- let registertype_save = getregtype('"')
-
- try
- " Save selected text to register "
- normal! gv""y
-
- " Set substitution
- if vimwiki#base#is_diary_file(expand('%:p'))
- let sub = vimwiki#base#normalize_link_in_diary(@")
- else
- let sub = s:safesubstitute(vimwiki#vars#get_global('WikiLinkTemplate1'),
- \ '__LinkUrl__', @", '')
- endif
-
- " Put substitution in register " and change text
- let sc = vimwiki#vars#get_wikilocal('links_space_char')
- call setreg('"', substitute(substitute(sub, '\n', '', ''), '\s', sc, 'g'), visualmode())
- normal! `>""pgvd
- finally
- call setreg('"', default_register_save, registertype_save)
- let &selection = sel_save
- endtry
-endfunction
-
-
-function! vimwiki#base#normalize_link(is_visual_mode) abort
- if exists('*vimwiki#'.vimwiki#vars#get_wikilocal('syntax').'_base#normalize_link')
- " Syntax-specific links
- call vimwiki#{vimwiki#vars#get_wikilocal('syntax')}_base#normalize_link(a:is_visual_mode)
- else
- if !a:is_visual_mode
- call s:normalize_link_syntax_n()
- elseif line("'<") == line("'>")
- " action undefined for multi-line visual mode selections
- call s:normalize_link_syntax_v()
- endif
- endif
-endfunction
-
-
-function! vimwiki#base#detect_nested_syntax() abort
- let last_word = '\v.*<(\w+)\s*$'
- let lines = map(filter(getline(1, '$'), 'v:val =~# "\\%({{{\\|`\\{3,\}\\|\\~\\{3,\}\\)" && v:val =~# last_word'),
- \ 'substitute(v:val, last_word, "\\=submatch(1)", "")')
- let dict = {}
- for elem in lines
- let dict[elem] = elem
- endfor
- return dict
-endfunction
-
-
-function! vimwiki#base#complete_links_escaped(ArgLead, CmdLine, CursorPos) abort abort
- return vimwiki#base#get_globlinks_escaped(a:ArgLead)
-endfunction
-
-
-function! vimwiki#base#read_caption(file) abort
- let rx_header = vimwiki#vars#get_syntaxlocal('rxHeader')
-
- if filereadable(a:file)
- for line in readfile(a:file, '', g:vimwiki_max_scan_for_caption)
- if line =~# rx_header
- return vimwiki#u#trim(matchstr(line, rx_header))
- endif
- endfor
- endif
-
- return ''
-endfunction
-
-
-" For commands VimwikiSearch and VWS
-function! vimwiki#base#search(search_pattern) abort
- if empty(a:search_pattern)
- echomsg 'Vimwiki Error: No search pattern given.'
- return
- endif
-
- let pattern = a:search_pattern
-
- " If the pattern does not start with a '/', then we'll assume that a
- " literal search is intended and enclose and escape it:
- if match(pattern, '^/') == -1
- let pattern = '/'.escape(pattern, '\').'/'
- endif
-
- let path = fnameescape(vimwiki#vars#get_wikilocal('path'))
- let ext = vimwiki#vars#get_wikilocal('ext')
- let cmd = 'lvimgrep '.pattern.' '.path.'**/*'.ext
-
- " Catch E480 error from lvimgrep if there's no match and present
- " a friendlier error message.
- try
- execute cmd
- catch
- echomsg 'VimwikiSearch: No match found.'
- endtry
-endfunction
-
-function! vimwiki#base#deprecate(old, new) abort
- echohl WarningMsg
- echo a:old 'is deprecated and will be removed in future versions, use' a:new 'instead.'
- echohl None
-endfunction
-
-" -------------------------------------------------------------------------
-" Load syntax-specific Wiki functionality
-for s:syn in s:vimwiki_get_known_syntaxes()
- execute 'runtime! autoload/vimwiki/'.s:syn.'_base.vim'
-endfor
-" -------------------------------------------------------------------------
-
diff --git a/pack/acp/start/vimwiki/autoload/vimwiki/customwiki2html.sh b/pack/acp/start/vimwiki/autoload/vimwiki/customwiki2html.sh
deleted file mode 100755
index 4818d02..0000000
--- a/pack/acp/start/vimwiki/autoload/vimwiki/customwiki2html.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash
-
-#
-# This script converts markdown into html, to be used with vimwiki's
-# "customwiki2html" option. Experiment with the two proposed methods by
-# commenting / uncommenting the relevant lines below.
-#
-# NEW! An alternative converter was developed by Jason6Anderson, and can
-# be located at https://github.com/vimwiki-backup/vimwiki/issues/384
-#
-#
-# To use this script, you must have the Discount converter installed.
-#
-# http://www.pell.portland.or.us/~orc/Code/discount/
-#
-# To verify your installation, check that the commands markdown and mkd2text,
-# are on your path.
-#
-# Also verify that this file is executable.
-#
-# Then, in your .vimrc file, set:
-#
-# g:vimwiki_customwiki2html=$HOME.'/.vim/autoload/vimwiki/customwiki2html.sh'
-#
-# On your next restart, Vimwiki will run this script instead of using the
-# internal wiki2html converter.
-#
-
-MARKDOWN=markdown
-MKD2HTML=mkd2html
-
-
-FORCE="$1"
-SYNTAX="$2"
-EXTENSION="$3"
-OUTPUTDIR="$4"
-INPUT="$5"
-CSSFILE="$6"
-
-FORCEFLAG=
-
-[ $FORCE -eq 0 ] || { FORCEFLAG="-f"; };
-[ $SYNTAX = "markdown" ] || { echo "Error: Unsupported syntax"; exit -2; };
-
-OUTPUT="$OUTPUTDIR"/$(basename "$INPUT" .$EXTENSION).html
-
-# # Method 1:
-# # markdown [-d] [-T] [-V] [-b url-base] [-C prefix] [-F bitmap] [-f flags] [-o file] [-s text] [-t text] [textfile]
-#
-# URLBASE=http://example.com
-# $MARKDOWN -T -b $URLBASE -o $OUTPUT $INPUT
-
-
-# Method 2:
-# mkd2html [-css file] [-header string] [-footer string] [file]
-
-$MKD2HTML -css "$CSSFILE" "$INPUT"
-OUTPUTTMP=$(dirname "$INPUT")/$(basename "$INPUT" ."$EXTENSION").html
-mv -f "$OUTPUTTMP" "$OUTPUT"
-
-
-
diff --git a/pack/acp/start/vimwiki/autoload/vimwiki/default.tpl b/pack/acp/start/vimwiki/autoload/vimwiki/default.tpl
deleted file mode 100644
index 35371d5..0000000
--- a/pack/acp/start/vimwiki/autoload/vimwiki/default.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-%title%
-
-
-
-
-%content%
-
-
diff --git a/pack/acp/start/vimwiki/autoload/vimwiki/diary.vim b/pack/acp/start/vimwiki/autoload/vimwiki/diary.vim
deleted file mode 100644
index 46d14ce..0000000
--- a/pack/acp/start/vimwiki/autoload/vimwiki/diary.vim
+++ /dev/null
@@ -1,436 +0,0 @@
-" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
-" Vimwiki autoload plugin file
-" Description: Handle diary notes
-" Home: https://github.com/vimwiki/vimwiki/
-
-
-if exists('g:loaded_vimwiki_diary_auto') || &compatible
- finish
-endif
-let g:loaded_vimwiki_diary_auto = 1
-
-
-function! s:prefix_zero(num) abort
- if a:num < 10
- return '0'.a:num
- endif
- return a:num
-endfunction
-
-
-function! s:diary_path(...) abort
- let idx = a:0 == 0 ? vimwiki#vars#get_bufferlocal('wiki_nr') : a:1
- return vimwiki#vars#get_wikilocal('path', idx).vimwiki#vars#get_wikilocal('diary_rel_path', idx)
-endfunction
-
-
-function! s:diary_index(...) abort
- let idx = a:0 == 0 ? vimwiki#vars#get_bufferlocal('wiki_nr') : a:1
- return s:diary_path(idx).vimwiki#vars#get_wikilocal('diary_index', idx).
- \ vimwiki#vars#get_wikilocal('ext', idx)
-endfunction
-
-
-function! vimwiki#diary#diary_date_link(...) abort
- if a:0
- return strftime('%Y-%m-%d', a:1)
- else
- return strftime('%Y-%m-%d')
- endif
-endfunction
-
-
-function! s:get_position_links(link) abort
- let idx = -1
- let links = []
- if a:link =~# '^\d\{4}-\d\d-\d\d'
- let links = map(vimwiki#diary#get_diary_files(), 'fnamemodify(v:val, ":t:r")')
- " include 'today' into links
- if index(links, vimwiki#diary#diary_date_link()) == -1
- call add(links, vimwiki#diary#diary_date_link())
- endif
- call sort(links)
- let idx = index(links, a:link)
- endif
- return [idx, links]
-endfunction
-
-
-function! s:get_month_name(month) abort
- return vimwiki#vars#get_global('diary_months')[str2nr(a:month)]
-endfunction
-
-function! s:get_first_header(fl) abort
- " Get the first header in the file within the first s:vimwiki_max_scan_for_caption lines.
- let header_rx = vimwiki#vars#get_syntaxlocal('rxHeader')
-
- for line in readfile(a:fl, '', g:vimwiki_max_scan_for_caption)
- if line =~# header_rx
- return vimwiki#u#trim(matchstr(line, header_rx))
- endif
- endfor
- return ''
-endfunction
-
-function! s:get_all_headers(fl, maxlevel) abort
- " Get a list of all headers in a file up to a given level.
- " Returns a list whose elements are pairs [level, title]
- let headers_rx = {}
- for i in range(1, a:maxlevel)
- let headers_rx[i] = vimwiki#vars#get_syntaxlocal('rxH'.i.'_Text')
- endfor
-
- let headers = []
- for line in readfile(a:fl, '')
- for [i, header_rx] in items(headers_rx)
- if line =~# header_rx
- call add(headers, [i, vimwiki#u#trim(matchstr(line, header_rx))])
- break
- endif
- endfor
- endfor
- return headers
-endfunction
-
-function! s:count_headers_level_less_equal(headers, maxlevel) abort
- " Count headers with level <= maxlevel in a list of [level, title] pairs.
- let l:count = 0
- for [header_level, _] in a:headers
- if header_level <= a:maxlevel
- let l:count += 1
- endif
- endfor
- return l:count
-endfunction
-
-function! s:get_min_header_level(headers) abort
- " The minimum level of any header in a list of [level, title] pairs.
- if len(a:headers) == 0
- return 0
- endif
- let minlevel = a:headers[0][0]
- for [level, _] in a:headers
- let minlevel = min([minlevel, level])
- endfor
- return minlevel
-endfunction
-
-
-function! s:read_captions(files) abort
- let result = {}
- let caption_level = vimwiki#vars#get_wikilocal('diary_caption_level')
-
- for fl in a:files
- " remove paths and extensions
- let fl_captions = {}
-
- " Default; no captions from the file.
- let fl_captions['top'] = ''
- let fl_captions['rest'] = []
-
- if caption_level >= 0 && filereadable(fl)
- if caption_level == 0
- " Take first header of any level as the top caption.
- let fl_captions['top'] = s:get_first_header(fl)
- else
- let headers = s:get_all_headers(fl, caption_level)
- if len(headers) > 0
- " If first header is the only one at its level or less, then make it the top caption.
- let [first_level, first_header] = headers[0]
- if s:count_headers_level_less_equal(headers, first_level) == 1
- let fl_captions['top'] = first_header
- call remove(headers, 0)
- endif
-
- let min_header_level = s:get_min_header_level(headers)
- for [level, header] in headers
- call add(fl_captions['rest'], [level - min_header_level, header])
- endfor
- endif
- endif
- endif
-
- let fl_key = substitute(fnamemodify(fl, ':t'), vimwiki#vars#get_wikilocal('ext').'$', '', '')
- let result[fl_key] = fl_captions
- endfor
- return result
-endfunction
-
-
-function! vimwiki#diary#get_diary_files() abort
- let rx = '^\d\{4}-\d\d-\d\d'
- let s_files = glob(vimwiki#vars#get_wikilocal('path').
- \ vimwiki#vars#get_wikilocal('diary_rel_path').'*'.vimwiki#vars#get_wikilocal('ext'))
- let files = split(s_files, '\n')
- call filter(files, 'fnamemodify(v:val, ":t") =~# "'.escape(rx, '\').'"')
-
- " remove backup files (.wiki~)
- call filter(files, 'v:val !~# ''.*\~$''')
-
- return files
-endfunction
-
-
-function! s:group_links(links) abort
- let result = {}
- let p_year = 0
- let p_month = 0
- for fl in sort(keys(a:links))
- let year = strpart(fl, 0, 4)
- let month = strpart(fl, 5, 2)
- if p_year != year
- let result[year] = {}
- let p_month = 0
- endif
- if p_month != month
- let result[year][month] = {}
- endif
- let result[year][month][fl] = a:links[fl]
- let p_year = year
- let p_month = month
- endfor
- return result
-endfunction
-
-
-function! s:sort(lst) abort
- if vimwiki#vars#get_wikilocal('diary_sort') ==? 'desc'
- return reverse(sort(a:lst))
- else
- return sort(a:lst)
- endif
-endfunction
-
-" The given wiki number a:wnum is 1 for the first wiki, 2 for the second and so on. This is in
-" contrast to most other places, where counting starts with 0. When a:wnum is 0, the current wiki
-" is used.
-function! vimwiki#diary#make_note(wnum, ...) abort
- if a:wnum == 0
- let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr')
- if wiki_nr < 0 " this happens when e.g. VimwikiMakeDiaryNote was called outside a wiki buffer
- let wiki_nr = 0
- endif
- else
- let wiki_nr = a:wnum - 1
- endif
-
- if wiki_nr >= vimwiki#vars#number_of_wikis()
- echomsg 'Vimwiki Error: Wiki '.wiki_nr.' is not registered in g:vimwiki_list!'
- return
- endif
-
- call vimwiki#path#mkdir(vimwiki#vars#get_wikilocal('path', wiki_nr).
- \ vimwiki#vars#get_wikilocal('diary_rel_path', wiki_nr))
-
- let cmd = 'edit'
- if a:0
- if a:1 == 1
- let cmd = 'tabedit'
- elseif a:1 == 2
- let cmd = 'split'
- elseif a:1 == 3
- let cmd = 'vsplit'
- endif
- endif
- if a:0>1
- let link = 'diary:'.a:2
- else
- let link = 'diary:'.vimwiki#diary#diary_date_link()
- endif
-
- call vimwiki#base#open_link(cmd, link, s:diary_index(wiki_nr))
-endfunction
-
-function! vimwiki#diary#goto_diary_index(wnum) abort
-
- " if wnum = 0 the current wiki is used
- if a:wnum == 0
- let idx = vimwiki#vars#get_bufferlocal('wiki_nr')
- if idx < 0 " not in a wiki
- let idx = 0
- endif
- else
- let idx = a:wnum - 1 " convert to 0 based counting
- endif
-
- if a:wnum > vimwiki#vars#number_of_wikis()
- echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in g:vimwiki_list!'
- return
- endif
-
- call vimwiki#base#edit_file('e', s:diary_index(idx), '')
-
- if vimwiki#vars#get_wikilocal('auto_diary_index')
- call vimwiki#diary#generate_diary_section()
- write! " save changes
- endif
-endfunction
-
-
-function! vimwiki#diary#goto_next_day() abort
- let link = ''
- let [idx, links] = s:get_position_links(expand('%:t:r'))
-
- if idx == (len(links) - 1)
- return
- endif
-
- if idx != -1 && idx < len(links) - 1
- let link = 'diary:'.links[idx+1]
- else
- " goto today
- let link = 'diary:'.vimwiki#diary#diary_date_link()
- endif
-
- if len(link)
- call vimwiki#base#open_link(':e ', link)
- endif
-endfunction
-
-
-function! vimwiki#diary#goto_prev_day() abort
- let link = ''
- let [idx, links] = s:get_position_links(expand('%:t:r'))
-
- if idx == 0
- return
- endif
-
- if idx > 0
- let link = 'diary:'.links[idx-1]
- else
- " goto today
- let link = 'diary:'.vimwiki#diary#diary_date_link()
- endif
-
- if len(link)
- call vimwiki#base#open_link(':e ', link)
- endif
-endfunction
-
-
-function! vimwiki#diary#generate_diary_section() abort
-
- let GeneratorDiary = copy(l:)
- function! GeneratorDiary.f() abort
- let lines = []
-
- let links_with_captions = s:read_captions(vimwiki#diary#get_diary_files())
- let g_files = s:group_links(links_with_captions)
- let g_keys = s:sort(keys(g_files))
-
- for year in g_keys
- if len(lines) > 0
- call add(lines, '')
- endif
-
- call add(lines, substitute(vimwiki#vars#get_syntaxlocal('rxH2_Template'), '__Header__', year , ''))
-
- for month in s:sort(keys(g_files[year]))
- call add(lines, '')
- call add(lines, substitute(vimwiki#vars#get_syntaxlocal('rxH3_Template'),
- \ '__Header__', s:get_month_name(month), ''))
-
- if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
- for _ in range(vimwiki#vars#get_global('markdown_header_style'))
- call add(lines, '')
- endfor
- endif
-
- for [fl, captions] in s:sort(items(g_files[year][month]))
- let topcap = captions['top']
- let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate2')
-
- if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
- let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink1Template')
-
- if empty(topcap) " When using markdown syntax, we should ensure we always have a link description.
- let topcap = fl
- endif
- endif
-
- if empty(topcap)
- let top_link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1')
- else
- let top_link_tpl = link_tpl
- endif
-
- let bullet = vimwiki#lst#default_symbol().' '
- let entry = substitute(top_link_tpl, '__LinkUrl__', fl, '')
- let entry = substitute(entry, '__LinkDescription__', topcap, '')
- " If single H1 then that will be used as the description for the link to the file
- " if multple H1 then the filename will be used as the description for the link to the
- " file and multiple H1 headers will be indented by shiftwidth
- call add(lines, repeat(' ', vimwiki#lst#get_list_margin()).bullet.entry)
-
- let startindent = repeat(' ', vimwiki#lst#get_list_margin())
- let indentstring = repeat(' ', vimwiki#u#sw())
-
- for [depth, subcap] in captions['rest']
- if empty(subcap)
- continue
- endif
- let entry = substitute(link_tpl, '__LinkUrl__', fl.'#'.subcap, '')
- let entry = substitute(entry, '__LinkDescription__', subcap, '')
- " if single H1 then depth H2=0, H3=1, H4=2, H5=3, H6=4
- " if multiple H1 then depth H1= 0, H2=1, H3=2, H4=3, H5=4, H6=5
- " indent subsequent headers levels by shiftwidth
- call add(lines, startindent.repeat(indentstring, depth+1).bullet.entry)
- endfor
- endfor
-
- endfor
- endfor
-
- return lines
- endfunction
-
- let current_file = vimwiki#path#path_norm(expand('%:p'))
- let diary_file = vimwiki#path#path_norm(s:diary_index())
- if vimwiki#path#is_equal(current_file, diary_file)
- let content_rx = '^\%('.vimwiki#vars#get_syntaxlocal('rxHeader').'\)\|'.
- \ '\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxListBullet').'\)'
-
- call vimwiki#base#update_listing_in_buffer(
- \ GeneratorDiary,
- \ vimwiki#vars#get_wikilocal('diary_header'),
- \ content_rx,
- \ 1,
- \ 1,
- \ 1)
- else
- echomsg 'Vimwiki Error: You can generate diary links only in a diary index page!'
- endif
-endfunction
-
-
-" Callback function for Calendar.vim
-function! vimwiki#diary#calendar_action(day, month, year, week, dir) abort
- let day = s:prefix_zero(a:day)
- let month = s:prefix_zero(a:month)
-
- let link = a:year.'-'.month.'-'.day
- if winnr('#') == 0
- if a:dir ==? 'V'
- vsplit
- else
- split
- endif
- else
- wincmd p
- if !&hidden && &modified
- new
- endif
- endif
-
- call vimwiki#diary#make_note(0, 0, link)
-endfunction
-
-
-function! vimwiki#diary#calendar_sign(day, month, year) abort
- let day = s:prefix_zero(a:day)
- let month = s:prefix_zero(a:month)
- let sfile = vimwiki#vars#get_wikilocal('path').vimwiki#vars#get_wikilocal('diary_rel_path').
- \ a:year.'-'.month.'-'.day.vimwiki#vars#get_wikilocal('ext')
- return filereadable(expand(sfile))
-endfunction
diff --git a/pack/acp/start/vimwiki/autoload/vimwiki/html.vim b/pack/acp/start/vimwiki/autoload/vimwiki/html.vim
deleted file mode 100644
index 0da3d81..0000000
--- a/pack/acp/start/vimwiki/autoload/vimwiki/html.vim
+++ /dev/null
@@ -1,1744 +0,0 @@
-" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
-" Vimwiki autoload plugin file
-" Description: HTML export
-" Home: https://github.com/vimwiki/vimwiki/
-
-
-if exists('g:loaded_vimwiki_html_auto') || &compatible
- finish
-endif
-let g:loaded_vimwiki_html_auto = 1
-
-
-function! s:root_path(subdir) abort
- return repeat('../', len(split(a:subdir, '[/\\]')))
-endfunction
-
-
-function! s:syntax_supported() abort
- return vimwiki#vars#get_wikilocal('syntax') ==? 'default'
-endfunction
-
-
-function! s:remove_blank_lines(lines) abort
- while !empty(a:lines) && a:lines[-1] =~# '^\s*$'
- call remove(a:lines, -1)
- endwhile
-endfunction
-
-
-function! s:is_web_link(lnk) abort
- if a:lnk =~# '^\%(https://\|http://\|www.\|ftp://\|file://\|mailto:\)'
- return 1
- endif
- return 0
-endfunction
-
-
-function! s:is_img_link(lnk) abort
- if tolower(a:lnk) =~# '\.\%(png\|jpg\|gif\|jpeg\)$'
- return 1
- endif
- return 0
-endfunction
-
-
-function! s:has_abs_path(fname) abort
- if a:fname =~# '\(^.:\)\|\(^/\)'
- return 1
- endif
- return 0
-endfunction
-
-
-function! s:find_autoload_file(name) abort
- for path in split(&runtimepath, ',')
- let fname = path.'/autoload/vimwiki/'.a:name
- if glob(fname) !=? ''
- return fname
- endif
- endfor
- return ''
-endfunction
-
-
-function! s:default_CSS_full_name(path) abort
- let path = expand(a:path)
- let css_full_name = path . vimwiki#vars#get_wikilocal('css_name')
- return css_full_name
-endfunction
-
-
-function! s:create_default_CSS(path) abort
- let css_full_name = s:default_CSS_full_name(a:path)
- if glob(css_full_name) ==? ''
- call vimwiki#path#mkdir(fnamemodify(css_full_name, ':p:h'))
- let default_css = s:find_autoload_file('style.css')
- if default_css !=? ''
- let lines = readfile(default_css)
- call writefile(lines, css_full_name)
- return 1
- endif
- endif
- return 0
-endfunction
-
-
-function! s:template_full_name(name) abort
- if a:name ==? ''
- let name = vimwiki#vars#get_wikilocal('template_default')
- else
- let name = a:name
- endif
-
- let fname = expand(vimwiki#vars#get_wikilocal('template_path').
- \ name . vimwiki#vars#get_wikilocal('template_ext'))
-
- if filereadable(fname)
- return fname
- else
- return ''
- endif
-endfunction
-
-
-function! s:get_html_template(template) abort
- " TODO: refactor it!!!
- let lines=[]
-
- if a:template !=? ''
- let template_name = s:template_full_name(a:template)
- try
- let lines = readfile(template_name)
- return lines
- catch /E484/
- echomsg 'Vimwiki: HTML template '.template_name. ' does not exist!'
- endtry
- endif
-
- let default_tpl = s:template_full_name('')
-
- if default_tpl ==? ''
- let default_tpl = s:find_autoload_file('default.tpl')
- endif
-
- let lines = readfile(default_tpl)
- return lines
-endfunction
-
-
-function! s:safe_html_preformatted(line) abort
- let line = substitute(a:line,'<','\<', 'g')
- let line = substitute(line,'>','\>', 'g')
- return line
-endfunction
-
-
-function! s:escape_html_attribute(string) abort
- return substitute(a:string, '"', '\"', 'g')
-endfunction
-
-
-function! s:safe_html_line(line) abort
- " escape & < > when producing HTML text
- " s:lt_pattern, s:gt_pattern depend on g:vimwiki_valid_html_tags
- " and are set in vimwiki#html#Wiki2HTML()
- let line = substitute(a:line, '&', '\&', 'g')
- let line = substitute(line,s:lt_pattern,'\<', 'g')
- let line = substitute(line,s:gt_pattern,'\>', 'g')
-
- return line
-endfunction
-
-
-function! s:delete_html_files(path) abort
- let htmlfiles = split(glob(a:path.'**/*.html'), '\n')
- for fname in htmlfiles
- " ignore user html files, e.g. search.html,404.html
- if stridx(vimwiki#vars#get_global('user_htmls'), fnamemodify(fname, ':t')) >= 0
- continue
- endif
-
- " delete if there is no corresponding wiki file
- let subdir = vimwiki#base#subdir(vimwiki#vars#get_wikilocal('path_html'), fname)
- let wikifile = vimwiki#vars#get_wikilocal('path').subdir.
- \fnamemodify(fname, ':t:r').vimwiki#vars#get_wikilocal('ext')
- if filereadable(wikifile)
- continue
- endif
-
- try
- call delete(fname)
- catch
- echomsg 'Vimwiki Error: Cannot delete '.fname
- endtry
- endfor
-endfunction
-
-
-function! s:mid(value, cnt) abort
- return strpart(a:value, a:cnt, len(a:value) - 2 * a:cnt)
-endfunction
-
-
-function! s:subst_func(line, regexp, func, ...) abort
- " Substitute text found by regexp with result of
- " func(matched) function.
-
- let pos = 0
- let lines = split(a:line, a:regexp, 1)
- let res_line = ''
- for line in lines
- let res_line = res_line.line
- let matched = matchstr(a:line, a:regexp, pos)
- if matched !=? ''
- if a:0
- let res_line = res_line.{a:func}(matched, a:1)
- else
- let res_line = res_line.{a:func}(matched)
- endif
- endif
- let pos = matchend(a:line, a:regexp, pos)
- endfor
- return res_line
-endfunction
-
-
-function! s:process_date(placeholders, default_date) abort
- if !empty(a:placeholders)
- for [placeholder, row, idx] in a:placeholders
- let [type, param] = placeholder
- if type ==# 'date' && !empty(param)
- return param
- endif
- endfor
- endif
- return a:default_date
-endfunction
-
-
-function! s:process_title(placeholders, default_title) abort
- if !empty(a:placeholders)
- for [placeholder, row, idx] in a:placeholders
- let [type, param] = placeholder
- if type ==# 'title' && !empty(param)
- return param
- endif
- endfor
- endif
- return a:default_title
-endfunction
-
-
-function! s:is_html_uptodate(wikifile) abort
- let tpl_time = -1
-
- let tpl_file = s:template_full_name('')
- if tpl_file !=? ''
- let tpl_time = getftime(tpl_file)
- endif
-
- let wikifile = fnamemodify(a:wikifile, ':p')
-
- if vimwiki#vars#get_wikilocal('html_filename_parameterization')
- let parameterized_wikiname = s:parameterized_wikiname(wikifile)
- let htmlfile = expand(vimwiki#vars#get_wikilocal('path_html') .
- \ vimwiki#vars#get_bufferlocal('subdir') . parameterized_wikiname)
- else
- let htmlfile = expand(vimwiki#vars#get_wikilocal('path_html') .
- \ vimwiki#vars#get_bufferlocal('subdir') . fnamemodify(wikifile, ':t:r').'.html')
- endif
-
- if getftime(wikifile) <= getftime(htmlfile) && tpl_time <= getftime(htmlfile)
- return 1
- endif
- return 0
-endfunction
-
-function! s:parameterized_wikiname(wikifile) abort
- let initial = fnamemodify(a:wikifile, ':t:r')
- let lower_sanitized = tolower(initial)
- let substituted = substitute(lower_sanitized, '[^a-z0-9_-]\+','-', 'g')
- let substituted = substitute(substituted, '\-\+','-', 'g')
- let substituted = substitute(substituted, '^-', '', 'g')
- let substituted = substitute(substituted, '-$', '', 'g')
- return substitute(substituted, '\-\+','-', 'g') . '.html'
-endfunction
-
-function! s:html_insert_contents(html_lines, content) abort
- let lines = []
- for line in a:html_lines
- if line =~# '%content%'
- let parts = split(line, '%content%', 1)
- if empty(parts)
- call extend(lines, a:content)
- else
- for idx in range(len(parts))
- call add(lines, parts[idx])
- if idx < len(parts) - 1
- call extend(lines, a:content)
- endif
- endfor
- endif
- else
- call add(lines, line)
- endif
- endfor
- return lines
-endfunction
-
-
-function! s:tag_eqin(value) abort
- " mathJAX wants \( \) for inline maths
- return '\('.s:mid(a:value, 1).'\)'
-endfunction
-
-
-function! s:tag_em(value) abort
- return ''.s:mid(a:value, 1).''
-endfunction
-
-
-function! s:tag_strong(value, header_ids) abort
- let text = s:mid(a:value, 1)
- let id = s:escape_html_attribute(text)
- let complete_id = ''
- for l in range(6)
- if a:header_ids[l][0] !=? ''
- let complete_id .= a:header_ids[l][0].'-'
- endif
- endfor
- if a:header_ids[5][0] ==? ''
- let complete_id = complete_id[:-2]
- endif
- let complete_id .= '-'.id
- return ''.text.''
-endfunction
-
-
-function! s:tag_tags(value, header_ids) abort
- let complete_id = ''
- for level in range(6)
- if a:header_ids[level][0] !=? ''
- let complete_id .= a:header_ids[level][0].'-'
- endif
- endfor
- if a:header_ids[5][0] ==? ''
- let complete_id = complete_id[:-2]
- endif
- let complete_id = s:escape_html_attribute(complete_id)
-
- let result = []
- for tag in split(a:value, ':')
- let id = s:escape_html_attribute(tag)
- call add(result, ''.tag.'')
- endfor
- return join(result)
-endfunction
-
-
-function! s:tag_todo(value) abort
- return ''.a:value.''
-endfunction
-
-
-function! s:tag_strike(value) abort
- return ''.s:mid(a:value, 2).''
-endfunction
-
-
-function! s:tag_super(value) abort
- return ''.s:mid(a:value, 1).''
-endfunction
-
-
-function! s:tag_sub(value) abort
- return ''.s:mid(a:value, 2).''
-endfunction
-
-
-function! s:tag_code(value) abort
- let l:retstr = ' 0.5)
- \ ? 'black' : 'white'
-
- let l:retstr .=
- \ " style='background-color:" . l:str .
- \ ';color:' . l:fg_color . ";'"
- endif
-
- let l:retstr .= '>'.s:safe_html_preformatted(l:str).''
- return l:retstr
-endfunction
-
-
-" match n-th ARG within {{URL[|ARG1|ARG2|...]}}
-" *c,d,e),...
-function! s:incl_match_arg(nn_index) abort
- let rx = vimwiki#vars#get_global('rxWikiInclPrefix'). vimwiki#vars#get_global('rxWikiInclUrl')
- let rx = rx . repeat(vimwiki#vars#get_global('rxWikiInclSeparator') .
- \ vimwiki#vars#get_global('rxWikiInclArg'), a:nn_index-1)
- if a:nn_index > 0
- let rx = rx. vimwiki#vars#get_global('rxWikiInclSeparator'). '\zs' .
- \ vimwiki#vars#get_global('rxWikiInclArg') . '\ze'
- endif
- let rx = rx . vimwiki#vars#get_global('rxWikiInclArgs') .
- \ vimwiki#vars#get_global('rxWikiInclSuffix')
- return rx
-endfunction
-
-
-function! s:linkify_link(src, descr) abort
- let src_str = ' href="'.s:escape_html_attribute(a:src).'"'
- let descr = vimwiki#u#trim(a:descr)
- let descr = (descr ==? '' ? a:src : descr)
- let descr_str = (descr =~# vimwiki#vars#get_global('rxWikiIncl')
- \ ? s:tag_wikiincl(descr)
- \ : descr)
- return ''.descr_str.''
-endfunction
-
-
-function! s:linkify_image(src, descr, verbatim_str) abort
- let src_str = ' src="'.a:src.'"'
- let descr_str = (a:descr !=? '' ? ' alt="'.a:descr.'"' : '')
- let verbatim_str = (a:verbatim_str !=? '' ? ' '.a:verbatim_str : '')
- return ''
-endfunction
-
-
-function! s:tag_weblink(value) abort
- " Weblink Template -> descr
- let str = a:value
- let url = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWeblinkMatchUrl'))
- let descr = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWeblinkMatchDescr'))
- let line = s:linkify_link(url, descr)
- return line
-endfunction
-
-
-function! s:tag_wikiincl(value) abort
- " {{imgurl|arg1|arg2}} -> ???
- " {{imgurl}} ->
- " {{imgurl|descr|style="A"}} ->
- " {{imgurl|descr|class="B"}} ->
- let str = a:value
- " custom transclusions
- let line = VimwikiWikiIncludeHandler(str)
- " otherwise, assume image transclusion
- if line ==? ''
- let url_0 = matchstr(str, vimwiki#vars#get_global('rxWikiInclMatchUrl'))
- let descr = matchstr(str, s:incl_match_arg(1))
- let verbatim_str = matchstr(str, s:incl_match_arg(2))
-
- let link_infos = vimwiki#base#resolve_link(url_0)
-
- 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, '#')
- let line = s:linkify_image(url, descr, verbatim_str)
- endif
- return line
-endfunction
-
-
-function! s:tag_wikilink(value) abort
- " [[url]] -> url
- " [[url|descr]] -> descr
- " [[url|{{...}}]] -> ...
- " [[fileurl.ext|descr]] -> descr
- " [[dirurl/|descr]] -> descr
- " [[url#a1#a2]] -> url#a1#a2
- " [[#a1#a2]] -> #a1#a2
- let str = a:value
- let url = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'))
- let descr = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'))
- let descr = vimwiki#u#trim(descr)
- let descr = (descr !=? '' ? descr : url)
-
- let line = VimwikiLinkConverter(url, s:current_wiki_file, s:current_html_file)
- if line ==? ''
- let link_infos = vimwiki#base#resolve_link(url, s:current_wiki_file)
-
- 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)
- elseif link_infos.scheme =~# '\mwiki\d\+\|diary'
- " wiki links are always relative to the current file
- let html_link = vimwiki#path#relpath(
- \ fnamemodify(s:current_wiki_file, ':h'),
- \ fnamemodify(link_infos.filename, ':r'))
- if html_link !~? '\m/$'
- let html_link .= '.html'
- endif
- else " other schemes, like http, are left untouched
- let html_link = link_infos.filename
- endif
-
- if link_infos.anchor !=? ''
- let anchor = substitute(link_infos.anchor, '#', '-', 'g')
- let html_link .= '#'.anchor
- endif
- let line = html_link
- endif
-
- let line = s:linkify_link(line, descr)
- return line
-endfunction
-
-
-function! s:tag_remove_internal_link(value) abort
- let value = s:mid(a:value, 2)
-
- let line = ''
- if value =~# '|'
- let link_parts = split(value, '|', 1)
- else
- let link_parts = split(value, '][', 1)
- endif
-
- if len(link_parts) > 1
- if len(link_parts) < 3
- let style = ''
- else
- let style = link_parts[2]
- endif
- let line = link_parts[1]
- else
- let line = value
- endif
- return line
-endfunction
-
-
-function! s:tag_remove_external_link(value) abort
- let value = s:mid(a:value, 1)
-
- let line = ''
- if s:is_web_link(value)
- let lnkElements = split(value)
- let head = lnkElements[0]
- let rest = join(lnkElements[1:])
- if rest ==? ''
- let rest = head
- endif
- let line = rest
- elseif s:is_img_link(value)
- let line = ''
- else
- " [alskfj sfsf] shouldn't be a link. So return it as it was --
- " enclosed in [...]
- let line = '['.value.']'
- endif
- return line
-endfunction
-
-
-function! s:make_tag(line, regexp, func, ...) abort
- " Make tags for a given matched regexp.
- " Exclude preformatted text and href links.
- " FIXME
- let patt_splitter = '\(`[^`]\+`\)\|'.
- \ '\('.vimwiki#vars#get_syntaxlocal('rxPreStart').'.\+'.
- \ vimwiki#vars#get_syntaxlocal('rxPreEnd').'\)\|'.
- \ '\(\)\|'.
- \ '\(\)\|'.
- \ '\(\)\|'.
- \ '\('.vimwiki#vars#get_syntaxlocal('rxEqIn').'\)'
-
- "FIXME FIXME !!! these can easily occur on the same line!
- "XXX {{{ }}} ??? obsolete
- if '`[^`]\+`' ==# a:regexp || '{{{.\+}}}' ==# a:regexp ||
- \ vimwiki#vars#get_syntaxlocal('rxEqIn') ==# a:regexp
- let res_line = s:subst_func(a:line, a:regexp, a:func)
- else
- let pos = 0
- " split line with patt_splitter to have parts of line before and after
- " href links, preformatted text
- " ie:
- " hello world `is just a` simple type of prg.
- " result:
- " ['hello world ', ' simple ', 'type of', ' prg']
- let lines = split(a:line, patt_splitter, 1)
- let res_line = ''
- for line in lines
- if a:0
- let res_line = res_line.s:subst_func(line, a:regexp, a:func, a:1)
- else
- let res_line = res_line.s:subst_func(line, a:regexp, a:func)
- endif
- let res_line = res_line.matchstr(a:line, patt_splitter, pos)
- let pos = matchend(a:line, patt_splitter, pos)
- endfor
- endif
- return res_line
-endfunction
-
-
-function! s:process_tags_remove_links(line) abort
- let line = a:line
- let line = s:make_tag(line, '\[\[.\{-}\]\]', 's:tag_remove_internal_link')
- let line = s:make_tag(line, '\[.\{-}\]', 's:tag_remove_external_link')
- return line
-endfunction
-
-
-function! s:process_tags_typefaces(line, header_ids) abort
- let line = a:line
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxItalic'), 's:tag_em')
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxBold'), 's:tag_strong', a:header_ids)
- let line = s:make_tag(line, vimwiki#vars#get_global('rxTodo'), 's:tag_todo')
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxDelText'), 's:tag_strike')
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxSuperScript'), 's:tag_super')
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxSubScript'), 's:tag_sub')
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxCode'), 's:tag_code')
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxEqIn'), 's:tag_eqin')
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxTags'), 's:tag_tags', a:header_ids)
- return line
-endfunction
-
-
-function! s:process_tags_links(line) abort
- let line = a:line
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxWikiLink'), 's:tag_wikilink')
- let line = s:make_tag(line, vimwiki#vars#get_global('rxWikiIncl'), 's:tag_wikiincl')
- let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxWeblink'), 's:tag_weblink')
- return line
-endfunction
-
-
-function! s:process_inline_tags(line, header_ids) abort
- let line = s:process_tags_links(a:line)
- let line = s:process_tags_typefaces(line, a:header_ids)
- return line
-endfunction
-
-
-function! s:close_tag_pre(pre, ldest) abort
- if a:pre[0]
- call insert(a:ldest, '')
- return 0
- endif
- return a:pre
-endfunction
-
-
-function! s:close_tag_math(math, ldest) abort
- if a:math[0]
- call insert(a:ldest, "\\\]")
- return 0
- endif
- return a:math
-endfunction
-
-
-function! s:close_tag_quote(quote, ldest) abort
- if a:quote
- call insert(a:ldest, '')
- return 0
- endif
- return a:quote
-endfunction
-
-
-function! s:close_tag_para(para, ldest) abort
- if a:para
- call insert(a:ldest, '
')
- return 0
- endif
- return a:para
-endfunction
-
-
-function! s:close_tag_table(table, ldest, header_ids) abort
- " The first element of table list is a string which tells us if table should be centered.
- " The rest elements are rows which are lists of columns:
- " ['center',
- " [ CELL1, CELL2, CELL3 ],
- " [ CELL1, CELL2, CELL3 ],
- " [ CELL1, CELL2, CELL3 ],
- " ]
- " And CELLx is: { 'body': 'col_x', 'rowspan': r, 'colspan': c }
-
- function! s:sum_rowspan(table) abort
- let table = a:table
-
- " Get max cells
- let max_cells = 0
- for row in table[1:]
- let n_cells = len(row)
- if n_cells > max_cells
- let max_cells = n_cells
- end
- endfor
-
- " Sum rowspan
- for cell_idx in range(max_cells)
- let rows = 1
-
- for row_idx in range(len(table)-1, 1, -1)
- if cell_idx >= len(table[row_idx])
- let rows = 1
- continue
- endif
-
- if table[row_idx][cell_idx].rowspan == 0
- let rows += 1
- else " table[row_idx][cell_idx].rowspan == 1
- let table[row_idx][cell_idx].rowspan = rows
- let rows = 1
- endif
- endfor
- endfor
- endfunction
-
- function! s:sum_colspan(table) abort
- for row in a:table[1:]
- let cols = 1
-
- for cell_idx in range(len(row)-1, 0, -1)
- if row[cell_idx].colspan == 0
- let cols += 1
- else "row[cell_idx].colspan == 1
- let row[cell_idx].colspan = cols
- let cols = 1
- endif
- endfor
- endfor
- endfunction
-
- function! s:close_tag_row(row, header, ldest, header_ids) abort
- call add(a:ldest, '
')
-
- " Set tag element of columns
- if a:header
- let tag_name = 'th'
- else
- let tag_name = 'td'
- end
-
- " Close tag of columns
- for cell in a:row
- if cell.rowspan == 0 || cell.colspan == 0
- continue
- endif
-
- if cell.rowspan > 1
- let rowspan_attr = ' rowspan="' . cell.rowspan . '"'
- else "cell.rowspan == 1
- let rowspan_attr = ''
- endif
- if cell.colspan > 1
- let colspan_attr = ' colspan="' . cell.colspan . '"'
- else "cell.colspan == 1
- let colspan_attr = ''
- endif
-
- call add(a:ldest, '<' . tag_name . rowspan_attr . colspan_attr .'>')
- call add(a:ldest, s:process_inline_tags(cell.body, a:header_ids))
- call add(a:ldest, ''. tag_name . '>')
- endfor
-
- call add(a:ldest, '
')
- endfunction
-
- let table = a:table
- let ldest = a:ldest
- if len(table)
- call s:sum_rowspan(table)
- call s:sum_colspan(table)
-
- if table[0] ==# 'center'
- call add(ldest, "
")
- else
- call add(ldest, '
')
- endif
-
- " Empty lists are table separators.
- " Search for the last empty list. All the above rows would be a table header.
- " We should exclude the first element of the table list as it is a text tag
- " that shows if table should be centered or not.
- let head = 0
- for idx in range(len(table)-1, 1, -1)
- if empty(table[idx])
- let head = idx
- break
- endif
- endfor
- if head > 0
- for row in table[1 : head-1]
- if !empty(filter(row, '!empty(v:val)'))
- call s:close_tag_row(row, 1, ldest, a:header_ids)
- endif
- endfor
- for row in table[head+1 :]
- call s:close_tag_row(row, 0, ldest, a:header_ids)
- endfor
- else
- for row in table[1 :]
- call s:close_tag_row(row, 0, ldest, a:header_ids)
- endfor
- endif
- call add(ldest, '
')
- let table = []
- endif
- return table
-endfunction
-
-
-function! s:close_tag_list(lists, ldest) abort
- while len(a:lists)
- let item = remove(a:lists, 0)
- call insert(a:ldest, item[0])
- endwhile
-endfunction
-
-
-function! s:close_tag_def_list(deflist, ldest) abort
- if a:deflist
- call insert(a:ldest, '')
- return 0
- endif
- return a:deflist
-endfunction
-
-
-function! s:process_tag_pre(line, pre) abort
- " pre is the list of [is_in_pre, indent_of_pre]
- "XXX always outputs a single line or empty list!
- let lines = []
- let pre = a:pre
- let processed = 0
- "XXX huh?
- "if !pre[0] && a:line =~# '^\s*{{{[^\(}}}\)]*\s*$'
- if !pre[0] && a:line =~# '^\s*{{{'
- let class = matchstr(a:line, '{{{\zs.*$')
- "FIXME class cannot contain arbitrary strings
- let class = substitute(class, '\s\+$', '', 'g')
- if class !=? ''
- call add(lines, '
')
- else
- call add(lines, '
')
- endif
- let pre = [1, len(matchstr(a:line, '^\s*\ze{{{'))]
- let processed = 1
- elseif pre[0] && a:line =~# '^\s*}}}\s*$'
- let pre = [0, 0]
- call add(lines, '
')
- let processed = 1
- elseif pre[0]
- let processed = 1
- "XXX destroys indent in general!
- "call add(lines, substitute(a:line, '^\s\{'.pre[1].'}', '', ''))
- call add(lines, s:safe_html_preformatted(a:line))
- endif
- return [processed, lines, pre]
-endfunction
-
-
-function! s:process_tag_math(line, math) abort
- " math is the list of [is_in_math, indent_of_math]
- let lines = []
- let math = a:math
- let processed = 0
- if !math[0] && a:line =~# '^\s*{{\$[^\(}}$\)]*\s*$'
- let class = matchstr(a:line, '{{$\zs.*$')
- "FIXME class cannot be any string!
- let class = substitute(class, '\s\+$', '', 'g')
- " store the environment name in a global variable in order to close the
- " environment properly
- let s:current_math_env = matchstr(class, '^%\zs\S\+\ze%')
- if s:current_math_env !=? ''
- call add(lines, substitute(class, '^%\(\S\+\)%', '\\begin{\1}', ''))
- elseif class !=? ''
- call add(lines, "\\\[".class)
- else
- call add(lines, "\\\[")
- endif
- let math = [1, len(matchstr(a:line, '^\s*\ze{{\$'))]
- let processed = 1
- elseif math[0] && a:line =~# '^\s*}}\$\s*$'
- let math = [0, 0]
- if s:current_math_env !=? ''
- call add(lines, "\\end{".s:current_math_env.'}')
- else
- call add(lines, "\\\]")
- endif
- let processed = 1
- elseif math[0]
- let processed = 1
- call add(lines, substitute(a:line, '^\s\{'.math[1].'}', '', ''))
- endif
- return [processed, lines, math]
-endfunction
-
-
-function! s:process_tag_quote(line, quote) abort
- let lines = []
- let quote = a:quote
- let processed = 0
- if a:line =~# '^\s\{4,}\S'
- if !quote
- call add(lines, '
'
- let chk = matchlist(a:line, a:rx_list)
- if !empty(chk) && len(chk[1]) > 0
- let completion = index(vimwiki#vars#get_syntaxlocal('listsyms_list'), chk[1])
- let n = len(vimwiki#vars#get_syntaxlocal('listsyms_list'))
- if completion == 0
- let st_tag = '
'
- elseif completion > 0 && completion < n
- let completion = float2nr(round(completion / (n-1.0) * 3.0 + 0.5 ))
- let st_tag = '
'
- endif
- endif
- return [st_tag, '']
- endfunction
-
-
- let in_list = (len(a:lists) > 0)
-
- " If it is not list yet then do not process line that starts from *bold*
- " text.
- " XXX necessary? in *bold* text, no space must follow the first *
- if !in_list
- let pos = match(a:line, '^\s*'.vimwiki#vars#get_syntaxlocal('rxBold'))
- if pos != -1
- return [0, []]
- endif
- endif
-
- let lines = []
- let processed = 0
-
- if a:line =~# '^\s*'.s:bullets.'\s'
- let lstSym = matchstr(a:line, s:bullets)
- let lstTagOpen = '
'
- let lstTagClose = '
'
- let lstRegExp = '^\s*'.s:bullets.'\s'
- elseif a:line =~# '^\s*'.s:numbers.'\s'
- let lstSym = matchstr(a:line, s:numbers)
- let lstTagOpen = ''
- let lstTagClose = ''
- let lstRegExp = '^\s*'.s:numbers.'\s'
- else
- let lstSym = ''
- let lstTagOpen = ''
- let lstTagClose = ''
- let lstRegExp = ''
- endif
-
- if lstSym !=? ''
- " To get proper indent level 'retab' the line -- change all tabs
- " to spaces*tabstop
- let line = substitute(a:line, '\t', repeat(' ', &tabstop), 'g')
- let indent = stridx(line, lstSym)
-
- let checkbox = '\s*\[\(.\)\]\s*'
- let [st_tag, en_tag] = s:add_checkbox(line, lstRegExp.checkbox)
-
- if !in_list
- call add(a:lists, [lstTagClose, indent])
- call add(lines, lstTagOpen)
- elseif (in_list && indent > a:lists[-1][1])
- let item = remove(a:lists, -1)
- call add(lines, item[0])
-
- call add(a:lists, [lstTagClose, indent])
- call add(lines, lstTagOpen)
- elseif (in_list && indent < a:lists[-1][1])
- while len(a:lists) && indent < a:lists[-1][1]
- let item = remove(a:lists, -1)
- call add(lines, item[0])
- endwhile
- elseif in_list
- let item = remove(a:lists, -1)
- call add(lines, item[0])
- endif
-
- call add(a:lists, [en_tag, indent])
- call add(lines, st_tag)
- call add(lines, substitute(a:line, lstRegExp.'\%('.checkbox.'\)\?', '', ''))
- let processed = 1
- elseif in_list && a:line =~# '^\s\+\S\+'
- if vimwiki#vars#get_global('list_ignore_newline')
- call add(lines, a:line)
- else
- call add(lines, ' '.a:line)
- endif
- let processed = 1
- else
- call s:close_tag_list(a:lists, lines)
- endif
- return [processed, lines]
-endfunction
-
-
-function! s:process_tag_def_list(line, deflist) abort
- let lines = []
- let deflist = a:deflist
- let processed = 0
- let matches = matchlist(a:line, '\(^.*\)::\%(\s\|$\)\(.*\)')
- if !deflist && len(matches) > 0
- call add(lines, '
')
- let deflist = 1
- endif
- if deflist && len(matches) > 0
- if matches[1] !=? ''
- call add(lines, '