| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- " Copyright (c) 2014 Junegunn Choi
- "
- " MIT License
- "
- " Permission is hereby granted, free of charge, to any person obtaining
- " a copy of this software and associated documentation files (the
- " "Software"), to deal in the Software without restriction, including
- " without limitation the rights to use, copy, modify, merge, publish,
- " distribute, sublicense, and/or sell copies of the Software, and to
- " permit persons to whom the Software is furnished to do so, subject to
- " the following conditions:
- "
- " The above copyright notice and this permission notice shall be
- " included in all copies or substantial portions of the Software.
- "
- " THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- " EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- " MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- " NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- " LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- " OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- " WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- if exists("g:loaded_easy_align_plugin")
- finish
- endif
- let g:loaded_easy_align_plugin = 1
- command! -nargs=* -range -bang EasyAlign <line1>,<line2>call easy_align#align(<bang>0, 0, 'command', <q-args>)
- command! -nargs=* -range -bang LiveEasyAlign <line1>,<line2>call easy_align#align(<bang>0, 1, 'command', <q-args>)
- let s:last_command = 'EasyAlign'
- function! s:abs(v)
- return a:v >= 0 ? a:v : - a:v
- endfunction
- function! s:remember_visual(mode)
- let s:last_visual = [a:mode, s:abs(line("'>") - line("'<")), s:abs(col("'>") - col("'<"))]
- endfunction
- function! s:repeat_visual()
- let [mode, ldiff, cdiff] = s:last_visual
- let cmd = 'normal! '.mode
- if ldiff > 0
- let cmd .= ldiff . 'j'
- endif
- let ve_save = &virtualedit
- try
- if mode == "\<C-V>"
- if cdiff > 0
- let cmd .= cdiff . 'l'
- endif
- set virtualedit+=block
- endif
- execute cmd.":\<C-r>=g:easy_align_last_command\<Enter>\<Enter>"
- call s:set_repeat()
- finally
- if ve_save != &virtualedit
- let &virtualedit = ve_save
- endif
- endtry
- endfunction
- function! s:repeat_in_visual()
- if exists('g:easy_align_last_command')
- call s:remember_visual(visualmode())
- call s:repeat_visual()
- endif
- endfunction
- function! s:set_repeat()
- silent! call repeat#set("\<Plug>(EasyAlignRepeat)")
- endfunction
- function! s:generic_easy_align_op(type, vmode, live)
- if !&modifiable
- if a:vmode
- normal! gv
- endif
- return
- endif
- let sel_save = &selection
- let &selection = "inclusive"
- if a:vmode
- let vmode = a:type
- let [l1, l2] = ["'<", "'>"]
- call s:remember_visual(vmode)
- else
- let vmode = ''
- let [l1, l2] = [line("'["), line("']")]
- unlet! s:last_visual
- endif
- try
- let range = l1.','.l2
- if get(g:, 'easy_align_need_repeat', 0)
- execute range . g:easy_align_last_command
- else
- execute range . "call easy_align#align(0, a:live, vmode, '')"
- end
- call s:set_repeat()
- finally
- let &selection = sel_save
- endtry
- endfunction
- function! s:easy_align_op(type, ...)
- call s:generic_easy_align_op(a:type, a:0, 0)
- endfunction
- function! s:live_easy_align_op(type, ...)
- call s:generic_easy_align_op(a:type, a:0, 1)
- endfunction
- function! s:easy_align_repeat()
- if exists('s:last_visual')
- call s:repeat_visual()
- else
- try
- let g:easy_align_need_repeat = 1
- normal! .
- finally
- unlet! g:easy_align_need_repeat
- endtry
- endif
- endfunction
- nnoremap <silent> <Plug>(EasyAlign) :set opfunc=<SID>easy_align_op<Enter>g@
- vnoremap <silent> <Plug>(EasyAlign) :<C-U>call <SID>easy_align_op(visualmode(), 1)<Enter>
- nnoremap <silent> <Plug>(LiveEasyAlign) :set opfunc=<SID>live_easy_align_op<Enter>g@
- vnoremap <silent> <Plug>(LiveEasyAlign) :<C-U>call <SID>live_easy_align_op(visualmode(), 1)<Enter>
- " vim-repeat support
- nnoremap <silent> <Plug>(EasyAlignRepeat) :call <SID>easy_align_repeat()<Enter>
- vnoremap <silent> <Plug>(EasyAlignRepeat) :<C-U>call <SID>repeat_in_visual()<Enter>
- " Backward-compatibility (deprecated)
- nnoremap <silent> <Plug>(EasyAlignOperator) :set opfunc=<SID>easy_align_op<Enter>g@
- " vim: set et sw=2 :
|