From: Hiroshi Shirosaki Date: Fri, 15 Dec 2017 04:31:17 +0000 (+0900) Subject: Merge pull request #312 from memeplex/namedanchor X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/a4c57c4b032a660fed80f72a8106dab145a3b0f3?hp=3fcde7215e22913f004c2836fd46ff61746be6db Merge pull request #312 from memeplex/namedanchor Follow named anchors with ge --- 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/ftplugin/markdown.vim b/ftplugin/markdown.vim index 21c9442..d7c3777 100644 --- a/ftplugin/markdown.vim +++ b/ftplugin/markdown.vim @@ -578,22 +578,40 @@ 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) - execute 'edit' fnamemodify(expand('%:~'), ':p:h').'/'.l:url.'.md' - else - execute 'edit' 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) + let l:url .= '.md' + 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)