98 lines
3 KiB
VimL
98 lines
3 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
|