vim - 运行 ex 命令在正常模式下从函数转到行

vim - Run ex command to go to line from function in normal mode

我在 InsertEnter autocmd 上设置了 运行 功能。在函数中我想跳转到特定行。

到目前为止我尝试过(简化)的是:

function JumpToLineBeforeScroll()
    echom "function runs"
    exe ":10"
    return ""
endfunction

autocmd InsertEnter * call JumpToLineBeforeScroll() | set cul

我用mode()验证过,虽然这个函数运行是在正常模式下(如果错误请指正)。函数 运行s 但行跳转不起作用。我如何让它工作?

注意:我实际上想要实现的是在插入模式下鼠标滚动,切换到正常模式,保存当前行号然后滚动。然后,一旦我按 i 再次进入插入模式(InsertEnter),我想跳回到滚动之前所在的最后一行。因为这需要一些条件,所以我想将它保留在一个函数中,而不是将整个代码写在 autocmd 行本身中。

谢谢!

所以 gi 存在 :)

现在,在了解了 gi 并了解了 :normal 的工作原理之后,我已经达到了这个非常适合我的用例的配置。事实证明 autocmd 实际上并不需要,因为 :startinsert 也存在 :)

" Variable to track scrolling
let didScroll = 0

" Function to track if scrolling happened
function ScrollHandler()
    let g:didScroll = 1
    return ""
endfunction

" Function to jump back to line before scrolling started
function JumpToLineBeforeScroll()
    if g:didScroll > 0
        let g:didScroll = 0
        :normal gi
    endif
    " Needed as :normal ends with an <Esc> and so comes back to ex mode
    startinsert
    return ""
endfunction

" Map mouse scroll wheel to only scroll the screen
nnoremap <ScrollWheelUp> <Esc>:call ScrollHandler()<CR><C-y>
nnoremap <ScrollWheelDown> <Esc>:call ScrollHandler()<CR><C-e>
inoremap <ScrollWheelUp> <Esc>:call ScrollHandler()<CR><C-y>
inoremap <ScrollWheelDown> <Esc>:call ScrollHandler()<CR><C-e>
" Normal mode mapping for i which performs gi to jump to last insertmode line if scroll has taken place
nnoremap i <Esc>:call JumpToLineBeforeScroll()<CR>

我仍在使用 didScroll,因为我并不总是想在按下 i 时执行 gi。如果那是设置,那么在正常模式下的任何导航都将毫无意义,因为当我输入返回插入时我会回到同一行。