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
。如果那是设置,那么在正常模式下的任何导航都将毫无意义,因为当我输入返回插入时我会回到同一行。
我在 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
。如果那是设置,那么在正常模式下的任何导航都将毫无意义,因为当我输入返回插入时我会回到同一行。