parent
4a746323a0
commit
c45f9b4f94
@ -29,8 +29,8 @@ function! vimtex#change#init_buffer() " {{{1
|
|||||||
nnoremap <silent><buffer> <plug>(vimtex-delete-env)
|
nnoremap <silent><buffer> <plug>(vimtex-delete-env)
|
||||||
\ :call vimtex#change#env('')<cr>
|
\ :call vimtex#change#env('')<cr>
|
||||||
|
|
||||||
nnoremap <silent><buffer> <plug>(vimtex-delete-cmd) vaBom`o<esc>xg``xdF\
|
nnoremap <silent><buffer> <plug>(vimtex-delete-cmd)
|
||||||
\:silent! call repeat#set("\<plug>(vimtex-delete-cmd)", v:count)<cr>
|
\ :call vimtex#change#command_delete()<cr>
|
||||||
|
|
||||||
nnoremap <silent><buffer> <plug>(vimtex-change-env)
|
nnoremap <silent><buffer> <plug>(vimtex-change-env)
|
||||||
\ :call vimtex#change#env_prompt()<cr>
|
\ :call vimtex#change#env_prompt()<cr>
|
||||||
@ -56,32 +56,102 @@ endfunction
|
|||||||
|
|
||||||
" }}}1
|
" }}}1
|
||||||
|
|
||||||
|
function! vimtex#change#get_command(...) " {{{1
|
||||||
|
let l:position = a:0 > 0 ? a:1 : searchpos('\S', 'bcn')
|
||||||
|
let l:line = getline(l:position[0])
|
||||||
|
let l:char = l:line[l:position[1]-1]
|
||||||
|
|
||||||
|
for l:syntax in reverse(map(call('synstack', l:position),
|
||||||
|
\ 'synIDattr(v:val, ''name'')'))
|
||||||
|
if l:syntax ==# 'texStatement'
|
||||||
|
let l:p = searchpos('\\', 'bcn')
|
||||||
|
let l:c = matchstr(l:line, '\\\zs\w\+', l:p[1]-1)
|
||||||
|
return [l:c] + l:p
|
||||||
|
elseif l:syntax ==# 'texMatcher'
|
||||||
|
\ || (l:syntax ==# 'Delimiter' && l:char =~# '{\|}')
|
||||||
|
let l:curpos = getcurpos()
|
||||||
|
normal! vaBoh
|
||||||
|
let l:result = vimtex#change#get_command(searchpos('\S', 'bcn'))
|
||||||
|
call setpos('.', l:curpos)
|
||||||
|
return l:result
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return ['', 0, 0]
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! vimtex#change#command() " {{{1
|
function! vimtex#change#command() " {{{1
|
||||||
let pos_save = getpos('.')
|
" Get old command
|
||||||
let savereg = @a
|
let [l:old, l:line, l:col] = vimtex#change#get_command()
|
||||||
|
if l:old ==# '' | return | endif
|
||||||
|
|
||||||
|
" Get new command
|
||||||
|
let l:new = input('Change ' . old . ' for: ')
|
||||||
|
let l:new = empty(l:new) ? l:old : l:new
|
||||||
|
|
||||||
|
" Store current cursor position
|
||||||
|
let l:curpos = getcurpos()
|
||||||
|
if l:line == l:curpos[1]
|
||||||
|
let l:curpos[2] += len(l:new) - len(l:old)
|
||||||
|
endif
|
||||||
|
|
||||||
" This is a hack to make undo restore the correct position
|
" This is a hack to make undo restore the correct position
|
||||||
normal! ix
|
normal! ix
|
||||||
normal! x
|
normal! x
|
||||||
|
|
||||||
normal! F\lve"ay
|
" Perform the change
|
||||||
let old = @a
|
let l:tmppos = copy(l:curpos)
|
||||||
|
let l:tmppos[1:2] = [l:line, l:col+1]
|
||||||
let new = input('Change ' . old . ' for: ')
|
cal setpos('.', l:tmppos)
|
||||||
if empty(new)
|
let l:savereg = @a
|
||||||
let new = old
|
let @a = l:new
|
||||||
endif
|
normal! cea
|
||||||
let pos_save[2] += len(new) - len(old)
|
let @a = l:savereg
|
||||||
|
|
||||||
let @a = new
|
|
||||||
normal! F\lcea
|
|
||||||
|
|
||||||
let @a = savereg
|
|
||||||
call setpos('.', pos_save)
|
|
||||||
|
|
||||||
|
" Restore cursor position and create repeat hook
|
||||||
|
call setpos('.', l:curpos)
|
||||||
silent! call repeat#set("\<plug>(vimtex-change-cmd)" . new . '
', v:count)
|
silent! call repeat#set("\<plug>(vimtex-change-cmd)" . new . '
', v:count)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! vimtex#change#command_delete() " {{{1
|
||||||
|
" Get old command
|
||||||
|
let [l:old, l:line, l:col] = vimtex#change#get_command()
|
||||||
|
if l:old ==# '' | return | endif
|
||||||
|
|
||||||
|
" Store current cursor position
|
||||||
|
let l:curpos = getcurpos()
|
||||||
|
if l:line == l:curpos[1]
|
||||||
|
let l:curpos[2] -= len(l:old)+1
|
||||||
|
endif
|
||||||
|
|
||||||
|
" This is a hack to make undo restore the correct position
|
||||||
|
normal! ix
|
||||||
|
normal! x
|
||||||
|
|
||||||
|
" Use temporary cursor position
|
||||||
|
let l:tmppos = copy(l:curpos)
|
||||||
|
let l:tmppos[1:2] = [l:line, l:col]
|
||||||
|
call setpos('.', l:tmppos)
|
||||||
|
normal! de
|
||||||
|
|
||||||
|
" Delete surrounding braces if present
|
||||||
|
while getline('.')[l:col-1 :] =~# '^\s*{'
|
||||||
|
normal! f{vaBm`oxg``x
|
||||||
|
if l:line == l:curpos[1]
|
||||||
|
let l:curpos[2] -= 1
|
||||||
|
if l:curpos[2] < 0
|
||||||
|
let l:curpos[2] = 0
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
let l:tmppos = getpos('.')
|
||||||
|
let l:col = l:tmppos[2]
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
" Restore cursor position and create repeat hook
|
||||||
|
call setpos('.', l:curpos)
|
||||||
|
silent! call repeat#set("\<plug>(vimtex-delete-cmd)", v:count)
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! vimtex#change#close_environment() " {{{1
|
function! vimtex#change#close_environment() " {{{1
|
||||||
" Close delimiters
|
" Close delimiters
|
||||||
let [lnum, cnum] = searchpairpos('\C\\left\>', '', '\C\\right\>', 'bnW',
|
let [lnum, cnum] = searchpairpos('\C\\left\>', '', '\C\\right\>', 'bnW',
|
||||||
|
Loading…
Reference in New Issue
Block a user