Vim 如何在自动命令后将光标留在行尾

Vim how to leave cursor at the end of the line after autocommand

我正在尝试使用自动命令在纯 vimscript 中制作我自己的片段。我想让它在我键入一个特定的字符序列后,它被另一个字符序列替换。我做了一个这样的,当你输入它时,它会将“你好”替换为“再见”。

function F()
  if (strpart (getline('.'), 0, col('.')-1) =~ 'hello$')
    execute "normal 5i\<Backspace>"
    normal! abye
    normal! l
  endif
endfunction

autocmd TextChangedI *.tex call F()

如果光标后有字符,它也能正常工作。但是,如果我写在行尾,更改后光标在 'y' 和 'e' 之间,因为自动命令调用函数,光标在行尾,并且然后它进入插入模式,开始在最后一个字符之前插入。

如何让光标始终留在'bye'之后?我不想使用 iabbrev 有几个原因,其中之一是它不会在我输入时立即展开。

我可以使用选项

  set ve+=onemore

但我不喜欢它对正常写作的影响。

以下使用 setlinecursor 函数而不是普通键盘映射的情况如何:

function! F() abort
  let [l:line, l:col] = [getline('.'), col('.')]
  if strpart(l:line, 0, l:col-1) =~ 'hello$'
    let l:left = strpart(l:line, 0, l:col-6)
    let l:right = strpart(l:line, l:col-1)
    call setline('.', l:left . 'bye' . l:right)
    call cursor('.', l:col-2) " 2 = length diff between hello and bye
  endif
endfunction

这似乎对我有用(在 Neovim 0.6 上)。