From: codybuell Date: Wed, 17 Jan 2018 19:42:20 +0000 (-0500) Subject: Merge remote-tracking branch 'upstream/master' X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/da4f9691597928065d849fe9c0863ed3a756b52d?hp=3375792916db2503b81ee848eeb26c7376d23e42 Merge remote-tracking branch 'upstream/master' --- diff --git a/.travis.yml b/.travis.yml index 8ea8d3d..90cc371 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,9 @@ before_script: | export PATH="/usr/local/bin:$PATH" cd "$TRAVIS_BUILD_DIR" fi + if [ "$TRAVIS_OS_NAME" = "osx" ]; then + sudo -H easy_install pip + fi sudo -H pip install virtualenv script: diff --git a/README.md b/README.md index 0d03b34..ca7eef2 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,37 @@ This will cause the following to be highlighted using the `cs` filetype syntax. Default is `['c++=cpp', 'viml=vim', 'bash=sh', 'ini=dosini']`. +### Follow named anchors + +This feature allows ge to follow named anchors in links of the form +`file#anchor` or just `#anchor`, where file may omit the `.md` extension as +usual. Two variables control its operation: + +```vim +let g:vim_markdown_follow_anchor = 1 +``` + +This tells vim-markdown whether to attempt to follow a named anchor in a link or +not. When it is 1, and only if a link can be split in two parts by the pattern +'#', then the first part is interpreted as the file and the second one as the +named anchor. This also includes urls of the form `#anchor`, for which the first +part is considered empty, meaning that the target file is the current one. After +the file is opened, the anchor will be searched. + +Default is `0`. + +```vim +let g:vim_markdown_anchorexpr = "'<<'.v:anchor.'>>'" +``` + +This expression will be evaluated substituting `v:anchor` with a quoted string +that contains the anchor to visit. The result of the evaluation will become the +real anchor to search in the target file. This is useful in order to convert +anchors of the form, say, `my-section-title` to searches of the form `My Section +Title` or `<>`. + +Default is `''`. + ### Syntax extensions The following options control which syntax extensions will be turned on. They are off by default. diff --git a/doc/vim-markdown.txt b/doc/vim-markdown.txt index c6d579e..109ffdc 100644 --- a/doc/vim-markdown.txt +++ b/doc/vim-markdown.txt @@ -15,15 +15,16 @@ Contents ~ |vim-markdown-text-emphasis-restriction-to-single-lines| 7. Syntax Concealing |vim-markdown-syntax-concealing| 8. Fenced code block languages |vim-markdown-fenced-code-block-languages| - 9. Syntax extensions |vim-markdown-syntax-extensions| + 9. Follow named anchors |vim-markdown-follow-named-anchors| + 10. Syntax extensions |vim-markdown-syntax-extensions| 1. LaTeX math |vim-markdown-latex-math| 2. YAML Front Matter |vim-markdown-yaml-front-matter| 3. TOML Front Matter |vim-markdown-toml-front-matter| 4. JSON Front Matter |vim-markdown-json-front-matter| - 10. Adjust new list item indent |vim-markdown-adjust-new-list-item-indent| - 11. Do not require .md extensions for Markdown links + 11. Adjust new list item indent |vim-markdown-adjust-new-list-item-indent| + 12. Do not require .md extensions for Markdown links |vim-markdown-do-not-require-.md-extensions-for-markdown-links| - 12. Auto-write when following link + 13. Auto-write when following link |vim-markdown-auto-write-when-following-link| 4. Mappings |vim-markdown-mappings| 5. Commands |vim-markdown-commands| @@ -191,6 +192,35 @@ This will cause the following to be highlighted using the 'cs' filetype syntax. < Default is "['c++=cpp', 'viml=vim', 'bash=sh', 'ini=dosini']". +------------------------------------------------------------------------------- + *vim-markdown-follow-named-anchors* +Follow named anchors ~ + +This feature allows ge to follow named anchors in links of the form +'file#anchor' or just '#anchor', where file may omit the '.md' extension as +usual. Two variables control its operation: +> + let g:vim_markdown_follow_anchor = 1 +< +This tells vim-markdown whether to attempt to follow a named anchor in a link +or not. When it is 1, and only if a link can be split in two parts by the +pattern '#', then the first part is interpreted as the file and the second one +as the named anchor. This also includes urls of the form '#anchor', for which +the first part is considered empty, meaning that the target file is the current +one. After the file is opened, the anchor will be searched. + +Default is '0'. +> + let g:vim_markdown_anchorexpr = "'<<'.v:anchor.'>>'" +< +This expression will be evaluated substituting 'v:anchor' with a quoted string +that contains the anchor to visit. The result of the evaluation will become the +real anchor to search in the target file. This is useful in order to convert +anchors of the form, say, 'my-section-title' to searches of the form 'My +Section Title' or '<>'. + +Default is "''". + ------------------------------------------------------------------------------- *vim-markdown-syntax-extensions* Syntax extensions ~ diff --git a/ftplugin/markdown.vim b/ftplugin/markdown.vim index 48fa89e..067643d 100644 --- a/ftplugin/markdown.vim +++ b/ftplugin/markdown.vim @@ -578,28 +578,45 @@ endfunction " We need a definition guard because we invoke 'edit' which will reload this " script while this function is running. We must not replace it. -if !exists("*s:EditUrlUnderCursor") - function s:EditUrlUnderCursor() - let l:url = s:Markdown_GetUrlForPosition(line('.'), col('.')) - if l:url != '' - if get(g:, 'vim_markdown_autowrite', 0) - write - endif - if get(g:, 'vim_markdown_no_extensions_in_markdown', 0) - " use another file extension if preferred - if exists('g:vim_markdown_auto_extension_ext') - let l:ext = '.'.g:vim_markdown_auto_extension_ext - else - let l:ext = '.md' - endif - execute 'edit' fnameescape(fnamemodify(expand('%:~'), ':p:h').'/'.l:url.l:ext) - else - execute 'edit' fnameescape(l:url) - endif - else - echomsg 'The cursor is not on a link.' - endif - endfunction +if !exists('*s:EditUrlUnderCursor') + function s:EditUrlUnderCursor() + let l:url = s:Markdown_GetUrlForPosition(line('.'), col('.')) + if l:url != '' + if get(g:, 'vim_markdown_autowrite', 0) + write + endif + let l:anchor = '' + if get(g:, 'vim_markdown_follow_anchor', 0) + let l:parts = split(l:url, '#', 1) + if len(l:parts) == 2 + let [l:url, l:anchor] = parts + let l:anchorexpr = get(g:, 'vim_markdown_anchorexpr', '') + if l:anchorexpr != '' + let l:anchor = eval(substitute( + \ l:anchorexpr, 'v:anchor', + \ escape('"'.l:anchor.'"', '"'), '')) + endif + endif + endif + if l:url != '' + if get(g:, 'vim_markdown_no_extensions_in_markdown', 0) + " use another file extension if preferred + if exists('g:vim_markdown_auto_extension_ext') + let l:url = '.'.g:vim_markdown_auto_extension_ext + else + let l:url = '.md' + endif + endif + let l:url = fnamemodify(expand('%:h').'/'.l:url, ':.') + execute 'edit' l:url + endif + if l:anchor != '' + silent! execute '/'.l:anchor + endif + else + echomsg 'The cursor is not on a link.' + endif + endfunction endif function! s:VersionAwareNetrwBrowseX(url) diff --git a/syntax/markdown.vim b/syntax/markdown.vim index 43cb898..008a6d8 100644 --- a/syntax/markdown.vim +++ b/syntax/markdown.vim @@ -108,11 +108,9 @@ syn match mkdCode /^\s*\n\(\(\s\{4,}[^ ]\|\t\+[^\t]\).*\n\)\+/ containe syn match mkdListItem /^\s*\%([-*+]\|\d\+\.\)\ze\s\+/ contained syn region mkdListItemLine start="^\s*\%([-*+]\|\d\+\.\)\s\+" end="$" oneline contains=@mkdNonListItem,mkdListItem,@Spell syn region mkdNonListItemBlock start="\(\%^\(\s*\([-*+]\|\d\+\.\)\s\+\)\@!\|\n\(\_^\_$\|\s\{4,}[^ ]\|\t+[^\t]\)\@!\)" end="^\(\s*\([-*+]\|\d\+\.\)\s\+\)\@=" contains=@mkdNonListItem,@Spell -syn match mkdRule /^\s*\*\s\{0,1}\*\s\{0,1}\*$/ -syn match mkdRule /^\s*-\s\{0,1}-\s\{0,1}-$/ -syn match mkdRule /^\s*_\s\{0,1}_\s\{0,1}_$/ -syn match mkdRule /^\s*-\{3,}$/ -syn match mkdRule /^\s*\*\{3,5}$/ +syn match mkdRule /^\s*\*\s\{0,1}\*\s\{0,1}\*\(\*\|\s\)*$/ +syn match mkdRule /^\s*-\s\{0,1}-\s\{0,1}-\(-\|\s\)*$/ +syn match mkdRule /^\s*_\s\{0,1}_\s\{0,1}_\(_\|\s\)*$/ " YAML frontmatter if get(g:, 'vim_markdown_frontmatter', 0) diff --git a/test/syntax.vader b/test/syntax.vader index 0540155..0adae58 100644 --- a/test/syntax.vader +++ b/test/syntax.vader @@ -629,6 +629,14 @@ Execute (link in blockquote): AssertEqual SyntaxOf('a'), 'mkdLink' AssertEqual SyntaxOf('foo'), 'mkdInlineURL' +Given markdown; +[https://domain.tld](https://domain.com) not_a_link + +Execute (link with url title): + AssertEqual SyntaxOf('https://domain.tld'), 'mkdInlineURL' + AssertEqual SyntaxOf('https://domain.com'), 'mkdInlineURL' + AssertNotEqual SyntaxOf('not_a_link'), 'mkdInlineURL' + # Code Blocks Given markdown;