aboutsummaryrefslogtreecommitdiff
path: root/plugin/nextag.vim
blob: 97f220f5cd368b6295bcd623147c9fcdd7dfcac9 (plain) (blame)
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
59
"
" nextag.vim - Move to next and previous tags in a SGML document, including
" XML and HTML. Use <leader>. and <leader>, to search for the next and
" previous tags, respectively. Prepended counts work, e.g. 5<leader>. as do
" operations, e.g. d<leader>. and visual mode e.g. v<leader>,. Doesn't match
" SGML comments or !DOCTYPES.
"
" Maintainer: Tom Ryder <http://www.sanctum.geek.nz/>
"

"
" Wrapper to prevent overloading and signal our presence, and check we're not
" in compatible mode or running a version of Vim that's too old.
"
if exists('g:loaded_nextag') || &compatible || v:version < 700
  finish
endif
let g:loaded_nextag = 1

"
" Search for a SGML tag with the specified flag.
"
function! s:MoveToSGMLTag(direction, mode)
  if a:mode ==# 'v'
    normal! gv
  endif
  let l:visualfix = a:mode ==# 'v' && a:direction ==# 'next' && &selection !=# 'exclusive' ? 1 : 0
  for l:iteration in range(1, v:count1)
    call search('\m<\/\?\w\+[^>]*>', a:direction ==# 'next' ? 'W' : 'Wb')
    if l:visualfix
      normal! l
    endif
  endfor
  if l:visualfix
    normal! h
  endif
endfunction

"
" Default remappings.
"
nnoremap <silent>
      \ <leader>.
      \ :<C-U>call <SID>MoveToSGMLTag('next', 'n')<CR>
nnoremap <silent>
      \ <leader>,
      \ :<C-U>call <SID>MoveToSGMLTag('prev', 'n')<CR>
onoremap <silent>
      \ <leader>.
      \ :<C-U>call <SID>MoveToSGMLTag('next', 'o')<CR>
onoremap <silent>
      \ <leader>,
      \ :<C-U>call <SID>MoveToSGMLTag('prev', 'o')<CR>
vnoremap <silent>
      \ <leader>.
      \ :<C-U>call <SID>MoveToSGMLTag('next', 'v')<CR>
vnoremap <silent>
      \ <leader>,
      \ :<C-U>call <SID>MoveToSGMLTag('prev', 'v')<CR>