git-svn-id: https://vimsuite.svn.sourceforge.net/svnroot/vimsuite/trunk@155 eb2d0018-73a3-4aeb-bfe9-1def61c9ec69
507 lines
25 KiB
VimL
507 lines
25 KiB
VimL
" AlignMaps: Alignment maps based upon <Align.vim>
|
||
" Maintainer: Dr. Charles E. Campbell, Jr. <Charles.Campbell@gsfc.nasa.gov>
|
||
" Date: Mar 06, 2008
|
||
" Version: 39
|
||
"
|
||
" NOTE: the code herein needs vim 6.0 or later
|
||
" needs <Align.vim> v6 or later
|
||
" needs <cecutil.vim> v5 or later
|
||
" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1
|
||
" Permission is hereby granted to use and distribute this code,
|
||
" with or without modifications, provided that this copyright
|
||
" notice is copied with it. Like anything else that's free,
|
||
" AlignMaps.vim is provided *as is* and comes with no warranty
|
||
" of any kind, either expressed or implied. By using this
|
||
" plugin, you agree that in no event will the copyright
|
||
" holder be liable for any damages resulting from the use
|
||
" of this software.
|
||
"
|
||
" Usage: {{{1
|
||
" Use 'a to mark beginning of to-be-aligned region, Alternative: use v
|
||
" move cursor to end of region, and execute map. (visual mode) to mark
|
||
" The maps also set up marks 'y and 'z, and retain region, execute same map.
|
||
" 'a at the beginning of region. Uses 'a, 'y, and 'z.
|
||
"
|
||
" Although the comments indicate the maps use a leading backslash,
|
||
" actually they use <Leader> (:he mapleader), so the user can
|
||
" specify that the maps start how he or she prefers.
|
||
"
|
||
" Note: these maps all use <Align.vim>.
|
||
"
|
||
" Romans 1:20 For the invisible things of Him since the creation of the {{{1
|
||
" world are clearly seen, being perceived through the things that are
|
||
" made, even His everlasting power and divinity; that they may be
|
||
" without excuse.
|
||
" ---------------------------------------------------------------------
|
||
|
||
" Load Once: {{{1
|
||
if exists("g:loaded_alignmaps") || &cp
|
||
finish
|
||
endif
|
||
let g:loaded_alignmaps = "v39"
|
||
let s:keepcpo = &cpo
|
||
set cpo&vim
|
||
|
||
" ---------------------------------------------------------------------
|
||
" WS: wrapper start map (internal) {{{1
|
||
" Produces a blank line above and below, marks with 'y and 'z
|
||
if !hasmapto('<Plug>WrapperStart')
|
||
nmap <unique> <SID>WS <Plug>AlignMapsWrapperStart
|
||
endif
|
||
nmap <silent> <script> <Plug>AlignMapsWrapperStart :set lz<CR>:call AlignWrapperStart()<CR>
|
||
|
||
" ---------------------------------------------------------------------
|
||
" AlignWrapperStart: {{{1
|
||
fun! AlignWrapperStart()
|
||
" call Dfunc("AlignWrapperStart()")
|
||
|
||
if line("'y") == 0 || line("'z") == 0 || !exists("s:alignmaps_wrapcnt") || s:alignmaps_wrapcnt <= 0
|
||
" call Decho("wrapper initialization")
|
||
let s:alignmaps_wrapcnt = 1
|
||
let s:alignmaps_keepgd = &gdefault
|
||
let s:alignmaps_keepsearch = @/
|
||
let s:alignmaps_keepch = &ch
|
||
let s:alignmaps_keepmy = SaveMark("'y")
|
||
let s:alignmaps_keepmz = SaveMark("'z")
|
||
let s:alignmaps_posn = SaveWinPosn(0)
|
||
" set up fencepost blank lines
|
||
put =''
|
||
norm! mz'a
|
||
put! =''
|
||
ky
|
||
let s:alignmaps_zline = line("'z")
|
||
exe "'y,'zs/@/\177/ge"
|
||
else
|
||
" call Decho("embedded wrapper")
|
||
let s:alignmaps_wrapcnt = s:alignmaps_wrapcnt + 1
|
||
norm! 'yjma'zk
|
||
endif
|
||
|
||
" change some settings to align-standard values
|
||
set nogd
|
||
set ch=2
|
||
AlignPush
|
||
norm! 'zk
|
||
" call Dret("AlignWrapperStart : alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
|
||
endfun
|
||
|
||
" ---------------------------------------------------------------------
|
||
" WE: wrapper end (internal) {{{1
|
||
" Removes guard lines, restores marks y and z, and restores search pattern
|
||
if !hasmapto('<Plug>WrapperEnd')
|
||
nmap <unique> <SID>WE <Plug>AlignMapsWrapperEnd
|
||
endif
|
||
nmap <silent> <script> <Plug>AlignMapsWrapperEnd :call AlignWrapperEnd()<CR>:set nolz<CR>
|
||
|
||
" ---------------------------------------------------------------------
|
||
" AlignWrapperEnd: {{{1
|
||
fun! AlignWrapperEnd()
|
||
" call Dfunc("AlignWrapperEnd() alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
|
||
|
||
" remove trailing white space introduced by whatever in the modification zone
|
||
'y,'zs/ \+$//e
|
||
|
||
" restore AlignCtrl settings
|
||
AlignPop
|
||
|
||
let s:alignmaps_wrapcnt= s:alignmaps_wrapcnt - 1
|
||
if s:alignmaps_wrapcnt <= 0
|
||
" initial wrapper ending
|
||
exe "'y,'zs/\177/@/ge"
|
||
|
||
" if the 'z line hasn't moved, then go ahead and restore window position
|
||
let zstationary= s:alignmaps_zline == line("'z")
|
||
|
||
" remove fencepost blank lines.
|
||
" restore 'a
|
||
norm! 'yjmakdd'zdd
|
||
|
||
" restore original 'y, 'z, and window positioning
|
||
call RestoreMark(s:alignmaps_keepmy)
|
||
call RestoreMark(s:alignmaps_keepmz)
|
||
if zstationary > 0
|
||
call RestoreWinPosn(s:alignmaps_posn)
|
||
" call Decho("restored window positioning")
|
||
endif
|
||
|
||
" restoration of options
|
||
let &gd= s:alignmaps_keepgd
|
||
let &ch= s:alignmaps_keepch
|
||
let @/ = s:alignmaps_keepsearch
|
||
|
||
" remove script variables
|
||
unlet s:alignmaps_keepch
|
||
unlet s:alignmaps_keepsearch
|
||
unlet s:alignmaps_keepmy
|
||
unlet s:alignmaps_keepmz
|
||
unlet s:alignmaps_keepgd
|
||
unlet s:alignmaps_posn
|
||
endif
|
||
|
||
" call Dret("AlignWrapperEnd : alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
|
||
endfun
|
||
|
||
" ---------------------------------------------------------------------
|
||
" Complex C-code alignment maps: {{{1
|
||
map <silent> <Leader>a? <SID>WS:AlignCtrl mIp1P1lC ? : : : : <CR>:'a,.Align<CR>:'a,'z-1s/\(\s\+\)? /?\1/e<CR><SID>WE
|
||
map <silent> <Leader>a, <SID>WS:'y,'zs/\(\S\)\s\+/\1 /ge<CR>'yjma'zk<Leader>jnr,<CR>:silent 'y,'zg/,/call <SID>FixMultiDec()<CR>'z<Leader>adec<SID>WE
|
||
map <silent> <Leader>a< <SID>WS:AlignCtrl mIp1P1=l << >><CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>a= <SID>WS:AlignCtrl mIp1P1=l<CR>:AlignCtrl g :=<CR>:'a,'zAlign :\==<CR><SID>WE
|
||
map <silent> <Leader>abox <SID>WS:let g:alignmaps_iws=substitute(getline("'a"),'^\(\s*\).*$','\1','e')<CR>:'a,'z-1s/^\s\+//e<CR>:'a,'z-1s/^.*$/@&@/<CR>:AlignCtrl m=p01P0w @<CR>:'a,.Align<CR>:'a,'z-1s/@/ * /<CR>:'a,'z-1s/@$/*/<CR>'aYP:s/./*/g<CR>0r/'zkYp:s/./*/g<CR>0r A/<Esc>:exe "'a-1,'z-1s/^/".g:alignmaps_iws."/e"<CR><SID>WE
|
||
map <silent> <Leader>acom <SID>WS:'a,.s/\/[*/]\/\=/@&@/e<CR>:'a,.s/\*\//@&/e<CR>:'y,'zs/^\( *\) @/\1@/e<CR>'zk<Leader>tW@:'y,'zs/^\(\s*\) @/\1/e<CR>:'y,'zs/ @//eg<CR><SID>WE
|
||
map <silent> <Leader>adcom <SID>WS:'a,.v/^\s*\/[/*]/s/\/[*/]\*\=/@&@/e<CR>:'a,.v/^\s*\/[/*]/s/\*\//@&/e<CR>:'y,'zv/^\s*\/[/*]/s/^\( *\) @/\1@/e<CR>'zk<Leader>tdW@:'y,'zv/^\s*\/[/*]/s/^\(\s*\) @/\1/e<CR>:'y,'zs/ @//eg<CR><SID>WE
|
||
map <silent> <Leader>aocom :AlignPush<CR>:AlignCtrl g /[*/]<CR><Leader>acom:AlignPop<CR>
|
||
map <silent> <Leader>ascom <SID>WS:'a,.s/\/[*/]/@&@/e<CR>:'a,.s/\*\//@&/e<CR>:silent! 'a,.g/^\s*@\/[*/]/s/@//ge<CR>:AlignCtrl v ^\s*\/[*/]<CR>:AlignCtrl g \/[*/]<CR>'zk<Leader>tW@:'y,'zs/^\(\s*\) @/\1/e<CR>:'y,'zs/ @//eg<CR><SID>WE
|
||
map <silent> <Leader>adec <SID>WS:'a,'zs/\([^ \t/(]\)\([*&]\)/\1 \2/e<CR>:'y,'zv/^\//s/\([^ \t]\)\s\+/\1 /ge<CR>:'y,'zv/^\s*[*/]/s/\([^/][*&]\)\s\+/\1/ge<CR>:'y,'zv/^\s*[*/]/s/^\(\s*\%(\K\k*\s\+\%([a-zA-Z_*(&]\)\@=\)\+\)\([*(&]*\)\s*\([a-zA-Z0-9_()]\+\)\s*\(\(\[.\{-}]\)*\)\s*\(=\)\=\s*\(.\{-}\)\=\s*;/\1@\2#@\3\4@\6@\7;@/e<CR>:'y,'zv/^\s*[*/]/s/\*\/\s*$/@*\//e<CR>:'y,'zv/^\s*[*/]/s/^\s\+\*/@@@@@* /e<CR>:'y,'zv/^\s*[*/]/s/^@@@@@\*\(.*[^*/]\)$/&@*/e<CR>'yjma'zk:AlignCtrl v ^\s*[*/#]<CR><Leader>t@:'y,'zv/^\s*[*/]/s/@ //ge<CR>:'y,'zv/^\s*[*/]/s/\(\s*\);/;\1/e<CR>:'y,'zv/^#/s/# //e<CR>:'y,'zv/^\s\+[*/#]/s/\([^/*]\)\(\*\+\)\( \+\)/\1\3\2/e<CR>:'y,'zv/^\s\+[*/#]/s/\((\+\)\( \+\)\*/\2\1*/e<CR>:'y,'zv/^\s\+[*/#]/s/^\(\s\+\) \*/\1*/e<CR>:'y,'zv/^\s\+[*/#]/s/[ \t@]*$//e<CR>:'y,'zs/^[*]/ */e<CR><SID>WE
|
||
map <silent> <Leader>adef <SID>WS:AlignPush<CR>:AlignCtrl v ^\s*\(\/\*\<bar>\/\/\)<CR>:'a,.v/^\s*\(\/\*\<bar>\/\/\)/s/^\(\s*\)#\(\s\)*define\s*\(\I[a-zA-Z_0-9(),]*\)\s*\(.\{-}\)\($\<Bar>\/\*\)/#\1\2define @\3@\4@\5/e<CR>:'a,.v/^\s*\(\/\*\<bar>\/\/\)/s/\($\<Bar>\*\/\)/@&/e<CR>'zk<Leader>t@'yjma'zk:'a,.v/^\s*\(\/\*\<bar>\/\/\)/s/ @//g<CR><SID>WE
|
||
map <silent> <Leader>afnc :set lz<CR>:silent call <SID>Afnc()<CR>:set nolz<CR>
|
||
if exists("g:alignmaps_usanumber")
|
||
" map <silent> <Leader>anum <SID>WS
|
||
" \:'a,'zs/\([-+]\)\=\(\d\+\%([eE][-+]\=\d\+\)\=\)\ze\%($\|[^@]\)/@\1@\2@@#/ge<CR>
|
||
" \:'a,'zs/\([-+]\)\=\(\d*\)\(\.\)\(\d*\([eE][-+]\=\d\+\)\=\)/@\1@\2@\3@\4#/ge<CR>
|
||
" \:AlignCtrl mp0P0r<CR>
|
||
" \:'a,'zAlign [@#]<CR>
|
||
" \:'a,'zs/@//ge<CR>
|
||
" \:'a,'zs/#/ /ge<CR>
|
||
" \<SID>WE
|
||
map <silent> <Leader>anum <SID>WS:'a,'zs/\([0-9.]\)\s\+\zs\([-+]\=\d\)/@\1/ge<CR>
|
||
\:'a,'zs/\.@/\.0@/ge<CR>
|
||
\:AlignCtrl mp0P0r<CR>
|
||
\:'a,'zAlign [.@]<CR>
|
||
\:'a,'zs/@/ /ge<CR>
|
||
\:'a,'zs/\(\.\)\(\s\+\)\([0-9.,eE+]\+\)/\1\3\2/ge<CR>
|
||
\:'a,'zs/\([eE]\)\(\s\+\)\([0-9+\-+]\+\)/\1\3\2/ge<CR>
|
||
\<SID>WE
|
||
elseif exists("g:alignmaps_euronumber")
|
||
map <silent> <Leader>anum <SID>WS:'a,'zs/\([0-9.]\)\s\+\([-+]\=\d\)/\1@\2/ge<CR>:'a,'zs/\.@/\.0@/ge<CR>:AlignCtrl mp0P0r<CR>:'a,'zAlign [,@]<CR>:'a,'zs/@/ /ge<CR>:'a,'zs/\(,\)\(\s\+\)\([-0-9.,eE+]\+\)/\1\3\2/ge<CR>:'a,'zs/\([eE]\)\(\s\+\)\([0-9+\-+]\+\)/\1\3\2/ge<CR><SID>WE
|
||
else
|
||
map <silent> <Leader>anum <SID>WS:'a,'zs/\([0-9.]\)\s\+\([-+]\=[.,]\=\d\)/\1@\2/ge<CR>:'a,'zs/\.@/\.0@/ge<CR>:AlignCtrl mp0P0<CR>:'a,'zAlign [.,@]<CR>:'a,'zs/\([-0-9.,]*\)\(\s*\)\([.,]\)/\2\1\3/g<CR>:'a,'zs/@/ /ge<CR>:'a,'zs/\([eE]\)\(\s\+\)\([0-9+\-+]\+\)/\1\3\2/ge<CR><SID>WE
|
||
endif
|
||
map <silent> <Leader>aunum <SID>WS:'a,'zs/\([0-9.]\)\s\+\([-+]\=\d\)/\1@\2/ge<CR>:'a,'zs/\.@/\.0@/ge<CR>:AlignCtrl mp0P0r<CR>:'a,'zAlign [.@]<CR>:'a,'zs/@/ /ge<CR>:'a,'zs/\(\.\)\(\s\+\)\([-0-9.,eE+]\+\)/\1\3\2/ge<CR>:'a,'zs/\([eE]\)\(\s\+\)\([0-9+\-+]\+\)/\1\3\2/ge<CR><SID>WE
|
||
map <silent> <Leader>aenum <SID>WS:'a,'zs/\([0-9.]\)\s\+\([-+]\=\d\)/\1@\2/ge<CR>:'a,'zs/\.@/\.0@/ge<CR>:AlignCtrl mp0P0r<CR>:'a,'zAlign [,@]<CR>:'a,'zs/@/ /ge<CR>:'a,'zs/\(,\)\(\s\+\)\([-0-9.,eE+]\+\)/\1\3\2/ge<CR>:'a,'zs/\([eE]\)\(\s\+\)\([0-9+\-+]\+\)/\1\3\2/ge<CR><SID>WE
|
||
|
||
" ---------------------------------------------------------------------
|
||
" html table alignment {{{1
|
||
map <silent> <Leader>Htd <SID>WS:'y,'zs%<[tT][rR]><[tT][dD][^>]\{-}>\<Bar></[tT][dD]><[tT][dD][^>]\{-}>\<Bar></[tT][dD]></[tT][rR]>%@&@%g<CR>'yjma'zk:AlignCtrl m=Ilp1P0 @<CR>:'a,.Align<CR>:'y,'zs/ @/@/<CR>:'y,'zs/@ <[tT][rR]>/<[tT][rR]>/ge<CR>:'y,'zs/@//ge<CR><SID>WE
|
||
|
||
" ---------------------------------------------------------------------
|
||
" character-based right-justified alignment maps {{{1
|
||
map <silent> <Leader>T| <SID>WS:AlignCtrl mIp0P0=r <Bar><CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>T# <SID>WS:AlignCtrl mIp0P0=r #<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>T, <SID>WS:AlignCtrl mIp0P1=r ,<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>Ts, <SID>WS:AlignCtrl mIp0P1=r ,<CR>:'a,.Align<CR>:'a,.s/\(\s*\),/,\1/ge<CR><SID>WE
|
||
map <silent> <Leader>T: <SID>WS:AlignCtrl mIp1P1=r :<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>T; <SID>WS:AlignCtrl mIp0P0=r ;<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>T< <SID>WS:AlignCtrl mIp0P0=r <<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>T= <SID>WS:'a,'z-1s/\s\+\([*/+\-%<Bar>&\~^]\==\)/ \1/e<CR>:'a,'z-1s@ \+\([*/+\-%<Bar>&\~^]\)=@\1=@ge<CR>:'a,'z-1s/; */;@/e<CR>:'a,'z-1s/==/\="\<Char-0xff>\<Char-0xff>"/ge<CR>:'a,'z-1s/!=/\x="!\<Char-0xff>"/ge<CR>:AlignCtrl mIp1P1=r = @<CR>:AlignCtrl g =<CR>:'a,'z-1Align<CR>:'a,'z-1s/; *@/;/e<CR>:'a,'z-1s/; *$/;/e<CR>:'a,'z-1s@\([*/+\-%<Bar>&\~^]\)\( \+\)=@\2\1=@ge<CR>:'a,'z-1s/\( \+\);/;\1/ge<CR>:'a,'z-1s/\xff/=/ge<CR><SID>WE<Leader>acom
|
||
map <silent> <Leader>T? <SID>WS:AlignCtrl mIp0P0=r ?<CR>:'a,.Align<CR>:'y,'zs/ \( *\);/;\1/ge<CR><SID>WE
|
||
map <silent> <Leader>T@ <SID>WS:AlignCtrl mIp0P0=r @<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>Tab <SID>WS:'a,.s/^\(\t*\)\(.*\)/\=submatch(1).escape(substitute(submatch(2),'\t','@','g'),'\')/<CR>:AlignCtrl mI=r @<CR>:'a,.Align<CR>:'y+1,'z-1s/@/ /g<CR><SID>WE
|
||
map <silent> <Leader>Tsp <SID>WS:'a,.s/^\(\s*\)\(.*\)/\=submatch(1).escape(substitute(submatch(2),'\s\+','@','g'),'\')/<CR>:AlignCtrl mI=r @<CR>:'a,.Align<CR>:'y+1,'z-1s/@/ /g<CR><SID>WE
|
||
map <silent> <Leader>T~ <SID>WS:AlignCtrl mIp0P0=r ~<CR>:'a,.Align<CR>:'y,'zs/ \( *\);/;\1/ge<CR><SID>WE
|
||
|
||
" ---------------------------------------------------------------------
|
||
" character-based left-justified alignment maps {{{1
|
||
map <silent> <Leader>t| <SID>WS:AlignCtrl mIp0P0=l <Bar><CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>t# <SID>WS:AlignCtrl mIp0P0=l #<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>t, <SID>WS:AlignCtrl mIp0P1=l ,<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>ts, <SID>WS:AlignCtrl mIp0P1=l ,<CR>:'a,.Align<CR>:'a,.s/\(\s*\),/,\1/ge<CR><SID>WE
|
||
map <silent> <Leader>t: <SID>WS:AlignCtrl mIp1P1=l :<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>t; <SID>WS:AlignCtrl mIp0P1=l ;<CR>:'a,.Align<CR>:'y,'zs/\( *\);/;\1/ge<CR><SID>WE
|
||
map <silent> <Leader>t< <SID>WS:AlignCtrl mIp0P0=l <<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>t= <SID>WS:call <SID>Equals()<CR><SID>WE
|
||
map <silent> <Leader>w= <SID>WS:'a,'zg/=/s/\s\+\([*/+\-%<Bar>&\~^]\==\)/ \1/e<CR>:'a,'zg/=/s@ \+\([*/+\-%<Bar>&\~^]\)=@\1=@ge<CR>:'a,'zg/=/s/==/\="\<Char-0xff>\<Char-0xff>"/ge<CR>:'a,'zg/=/s/!=/\="!\<Char-0xff>"/ge<CR>'zk:AlignCtrl mWp1P1=l =<CR>:AlignCtrl g =<CR>:'a,'z-1g/=/Align<CR>:'a,'z-1g/=/s@\([*/+\-%<Bar>&\~^!=]\)\( \+\)=@\2\1=@ge<CR>:'a,'z-1g/=/s/\( \+\);/;\1/ge<CR>:'a,'z-1v/^\s*\/[*/]/s/\/[*/]/@&@/e<CR>:'a,'z-1v/^\s*\/[*/]/s/\*\//@&/e<CR>'zk<Leader>t@:'y,'zs/^\(\s*\) @/\1/e<CR>:'a,'z-1g/=/s/\xff/=/ge<CR>:'y,'zg/=/s/ @//eg<CR><SID>WE
|
||
map <silent> <Leader>t? <SID>WS:AlignCtrl mIp0P0=l ?<CR>:'a,.Align<CR>:.,'zs/ \( *\);/;\1/ge<CR><SID>WE
|
||
map <silent> <Leader>t~ <SID>WS:AlignCtrl mIp0P0=l ~<CR>:'a,.Align<CR>:'y,'zs/ \( *\);/;\1/ge<CR><SID>WE
|
||
map <silent> <Leader>m= <SID>WS:'a,'zs/\s\+\([*/+\-%<Bar>&\~^]\==\)/ \1/e<CR>:'a,'zs@ \+\([*/+\-%<Bar>&\~^]\)=@\1=@ge<CR>:'a,'zs/==/\="\<Char-0xff>\<Char-0xff>"/ge<CR>:'a,'zs/!=/\="!\<Char-0xff>"/ge<CR>'zk:AlignCtrl mIp1P1=l =<CR>:AlignCtrl g =<CR>:'a,'z-1Align<CR>:'a,'z-1s@\([*/+\-%<Bar>&\~^!=]\)\( \+\)=@\2\1=@ge<CR>:'a,'z-1s/\( \+\);/;\1/ge<CR>:'a,'z-s/%\ze[^=]/ @%@ /e<CR>'zk<Leader>t@:'y,'zs/^\(\s*\) @/\1/e<CR>:'a,'z-1s/\xff/=/ge<CR>:'y,'zs/ @//eg<CR><SID>WE
|
||
map <silent> <Leader>tab <SID>WS:'a,.s/^\(\t*\)\(.*\)$/\=submatch(1).escape(substitute(submatch(2),'\t',"\<Char-0xff>",'g'),'\')/<CR>:if &ts == 1<bar>exe "AlignCtrl mI=lp0P0 \<Char-0xff>"<bar>else<bar>exe "AlignCtrl mI=l \<Char-0xff>"<bar>endif<CR>:'a,.Align<CR>:exe "'y+1,'z-1s/\<Char-0xff>/".((&ts == 1)? '\t' : ' ')."/g"<CR><SID>WE
|
||
map <silent> <Leader>tml <SID>WS:AlignCtrl mWp1P0=l \\\@<!\\\s*$<CR>:'a,.Align<CR><SID>WE
|
||
map <silent> <Leader>tsp <SID>WS:'a,.s/^\(\s*\)\(.*\)/\=submatch(1).escape(substitute(submatch(2),'\s\+','@','g'),'\')/<CR>:AlignCtrl mI=lp0P0 @<CR>:'a,.Align<CR>:'y+1,'z-1s/@/ /g<CR><SID>WE
|
||
map <silent> <Leader>tsq <SID>WS:'a,.AlignReplaceQuotedSpaces<CR>:'a,.s/^\(\s*\)\(.*\)/\=submatch(1).substitute(submatch(2),'\s\+','@','g')/<CR>:AlignCtrl mIp0P0=l @<CR>:'a,.Align<CR>:'y+1,'z-1s/[%@]/ /g<CR><SID>WE
|
||
map <silent> <Leader>tt <SID>WS:AlignCtrl mIp1P1=l \\\@<!& \\\\<CR>:'a,.Align<CR><SID>WE
|
||
|
||
" ---------------------------------------------------------------------
|
||
" plain Align maps; these two are used in <Leader>acom..\afnc {{{1
|
||
map <silent> <Leader>t@ :AlignCtrl mIp1P1=l @<CR>:'a,.Align<CR>
|
||
map <silent> <Leader>tW@ :AlignCtrl mWp1P1=l @<CR>:'a,.Align<CR>
|
||
map <silent> <Leader>tdW@ :AlignCtrl v ^\s*/[/*]<CR>:AlignCtrl mWp1P1=l @<CR>:'a,.Align<CR>
|
||
|
||
" ---------------------------------------------------------------------
|
||
" Joiner : maps used above {{{1
|
||
map <silent> <Leader>jnr= :call <SID>CharJoiner("=")<CR>
|
||
map <silent> <Leader>jnr, :call <SID>CharJoiner(",")<CR>
|
||
|
||
" ---------------------------------------------------------------------
|
||
" visual-line mode variants: {{{1
|
||
vmap <silent> <Leader>T| :<BS><BS><BS><CR>ma'><Leader>T|
|
||
vmap <silent> <Leader>T, :<BS><BS><BS><CR>ma'><Leader>T,
|
||
vmap <silent> <Leader>Ts, :<BS><BS><BS><CR>ma'><Leader>Ts,
|
||
vmap <silent> <Leader>T: :<BS><BS><BS><CR>ma'><Leader>T:
|
||
vmap <silent> <Leader>T< :<BS><BS><BS><CR>ma'><Leader>T<
|
||
vmap <silent> <Leader>T= :<BS><BS><BS><CR>ma'><Leader>T=
|
||
vmap <silent> <Leader>T@ :<BS><BS><BS><CR>ma'><Leader>T@
|
||
vmap <silent> <Leader>Tsp :<BS><BS><BS><CR>ma'><Leader>Tsp
|
||
vmap <silent> <Leader>a? :<BS><BS><BS><CR>ma'><Leader>a?
|
||
vmap <silent> <Leader>a, :<BS><BS><BS><CR>ma'><Leader>a,
|
||
vmap <silent> <Leader>a< :<BS><BS><BS><CR>ma'><Leader>a<
|
||
vmap <silent> <Leader>a= :<BS><BS><BS><CR>ma'><Leader>a=
|
||
vmap <silent> <Leader>abox :<BS><BS><BS><CR>ma'><Leader>abox
|
||
vmap <silent> <Leader>acom :<BS><BS><BS><CR>ma'><Leader>acom
|
||
vmap <silent> <Leader>aocom :<BS><BS><BS><CR>ma'><Leader>aocom
|
||
vmap <silent> <Leader>ascom :<BS><BS><BS><CR>ma'><Leader>ascom
|
||
vmap <silent> <Leader>adec :<BS><BS><BS><CR>ma'><Leader>adec
|
||
vmap <silent> <Leader>adef :<BS><BS><BS><CR>ma'><Leader>adef
|
||
vmap <silent> <Leader>afnc :<BS><BS><BS><CR>ma'><Leader>afnc
|
||
vmap <silent> <Leader>anum :<BS><BS><BS><CR>ma'><Leader>anum
|
||
"vmap <silent> <Leader>anum :B s/\(\d\)\s\+\(-\=[.,]\=\d\)/\1@\2/ge<CR>:AlignCtrl mp0P0<CR>gv:Align [.,@]<CR>:'<,'>s/\([-0-9.,]*\)\(\s\+\)\([.,]\)/\2\1\3/ge<CR>:'<,'>s/@/ /ge<CR>
|
||
vmap <silent> <Leader>t| :<BS><BS><BS><CR>ma'><Leader>t|
|
||
vmap <silent> <Leader>t, :<BS><BS><BS><CR>ma'><Leader>t,
|
||
vmap <silent> <Leader>ts, :<BS><BS><BS><CR>ma'><Leader>ts,
|
||
vmap <silent> <Leader>t: :<BS><BS><BS><CR>ma'><Leader>t:
|
||
vmap <silent> <Leader>t; :<BS><BS><BS><CR>ma'><Leader>t;
|
||
vmap <silent> <Leader>t< :<BS><BS><BS><CR>ma'><Leader>t<
|
||
vmap <silent> <Leader>t= :<BS><BS><BS><CR>ma'><Leader>t=
|
||
vmap <silent> <Leader>t? :<BS><BS><BS><CR>ma'><Leader>t?
|
||
vmap <silent> <Leader>t@ :<BS><BS><BS><CR>ma'><Leader>t@
|
||
vmap <silent> <Leader>tab :<BS><BS><BS><CR>ma'><Leader>tab
|
||
vmap <silent> <Leader>tml :<BS><BS><BS><CR>ma'><Leader>tml
|
||
vmap <silent> <Leader>tsp :<BS><BS><BS><CR>ma'><Leader>tsp
|
||
vmap <silent> <Leader>tsq :<BS><BS><BS><CR>ma'><Leader>tsq
|
||
vmap <silent> <Leader>tp@ :<BS><BS><BS><CR>ma'><Leader>tp@
|
||
vmap <silent> <Leader>tt :<BS><BS><BS><CR>ma'><Leader>tt
|
||
vmap <silent> <Leader>Htd :<BS><BS><BS><CR>ma'><Leader>Htd
|
||
|
||
" ---------------------------------------------------------------------
|
||
" Menu Support: {{{1
|
||
" ma ..move.. use menu
|
||
" v V or ctrl-v ..move.. use menu
|
||
if has("menu") && has("gui_running") && &go =~ 'm' && !exists("s:firstmenu")
|
||
let s:firstmenu= 1
|
||
if !exists("g:DrChipTopLvlMenu")
|
||
let g:DrChipTopLvlMenu= "DrChip."
|
||
endif
|
||
if g:DrChipTopLvlMenu != ""
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.<<\ and\ >> <Leader>a<'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Assignment\ = <Leader>t='
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Assignment\ := <Leader>a='
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Backslashes <Leader>tml'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Breakup\ Comma\ Declarations <Leader>a,'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.C\ Comment\ Box <Leader>abox'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Commas <Leader>t,'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Commas <Leader>ts,'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Commas\ With\ Strings <Leader>tsq'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Comments <Leader>acom'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Comments\ Only <Leader>aocom'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Declaration\ Comments <Leader>adcom'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Declarations <Leader>adec'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Definitions <Leader>adef'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Function\ Header <Leader>afnc'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Html\ Tables <Leader>Htd'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.(\.\.\.)?\.\.\.\ :\ \.\.\. <Leader>a?'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Numbers <Leader>anum'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Numbers\ (American-Style) <Leader>aunum <Leader>aunum'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Numbers\ (Euro-Style) <Leader>aenum'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Spaces\ (Left\ Justified) <Leader>tsp'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Spaces\ (Right\ Justified) <Leader>Tsp'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Statements\ With\ Percent\ Style\ Comments <Leader>m='
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Symbol\ < <Leader>t<'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Symbol\ \| <Leader>t|'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Symbol\ @ <Leader>t@'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Symbol\ # <Leader>t#'
|
||
exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Tabs <Leader>tab'
|
||
endif
|
||
endif
|
||
|
||
" ---------------------------------------------------------------------
|
||
" CharJoiner: joins lines which end in the given character (spaces {{{1
|
||
" at end are ignored)
|
||
fun! <SID>CharJoiner(chr)
|
||
" call Dfunc("CharJoiner(chr=".a:chr.")")
|
||
let aline = line("'a")
|
||
let rep = line(".") - aline
|
||
while rep > 0
|
||
norm! 'a
|
||
while match(getline(aline),a:chr . "\s*$") != -1 && rep >= 0
|
||
" while = at end-of-line, delete it and join with next
|
||
norm! 'a$
|
||
j!
|
||
let rep = rep - 1
|
||
endwhile
|
||
" update rep(eat) count
|
||
let rep = rep - 1
|
||
if rep <= 0
|
||
" terminate loop if at end-of-block
|
||
break
|
||
endif
|
||
" prepare for next line
|
||
norm! jma
|
||
let aline = line("'a")
|
||
endwhile
|
||
" call Dret("CharJoiner")
|
||
endfun
|
||
|
||
" ---------------------------------------------------------------------
|
||
" s:Equals: {{{2
|
||
fun! s:Equals()
|
||
" call Dfunc("s:Equals()")
|
||
'a,'zs/\s\+\([*/+\-%|&\~^]\==\)/ \1/e
|
||
'a,'zs@ \+\([*/+\-%|&\~^]\)=@\1=@ge
|
||
'a,'zs/==/\="\<Char-0xff>\<Char-0xff>"/ge
|
||
'a,'zs/!=/\="!\<Char-0xff>"/ge
|
||
norm g'zk
|
||
AlignCtrl mIp1P1=l =
|
||
AlignCtrl g =
|
||
'a,'z-1Align
|
||
'a,'z-1s@\([*/+\-%|&\~^!=]\)\( \+\)=@\2\1=@ge
|
||
'a,'z-1s/\( \+\);/;\1/ge
|
||
if &ft == "c" || &ft == "cpp"
|
||
'a,'z-1v/^\s*\/[*/]/s/\/[*/]/@&@/e
|
||
'a,'z-1v/^\s*\/[*/]/s/\*\//@&/e
|
||
exe norm "'zk<Leader>t@"
|
||
'y,'zs/^\(\s*\) @/\1/e
|
||
endif
|
||
'a,'z-1s/<Char-0xff>/=/ge
|
||
'y,'zs/ @//eg
|
||
" call Dret("s:Equals")
|
||
endfun
|
||
|
||
" ---------------------------------------------------------------------
|
||
" Afnc: useful for splitting one-line function beginnings {{{1
|
||
" into one line per argument format
|
||
fun! s:Afnc()
|
||
" call Dfunc("Afnc()")
|
||
|
||
" keep display quiet
|
||
let chkeep = &ch
|
||
let gdkeep = &gd
|
||
let vekeep = &ve
|
||
set ch=2 nogd ve=
|
||
|
||
" will use marks y,z ; save current values
|
||
let mykeep = SaveMark("'y")
|
||
let mzkeep = SaveMark("'z")
|
||
|
||
" Find beginning of function -- be careful to skip over comments
|
||
let cmmntid = synIDtrans(hlID("Comment"))
|
||
let stringid = synIDtrans(hlID("String"))
|
||
exe "norm! ]]"
|
||
while search(")","bW") != 0
|
||
" call Decho("line=".line(".")." col=".col("."))
|
||
let parenid= synIDtrans(synID(line("."),col("."),1))
|
||
if parenid != cmmntid && parenid != stringid
|
||
break
|
||
endif
|
||
endwhile
|
||
norm! %my
|
||
s/(\s*\(\S\)/(\r \1/e
|
||
exe "norm! `y%"
|
||
s/)\s*\(\/[*/]\)/)\r\1/e
|
||
exe "norm! `y%mz"
|
||
'y,'zs/\s\+$//e
|
||
'y,'zs/^\s\+//e
|
||
'y+1,'zs/^/ /
|
||
|
||
" insert newline after every comma only one parenthesis deep
|
||
sil! exe "norm! `y\<right>h"
|
||
let parens = 1
|
||
let cmmnt = 0
|
||
let cmmntline= -1
|
||
while parens >= 1
|
||
" call Decho("parens=".parens." @a=".@a)
|
||
exe 'norm! ma "ay`a '
|
||
if @a == "("
|
||
let parens= parens + 1
|
||
elseif @a == ")"
|
||
let parens= parens - 1
|
||
|
||
" comment bypass: /* ... */ or //...
|
||
elseif cmmnt == 0 && @a == '/'
|
||
let cmmnt= 1
|
||
elseif cmmnt == 1
|
||
if @a == '/'
|
||
let cmmnt = 2 " //...
|
||
let cmmntline= line(".")
|
||
elseif @a == '*'
|
||
let cmmnt= 3 " /*...
|
||
else
|
||
let cmmnt= 0
|
||
endif
|
||
elseif cmmnt == 2 && line(".") != cmmntline
|
||
let cmmnt = 0
|
||
let cmmntline= -1
|
||
elseif cmmnt == 3 && @a == '*'
|
||
let cmmnt= 4
|
||
elseif cmmnt == 4
|
||
if @a == '/'
|
||
let cmmnt= 0 " ...*/
|
||
elseif @a != '*'
|
||
let cmmnt= 3
|
||
endif
|
||
|
||
elseif @a == "," && parens == 1 && cmmnt == 0
|
||
exe "norm! i\<CR>\<Esc>"
|
||
endif
|
||
endwhile
|
||
norm! `y%mz%
|
||
sil! 'y,'zg/^\s*$/d
|
||
|
||
" perform substitutes to mark fields for Align
|
||
sil! 'y+1,'zv/^\//s/^\s\+\(\S\)/ \1/e
|
||
sil! 'y+1,'zv/^\//s/\(\S\)\s\+/\1 /eg
|
||
sil! 'y+1,'zv/^\//s/\* \+/*/ge
|
||
" func
|
||
" ws <- declaration -> <-ptr -> <-var-> <-[array][] -> <-glop-> <-end->
|
||
sil! 'y+1,'zv/^\//s/^\s*\(\(\K\k*\s*\)\+\)\s\+\([(*]*\)\s*\(\K\k*\)\s*\(\(\[.\{-}]\)*\)\s*\(.\{-}\)\=\s*\([,)]\)\s*$/ \1@#\3@\4\5@\7\8/e
|
||
sil! 'y+1,'z+1g/^\s*\/[*/]/norm! kJ
|
||
sil! 'y+1,'z+1s%/[*/]%@&@%ge
|
||
sil! 'y+1,'z+1s%*/%@&%ge
|
||
AlignCtrl mIp0P0=l @
|
||
sil! 'y+1,'zAlign
|
||
sil! 'y,'zs%@\(/[*/]\)@%\t\1 %e
|
||
sil! 'y,'zs%@\*/% */%e
|
||
sil! 'y,'zs/@\([,)]\)/\1/
|
||
sil! 'y,'zs/@/ /
|
||
AlignCtrl mIlrp0P0= # @
|
||
sil! 'y+1,'zAlign
|
||
sil! 'y+1,'zs/#/ /
|
||
sil! 'y+1,'zs/@//
|
||
sil! 'y+1,'zs/\(\s\+\)\([,)]\)/\2\1/e
|
||
|
||
" Restore
|
||
call RestoreMark(mykeep)
|
||
call RestoreMark(mzkeep)
|
||
let &ch= chkeep
|
||
let &gd= gdkeep
|
||
let &ve= vekeep
|
||
|
||
" call Dret("Afnc")
|
||
endfun
|
||
|
||
" ---------------------------------------------------------------------
|
||
" FixMultiDec: converts a type arg,arg,arg; line to multiple lines {{{1
|
||
fun! s:FixMultiDec()
|
||
" call Dfunc("FixMultiDec()")
|
||
|
||
" save register x
|
||
let xkeep = @x
|
||
let curline = getline(".")
|
||
" call Decho("curline<".curline.">")
|
||
|
||
" Get the type. I'm assuming one type per line (ie. int x; double y; on one line will not be handled properly)
|
||
let @x=substitute(curline,'^\(\s*[a-zA-Z_ \t][a-zA-Z0-9_ \t]*\)\s\+[(*]*\h.*$','\1','')
|
||
" call Decho("@x<".@x.">")
|
||
|
||
" transform line
|
||
exe 's/,/;\r'.@x.' /ge'
|
||
|
||
"restore register x
|
||
let @x= xkeep
|
||
|
||
" call Dret("FixMultiDec : my=".line("'y")." mz=".line("'z"))
|
||
endfun
|
||
|
||
let &cpo= s:keepcpo
|
||
unlet s:keepcpo
|
||
" ------------------------------------------------------------------------------
|
||
" vim: ts=4 nowrap fdm=marker
|