mirror of
1
0
Fork 0
ultimate-vim/sources_non_forked/tlib/autoload/tlib/paragraph.vim

98 lines
3.0 KiB
VimL

" paragraph.vim
" @Author: Tom Link (mailto:micathom AT gmail com?subject=[vim])
" @Website: http://www.vim.org/account/profile.php?user_id=4037
" @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
" @Created: 2009-10-26.
" @Last Change: 2011-04-03.
" @Revision: 62
let s:save_cpo = &cpo
set cpo&vim
" Return an object describing a |paragraph|.
function! tlib#paragraph#GetMetric() "{{{3
let sp = {'text_start': line("'{") + 1}
if line("'}") == line("$")
let sp.last = 1
let sp.text_end = line("'}")
if line("'{") == 1
let sp.ws_start = 0
let sp.ws_end = 0
let sp.top = sp.text_start
let sp.bottom = sp.text_end
else
let sp.ws_start = prevnonblank(line("'{")) + 1
let sp.ws_end = line("'{")
let sp.top = sp.ws_start
let sp.bottom = sp.text_end
endif
else
let sp.last = 0
let sp.text_end = line("'}") - 1
let sp.ws_start = line("'}")
for i in range(line("'}"), line('$'))
if getline(i) =~ '\w'
let sp.ws_end = i - 1
break
elseif i == line("$")
let sp.ws_end = i
endif
endfor
let sp.top = sp.text_start
let sp.bottom = sp.ws_end
endif
return sp
endf
" This function can be used with the tinymode plugin to move around
" paragraphs.
"
" Example configuration: >
"
" call tinymode#EnterMap("para_move", "gp")
" call tinymode#ModeMsg("para_move", "Move paragraph: j/k")
" call tinymode#Map("para_move", "j", "silent call tlib#paragraph#Move('Down', '[N]')")
" call tinymode#Map("para_move", "k", "silent call tlib#paragraph#Move('Up', '[N]')")
" call tinymode#ModeArg("para_move", "owncount", 1)
function! tlib#paragraph#Move(direction, count)
" TLogVAR a:direction, a:count
let mycount = empty(a:count) ? 1 : a:count
for i in range(1, mycount)
let para = tlib#paragraph#GetMetric()
" TLogVAR para
let text = getline(para.text_start, para.text_end)
let ws = getline(para.ws_start, para.ws_end)
" TLogVAR text, ws
exec para.top .','. para.bottom .'delete'
if a:direction == "Down"
let other = tlib#paragraph#GetMetric()
let target = other.bottom + 1
if other.last
let lines = ws + text
let pos = target + len(ws)
else
let lines = text + ws
let pos = target
endif
elseif a:direction == "Up"
if !para.last
norm! {
endif
let other = tlib#paragraph#GetMetric()
let target = other.text_start
let lines = text + ws
let pos = target
endif
" TLogVAR other, target
" TLogVAR lines
call append(target - 1, lines)
exec pos
endfor
endf
let &cpo = s:save_cpo
unlet s:save_cpo