summaryrefslogtreecommitdiffstats
path: root/autoload/vimtex/text_obj
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/vimtex/text_obj')
-rw-r--r--autoload/vimtex/text_obj/cmdtargets.vim85
-rw-r--r--autoload/vimtex/text_obj/envtargets.vim110
-rw-r--r--autoload/vimtex/text_obj/targets.vim49
3 files changed, 244 insertions, 0 deletions
diff --git a/autoload/vimtex/text_obj/cmdtargets.vim b/autoload/vimtex/text_obj/cmdtargets.vim
new file mode 100644
index 00000000..611285c7
--- /dev/null
+++ b/autoload/vimtex/text_obj/cmdtargets.vim
@@ -0,0 +1,85 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
+
+" vimtex - LaTeX plugin for Vim
+"
+" Maintainer: Karl Yngve Lervåg
+" Email: karl.yngve@gmail.com
+"
+
+function! vimtex#text_obj#cmdtargets#new(args) " {{{1
+ return {
+ \ 'genFuncs': {
+ \ 'c': function('vimtex#text_obj#cmdtargets#current'),
+ \ 'n': function('vimtex#text_obj#cmdtargets#next'),
+ \ 'l': function('vimtex#text_obj#cmdtargets#last'),
+ \ },
+ \ 'modFuncs': {
+ \ 'i': [function('vimtex#text_obj#cmdtargets#inner'),
+ \ function('targets#modify#drop')],
+ \ 'a': [function('targets#modify#keep')],
+ \ 'I': [function('vimtex#text_obj#cmdtargets#inner'),
+ \ function('targets#modify#shrink')],
+ \ 'A': [function('targets#modify#expand')],
+ \ }}
+endfunction
+
+" }}}1
+function! vimtex#text_obj#cmdtargets#current(args, opts, state) " {{{1
+ let target = s:select(a:opts.first ? 1 : 2)
+ call target.cursorE() " keep going from right end
+ return target
+endfunction
+
+" }}}1
+function! vimtex#text_obj#cmdtargets#next(args, opts, state) " {{{1
+ if targets#util#search('\\\S*{', 'W') > 0
+ return targets#target#withError('no target')
+ endif
+
+ let oldpos = getpos('.')
+ let target = s:select(1)
+ call setpos('.', oldpos)
+ return target
+endfunction
+
+" }}}1
+function! vimtex#text_obj#cmdtargets#last(args, opts, state) " {{{1
+ " Move to the last non-surrounding cmd
+ if targets#util#search('\\\S\+{\_.\{-}}', 'bWe') > 0
+ return targets#target#withError('no target')
+ endif
+
+ let oldpos = getpos('.')
+ let target = s:select(1)
+ call setpos('.', oldpos)
+ return target
+endfunction
+
+" }}}1
+function! vimtex#text_obj#cmdtargets#inner(target, args) " {{{1
+ if a:target.state().isInvalid()
+ return
+ endif
+
+ call a:target.cursorS()
+ silent! normal! f{
+ call a:target.setS()
+endfunction
+
+" }}}1
+
+function! s:select(count) " {{{1
+ " Try to select command
+ silent! execute 'keepjumps normal v'.a:count."\<Plug>(vimtex-ac)v"
+ let target = targets#target#fromVisualSelection()
+
+ if target.sc == target.ec && target.sl == target.el
+ return targets#target#withError('tex_cmd select')
+ endif
+
+ return target
+endfunction
+
+" }}}1
+
+endif
diff --git a/autoload/vimtex/text_obj/envtargets.vim b/autoload/vimtex/text_obj/envtargets.vim
new file mode 100644
index 00000000..10e3ae93
--- /dev/null
+++ b/autoload/vimtex/text_obj/envtargets.vim
@@ -0,0 +1,110 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
+
+" vimtex - LaTeX plugin for Vim
+"
+" Maintainer: Karl Yngve Lervåg
+" Email: karl.yngve@gmail.com
+"
+
+function! vimtex#text_obj#envtargets#new(args) " {{{1
+ return {
+ \ 'genFuncs': {
+ \ 'c': function('vimtex#text_obj#envtargets#current'),
+ \ 'n': function('vimtex#text_obj#envtargets#next'),
+ \ 'l': function('vimtex#text_obj#envtargets#last'),
+ \ },
+ \ 'modFuncs': {
+ \ 'i': [function('vimtex#text_obj#envtargets#inner'), function('targets#modify#drop')],
+ \ 'a': [function('targets#modify#keep')],
+ \ 'I': [function('vimtex#text_obj#envtargets#inner'), function('targets#modify#shrink')],
+ \ 'A': [function('vimtex#text_obj#envtargets#expand')],
+ \ }}
+endfunction
+
+" }}}1
+function! vimtex#text_obj#envtargets#current(args, opts, state) " {{{1
+ let target = s:select(a:opts.first ? 1 : 2)
+ call target.cursorE() " keep going from right end
+ return target
+endfunction
+
+" }}}1
+function! vimtex#text_obj#envtargets#next(args, opts, state) " {{{1
+ if targets#util#search('\\begin{.*}', 'W') > 0
+ return targets#target#withError('no target')
+ endif
+
+ let oldpos = getpos('.')
+ let target = s:select(1)
+ call setpos('.', oldpos)
+ return target
+endfunction
+
+" }}}1
+function! vimtex#text_obj#envtargets#last(args, opts, state) " {{{1
+ if targets#util#search('\\end{.*}', 'bW') > 0
+ return targets#target#withError('no target')
+ endif
+
+ let oldpos = getpos('.')
+ let target = s:select(1)
+ call setpos('.', oldpos)
+ return target
+endfunction
+
+" }}}1
+function! vimtex#text_obj#envtargets#inner(target, args) " {{{1
+ call a:target.cursorS()
+ call a:target.searchposS('\\begin{.*}', 'Wce')
+ call a:target.cursorE()
+ call a:target.searchposE('\\end{.*}', 'bWc')
+endfunction
+
+" }}}1
+function! vimtex#text_obj#envtargets#expand(target, args) " {{{1
+ " Based on targets#modify#expand() from
+ " $VIMMRUNTIME/autoload/targets/modify.vim
+
+ " Add outer whitespace
+ if a:0 == 0 || a:1 ==# '>'
+ call a:target.cursorE()
+ let [line, column] = searchpos('\S\|$', '')
+ if line > a:target.el || (line > 0 && column-1 > a:target.ec)
+ " non whitespace or EOL after trailing whitespace found
+ " not counting whitespace directly after end
+ return a:target.setE(line, column-1)
+ endif
+ endif
+
+ if a:0 == 0 || a:1 ==# '<'
+ call a:target.cursorS()
+ let [line, column] = searchpos('\S', 'b')
+ if line < a:target.sl
+ return a:target.setS(line+1, 0)
+ elseif line > 0
+ " non whitespace before leading whitespace found
+ return a:target.setS(line, column+1)
+ endif
+ " only whitespace in front of start
+ " include all leading whitespace from beginning of line
+ let a:target.sc = 1
+ endif
+endfunction
+
+" }}}1
+
+function! s:select(count) " {{{1
+ " Try to select environment
+ silent! execute 'keepjumps normal v'.a:count."\<Plug>(vimtex-ae)v"
+ let target = targets#target#fromVisualSelection()
+
+ if target.sc == target.ec && target.sl == target.el
+ return targets#target#withError('tex_env select')
+ endif
+
+ return target
+endfunction
+
+" }}}1
+
+endif
diff --git a/autoload/vimtex/text_obj/targets.vim b/autoload/vimtex/text_obj/targets.vim
new file mode 100644
index 00000000..6bbdf710
--- /dev/null
+++ b/autoload/vimtex/text_obj/targets.vim
@@ -0,0 +1,49 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
+
+" vimtex - LaTeX plugin for Vim
+"
+" Maintainer: Karl Yngve Lervåg
+" Email: karl.yngve@gmail.com
+"
+
+function! vimtex#text_obj#targets#enabled() abort " {{{1
+ return exists('g:loaded_targets')
+ \ && ( (type(g:loaded_targets) == type(0) && g:loaded_targets)
+ \ || (type(g:loaded_targets) == type('') && !empty(g:loaded_targets)))
+ \ && ( g:vimtex_text_obj_variant ==# 'auto'
+ \ || g:vimtex_text_obj_variant ==# 'targets')
+endfunction
+
+" }}}1
+function! vimtex#text_obj#targets#init() abort " {{{1
+ let g:vimtex_text_obj_variant = 'targets'
+
+ " Create intermediate mappings
+ omap <expr> <plug>(vimtex-targets-i) targets#e('o', 'i', 'i')
+ xmap <expr> <plug>(vimtex-targets-i) targets#e('x', 'i', 'i')
+ omap <expr> <plug>(vimtex-targets-a) targets#e('o', 'a', 'a')
+ xmap <expr> <plug>(vimtex-targets-a) targets#e('x', 'a', 'a')
+
+ augroup vimtex_targets
+ autocmd!
+ autocmd User targets#sources call s:init_sources()
+ autocmd User targets#mappings#plugin call s:init_mappings()
+ augroup END
+endfunction
+
+" }}}1
+
+function! s:init_mappings() abort " {{{1
+ call targets#mappings#extend({'e': {'tex_env': [{}]}})
+ call targets#mappings#extend({'c': {'tex_cmd': [{}]}})
+endfunction
+
+" }}}1
+function! s:init_sources() abort " {{{1
+ call targets#sources#register('tex_env', function('vimtex#text_obj#envtargets#new'))
+ call targets#sources#register('tex_cmd', function('vimtex#text_obj#cmdtargets#new'))
+endfunction
+
+" }}}1
+
+endif