File: u.vim

package info (click to toggle)
vim-link-vim 2.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 524 kB
  • sloc: python: 66; makefile: 30
file content (58 lines) | stat: -rw-r--r-- 2,144 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
" 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