" - a string with the the URL for the link under the cursor
" - an empty string if the cursor is not on a link
"
-" `b:` instead of `s:` to make it testable.
-"
" TODO
"
" - multiline support
" - give an error if the separator does is not on a link
"
-function! b:Markdown_GetUrlForPosition(lnum, col)
+function! s:Markdown_GetUrlForPosition(lnum, col)
let l:lnum = a:lnum
let l:col = a:col
let l:syn = synIDattr(synID(l:lnum, l:col, 1), 'name')
" Front end for GetUrlForPosition.
"
function! s:OpenUrlUnderCursor()
- let l:url = b:Markdown_GetUrlForPosition(line('.'), col('.'))
+ let l:url = s:Markdown_GetUrlForPosition(line('.'), col('.'))
if l:url != ''
call netrw#NetrwBrowseX(l:url, 0)
else
endif
endfunction
+function! s:MapNotHasmapto(lhs, rhs)
+ if !hasmapto('<Plug>' . a:rhs)
+ execute 'nmap <buffer>' . a:lhs . ' <Plug>' . a:rhs
+ execute 'vmap <buffer>' . a:lhs . ' <Plug>' . a:rhs
+ endif
+endfunction
+
call <sid>MapNormVis('<Plug>Markdown_MoveToNextHeader', '<sid>MoveToNextHeader')
call <sid>MapNormVis('<Plug>Markdown_MoveToPreviousHeader', '<sid>MoveToPreviousHeader')
call <sid>MapNormVis('<Plug>Markdown_MoveToNextSiblingHeader', '<sid>MoveToNextSiblingHeader')
nnoremap <Plug>Markdown_OpenUrlUnderCursor :call <sid>OpenUrlUnderCursor()<cr>
if !get(g:, 'vim_markdown_no_default_key_mappings', 0)
- nmap <buffer> ]] <Plug>Markdown_MoveToNextHeader
- nmap <buffer> [[ <Plug>Markdown_MoveToPreviousHeader
- nmap <buffer> ][ <Plug>Markdown_MoveToNextSiblingHeader
- nmap <buffer> [] <Plug>Markdown_MoveToPreviousSiblingHeader
- nmap <buffer> ]u <Plug>Markdown_MoveToParentHeader
- nmap <buffer> ]c <Plug>Markdown_MoveToCurHeader
- nmap <buffer> gx <Plug>Markdown_OpenUrlUnderCursor
-
- vmap <buffer> ]] <Plug>Markdown_MoveToNextHeader
- vmap <buffer> [[ <Plug>Markdown_MoveToPreviousHeader
- vmap <buffer> ][ <Plug>Markdown_MoveToNextSiblingHeader
- vmap <buffer> [] <Plug>Markdown_MoveToPreviousSiblingHeader
- vmap <buffer> ]u <Plug>Markdown_MoveToParentHeader
- vmap <buffer> ]c <Plug>Markdown_MoveToCurHeader
+ call <sid>MapNotHasmapto(']]', 'Markdown_MoveToNextHeader')
+ call <sid>MapNotHasmapto('[[', 'Markdown_MoveToPreviousHeader')
+ call <sid>MapNotHasmapto('][', 'Markdown_MoveToNextSiblingHeader')
+ call <sid>MapNotHasmapto('[]', 'Markdown_MoveToPreviousSiblingHeader')
+ call <sid>MapNotHasmapto(']u', 'Markdown_MoveToParentHeader')
+ call <sid>MapNotHasmapto(']c', 'Markdown_MoveToCurHeader')
+ call <sid>MapNotHasmapto('gx', 'Markdown_OpenUrlUnderCursor')
endif
command! -buffer -range=% HeaderDecrease call s:HeaderDecrease(<line1>, <line2>)
Execute (gx autolink):
let b:url = 'http://b'
let b:line = getline(1)
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'a') + 1), ''
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, '<') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'h') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, '>') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'c') + 1), ''
+ let b:func = Markdown_GetFunc('vim-markdown/ftplugin/mkd.vim', 'Markdown_GetUrlForPosition')
+ AssertEqual b:func(1, match(b:line, 'a') + 1), ''
+ AssertEqual b:func(1, match(b:line, '<') + 1), b:url
+ AssertEqual b:func(1, match(b:line, 'h') + 1), b:url
+ AssertEqual b:func(1, match(b:line, '>') + 1), b:url
+ AssertEqual b:func(1, match(b:line, 'c') + 1), ''
Given mkd;
a http://b.bb c
Execute (gx implicit autolink):
let b:url = 'http://b.bb'
let b:line = getline(1)
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'a') + 1), ''
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'h') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'c') + 1), ''
+ let b:func = Markdown_GetFunc('vim-markdown/ftplugin/mkd.vim', 'Markdown_GetUrlForPosition')
+ AssertEqual b:func(1, match(b:line, 'a') + 1), ''
+ AssertEqual b:func(1, match(b:line, 'h') + 1), b:url
+ AssertEqual b:func(1, match(b:line, 'c') + 1), ''
Given mkd;
[a]: http://b "c"
Execute (gx link reference definition):
let b:url = 'http://b'
let b:line = getline(1)
+ let b:func = Markdown_GetFunc('vim-markdown/ftplugin/mkd.vim', 'Markdown_GetUrlForPosition')
" TODO would be cool if all of the following gave the link.
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'a') + 1), ''
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'h') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'c') + 1), ''
+ AssertEqual b:func(1, match(b:line, 'a') + 1), ''
+ AssertEqual b:func(1, match(b:line, 'h') + 1), b:url
+ AssertEqual b:func(1, match(b:line, 'c') + 1), ''
Given mkd;
a [b](c) d
Execute (gx autolink):
let b:url = 'c'
let b:line = getline(1)
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'a') + 1), ''
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, '[') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'b') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, ']') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, '(') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'c') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, ')') + 1), b:url
- AssertEqual b:Markdown_GetUrlForPosition(1, match(b:line, 'd') + 1), ''
+ let b:func = Markdown_GetFunc('vim-markdown/ftplugin/mkd.vim', 'Markdown_GetUrlForPosition')
+ AssertEqual b:func(1, match(b:line, 'a') + 1), ''
+ AssertEqual b:func(1, match(b:line, '[') + 1), b:url
+ AssertEqual b:func(1, match(b:line, 'b') + 1), b:url
+ AssertEqual b:func(1, match(b:line, ']') + 1), b:url
+ AssertEqual b:func(1, match(b:line, '(') + 1), b:url
+ AssertEqual b:func(1, match(b:line, 'c') + 1), b:url
+ AssertEqual b:func(1, match(b:line, ')') + 1), b:url
+ AssertEqual b:func(1, match(b:line, 'd') + 1), ''
Given mkd;
# a