mirror of
https://github.com/inkarkat/vim-ingo-library.git
synced 2026-05-29 11:18:51 +02:00
60 lines
2.4 KiB
VimL
60 lines
2.4 KiB
VimL
" ingo/motion/helper.vim: Functions for implementing custom motions.
|
|
"
|
|
" DEPENDENCIES:
|
|
" - ingo/option.vim autoload script
|
|
"
|
|
" Copyright: (C) 2014 Ingo Karkat
|
|
" The VIM LICENSE applies to this script; see ':help copyright'.
|
|
"
|
|
" Maintainer: Ingo Karkat <ingo@karkat.de>
|
|
"
|
|
" REVISION DATE REMARKS
|
|
" 1.021.002 12-Jun-2014 Make test for 'virtualedit' option values also
|
|
" account for multiple values.
|
|
" 1.016.001 11-Jan-2014 file creation
|
|
|
|
function! ingo#motion#helper#AdditionalMovement( ... )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Make additional adaptive movement in a custom motion for certain modes.
|
|
" The difference between normal mode, operator-pending and visual mode with
|
|
" 'selection' set to "exclusive" is that in the latter two, the motion must go
|
|
" _past_ the final character, so that all characters of the text are selected.
|
|
" This is done by appending a 'l' motion after the search for the text.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:isSpecialLastLineTreatment Optional flag that allows to turn off the
|
|
" special treatment at the end of the last
|
|
" line; by default enabled.
|
|
"* RETURN VALUES:
|
|
" None.
|
|
"******************************************************************************
|
|
let l:isSpecialLastLineTreatment = (a:0 && a:1 || ! a:0)
|
|
|
|
" The 'l' motion only works properly at the end of the line (i.e. when the
|
|
" moved-over text is at the end of the line) when the 'l' motion is allowed
|
|
" to move over to the next line. Thus, the 'l' motion is added temporarily
|
|
" to the global 'whichwrap' setting. Without this, the motion would leave
|
|
" out the last character in the line.
|
|
let l:save_ww = &whichwrap
|
|
set whichwrap+=l
|
|
if l:isSpecialLastLineTreatment && line('.') == line('$') && ! ingo#option#ContainsOneOf(&virtualedit, ['all', 'onemore'])
|
|
" For the last line in the buffer, that still doesn't work in
|
|
" operator-pending mode, unless we can do virtual editing.
|
|
let l:save_virtualedit = &virtualedit
|
|
set virtualedit=onemore
|
|
normal! l
|
|
augroup IngoLibraryTempVirtualEdit
|
|
execute 'autocmd! CursorMoved * set virtualedit=' . l:save_virtualedit . ' | autocmd! IngoLibraryTempVirtualEdit'
|
|
augroup END
|
|
else
|
|
normal! l
|
|
endif
|
|
let &whichwrap = l:save_ww
|
|
endfunction
|
|
|
|
" vim: set ts=8 sts=4 sw=4 noexpandtab ff=unix fdm=syntax :
|