pax_global_header00006660000000000000000000000064151140657740014524gustar00rootroot0000000000000052 comment=df471247831cf46c505154b158766b3695fc0d19 link.vim-2.0.0/000077500000000000000000000000001511406577400132525ustar00rootroot00000000000000link.vim-2.0.0/.git_hooks/000077500000000000000000000000001511406577400153165ustar00rootroot00000000000000link.vim-2.0.0/.git_hooks/pre-commit000077500000000000000000000005451511406577400173240ustar00rootroot00000000000000#!/usr/bin/env bash set -euo pipefail print_title() { local title="$1" printf "\033[1;33m" printf "%s" "$title" printf "\033[0m" printf "\n" } print_title "Running linter..." make lint-docker print_title "Running tests in Vim inside Docker..." make test-vim-docker print_title "Running tests in Neovim inside Docker..." make test-nvim-docker link.vim-2.0.0/.github/000077500000000000000000000000001511406577400146125ustar00rootroot00000000000000link.vim-2.0.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001511406577400167755ustar00rootroot00000000000000link.vim-2.0.0/.github/ISSUE_TEMPLATE/bug-report.md000066400000000000000000000005331511406577400214060ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- Make sure the plugin is updated to the latest version. Complete the following information: - Vim or Neovim version: [e.g. Vim 9.1 or Neovim 0.10.0] - Filetype: [e.g. markdown or mail] Include a minimal reproducible example in case of a bug. link.vim-2.0.0/.gitignore000066400000000000000000000000331511406577400152360ustar00rootroot00000000000000*.bak* sandbox*.* .vscode/ link.vim-2.0.0/.vintrc.yaml000066400000000000000000000024321511406577400155220ustar00rootroot00000000000000# See https://github.com/Vimjas/vint/wiki/Config cmdargs: # Checking more strictly (report errors, warnings and style problems) severity: style_problem # Enable coloring color: true # Enable Neovim syntax env: neovim: true # Limit max violations count error-limit: 10 # Print statistics like `Total violations: 20` stat: true # Print JSON instead of the human-readable output json: false # Change human-readable output format format: "{file_path}:{line_number}:{column_number}: {description}" policies: ProhibitAutocmdWithNoGroup: enabled: true ProhibitCommandRelyOnUser: enabled: true ProhibitCommandWithUnintendedSideEffect: enabled: true ProhibitEncodingOptionAfterScriptEncoding: enabled: true ProhibitEqualTildeOperator: enabled: true ProhibitImplicitScopeBuiltinVariable: enabled: true ProhibitMissingScriptEncoding: enabled: true ProhibitNoAbortFunction: enabled: true ProhibitSetNoCompatible: enabled: true ProhibitUnnecessaryDoubleQuote: enabled: true ProhibitUnusedVariable: enabled: true ignored_patterns: - "^_" - "l:_" ProhibitUsingUndeclaredVariable: enabled: true ProhibitAbbreviationOption: enabled: true ProhibitImplicitScopeVariable: enabled: true link.vim-2.0.0/Dockerfile000066400000000000000000000022401511406577400152420ustar00rootroot00000000000000# Run tests in a Docker container to avoid any interference from existing # settings and plugins. # hadolint global ignore=DL3001,DL3008,DL3059 # This points to the current Ubuntu LTS release. ARG BASE_IMAGE=ubuntu:latest FROM ${BASE_IMAGE} ARG DEBIAN_FRONTEND=noninteractive # Install packages. RUN apt-get update && \ apt-get install --yes --no-install-recommends git pipx vim neovim make && \ rm -rf /var/lib/apt/lists/* # Ensure that `vim` doesn't point to `nvim` on Ubuntu. RUN update-alternatives --set vim /usr/bin/vim.basic RUN useradd --create-home vimmer USER vimmer WORKDIR /home/vimmer RUN echo "set -o vi" >> /home/vimmer/.bashrc # Install the Vint linter. # hadolint ignore=DL3013 RUN pipx install git+https://github.com/Vimjas/vint.git ENV PATH="/home/vimmer/.local/bin:${PATH}" # Install the Vader test plugin. RUN git clone https://github.com/junegunn/vader.vim vader.vim # Copy the Vim and Neovim configuration files. COPY --chown=vimmer:vimmer test/minimal.vimrc .vimrc COPY --chown=vimmer:vimmer test/minimal.vimrc .config/nvim/init.vim # Copy the link.vim plugin. COPY --chown=vimmer:vimmer . link.vim WORKDIR /home/vimmer/link.vim CMD [ "bash" ] link.vim-2.0.0/LICENSE000066400000000000000000000020471511406577400142620ustar00rootroot00000000000000MIT License Copyright (c) 2024 qadzek 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. link.vim-2.0.0/Makefile000066400000000000000000000012341511406577400147120ustar00rootroot00000000000000.PHONY: build access lint lint-docker test test-vim test-vim-docker test-nvim test-nvim-docker .DEFAULT_GOAL := lint CONTAINER := docker container run --rm link.vim CONTAINER_TTY := docker container run -it --rm link.vim LINT := vint . TEST := 'Vader! **/*.vader' git-hooks: git config core.hooksPath .git_hooks build: docker image build -t link.vim . access: build $(CONTAINER_TTY) lint: $(LINT) lint-docker: build $(CONTAINER) $(LINT) test: ./test/run_tests.py -e nvim test-vim: ./test/run_tests.py -e vim test-vim-docker: build $(CONTAINER) vim -c $(TEST) test-nvim: ./test/run_tests.py -e nvim test-nvim-docker: build $(CONTAINER) nvim -c $(TEST) link.vim-2.0.0/README.md000066400000000000000000000064101511406577400145320ustar00rootroot00000000000000# link.vim `link.vim` is a plugin for Vim and Neovim that keeps long URLs out of your way. It moves URLs to a reference section, so you can focus on the content of your document. Links in Markdown syntax and plaintext links (e.g. in emails, in text files etc.) are supported. For instance, the following document: ```md [Vim](https://www.vim.org) and Neovim https://neovim.io are text editors. ``` will be turned into ```md [Vim][0] and Neovim [1] are text editors. Links: [0]: https://www.vim.org [1]: https://neovim.io ``` Watch the screencast for a quick overview of the plugin: https://github.com/qadzek/link.vim/assets/84473512/7be44a63-677c-4477-8e30-fa6090e3c6d9 ## Installation Use your favorite plugin manager to install this plugin. If you use [vim-plug][0]: ```vim Plug 'qadzek/link.vim' ``` If you use [lazy.nvim][1], see the example [spec](./lazy_nvim_spec_example.lua) file, or just add the following to your list of plugins: ```lua { "qadzek/link.vim" } ``` ## Usage `link.vim` can be used by executing one of the following commands: | Command | Key binding | Description | |----------------------|-------------------|------------------------------------------| | `:LinkConvertSingle` | `LocalLeader` + c | Convert one link on current line | | | `` + c | Same, but from insert mode | | `:LinkConvertRange` | `LocalLeader` + c | Convert links on visually selected lines | | `:LinkConvertAll` | `LocalLeader` + a | Convert all links in document | | `:LinkJump` | `LocalLeader` + j | Jump to and from reference section | | `:LinkOpen` | `LocalLeader` + o | Open link in browser | | `:LinkPeek` | `LocalLeader` + p | Show link preview | | `:LinkReformat` | `LocalLeader` + r | Renumber/merge/delete unneeded links | | `:LinkPrev` | `` | Move cursor to previous link | | `:LinkNext` | `` | Move cursor to next link | No mappings are built-in to avoid conflicts with your existing key bindings. You can quickly try out the key bindings suggested above by adding this line to your `vimrc`, _before_ your plugin manager initializes: ```vim let g:link_use_default_mappings = 1 ``` Note that by default, `` is the backslash key. Run `:help link-mappings` to view how to change these key bindings. Read `:help link-configuration` to learn how to customize or disable the heading, the position of the reference section, which lines to skip and more. ## Misc Questions, suggestions, comments, feature requests... everything is welcome in the _Issues_ tab. While this plugin was originally written from scratch, in `v2` it has been rewritten based on the excellent [wiki.vim][2] plugin. Make sure to give it a try, it's a great tool for writing and maintaining a personal wiki. If you would like to contribute, see `:help link-contributing`. This plugin uses the [Vint][3] linter and the [Vader][4] test framework. [0]: https://github.com/junegunn/vim-plug [1]: https://github.com/folke/lazy.nvim [2]: https://github.com/lervag/wiki.vim [3]: https://github.com/Vimjas/vint [4]: https://github.com/junegunn/vader.vim link.vim-2.0.0/autoload/000077500000000000000000000000001511406577400150625ustar00rootroot00000000000000link.vim-2.0.0/autoload/linkvim/000077500000000000000000000000001511406577400165335ustar00rootroot00000000000000link.vim-2.0.0/autoload/linkvim/debug.vim000066400000000000000000000105131511406577400203360ustar00rootroot00000000000000function! linkvim#debug#stacktrace(...) abort " " This function builds on Luc Hermite's answer on Stack Exchange: " http://vi.stackexchange.com/a/6024/21 " " " Get stack and exception " if empty(v:throwpoint) try throw 'dummy' catch let l:stack = reverse(split(v:throwpoint, '\.\.'))[1:] let l:exception = 'Manual stacktrace' endtry else let l:stack = reverse(split(v:throwpoint, '\.\.')) let l:exception = v:exception endif " " Build the quickfix entries " let l:qflist = [] let l:files = {} for l:func in l:stack try let [l:name, l:offset] = (l:func =~# '\S\+\[\d') \ ? matchlist(l:func, '\(\S\+\)\[\(\d\+\)\]')[1:2] \ : matchlist(l:func, '\(\S\+\), line \(\d\+\)')[1:2] catch let l:name = l:func let l:offset = 0 endtry if l:name =~# '\v(\|^)\d+_' let l:sid = matchstr(l:name, '\v(\|^)\zs\d+\ze_') let l:name = substitute(l:name, '\v(\|^)\d+_', 's:', '') let l:filename = substitute( \ linkvim#u#command('scriptnames')[l:sid-1], \ '^\s*\d\+:\s*', '', '') else let l:func_name = l:name =~# '^\d\+$' ? '{' . l:name . '}' : l:name let l:func_lines = linkvim#u#command('verbose function ' . l:func_name) if len(l:func_lines) > 1 let l:filename = matchstr( \ l:func_lines[1], \ v:lang[0:1] ==# 'en' \ ? 'Last set from \zs.*\.vim' : '\f\+\.vim') else let l:filename = 'NOFILE' endif endif let l:filename = fnamemodify(l:filename, ':p') if filereadable(l:filename) if !has_key(l:files, l:filename) let l:files[l:filename] = reverse(readfile(l:filename)) endif if l:name =~# '^\d\+$' let l:lnum = 0 let l:output = linkvim#u#command('function {' . l:name . '}') let l:text = substitute( \ matchstr(l:output, '^\s*' . l:offset), \ '^\d\+\s*', '', '') else let l:lnum = l:offset + len(l:files[l:filename]) \ - match(l:files[l:filename], '^\s*fu\%[nction]!\=\s\+' . l:name .'(') let l:lnum_rev = len(l:files[l:filename]) - l:lnum let l:text = substitute(l:files[l:filename][l:lnum_rev], '^\s*', '', '') endif else let l:filename = '' let l:lnum = 0 let l:text = '' endif call add(l:qflist, { \ 'filename': l:filename, \ 'function': l:name, \ 'lnum': l:lnum, \ 'text': len(l:qflist) == 0 ? l:exception : l:text, \ 'nr': len(l:qflist), \}) endfor " Fill in empty filenames let l:prev_filename = '_' call reverse(l:qflist) for l:entry in l:qflist if empty(l:entry.filename) let l:entry.filename = l:prev_filename endif let l:prev_filename = l:entry.filename endfor call reverse(l:qflist) if a:0 > 0 call setqflist(l:qflist) execute 'copen' len(l:qflist) + 2 wincmd p endif return l:qflist endfunction " }}}1 function! linkvim#debug#time(...) abort " let l:t1 = reltimefloat(reltime()) if a:0 > 0 call linkvim#log#warn(printf( \ "%s: %8.5f\n", \ a:0 > 1 ? a:2 : 'Time elapsed', l:t1 - a:1)) endif return l:t1 endfunction " }}}1 function! linkvim#debug#profile_start(...) abort " let l:fname = a:0 > 0 ? a:1 : 'prof.log' execute 'profile start' l:fname profile func * endfunction " }}}1 function! linkvim#debug#profile_stop() abort " profile stop call s:fix_sids() endfunction " }}}1 function! s:fix_sids() abort " {{{1 let l:lines = readfile('prof.log') let l:new = [] for l:line in l:lines let l:sid = matchstr(l:line, '\v\\zs\d+\ze_') if !empty(l:sid) let l:filename = map( \ linkvim#u#command('scriptnames'), \ {_, x -> split(x, '\v:=\s+')[1]})[l:sid-1] if l:filename =~# 'vimtex' let l:filename = substitute(l:filename, '^.*autoload\/', '', '') let l:filename = substitute(l:filename, '\.vim$', '#s:', '') let l:filename = substitute(l:filename, '\/', '#', 'g') else let l:filename .= ':' endif call add(l:new, substitute(l:line, '\v\\d+_', l:filename, 'g')) else call add(l:new, substitute(l:line, '\s\+$', '', '')) endif endfor call writefile(l:new, 'prof.log') endfunction " }}}1 link.vim-2.0.0/autoload/linkvim/init.vim000066400000000000000000000005601511406577400202140ustar00rootroot00000000000000" Note: This file is loaded as long as wiki.vim is loaded, so try to keep it as " short as possible! function! linkvim#init#option(name, default) abort let l:option = 'g:' . a:name if !exists(l:option) let {l:option} = a:default elseif type(a:default) == type({}) call linkvim#u#extend_recursive({l:option}, a:default, 'keep') endif endfunction link.vim-2.0.0/autoload/linkvim/jobs.vim000066400000000000000000000006411511406577400202060ustar00rootroot00000000000000function! linkvim#jobs#run(cmd, ...) abort " Run an external process. " " The optional argument is a dictionary of options. Each option is parsed in " the code below. " " Return: Nothing. let l:opts = a:0 > 0 ? a:1 : {} call linkvim#paths#pushd(get(l:opts, 'cwd', '')) call linkvim#jobs#{s:backend}#run(a:cmd) call linkvim#paths#popd() endfunction let s:backend = has('nvim') ? 'neovim' : 'vim' link.vim-2.0.0/autoload/linkvim/jobs/000077500000000000000000000000001511406577400174705ustar00rootroot00000000000000link.vim-2.0.0/autoload/linkvim/jobs/neovim.vim000066400000000000000000000010511511406577400214770ustar00rootroot00000000000000function! linkvim#jobs#neovim#run(cmd) abort call s:neovim_{s:os}_run(a:cmd) endfunction let s:os = has('win32') ? 'win' : 'unix' " vint: next-line -ProhibitUnusedVariable function! s:neovim_unix_run(cmd) abort call system(['sh', '-c', a:cmd]) endfunction " vint: next-line -ProhibitUnusedVariable function! s:neovim_win_run(cmd) abort let s:saveshell = [&shell, &shellcmdflag, &shellslash] set shell& shellcmdflag& shellslash& call system('cmd /s /c "' . a:cmd . '"') let [&shell, &shellcmdflag, &shellslash] = s:saveshell endfunction link.vim-2.0.0/autoload/linkvim/jobs/vim.vim000066400000000000000000000014201511406577400207750ustar00rootroot00000000000000function! linkvim#jobs#vim#run(cmd) abort call s:vim_{s:os}_run(a:cmd) endfunction let s:os = has('win32') ? 'win' : 'unix' " vint: next-line -ProhibitUnusedVariable function! s:vim_unix_run(cmd) abort silent! call system(a:cmd) endfunction " vint: next-line -ProhibitUnusedVariable function! s:vim_win_run(cmd) abort let s:saveshell = [ \ &shell, \ &shellcmdflag, \ &shellquote, \ &shellxquote, \ &shellredir, \ &shellslash \] set shell& shellcmdflag& shellquote& shellxquote& shellredir& shellslash& silent! call system('cmd /s /c "' . a:cmd . '"') let [ &shell, \ &shellcmdflag, \ &shellquote, \ &shellxquote, \ &shellredir, \ &shellslash] = s:saveshell endfunction link.vim-2.0.0/autoload/linkvim/link.vim000066400000000000000000000070711511406577400202120ustar00rootroot00000000000000function! linkvim#link#get() abort if linkvim#u#is_code() | return {} | endif for l:link_definition in g:linkvim#link#definitions#all let l:match = s:match_at_cursor(l:link_definition.rx) if empty(l:match) | continue | endif return linkvim#link#class#new(l:link_definition, l:match) endfor return {} endfunction function! s:match_at_cursor(regex) abort let l:lnum = line('.') " Seach backwards for current regex let l:c1 = searchpos(a:regex, 'ncb', l:lnum)[1] if l:c1 == 0 | return {} | endif " Ensure that the cursor is positioned on top of the match let l:c1e = searchpos(a:regex, 'ncbe', l:lnum)[1] if l:c1e >= l:c1 && l:c1e < col('.') | return {} | endif " Find the end of the match let l:c2 = searchpos(a:regex, 'nce', l:lnum)[1] if l:c2 == 0 | return {} | endif let l:c2 = linkvim#u#cnum_to_byte(l:c2) return { \ 'content': strpart(getline('.'), l:c1-1, l:c2-l:c1+1), \ 'origin': expand('%:p'), \ 'pos_end': [l:lnum, l:c2], \ 'pos_start': [l:lnum, l:c1], \} endfunction function! linkvim#link#show(...) abort let l:link = linkvim#link#get() if empty(l:link) || l:link.type ==# 'word' call linkvim#log#info('No link detected') else let l:viewer = { \ 'name': 'LinkInfo', \ 'items': l:link.describe() \} function! l:viewer.print_content() abort dict for [l:key, l:value] in l:self.items call append('$', printf(' %-14s %s', l:key, l:value)) endfor endfunction call linkvim#scratch#new(l:viewer) endif endfunction function! linkvim#link#follow(...) abort let l:edit_cmd = a:0 > 0 ? a:1 : 'edit' let l:link = linkvim#link#get() if empty(l:link) | return | endif try call linkvim#url#follow(l:link.url, l:edit_cmd) catch /E37:/ call linkvim#log#error( \ "Can't follow link before you've saved the current buffer.") endtry endfunction function! linkvim#link#get_scheme(link_type) abort let l:scheme = get(g:linkvim_link_default_schemes, a:link_type, '') if type(l:scheme) == v:t_dict let l:scheme = get(l:scheme, expand('%:e'), '') endif return l:scheme endfunction function! linkvim#link#get_all_from_file(...) abort let l:file = a:0 > 0 ? a:1 : expand('%:p') if !filereadable(l:file) | return [] | endif return linkvim#link#get_all_from_lines(readfile(l:file), l:file) endfunction function! linkvim#link#get_all_from_range(line1, line2) abort let l:lines = getline(a:line1, a:line2) return linkvim#link#get_all_from_lines(l:lines, expand('%:p'), a:line1) endfunction function! linkvim#link#get_all_from_lines(lines, file, ...) abort let l:links = [] let l:in_code = v:false let l:skip = v:false let l:lnum = a:0 > 0 ? (a:1 - 1) : 0 for l:line in a:lines let l:lnum += 1 let [l:in_code, l:skip] = linkvim#u#is_code_by_string(l:line, l:in_code) if l:skip | continue | endif let l:c2 = 0 while v:true let l:c1 = match(l:line, g:linkvim#rx#link, l:c2) + 1 if l:c1 == 0 | break | endif let l:content = matchstr(l:line, g:linkvim#rx#link, l:c2) let l:c2 = l:c1 + strlen(l:content) for l:link_definition in g:linkvim#link#definitions#all_real if l:content =~# l:link_definition.rx call add(l:links, linkvim#link#class#new(l:link_definition, { \ 'content': l:content, \ 'origin': a:file, \ 'pos_start': [l:lnum, l:c1], \ 'pos_end': [l:lnum, l:c2], \})) break endif endfor endwhile endfor return l:links endfunction link.vim-2.0.0/autoload/linkvim/link/000077500000000000000000000000001511406577400174705ustar00rootroot00000000000000link.vim-2.0.0/autoload/linkvim/link/class.vim000066400000000000000000000063731511406577400213230ustar00rootroot00000000000000" vint: -ProhibitImplicitScopeVariable function! linkvim#link#class#new(link_definition, match) abort let l:link = extend(deepcopy(s:link), a:match, 'error') let l:link.type = a:link_definition.type " Parse link description and URL let l:link.text = '' let l:link.url = l:link.content call s:parse_from_content(l:link, a:link_definition, 'text') call s:parse_from_content(l:link, a:link_definition, 'url') let l:link.url_raw = l:link.url " Remove enclosing angled brackets let l:link.url = substitute(l:link.url, '^<\(.*\)>$', '\1', '') " Add scheme to URL if it is missing if has_key(a:link_definition, '__scheme') let l:link.scheme = type(a:link_definition.__scheme) == v:t_func \ ? a:link_definition.__scheme() \ : a:link_definition.__scheme let l:link.url = l:link.scheme . ':' . l:link.url else let l:link.scheme = matchstr(l:link.url, '^\w\+\ze:') if empty(l:link.scheme) let l:default_scheme = linkvim#link#get_scheme(l:link.type) if !empty(l:default_scheme) let l:link.url = l:default_scheme . ':' . l:link.url let l:link.scheme = l:default_scheme endif endif endif return l:link endfunction function! s:parse_from_content(link, link_definition, name) abort let l:regex = get(a:link_definition, 'rx_' . a:name, '') if empty(l:regex) | return | endif let [l:match, l:c1, l:c2] = s:matchstrpos(a:link.content, l:regex) if empty(l:match) | return | endif let a:link[a:name] = l:match let a:link[a:name . '_pos_start'] = [ \ a:link.pos_start[0], \ a:link.pos_start[1] + l:c1 \] let a:link[a:name . '_pos_end'] = [ \ a:link.pos_start[0], \ a:link.pos_start[1] + l:c2 - 1 \] endfunction function! s:matchstrpos(...) abort if exists('*matchstrpos') return call('matchstrpos', a:000) else let [l:expr, l:pat] = a:000[:1] let l:pos = match(l:expr, l:pat) if l:pos < 0 return ['', -1, -1] else let l:match = matchstr(l:expr, l:pat) return [l:match, l:pos, l:pos+strlen(l:match)] endif endif endfunction let s:link = {} function! s:link.replace(text) dict abort let l:line = getline(self.pos_start[0]) call setline(self.pos_start[0], \ strpart(l:line, 0, self.pos_start[1]-1) \ . a:text \ . strpart(l:line, self.pos_end[1])) endfunction function! s:link.describe() dict abort let l:content = [ \ ['Type:', self.type], \ ['Match:', self.content], \ ['URL:', self.url], \] if self.url !=# self.url_raw let l:content += [['URL (raw):', self.url_raw]] endif let l:content += [['Description:', empty(self.text) ? 'N/A' : self.text]] let l:content += [['', '']] let l:content += [['Resolved URL object:', '']] for [l:key, l:value] in items(self.resolve()) let l:content += [[' ' . l:key . ':', l:value]] endfor return l:content endfunction function! s:link.transform() dict abort let l:new = self.__transformer(self.url_raw, self.text, self) if empty(l:new) | return | endif call self.replace(l:new) endfunction function! s:link.resolve() dict abort if self.type ==# 'word' | return '' | endif return linkvim#url#resolve(self.url, self.origin) endfunction " vint: +ProhibitImplicitScopeVariable link.vim-2.0.0/autoload/linkvim/link/definitions.vim000066400000000000000000000135131511406577400225230ustar00rootroot00000000000000let g:linkvim#link#definitions#wiki = { \ 'type': 'wiki', \ 'rx': g:linkvim#rx#link_wiki, \ 'rx_url': '\[\[\zs\/\?[^\\\]]\{-}\ze\%(|[^\\\]]\{-}\)\?\]\]', \ 'rx_text': '\[\[\/\?[^\\\]]\{-}|\zs[^\\\]]\{-}\ze\]\]', \} let g:linkvim#link#definitions#adoc_xref_bracket = { \ 'type': 'adoc_xref_bracket', \ 'rx': g:linkvim#rx#link_adoc_xref_bracket, \ 'rx_url': '<<\zs\%([^,>]\{-}\ze,[^>]\{-}\|[^>]\{-}\ze\)>>', \ 'rx_text': '<<[^,>]\{-},\zs[^>]\{-}\ze>>', \} let g:linkvim#link#definitions#adoc_xref_inline = { \ 'type': 'adoc_xref_inline', \ 'rx': g:linkvim#rx#link_adoc_xref_inline, \ 'rx_url': '\ printf('![%s](%s)', empty(t) ? u : t, u) }, \} let g:linkvim#link#definitions#md = { \ 'type': 'md', \ 'rx': g:linkvim#rx#link_md, \ 'rx_url': '\[[^[\]]\{-}\](\zs[^\\]\{-}\ze)', \ 'rx_text': '\[\zs[^[\]]\{-}\ze\]([^\\]\{-})', \} let g:linkvim#link#definitions#org = { \ 'type' : 'org', \ 'rx' : g:linkvim#rx#link_org, \ 'rx_url' : '\[\[\zs\/\?[^\\\]]\{-}\ze\]\%(\[[^\\\]]\{-}\]\)\?\]', \ 'rx_text' : '\[\[\/\?[^\\\]]\{-}\]\[\zs[^\\\]]\{-}\ze\]\]', \} " MODIFIED let g:linkvim#link#definitions#ref_target = { \ 'type': 'ref_target', \ 'rx': g:linkvim#rx#link_ref_target, \ 'rx_url': '\[' . g:linkvim#rx#reflabel . '\]:\s\+\zs' . g:linkvim#rx#url_ref_target, \ 'rx_text': '^\s*\[\zs' . g:linkvim#rx#reflabel . '\ze\]', \ '__transformer': function('linkvim#link#templates#ref_target'), \} let g:linkvim#link#definitions#reference = { \ 'type': 'reference', \ 'rx': g:linkvim#rx#link_reference, \ 'rx_url': '\[\zs' . g:linkvim#rx#reflabel . '\ze\]', \ '__scheme': 'reference', \ '__transformer': { _u, _t, l -> linkvim#link#template#md(l.url, l.id) }, \} let g:linkvim#link#definitions#ref_collapsed = extend( \ deepcopy(g:linkvim#link#definitions#reference), { \ 'rx': g:linkvim#rx#link_ref_collapsed, \ 'rx_url': '\[\zs' . g:linkvim#rx#reflabel . '\ze\]\[\]', \ 'rx_text': '\[\zs' . g:linkvim#rx#reflabel . '\ze\]\[\]', \}) let g:linkvim#link#definitions#ref_full = extend( \ deepcopy(g:linkvim#link#definitions#reference), { \ 'rx': g:linkvim#rx#link_ref_full, \ 'rx_url': \ '\[' . g:linkvim#rx#reftext . '\]' \ . '\[\zs' . g:linkvim#rx#reflabel . '\ze\]', \ 'rx_text': \ '\[\zs' . g:linkvim#rx#reftext . '\ze\]' \ . '\[' . g:linkvim#rx#reflabel . '\]', \}) let g:linkvim#link#definitions#url = { \ 'type': 'url', \ 'rx': g:linkvim#rx#url, \} let g:linkvim#link#definitions#cite = { \ 'type': 'cite', \ 'rx': g:linkvim#rx#link_cite, \ 'rx_url': g:linkvim#rx#link_cite_url, \ '__scheme': { -> linkvim#link#get_scheme('cite') }, \} let g:linkvim#link#definitions#date = { \ 'type': 'date', \ 'rx': g:linkvim#rx#date, \} let g:linkvim#link#definitions#word = { \ 'type' : 'word', \ 'rx' : g:linkvim#rx#word, \ '__transformer': function('linkvim#link#templates#word'), \} " linkvim#link#definitions#all is an ordered list of definitions used by " linkvim#link#get() to detect a link at the cursor. " " Notice that the order is important! The order between the wiki, md, and org " definitions is especially tricky! This is because wiki and org links are " equivalent when they lack a description: [[url]]. Thus, the order specified " here means wiki.vim will always match [[url]] as a wiki link and never as an " org link. This is not a problem for links with a description, though, since " they differ: [[url|description]] vs [[url][description]], respectively. let g:linkvim#link#definitions#all = [ \ g:linkvim#link#definitions#wiki, \ g:linkvim#link#definitions#adoc_xref_bracket, \ g:linkvim#link#definitions#adoc_xref_inline, \ g:linkvim#link#definitions#adoc_link, \ g:linkvim#link#definitions#md_fig, \ g:linkvim#link#definitions#md, \ g:linkvim#link#definitions#org, \ g:linkvim#link#definitions#ref_target, \ g:linkvim#link#definitions#reference, \ g:linkvim#link#definitions#ref_collapsed, \ g:linkvim#link#definitions#ref_full, \ g:linkvim#link#definitions#cite, \ g:linkvim#link#definitions#url, \ g:linkvim#link#definitions#date, \ g:linkvim#link#definitions#word, \] " linkvim#link#definitions#all_real is an ordered list of definitions used by " linkvim#link#get_all_from_lines() to get all links from a list of lines. let g:linkvim#link#definitions#all_real = [ \ g:linkvim#link#definitions#wiki, \ g:linkvim#link#definitions#adoc_xref_bracket, \ g:linkvim#link#definitions#adoc_xref_inline, \ g:linkvim#link#definitions#adoc_link, \ g:linkvim#link#definitions#md_fig, \ g:linkvim#link#definitions#md, \ g:linkvim#link#definitions#org, \ g:linkvim#link#definitions#ref_target, \ g:linkvim#link#definitions#cite, \ g:linkvim#link#definitions#url, \] + [ \ g:linkvim#link#definitions#reference, \ g:linkvim#link#definitions#ref_collapsed, \ g:linkvim#link#definitions#ref_full, \ ] " MODIFIED link.vim-2.0.0/autoload/linkvim/log.vim000066400000000000000000000066331511406577400200410ustar00rootroot00000000000000" vint: -ProhibitImplicitScopeVariable function! linkvim#log#info(...) abort call s:logger.add(a:000, 'info') endfunction function! linkvim#log#warn(...) abort call s:logger.add(a:000, 'warning') endfunction function! linkvim#log#error(...) abort call s:logger.add(a:000, 'error') endfunction function! linkvim#log#get() abort return s:logger.entries endfunction function! linkvim#log#open() abort call linkvim#scratch#new(s:logger) endfunction function! linkvim#log#toggle_verbose() abort let s:logger.verbose = !s:logger.verbose endfunction function! linkvim#log#set_silent() abort let s:logger.verbose_old = get(s:logger, 'verbose_old', s:logger.verbose) let s:logger.verbose = 0 endfunction function! linkvim#log#set_silent_restore() abort let s:logger.verbose = get(s:logger, 'verbose_old', s:logger.verbose) endfunction let s:logger = { \ 'name': 'LinkVimMessageLog', \ 'entries' : [], \ 'type_to_highlight' : { \ 'info' : 'Identifier', \ 'warning' : 'WarningMsg', \ 'error' : 'ErrorMsg', \ }, \ 'type_to_level': { \ 'info': 1, \ 'warning': 2, \ 'error': 3, \ }, \ 'verbose': get(get(s:, 'logger', {}), 'verbose', \ get(g:, 'linkvim_log_verbose', 1)), \} function! s:logger.add(msg_arg, type) abort dict let l:msg_list = [] for l:msg in a:msg_arg if type(l:msg) == v:t_string call add(l:msg_list, l:msg) elseif type(l:msg) == v:t_list call extend(l:msg_list, filter(l:msg, 'type(v:val) == v:t_string')) endif endfor let l:entry = {} let l:entry.type = a:type let l:entry.time = strftime('%T') let l:entry.msg = l:msg_list let l:entry.callstack = linkvim#debug#stacktrace()[1:] for l:level in l:entry.callstack let l:level.nr -= 2 endfor call add(self.entries, l:entry) if self.verbose if self.type_to_level[a:type] > 1 unsilent call self.notify(l:msg_list, a:type) else call self.notify(l:msg_list, a:type) endif endif endfunction function! s:logger.notify(msg_list, type) abort dict call linkvim#ui#echo([ \ [self.type_to_highlight[a:type], 'link.vim:'], \ ' ' . a:msg_list[0] \]) for l:msg in a:msg_list[1:] call linkvim#ui#echo(l:msg, {'indent': 2}) endfor endfunction function! s:logger.print_content() abort dict for l:entry in self.entries call append('$', printf('%s: %s', l:entry.time, l:entry.type)) for l:stack in l:entry.callstack if l:stack.lnum > 0 call append('$', printf(' #%d %s:%d', l:stack.nr, l:stack.filename, l:stack.lnum)) else call append('$', printf(' #%d %s', l:stack.nr, l:stack.filename)) endif call append('$', printf(' In %s', l:stack.function)) if !empty(l:stack.text) call append('$', printf(' %s', l:stack.text)) endif endfor for l:msg in l:entry.msg call append('$', printf(' %s', l:msg)) endfor call append('$', '') endfor endfunction function! s:logger.syntax() abort dict syntax match WikiLogOther /.*/ syntax include @VIM syntax/vim.vim syntax match WikiLogVimCode /^ .*/ transparent contains=@VIM syntax match WikiLogKey /^\S*:/ nextgroup=WikiLogValue syntax match WikiLogKey /^ #\d\+/ nextgroup=WikiLogValue syntax match WikiLogKey /^ In/ nextgroup=WikiLogValue syntax match WikiLogValue /.*/ contained endfunction " vint: +ProhibitImplicitScopeVariable link.vim-2.0.0/autoload/linkvim/nav.vim000066400000000000000000000005241511406577400200350ustar00rootroot00000000000000function! linkvim#nav#next_link() abort call search(g:linkvim#rx#link, 's') endfunction function! linkvim#nav#prev_link() abort if linkvim#u#in_syntax('wikiLink.*') \ && linkvim#u#in_syntax('wikiLink.*', line('.'), col('.')-1) call search(g:linkvim#rx#link, 'sb') endif call search(g:linkvim#rx#link, 'sb') endfunction link.vim-2.0.0/autoload/linkvim/paths.vim000066400000000000000000000062051511406577400203720ustar00rootroot00000000000000function! linkvim#paths#pushd(path) abort if empty(a:path) || getcwd() ==# fnamemodify(a:path, ':p') let s:qpath += [''] else let s:qpath += [getcwd()] execute s:cd fnameescape(a:path) endif endfunction function! linkvim#paths#popd() abort let l:path = remove(s:qpath, -1) if !empty(l:path) execute s:cd fnameescape(l:path) endif endfunction function! linkvim#paths#join(root, tail) abort return linkvim#paths#s(a:root . '/' . a:tail) endfunction function! linkvim#paths#s(path) abort " Handle shellescape issues and simplify path let l:path = exists('+shellslash') && !&shellslash \ ? tr(a:path, '/', '\') \ : a:path return simplify(l:path) endfunction function! linkvim#paths#is_abs(path) abort return a:path =~# s:re_abs endfunction function! linkvim#paths#shorten_relative(path) abort " Input: An absolute path " Output: Relative path with respect to the wiki root, unless absolute path " is shorter let l:relative = linkvim#paths#relative(a:path, linkvim#get_root()) return strlen(l:relative) < strlen(a:path) \ ? l:relative : a:path endfunction function! linkvim#paths#relative(path, current) abort " Note: This algorithm is based on the one presented by @Offirmo at SO, " http://stackoverflow.com/a/12498485/51634 let l:target = simplify(substitute(a:path, '\\', '/', 'g')) let l:common = simplify(substitute(a:current, '\\', '/', 'g')) " This only works on absolute paths if !linkvim#paths#is_abs(l:target) return substitute(a:path, '^\.\/', '', '') endif if has('win32') let l:target = substitute(l:target, '^\a:', '', '') let l:common = substitute(l:common, '^\a:', '', '') endif if l:common[-1:] ==# '/' let l:common = l:common[:-2] endif let l:tries = 50 let l:result = '' while stridx(l:target, l:common) != 0 && l:tries > 0 let l:common = fnamemodify(l:common, ':h') let l:result = empty(l:result) ? '..' : '../' . l:result let l:tries -= 1 endwhile if l:tries == 0 | return a:path | endif if l:common ==# '/' let l:result .= '/' endif let l:forward = strpart(l:target, strlen(l:common)) if !empty(l:forward) let l:result = empty(l:result) \ ? l:forward[1:] \ : l:result . l:forward endif return l:result endfunction function! linkvim#paths#to_node(path) abort " Input: An absolute path " Output: Relative path without extension with respect to the wiki root, " unless absolute path is shorter (a "node") return fnamemodify(linkvim#paths#shorten_relative(a:path), ':r') endfunction function! linkvim#paths#to_wiki_url(path, ...) abort " Input: absolute path " Output: wiki url (relative to root) let l:root = a:0 > 0 ? a:1 : linkvim#get_root() let l:path = linkvim#paths#relative(a:path, l:root) let l:ext = '.' .. fnamemodify(l:path, ':e') return linkvim#link#get_creator('url_extension') ==# l:ext \ ? l:path \ : fnamemodify(l:path, ':r') endfunction let s:cd = haslocaldir() \ ? 'lcd' \ : exists(':tcd') && haslocaldir(-1) ? 'tcd' : 'cd' let s:qpath = get(s:, 'qpath', []) let s:re_abs = has('win32') ? '^\a:[\\/]' : '^/' link.vim-2.0.0/autoload/linkvim/rx.vim000066400000000000000000000063271511406577400177110ustar00rootroot00000000000000" vint: -ProhibitImplicitScopeVariable function! linkvim#rx#surrounded(word, chars) abort return '\%(^\|\s\|[[:punct:]]\)\zs' \ . escape(a:chars, '*') \ . a:word \ . escape(join(reverse(split(a:chars, '\zs')), ''), '*') \ . '\ze\%([[:punct:]]\|\s\|$\)' endfunction let linkvim#rx#word = '[^[:blank:]!"$%&''()*+,:;<=>?\[\]\\^`{}]\+' let linkvim#rx#pre_beg = '^\s*```' let linkvim#rx#pre_end = '^\s*```\s*$' let linkvim#rx#super = '\^[^^`]\+\^' let linkvim#rx#sub = ',,[^,`]\+,,' let linkvim#rx#list_define = '::\%(\s\|$\)' let linkvim#rx#comment = '^\s*%%.*$' let linkvim#rx#todo = '\C\<\%(TODO\|STARTED\|FIXME\)\>:\?' let linkvim#rx#done = '\C\<\%(OK\|DONE\|FIXED\)\>:\?' let linkvim#rx#header_md_atx = '^#\{1,6}\s*[^#].*' let linkvim#rx#header_md_atx_items = '^\(#\{1,6}\)\s*\([^#].*\)\s*$' let linkvim#rx#header_org = '^\*\{1,6}\s*[^\*].*' let linkvim#rx#header_org_items = '^\(\*\{1,6}\)\s*\([^\*].*\)\s*$' let linkvim#rx#header_adoc = '^=\{1,6}\s*[^=].*' let linkvim#rx#header_adoc_items = '^\(=\{1,6}\)\s*\([^=].*\)\s*$' let linkvim#rx#bold = linkvim#rx#surrounded( \ '[^*`[:space:]]\%([^*`]*[^*`[:space:]]\)\?', '*') let linkvim#rx#italic = linkvim#rx#surrounded( \ '[^_`[:space:]]\%([^_`]*[^_`[:space:]]\)\?', '_') let linkvim#rx#date = '\d\d\d\d-\d\d-\d\d' let linkvim#rx#url = \ '\%(\<\l\+:\%(\/\/\)\?[^ \t()\[\]|]\+[^ \t()\[\]|.,?!:;''"]' \ . '\|' \ . '<\zs\l\+:\%(\/\/\)\?[^>]\+\ze>\)' " Match as few characters as possible, each of which is not \, [, or ]. let linkvim#rx#reftext = '[^\\\[\]]\{-}' let linkvim#rx#reflabel = '\%(\d\+\|\a[-_. [:alnum:]]\+\|\^\w\+\)' let linkvim#rx#link_adoc_link = '\ q :call b:scratch.close() nnoremap :call b:scratch.close() nnoremap :call b:scratch.close() nnoremap :call b:scratch.close() nnoremap :call b:scratch.close() if has_key(self, 'syntax') call self.syntax() endif if has_key(self, 'post_init') call self.post_init() endif call self.fill() endfunction function! s:scratch.close() abort dict silent execute 'keepalt buffer' self.prev_bufnr endfunction function! s:scratch.fill() abort dict setlocal modifiable %delete call self.print_content() 0delete _ setlocal nomodifiable endfunction " vint: +ProhibitImplicitScopeVariable link.vim-2.0.0/autoload/linkvim/u.vim000066400000000000000000000065041511406577400175210ustar00rootroot00000000000000function! linkvim#u#cnum_to_byte(cnum) abort if a:cnum <= 0 | return a:cnum | endif let l:bytes = len(strcharpart(getline('.')[a:cnum-1:], 0, 1)) return a:cnum + l:bytes - 1 endfunction function! linkvim#u#command(cmd) abort return execute(a:cmd, 'silent!')->split("\n") endfunction function! linkvim#u#extend_recursive(dict1, dict2, ...) abort let l:option = a:0 > 0 ? a:1 : 'force' if index(['force', 'keep', 'error'], l:option) < 0 throw 'E475: Invalid argument: ' .. l:option endif for [l:key, l:Value] in items(a:dict2) if !has_key(a:dict1, l:key) let a:dict1[l:key] = l:Value elseif type(l:Value) == type({}) call linkvim#u#extend_recursive(a:dict1[l:key], l:Value, l:option) elseif l:option ==# 'error' throw 'E737: Key already exists: ' .. l:key elseif l:option ==# 'force' let a:dict1[l:key] = l:Value endif unlet l:Value endfor return a:dict1 endfunction function! linkvim#u#in_syntax(name, ...) abort let l:pos = [0, 0] let l:pos[0] = a:0 > 0 ? a:1 : line('.') let l:pos[1] = a:0 > 1 ? a:2 : col('.') if mode() ==# 'i' let l:pos[1] -= 1 endif if l:pos[1] <= 0 let l:pos[0] -= 1 let l:pos[1] = 10000 endif call map(l:pos, 'max([v:val, 1])') " vint: -ProhibitInvalidMapCall " Check syntax at position return synstack(l:pos[0], l:pos[1]) \ ->map("synIDattr(v:val, 'name')") \ ->match('^' .. a:name) >= 0 " vint: +ProhibitInvalidMapCall endfunction function! linkvim#u#is_code(...) abort let l:lnum = a:0 > 0 ? a:1 : line('.') let l:col = a:0 > 1 ? a:2 : col('.') " vint: -ProhibitInvalidMapCall return synstack(l:lnum, l:col) \ ->map("synIDattr(v:val, 'name')") \ ->match('^\%(wikiPre\|mkd\%(Code\|Snippet\)\|markdownCode\)') >= 0 " vint: +ProhibitInvalidMapCall endfunction function! linkvim#u#is_code_by_string(line, in_code) abort " Check if we are inside a fenced code block by inspecting a given line. The " in_code argument indicates if we were already within a code block. " " We return two values: [in_code, skip] " " `in_code` is taken to be true for all lines within a fenced code block " except the last fence. `skip` is true for all lines, including the last " fence. This means we can use the output to properly skip lines while " parsing a set of lines. if a:in_code let l:code_ended = a:line =~# '^\s*```\s*$' return [!l:code_ended, v:true] endif if a:line =~# '^\s*```\w*\s*$' return [v:true, v:true] endif return [v:false, v:false] endfunction function! linkvim#u#shellescape(string) abort " " Path used in "cmd" only needs to be enclosed by double quotes. " shellescape() on Windows with "shellslash" set will produce a path " enclosed by single quotes, which "cmd" does not recognize and reports an " error. " if has('win32') let l:shellslash = &shellslash set noshellslash let l:cmd = shellescape(a:string) let &shellslash = l:shellslash return l:cmd endif return shellescape(a:string) endfunction function! linkvim#u#uniq_unsorted(list) abort if len(a:list) <= 1 | return a:list | endif let l:visited = {} let l:result = [] for l:x in a:list let l:key = string(l:x) if !has_key(l:visited, l:key) let l:visited[l:key] = 1 call add(l:result, l:x) endif endfor return l:result endfunction link.vim-2.0.0/autoload/linkvim/ui.vim000066400000000000000000000057011511406577400176700ustar00rootroot00000000000000function! linkvim#ui#echo(input, ...) abort if empty(a:input) | return | endif let l:opts = extend(#{indent: 0}, a:0 > 0 ? a:1 : {}) if type(a:input) == v:t_string call s:echo_string(a:input, l:opts) elseif type(a:input) == v:t_list call s:echo_formatted(a:input, l:opts) elseif type(a:input) == v:t_dict call s:echo_dict(a:input, l:opts) else call linkvim#log#warn('Argument not supported: ' . type(a:input)) endif endfunction function! linkvim#ui#confirm(prompt) abort return linkvim#ui#{g:linkvim_ui_method.confirm}#confirm(a:prompt) endfunction function! linkvim#ui#input(options) abort let l:options = extend(#{ \ prompt: '> ', \ text: '', \ info: '', \}, a:options) return linkvim#ui#{g:linkvim_ui_method.input}#input(l:options) endfunction function! linkvim#ui#select(container, ...) abort let l:options = extend( \ { \ 'prompt': 'Please choose item:', \ 'return': 'value', \ 'force_choice': v:false, \ 'auto_select': v:true, \ }, \ a:0 > 0 ? a:1 : {}) let l:list = type(a:container) == v:t_dict \ ? values(a:container) \ : a:container let [l:index, l:value] = empty(l:list) \ ? [-1, ''] \ : (len(l:list) == 1 && l:options.auto_select \ ? [0, l:list[0]] \ : linkvim#ui#{g:linkvim_ui_method.select}#select(l:options, l:list)) if l:options.return ==# 'value' return l:value endif if type(a:container) == v:t_dict return l:index >= 0 ? keys(a:container)[l:index] : '' endif return l:index endfunction function! linkvim#ui#get_number(max, digits, force_choice, do_echo) abort let l:choice = '' if a:do_echo echo '> ' endif while len(l:choice) < a:digits if len(l:choice) > 0 && (l:choice . '0') > a:max return l:choice - 1 endif let l:input = nr2char(getchar()) if !a:force_choice && index(["\", "\", 'x'], l:input) >= 0 if a:do_echo echon 'aborted!' endif return -2 endif if len(l:choice) > 0 && l:input ==# "\" return l:choice - 1 endif if l:input !~# '\d' | continue | endif if (l:choice . l:input) > 0 let l:choice .= l:input if a:do_echo echon l:input endif endif endwhile return l:choice - 1 endfunction function! s:echo_string(msg, opts) abort let l:msg = repeat(' ', a:opts.indent) . a:msg echo l:msg endfunction function! s:echo_formatted(parts, opts) abort echo repeat(' ', a:opts.indent) try for l:part in a:parts if type(l:part) == v:t_string echohl None echon l:part else execute 'echohl' l:part[0] echon l:part[1] endif unlet l:part endfor finally echohl None endtry endfunction function! s:echo_dict(dict, opts) abort for [l:key, l:val] in items(a:dict) call s:echo_formatted([['Label', l:key . ': '], l:val], a:opts) endfor endfunction link.vim-2.0.0/autoload/linkvim/url.vim000066400000000000000000000016341511406577400200560ustar00rootroot00000000000000function! linkvim#url#follow(url_string, ...) abort let l:url = linkvim#url#resolve(a:url_string) if empty(l:url) | return | endif let l:edit_cmd = a:0 > 0 ? a:1 : 'edit' try call linkvim#url#handlers#{l:url.scheme}(l:url, l:edit_cmd) catch /E117/ call linkvim#url#handlers#generic(l:url) endtry endfunction function! linkvim#url#resolve(url_string, ...) abort let l:parts = matchlist(a:url_string, '\v%((\w+):)?(.*)') let l:url = { \ 'url': a:url_string, \ 'scheme': tolower(l:parts[1]), \ 'stripped': l:parts[2], \ 'origin': a:0 > 0 ? a:1 : expand('%:p'), \} " The wiki scheme is default if no other scheme is applied if empty(l:url.scheme) let l:url.scheme = 'wiki' let l:url.url = l:url.scheme . ':' . l:url.url endif try let l:url = linkvim#url#resolvers#{l:url.scheme}(l:url) catch /E117/ endtry return l:url endfunction link.vim-2.0.0/autoload/linkvim/url/000077500000000000000000000000001511406577400173355ustar00rootroot00000000000000link.vim-2.0.0/autoload/linkvim/url/handlers.vim000066400000000000000000000110141511406577400216470ustar00rootroot00000000000000function! linkvim#url#handlers#adoc(resolved, edit_cmd) abort let l:do_edit = resolve(a:resolved.path) !=# resolve(expand('%:p')) call linkvim#url#utils#go_to_file( \ a:resolved.path, a:edit_cmd, a:resolved.stripped, l:do_edit) call linkvim#url#utils#go_to_anchor_adoc(a:resolved.anchor, l:do_edit) call linkvim#url#utils#focus(l:do_edit) if exists('#User#WikiLinkFollowed') doautocmd User WikiLinkFollowed endif endfunction function! linkvim#url#handlers#doi(resolved, ...) abort let a:resolved.url = 'http://dx.doi.org/' .. a:resolved.stripped let a:resolved.scheme = 'http' let a:resolved.stripped = strpart(a:resolved.url, 5) return linkvim#url#handlers#generic(a:resolved) endfunction function! linkvim#url#handlers#file(resolved, ...) abort let l:cmd = get(g:linkvim_viewer, a:resolved.ext, g:linkvim_viewer._) if l:cmd ==# ':edit' silent execute 'edit' fnameescape(a:resolved.path) else call linkvim#jobs#run( \ l:cmd .. ' ' .. linkvim#u#shellescape(a:resolved.path) .. '&') endif endfunction function! linkvim#url#handlers#generic(resolved, ...) abort " Print URL, to make testing possible. if exists('g:vader_file') && !exists('$TEST_OPEN_IN_BROWSER') " MODIFIED echom a:resolved.url return endif try if get(g:, 'loaded_netrwPlugin', '') >=? 'v182' call netrw#BrowseX(a:resolved.url) else call netrw#BrowseX(a:resolved.url, 0) endif catch call linkvim#jobs#run( \ g:linkvim_viewer._ .. ' ' .. linkvim#u#shellescape(a:resolved.url) .. '&') endtry endfunction function! linkvim#url#handlers#man(resolved, ...) abort execute 'edit' fnameescape(a:resolved.path) endfunction function! linkvim#url#handlers#refbad(resolved, ...) abort normal! m' call cursor(a:resolved.lnum, 1) endfunction function! linkvim#url#handlers#vimdoc(resolved, edit_cmd) abort try if a:edit_cmd ==# 'edit' execute 'help' a:resolved.stripped execute winnr('#') 'hide' elseif a:edit_cmd ==# 'tabedit' execute 'tab help' a:resolved.stripped elseif a:edit_cmd =~# '^vert' execute 'vert help' a:resolved.stripped else execute 'help' a:resolved.stripped endif catch call linkvim#log#warn("can't find vimdoc page: " .. a:resolved.stripped) endtry endfunction function! linkvim#url#handlers#wiki(resolved, edit_cmd) abort let l:do_edit = resolve(a:resolved.path) !=# resolve(expand('%:p')) call linkvim#url#utils#go_to_file( \ a:resolved.path, a:edit_cmd, a:resolved.stripped, l:do_edit) call linkvim#url#utils#go_to_anchor_wiki(a:resolved.anchor, l:do_edit) call linkvim#url#utils#focus(l:do_edit) if exists('#User#WikiLinkFollowed') doautocmd User WikiLinkFollowed endif endfunction function! linkvim#url#handlers#md(resolved, edit_cmd) abort return linkvim#url#handlers#wiki(a:resolved, a:edit_cmd) endfunction function! linkvim#url#handlers#zot(resolved, ...) abort let l:files = linkvim#zotero#search(a:resolved.stripped) if len(l:files) > 0 let l:choice = linkvim#ui#select( \ ['Follow in Zotero: ' .. a:resolved.stripped] \ + map(copy(l:files), 's:menu_open_pdf(v:val)'), \ { \ 'prompt': 'Please select desired action:', \ 'return': 'index', \ }) if l:choice < 0 return linkvim#log#warn('Aborted') endif if l:choice > 0 let l:file = l:files[l:choice-1] let l:viewer = get(g:linkvim_viewer, 'pdf', g:linkvim_viewer._) call linkvim#jobs#start(l:viewer .. ' ' .. linkvim#u#shellescape(l:file)) return endif endif " Fall back to zotero://select/items/bbt:citekey call linkvim#jobs#run(printf('%s zotero://select/items/bbt:%s &', \ g:linkvim_viewer['_'], a:resolved.stripped)) endfunction function! linkvim#url#handlers#bdsk(resolved, ...) abort let l:encoded_url = stridx(a:resolved.stripped, '%') < 0 \ ? linkvim#url#utils#url_encode(a:resolved.stripped) \ : a:resolved.stripped let a:resolved.url = 'x-bdsk://' .. l:encoded_url let a:resolved.scheme = 'x-bdsk' return linkvim#url#handlers#generic(a:resolved) endfunction function! s:menu_open_pdf(val) abort let l:filename = fnamemodify(a:val, ':t') let l:strlen = strchars(l:filename) let l:width = winwidth(0) - 14 if l:strlen > l:width let l:pre = strcharpart(l:filename, 0, l:width/2 - 3) let l:post = strcharpart(l:filename, l:strlen - l:width/2 + 3) let l:filename = l:pre .. ' ... ' .. l:post endif return 'Open PDF: ' .. l:filename endfunction link.vim-2.0.0/autoload/linkvim/url/resolvers.vim000066400000000000000000000104141511406577400220760ustar00rootroot00000000000000 function! linkvim#url#resolvers#adoc(url) abort let l:url = deepcopy(a:url) let l:parts = split(l:url.stripped, '#', 1) if len(l:parts) == 1 && l:parts[0] !~# '\.adoc$' let l:url.path = '' let l:url.anchor = l:parts[0] else let l:root = empty(l:url.origin) \ ? linkvim#get_root() \ : fnamemodify(l:url.origin, ':p:h') let l:url.path = linkvim#paths#s(printf('%s/%s', l:root, l:parts[0])) let l:url.anchor = get(l:parts, 1, '') endif return l:url endfunction function! linkvim#url#resolvers#file(url) abort let l:url = deepcopy(a:url) let l:url.ext = fnamemodify(l:url.stripped, ':e') if l:url.stripped[0] ==# '/' let l:url.path = l:url.stripped elseif l:url.stripped =~# '^\~' let l:url.path = simplify(fnamemodify(l:url.stripped, ':p')) else let l:url.path = simplify( \ fnamemodify(l:url.origin, ':p:h') . '/' . l:url.stripped) endif return l:url endfunction function! linkvim#url#resolvers#journal(url) abort let l:matches = matchlist(a:url.stripped, '\v([^#]*)%(#(.*))?') let l:date = get(l:matches, 1, 'N/A') let l:anchor = get(l:matches, 2, '') let [l:node, l:_] = linkvim#journal#date_to_node(l:date) if empty(l:node) call linkvim#log#warn( \ 'Could not parse journal URL!', \ 'URL: ' . a:url.stripped, \ 'Date: ' . l:date, \ 'Anchor: ' . l:anchor, \) return {} endif let l:url = deepcopy(a:url) let l:url.scheme = 'wiki' let l:url.anchor = l:anchor if empty(g:wiki_journal.root) let l:url.stripped = printf('/%s/%s', g:wiki_journal.name, l:node) let l:url.url = 'wiki:' . l:url.stripped let l:url.path = \ linkvim#url#utils#resolve_path(l:url.stripped, l:url.origin) else let l:url.stripped = linkvim#paths#s(g:wiki_journal.root . '/' . l:node) let l:url.url = 'wiki:' . l:url.stripped let l:url.path = linkvim#url#utils#add_extension(l:url.stripped) endif return l:url endfunction function! linkvim#url#resolvers#man(url) abort let l:url = deepcopy(a:url) let l:url.path = 'man://' . matchstr(l:url.url, 'man:\(\/\/\)\?\zs[^ (]*') let l:section = matchstr(l:url.url, '-\zs\d$') if !empty(l:section) let l:url.path .= '(' . l:section . ')' endif return l:url endfunction function! linkvim#url#resolvers#reference(url, return_lnum = v:false) abort let l:id = a:url.stripped let l:lnum_target = searchpos('^\s*\[' . l:id . '\]: ', 'nW')[0] if a:return_lnum " MODIFIED return l:lnum_target endif if l:lnum_target == 0 if get(b:, 'resolve_silent', v:false) " MODIFIED unlet b:resolve_silent return {} endif call linkvim#log#warn( \ 'Could not locate reference ', \ ['ModeMsg', a:url.stripped] \) return {} endif let l:line = getline(l:lnum_target) let l:url_string = matchstr(l:line, g:linkvim#rx#url) if !empty(l:url_string) return linkvim#url#resolve(l:url_string) endif " The reference definition is found, but the URL was not trivially " recognized. Use a less strict regex and try again, but only accept wiki " schemed urls to existing files. let l:url_string = matchstr(l:line, '^\s*\[' . l:id . '\]: \s*\zs.*\ze\s*$') let l:url = linkvim#url#resolve(l:url_string) if l:url.scheme ==# 'wiki' && filereadable(l:url.path) return l:url endif " The url is not recognized, so we add a fallback handler that will take us " to the reference position. return extend(deepcopy(a:url), { \ 'scheme': 'refbad', \ 'lnum': l:lnum_target, \ 'original': a:url \}) endfunction function! linkvim#url#resolvers#wiki(url) abort let l:url = deepcopy(a:url) let l:url.anchor = linkvim#url#utils#extract_anchor(l:url.stripped) let l:path = split(l:url.stripped, '#', 1)[0] let l:url.path = linkvim#url#utils#resolve_path(l:path, l:url.origin) return l:url endfunction function! linkvim#url#resolvers#md(url) abort let l:url = deepcopy(a:url) let l:anchor = linkvim#url#utils#extract_anchor(l:url.stripped) let l:url.anchor = linkvim#url#utils#url_decode(l:anchor) let l:path = split(l:url.stripped, '#', 1)[0] let l:path = linkvim#url#utils#url_decode(l:path) let l:url.path = linkvim#url#utils#resolve_path(l:path, l:url.origin) return l:url endfunction link.vim-2.0.0/autoload/linkvim/url/utils.vim000066400000000000000000000111331511406577400212110ustar00rootroot00000000000000function! linkvim#url#utils#add_extension(filename) abort " Input: Filename with possibly missing file extension " Output: Filename with resolved extension " Collect extension candidates let l:extensions = linkvim#u#uniq_unsorted(g:linkvim_filetypes \ + (exists('b:wiki.extension') ? [b:wiki.extension] : [])) if index(l:extensions, fnamemodify(a:filename, ':e')) >= 0 return a:filename endif " Determine the proper extension (if necessary) for l:ext in l:extensions let l:newpath = a:filename . '.' . l:ext if filereadable(l:newpath) | return l:newpath | endif endfor " Fallback return a:filename . '.' . l:extensions[0] endfunction function! linkvim#url#utils#extract_anchor(stripped) abort let l:parts = split(a:stripped, '#', 1) return len(l:parts) > 1 \ ? substitute(join(l:parts[1:], '#'), '#$', '', '') \ : '' endfunction function! linkvim#url#utils#resolve_path(filename, origin) abort let l:filename = a:filename if l:filename =~# '/$' let l:filename .= get(get(b:, 'wiki', {}), 'index_name', '') endif " Link within same page has empty filename if empty(l:filename) | return a:origin | endif let l:path = l:filename[0] ==# '/' \ ? linkvim#get_root() . l:filename \ : (empty(a:origin) \ ? linkvim#get_root() \ : fnamemodify(a:origin, ':p:h')) . '/' . l:filename let l:path = linkvim#paths#s(l:path) return linkvim#url#utils#add_extension(l:path) endfunction function! linkvim#url#utils#go_to_file(path, edit_cmd, url_stripped, do_edit) abort if !a:do_edit | return | endif " Check if dir exists let l:dir = fnamemodify(a:path, ':p:h') if !isdirectory(l:dir) call mkdir(l:dir, 'p') endif try execute a:edit_cmd fnameescape(a:path) catch /E325:/ endtry let b:wiki = get(b:, 'wiki', {}) if !filereadable(a:path) redraw! call linkvim#log#info('Opened new page "' . a:url_stripped . '"') end endfunction function! linkvim#url#utils#go_to_anchor_adoc(anchor, do_edit) abort if empty(a:anchor) | return | endif " Manually add position to jumplist (necessary if we're in same file) if !a:do_edit normal! m' endif let l:match = matchlist(a:anchor, '\(.*\)[- _]\(\d\+\)$') if empty(l:match) let l:re = a:anchor let l:num = 1 else let l:re = l:match[1] let l:num = l:match[2] endif let l:re = substitute(l:re, '^_', '', '') let l:re = substitute(l:re, '[- _]', '[- _]', 'g') let l:re = '\c^=\{1,6}\s*' . l:re let l:old_pos = getpos('.') call cursor(1, 1) for l:_ in range(l:num) if !search(l:re, l:_ == 0 ? 'Wc' : 'W') call setpos('.', l:old_pos) break endif let l:old_pos = getpos('.') endfor endfunction function! linkvim#url#utils#go_to_anchor_wiki(anchor, do_edit) abort if empty(a:anchor) | return | endif " Manually add position to jumplist (necessary if we're in same file) if !a:do_edit normal! m' endif let l:old_pos = getcurpos('.') call cursor(1, 1) for l:part in split(a:anchor, '#', 0) let l:part = substitute(l:part, '[- ]', '[- ]', 'g') let l:header = '^\c#\{1,6}\s*' . l:part . '\s*$' let l:headerid = \ '^\C#\{1,6}\s*\w.*\s{#' \ .. substitute(l:part, ' ', '-', 'g') \ .. '}\s*$' let l:bold = linkvim#rx#surrounded(l:part, '*') if !(search(l:header, 'Wc') \ || search(l:bold, 'Wc') \ || search(l:headerid, 'Wc')) call setpos('.', l:old_pos) break endif let l:old_pos = getcurpos('.') endfor endfunction function! linkvim#url#utils#focus(do_edit) abort if !&foldenable | return | endif if a:do_edit normal! zx else normal! zv endif endfunction function! linkvim#url#utils#url_encode(str) abort " This code is based on Tip Pope's vim-unimpaired: " https://github.com/tpope/vim-unimpaired return substitute( \ a:str, \ '[^A-Za-z0-9_.~-]', \ '\="%".printf("%02X",char2nr(submatch(0)))', \ 'g' \) endfunction function! linkvim#url#utils#url_decode(str) abort " This code is based on Tip Pope's vim-unimpaired: " https://github.com/tpope/vim-unimpaired let l:str = \ substitute( \ substitute( \ substitute(a:str, '%0[Aa]\n$', '%0A', ''), \ '%0[Aa]', '\n', 'g'), \ '+', ' ', 'g') return substitute(l:str, '%\(\x\x\)', '\=nr2char("0x".submatch(1))', 'g') endfunction function! linkvim#url#utils#url_encode_specific(str, chars) abort return substitute( \ a:str, \ '[' .. a:chars .. ']', \ '\="%"..printf("%02X", char2nr(submatch(0)))', \ 'g' \) endfunction link.vim-2.0.0/autoload/linkvim/x/000077500000000000000000000000001511406577400170025ustar00rootroot00000000000000link.vim-2.0.0/autoload/linkvim/x/body.vim000066400000000000000000000044001511406577400204520ustar00rootroot00000000000000" Determine which link to use. If there are multiple links on one line, pick the " first link that is positioned behind or on the cursor. function! linkvim#x#body#pick_closest_link(links, col_nr) abort if len(a:links) == 1 return a:links[0] endif for l:link in a:links if a:col_nr < l:link.pos_end[1] break endif endfor return l:link endfunction " Replace link in the body with a reference-style link. This can also renumber " an existing reference-style link. Return number of characters the line was " shortened (positive number) or lengthened (negative number) by. function! linkvim#x#body#replace_body_link(lnum, link, new_id, shortened_chars) abort let l:col_start = a:link.pos_start[1] - a:shortened_chars let l:col_end = a:link.pos_end[1] - a:shortened_chars let l:is_start_of_line = l:col_start == 1 let l:cont = getline(a:lnum) let l:prefix = l:is_start_of_line ? '' : l:cont[0 : l:col_start - 2] let l:suffix = l:cont[l:col_end - 1 : -1] let l:new_cont = l:prefix if len(a:link.text) >= 1 if a:link.type ==# 'md_fig' let l:new_cont .= '!' " Add `!` for images endif let l:new_cont .= '[' .. a:link.text .. ']' " Add `[foo]` endif let l:new_cont .= '[' .. a:new_id .. ']' " Add `[3]` let l:new_cont .= l:suffix call setline(a:lnum, l:new_cont) let l:len_diff = len(l:cont) - len(l:new_cont) return l:len_diff endfunction " Return whether line should be skipped because it is a blockquote. function! linkvim#x#body#skip_blockquote(line_content) abort if a:line_content !~# '^>' return v:false endif if exists('b:link_include_blockquotes') return !b:link_include_blockquotes endif if exists('g:link_include_blockquotes') return !g:link_include_blockquotes endif return v:true endfunction " Return whether line should be skipped. It can be skipped because of a custom " pattern or because it matches the `commentstring`. function! linkvim#x#body#skip_line(line_content) abort " Use a custom pattern if exists('b:link_skip_line') let l:regex = b:link_skip_line " Use the `commentstring` as the default else let l:regex = '\V\^' .. substitute( escape(&commentstring, '\'), '%s', '\\.\\*', 'g' ) .. '\$' endif return match( a:line_content, l:regex ) >= 0 endfunction link.vim-2.0.0/autoload/linkvim/x/convert.vim000066400000000000000000000136761511406577400212140ustar00rootroot00000000000000" Convert inline links to reference links within a range. " Type : `multiple` or `single` (indicates how many links to convert) " Mode : `normal` or `insert` function! linkvim#x#convert#convert(type = 'multiple', mode = 'normal') abort range let l:init_state = linkvim#x#lifecycle#initialize() call s:removal_warning() " TODO: Remove in future version " Use cursor position before range function moves cursor to first line of " range: https://vi.stackexchange.com/questions/6036/ if exists('b:init_view') let l:init_state.view = b:init_view unlet b:init_view endif let l:ref_target_links = linkvim#x#u#get_links('ref_target') let l:label_info = linkvim#x#label#get_info(l:ref_target_links) let l:first_label_lnum = l:label_info.first.lnum let l:is_ref_section_present = l:first_label_lnum != -1 let l:last_label_lnum = l:label_info.last.lnum let l:last_label_idx = l:label_info.last.id let l:heading_text = linkvim#x#heading#get_text() let l:heading_is_empty = linkvim#x#heading#is_empty(l:heading_text) let l:heading_is_needed = linkvim#x#heading#is_needed(l:heading_is_empty, l:heading_text) " Reference section present if l:is_ref_section_present let l:divider_lnum = l:first_label_lnum - 1 let l:new_label_idx = l:last_label_idx + 1 " No reference section present else call linkvim#x#u#move_cursor_to('end') call linkvim#x#reference#position_section() let l:divider_lnum = line('.') let l:last_label_lnum = line('.') let l:new_label_idx = linkvim#x#label#get_start_index() endif let l:allowed_types = ['url', 'md', 'md_fig'] let l:links = linkvim#x#u#get_links(l:allowed_types, a:firstline, a:lastline) if s:convert_urls_only() let l:links = filter(deepcopy(l:links), {_,link -> s:is_in(link.scheme, g:linkvim#protocols) }) endif if empty(l:links) call linkvim#log#warn('Detected no links that can be converted') call linkvim#x#lifecycle#finalize(l:init_state) return endif " When converting a single link, limit list of links to one link if a:type ==# 'single' let l:links = [ linkvim#x#body#pick_closest_link(l:links, l:init_state.col) ] endif let l:loop_state = { \ 'prev_lnum': 0, \ 'line_shortened_chars': 0, \ 'conversion_counter': 0, \ } for l:link in l:links let l:lnum = l:link.pos_start[0] let l:line_cont = getline(l:lnum) if linkvim#x#body#skip_blockquote(l:line_cont) | continue | endif if linkvim#x#body#skip_line(l:line_cont) | continue | endif " Handle multiple links on the same line if l:lnum != l:loop_state.prev_lnum let l:loop_state.line_shortened_chars = 0 endif " In case of an empty heading, add a blank line if l:heading_is_empty && !l:is_ref_section_present call append( line('.'), '' ) let l:last_label_lnum += 1 let l:is_ref_section_present = v:true endif " Add a (non-empty) heading if l:heading_is_needed let l:last_label_lnum += linkvim#x#heading#add(l:heading_text, l:divider_lnum) let l:heading_is_needed = v:false endif " Check if the same link is already present in the reference section let l:matches_in_ref_section = filter(deepcopy(l:ref_target_links), {_, v -> v.url ==# l:link.url_raw }) let l:already_in_ref_section = len(l:matches_in_ref_section) > 0 let l:id = l:already_in_ref_section ? l:matches_in_ref_section[0].text : l:new_label_idx let l:loop_state.line_shortened_chars += linkvim#x#body#replace_body_link( \ l:lnum, \ l:link, \ l:id, \ l:loop_state.line_shortened_chars) let l:loop_state.conversion_counter += 1 let l:loop_state.prev_lnum = l:lnum " Avoid adding duplicate links to reference section if l:already_in_ref_section continue endif call add(l:ref_target_links, { 'url': l:link.url_raw, 'text': l:new_label_idx }) call linkvim#x#reference#add( l:last_label_lnum, l:new_label_idx, l:link.url_raw) let l:last_label_lnum += 1 let l:new_label_idx += 1 endfor call linkvim#x#lifecycle#finalize(l:init_state) call s:display_conversion_count(a:type, l:loop_state.conversion_counter) call s:move_cursor_to_link_end(a:type, a:mode, l:links[0], l:init_state.lnum, l:init_state.line_len) endfunction " Display how many links were converted. function! s:display_conversion_count(type, counter) abort if a:type ==# 'single' return endif let l:msg = a:counter == 1 ? ' link was' : ' links were' call linkvim#log#info(a:counter .. l:msg .. ' converted') endfunction " Move cursor when called from Insert mode, so user can continue typing after " the converted link. function! s:move_cursor_to_link_end(type, mode, link, lnum, init_line_len) abort if a:type !=# 'single' || a:mode !=# 'insert' return endif if ! s:is_in(a:link.type, ['md', 'url']) return endif let l:is_last_char = a:link.pos_end[1] == a:init_line_len + 1 " Move to end of reference link: first to start, then to 1st/2nd `]` call cursor(a:lnum, a:link.pos_start[1]) if a:link.type ==# 'md' keepjumps normal! 2f] elseif a:link.type ==# 'url' keepjumps normal! f] endif " Return to insert mode; link is at the very end of the line if l:is_last_char startinsert! " Return to insert mode; link is in the middle of the line else normal! l startinsert endif endfunction " Show warning for removed configuration options. function! s:removal_warning() abort if !exists('g:link_enabled_filetypes') return endif if exists('s:warned') && s:warned return endif let s:warned = v:true let l:msg = 'let g:link_enabled_filetypes has been removed. ' let l:msg .= 'Run ":help g:link_enabled_filetypes" for more information.' call linkvim#log#info(l:msg) endfunction " Return whether only URLs should be converted, and not links to internal files. function! s:convert_urls_only() abort return linkvim#x#u#setting_with_default('link_disable_internal_links', 0) endfunction let s:is_in = function('linkvim#x#u#is_in') link.vim-2.0.0/autoload/linkvim/x/heading.vim000066400000000000000000000027571511406577400211310ustar00rootroot00000000000000" Return heading text: buffer-local, global or default. function! linkvim#x#heading#get_text() abort let l:default = s:is_ft_markdown() \ ? g:linkvim#defaults['heading_markdown'] \ : g:linkvim#defaults['heading_other'] return linkvim#x#u#setting_with_default('link_heading', l:default) endfunction " Return whether heading is set to an empty string. function! linkvim#x#heading#is_empty(heading_text) abort return type(a:heading_text) == v:t_string && a:heading_text ==# '' endfunction " Return whether heading needs to be added. function! linkvim#x#heading#is_needed(is_empty, heading_text) abort if a:is_empty return v:false endif if type(a:heading_text) == v:t_list let l:pattern = '^' .. join(a:heading_text, '\_s*') .. '$' " Add newlines else let l:pattern = '^' .. a:heading_text .. '\s*$' endif let l:match_line_nr = search(l:pattern, 'nw') return l:match_line_nr == 0 endfunction " Add the specified heading text to the buffer. Return number of lines added. function! linkvim#x#heading#add(heading_text, lnum) abort if type(a:heading_text) == v:t_list let l:lines = a:heading_text else let l:lines = [ '', a:heading_text, '' ] " Blank line above and below heading endif call append( a:lnum , l:lines ) return len(l:lines) endfunction " Return whether filetype includes Markdown. This accounts for composite " filetypes such as `vimwiki.markdown.pandoc`. function! s:is_ft_markdown() abort return &filetype =~# 'markdown' endfunction link.vim-2.0.0/autoload/linkvim/x/jump.vim000066400000000000000000000027171511406577400205010ustar00rootroot00000000000000" Move the cursor between a reference link and its corresponding link reference " definition. function! linkvim#x#jump#jump() abort let l:link = linkvim#link#get() if empty(l:link) | return | endif " Move cursor from body to reference section if l:link.type ==# 'reference' let l:id = l:link.url_raw let l:url = { \ 'origin' : l:link.origin, \ 'scheme' : l:link.scheme, \ 'stripped' : l:link.url_raw, \ 'url' : l:link.url, \ } let l:lnum = linkvim#url#resolvers#reference(l:url, v:true) if l:lnum == 0 call linkvim#log#warn('Could not find matching label [' .. l:id .. '] in reference section') return endif let l:col = 5 + len(l:id) " Put cursor on first character of URL " Move cursor from reference section to text body elseif l:link.type ==# 'ref_target' let l:id = l:link.text let l:reference_links = linkvim#x#u#get_links('reference') let l:matches = filter(l:reference_links, {_, v -> v.url_raw ==# l:id}) if empty(l:matches) call linkvim#log#warn('Could not find matching label [' .. l:id .. '] in text body') return endif let l:lnum = l:matches[0].pos_start[0] let l:col = l:matches[0].pos_end[1] - 1 " Put cursor after closing `]` else call linkvim#log#warn('Can only jump between references') return endif " Like in `linkvim#url#handlers#refbad()` normal! m' call cursor(l:lnum, l:col) endfunction link.vim-2.0.0/autoload/linkvim/x/label.vim000066400000000000000000000017411511406577400206010ustar00rootroot00000000000000" Return the start index for the first label. By default, this is `0`, but the " user can set it to e.g. `1`. function! linkvim#x#label#get_start_index() abort return linkvim#x#u#setting_with_default( \ 'link_start_index', \ g:linkvim#defaults['start_index'] \ ) endfunction " Return line number and label index, for first and last label in reference " section. function! linkvim#x#label#get_info(...) abort let l:ref_target_links = a:0 == 0 ? linkvim#x#u#get_links('ref_target') : a:1 if empty(l:ref_target_links) return { \ 'first': { 'lnum': -1, 'id': -1 }, \ 'last': { 'lnum': -1, 'id': -1 }, \ } endif let l:first_link = l:ref_target_links[0] let l:last_link = l:ref_target_links[-1] return { \ 'first': { \ 'lnum': l:first_link.pos_start[0], \ 'id': str2nr(l:first_link.text), \ }, \ 'last': { \ 'lnum': l:last_link.pos_start[0], \ 'id': str2nr(l:last_link.text), \ }, \ } endfunction link.vim-2.0.0/autoload/linkvim/x/lifecycle.vim000066400000000000000000000022321511406577400214550ustar00rootroot00000000000000" Disable folding and return initial view and folding setting. function! linkvim#x#lifecycle#initialize() abort let l:fold_setting = &foldenable setlocal nofoldenable let l:view = winsaveview() let l:lnum = l:view['lnum'] let l:col = l:view['col'] + 1 let l:line_cont = getline(l:lnum) return { \ 'view': l:view, \ 'lnum': l:lnum, \ 'col': l:col, \ 'fold_setting': l:fold_setting, \ 'line_cont': l:line_cont, \ 'line_len': len(l:line_cont), \ } endfunction " Restore initial view and folding setting. function! linkvim#x#lifecycle#finalize(init_state) abort call winrestview(a:init_state.view) let &l:foldenable = a:init_state.fold_setting call s:vimwiki_ref_links_refresh() endfunction " Fix Vimwiki bug where newly created reference links don't work immediately. " See https://github.com/vimwiki/vimwiki/issues/1005 and " https://github.com/vimwiki/vimwiki/issues/1351 function! s:vimwiki_ref_links_refresh() abort if &filetype !~# 'vimwiki' return endif if !exists('*vimwiki#markdown_base#scan_reflinks') return endif call vimwiki#markdown_base#scan_reflinks() endfunction link.vim-2.0.0/autoload/linkvim/x/open.vim000066400000000000000000000005161511406577400204620ustar00rootroot00000000000000" Open an external link in the default browser. Open an internal link in the " editor. function! linkvim#x#open#open() abort let l:link = linkvim#link#get() if empty(l:link) || l:link.type ==# 'word' call linkvim#log#info('No link found under cursor') return endif call linkvim#link#follow() endfunction link.vim-2.0.0/autoload/linkvim/x/peek.vim000066400000000000000000000016351511406577400204500ustar00rootroot00000000000000" For a reference link within the document body, show a preview of the " corresponding link reference definition. function! linkvim#x#peek#peek() abort let l:link = linkvim#link#get() if empty(l:link) | return | endif if l:link.type !=# 'reference' call linkvim#log#warn('Can only peek reference links') return endif let l:url = { \ 'origin' : l:link.origin, \ 'scheme' : l:link.scheme, \ 'stripped' : l:link.url_raw, \ 'url' : l:link.url, \ } let b:resolve_silent = v:true let l:resolved = linkvim#url#resolvers#reference(l:url) if empty(l:resolved) call linkvim#log#warn('Could not locate reference') return endif if l:resolved.scheme ==# 'refbad' call linkvim#log#warn('Could not resolve link') return endif let l:fmt_url = linkvim#x#u#rm_wiki_prefix(l:resolved.url) call linkvim#log#info(l:fmt_url) endfunction link.vim-2.0.0/autoload/linkvim/x/reference.vim000066400000000000000000000014071511406577400214570ustar00rootroot00000000000000" Add a link reference definition to the reference section. function! linkvim#x#reference#add(lnum, id, url) abort let l:new_line_content = '[' .. a:id .. ']: ' .. a:url call append(a:lnum, l:new_line_content) endfunction " Position reference section, so it isn't at the bottom of the buffer. function! linkvim#x#reference#position_section() abort if !exists('b:link_heading_before') return endif " Move cursor to line matching pattern let l:match_line_nr = search(b:link_heading_before, 'bcWz') " Cannot find pattern if l:match_line_nr == 0 call linkvim#log#warn('Failed to detect pattern to position reference section: ' \ .. b:link_heading_before) return endif " Can find pattern: move 2 lines up keepjumps normal! 2k endfunction link.vim-2.0.0/autoload/linkvim/x/reformat.vim000066400000000000000000000100461511406577400213370ustar00rootroot00000000000000" Reformat reference links and reference section: renumber, merge, delete, mark " as broken. function! linkvim#x#reformat#reformat() abort let l:init_state = linkvim#x#lifecycle#initialize() let l:label_info = linkvim#x#label#get_info() let l:first_label_lnum = l:label_info.first.lnum let l:last_label_lnum = l:label_info.last.lnum let l:init_ref_len = l:last_label_lnum - l:first_label_lnum + 1 let l:missing_marker = linkvim#x#u#setting_with_default( \ 'link_missing_marker', g:linkvim#defaults.missing_marker) " No reference section present if l:first_label_lnum == -1 call linkvim#log#error('No reference section was found') call linkvim#x#lifecycle#finalize(l:init_state) return endif let l:ref_target_links = linkvim#x#u#get_links('ref_target') let l:includes_internal = len(filter(l:ref_target_links, {_, v -> v.scheme ==# ''})) > 0 if l:includes_internal call linkvim#log#warn('Internal links detected. Pay attention!') " TODO endif let l:index = linkvim#x#label#get_start_index() let l:reference_links = linkvim#x#u#get_links('reference') let l:valid_links = [] let l:state = { \ 'prev_lnum': 0, \ 'line_shortened_chars': 0, \ 'num_broken': 0, \ 'num_merged': 0, \ 'num_renumbered': 0, \ } for l:link in l:reference_links " Ignore non-numeric labels if l:link.url_raw !~# '^\d\+$' continue endif let l:lnum = l:link.pos_start[0] let l:line_cont = getline(l:lnum) if linkvim#x#body#skip_blockquote(l:line_cont) | continue | endif if linkvim#x#body#skip_line(l:line_cont) | continue | endif " Handle multiple links on the same line if l:lnum != l:state.prev_lnum let l:state.line_shortened_chars = 0 endif let l:state.prev_lnum = l:lnum let b:resolve_silent = v:true let l:resolved = l:link.resolve() " Mark link as broken if no corresponding label was found in reference " section, or if resolution failed (because file not found). if empty(l:resolved) || l:resolved.scheme ==# 'refbad' let l:state.line_shortened_chars += linkvim#x#body#replace_body_link( \ l:lnum, l:link,l:missing_marker, l:state.line_shortened_chars) let l:state.num_broken += 1 continue endif let l:resolved_url = linkvim#x#u#rm_wiki_prefix(l:resolved.url) " Merge label if exactly the same URL was already encountered before let l:url_matches = filter( deepcopy(l:valid_links), {_, v -> v.resolved ==# l:resolved_url} ) if !empty(l:url_matches) " Avoid merging if this has been merged before if l:link.url_raw ==# l:url_matches[0].id continue endif let l:state.line_shortened_chars += linkvim#x#body#replace_body_link( \ l:lnum, l:link, l:url_matches[0].id, l:state.line_shortened_chars) let l:state.num_merged += 1 continue endif " Renumber label if it differs from index: e.g. label says 5 while it's the 3rd link if l:link.url_raw !=# l:index let l:state.line_shortened_chars += linkvim#x#body#replace_body_link( \ l:lnum, l:link, l:index, l:state.line_shortened_chars) let l:state.num_renumbered += 1 endif call add(l:valid_links, { 'resolved': l:resolved_url, 'id': l:index }) let l:index += 1 endfor " Delete current reference section to black hole register silent execute 'normal! :' .. l:first_label_lnum .. ',' .. l:last_label_lnum \ .. "$ delete _ \" " Generate new reference section let l:lnum = l:first_label_lnum - 1 for l:link in l:valid_links call linkvim#x#reference#add( l:lnum, l:link.id, l:link.resolved ) let l:lnum += 1 endfor call linkvim#x#lifecycle#finalize(l:init_state) call linkvim#log#info('Links in text body - marked as broken: ' .. l:state.num_broken .. \ '; merged: ' .. l:state.num_merged .. \ '; renumbered: ' .. l:state.num_renumbered) let l:cur_ref_len = len(l:valid_links) let l:num_deleted = l:init_ref_len - l:cur_ref_len - l:state.num_merged call linkvim#log#info('Links in reference section - deleted: ' .. l:num_deleted) endfunction link.vim-2.0.0/autoload/linkvim/x/u.vim000066400000000000000000000041401511406577400177620ustar00rootroot00000000000000" Return value of variable from buffer or global scope, or default. function! linkvim#x#u#setting_with_default(var_name, default) abort return get(b:, a:var_name, get(g:, a:var_name, a:default)) endfunction " Move cursor to first character of first line or last char of last line function! linkvim#x#u#move_cursor_to(destination) abort if a:destination ==# 'start' let l:row = 1 let l:col = 1 elseif a:destination ==# 'end' let l:row = line('$') let l:col = col( [ l:row, '$' ] ) " Last char of last line endif call cursor(l:row, l:col) endfunction " Return links of given types from given range. " Parameters: " types: string or list of strings indicating link types to return; 'all' for " all types (default: 'all'); " start: starting line number (default: 1); " end: ending line number (default: last line). function! linkvim#x#u#get_links(types = 'all', start = 1, end = line('$')) abort let l:types = type(a:types) == v:t_string ? [a:types] : a:types let l:all_links = linkvim#link#get_all_from_range(a:start, a:end) " Filter out links of type `url` without an allowed scheme, to avoid e.g. " `foo:bar` from being recognized as a link. let l:links_allowed_schemes = filter( \ deepcopy(l:all_links), \ {_,link -> link.type !=# 'url' || s:is_in(link.scheme, g:linkvim#protocols) } ) " Filter out links inside inline code (single backticks in Markdown). let l:links_not_in_code = filter(deepcopy(l:links_allowed_schemes), \ {_,link -> !linkvim#u#is_code(link.pos_start[0], link.pos_start[1]) }) if l:types[0] ==# 'all' return l:links_not_in_code endif let l:links_allowed_types = filter(deepcopy(l:links_not_in_code), \ {_,link -> s:is_in(link.type, l:types) }) return l:links_allowed_types endfunction " Return whether value is in list of values. function! linkvim#x#u#is_in(value, list) abort return index(a:list, a:value) != -1 endfunction let s:is_in = function('linkvim#x#u#is_in') " Remove `wiki:` prefix from internal links. function! linkvim#x#u#rm_wiki_prefix(url) abort return substitute(a:url, '^wiki:', '', '') endfunction link.vim-2.0.0/doc/000077500000000000000000000000001511406577400140175ustar00rootroot00000000000000link.vim-2.0.0/doc/link.txt000066400000000000000000000416101511406577400155170ustar00rootroot00000000000000*link.txt* Convert inline links to reference links *link* *link.vim* > __ __ .__ __. __ ___ ____ ____ __ .___ ___. | | | | | \ | | | |/ / \ \ / / | | | \/ | | | | | | \| | | ' / \ \/ / | | | \ / | | | | | | . ` | | < \ / | | | |\/| | | `----.| | | |\ | | . \ __ \ / | | | | | | |_______||__| |__| \__| |__|\__\ (__) \__/ |__| |__| |__| < Version: 2.0.0 Author: qadzek License: MIT ============================================================================== CONTENTS *link-contents* 1. Introduction ......... |link-introduction| 2. Installation ......... |link-installation| 3. Usage ................ |link-usage| 4. Mappings ............. |link-mappings| 5. Configuration ........ |link-configuration| 6. Misc ................. |link-misc| 7. Limitations .......... |link-limitations| 8. Contributing ......... |link-contributing| 9. Changelog ............ |link-changelog| 10. Credits ............. |link-credits| ============================================================================== INTRODUCTION *link-introduction* Reference links allow for cleaner documents. Storing (long) URLs at the bottom of your document helps maintain the flow of the body of the text. However, managing reference links manually can be tedious. This plugin for Vim and Neovim helps converting and handling these links. Links in Markdown syntax and plaintext links (e.g. in emails, in text files etc.) are supported. The following link formats are fully supported: - Markdown external link: `[Vim](https://www.vim.org)` - plaintext external link: `https://neovim.io` The following link formats are supported in varying degrees: - Markdown internal link: `[My Recipes](recipes.md)` - Wiki internal link with description: `[[recipes.md|My Recipes]]` - Wiki internal link without description: `[[recipes.md]]` The main command will convert > # Notes [Vim](https://www.vim.org) and [Neovim](https://neovim.io) are text editors. into > # Notes [Vim][0] and [Neovim][1] are text editors. ## Links [0]: https://www.vim.org [1]: https://neovim.io < URLs are moved to a reference section. A heading is used to mark the divide between the document body and the reference section. It will be added automatically if needed and can be customized or disabled. Terminology ~ Markdown format Plaintext format - inline link: `[Vim](https://www.vim.org)` `Vim https://www.vim.org` - reference link: `[Vim][0]` `Vim [0]` - link text: `[Vim]` `none` - label: `[0]` `[0]` - link reference definition: `[0]: https://www.vim.org` `[0]: https://www.vim.org` - heading: `## Links` `Links:` - document body: part of buffer above heading, containing the main text - reference section: part of buffer below heading, containing link reference definitions For more information about the syntax Markdown uses for links, refer to the CommonMark Specification at https://spec.commonmark.org/0.31.2/#links ============================================================================== INSTALLATION *link-installation* Use your favorite plugin manager to install this plugin. vim-plug: `Plug 'qadzek/link.vim'` lazy.nvim: `{ "qadzek/link.vim" }` An example spec file is available in the repository for users of `lazy.nvim`. ============================================================================== USAGE *link-usage* The link.vim plugin exposes the following commands. All `:LinkConvert*` commands will add a heading below the document body if needed. *:LinkPrev* *:LinkNext* Move the cursor to the previous/next link. *:LinkConvertSingle* Convert one inline link on the current line of the document body to a reference link. If there are multiple links on the current line, pick the (first) link that is positioned on the cursor or behind the cursor. *:LinkConvertSingleInsert* Same as above; intended to be used with an Insert mode mapping. Return to Insert mode after conversion and position the cursor just outside the reference link. *:LinkConvertRange* Convert all inline links within a range of lines to reference links. Intended to be used: - with a Visual mode mapping, - after selecting lines in Visual mode `:'<,'>LinkConvertRange`, or - with an explicit range `:5,12 LinkConvertRange` *:LinkConvertAll* Convert all inline links in the document body to reference links. *:LinkOpen* Open an external link in the default browser. Open an internal link in the editor. *:LinkPeek* For a reference link within the document body, show a preview of the corresponding link reference definition. *:LinkJump* Move the cursor from a reference link within the document body to a corresponding link reference definition in the reference section, and the other way around. *:LinkShow* Show some info on link under the cursor. Useful for debugging. *:LinkReformat* Reformat reference links and reference section. This command is powerful; use it with care. It deletes the current reference section and reconstructs it. It performs the following actions: - Renumber links in document body and in reference section: > [Vim][1] is a text editor. [Neovim][0] is another one. [0]: https://neovim.io [1]: https://www.vim.org < is turned into > [Vim][0] is a text editor. [Neovim][1] is another one. [0]: https://www.vim.org [1]: https://neovim.io < - Merge links sharing the same URL: > Vim [0] is a text editor. Bram Moolenaar created Vim [1]. [0]: https://www.vim.org [1]: https://www.vim.org < is turned into > Vim [0] is a text editor. Bram Moolenaar created Vim [0]. [0]: https://www.vim.org < - Delete link reference definitions that are no longer needed: > [Vim][0] is a text editor. Neovim is another one. [0]: https://www.vim.org [1]: https://neovim.io < is turned into > [Vim][0] is a text editor. Neovim is another one. [0]: https://www.vim.org < - Mark missing links as '???': > Vim [0] is a text editor. Neovim [1] is another one. [0]: https://www.vim.org < is turned into > Vim [0] is a text editor. Neovim [???] is another one. [0]: https://www.vim.org < ============================================================================== MAPPINGS *link-mappings* No mappings are built-in to avoid conflicts with existing key bindings. *g:link_use_default_mappings* Enable the suggested key bindings (the same as mentioned below) by adding this line to your `vimrc`, before your plugin manager initializes: > let g:link_use_default_mappings = 1 < If you prefer to specify your own key bindings, ensure the variable mentioned above is not set (or set to `0`) and add the following to your `vimrc`: > nnoremap (LinkVim-Prev) nnoremap (LinkVim-Next) nnoremap j (LinkVim-Jump) nnoremap p (LinkVim-Peek) nnoremap o (LinkVim-Open) nnoremap r (LinkVim-Reformat) nnoremap c (LinkVim-ConvertSingle) inoremap c (LinkVim-ConvertSingleInsert) vnoremap c (LinkVim-ConvertRange) nnoremap a (LinkVim-ConvertAll) nnoremap s (LinkVim-Show) < To ensure that these key bindings are only applied to a particular filetype, add them to e.g. `~/.vim/ftplugin/markdown.vim` instead. Make sure to add the `` attribute. To apply these key bindings to multiple filetypes, you can add an |autocmd| to your `vimrc`: > augroup linkvim_key_bindings autocmd! autocmd Filetype markdown,vimwiki,mail,text :call LinkVimAddKeyBindings() augroup END function! LinkVimAddKeyBindings() nnoremap a (LinkVim-ConvertAll) ... endfunction < ============================================================================== CONFIGURATION *link-configuration* Most of the following configuration options exist as a local buffer variable (`b:`) or as a global variable (`g:`). The buffer-local variables enjoy a higher priority. Global variables are specified in `vimrc`. Local buffer variables can be set in their corresponding file, e.g. for mail buffers in `~/.vim/ftplugin/mail.vim` They can also be set in `vimrc`, if they are wrapped in an |autocmd|: > augroup link_mail autocmd! autocmd Filetype mail let b:link_heading = 'My Links:' augroup END < ------------------------------------------------------------------------------ *b:link_heading* *g:link_heading* By default, the heading `## Links` (Markdown) or `Links:` (other filetypes) will be used to mark the divide between the document body and the reference section. Above and below this heading, a blank line will be inserted. To modify this heading: `let g:link_heading = '# My Resources'` The heading can be disabled by setting it to an empty string. This is especially useful when link reference definitions won't be visible in the rendered output, e.g., for `README.md` files displayed on GitHub: > augroup linkvim_readme autocmd! autocmd BufRead,BufNewFile README.md let b:link_heading = '' augroup END < A multi-line heading can be configured by providing a list of strings. Note that any blank lines need to be specified explicitly. `let b:link_heading = [ '', '-----', 'My Links:', '' ]` *b:link_start_index* *g:link_start_index* By default, the first converted link gets a label of 0. To change this: `let g:link_start_index = 1` *b:link_heading_before* By default, the heading is added to the last line. You can specify a pattern to which the cursor will be moved before the heading is added. This works even if the heading is disabled. This regular expression is matched starting from the bottom of the document. This allows to position the heading, and the entire reference section, elsewhere. E.g. for a `gitcommit` buffer, the following could be useful: `let b:link_heading_before = '^# Please enter the commit message'` *b:link_skip_line* By default, links in lines matching |commentstring| are not converted. This pattern can be modified. E.g. to skip lines starting with a plus: `let b:link_skip_line = '^+'` *b:link_include_blockquotes* *g:link_include_blockquotes* By default, links in blockquotes (lines starting with `>`) are not converted. To include them: `let b:link_include_blockquotes = 1` *b:link_disable_internal_links* *g:link_disable_internal_links* Popular knowledge base plugins, such as wiki.vim, obsidian.nvim, and Vimwiki, support links to internal wiki pages. To assist their users, by default a link to an internal file, e.g. `[strawberry cake](recipes.md)` will be converted too. To disable this feature and convert only URLs: `let g:link_disable_internal_links = 1` *b:link_missing_marker* *g:link_missing_marker* The `:LinkReformat` command marks reference links with a missing link reference definition. E.g. `[foo][3]` will be converted to `[foo][???]` if there is no corresponding `[3]: ...`. To change the default `???`: `let g:link_missing_marker = 'X'` ------------------------------------------------------------------------------ *g:link_enabled_filetypes* REMOVED This plugin now operates on all filetypes by default. Configure your plugin manager to limit the plugin to certain filetypes. vim-plug: `Plug 'qadzek/link.vim', { 'for': ['markdown', 'mail'] }` lazy.nvim: `{ "qadzek/link.vim", ft = { "markdown", "mail" } }` ============================================================================== MISC *link-misc* Consider using an alternative Markdown plugin for additional link-related features. For example, https://github.com/preservim/vim-markdown supports concealing, so `[Foo][3]` is displayed as just `Foo` when not in insert mode. Other options: - https://github.com/tpope/vim-markdown (this is the default) - https://github.com/SidOfc/mkdx/ - https://github.com/vim-pandoc/vim-pandoc-syntax - https://github.com/MeanderingProgrammer/render-markdown.nvim ============================================================================== LIMITATIONS *link-limitations* - Only numeric labels are supported. ============================================================================== CONTRIBUTING *link-contributing* Pull requests are welcome. The Vint linter, the Vader test framework and the Google Style Guide are being used. https://github.com/Vimjas/vint https://github.com/junegunn/vader.vim https://google.github.io/styleguide/vimscriptguide.xml https://google.github.io/styleguide/vimscriptfull.xml To analyze the code for issues: `vint .` To run the tests, refer to `test/README.md`. ============================================================================== CHANGELOG *link-changelog* 2.0.0 2025-11-20 BREAKING CHANGE - Rewrite based on `wiki.vim` - Support converting plaintext and Markdown links in the same file - Support internal links (#14) - Support multi-line headings (#21) - Avoid adding duplicate links to reference section - Support URLs containing special characters like `~` or `*` - Add commands `:LinkPrev`, `:LinkNext` and `:LinkShow` - Remove `g:link_enabled_filetypes` 1.4.0 2024-12-11 - Skip links in blockquotes (#16) 1.3.0 2024-11-28 - Support converting links to internal wiki pages (#14) 1.2.0 2024-11-07 - Support link conversion without using a heading 1.1.0 2024-11-04 - Support `` mappings 1.0.5 2024-09-11 - Fix trailing punctuation characters being seen as part of the URL (#12) 1.0.4 2024-09-10 - Fix issue with identical links on the same line - Fix unintended scrolling 1.0.3 2024-05-13 - Support special characters in URLs when opening them in browser 1.0.2 2024-05-08 - Convert filetype plugin to global plugin BREAKING CHANGE - `Links:` is default heading if filetype is not Markdown - Support `b:link_start_index` - Rename plugin BREAKING CHANGE 1.0.1 2024-05-06 - Remove :MdLinkDelete BREAKING CHANGE - Add :MdLinkReformat to renumber, merge and delete links 1.0.0 2024-05-04 - Remove pre- and post-processing commands BREAKING CHANGE - Add native support for plaintext links - Rename :MdLinkDeleteUnneededRefs BREAKING CHANGE 0.5.0 2024-04-17 - Allow positioning of reference section - Add pre- and post-processing of plaintext links - Allow lines to be skipped if pattern matches 0.4.1 2024-04-10 - Fix cursor position not getting restored (#9) 0.4.0 2024-04-08 - Allow buffer-local heading (#7) 0.3.1 2024-04-08 - Fix too lenient regex for inline links (#4) 0.3.0 2024-04-05 - Add :MdLinkConvertRange (#2) 0.2.0 2024-03-19 - Add :MdLinkOpen 0.1.0 2024-03-15 - Initial version ============================================================================== CREDITS *link-credits* Originally, `link.vim` was written from scratch. To implement more advanced features, in `v2` it has been rewritten based on the excellent `wiki.vim` plugin by Karl Yngve Lervåg (@lervag): https://github.com/lervag/wiki.vim Learn Vimscript the Hard Way by Steve Losh: https://learnvimscriptthehardway.stevelosh.com/ Contributors and their GitHub usernames: - Enno (@Konfekt) - @unclenull ============================================================================== vim:tw=78:ts=8:ft=help:norl: link.vim-2.0.0/doc/tags000066400000000000000000000033741511406577400147070ustar00rootroot00000000000000:LinkConvertAll link.txt /*:LinkConvertAll* :LinkConvertRange link.txt /*:LinkConvertRange* :LinkConvertSingle link.txt /*:LinkConvertSingle* :LinkConvertSingleInsert link.txt /*:LinkConvertSingleInsert* :LinkJump link.txt /*:LinkJump* :LinkNext link.txt /*:LinkNext* :LinkOpen link.txt /*:LinkOpen* :LinkPeek link.txt /*:LinkPeek* :LinkPrev link.txt /*:LinkPrev* :LinkReformat link.txt /*:LinkReformat* :LinkShow link.txt /*:LinkShow* b:link_disable_internal_links link.txt /*b:link_disable_internal_links* b:link_heading link.txt /*b:link_heading* b:link_heading_before link.txt /*b:link_heading_before* b:link_include_blockquotes link.txt /*b:link_include_blockquotes* b:link_missing_marker link.txt /*b:link_missing_marker* b:link_skip_line link.txt /*b:link_skip_line* b:link_start_index link.txt /*b:link_start_index* g:link_disable_internal_links link.txt /*g:link_disable_internal_links* g:link_enabled_filetypes link.txt /*g:link_enabled_filetypes* g:link_heading link.txt /*g:link_heading* g:link_include_blockquotes link.txt /*g:link_include_blockquotes* g:link_missing_marker link.txt /*g:link_missing_marker* g:link_start_index link.txt /*g:link_start_index* g:link_use_default_mappings link.txt /*g:link_use_default_mappings* link link.txt /*link* link-changelog link.txt /*link-changelog* link-configuration link.txt /*link-configuration* link-contents link.txt /*link-contents* link-contributing link.txt /*link-contributing* link-credits link.txt /*link-credits* link-installation link.txt /*link-installation* link-introduction link.txt /*link-introduction* link-limitations link.txt /*link-limitations* link-mappings link.txt /*link-mappings* link-misc link.txt /*link-misc* link-usage link.txt /*link-usage* link.txt link.txt /*link.txt* link.vim link.txt /*link.vim* link.vim-2.0.0/lazy_nvim_spec_example.lua000066400000000000000000000053311511406577400205140ustar00rootroot00000000000000-- Specify the file types where the plugin should be active. local ft = { "markdown", "text", "mail", "gitcommit" } return { { "qadzek/link.vim", desc = "Keep long URLs out of your way", enabled = true, ft = ft, config = function() -- Run `:help link-configuration` for more information on the following settings. vim.g.link_use_default_mappings = 0 vim.g.link_heading = "Links:" vim.g.link_start_index = 0 vim.g.link_include_blockquotes = 0 vim.g.link_disable_internal_links = 0 vim.g.link_missing_marker = "???" -- This `autocmd` ensures the following key bindings are only applied to the specified file types. vim.api.nvim_create_autocmd("Filetype", { pattern = ft, group = vim.api.nvim_create_augroup("LinkVim", { clear = true }), callback = function(ev) vim.keymap.set( "n", "c", "(LinkVim-ConvertSingle)", { buffer = ev.buf, desc = "Convert single link" } ) vim.keymap.set( "i", "c", "(LinkVim-ConvertSingleInsert)", { buffer = ev.buf, desc = "Convert single link from Insert mode" } ) vim.keymap.set( "v", "c", "(LinkVim-ConvertRange)", { buffer = ev.buf, desc = "Convert range of links" } ) vim.keymap.set( "n", "a", "(LinkVim-ConvertAll)", { buffer = ev.buf, desc = "Convert all links" } ) vim.keymap.set( "n", "j", "(LinkVim-Jump)", { buffer = ev.buf, desc = "Jump between links" } ) vim.keymap.set("n", "o", "(LinkVim-Open)", { buffer = ev.buf, desc = "Open link" }) vim.keymap.set("n", "p", "(LinkVim-Peek)", { buffer = ev.buf, desc = "Peek link" }) vim.keymap.set( "n", "r", "(LinkVim-Reformat)", { buffer = ev.buf, desc = "Reformat links" } ) vim.keymap.set( "n", "s", "(LinkVim-Show)", { buffer = ev.buf, desc = "Show debug info about link" } ) vim.keymap.set( "n", "", "(LinkVim-Prev)", { buffer = ev.buf, desc = "Move cursor to previous link" } ) vim.keymap.set("n", "", "(LinkVim-Next)", { buffer = ev.buf, desc = "Move cursor to next link" }) end, }) end, }, } link.vim-2.0.0/plugin/000077500000000000000000000000001511406577400145505ustar00rootroot00000000000000link.vim-2.0.0/plugin/link.vim000066400000000000000000000072371511406577400162330ustar00rootroot00000000000000if exists('g:loaded_linkvim') | finish | endif let g:loaded_linkvim = 1 let g:linkvim#defaults = { \ 'heading_markdown': '## Links', \ 'heading_other': 'Links:', \ 'start_index': 0, \ 'missing_marker': '???', \ } let g:linkvim#protocols = ['wiki', 'http', 'https', 'ftp', 'ftps', \ 'mailto', 'file', 'news', 'telnet', 'ssh', 'sftp' ] let g:linkvim_cache_root = '' let g:linkvim_link_default_schemes = {} let g:linkvim_filetypes = ['md', 'wiki'] if has('win32') || has('win32unix') let s:default_viewer = 'start' elseif has('mac') || has('ios') || substitute(system('uname'), '\n', '', '') =~# 'Darwin' let s:default_viewer = 'open' else let s:default_viewer = 'xdg-open' endif call linkvim#init#option('linkvim_viewer', { \ '_' : s:default_viewer, \ 'md' : ':edit', \ 'wiki' : ':edit', \}) call linkvim#init#option('linkvim_link_default_schemes', { \ 'wiki': { 'wiki': 'wiki', 'adoc': 'adoc' }, \ 'md': 'md', \ 'md_fig': 'file', \ 'org': 'wiki', \ 'adoc_xref_inline': 'adoc', \ 'adoc_xref_bracket': 'adoc', \ 'adoc_link': 'file', \ 'ref_target': '', \ 'date': 'journal', \ 'cite': 'zot', \}) " Initialize global commands command! -bar LinkShow call linkvim#link#show() command! -bar LinkPrev call linkvim#nav#prev_link() command! -bar LinkNext call linkvim#nav#next_link() command! -bar LinkJump call linkvim#x#jump#jump() command! -bar LinkPeek call linkvim#x#peek#peek() command! -bar LinkOpen call linkvim#x#open#open() command! -bar LinkReformat call linkvim#x#reformat#reformat() command! -bar LinkConvertSingle let b:init_view = winsaveview() | :call linkvim#x#convert#convert('single') command! -bar LinkConvertSingleInsert let b:init_view = winsaveview() | :call linkvim#x#convert#convert('single', 'insert') command! -bar -range LinkConvertRange let b:init_view = winsaveview() | :,call linkvim#x#convert#convert() command! -bar LinkConvertAll :% LinkConvertRange " Initialize mappings nnoremap (LinkVim-Show) :LinkShow nnoremap (LinkVim-Prev) :LinkPrev nnoremap (LinkVim-Next) :LinkNext nnoremap (LinkVim-Jump) :LinkJump nnoremap (LinkVim-Peek) :LinkPeek nnoremap (LinkVim-Open) :LinkOpen nnoremap (LinkVim-Reformat) :LinkReformat nnoremap (LinkVim-ConvertSingle) :LinkConvertSingle inoremap (LinkVim-ConvertSingleInsert) :LinkConvertSingleInsert vnoremap (LinkVim-ConvertRange) :LinkConvertRange nnoremap (LinkVim-ConvertAll) :LinkConvertAll " Apply default mappings, if user has set variable (before loading plugin) if get(g:, 'link_use_default_mappings', 0) nnoremap s (LinkVim-Show) nnoremap (LinkVim-Prev) nnoremap (LinkVim-Next) nnoremap j (LinkVim-Jump) nnoremap p (LinkVim-Peek) nnoremap o (LinkVim-Open) nnoremap r (LinkVim-Reformat) nnoremap c (LinkVim-ConvertSingle) inoremap c (LinkVim-ConvertSingleInsert) vnoremap c (LinkVim-ConvertRange) nnoremap a (LinkVim-ConvertAll) endif link.vim-2.0.0/test/000077500000000000000000000000001511406577400142315ustar00rootroot00000000000000link.vim-2.0.0/test/README.md000066400000000000000000000032071511406577400155120ustar00rootroot00000000000000# Tests ## Docker The best way to avoid interference from your local Vim/Neovim setup is to run the tests in a Docker container. The Makefile includes targets to simplify entering the following commands. Build the Docker image: ```sh docker image build -t link.vim . ``` Add e.g. `--build-arg BASE_IMAGE=debian:trixie-slim` to use Debian 13 (Trixie) as the base image instead of the current Ubuntu LTS. Run the container in these ways to lint the source code and execute the tests in both Vim and Neovim: ```sh docker container run -it --rm link.vim vint . docker container run -it --rm link.vim vim -c 'Vader! **/*.vader' docker container run -it --rm link.vim nvim -c 'Vader! **/*.vader' ``` You can also simply access the container: ```sh docker container run -it --rm link.vim ``` Then, run the tests from inside Vim/Neovim: `:Vader **/*.vader`. ## Non-Docker To run the tests on your workstation, use the script `./run_tests.py`. Add the `-h` flag to view its available options. An alternative is to start Vim or Neovim with the minimal configuration file: `nvim -Nu minimal.vimrc` and then run `:Vader **/*.vader`. ## Misc `link.vim` is based on `wiki.vim` `v0.11`, which requires at least Vim 9.1 or Neovim 0.10. The tests seem to pass on some older distributions, though: ```text Vim Neovim Ubuntu 22.04 (Jammy) 8.2 0.6.1 Debian 12 (Bookworm) 9.0 0.7.2 Ubuntu 24.04 (Noble) 9.1 0.9.5 Debian 13 (Trixie) 9.1 0.10.4 ``` See the [Vim][1] and [Neovim][2] Repology pages for details. [1]: https://repology.org/project/vim/versions [2]: https://repology.org/project/neovim/versions link.vim-2.0.0/test/common/000077500000000000000000000000001511406577400155215ustar00rootroot00000000000000link.vim-2.0.0/test/common/blockquotes.vader000066400000000000000000000060151511406577400211010ustar00rootroot00000000000000Before: unlet! b:link_include_blockquotes unlet! g:link_include_blockquotes unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line After: unlet! b:link_include_blockquotes unlet! g:link_include_blockquotes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Links in blockquotes are skipped by default, including in `markdown` buffers): lorem [magna](www.magna.com) > Blockquote: [lacus](http://lacus.org/lacus) [vitae](https://vitae.net/index.html) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: lorem [magna][0] > Blockquote: [lacus](http://lacus.org/lacus) [vitae][1] ## Links [0]: www.magna.com [1]: https://vitae.net/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail (Links in blockquotes are skipped by default, including in `mail` buffers): lorem http://www.magna.com > Blockquote: http://lacus.org/lacus https://vitae.net/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: lorem [0] > Blockquote: http://lacus.org/lacus [1] Links: [0]: http://www.magna.com [1]: https://vitae.net/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given gitcommit (Links in blockquotes are skipped by default, including in `gitcommit` buffers): lorem http://www.magna.com > Blockquote: http://lacus.org/lacus https://vitae.net/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect gitcommit: lorem [0] > Blockquote: http://lacus.org/lacus [1] Links: [0]: http://www.magna.com [1]: https://vitae.net/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Links in blockquotes can be included, by setting a buffer-local variable): lorem [magna](www.magna.com) > Blockquote: [lacus](http://lacus.org/lacus) [vitae](https://vitae.net/index.html) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let b:link_include_blockquotes = 1 LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: lorem [magna][0] > Blockquote: [lacus][1] [vitae][2] ## Links [0]: www.magna.com [1]: http://lacus.org/lacus [2]: https://vitae.net/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given text (Links in blockquotes can be included, by setting a global variable): lorem http://www.magna.com > Blockquote: http://lacus.org/lacus https://vitae.net/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let g:link_include_blockquotes = 1 LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect text: lorem [0] > Blockquote: [1] [2] Links: [0]: http://www.magna.com [1]: http://lacus.org/lacus [2]: https://vitae.net/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/common/heading_add.vader000066400000000000000000000066471511406577400207700ustar00rootroot00000000000000Before: unlet! b:link_heading_before After: unlet! b:link_heading_before ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Add heading to bottom of buffer): # A consectetuer nunc justo ac nisl. ## Nam vitae purus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere Execute: call linkvim#x#heading#add('## My Resources', '$') Expect markdown: # A consectetuer nunc justo ac nisl. ## Nam vitae purus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere ## My Resources ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail (Add heading to top of buffer): Hi Recipient, I hope this email finds you well. Best regards, Your Name -- Your Job Title Your Company Name Your Contact Information Execute: call linkvim#x#heading#add('Links:', 0) Expect mail: Links: Hi Recipient, I hope this email finds you well. Best regards, Your Name -- Your Job Title Your Company Name Your Contact Information ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given gitcommit (Add heading to middle of buffer): Git commit title Git commit body Body continued # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: foo.txt # Execute: call linkvim#x#heading#add('Links:', 5) Expect gitcommit: Git commit title Git commit body Body continued Links: # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: foo.txt # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail (Multi-line heading): Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere Execute: call linkvim#x#heading#add( [ '', '---', 'My Links:', '' ], '$') Expect markdown: Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere --- My Links: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail ('Multi'-line heading without blank lines): Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere Execute: call linkvim#x#heading#add( [ 'My Links:' ], '$') Expect markdown: Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere My Links: link.vim-2.0.0/test/common/heading_get_text.vader000066400000000000000000000027511511406577400220530ustar00rootroot00000000000000Before: unlet! g:link_heading unlet! b:link_heading After: unlet! g:link_heading unlet! b:link_heading ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Execute (Use default heading (Markdown)): let expected = '## Links' let actual = linkvim#x#heading#get_text() AssertEqual expected, actual ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Execute (Use default heading (mail)): let expected = 'Links:' let actual = linkvim#x#heading#get_text() AssertEqual expected, actual ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Modify global heading): let g:link_heading = '# My Resources' let expected = g:link_heading let actual = linkvim#x#heading#get_text() AssertEqual expected, actual ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Modify buffer-local heading): let b:link_heading = 'My Links:' let expected = b:link_heading let actual = linkvim#x#heading#get_text() AssertEqual expected, actual ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Modify global and buffer-local heading): let b:link_heading = 'My Links:' let g:link_heading = '# My Resources' let expected = b:link_heading let actual = linkvim#x#heading#get_text() AssertEqual expected, actual ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/common/label_get_info.vader000066400000000000000000000052611511406577400215010ustar00rootroot00000000000000Given markdown (Last line contains label; cursor at top/bottom): # A consectetuer nunc justo ac nisl. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere ## Links [2]: http://www.loremipsumdolorsitamet.com [3]: http://www.ipsumloremconsecteturadipiscing.com [4]: http://www.dolorsitametconsecteturadipiscingelit.com [5]: http://www.adipiscingelitipsumdolorsitamet.com Execute: call cursor(1, 1) let actual = linkvim#x#label#get_info() AssertEqual 2, actual.first.id AssertEqual 8, actual.first.lnum AssertEqual 5, actual.last.id AssertEqual 11, actual.last.lnum call cursor('$', 99) let actual = linkvim#x#label#get_info() AssertEqual 2, actual.first.id AssertEqual 8, actual.first.lnum AssertEqual 5, actual.last.id AssertEqual 11, actual.last.lnum ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Last line does not contain label; cursor at top/bottom): # A consectetuer nunc justo ac nisl. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere ## Links [2]: http://www.loremipsumdolorsitamet.com [3]: http://www.ipsumloremconsecteturadipiscing.com [4]: http://www.dolorsitametconsecteturadipiscingelit.com [5]: http://www.adipiscingelitipsumdolorsitamet.com Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Execute: call cursor(1, 1) let actual = linkvim#x#label#get_info() AssertEqual 2, actual.first.id AssertEqual 8, actual.first.lnum AssertEqual 5, actual.last.id AssertEqual 11, actual.last.lnum call cursor('$', 99) let actual = linkvim#x#label#get_info() AssertEqual 2, actual.first.id AssertEqual 8, actual.first.lnum AssertEqual 5, actual.last.id AssertEqual 11, actual.last.lnum ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (No labels; cursor at top/bottom): # A consectetuer nunc justo ac nisl. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere Execute: call cursor(1, 1) let actual = linkvim#x#label#get_info() AssertEqual -1, actual.first.id AssertEqual -1, actual.first.lnum AssertEqual -1, actual.last.id AssertEqual -1, actual.last.lnum call cursor('$', 99) let actual = linkvim#x#label#get_info() AssertEqual -1, actual.first.id AssertEqual -1, actual.first.lnum AssertEqual -1, actual.last.id AssertEqual -1, actual.last.lnum ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/common/label_get_start_index.vader000066400000000000000000000024271511406577400230730ustar00rootroot00000000000000Before: unlet! g:link_start_index unlet! b:link_start_index After: unlet! g:link_start_index unlet! b:link_start_index ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Use default label start index): let expected = 0 let actual = linkvim#x#label#get_start_index() AssertEqual expected, actual ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Modify global label start index): let g:link_start_index = 100 let expected = g:link_start_index let actual = linkvim#x#label#get_start_index() AssertEqual expected, actual ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Modify buffer-local label start index): let b:link_start_index = 50 let expected = b:link_start_index let actual = linkvim#x#label#get_start_index() AssertEqual expected, actual ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Modify global and buffer-local label start index): let g:link_start_index = 100 let b:link_start_index = 10 let expected = b:link_start_index let actual = linkvim#x#label#get_start_index() AssertEqual expected, actual ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/common/reference_add.vader000066400000000000000000000017211511406577400213130ustar00rootroot00000000000000Given markdown (Add link reference definition): # A consectetuer nunc justo ac nisl. ## Nam vitae purus Cum sociis natoque [penatibus][0] et magnis dis parturient montes, nascetur ridiculus mus. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere ## Links [0]: http://ipsum.com -------------------------------------------------------------------------------- Execute: call linkvim#x#reference#add(11, '1', 'https://lorem.com/') Expect markdown: # A consectetuer nunc justo ac nisl. ## Nam vitae purus Cum sociis natoque [penatibus][0] et magnis dis parturient montes, nascetur ridiculus mus. Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere ## Links [0]: http://ipsum.com [1]: https://lorem.com/ -------------------------------------------------------------------------------- link.vim-2.0.0/test/markdown_ft/000077500000000000000000000000001511406577400165445ustar00rootroot00000000000000link.vim-2.0.0/test/markdown_ft/convert_all.vader000066400000000000000000000754201511406577400221070ustar00rootroot00000000000000Before: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line unlet! g:link_start_index After: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line unlet! g:link_start_index ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, lacus lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit magna, scelerisque vitae, varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut sem nunc, vestibulum nec, sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at pellentesque diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, fringilla ac, turpis. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. Execute (No links): LinkConvertAll Expect markdown: Sapien ac iaculis feugiat, lacus lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit magna, scelerisque vitae, varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut sem nunc, vestibulum nec, sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at pellentesque diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, fringilla ac, turpis. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. Execute (Multiple links, no heading): LinkConvertAll Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque [vitae][2], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][3] [nunc][4], vestibulum [nec][5], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][6] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][7] ac, [turpis][8]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: www.magna.com [2]: https://vitae.net/index.html [3]: www.sem.com [4]: ftp://nunc.com [5]: www.nec.com [6]: https://pellentesque.com [7]: www.fringilla.com [8]: http://turpis.net ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links Execute (Multiple links, heading present, no references yet): LinkConvertAll Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque [vitae][2], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][3] [nunc][4], vestibulum [nec][5], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][6] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][7] ac, [turpis][8]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: www.magna.com [2]: https://vitae.net/index.html [3]: www.sem.com [4]: ftp://nunc.com [5]: www.nec.com [6]: https://pellentesque.com [7]: www.fringilla.com [8]: http://turpis.net ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://pellentesque.com Execute (Multiple links, heading and references present): LinkConvertAll Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][2], scelerisque [vitae][3], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][4] [nunc][5], vestibulum [nec][6], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][7] ac, [turpis][8]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://pellentesque.com [2]: www.magna.com [3]: https://vitae.net/index.html [4]: www.sem.com [5]: ftp://nunc.com [6]: www.nec.com [7]: www.fringilla.com [8]: http://turpis.net ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://pellentesque.com Execute (Cursor should not move): call cursor(10, 5) LinkConvertAll let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 10 AssertEqual col_nr, 5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque > [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin > augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat. > Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. Execute (Skip some lines): let b:link_skip_line = '^>' LinkConvertAll Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque > [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin > augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat. > Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][2] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][3] ac, [turpis][4]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: www.magna.com [2]: https://pellentesque.com [3]: www.fringilla.com [4]: http://turpis.net ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ~~~~~~~~~~~~~ Execute (Change label start index): let g:link_start_index = 100 LinkConvertAll ~~~~~~~~~~~~~ Expect markdown: Sapien ac iaculis feugiat, [lacus][100] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][101], scelerisque [vitae][102], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][103] [nunc][104], vestibulum [nec][105], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][106] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][107] ac, [turpis][108]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [100]: http://lacus.org/lacus [101]: www.magna.com [102]: https://vitae.net/index.html [103]: www.sem.com [104]: ftp://nunc.com [105]: www.nec.com [106]: https://pellentesque.com [107]: www.fringilla.com [108]: http://turpis.net ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: foo [Vim](https://www.vim.org) bar [Vim](https://www.vim.org) Execute (Two identical links on the same line): LinkConvertAll Expect markdown: foo [Vim][0] bar [Vim][0] ## Links [0]: https://www.vim.org ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: foo [Vim](https://www.vim.org), bar baz [Neovim](https://neovim.io). qux Execute (URLs with trailing punctuation characters): LinkConvertAll Expect markdown: foo [Vim][0], bar baz [Neovim][1]. qux ## Links [0]: https://www.vim.org [1]: https://neovim.io ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. Execute (Empty heading, no reference section present): let b:link_heading = '' LinkConvertAll Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque [vitae][2], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][3] [nunc][4], vestibulum [nec][5], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][6] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][7] ac, [turpis][8]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. [0]: http://lacus.org/lacus [1]: www.magna.com [2]: https://vitae.net/index.html [3]: www.sem.com [4]: ftp://nunc.com [5]: www.nec.com [6]: https://pellentesque.com [7]: www.fringilla.com [8]: http://turpis.net ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. [0]: http://lacus.org/lacus [1]: https://pellentesque.com Execute (Empty heading, reference section present): let b:link_heading = '' LinkConvertAll Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][2], scelerisque [vitae][3], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][4] [nunc][5], vestibulum [nec][6], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][7] ac, [turpis][8]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. [0]: http://lacus.org/lacus [1]: https://pellentesque.com [2]: www.magna.com [3]: https://vitae.net/index.html [4]: www.sem.com [5]: ftp://nunc.com [6]: www.nec.com [7]: www.fringilla.com [8]: http://turpis.net ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Internal link to Markdown file): Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](foo.md) ac, [turpis](bar.md). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [1]: https://pellentesque.com -------------------------------------------------------------------------------- Execute: LinkConvertAll -------------------------------------------------------------------------------- Expect markdown: Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][2] ac, [turpis][3]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [1]: https://pellentesque.com [2]: foo.md [3]: bar.md = ============================================================================ Given markdown (Image link): Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, ![img](https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg) at ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, ![img][1] at ## Links [0]: http://lacus.org/lacus [1]: https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg = ============================================================================ Given markdown (URL is already present in reference section): Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][0] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](https://pellentesque.com) ac ## Links [0]: https://pellentesque.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][0] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][0] ac ## Links [0]: https://pellentesque.com = ============================================================================ Given markdown (URL is not yet present in reference section, but same URL is present multiple times in body): augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [nunc](http://nunc.com), vestibulum [nec](http://nunc.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][0] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](http://fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. dolor sit amet lacus [varius](http://nunc.com) fermentum. Morbi dolor enim, pulvinar eget, ## Links [0]: https://pellentesque.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [nunc][1], vestibulum [nec][1], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][0] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][2] ac, [turpis][3]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. dolor sit amet lacus [varius][1] fermentum. Morbi dolor enim, pulvinar eget, ## Links [0]: https://pellentesque.com [1]: http://nunc.com [2]: http://fringilla.com [3]: http://turpis.net ================================================================================ Given markdown (Multiple links, multi-line heading present): Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](http://fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. --- ## My Links [0]: http://lacus.org/lacus ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let b:link_heading = [ '', '---', '## My Links', '' ] LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. [vitae][1], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][2] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][3] ac, [turpis][4]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. --- ## My Links [0]: http://lacus.org/lacus [1]: https://vitae.net/index.html [2]: https://pellentesque.com [3]: http://fringilla.com [4]: http://turpis.net ================================================================================ Given markdown (Multiple links, multi-line heading not yet present): lorem, quis volutpat justo turpis ac mauris. [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](http://fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let b:link_heading = [ '', '---', '## My Links', '' ] LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: lorem, quis volutpat justo turpis ac mauris. [vitae][0], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][2] ac, [turpis][3]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. --- ## My Links [0]: https://vitae.net/index.html [1]: https://pellentesque.com [2]: http://fringilla.com [3]: http://turpis.net ================================================================================ Given markdown (Links within a fenced code block): lorem, quis volutpat justo turpis ac mauris. ```text [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu ``` dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](http://fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: lorem, quis volutpat justo turpis ac mauris. ```text [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu ``` dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][0] ac, [turpis][1]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://fringilla.com [1]: http://turpis.net ================================================================================ Given markdown (Links within inline code): lorem, quis volutpat justo turpis ac mauris. augue. Nullam arcu `[vitae](https://vitae.net/index.html)`, varius ut, aliquam vel, justo. Proin ac Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at `[pellentesque](https://pellentesque.com) diam metus` ut nulla. Vestibulum eu dolor sit amet lacus varius vestibulum [nec](http://nec.com), fermentum. `ac, [fringilla](http://fringilla.com)` ac, `[turpis](http://turpis.net)` Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis `https://vitae.net/index.html` magna feugiat. Deadlights jack lad schooner scallywag dance the hempen jig carouser broadside cable strike colors. Bring a spring upon her cable blow the `man down spanker Shiver me http://timbers.com account` lookout wherry doubloon chase. Belay yo-ho-ho keelhaul squiffy black spot yardarm spyglass sheet transom heave to. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: lorem, quis volutpat justo turpis ac mauris. augue. Nullam arcu `[vitae](https://vitae.net/index.html)`, varius ut, aliquam vel, justo. Proin ac Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at `[pellentesque](https://pellentesque.com) diam metus` ut nulla. Vestibulum eu dolor sit amet lacus varius vestibulum [nec][0], fermentum. `ac, [fringilla](http://fringilla.com)` ac, `[turpis](http://turpis.net)` Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis `https://vitae.net/index.html` magna feugiat. Deadlights jack lad schooner scallywag dance the hempen jig carouser broadside cable strike colors. Bring a spring upon her cable blow the `man down spanker Shiver me http://timbers.com account` lookout wherry doubloon chase. Belay yo-ho-ho keelhaul squiffy black spot yardarm spyglass sheet transom heave to. ## Links [0]: http://nec.com ================================================================================ Given markdown (Ensure : isn't recognized as a link): Deadlights jack lad schooner scallywag alpha:bravo hempen jig carouser broadside Belay yo-ho-ho foo:bar keelhaul squiffy Charlie:delta yardarm spyglass sheet transom heave to. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Deadlights jack lad schooner scallywag alpha:bravo hempen jig carouser broadside Belay yo-ho-ho foo:bar keelhaul squiffy Charlie:delta yardarm spyglass sheet transom heave to. ================================================================================ link.vim-2.0.0/test/markdown_ft/convert_range.vader000066400000000000000000000233531511406577400224310ustar00rootroot00000000000000Given markdown: Sapien ac iaculis feugiat, lacus lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit magna, scelerisque vitae, varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut sem nunc, vestibulum nec, sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at pellentesque diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, fringilla ac, turpis. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. Execute (No links): 3,11 LinkConvertRange Expect markdown: Sapien ac iaculis feugiat, lacus lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit magna, scelerisque vitae, varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut sem nunc, vestibulum nec, sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at pellentesque diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, fringilla ac, turpis. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. Execute (Multiple links, no heading): 3,11 LinkConvertRange Expect markdown: Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][0], scelerisque [vitae][1], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][2] [nunc][3], vestibulum [nec][4], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][5] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: www.magna.com [1]: https://vitae.net/index.html [2]: www.sem.com [3]: ftp://nunc.com [4]: www.nec.com [5]: https://pellentesque.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque](https://pellentesque.com) diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links Execute (Multiple links, heading present, no references yet): 3,11 LinkConvertRange Expect markdown: Sapien ac iaculis feugiat, [lacus](http://lacus.org/lacus) lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][0], scelerisque [vitae][1], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][2] [nunc][3], vestibulum [nec][4], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][5] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: www.magna.com [1]: https://vitae.net/index.html [2]: www.sem.com [3]: ftp://nunc.com [4]: www.nec.com [5]: https://pellentesque.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://pellentesque.com Execute (Multiple links, heading and references present): 3,11 LinkConvertRange Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][2], scelerisque [vitae][3], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][4] [nunc][5], vestibulum [nec][6], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://pellentesque.com [2]: www.magna.com [3]: https://vitae.net/index.html [4]: www.sem.com [5]: ftp://nunc.com [6]: www.nec.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem](www.sem.com) [nunc](ftp://nunc.com), vestibulum [nec](www.nec.com), sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla](www.fringilla.com) ac, [turpis](http://turpis.net). Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://pellentesque.com Execute (Range includes reference section): 7,19 LinkConvertRange Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna](www.magna.com), scelerisque [vitae](https://vitae.net/index.html), varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][2] [nunc][3], vestibulum [nec][4], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu vestibulum commodo, quam mauris interdum arcu, at [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][5] ac, [turpis][6]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://pellentesque.com [2]: www.sem.com [3]: ftp://nunc.com [4]: www.nec.com [5]: www.fringilla.com [6]: http://turpis.net ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/markdown_ft/convert_single.vader000066400000000000000000000057301511406577400226150ustar00rootroot00000000000000Given markdown: Cum sociis natoque penatibus et magnis dis parturient montes, Execute (No link): LinkConvertSingle Expect markdown: Cum sociis natoque penatibus et magnis dis parturient montes, ------------------------------------------------------------------- Given markdown: Cum sociis natoque [penatibus](http://www.loremipsum.com) et magnis dis parturient montes, Execute (Single link): LinkConvertSingle Expect markdown: Cum sociis natoque [penatibus][0] et magnis dis parturient montes, ## Links [0]: http://www.loremipsum.com ------------------------------------------------------------------- Given markdown: Cum sociis natoque [penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis parturient montes, Execute (Two links): LinkConvertSingle LinkConvertSingle Expect markdown: Cum sociis natoque [penatibus][0] et [magnis][1] dis parturient montes, ## Links [0]: http://www.loremipsum.com [1]: http://www.dolorsitamet.com ----------------------------------------------- Given markdown: [penatibus](http://www.loremipsum.com) et magnis dis parturient montes Execute (Link at start of line): LinkConvertSingle Expect markdown: [penatibus][0] et magnis dis parturient montes ## Links [0]: http://www.loremipsum.com ----------------------------------------------- Given markdown: Cum sociis natoque [penatibus](http://www.loremipsum.com) Execute (Link at end of line): LinkConvertSingle Expect markdown: Cum sociis natoque [penatibus][0] ## Links [0]: http://www.loremipsum.com ----------------------------------------------- Given markdown: [penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) Execute (Two links, one at start of line, one at end of line): LinkConvertSingle LinkConvertSingle Expect markdown: [penatibus][0] et [magnis][1] ## Links [0]: http://www.loremipsum.com [1]: http://www.dolorsitamet.com ----------------------------------------------- Given markdown: Cum sociis natoque [penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, Execute (Three links): LinkConvertSingle LinkConvertSingle LinkConvertSingle Expect markdown: Cum sociis natoque [penatibus][0] et [magnis][1] dis [parturient][2] montes, ## Links [0]: http://www.loremipsum.com [1]: http://www.dolorsitamet.com [2]: http://www.adipiscingelitipsum.com ----------------------------------------------- " NOTE the * character causes issues, so is not included here Given markdown: Cum sociis natoque [penatibus](http://www.lorem-ipsum.com/foo_bar.html?bar=baz+alpha$bravo!charlie'delta,echo%foxtrot) et magnis Execute (Link containing special characters): LinkConvertSingle Expect markdown: Cum sociis natoque [penatibus][0] et magnis ## Links [0]: http://www.lorem-ipsum.com/foo_bar.html?bar=baz+alpha$bravo!charlie'delta,echo%foxtrot ----------------------------------------------- link.vim-2.0.0/test/markdown_ft/convert_single_insert.vader000066400000000000000000000036271511406577400242040ustar00rootroot00000000000000~~~ Insert X to mark cursor position ~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Link at start of line): LinkConvertSingleInsert normal! iX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus][0]X et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ## Links [0]: http://www.loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Link at end of line): normal! $ LinkConvertSingleInsert " Use a instead of i because we are at the end of the line normal! aX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient][0]X ## Links [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor in middle of second link): normal! 2f)3b LinkConvertSingleInsert normal! iX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis][0]X dis [parturient](http://www.adipiscingelitipsum.com) montes, ## Links [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/markdown_ft/internal_links.vader000066400000000000000000000175151511406577400226140ustar00rootroot00000000000000Before: unlet! b:link_disable_internal_links unlet! g:link_disable_internal_links After: unlet! b:link_disable_internal_links unlet! g:link_disable_internal_links = 1 ============================================================================ Given markdown (Default settings): URL [foo](http://bar.com) Internal wiki page [alfa](bravo.md) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: URL [foo][0] Internal wiki page [alfa][1] ## Links [0]: http://bar.com [1]: bravo.md = 2 ============================================================================ Given markdown (Disabled globally): URL [foo](http://bar.com) Internal wiki page [alfa](bravo.md) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let g:link_disable_internal_links = 1 LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: URL [foo][0] Internal wiki page [alfa](bravo.md) ## Links [0]: http://bar.com = 3 ============================================================================ Given markdown (Disabled buffer-local): URL [foo](http://bar.com) Internal wiki page [alfa](bravo.md) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let b:link_disable_internal_links = 1 LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: URL [foo][0] Internal wiki page [alfa](bravo.md) ## Links [0]: http://bar.com = 4 ============================================================================ Given markdown (Enabled globally, disabled buffer-local): URL [foo](http://bar.com) Internal wiki page [alfa](bravo.md) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let g:link_disable_internal_links = 0 let b:link_disable_internal_links = 1 LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: URL [foo][0] Internal wiki page [alfa](bravo.md) ## Links [0]: http://bar.com = 5 ============================================================================ Given markdown (Disabled globally, enabled buffer-local): URL [foo](http://bar.com) Internal wiki page [alfa](bravo.md) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let g:link_disable_internal_links = 1 let b:link_disable_internal_links = 0 LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: URL [foo][0] Internal wiki page [alfa][1] ## Links [0]: http://bar.com [1]: bravo.md = 6 ============================================================================ Given markdown (Default (so enabled); list of URLs and internal wiki pages): A regular [URL](https://github.com). A URL without a protocol but including 'www' or [world wide web](www.google.com)! Not a Markdown extension but a Moldovan [domain](https://nic.md). A .wiki top-level [domain name](https://kodi.wiki/view/Main_Page). A link to an internal wiki page; in this case a regular [file](file.md). A file inside a [subdirectory](subdir/file.md). A file in a [parent](../file.md) directory. Just a [directory](subdir/), no filename. A filename containing [spaces](file with spaces.md). The same filename but this time [percent-encoded](file%20with%20spaces.md). A filename containing [Unicode](önskelistä.md) characters. An anchor, pointing to a heading inside a [file](file.md#heading). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: A regular [URL][0]. A URL without a protocol but including 'www' or [world wide web][1]! Not a Markdown extension but a Moldovan [domain][2]. A .wiki top-level [domain name][3]. A link to an internal wiki page; in this case a regular [file][4]. A file inside a [subdirectory][5]. A file in a [parent][6] directory. Just a [directory][7], no filename. A filename containing [spaces][8]. The same filename but this time [percent-encoded][9]. A filename containing [Unicode][10] characters. An anchor, pointing to a heading inside a [file][11]. ## Links [0]: https://github.com [1]: www.google.com [2]: https://nic.md [3]: https://kodi.wiki/view/Main_Page [4]: file.md [5]: subdir/file.md [6]: ../file.md [7]: subdir/ [8]: file with spaces.md [9]: file%20with%20spaces.md [10]: önskelistä.md [11]: file.md#heading = 7 ============================================================================ Given markdown (Disabled; list of URLs and internal wiki pages): A regular [URL](https://github.com). A URL without a protocol but including 'www' or [world wide web](www.google.com)! Not a Markdown extension but a Moldovan [domain](https://nic.md). A .wiki top-level [domain name](https://kodi.wiki/view/Main_Page). A link to an internal wiki page; in this case a regular [file](file.md). A file inside a [subdirectory](subdir/file.md). A file in a [parent](../file.md) directory. Just a [directory](subdir/), no filename. A filename containing [spaces](file with spaces.md). The same filename but this time [percent-encoded](file%20with%20spaces.md). A filename containing [Unicode](önskelistä.md) characters. An anchor, pointing to a heading inside a [file](file.md#heading). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let g:link_disable_internal_links = 1 LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: A regular [URL][0]. A URL without a protocol but including 'www' or [world wide web](www.google.com)! Not a Markdown extension but a Moldovan [domain][1]. A .wiki top-level [domain name][2]. A link to an internal wiki page; in this case a regular [file](file.md). A file inside a [subdirectory](subdir/file.md). A file in a [parent](../file.md) directory. Just a [directory](subdir/), no filename. A filename containing [spaces](file with spaces.md). The same filename but this time [percent-encoded](file%20with%20spaces.md). A filename containing [Unicode](önskelistä.md) characters. An anchor, pointing to a heading inside a [file](file.md#heading). ## Links [0]: https://github.com [1]: https://nic.md [2]: https://kodi.wiki/view/Main_Page = 8 ============================================================================ Given markdown (Similar to inline links; causes issues if internal links aren't disabled): A regular [URL](https://github.com). A regex like [a-zA-Z](\d+) could be interpreted as a Markdown inline link. Code snippets can resemble an inline link too: command! -buffer -range=% -bar TagLinks silent keeppatterns ,substitute#\v%(\[[^\]]+\]\(\s*)@https?://([^.]+)\S+#[\1](\0)#giep Yet another regular [URL](https://www.vim.org). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let g:link_disable_internal_links = 1 LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: A regular [URL][0]. A regex like [a-zA-Z](\d+) could be interpreted as a Markdown inline link. Code snippets can resemble an inline link too: command! -buffer -range=% -bar TagLinks silent keeppatterns ,substitute#\v%(\[[^\]]+\]\(\s*)@https?://([^.]+)\S+#[\1](\0)#giep Yet another regular [URL][1]. ## Links [0]: https://github.com [1]: https://www.vim.org ================================================================================ link.vim-2.0.0/test/markdown_ft/jump.vader000066400000000000000000000043041511406577400205430ustar00rootroot00000000000000Before: find **/lorem-converted.md normal! gg ============================================== Execute (): Log 'From document body to reference section' ============================================== Execute (Valid jump, from single reference link on line, [2]): call cursor(6, 12) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 23 AssertEqual col_nr, 6 Execute (Valid jump, from second reference link on line, [5]): call cursor(9, 15) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 26 AssertEqual col_nr, 6 Execute (Invalid jump, no reference link on line): call cursor(4, 20) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 4 AssertEqual col_nr, 20 Execute (Invalid jump, single reference link on line with no corresponding link reference definition, [9]): call cursor(16, 1) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 16 AssertEqual col_nr, 1 Execute (Jump to internal link, [11]): call cursor(17, 30) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 31 AssertEqual col_nr, 7 ============================================== Execute (): Log 'From reference section to document body' ============================================== Execute (Valid jump, to a line with a single link, [3]): call cursor(24, 1) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 7 AssertEqual col_nr, 10 Execute (Valid jump, to a line with multiple links, [6]): call cursor(27, 1) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 9 AssertEqual col_nr, 42 Execute (Invalid jump, no corresponding reference link, [10]): call cursor(30, 1) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 30 AssertEqual col_nr, 1 Execute (Jump from internal link, cursor on label, [11]): call cursor(31, 1) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 17 AssertEqual col_nr, 35 Execute (Jump from internal link, cursor on filename, [11]): call cursor(32, 7) LinkJump let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 17 AssertEqual col_nr, 62 link.vim-2.0.0/test/markdown_ft/open.vader000066400000000000000000000160401511406577400205310ustar00rootroot00000000000000Before: messages clear normal! gg ~ 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Regular URL): [ridiculus][0] mus. ## Links [0]: https://www.vim.org/ ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'https://www.vim.org/' AssertEqual exp, message ~ 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (URL containing percent-encoding): [ridiculus][0] mus. ## Links [0]: https://en.wikipedia.org/wiki/Giro_d%27Italia ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'https://en.wikipedia.org/wiki/Giro_d%27Italia' AssertEqual exp, message ~ 3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (URL containing percent-encoding and hash sign): [ridiculus][0] mus. ## Links [0]: https://en.wikipedia.org/wiki/Giro_d%27Italia#Defunct_classifications ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'https://en.wikipedia.org/wiki/Giro_d%27Italia#Defunct_classifications' AssertEqual exp, message ~ 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (URL containing question mark): [ridiculus][0] mus. ## Links [0]: https://www.mobileread.com/forums/showthread.php?p=1769412 ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'https://www.mobileread.com/forums/showthread.php?p=1769412' AssertEqual exp, message ~ 5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (URL containing question mark and ampersand): [ridiculus][0] mus. ## Links [0]: https://www.mobileread.com/forums/showpost.php?p=1769412&postcount=1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'https://www.mobileread.com/forums/showpost.php?p=1769412&postcount=1' AssertEqual exp, message ~ 6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (From reference section): # A consectetuer nunc justo ac nisl. ## Nam vitae purus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. ## Links [0]: http://www.loremipsumdolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: call cursor('$', 1) let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'http://www.loremipsumdolorsitamet.com' AssertEqual exp, message ~ 7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Line without link): Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'link.vim: No link found under cursor' AssertEqual exp, message ~ 8 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Invalid URL: no protocol): [natoque][0] penatibus et magnis dis parturient montes, nascetur ridiculus mus. ## Links [0]: loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let out = execute('LinkOpen') let messages = split(out, "\n") let exp = [] AssertEqual exp, messages ~ 9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Internal link to existing Markdown file): [ridiculus][0] mus. [0]: bar.md -------------------------------------------------------------------------------- Execute: silent !touch bar.md LinkOpen let filename = expand('%:t') AssertEqual 'bar.md', filename silent !rm bar.md ~ 10 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Internal link to non-existent Markdown file): [ridiculus][0] mus. [0]: foo.md -------------------------------------------------------------------------------- Execute: LinkOpen let filename = expand('%:t') AssertEqual '[Vader-workbench]', filename ~ 11 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (External Wiki link with description): [[https://www.vim.org|Vim's website]] et magnis dis parturient montes, nascetur ridiculus mus. -------------------------------------------------------------------------------- Execute: let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'https://www.vim.org' AssertEqual exp, message ~ 12 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (External Wiki link without description): [[https://www.vim.org]] et magnis dis parturient montes, nascetur ridiculus mus. -------------------------------------------------------------------------------- Execute: let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'https://www.vim.org' AssertEqual exp, message ~ 13 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Internal Wiki link with description, without extension to existing file): [[bar|My recipes]] mus. -------------------------------------------------------------------------------- Execute: silent !touch bar.md LinkOpen let filename = expand('%:t') AssertEqual 'bar.md', filename silent !rm bar.md ~ 14 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Internal Wiki link with description, with extension to existing file): [[bar.md|My recipes]] mus. -------------------------------------------------------------------------------- Execute: silent !touch bar.md LinkOpen let filename = expand('%:t') AssertEqual 'bar.md', filename silent !rm bar.md ~ 15 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Internal Wiki link with description, without extension to non-existent file): [[alpha|My recipes]] mus. -------------------------------------------------------------------------------- Execute: LinkOpen let filename = expand('%:t') AssertEqual 'alpha.md', filename ~ 16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Internal Wiki link without description, without extension to non-existent file): [[bravo]] mus. -------------------------------------------------------------------------------- Execute: LinkOpen let filename = expand('%:t') AssertEqual 'bravo.md', filename ~ 17 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Internal Wiki link without description, with extension to non-existent file): [[charlie.md]] mus. -------------------------------------------------------------------------------- Execute: LinkOpen let filename = expand('%:t') AssertEqual 'charlie.md', filename ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/markdown_ft/peek.vader000066400000000000000000000027311511406577400205160ustar00rootroot00000000000000Before: find **/lorem-converted.md normal! gg Execute (Valid peek, from single reference link on line, [2]): call cursor(6, 12) let expected = 'link.vim: http://www.magna.com' let out = execute('LinkPeek') let last_mes = split(out, "\n")[-1] AssertEqual expected, last_mes Execute (Valid peek, from multiple reference links on line, [5]): call cursor(9, 15) let expected = 'link.vim: http://nunc.com' let out = execute('LinkPeek') let last_mes = split(out, "\n")[-1] AssertEqual expected, last_mes Execute (Invalid peek, from below heading): call cursor(23, 1) let out = execute('LinkPeek') let expected = 'link.vim: Can only peek reference links' let last_mes = split(out, "\n")[-1] AssertEqual expected, last_mes Execute (Invalid peek, label [9] not found in reference section): call cursor(16, 49) let out = execute('LinkPeek') let expected = 'link.vim: Could not locate reference' let first_mes = split(out, "\n")[0] AssertEqual expected, first_mes Execute (Peek of internal link, pointing to existing Markdown file): call cursor(17, 30) let out = execute('LinkPeek') let expected = 'link.vim: lorem-converted.md' let first_mes = split(out, "\n")[0] AssertEqual expected, first_mes Execute (Peek of internal link, pointing to non-existent Markdown file): call cursor(17, 60) let out = execute('LinkPeek') let expected = 'link.vim: Could not resolve link' let first_mes = split(out, "\n")[0] AssertEqual expected, first_mes link.vim-2.0.0/test/markdown_ft/pick_closest_link.vader000066400000000000000000000144061511406577400232730ustar00rootroot00000000000000~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (First out of three links, cursor on first char): LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus][0] et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ## Links [0]: http://www.loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Second out of three links, cursor on first char): normal! f[ LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis][0] dis [parturient](http://www.adipiscingelitipsum.com) montes, ## Links [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Third out of three links, cursor on first char): normal! f[f[ LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient][0] montes, ## Links [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (First out of three links, cursor on last char): normal! f) LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus][0] et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ## Links [0]: http://www.loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Second out of three links, cursor on last char): normal! 2f) LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis][0] dis [parturient](http://www.adipiscingelitipsum.com) montes, ## Links [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Third out of three links, cursor on last char): normal! 3f) LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient][0] montes, ## Links [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor between first and second link): normal! f)W LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis][0] dis [parturient](http://www.adipiscingelitipsum.com) montes, ## Links [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor inside second link): normal! f)f)3b LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis][0] dis [parturient](http://www.adipiscingelitipsum.com) montes, ## Links [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor just before second link): normal! f[h LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis][0] dis [parturient](http://www.adipiscingelitipsum.com) montes, ## Links [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor just after second link): normal! 2f)l LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient][0] montes, ## Links [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient](http://www.adipiscingelitipsum.com) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor on last char of last link, no trailing chars): normal! 3f) LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [Penatibus](http://www.loremipsum.com) et [magnis](http://www.dolorsitamet.com) dis [parturient][0] ## Links [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/markdown_ft/reformat.vader000066400000000000000000000321151511406577400214100ustar00rootroot00000000000000~~~ 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: # Yar Pirate Ipsum ## Fluke furl Fluke furl [cutlass][0] scuttle coffer [topmast][1] hang the jib spyglass driver crack Jennys tea cup. Quarterdeck run a rig Jolly Roger gangway no prey, no pay pirate quarter log schooner draft. Sink me wherry [tackle][3] matey ballast mizzen pinnace bucko bowsprit Cat o'nine tails. Nipperkin chase guns topgallant Nelsons folly Jolly Roger matey hulk aye overhaul rum. Black jack fathom booty provost killick bounty Yellow Jack bucko [sloop topgallant][4]. Scurvy Admiral of the Black spirits clipper belaying pin lanyard gally barque keel gaff. ## Transom no Transom no prey, no pay haul wind galleon log smartly quarterdeck interloper Nelsons folly dead men tell no tales. [Topgallant](www.gallant.top) plunder maroon hempen halter pink hang the jib [crimp][6] squiffy clap of [thunder][7] fathom. Spanish [Main][8] killick case shot Shiver me timbers wench red ensign smartly chase guns pillage boom. ## Links [0]: http://cutlass.com [1]: https://www.topmast.org [2]: https://www.sink.com [3]: https://tackle.net [4]: https://www.sloop.com [5]: https://www.gallant.top [6]: http://crimp.com [7]: https://www.thunder.com [8]: http://main.es ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Delete two links, [2] and [5]): LinkReformat ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: # Yar Pirate Ipsum ## Fluke furl Fluke furl [cutlass][0] scuttle coffer [topmast][1] hang the jib spyglass driver crack Jennys tea cup. Quarterdeck run a rig Jolly Roger gangway no prey, no pay pirate quarter log schooner draft. Sink me wherry [tackle][2] matey ballast mizzen pinnace bucko bowsprit Cat o'nine tails. Nipperkin chase guns topgallant Nelsons folly Jolly Roger matey hulk aye overhaul rum. Black jack fathom booty provost killick bounty Yellow Jack bucko [sloop topgallant][3]. Scurvy Admiral of the Black spirits clipper belaying pin lanyard gally barque keel gaff. ## Transom no Transom no prey, no pay haul wind galleon log smartly quarterdeck interloper Nelsons folly dead men tell no tales. [Topgallant](www.gallant.top) plunder maroon hempen halter pink hang the jib [crimp][4] squiffy clap of [thunder][5] fathom. Spanish [Main][6] killick case shot Shiver me timbers wench red ensign smartly chase guns pillage boom. ## Links [0]: http://cutlass.com [1]: https://www.topmast.org [2]: https://tackle.net [3]: https://www.sloop.com [4]: http://crimp.com [5]: https://www.thunder.com [6]: http://main.es ~~~ 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: # Yar Pirate Ipsum ## Fluke furl Fluke furl [cutlass][0] scuttle coffer [topmast][1] hang the jib spyglass driver crack [Jennys][19] tea cup. Quarterdeck run a rig Jolly Roger gangway no prey, no pay pirate quarter log schooner draft. Sink me wherry [tackle][3] matey ballast mizzen pinnace bucko bowsprit Cat o'nine tails. Nipperkin [chase][23] guns topgallant Nelsons folly Jolly Roger matey hulk aye overhaul rum. Black jack fathom booty provost killick bounty Yellow Jack bucko [sloop topgallant][4]. Scurvy Admiral of the Black [spirits][15] clipper belaying pin lanyard gally barque keel gaff. ## Transom no Transom no prey, no pay haul wind galleon log smartly quarterdeck interloper Nelsons folly dead men tell no tales. [Topgallant](www.gallant.top) plunder maroon hempen halter pink hang the jib [crimp][6] squiffy clap of [thunder][7] fathom. Spanish [Main][8] killick case shot Shiver me timbers wench red ensign smartly chase guns pillage boom. ## Links [1]: https://www.topmast.org [2]: https://www.sink.com [6]: http://crimp.com [3]: https://tackle.net [19]: https://www.thunder.com [4]: https://www.sloop.com [5]: https://www.gallant.top [23]: https://www.topmast.org [7]: https://www.thunder.com [0]: http://cutlass.com [15]: https://www.thunder.com [4]: https://www.sloop.com [8]: http://main.es ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Merge links): LinkReformat ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: # Yar Pirate Ipsum ## Fluke furl Fluke furl [cutlass][0] scuttle coffer [topmast][1] hang the jib spyglass driver crack [Jennys][2] tea cup. Quarterdeck run a rig Jolly Roger gangway no prey, no pay pirate quarter log schooner draft. Sink me wherry [tackle][3] matey ballast mizzen pinnace bucko bowsprit Cat o'nine tails. Nipperkin [chase][1] guns topgallant Nelsons folly Jolly Roger matey hulk aye overhaul rum. Black jack fathom booty provost killick bounty Yellow Jack bucko [sloop topgallant][4]. Scurvy Admiral of the Black [spirits][2] clipper belaying pin lanyard gally barque keel gaff. ## Transom no Transom no prey, no pay haul wind galleon log smartly quarterdeck interloper Nelsons folly dead men tell no tales. [Topgallant](www.gallant.top) plunder maroon hempen halter pink hang the jib [crimp][5] squiffy clap of [thunder][2] fathom. Spanish [Main][6] killick case shot Shiver me timbers wench red ensign smartly chase guns pillage boom. ## Links [0]: http://cutlass.com [1]: https://www.topmast.org [2]: https://www.thunder.com [3]: https://tackle.net [4]: https://www.sloop.com [5]: http://crimp.com [6]: http://main.es ~~~ 3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: Sapien ac iaculis feugiat, [lacus][9] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque [vitae][2], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][5] [nunc][4], vestibulum [nec][3], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu [vestibulum][10] commodo, quam mauris interdum arcu, [pellentesque][6] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][1700] ac, [turpis][8]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [2]: https://vitae.net/index.html [1]: https://www.magna.com [4]: ftp://nunc.com [3]: https://www.nec.com [5]: https://www.sem.com [9]: http://lacus.org/lacus [12]: http://no-exist.com [6]: https://pellentesque.com [1700]: https://www.fringilla.com [8]: http://turpis.net ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute ([10] has no corresponding label in the references section, [12] has no corresponding label in the document body; do not move cursor): call cursor(5, 6) LinkReformat let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 5 AssertEqual col_nr, 6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque [vitae][2], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][3] [nunc][4], vestibulum [nec][5], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu [vestibulum][???] commodo, quam mauris interdum arcu, [pellentesque][6] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][7] ac, [turpis][8]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://www.magna.com [2]: https://vitae.net/index.html [3]: https://www.sem.com [4]: ftp://nunc.com [5]: https://www.nec.com [6]: https://pellentesque.com [7]: https://www.fringilla.com [8]: http://turpis.net ~ 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Reformat an already reformatted buffer, with links already merged): Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque [vitae][2], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][3] [nunc][4], vestibulum [nec][5], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu [vestibulum][???] commodo, quam mauris interdum arcu, [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][6] ac, [turpis][2]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://www.magna.com [2]: https://vitae.net/index.html [3]: https://www.sem.com [4]: ftp://nunc.com [5]: https://www.nec.com [6]: https://www.fringilla.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkReformat ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque [vitae][2], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][3] [nunc][4], vestibulum [nec][5], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu [vestibulum][???] commodo, quam mauris interdum arcu, [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][6] ac, [turpis][2]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: https://www.magna.com [2]: https://vitae.net/index.html [3]: https://www.sem.com [4]: ftp://nunc.com [5]: https://www.nec.com [6]: https://www.fringilla.com ~ 5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Internal links): Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque [vitae][2], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][3] [nunc][4], vestibulum [nec][5], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu [vestibulum][???] commodo, quam mauris interdum arcu, [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][6] ac, [turpis][2]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: foo.md [2]: https://vitae.net/index.html [3]: non-existent.md [4]: ftp://nunc.com [5]: bar.md [6]: https://www.fringilla.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: silent !touch foo.md bar.md LinkReformat silent !rm foo.md bar.md ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, quis volutpat justo turpis ac mauris. Duis velit [magna][1], scelerisque [vitae][2], varius ut, aliquam vel, justo. Proin ac augue. Nullam auctor lectus vitae arcu. Vestibulum porta justo placerat purus. Ut [sem][???] [nunc][3], vestibulum [nec][4], sodales vitae, vehicula eget, ipsum. Sed nec tortor. Aenean malesuada. Nunc convallis, massa eu [vestibulum][???] commodo, quam mauris interdum arcu, [pellentesque][1] diam metus ut nulla. Vestibulum eu dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, lobortis ac, [fringilla][5] ac, [turpis][2]. Duis ac erat. Etiam consequat. Integer sed est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus [1]: foo.md [2]: https://vitae.net/index.html [3]: ftp://nunc.com [4]: bar.md [5]: https://www.fringilla.com ~ 6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (Ignore non-numeric labels): Sapien ac iaculis feugiat, [lacus][1] lacus accumsan lorem, [foo] volutpat justo turpis ac mauris. dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, Duis ac erat. Etiam [foo bar baz] est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [1]: http://lacus.org/lacus ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkReformat ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Sapien ac iaculis feugiat, [lacus][0] lacus accumsan lorem, [foo] volutpat justo turpis ac mauris. dolor sit amet lacus varius fermentum. Morbi dolor enim, pulvinar eget, Duis ac erat. Etiam [foo bar baz] est eu elit pellentesque dapibus. Duis venenatis magna feugiat. ## Links [0]: http://lacus.org/lacus ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/markdown_ft/skip_line.vader000066400000000000000000000044661511406577400215560ustar00rootroot00000000000000Before: unlet! b:link_skip_line After: unlet! b:link_skip_line = 1 ============================================================================ Given markdown (Use default (commentstring) to skip lines): Filler Not a comment: [magna](www.magna.com) Continued > Blockquote: [lacus](http://lacus.org/lacus) End ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Filler Not a comment: [magna][0] Continued > Blockquote: [lacus](http://lacus.org/lacus) End ## Links [0]: www.magna.com = 2 ============================================================================ Given markdown (Use custom pattern to skip lines): Filler Not a comment: [magna](www.magna.com) Continued > Blockquote: [lacus](http://lacus.org/lacus) End ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let b:link_skip_line = '^>' LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: Filler Not a comment: [magna][0] Continued > Blockquote: [lacus](http://lacus.org/lacus) End ## Links [0]: www.magna.com [1]: https://vitae.net/index.html = 3 ============================================================================ Given markdown (Use custom pattern '+' to skip lines): alpha [magna](http://magna.com) bravo +charlie [vitae](https://vitae.net/index.html) delta echo [lacus](http://lacus.org/lacus) foxtrot ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let b:link_skip_line = '^+' LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: alpha [magna][0] bravo +charlie [vitae](https://vitae.net/index.html) delta echo [lacus][1] foxtrot ## Links [0]: http://magna.com [1]: http://lacus.org/lacus ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/markdown_ft/urls.vader000066400000000000000000000074211511406577400205600ustar00rootroot00000000000000Before: unlet! b:link_disable_internal_links unlet! g:link_disable_internal_links After: unlet! b:link_disable_internal_links unlet! g:link_disable_internal_links ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown (URLs in varying formats; internal links included): [foo](www.bar.com) [foo](ftp://ftp.bar.net) [foo](file://path/to/file.txt) [foo](http://www.bar.com) [foo](https://bar.org) [foo](http://192.0.2.1) [foo](http://subdomain.bar.com) [foo](https://bar.travel) [foo](http://bar.very123longtld) [foo](http://www.ba-r.com) [foo](http://bar.com:8080) [foo](http://bar.com/baz) [foo](http://bar.com/index.html) [foo](http://www.parameters.org/page2014.html?utm_source=facebook&utm_medium=eventlinkonwall&utm_term=trapshoot&utm_content=calendar_event_on_wall&utm_campaign=trapshoot2014) [foo](bar) [foo](bar.com) [literal-asterisk](https://example.com/files/*/index.html) [encoded-asterisk](https://example.net/query?value=%2A) [tilde](https://domain.com/~user) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [foo][0] [foo][1] [foo][2] [foo][3] [foo][4] [foo][5] [foo][6] [foo][7] [foo][8] [foo][9] [foo][10] [foo][11] [foo][12] [foo][13] [foo][14] [foo][15] [literal-asterisk][16] [encoded-asterisk][17] [tilde][18] ## Links [0]: www.bar.com [1]: ftp://ftp.bar.net [2]: file://path/to/file.txt [3]: http://www.bar.com [4]: https://bar.org [5]: http://192.0.2.1 [6]: http://subdomain.bar.com [7]: https://bar.travel [8]: http://bar.very123longtld [9]: http://www.ba-r.com [10]: http://bar.com:8080 [11]: http://bar.com/baz [12]: http://bar.com/index.html [13]: http://www.parameters.org/page2014.html?utm_source=facebook&utm_medium=eventlinkonwall&utm_term=trapshoot&utm_content=calendar_event_on_wall&utm_campaign=trapshoot2014 [14]: bar [15]: bar.com [16]: https://example.com/files/*/index.html [17]: https://example.net/query?value=%2A [18]: https://domain.com/~user ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given markdown: [foo](www.bar.com) [foo](ftp://ftp.bar.net) [foo](file://path/to/file.txt) [foo](http://www.bar.com) [foo](https://bar.org) [foo](http://192.0.2.1) [foo](http://subdomain.bar.com) [foo](https://bar.travel) [foo](http://bar.very123longtld) [foo](http://www.ba-r.com) [foo](http://bar.com:8080) [foo](http://bar.com/baz) [foo](http://bar.com/index.html) [foo](http://www.parameters.org/page2014.html?utm_source=facebook&utm_medium=eventlinkonwall&utm_term=trapshoot&utm_content=calendar_event_on_wall&utm_campaign=trapshoot2014) [foo](bar) [foo](bar.com) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (URLs in varying formats; internal links disabled): let g:link_disable_internal_links = 1 LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect markdown: [foo](www.bar.com) [foo][0] [foo][1] [foo][2] [foo][3] [foo][4] [foo][5] [foo][6] [foo][7] [foo][8] [foo][9] [foo][10] [foo][11] [foo][12] [foo](bar) [foo](bar.com) ## Links [0]: ftp://ftp.bar.net [1]: file://path/to/file.txt [2]: http://www.bar.com [3]: https://bar.org [4]: http://192.0.2.1 [5]: http://subdomain.bar.com [6]: https://bar.travel [7]: http://bar.very123longtld [8]: http://www.ba-r.com [9]: http://bar.com:8080 [10]: http://bar.com/baz [11]: http://bar.com/index.html [12]: http://www.parameters.org/page2014.html?utm_source=facebook&utm_medium=eventlinkonwall&utm_term=trapshoot&utm_content=calendar_event_on_wall&utm_campaign=trapshoot2014 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/minimal.vimrc000066400000000000000000000025661511406577400167320ustar00rootroot00000000000000" Create a testing environment isolated from existing plugins and settings on " your workstation. " Helper functions ------------------------------------------------- {{{1 " Check if running inside Docker container. function! s:is_docker() return filereadable('/.dockerenv') endfunction " Add plugin to runtimepath and warn if not found. function! s:load_plugin(path) let l:exp_path = expand(a:path) if !isdirectory(l:exp_path) throw 'Could not find the plugin: ' .. a:path endif let &runtimepath .= ',' .. l:exp_path endfunction " Settings --------------------------------------------------------- {{{1 filetype plugin indent on syntax enable " Disable the pager prompt `-- More --`; see `:help pager` and `:help more`. set nomore " Load plugins ----------------------------------------------------- {{{1 " Load Vader test framework. if s:is_docker() call s:load_plugin('/home/vimmer/vader.vim') else " Edit this path, depening on your plugin manager. call s:load_plugin('~/.local/share/nvim/lazy/vader.vim') endif " Load link.vim. if s:is_docker() call s:load_plugin('/home/vimmer/link.vim') else " Edit this path, depening on your plugin manager. call s:load_plugin('~/.local/share/nvim/lazy/link.vim') endif " Key bindings ----------------------------------------------------- {{{1 " Exit tests nnoremap Q :quitall! inoremap Q :quitall! link.vim-2.0.0/test/other_ft/000077500000000000000000000000001511406577400160435ustar00rootroot00000000000000link.vim-2.0.0/test/other_ft/convert_all.vader000066400000000000000000000344611511406577400214060ustar00rootroot00000000000000Before: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line After: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: www.bar.com Fluke furl ftp://ftp.bar.net scuttle coffer file://path/to/file.txt hang the jib spyglass driver crack Jennys tea cup. Quarterdeck run a http://www.bar.com rig Jolly Roger https://bar.org gangway http://192.0.2.1 no prey, no pay pirate quarter log http://subdomain.bar.com schooner draft https://bar.travel http://bar.very123longtld Scurvy Admiral of the Black spirits clipper http://www.ba-r.com Nipperkin http://bar.com:8080 Jolly Roger matey hulk aye http://bar.com/baz booty provost killick bounty http://bar.com/index.html http://www.parameters.org/page2014.html?utm_source=facebook&utm_medium=eventlinkonwall&utm_term=trapshoot&utm_content=calendar_event_on_wall&utm_campaign=trapshoot2014 bar bar.com Line containing something resembling an inline link: command! -buffer -range=% -bar TagLinks silent keeppatterns ,substitute#\v%(\[[^\]]+\]\(\s*)@,substitute#\v%(\[[^\]]+\]\(\s*)@ Quarterdeck run a http://www.bar.com > rig Jolly Roger https://bar.org gangway http://192.0.2.1 no prey, > no pay pirate quarter log http://subdomain.bar.com schooner draft https://bar.travel ~~~~~ Execute (Skip some lines in a mail buffer): let b:link_skip_line = '^>' let b:link_heading = 'Links:' LinkConvertAll ~~~~~ Expect mail: [0] Fluke furl [1] scuttle coffer [2] hang the jib spyglass driver crack Jennys tea cup. > Quarterdeck run a http://www.bar.com > rig Jolly Roger https://bar.org gangway http://192.0.2.1 no prey, > no pay pirate quarter log http://subdomain.bar.com schooner draft [3] Links: [0]: http://www.bar.com [1]: ftp://ftp.bar.net [2]: file://path/to/file.txt [3]: https://bar.travel ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given gitcommit: Git commit title Git https://comm.it body Body continued # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: foo.txt # ~~~~~ Execute (Gitcommit buffer, custom heading, repositioned reference section): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' LinkConvertAll ~~~~~ Expect gitcommit: Git commit title Git [0] body Body continued Links: [0]: https://comm.it # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: foo.txt # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Hi Recipient, I hope this email https://email.com finds you well. Best regards, Your Name -- Your Job Title Your Company Name Your Contact Information ~~~~~ Execute (Mail buffer): let b:link_heading = 'Links:' let b:link_heading_before = '^--' LinkConvertAll ~~~~~ Expect mail: Hi Recipient, I hope this email [0] finds you well. Best regards, Your Name Links: [0]: https://email.com -- Your Job Title Your Company Name Your Contact Information ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Subject: Join Our Webinar Series! Hi John, Exciting news! We're hosting a series of webinars on Vim and Neovim. Here's the schedule: Intro to Vim: Join here: https://vim.com/webinar1 or https://vimbackup.com/webinar1 Advanced Vim Techniques: Join here: http://www.vim.com/webinar2 Q&A with Experts: Join here: http://vim.com/webinar3 Intro to Neovim: Join here: https://neovim.com/webinar1 or https://neovimbackup.com/webinar1 > Advanced Neovim Techniques: Join here: www.neovim.com/webinar2 Q&A with Experts: Join here: http://neovim.com/webinar3 Don't miss out — register now! Let us know if you have any questions. Cheers, Jane ~~~~~ Execute (Mail buffer): let b:link_heading = 'Full Links:' let b:link_heading_before = '^Cheers' let b:link_skip_line = '^>' LinkConvertAll ~~~~~ Expect mail: Subject: Join Our Webinar Series! Hi John, Exciting news! We're hosting a series of webinars on Vim and Neovim. Here's the schedule: Intro to Vim: Join here: [0] or [1] Advanced Vim Techniques: Join here: [2] Q&A with Experts: Join here: [3] Intro to Neovim: Join here: [4] or [5] > Advanced Neovim Techniques: Join here: www.neovim.com/webinar2 Q&A with Experts: Join here: [6] Don't miss out — register now! Let us know if you have any questions. Full Links: [0]: https://vim.com/webinar1 [1]: https://vimbackup.com/webinar1 [2]: http://www.vim.com/webinar2 [3]: http://vim.com/webinar3 [4]: https://neovim.com/webinar1 [5]: https://neovimbackup.com/webinar1 [6]: http://neovim.com/webinar3 Cheers, Jane ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail (Two identical links on the same line): foo https://www.vim.org bar https://www.vim.org baz Execute: let b:link_heading = 'Links:' LinkConvertAll Expect mail: foo [0] bar [0] baz Links: [0]: https://www.vim.org ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail (URLs with trailing punctuation characters): foo https://www.vim.org, bar baz https://neovim.io. qux ----- Execute: LinkConvertAll ----- Expect mail: foo [0], bar baz [1]. qux Links: [0]: https://www.vim.org [1]: https://neovim.io ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: foo (https://www.vim.org) bar Execute (URL within parentheses): LinkConvertAll Expect mail: foo ([0]) bar Links: [0]: https://www.vim.org ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given gitcommit: Update README.md with project documentation links This commit updates the README.md file to include links to various project documentation resources. The documentation includes: 1. Project Wiki: https://github.com/example/project/wiki 2. API Documentation: https://api.example.com/docs 3. User Guide: https://docs.example.com/user-guide 4. Developer Documentation: https://docs.example.com/developer-guide # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: README.md # Execute (Gitcommit buffer, reposition reference section, empty heading): let b:link_heading = '' let b:link_heading_before = '^# Please enter' LinkConvertAll Expect gitcommit: Update README.md with project documentation links This commit updates the README.md file to include links to various project documentation resources. The documentation includes: 1. Project Wiki: [0] 2. API Documentation: [1] 3. User Guide: [2] 4. Developer Documentation: [3] [0]: https://github.com/example/project/wiki [1]: https://api.example.com/docs [2]: https://docs.example.com/user-guide [3]: https://docs.example.com/developer-guide # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: README.md # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Subject: Join Our Webinar Series! Hi John, Exciting news! We're hosting a series of webinars on Vim and Neovim. Here's the schedule: Intro to Vim: Join here: https://vim.com/webinar1 or https://vimbackup.com/webinar1 Advanced Vim Techniques: Join here: http://www.vim.com/webinar2 Q&A with Experts: Join here: http://vim.com/webinar3 Intro to Neovim: Join here: https://neovim.com/webinar1 or https://neovimbackup.com/webinar1 > Advanced Neovim Techniques: Join here: www.neovim.com/webinar2 Q&A with Experts: Join here: http://neovim.com/webinar3 Cheers, Jane ~~~~~ Execute (Empty heading, reposition): let b:link_heading = '' let b:link_heading_before = '^Cheers' let b:link_skip_line = '^>' LinkConvertAll ~~~~~ Expect mail: Subject: Join Our Webinar Series! Hi John, Exciting news! We're hosting a series of webinars on Vim and Neovim. Here's the schedule: Intro to Vim: Join here: [0] or [1] Advanced Vim Techniques: Join here: [2] Q&A with Experts: Join here: [3] Intro to Neovim: Join here: [4] or [5] > Advanced Neovim Techniques: Join here: www.neovim.com/webinar2 Q&A with Experts: Join here: [6] [0]: https://vim.com/webinar1 [1]: https://vimbackup.com/webinar1 [2]: http://www.vim.com/webinar2 [3]: http://vim.com/webinar3 [4]: https://neovim.com/webinar1 [5]: https://neovimbackup.com/webinar1 [6]: http://neovim.com/webinar3 Cheers, Jane = 11 =========================================================================== Given mail (URL is already present in reference section): Intro to Vim: Join here: [0] Follow the webinar at: https://vim.com/webinar1 Intro to Neovim: Join here: https://neovim.com/webinar1 or https://neovimbackup.com/webinar1 Into to Vim: https://vim.com/webinar1 Links: [0]: https://vim.com/webinar1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: Intro to Vim: Join here: [0] Follow the webinar at: [0] Intro to Neovim: Join here: [1] or [2] Into to Vim: [0] Links: [0]: https://vim.com/webinar1 [1]: https://neovim.com/webinar1 [2]: https://neovimbackup.com/webinar1 = 12 =========================================================================== Given mail (URL is not yet present in reference section, but same URL is present multiple times in body): Intro to Vim: Join here: https://vim.com/webinar1 Follow the webinar at: https://vim.com/webinar1 Intro to Neovim: Join here: https://neovim.com/webinar1 or https://neovimbackup.com/webinar1 Into to Vim: https://vim.com/webinar1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: LinkConvertAll ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: Intro to Vim: Join here: [0] Follow the webinar at: [0] Intro to Neovim: Join here: [1] or [2] Into to Vim: [0] Links: [0]: https://vim.com/webinar1 [1]: https://neovim.com/webinar1 [2]: https://neovimbackup.com/webinar1 ================================================================================ link.vim-2.0.0/test/other_ft/convert_range.vader000066400000000000000000000100331511406577400217170ustar00rootroot00000000000000Before: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line After: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: www.bar.com Fluke furl ftp://ftp.bar.net scuttle coffer file://path/to/file.txt hang the jib spyglass driver crack Jennys tea cup. Quarterdeck run a http://www.bar.com rig Jolly Roger https://bar.org gangway http://192.0.2.1 no prey, no pay pirate quarter log http://subdomain.bar.com schooner draft https://bar.travel http://bar.very123longtld Scurvy Admiral of the Black spirits clipper http://www.ba-r.com Nipperkin http://bar.com:8080 Jolly Roger matey hulk aye http://bar.com/baz booty provost killick bounty http://bar.com/index.html http://www.parameters.org/page2014.html?utm_source=facebook&utm_medium=eventlinkonwall&utm_term=trapshoot&utm_content=calendar_event_on_wall&utm_campaign=trapshoot2014 bar bar.com Line containing something resembling an inline link: command! -buffer -range=% -bar TagLinks silent keeppatterns ,substitute#\v%(\[[^\]]+\]\(\s*)@,substitute#\v%(\[[^\]]+\]\(\s*)@ Advanced Neovim Techniques: Join here: www.neovim.com/webinar2 Q&A with Experts: Join here: http://neovim.com/webinar3 Don't miss out — register now! Let us know if you have any questions. Cheers, Jane ~~~~~ Execute (Mail buffer): let b:link_heading = 'Full Links:' let b:link_heading_before = '^Cheers' let b:link_skip_line = '^>' 10,13 LinkConvertRange ~~~~~ Expect mail: Subject: Join Our Webinar Series! Hi John, Exciting news! We're hosting a series of webinars on Vim and Neovim. Here's the schedule: Intro to Vim: Join here: https://vim.com/webinar1 or https://vimbackup.com/webinar1 Advanced Vim Techniques: Join here: www.vim.com/webinar2 Q&A with Experts: Join here: [0] Intro to Neovim: Join here: [1] or [2] > Advanced Neovim Techniques: Join here: www.neovim.com/webinar2 Q&A with Experts: Join here: http://neovim.com/webinar3 Don't miss out — register now! Let us know if you have any questions. Full Links: [0]: http://vim.com/webinar3 [1]: https://neovim.com/webinar1 [2]: https://neovimbackup.com/webinar1 Cheers, Jane ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/other_ft/convert_single.vader000066400000000000000000000064031511406577400221120ustar00rootroot00000000000000~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Cum sociis natoque penatibus et magnis dis parturient montes, ~~~~~~~~~~~~~~ Execute (No link): LinkConvertSingle ~~~~~~~~~~~~~~ Expect mail: Cum sociis natoque penatibus et magnis dis parturient montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Cum sociis natoque penatibus http://www.loremipsum.com et magnis dis parturient montes, ~~~~~~~~~~~~~~ Execute (Single link): LinkConvertSingle ~~~~~~~~~~~~~~ Expect mail: Cum sociis natoque penatibus [0] et magnis dis parturient montes, Links: [0]: http://www.loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Cum sociis natoque penatibus http://www.loremipsum.com et magnis http://www.dolorsitamet.com dis parturient montes, ~~~~~~~~~~~~~~ Execute (Two links): LinkConvertSingle LinkConvertSingle ~~~~~~~~~~~~~~ Expect mail: Cum sociis natoque penatibus [0] et magnis [1] dis parturient montes, Links: [0]: http://www.loremipsum.com [1]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et magnis dis parturient montes ~~~~~~~~~~~~~~ Execute (Link at start of line): LinkConvertSingle ~~~~~~~~~~~~~~ Expect mail: [0] et magnis dis parturient montes Links: [0]: http://www.loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Cum sociis natoque penatibus http://www.loremipsum.com ~~~~~~~~~~~~~~ Execute (Link at end of line): LinkConvertSingle ~~~~~~~~~~~~~~ Expect mail: Cum sociis natoque penatibus [0] Links: [0]: http://www.loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et magnis http://www.dolorsitamet.com ~~~~~~~~~~~~~~ Execute (Two links, one at start of line, one at end of line): LinkConvertSingle LinkConvertSingle ~~~~~~~~~~~~~~ Expect mail: [0] et magnis [1] Links: [0]: http://www.loremipsum.com [1]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Cum sociis natoque http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~ Execute (Three links): LinkConvertSingle LinkConvertSingle LinkConvertSingle ~~~~~~~~~~~~~~ Expect mail: Cum sociis natoque [0] et [1] dis [2] montes, Links: [0]: http://www.loremipsum.com [1]: http://www.dolorsitamet.com [2]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ " NOTE the * character causes issues, so is not included here Given mail: Cum sociis natoque http://www.lorem-ipsum.com/foo_bar.html?bar=baz+alpha$bravo!charlie'delta,echo%foxtrot et magnis ~~~~~~~~~~~~~~ Execute (Link containing special characters): LinkConvertSingle ~~~~~~~~~~~~~~ Expect mail: Cum sociis natoque [0] et magnis Links: [0]: http://www.lorem-ipsum.com/foo_bar.html?bar=baz+alpha$bravo!charlie'delta,echo%foxtrot ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/other_ft/convert_single_insert.vader000066400000000000000000000037411511406577400235000ustar00rootroot00000000000000~~~ Insert X to mark cursor position ~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Before: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line After: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et magnis http://www.dolorsitamet.com dis parturient http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Link at start of line): LinkConvertSingleInsert normal! iX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: [0]X et magnis http://www.dolorsitamet.com dis parturient http://www.adipiscingelitipsum.com montes, Links: [0]: http://www.loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: Penatibus http://www.loremipsum.com dis parturient http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Link at end of line): normal! $ LinkConvertSingleInsert " Use a instead of i because we are at the end of the line normal! aX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: Penatibus http://www.loremipsum.com dis parturient [0]X Links: [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et magnis http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor in middle of second link): normal! 2f: LinkConvertSingleInsert normal! iX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et magnis [0]X dis http://www.adipiscingelitipsum.com Links: [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/other_ft/jump.vader000066400000000000000000000053001511406577400200370ustar00rootroot00000000000000" Calling functions is required here; the commands are unknown because of the " gitcommit resource Before: find **/gitcommit_converted.gitcommit normal! gg unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line After: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line ============================================== Execute (): Log 'From document body to reference section' ============================================== Execute (Valid jump, from single reference link on line, [0]): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' call cursor(6, 18) call linkvim#x#jump#jump() let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 17 AssertEqual col_nr, 6 Execute (Valid jump, from second reference link on line, [3]): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' call cursor(8, 49) call linkvim#x#jump#jump() let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 20 AssertEqual col_nr, 6 Execute (Invalid jump, no reference link on line): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' call cursor(3, 5) call linkvim#x#jump#jump() let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 3 AssertEqual col_nr, 5 Execute (Invalid jump, single reference link on line with no corresponding link reference definition, [1]): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' 18 delete call cursor(7, 1) call linkvim#x#jump#jump() let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 7 AssertEqual col_nr, 1 undo ============================================== Execute (): Log 'From reference section to document body' ============================================== Execute (Valid jump, to a line with a single link, [0]): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' call cursor(17, 1) call linkvim#x#jump#jump() let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 6 AssertEqual col_nr, 20 Execute (Valid jump, to a line with multiple links, [3]): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' call cursor(20, 25) call linkvim#x#jump#jump() let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 8 AssertEqual col_nr, 51 Execute (Invalid jump, no corresponding reference link, [1]): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' 7 delete call cursor(17, 1) call linkvim#x#jump#jump() let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 17 AssertEqual col_nr, 1 undo link.vim-2.0.0/test/other_ft/open.vader000066400000000000000000000034741511406577400200370ustar00rootroot00000000000000Before: messages clear ~ 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail (From body): Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. [0] Links: [0]: http://www.loremipsumdolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: call cursor(2, 27) let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'http://www.loremipsumdolorsitamet.com' AssertEqual exp, message ~ 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail (From reference section): Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. [0] Links: [0]: http://www.loremipsumdolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: call cursor('$', 1) let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'http://www.loremipsumdolorsitamet.com' AssertEqual exp, message ~ 3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail (Line without link): Praesent semper magna. In eu justo. Nunc vitae risus nec sem scelerisque consequat. In hac habitasse platea dictumst. Nam posuere ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let out = execute('LinkOpen') let message = split(out, "\n")[0] let exp = 'link.vim: No link found under cursor' AssertEqual exp, message ~ 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail (Invalid URL: no protocol): [0] penatibus et magnis dis parturient montes, nascetur ridiculus mus. Links: [0]: loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~ Execute: let out = execute('LinkOpen') let messages = split(out, "\n") let exp = [] AssertEqual exp, messages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/other_ft/peek.vader000066400000000000000000000032541511406577400200160ustar00rootroot00000000000000" Calling functions is required here; the commands are unknown because of the " gitcommit resource Before: find **/gitcommit_converted.gitcommit normal! gg unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line After: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line Execute (Valid peek, from single reference link on line, [0]): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' call cursor(6, 20) let expected = 'link.vim: https://github.com/example/project/wiki' let out = execute('LinkPeek') let last_mes = split(out, "\n")[-1] AssertEqual expected, last_mes Execute (Valid peek, from multiple reference links on line, [3]): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' call cursor(8, 50) let expected = 'link.vim: https://docs.example.com/developer-guide' let out = execute('LinkPeek') let last_mes = split(out, "\n")[-1] AssertEqual expected, last_mes Execute (Invalid peek, from reference section): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' call cursor(17, 1) let expected = 'link.vim: Can only peek reference links' let out = execute('LinkPeek') let last_mes = split(out, "\n")[-1] AssertEqual expected, last_mes Execute (Invalid peek, label [1] not found in reference section): let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter' 18 delete call cursor(7, 25) let out = execute('LinkPeek') let expected = 'link.vim: Could not locate reference' let first_mes = split(out, "\n")[0] AssertEqual expected, first_mes link.vim-2.0.0/test/other_ft/pick_closest_link.vader000066400000000000000000000126371511406577400225760ustar00rootroot00000000000000" Calling functions is required here; can't use the commands because of " b:init_view Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (First out of three links, cursor on first char): normal! 0 LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: [0] et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, Links: [0]: http://www.loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et magnis http://www.dolorsitamet.com dis parturient http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Second out of three links, cursor on first char): normal! 2f:B LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et magnis [0] dis parturient http://www.adipiscingelitipsum.com montes, Links: [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Third out of three links, cursor on first char): normal! 3f:B LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis [0] montes, Links: [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, Execute (First out of three links, cursor on last char): normal! 1f:E LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: [0] et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, Links: [0]: http://www.loremipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Second out of three links, cursor on last char): normal! 2f:E LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et [0] dis http://www.adipiscingelitipsum.com montes, Links: [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Third out of three links, cursor on last char): normal! 3f:E LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis [0] montes, Links: [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor between first and second link): normal! 1f:Ew LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et [0] dis http://www.adipiscingelitipsum.com montes, Links: [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor inside second link): normal! 2f:8l LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et [0] dis http://www.adipiscingelitipsum.com montes, Links: [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor just before second link): normal! 2f:bh LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et [0] dis http://www.adipiscingelitipsum.com montes, Links: [0]: http://www.dolorsitamet.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com montes, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor just after second link): normal! 2f:El LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis [0] montes, Links: [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Cursor on last char of last link, no trailing chars): normal! 3f:E LinkConvertSingle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect mail: http://www.loremipsum.com et http://www.dolorsitamet.com dis [0] Links: [0]: http://www.adipiscingelitipsum.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/other_ft/reformat.vader000066400000000000000000000122011511406577400207010ustar00rootroot00000000000000" Calling functions is required here; the commands are unknown because of the " gitcommit resource Before: unlet! g:link_start_index unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line After: unlet! g:link_start_index unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line ~~~ 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given gitcommit: Update README.md with project documentation links This commit updates the README.md file to include links to various project documentation resources. The documentation includes: 2. API Documentation: [1] 3. User Guide: [2] and Developer Documentation Each link provides access to specific documentation sections relevant to different stakeholders involved in the project. This update ensures that stakeholders can easily access the necessary documentation directly from the project's README file. Links: [0]: https://github.com/example/project/wiki [1]: https://api.example.com/docs [2]: https://docs.example.com/user-guide [3]: https://docs.example.com/developer-guide # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: README.md # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Delete two links, [0] and [3]): let g:link_start_index = 10 let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter the commit message' let b:link_skip_line = '^>' LinkReformat ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect gitcommit: Update README.md with project documentation links This commit updates the README.md file to include links to various project documentation resources. The documentation includes: 2. API Documentation: [10] 3. User Guide: [11] and Developer Documentation Each link provides access to specific documentation sections relevant to different stakeholders involved in the project. This update ensures that stakeholders can easily access the necessary documentation directly from the project's README file. Links: [10]: https://api.example.com/docs [11]: https://docs.example.com/user-guide # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: README.md # ~~~ 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given gitcommit: Update README.md with project documentation links > This line should remain untouched: [3] This commit updates the README.md file [7] to include links to various project documentation resources. The documentation includes: 2. API Documentation: [1] Make sure to consult the documentation [55]! 3. User Guide: [2] and Developer Documentation Each link provides access to specific documentation sections relevant to different stakeholders involved in the project. This update ensures that stakeholders can easily access the necessary documentation [5] directly from the project's README file [8]. Links: [5]: https://api.example.com/docs [0]: https://github.com/example/project/wiki [7]: https://github.com/help/readme [1]: https://api.example.com/docs [2]: https://docs.example.com/user-guide [8]: https://github.com/help/readme [3]: https://docs.example.com/developer-guide [55]: https://api.example.com/docs # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: README.md # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Execute (Merge links; do not move cursor): call cursor(5, 6) let b:link_heading = 'Links:' let b:link_heading_before = '^# Please enter the commit message' let b:link_skip_line = '^>' LinkReformat let [line_nr, col_nr] = getcurpos()[1:2] AssertEqual line_nr, 5 AssertEqual col_nr, 6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Expect gitcommit: Update README.md with project documentation links > This line should remain untouched: [3] This commit updates the README.md file [0] to include links to various project documentation resources. The documentation includes: 2. API Documentation: [1] Make sure to consult the documentation [1]! 3. User Guide: [2] and Developer Documentation Each link provides access to specific documentation sections relevant to different stakeholders involved in the project. This update ensures that stakeholders can easily access the necessary documentation [1] directly from the project's README file [0]. Links: [0]: https://github.com/help/readme [1]: https://api.example.com/docs [2]: https://docs.example.com/user-guide # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch main # Changes to be committed: # modified: README.md # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/other_ft/skip_line.vader000066400000000000000000000033251511406577400210460ustar00rootroot00000000000000Before: unlet! b:link_heading unlet! b:link_skip_line After: unlet! b:link_heading unlet! b:link_skip_line ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given javascript: // filler const url = ' http://www.magna.com ' // this is a comment: https://vitae.net/index.html ~~~~~ Execute (Use default (commentstring) to skip lines; JavaScript): let b:link_heading = 'Links:' LinkConvertAll ~~~~~ Expect javascript: // filler const url = ' [0] ' // this is a comment: https://vitae.net/index.html Links: [0]: http://www.magna.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given html: Filler Not a comment: http://www.magna.com Continued > Blockquote: http://lacus.org/lacus End ~~~~~ Execute (Use default (commentstring) to skip lines; HTML): LinkConvertAll ~~~~~ Expect html: Filler Not a comment: [0] Continued > Blockquote: http://lacus.org/lacus End Links: [0]: http://www.magna.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given html: Not a comment: http://www.magna.com Continued // custom comment: http://lacus.org/lacus End ~~~~~ Execute (Use custom pattern to skip lines; HTML): let b:link_skip_line = '^//' LinkConvertAll ~~~~~ Expect html: Not a comment: [0] Continued // custom comment: http://lacus.org/lacus End Links: [0]: http://www.magna.com [1]: https://vitae.net/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link.vim-2.0.0/test/other_ft/urls.vader000066400000000000000000000042701511406577400200560ustar00rootroot00000000000000Before: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line After: unlet! g:link_heading unlet! b:link_heading unlet! b:link_heading_before unlet! b:link_skip_line ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given mail: foo ftp://ftp.bar.net foo file://path/to/file.txt foo http://www.bar.com foo https://bar.org foo http://192.0.2.1 foo http://subdomain.bar.com foo https://bar.travel foo http://bar.very123longtld foo http://www.ba-r.com foo http://bar.com:8080 foo http://bar.com/baz foo http://bar.com/index.html foo http://www.parameters.org/page2014.html?utm_source=facebook&utm_medium=eventlinkonwall&utm_term=trapshoot&utm_content=calendar_event_on_wall&utm_campaign=trapshoot2014 foo www.bar.com foo bar foo bar.com Line containing something resembling an inline link: command! -buffer -range=% -bar TagLinks silent keeppatterns ,substitute#\v%(\[[^\]]+\]\(\s*)@,substitute#\v%(\[[^\]]+\]\(\s*)@ Args: """Parse command line arguments.""" parser = argparse.ArgumentParser(description="Run link.vim tests.") parser.add_argument( "-b", "--browser", help="open links in browser", action="store_true", ) parser.add_argument( "-e", "--editor", help="editor in which tests will be run", choices=["vim", "nvim"], default="nvim", ) parser.add_argument( "-f", "--files", help="test file(s) to be run; default is all", nargs="+", default=["**/*.vader"], ) parser.add_argument( "-o", "--output", help="write output to specified file; by default, output is shown in editor", type=str, metavar="FILE", ) parsed = parser.parse_args() return Args(**vars(parsed)) def main(): os.chdir(Path(__file__).resolve().parent) args = parse_args() vader_cmd = "Vader" if args.browser: os.environ["TEST_OPEN_IN_BROWSER"] = "true" if args.output: os.environ["VADER_OUTPUT_FILE"] = args.output # Exit editor after running the tests with exit status of 0 or 1 vader_cmd = "Vader!" subprocess_arguments = [ args.editor, "-N", "-u", VIMRC, "-c", f"{vader_cmd} {' '.join(args.files)}", ] subprocess.run( subprocess_arguments, check=False, ) if __name__ == "__main__": main()