From 75d229b3204be61c1b73aae4e0746a4d2a196e4b Mon Sep 17 00:00:00 2001 From: mattn Date: Fri, 1 Jun 2012 11:59:16 +0900 Subject: [PATCH] balanceTag for haml & slim. --- autoload/zencoding/lang/haml.vim | 74 +++++++++++++++++++++++--------- autoload/zencoding/lang/slim.vim | 62 ++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 20 deletions(-) diff --git a/autoload/zencoding/lang/haml.vim b/autoload/zencoding/lang/haml.vim index e365f8e..806c68c 100644 --- a/autoload/zencoding/lang/haml.vim +++ b/autoload/zencoding/lang/haml.vim @@ -125,6 +125,7 @@ function! zencoding#lang#haml#toggleComment() endfunction function! zencoding#lang#haml#balanceTag(flag) range + let block = zencoding#util#getVisualBlock() if a:flag == -2 || a:flag == 2 let curpos = [0, line("'<"), col("'<"), 0] else @@ -133,26 +134,59 @@ function! zencoding#lang#haml#balanceTag(flag) range let n = curpos[1] let ml = len(matchstr(getline(n), '^\s*')) - while n > 0 - let l = len(matchstr(getline(n), '^\s*\ze%[a-z]')) - if l > 0 && l < ml - let ml = l - break - endif - let n -= 1 - endwhile - let sn = n - while n < line('$') - let l = len(matchstr(getline(n), '^\s*%[a-z]')) - if l > 0 && l <= ml - let n -= 1 - break - endif - let n += 1 - endwhile - call setpos('.', [0, sn, 1, 0]) - normal! V - call setpos('.', [0, n, 1, 0]) + if a:flag > 0 + if a:flag == 1 || !zencoding#util#regionIsValid(block) + let n = line('.') + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze%[a-z]')) + if l > 0 && l < ml + let ml = l + break + endif + let n -= 1 + endwhile + endif + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*%[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze[a-z]')) + if l > 0 && l > ml + let ml = l + break + endif + let n += 1 + endwhile + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*%[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + endif endfunction function! zencoding#lang#haml#moveNextPrev(flag) diff --git a/autoload/zencoding/lang/slim.vim b/autoload/zencoding/lang/slim.vim index 8a3999c..68b1c1b 100644 --- a/autoload/zencoding/lang/slim.vim +++ b/autoload/zencoding/lang/slim.vim @@ -112,6 +112,68 @@ function! zencoding#lang#slim#toggleComment() endfunction function! zencoding#lang#slim#balanceTag(flag) range + let block = zencoding#util#getVisualBlock() + if a:flag == -2 || a:flag == 2 + let curpos = [0, line("'<"), col("'<"), 0] + else + let curpos = getpos('.') + endif + let n = curpos[1] + let ml = len(matchstr(getline(n), '^\s*')) + + if a:flag > 0 + if a:flag == 1 || !zencoding#util#regionIsValid(block) + let n = line('.') + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze[a-z]')) + if l > 0 && l < ml + let ml = l + break + endif + let n -= 1 + endwhile + endif + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze[a-z]')) + if l > 0 && l > ml + let ml = l + break + endif + let n += 1 + endwhile + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + endif endfunction function! zencoding#lang#slim#moveNextPrev(flag)