Function 函数调用后将插入模式光标返回到同一位置

Function 函数调用后将插入模式光标返回到同一位置,function,vim,Function,Vim,我一直在尝试编写一些Vimscript来调用函数,当我两次插入同一个字符时,在我的特殊情况下,我希望如果你插入分号两次,它实际上会将分号移动到行尾 command! Semi call Semi() inoremap ; <C-O>:Semi2<CR> function! Semi() let x = getpos(".") " If we are in the last column.. if col(".")+1 == col("$")

我一直在尝试编写一些Vimscript来调用函数,当我两次插入同一个字符时,在我的特殊情况下,我希望如果你插入分号两次,它实际上会将分号移动到行尾

command! Semi call Semi()
inoremap ; <C-O>:Semi2<CR>

function! Semi()
    let x = getpos(".")
    " If we are in the last column..
    if col(".")+1 == col("$")
        let insert_semi = getline(".") . ";"
        call setline(".", insert_semi)
        let x[2] += 1
        call setpos(".", x)
        return
    endif
    let char = getline(".")[x[2] - 2]
    if char == ";"
        " if prev char was a semicolon also, remove and append to the end
    else
        " insert semicolon normally...
    endif
endfunction
命令!半调用半()
inoremap;:半2
功能!半()
设x=getpos(“.”)
“如果我们在最后一列。。
如果列(“.”+1==列($”)
让插入U semi=getline(“.”);"
调用设置行(“.”,插入)
设x[2]+=1
呼叫设置位置(“.”,x)
返回
恩迪夫
让char=getline(“.”[x[2]-2]
如果char==”;"
如果prev char也是分号,请删除并追加到末尾
其他的
“通常插入分号。。。
恩迪夫
端功能
我遇到的问题是,当在最后一列上调用此函数时,必须退出插入模式才能调用此函数光标将进入正常模式并将光标移动到最后一列。是否有任何方法可以判断光标是追加到行尾还是插入到最后一列之前,以及何时调用函数你能把它放回原来的位置吗


我很清楚,我可以在
上使用插入映射,但是我不喜欢这种行为,因为Vim进入等待下一个键模式,并且不显示您所写的内容。这个问题不仅与我列出的问题有关,而且与第一列中出现的更一般的问题有关。

如果您的函数没有使用插入模式附加“;”——例如,通过从缓冲区粘贴——您可以使用
gi
命令返回退出插入模式的位置。

我建议不要使用
I\u CTRL-O
,它会触发
InsertLeave
insertinter
事件,这可能会影响其他插件。我将使用
:ino在此处重新映射;
。请参见
:帮助:映射expr
。在该表达式(即您的函数)中,记录当前光标位置并将其与上次记录的光标位置进行比较。如果光标位置在其旁边,则返回键以撤消插入并在末尾重做(
),否则只需返回

您不需要函数:

inoremap ;; ;;<Esc>h"_xxm`$p``a
inoremap;;;h“xxm`$p``a
或清洁剂:

inoremap ;; <Esc>m`A;<Esc>``a
inoremap;;文学硕士``A.

此代码段以比函数更简洁、更经济、更可靠的方式完成您想要完成的任务。Vim在
之后等待仅当您什么都不做时:如果您在
之后键入任何内容,则无需等待
映射,我明确指出了这一点,我想要一个通用解决方案,它将帮助我编写其他vimscripts,以在插入模式下解决类似问题。通用解决方案也在我的回答中:
m
在你去其他地方之前创建一个上下文标记,
在你完成后跳回。它们在这里工作得很好(减去第一个输入错误,
,而不是我刚刚纠正的
)。哦,我不知道
map expr
看起来很有趣!看起来不错,可能很有用!我不希望执行正常模式调用,但这可能会派上用场。是的,当然,
:normal…
的使用有些间接。