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
但我不喜欢它对正常写作的影响。
以下使用 setline
和 cursor
函数而不是普通键盘映射的情况如何:
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 上)。
我正在尝试使用自动命令在纯 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
但我不喜欢它对正常写作的影响。
以下使用 setline
和 cursor
函数而不是普通键盘映射的情况如何:
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 上)。